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