1290001Sglebius#include "config.h"
2290001Sglebius
3290001Sglebius#include "ntp.h"
4290001Sglebius#include "ntp_calendar.h"
5290001Sglebius#include "ntp_stdlib.h"
6290001Sglebius
7290001Sglebius#include "ntp_prio_q.h"
8290001Sglebius
9290001Sglebius#include "unity.h"
10290001Sglebius
11290001Sglebius
12290001Sglebius
13290001Sglebius#include <string.h>
14290001Sglebius/*
15290001SglebiusTODO:
16290001Sglebius-fix the includes
17290001Sglebius-makefile: ntpdsim-ntp_prio_q.o - make sure it's okay
18290001Sglebius*/
19290001Sglebius
20290001Sglebius
21290001Sglebius/* helpers */
22290001Sglebius
23290001Sglebiustypedef struct Element
24290001Sglebius{
25290001Sglebius	char str[37]; // 37 seems like a nice candidate to break stuff
26290001Sglebius	int number;
27290001Sglebius
28290001Sglebius} element;
29290001Sglebius
30290001Sglebiusint
31290001Sglebiuscompare_elements(const void * e1, const void * e2)
32290001Sglebius{
33290001Sglebius	return ((element*)e1)->number < ((element*)e2)->number;
34290001Sglebius}
35290001Sglebius
36290001Sglebius/* tests */
37290001Sglebius
38290001Sglebiusvoid
39290001Sglebiustest_AllocateDeallocateNode(void) {
40290001Sglebius	element* e_ptr = debug_get_node(sizeof(element));
41290001Sglebius	free_node(e_ptr);
42290001Sglebius}
43290001Sglebius
44290001Sglebius
45290001Sglebiusvoid
46290001Sglebiustest_EmptyQueue(void) {
47290001Sglebius	queue* q = create_queue();
48290001Sglebius
49290001Sglebius	TEST_ASSERT_NOT_NULL(q);
50290001Sglebius	TEST_ASSERT_TRUE(empty(q));
51290001Sglebius	TEST_ASSERT_NULL(queue_head(q));
52290001Sglebius	TEST_ASSERT_NULL(dequeue(q));
53290001Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
54290001Sglebius
55290001Sglebius	destroy_queue(q);
56290001Sglebius}
57290001Sglebius
58290001Sglebius
59290001Sglebiusvoid
60290001Sglebiustest_OneElementQueue(void) {
61290001Sglebius	queue* q = create_queue();
62290001Sglebius
63290001Sglebius	TEST_ASSERT_NOT_NULL(q);
64290001Sglebius
65290001Sglebius	element e = {"string", 3};
66290001Sglebius	element* e_ptr = debug_get_node(sizeof(element));
67290001Sglebius	enqueue(q, e_ptr);
68290001Sglebius	*e_ptr = e;
69290001Sglebius
70290001Sglebius	TEST_ASSERT_FALSE(empty(q));
71290001Sglebius	TEST_ASSERT_NOT_NULL(queue_head(q));
72290001Sglebius	TEST_ASSERT_EQUAL(1, get_no_of_elements(q));
73290001Sglebius
74290001Sglebius	element* e_ptr_returned = dequeue(q);
75290001Sglebius
76290001Sglebius	TEST_ASSERT_NOT_NULL(e_ptr_returned);
77290001Sglebius	TEST_ASSERT_EQUAL_STRING(e_ptr_returned->str, "string");
78290001Sglebius	TEST_ASSERT_EQUAL_PTR(e_ptr_returned, e_ptr);
79290001Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
80290001Sglebius	TEST_ASSERT_TRUE(empty(q));
81290001Sglebius	TEST_ASSERT_NULL(dequeue(q));
82290001Sglebius
83290001Sglebius	destroy_queue(q);
84290001Sglebius}
85290001Sglebius
86290001Sglebius
87290001Sglebiusvoid
88290001Sglebiustest_MultipleElementQueue(void) {
89290001Sglebius	queue* q = create_queue();
90290001Sglebius
91290001Sglebius	TEST_ASSERT_NOT_NULL(q);
92290001Sglebius
93290001Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr;
94290001Sglebius
95290001Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
96290001Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
97290001Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
98290001Sglebius
99290001Sglebius	enqueue(q, e1_ptr);
100290001Sglebius	enqueue(q, e2_ptr);
101290001Sglebius	enqueue(q, e3_ptr);
102290001Sglebius
103290001Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q));
104290001Sglebius
105290001Sglebius	dequeue(q);
106290001Sglebius	enqueue(q, e1_ptr);
107290001Sglebius
108290001Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q));
109290001Sglebius
110290001Sglebius	dequeue(q);
111290001Sglebius	dequeue(q);
112290001Sglebius	enqueue(q, e3_ptr);
113290001Sglebius	enqueue(q, e2_ptr);
114290001Sglebius
115290001Sglebius	TEST_ASSERT_EQUAL_PTR(dequeue(q), e1_ptr);
116290001Sglebius	TEST_ASSERT_EQUAL_PTR(dequeue(q), e3_ptr);
117290001Sglebius	TEST_ASSERT_EQUAL_PTR(dequeue(q), e2_ptr);
118290001Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q));
119290001Sglebius	TEST_ASSERT_NULL(dequeue(q));
120290001Sglebius
121290001Sglebius	destroy_queue(q);
122290001Sglebius}
123290001Sglebius
124290001Sglebius
125290001Sglebiusvoid
126290001Sglebiustest_CustomOrderQueue(void) {
127290001Sglebius	queue* q = debug_create_priority_queue(compare_elements);
128290001Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
129290001Sglebius
130290001Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
131290001Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
132290001Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
133290001Sglebius	e4_ptr = (element*)debug_get_node(sizeof(element));
134290001Sglebius	e5_ptr = (element*)debug_get_node(sizeof(element));
135290001Sglebius	e6_ptr = (element*)debug_get_node(sizeof(element));
136290001Sglebius
137290001Sglebius	e1_ptr->number = 1;
138290001Sglebius	e2_ptr->number = 1;
139290001Sglebius	e3_ptr->number = 10;
140290001Sglebius	e4_ptr->number = 10;
141290001Sglebius	e5_ptr->number = 100;
142290001Sglebius	e6_ptr->number = 100;
143290001Sglebius
144290001Sglebius	enqueue(q, e3_ptr);
145290001Sglebius	enqueue(q, e5_ptr);
146290001Sglebius	enqueue(q, e2_ptr);
147290001Sglebius	enqueue(q, e1_ptr);
148290001Sglebius	enqueue(q, e4_ptr);
149290001Sglebius	enqueue(q, e6_ptr);
150290001Sglebius
151290001Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100);
152290001Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100);
153290001Sglebius
154290001Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100);
155290001Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100);
156290001Sglebius
157290001Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10);
158290001Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10);
159290001Sglebius
160290001Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10);
161290001Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10);
162290001Sglebius
163290001Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1);
164290001Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1);
165290001Sglebius
166290001Sglebius	TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1);
167290001Sglebius	TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1);
168290001Sglebius
169290001Sglebius	TEST_ASSERT_TRUE(empty(q));
170290001Sglebius
171290001Sglebius	destroy_queue(q);
172290001Sglebius
173290001Sglebius	free_node(e1_ptr);
174290001Sglebius	free_node(e2_ptr);
175290001Sglebius	free_node(e3_ptr);
176290001Sglebius	free_node(e4_ptr);
177290001Sglebius	free_node(e5_ptr);
178290001Sglebius	free_node(e6_ptr);
179290001Sglebius}
180290001Sglebius
181290001Sglebius
182290001Sglebiusvoid
183290001Sglebiustest_DestroyNonEmptyQueue(void) {
184290001Sglebius	queue* q = create_queue();
185290001Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
186290001Sglebius
187290001Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
188290001Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
189290001Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
190290001Sglebius	e4_ptr = (element*)debug_get_node(sizeof(element));
191290001Sglebius	e5_ptr = (element*)debug_get_node(sizeof(element));
192290001Sglebius	e6_ptr = (element*)debug_get_node(sizeof(element));
193290001Sglebius
194290001Sglebius	enqueue(q, e3_ptr);
195290001Sglebius	enqueue(q, e2_ptr);
196290001Sglebius	enqueue(q, e4_ptr);
197290001Sglebius	enqueue(q, e1_ptr);
198290001Sglebius	enqueue(q, e6_ptr);
199290001Sglebius	enqueue(q, e5_ptr);
200290001Sglebius
201290001Sglebius	destroy_queue(q);
202290001Sglebius}
203290001Sglebius
204290001Sglebiusvoid
205290001Sglebiustest_AppendQueues(void) {
206290001Sglebius	queue* q1 = create_queue();
207290001Sglebius	queue* q2 = create_queue();
208290001Sglebius	queue* q3 = create_queue();
209290001Sglebius	queue* q4 = create_queue();
210290001Sglebius	queue* q5 = create_queue();
211290001Sglebius
212290001Sglebius	// append empty queue to empty queue
213290001Sglebius	append_queue(q1, q2);	// destroys q2
214290001Sglebius
215290001Sglebius	element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr;
216290001Sglebius	e1_ptr = (element*)debug_get_node(sizeof(element));
217290001Sglebius	e2_ptr = (element*)debug_get_node(sizeof(element));
218290001Sglebius	e3_ptr = (element*)debug_get_node(sizeof(element));
219290001Sglebius	e4_ptr = (element*)debug_get_node(sizeof(element));
220290001Sglebius	e5_ptr = (element*)debug_get_node(sizeof(element));
221290001Sglebius	e6_ptr = (element*)debug_get_node(sizeof(element));
222290001Sglebius
223290001Sglebius	enqueue(q1, e1_ptr);
224290001Sglebius	enqueue(q1, e2_ptr);
225290001Sglebius	enqueue(q1, e3_ptr);
226290001Sglebius
227290001Sglebius
228290001Sglebius	// append empty queue to non empty queue
229290001Sglebius	append_queue(q1, q3);	// destroys q3
230290001Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q1));
231290001Sglebius
232290001Sglebius	// append non empty queue to empty queue
233290001Sglebius	append_queue(q4, q1);	// destroys q1
234290001Sglebius	TEST_ASSERT_EQUAL(3, get_no_of_elements(q4));
235290001Sglebius
236290001Sglebius	enqueue(q5, e4_ptr);
237290001Sglebius	enqueue(q5, e5_ptr);
238290001Sglebius
239290001Sglebius	// append non empty queue to non empty queue
240290001Sglebius	append_queue(q4, q5);	// destroys q5
241290001Sglebius	TEST_ASSERT_EQUAL(5, get_no_of_elements(q4));
242290001Sglebius
243290001Sglebius	dequeue(q4);
244290001Sglebius	dequeue(q4);
245290001Sglebius	dequeue(q4);
246290001Sglebius	dequeue(q4);
247290001Sglebius	dequeue(q4);
248290001Sglebius
249290001Sglebius	free_node(e1_ptr);
250290001Sglebius	free_node(e2_ptr);
251290001Sglebius	free_node(e3_ptr);
252290001Sglebius	free_node(e4_ptr);
253290001Sglebius	free_node(e5_ptr);
254293896Sglebius	free_node(e6_ptr);
255290001Sglebius
256290001Sglebius	TEST_ASSERT_EQUAL(0, get_no_of_elements(q4));
257290001Sglebius
258290001Sglebius	// destroy_queue(q1);	// destroyed already
259290001Sglebius	// destroy_queue(q2);	// destroyed already
260290001Sglebius	// destroy_queue(q3);	// destroyed already
261290001Sglebius	destroy_queue(q4);
262290001Sglebius	// destroy_queue(q5);	// destroyed already
263290001Sglebius}
264