1 #include "test.h"
2
3 #include <alloc.h>
4 #include <threaded_stack.h>
5
test_push_pop(void)6 static void test_push_pop(void)
7 {
8 ThreadedStack *stack = ThreadedStackNew(0, free);
9
10 ThreadedStackPush(stack, xstrdup("1"));
11 ThreadedStackPush(stack, xstrdup("2"));
12 ThreadedStackPush(stack, xstrdup("3"));
13
14 char *str1 = ThreadedStackPop(stack);
15 char *str2 = ThreadedStackPop(stack);
16 char *str3 = ThreadedStackPop(stack);
17 assert_int_equal(strcmp(str1, "3"), 0);
18 assert_int_equal(strcmp(str2, "2"), 0);
19 assert_int_equal(strcmp(str3, "1"), 0);
20
21 free(str1);
22 free(str2);
23 free(str3);
24
25 ThreadedStackDestroy(stack);
26 }
27
test_pop_empty_and_push_null(void)28 static void test_pop_empty_and_push_null(void)
29 {
30 ThreadedStack *stack = ThreadedStackNew(1, NULL);
31
32 assert(ThreadedStackIsEmpty(stack));
33
34 void *i_am_null = ThreadedStackPop(stack);
35 assert(i_am_null == NULL);
36 ThreadedStackPush(stack, i_am_null);
37 assert(ThreadedStackPop(stack) == NULL);
38
39 ThreadedStackDestroy(stack);
40 }
41
test_copy(void)42 static void test_copy(void)
43 {
44 ThreadedStack *stack = ThreadedStackNew(4, free);
45
46 ThreadedStackPush(stack, xstrdup("1"));
47 ThreadedStackPush(stack, xstrdup("2"));
48 ThreadedStackPush(stack, xstrdup("3"));
49
50 ThreadedStack *new_stack = ThreadedStackCopy(stack);
51
52 assert(new_stack != NULL);
53 assert_int_equal(ThreadedStackCount(stack), ThreadedStackCount(new_stack));
54 assert_int_equal(ThreadedStackCapacity(stack), ThreadedStackCapacity(new_stack));
55
56 char *old_str1 = ThreadedStackPop(stack); char *new_str1 = ThreadedStackPop(new_stack);
57 char *old_str2 = ThreadedStackPop(stack); char *new_str2 = ThreadedStackPop(new_stack);
58 char *old_str3 = ThreadedStackPop(stack); char *new_str3 = ThreadedStackPop(new_stack);
59
60 assert(old_str1 == new_str1);
61 assert(old_str2 == new_str2);
62 assert(old_str3 == new_str3);
63
64 free(old_str1);
65 free(old_str2);
66 free(old_str3);
67
68 ThreadedStackSoftDestroy(stack);
69
70 // Tests expanding the copied stack
71 ThreadedStackPush(new_stack, xstrdup("1"));
72 ThreadedStackPush(new_stack, xstrdup("2"));
73 ThreadedStackPush(new_stack, xstrdup("3"));
74 ThreadedStackPush(new_stack, xstrdup("4"));
75 ThreadedStackPush(new_stack, xstrdup("5"));
76
77 assert_int_equal(ThreadedStackCount(new_stack), 5);
78 assert_int_equal(ThreadedStackCapacity(new_stack), 8);
79
80 new_str1 = ThreadedStackPop(new_stack);
81 new_str2 = ThreadedStackPop(new_stack);
82 new_str3 = ThreadedStackPop(new_stack);
83 char *new_str4 = ThreadedStackPop(new_stack);
84 char *new_str5 = ThreadedStackPop(new_stack);
85
86 assert_int_equal(strcmp(new_str1, "5"), 0);
87 assert_int_equal(strcmp(new_str2, "4"), 0);
88 assert_int_equal(strcmp(new_str3, "3"), 0);
89 assert_int_equal(strcmp(new_str4, "2"), 0);
90 assert_int_equal(strcmp(new_str5, "1"), 0);
91
92 free(new_str1);
93 free(new_str2);
94 free(new_str3);
95 free(new_str4);
96 free(new_str5);
97
98 ThreadedStackDestroy(new_stack);
99 }
100
test_push_report_count(void)101 static void test_push_report_count(void)
102 {
103 ThreadedStack *stack = ThreadedStackNew(0, free);
104
105 size_t size1 = ThreadedStackPushReportCount(stack, xstrdup("1"));
106 size_t size2 = ThreadedStackPushReportCount(stack, xstrdup("2"));
107 size_t size3 = ThreadedStackPushReportCount(stack, xstrdup("3"));
108 size_t size4 = ThreadedStackPushReportCount(stack, xstrdup("4"));
109
110 assert_int_equal(size1, 1);
111 assert_int_equal(size2, 2);
112 assert_int_equal(size3, 3);
113 assert_int_equal(size4, 4);
114
115 ThreadedStackDestroy(stack);
116 }
117
test_expand(void)118 static void test_expand(void)
119 {
120 ThreadedStack *stack = ThreadedStackNew(1, free);
121
122 ThreadedStackPush(stack, xstrdup("spam"));
123 ThreadedStackPush(stack, xstrdup("spam"));
124 ThreadedStackPush(stack, xstrdup("spam"));
125 ThreadedStackPush(stack, xstrdup("spam"));
126 ThreadedStackPush(stack, xstrdup("spam"));
127 ThreadedStackPush(stack, xstrdup("spam"));
128 ThreadedStackPush(stack, xstrdup("spam"));
129 ThreadedStackPush(stack, xstrdup("spam"));
130 ThreadedStackPush(stack, xstrdup("spam"));
131
132 assert_int_equal(ThreadedStackCount(stack), 9);
133 assert_int_equal(ThreadedStackCapacity(stack), 16);
134
135 ThreadedStackDestroy(stack);
136 }
137
main()138 int main()
139 {
140 PRINT_TEST_BANNER();
141 const UnitTest tests[] =
142 {
143 unit_test(test_push_pop),
144 unit_test(test_pop_empty_and_push_null),
145 unit_test(test_copy),
146 unit_test(test_push_report_count),
147 unit_test(test_expand),
148 };
149 return run_tests(tests);
150 }
151