ntp_prio_q.c revision 290001
1#include "config.h" 2 3#include "ntp.h" 4#include "ntp_calendar.h" 5#include "ntp_stdlib.h" 6 7#include "ntp_prio_q.h" 8 9#include "unity.h" 10 11 12 13#include <string.h> 14/* 15TODO: 16-fix the includes 17-makefile: ntpdsim-ntp_prio_q.o - make sure it's okay 18*/ 19 20 21/* helpers */ 22 23typedef struct Element 24{ 25 char str[37]; // 37 seems like a nice candidate to break stuff 26 int number; 27 28} element; 29 30int 31compare_elements(const void * e1, const void * e2) 32{ 33 return ((element*)e1)->number < ((element*)e2)->number; 34} 35 36/* tests */ 37 38void 39test_AllocateDeallocateNode(void) { 40 element* e_ptr = debug_get_node(sizeof(element)); 41 free_node(e_ptr); 42} 43 44 45void 46test_EmptyQueue(void) { 47 queue* q = create_queue(); 48 49 TEST_ASSERT_NOT_NULL(q); 50 TEST_ASSERT_TRUE(empty(q)); 51 TEST_ASSERT_NULL(queue_head(q)); 52 TEST_ASSERT_NULL(dequeue(q)); 53 TEST_ASSERT_EQUAL(0, get_no_of_elements(q)); 54 55 destroy_queue(q); 56} 57 58 59void 60test_OneElementQueue(void) { 61 queue* q = create_queue(); 62 63 TEST_ASSERT_NOT_NULL(q); 64 65 element e = {"string", 3}; 66 element* e_ptr = debug_get_node(sizeof(element)); 67 enqueue(q, e_ptr); 68 *e_ptr = e; 69 70 TEST_ASSERT_FALSE(empty(q)); 71 TEST_ASSERT_NOT_NULL(queue_head(q)); 72 TEST_ASSERT_EQUAL(1, get_no_of_elements(q)); 73 74 element* e_ptr_returned = dequeue(q); 75 76 TEST_ASSERT_NOT_NULL(e_ptr_returned); 77 TEST_ASSERT_EQUAL_STRING(e_ptr_returned->str, "string"); 78 TEST_ASSERT_EQUAL_PTR(e_ptr_returned, e_ptr); 79 TEST_ASSERT_EQUAL(0, get_no_of_elements(q)); 80 TEST_ASSERT_TRUE(empty(q)); 81 TEST_ASSERT_NULL(dequeue(q)); 82 83 destroy_queue(q); 84} 85 86 87void 88test_MultipleElementQueue(void) { 89 queue* q = create_queue(); 90 91 TEST_ASSERT_NOT_NULL(q); 92 93 element *e1_ptr, *e2_ptr, *e3_ptr; 94 95 e1_ptr = (element*)debug_get_node(sizeof(element)); 96 e2_ptr = (element*)debug_get_node(sizeof(element)); 97 e3_ptr = (element*)debug_get_node(sizeof(element)); 98 99 enqueue(q, e1_ptr); 100 enqueue(q, e2_ptr); 101 enqueue(q, e3_ptr); 102 103 TEST_ASSERT_EQUAL(3, get_no_of_elements(q)); 104 105 dequeue(q); 106 enqueue(q, e1_ptr); 107 108 TEST_ASSERT_EQUAL(3, get_no_of_elements(q)); 109 110 dequeue(q); 111 dequeue(q); 112 enqueue(q, e3_ptr); 113 enqueue(q, e2_ptr); 114 115 TEST_ASSERT_EQUAL_PTR(dequeue(q), e1_ptr); 116 TEST_ASSERT_EQUAL_PTR(dequeue(q), e3_ptr); 117 TEST_ASSERT_EQUAL_PTR(dequeue(q), e2_ptr); 118 TEST_ASSERT_EQUAL(0, get_no_of_elements(q)); 119 TEST_ASSERT_NULL(dequeue(q)); 120 121 destroy_queue(q); 122} 123 124 125void 126test_CustomOrderQueue(void) { 127 queue* q = debug_create_priority_queue(compare_elements); 128 element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr; 129 130 e1_ptr = (element*)debug_get_node(sizeof(element)); 131 e2_ptr = (element*)debug_get_node(sizeof(element)); 132 e3_ptr = (element*)debug_get_node(sizeof(element)); 133 e4_ptr = (element*)debug_get_node(sizeof(element)); 134 e5_ptr = (element*)debug_get_node(sizeof(element)); 135 e6_ptr = (element*)debug_get_node(sizeof(element)); 136 137 e1_ptr->number = 1; 138 e2_ptr->number = 1; 139 e3_ptr->number = 10; 140 e4_ptr->number = 10; 141 e5_ptr->number = 100; 142 e6_ptr->number = 100; 143 144 enqueue(q, e3_ptr); 145 enqueue(q, e5_ptr); 146 enqueue(q, e2_ptr); 147 enqueue(q, e1_ptr); 148 enqueue(q, e4_ptr); 149 enqueue(q, e6_ptr); 150 151 TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100); 152 TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100); 153 154 TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 100); 155 TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 100); 156 157 TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10); 158 TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10); 159 160 TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 10); 161 TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 10); 162 163 TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1); 164 TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1); 165 166 TEST_ASSERT_EQUAL(((element*)queue_head(q))->number, 1); 167 TEST_ASSERT_EQUAL(((element*)dequeue(q))->number, 1); 168 169 TEST_ASSERT_TRUE(empty(q)); 170 171 destroy_queue(q); 172 173 free_node(e1_ptr); 174 free_node(e2_ptr); 175 free_node(e3_ptr); 176 free_node(e4_ptr); 177 free_node(e5_ptr); 178 free_node(e6_ptr); 179} 180 181 182void 183test_DestroyNonEmptyQueue(void) { 184 queue* q = create_queue(); 185 element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr; 186 187 e1_ptr = (element*)debug_get_node(sizeof(element)); 188 e2_ptr = (element*)debug_get_node(sizeof(element)); 189 e3_ptr = (element*)debug_get_node(sizeof(element)); 190 e4_ptr = (element*)debug_get_node(sizeof(element)); 191 e5_ptr = (element*)debug_get_node(sizeof(element)); 192 e6_ptr = (element*)debug_get_node(sizeof(element)); 193 194 enqueue(q, e3_ptr); 195 enqueue(q, e2_ptr); 196 enqueue(q, e4_ptr); 197 enqueue(q, e1_ptr); 198 enqueue(q, e6_ptr); 199 enqueue(q, e5_ptr); 200 201 destroy_queue(q); 202} 203 204void 205test_AppendQueues(void) { 206 queue* q1 = create_queue(); 207 queue* q2 = create_queue(); 208 queue* q3 = create_queue(); 209 queue* q4 = create_queue(); 210 queue* q5 = create_queue(); 211 212 // append empty queue to empty queue 213 append_queue(q1, q2); // destroys q2 214 215 element *e1_ptr, *e2_ptr, *e3_ptr, *e4_ptr, *e5_ptr, *e6_ptr; 216 e1_ptr = (element*)debug_get_node(sizeof(element)); 217 e2_ptr = (element*)debug_get_node(sizeof(element)); 218 e3_ptr = (element*)debug_get_node(sizeof(element)); 219 e4_ptr = (element*)debug_get_node(sizeof(element)); 220 e5_ptr = (element*)debug_get_node(sizeof(element)); 221 e6_ptr = (element*)debug_get_node(sizeof(element)); 222 223 enqueue(q1, e1_ptr); 224 enqueue(q1, e2_ptr); 225 enqueue(q1, e3_ptr); 226 227 228 // append empty queue to non empty queue 229 append_queue(q1, q3); // destroys q3 230 TEST_ASSERT_EQUAL(3, get_no_of_elements(q1)); 231 232 // append non empty queue to empty queue 233 append_queue(q4, q1); // destroys q1 234 TEST_ASSERT_EQUAL(3, get_no_of_elements(q4)); 235 236 enqueue(q5, e4_ptr); 237 enqueue(q5, e5_ptr); 238 239 // append non empty queue to non empty queue 240 append_queue(q4, q5); // destroys q5 241 TEST_ASSERT_EQUAL(5, get_no_of_elements(q4)); 242 243 dequeue(q4); 244 dequeue(q4); 245 dequeue(q4); 246 dequeue(q4); 247 dequeue(q4); 248 249 free_node(e1_ptr); 250 free_node(e2_ptr); 251 free_node(e3_ptr); 252 free_node(e4_ptr); 253 free_node(e5_ptr); 254 255 TEST_ASSERT_EQUAL(0, get_no_of_elements(q4)); 256 257 // destroy_queue(q1); // destroyed already 258 // destroy_queue(q2); // destroyed already 259 // destroy_queue(q3); // destroyed already 260 destroy_queue(q4); 261 // destroy_queue(q5); // destroyed already 262} 263