#include "LinkedIntList.h"
#include <cstdlib>
#include <iostream>
#include <memory>
#include "IntList.h"
using intlist333::IntList;
using intlist333::LinkedIntList;
using std::cerr;
using std::cout;
using std::endl;
namespace {
constexpr int kOne = 1;
constexpr int kTwo = 2;
constexpr int kThree = 3;
constexpr int kFour = 4;
constexpr int kFive = 5;
template <typename T>
void CheckEquals(T expected, T actual) {
if (expected != actual) {
cerr << "ERROR" << endl;
cerr << "expected value: " << expected << endl;
cerr << "actual value: " << actual << endl;
exit(EXIT_FAILURE);
}
}
}
int main() {
std::unique_ptr<IntList> list = std::make_unique<LinkedIntList>();
int output;
CheckEquals(0, list->num_elements());
CheckEquals(false, list->Pop(&output));
CheckEquals(false, list->Slice(&output));
list->Push(kOne);
CheckEquals(1, list->num_elements());
CheckEquals(true, list->Pop(&output));
CheckEquals(kOne, output);
list->Push(kTwo);
CheckEquals(1, list->num_elements());
CheckEquals(true, list->Slice(&output));
CheckEquals(kTwo, output);
CheckEquals(0, list->num_elements());
CheckEquals(false, list->Pop(&output));
CheckEquals(false, list->Slice(&output));
list->Push(kThree);
list->Push(kTwo);
list->Push(kOne);
list->Append(kFour);
list->Append(kFive);
CheckEquals(5, list->num_elements());
CheckEquals(true, list->Slice(&output));
CheckEquals(kFive, output);
CheckEquals(4, list->num_elements());
CheckEquals(true, list->Pop(&output));
CheckEquals(kOne, output);
CheckEquals(3, list->num_elements());
cout << "All tests passed! Be sure to run under valgrind!" << endl;
return EXIT_SUCCESS;
}