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