237 lines
5.8 KiB
C++

#include <CppUTest/CommandLineTestRunner.h>
#include <CppUTest/TestHarness.h>
#include <chapter1/chapter1.hpp>
#include <chapter2/chapter2.hpp>
#include <chapter12/chapter12.hpp>
#include <dope/linkedlist.hpp>
#include <dope/stacks.hpp>
#include <dope/bintree.hpp>
#include <string.h>
// Chapter 1: Arrays _________________________________________________
TEST_GROUP(ChapterOne){};
TEST(ChapterOne, IsUnique){
auto const t1 = IsUnique("aabbcc", 6);
auto const t2 = IsUnique("abcdef", 6);
CHECK_FALSE(t1);
CHECK(t2);
}
TEST(ChapterOne, CheckPermutations){
const auto s1 = "Hello";
const auto s2 = "olleH";
const auto s3 = "Holaa";
auto const t1 = CheckPermutation(s1, s2, strlen(s1), strlen(s2));
auto const t2 = CheckPermutation(s1, s3, strlen(s1), strlen(s3));
CHECK(t1);
CHECK_FALSE(t2);
}
TEST(ChapterOne, SubArraySum){
// Not actually in CTCI but is related to arrays
// Prompt: Given an array, find the sum of all subarrays of length K
// (fixed sliding window)
int a1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
CHECK_EQUAL(27, sliding_window_max_sum(a1, 11, 3));
// Prompt: Find the shortest subarray with a sum greater than or
// equal to X (dynamic sliding window)
int a2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
CHECK_EQUAL(1, sliding_window_shortest_subarray(a2, 9, 7));
}
// Chapter 2: Linked Lists ___________________________________________
TEST_GROUP(ChapterTwo){};
TEST(ChapterTwo, RemoveDups){
auto dll = new DopeLinkedList();
dll->AppendData(1);
dll->AppendData(2);
dll->AppendData(2);
dll->AppendData(3);
remove_dups(dll);
auto node = dll->GetHead();
CHECK_EQUAL(1, node->GetData());
node = node->GetNext();
CHECK_EQUAL(2, node->GetData());
node = node->GetNext();
CHECK_EQUAL(3, node->GetData());
delete dll;
}
TEST(ChapterTwo, Reverse){
auto dll = new DopeLinkedList();
dll->AppendData(1);
dll->AppendData(2);
dll->AppendData(3);
dll->AppendData(100);
auto node = dll->GetHead();
CHECK_EQUAL(1, node->GetData());
reverse_linkedlist(dll);
node = dll->GetHead();
CHECK_EQUAL(100, node->GetData());
node = node->GetNext();
CHECK_EQUAL(3, node->GetData());
node = node->GetNext();
CHECK_EQUAL(2, node->GetData());
node = node->GetNext();
CHECK_EQUAL(1, node->GetData());
CHECK_EQUAL(nullptr, node->GetNext());
delete dll;
}
// Chapter 3: Stacks and Queues ______________________________________
TEST_GROUP(ChapterThree){};
TEST(ChapterThree, StackMin){
auto stack = new DopeStack<int, 20>();
stack->push(10);
stack->push(25);
stack->push(42);
stack->push(100);
stack->push(2);
CHECK_EQUAL(2, stack->peek());
CHECK_EQUAL(2, stack->pop());
CHECK_EQUAL(100, stack->pop());
CHECK_FALSE(stack->isEmpty());
(void)stack->pop();
(void)stack->pop();
(void)stack->pop();
CHECK_TRUE(stack->isEmpty());
delete stack;
}
// Chapter 4: Trees __________________________________________________
TEST_GROUP(ChapterFour){};
TEST(ChapterFour, BinaryTrees){
auto btree = DopeBinTree<int>();
btree.insert(1);
btree.insert(2);
btree.insert(3);
btree.insert(4);
btree.insert(5);
btree.insert(6);
btree.insert(7);
btree.insert(8);
auto root = btree.getRoot();
CHECK_EQUAL(1, root->GetData());
CHECK_EQUAL(2, root->GetLeft()->GetData());
CHECK_EQUAL(3, root->GetRight()->GetData());
CHECK_EQUAL(4, root->GetLeft()->GetLeft()->GetData());
CHECK_EQUAL(5, root->GetLeft()->GetRight()->GetData());
CHECK_EQUAL(6, root->GetRight()->GetLeft()->GetData());
CHECK_EQUAL(7, root->GetRight()->GetRight()->GetData());
CHECK_EQUAL(8, root->GetLeft()->GetLeft()->GetLeft()->GetData());
}
TEST(ChapterFour, TreeTraversal){
auto btree = DopeBinTree<int>();
btree.insert(1); // Root
btree.insert(2);
btree.insert(3);
btree.insert(4);
btree.insert(5);
btree.insert(6);
btree.insert(7);
int array[10] = {};
btree.PreOrderTraversal2Array(array, AlgoVariant::Recursive);
CHECK_EQUAL(1, array[0]);
CHECK_EQUAL(2, array[1]);
CHECK_EQUAL(4, array[2]);
CHECK_EQUAL(5, array[3]);
CHECK_EQUAL(3, array[4]);
CHECK_EQUAL(6, array[5]);
CHECK_EQUAL(7, array[6]);
std::fill(array, array+10, 0);
btree.InOrderTraversal2Array(array, AlgoVariant::Recursive);
CHECK_EQUAL(4, array[0]);
CHECK_EQUAL(2, array[1]);
CHECK_EQUAL(5, array[2]);
CHECK_EQUAL(1, array[3]);
CHECK_EQUAL(6, array[4]);
CHECK_EQUAL(3, array[5]);
CHECK_EQUAL(7, array[6]);
std::fill(array, array+10, 0);
btree.PostOrderTraversal2Array(array, AlgoVariant::Recursive);
CHECK_EQUAL(4, array[0]);
CHECK_EQUAL(5, array[1]);
CHECK_EQUAL(2, array[2]);
CHECK_EQUAL(6, array[3]);
CHECK_EQUAL(7, array[4]);
CHECK_EQUAL(3, array[5]);
CHECK_EQUAL(1, array[6]);
std::fill(array, array+10, 0);
btree.PreOrderTraversal2Array(array, AlgoVariant::Iter);
CHECK_EQUAL(1, array[0]);
CHECK_EQUAL(2, array[1]);
CHECK_EQUAL(4, array[2]);
CHECK_EQUAL(5, array[3]);
CHECK_EQUAL(3, array[4]);
CHECK_EQUAL(6, array[5]);
CHECK_EQUAL(7, array[6]);
std::fill(array, array+10, 0);
btree.InOrderTraversal2Array(array, AlgoVariant::Iter);
CHECK_EQUAL(4, array[0]);
CHECK_EQUAL(2, array[1]);
CHECK_EQUAL(5, array[2]);
CHECK_EQUAL(1, array[3]);
CHECK_EQUAL(6, array[4]);
CHECK_EQUAL(3, array[5]);
CHECK_EQUAL(7, array[6]);
std::fill(array, array+10, 0);
btree.PostOrderTraversal2Array(array, AlgoVariant::Iter);
CHECK_EQUAL(4, array[0]);
CHECK_EQUAL(5, array[1]);
CHECK_EQUAL(2, array[2]);
CHECK_EQUAL(6, array[3]);
CHECK_EQUAL(7, array[4]);
CHECK_EQUAL(3, array[5]);
CHECK_EQUAL(1, array[6]);
}
TEST(ChapterFour, MinHeap){
auto btree = DopeBinTree<int>();
}
// Chapter 12: C/C++ _________________________________________________
TEST_GROUP(ChapterTwelve){};
TEST(ChapterTwelve, ReverseString){
char s1[] = "Hello";
reverse_str(s1);
STRCMP_EQUAL("olleH", s1);
}
int main (int ac, char** av){
return CommandLineTestRunner::RunAllTests(ac, av);
}