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