1289715Sglebius#include "config.h"
2289715Sglebius
3289715Sglebius#include "ntp.h"
4289715Sglebius#include "ntp_calendar.h"
5289715Sglebius#include "ntp_stdlib.h"
6289715Sglebius
7289715Sglebius#include "ntp_prio_q.h"
8289715Sglebius
9289715Sglebius#include "unity.h"
10289715Sglebius
11289715Sglebius
12289715Sglebius
13289715Sglebius#include <string.h>
14289715Sglebius/*
15289715SglebiusTODO:
16289715Sglebius-fix the includes
17289715Sglebius-makefile: ntpdsim-ntp_prio_q.o - make sure it's okay
18289715Sglebius*/
19289715Sglebius
20289715Sglebius
21289715Sglebius/* helpers */
22289715Sglebius
23289715Sglebiustypedef struct Element
24289715Sglebius{
25289715Sglebius	char str[37]; // 37 seems like a nice candidate to break stuff
26289715Sglebius	int number;
27289715Sglebius
28289715Sglebius} element;
29289715Sglebius
30289715Sglebiusint
31289715Sglebiuscompare_elements(const void * e1, const void * e2)
32289715Sglebius{
33289715Sglebius	return ((element*)e1)->number < ((element*)e2)->number;
34289715Sglebius}
35289715Sglebius
36289715Sglebius/* tests */
37289715Sglebius
38289715Sglebiusvoid
39289715Sglebiustest_AllocateDeallocateNode(void) {
40289715Sglebius	element* e_ptr = debug_get_node(sizeof(element));
41289715Sglebius	free_node(e_ptr);
42289715Sglebius}
43289715Sglebius
44289715Sglebius
45289715Sglebiusvoid
46289715Sglebiustest_EmptyQueue(void) {
47289715Sglebius	queue* q = create_queue();
48289715Sglebius
49289715Sglebius	TEST_ASSERT_NOT_NULL(q);
50289715Sglebius	TEST_ASSERT_TRUE(empty(q));
51289715Sglebius	TEST_ASSERT_NULL(queue_head(q));
52289715Sglebius	TEST_ASSERT_NULL(dequeue(q));
53289715Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
54289715Sglebius
55289715Sglebius	destroy_queue(q);
56289715Sglebius}
57289715Sglebius
58289715Sglebius
59289715Sglebiusvoid
60289715Sglebiustest_OneElementQueue(void) {
61289715Sglebius	queue* q = create_queue();
62289715Sglebius
63289715Sglebius	TEST_ASSERT_NOT_NULL(q);
64289715Sglebius
65289715Sglebius	element e = {"string", 3};
66289715Sglebius	element* e_ptr = debug_get_node(sizeof(element));
67289715Sglebius	enqueue(q, e_ptr);
68289715Sglebius	*e_ptr = e;
69289715Sglebius
70289715Sglebius	TEST_ASSERT_FALSE(empty(q));
71289715Sglebius	TEST_ASSERT_NOT_NULL(queue_head(q));
72289715Sglebius	TEST_ASSERT_EQUAL(1, get_no_of_elements(q));
73289715Sglebius
74289715Sglebius	element* e_ptr_returned = dequeue(q);
75289715Sglebius
76289715Sglebius	TEST_ASSERT_NOT_NULL(e_ptr_returned);
77289715Sglebius	TEST_ASSERT_EQUAL_STRING(e_ptr_returned->str, "string");
78289715Sglebius	TEST_ASSERT_EQUAL_PTR(e_ptr_returned, e_ptr);
79289715Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
80289715Sglebius	TEST_ASSERT_TRUE(empty(q));
81289715Sglebius	TEST_ASSERT_NULL(dequeue(q));
82289715Sglebius
83289715Sglebius	destroy_queue(q);
84289715Sglebius}
85289715Sglebius
86289715Sglebius
87289715Sglebiusvoid
88289715Sglebiustest_MultipleElementQueue(void) {
89289715Sglebius	queue* q = create_queue();
90289715Sglebius
91289715Sglebius	TEST_ASSERT_NOT_NULL(q);
92289715Sglebius
93289715Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr;
94289715Sglebius
95289715Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
96289715Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
97289715Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
98289715Sglebius
99289715Sglebius	enqueue(q, e1_ptr);
100289715Sglebius	enqueue(q, e2_ptr);
101289715Sglebius	enqueue(q, e3_ptr);
102289715Sglebius
103289715Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q));
104289715Sglebius
105289715Sglebius	dequeue(q);
106289715Sglebius	enqueue(q, e1_ptr);
107289715Sglebius
108289715Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q));
109289715Sglebius
110289715Sglebius	dequeue(q);
111289715Sglebius	dequeue(q);
112289715Sglebius	enqueue(q, e3_ptr);
113289715Sglebius	enqueue(q, e2_ptr);
114289715Sglebius
115289715Sglebius	TEST_ASSERT_EQUAL_PTR(dequeue(q), e1_ptr);
116289715Sglebius	TEST_ASSERT_EQUAL_PTR(dequeue(q), e3_ptr);
117289715Sglebius	TEST_ASSERT_EQUAL_PTR(dequeue(q), e2_ptr);
118289715Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
119289715Sglebius	TEST_ASSERT_NULL(dequeue(q));
120289715Sglebius
121289715Sglebius	destroy_queue(q);
122289715Sglebius}
123289715Sglebius
124289715Sglebius
125289715Sglebiusvoid
126289715Sglebiustest_CustomOrderQueue(void) {
127289715Sglebius	queue* q = debug_create_priority_queue(compare_elements);
128289715Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
129289715Sglebius
130289715Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
131289715Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
132289715Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
133289715Sglebius	e4_ptr = (element*)debug_get_node(sizeof(element));
134289715Sglebius	e5_ptr = (element*)debug_get_node(sizeof(element));
135289715Sglebius	e6_ptr = (element*)debug_get_node(sizeof(element));
136289715Sglebius
137289715Sglebius	e1_ptr->number = 1;
138289715Sglebius	e2_ptr->number = 1;
139289715Sglebius	e3_ptr->number = 10;
140289715Sglebius	e4_ptr->number = 10;
141289715Sglebius	e5_ptr->number = 100;
142289715Sglebius	e6_ptr->number = 100;
143289715Sglebius
144289715Sglebius	enqueue(q, e3_ptr);
145289715Sglebius	enqueue(q, e5_ptr);
146289715Sglebius	enqueue(q, e2_ptr);
147289715Sglebius	enqueue(q, e1_ptr);
148289715Sglebius	enqueue(q, e4_ptr);
149289715Sglebius	enqueue(q, e6_ptr);
150289715Sglebius
151289715Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100);
152289715Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100);
153289715Sglebius
154289715Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100);
155289715Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100);
156289715Sglebius
157289715Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10);
158289715Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10);
159289715Sglebius
160289715Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10);
161289715Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10);
162289715Sglebius
163289715Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1);
164289715Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1);
165289715Sglebius
166289715Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1);
167289715Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1);
168289715Sglebius
169289715Sglebius	TEST_ASSERT_TRUE(empty(q));
170289715Sglebius
171289715Sglebius	destroy_queue(q);
172289715Sglebius
173289715Sglebius	free_node(e1_ptr);
174289715Sglebius	free_node(e2_ptr);
175289715Sglebius	free_node(e3_ptr);
176289715Sglebius	free_node(e4_ptr);
177289715Sglebius	free_node(e5_ptr);
178289715Sglebius	free_node(e6_ptr);
179289715Sglebius}
180289715Sglebius
181289715Sglebius
182289715Sglebiusvoid
183289715Sglebiustest_DestroyNonEmptyQueue(void) {
184289715Sglebius	queue* q = create_queue();
185289715Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
186289715Sglebius
187289715Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
188289715Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
189289715Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
190289715Sglebius	e4_ptr = (element*)debug_get_node(sizeof(element));
191289715Sglebius	e5_ptr = (element*)debug_get_node(sizeof(element));
192289715Sglebius	e6_ptr = (element*)debug_get_node(sizeof(element));
193289715Sglebius
194289715Sglebius	enqueue(q, e3_ptr);
195289715Sglebius	enqueue(q, e2_ptr);
196289715Sglebius	enqueue(q, e4_ptr);
197289715Sglebius	enqueue(q, e1_ptr);
198289715Sglebius	enqueue(q, e6_ptr);
199289715Sglebius	enqueue(q, e5_ptr);
200289715Sglebius
201289715Sglebius	destroy_queue(q);
202289715Sglebius}
203289715Sglebius
204289715Sglebiusvoid
205289715Sglebiustest_AppendQueues(void) {
206289715Sglebius	queue* q1 = create_queue();
207289715Sglebius	queue* q2 = create_queue();
208289715Sglebius	queue* q3 = create_queue();
209289715Sglebius	queue* q4 = create_queue();
210289715Sglebius	queue* q5 = create_queue();
211289715Sglebius
212289715Sglebius	// append empty queue to empty queue
213289715Sglebius	append_queue(q1, q2);	// destroys q2
214289715Sglebius
215289715Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
216289715Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
217289715Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
218289715Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
219289715Sglebius	e4_ptr = (element*)debug_get_node(sizeof(element));
220289715Sglebius	e5_ptr = (element*)debug_get_node(sizeof(element));
221289715Sglebius	e6_ptr = (element*)debug_get_node(sizeof(element));
222289715Sglebius
223289715Sglebius	enqueue(q1, e1_ptr);
224289715Sglebius	enqueue(q1, e2_ptr);
225289715Sglebius	enqueue(q1, e3_ptr);
226289715Sglebius
227289715Sglebius
228289715Sglebius	// append empty queue to non empty queue
229289715Sglebius	append_queue(q1, q3);	// destroys q3
230289715Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q1));
231289715Sglebius
232289715Sglebius	// append non empty queue to empty queue
233289715Sglebius	append_queue(q4, q1);	// destroys q1
234289715Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q4));
235289715Sglebius
236289715Sglebius	enqueue(q5, e4_ptr);
237289715Sglebius	enqueue(q5, e5_ptr);
238289715Sglebius
239289715Sglebius	// append non empty queue to non empty queue
240289715Sglebius	append_queue(q4, q5);	// destroys q5
241289715Sglebius	TEST_ASSERT_EQUAL(5, get_no_of_elements(q4));
242289715Sglebius
243289715Sglebius	dequeue(q4);
244289715Sglebius	dequeue(q4);
245289715Sglebius	dequeue(q4);
246289715Sglebius	dequeue(q4);
247289715Sglebius	dequeue(q4);
248289715Sglebius
249289715Sglebius	free_node(e1_ptr);
250289715Sglebius	free_node(e2_ptr);
251289715Sglebius	free_node(e3_ptr);
252289715Sglebius	free_node(e4_ptr);
253289715Sglebius	free_node(e5_ptr);
254293894Sglebius	free_node(e6_ptr);
255289715Sglebius
256289715Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q4));
257289715Sglebius
258289715Sglebius	// destroy_queue(q1);	// destroyed already
259289715Sglebius	// destroy_queue(q2);	// destroyed already
260289715Sglebius	// destroy_queue(q3);	// destroyed already
261289715Sglebius	destroy_queue(q4);
262289715Sglebius	// destroy_queue(q5);	// destroyed already
263289715Sglebius}
264