12 #include "lib_random.h"
14 #include "lib_vbtree.h"
15 #include "lib_vqueue.h"
16 #include "lib_vstack.h"
21 #define SORT_TESTS 1000
23 void exit_error(const char *err_msg
)
25 fprintf(stderr
, "ERROR: %s\n", err_msg
);
29 void test_msg_start(char *msg
)
31 int msg_length
= strlen(msg
);
34 /* 74 is 80 - length of "PASSED" */
35 while(msg_length
< 74)
42 void test_msg_end(int pass
)
49 exit_error("UNIT TESTING FAILED.\n\n");
53 /* unit tests begin here */
58 test_msg_start("Test Random Number Generator - Integers 0 to 100");
62 i
= random_int(0,100);
63 if(i
< 0 || i
> 100) result
++;
71 int test_linked_list()
74 List_Node
*test_node1
= NULL
;
75 List_Node
*test_node2
= NULL
;
76 List_Node
*test_node3
= NULL
;
80 List_Head
*test_list1
= list_new();
81 List_Head
*test_list2
= list_new();
83 test_msg_start("Test Linked List Creation");
84 if(test_list1
== NULL
) result
++;
87 test_msg_start("Test Linked List Empty Length - Using Variable");
88 if(test_list1
->count
!= 0) result
++;
91 test_msg_start("Test Linked List Empty Length - Using Length Function");
92 if(list_len(test_list1
) != 0 ) result
++;
95 test_msg_start("Test Linked List - Adding Node To Empty List");
96 if(list_ins_tail(test_list1
) == NULL
) result
++;
99 test_msg_start("Test Linked List - Adding Node To Non-Empty List");
100 if(list_ins_tail(test_list1
) == NULL
) result
++;
101 test_msg_end(result
);
103 test_msg_start("Test Linked List - Clearing List With More Than One Node");
104 list_clear(test_list1
);
105 if(test_list1
->count
!= 0) result
++;
106 if(list_len(test_list1
) != 0 ) result
++;
107 test_msg_end(result
);
109 test_msg_start("Test Linked List - Clearing List With No Nodes");
110 list_clear(test_list1
);
111 if(test_list1
->count
!= 0) result
++;
112 if(list_len(test_list1
) != 0 ) result
++;
113 test_msg_end(result
);
115 test_msg_start("Test Linked List End - No Nodes");
116 list_clear(test_list1
);
117 if(list_tail(test_list1
) != NULL
) result
++;
118 test_msg_end(result
);
120 test_msg_start("Test Linked List End - One Node Only");
121 list_clear(test_list1
);
122 test_node1
= list_ins_tail(test_list1
);
123 if(test_node1
== NULL
) result
++;
124 if(list_tail(test_list1
) != test_node1
) result
++;
125 test_msg_end(result
);
127 test_msg_start("Test Linked List End - More Than One Node");
128 list_clear(test_list1
);
129 list_ins_tail(test_list1
);
130 test_node1
= list_ins_tail(test_list1
);
131 if(test_node1
== NULL
) result
++;
132 if(list_tail(test_list1
) != test_node1
) result
++;
133 test_msg_end(result
);
135 test_msg_start("Test Linked List - Removing Node From List With More Than One Node");
136 list_clear(test_list1
);
137 test_node1
= list_ins_tail(test_list1
);
138 test_node2
= list_ins_head(test_list1
);
139 list_rm_node(test_list1
, test_node1
);
140 if(test_list1
->pNext
!= test_node2
) result
++;
141 test_msg_end(result
);
143 test_msg_start("Test Linked List - Removing Node From Empty List");
144 list_clear(test_list1
);
145 test_node1
= (List_Node
*)&test_list1
; /* pointer points to known bad location */
146 /* should not crash but return gracefully */
147 if(list_rm_node(test_list1
, test_node1
) != -1) result
++;
148 test_msg_end(result
);
150 test_msg_start("Test Linked List - Inserting Node After");
151 list_clear(test_list1
);
154 test_node1
= list_ins_tail(test_list1
);
155 test_node2
= list_ins_after(test_list1
, test_node1
);
158 if(test_list1
->pNext
!= test_node1
) result
++;
159 /*...and end nodes. */
160 if(list_tail(test_list1
) != test_node2
) result
++;
161 /* end node next should be null */
162 if(list_tail(test_list1
)->pNext
!= NULL
) result
++;
163 test_msg_end(result
);
165 test_msg_start("Test Linked List - Inserting Node Before");
166 list_clear(test_list1
);
169 test_node1
= list_ins_head(test_list1
);
170 test_node2
= list_ins_before(test_list1
, test_node1
);
173 if(test_list1
->pNext
!= test_node2
) result
++;
174 /*...and end nodes. */
175 if(list_tail(test_list1
) != test_node1
) result
++;
176 /* end node next should be null */
177 if(list_tail(test_list1
)->pNext
!= NULL
) result
++;
178 test_msg_end(result
);
180 test_msg_start("Test Linked List - Test Lengths");
181 list_clear(test_list1
);
182 if(list_len(test_list1
) != 0) result
++;
184 /* adding nodes using each function */
185 list_ins_head(test_list1
);
186 if(list_len(test_list1
) != 1) result
++;
188 list_ins_tail(test_list1
);
189 if(list_len(test_list1
) != 2) result
++;
191 list_ins_before(test_list1
, list_tail(test_list1
));
192 if(list_len(test_list1
) != 3) result
++;
194 list_ins_after(test_list1
, list_tail(test_list1
));
195 if(list_len(test_list1
) != 4) result
++;
196 test_msg_end(result
);
198 test_msg_start("Test Linked List - Previous Node Check");
199 list_clear(test_list1
);
202 if(list_prev_node(test_list1
, NULL
) != NULL
) result
++;
203 if(list_prev_node(NULL
, test_list1
->pNext
) != NULL
) result
++;
204 if(list_prev_node(NULL
, test_node1
+ 1000) != NULL
) result
++;
205 test_node1
= list_ins_head(test_list1
);
206 if(list_prev_node(test_list1
, test_list1
->pNext
) != NULL
) result
++;
207 test_node2
= list_ins_head(test_list1
);
208 if(list_prev_node(test_list1
, test_node1
) != test_node2
) result
++;
209 if(list_prev_node(test_list1
, test_node2
) != NULL
) result
++;
210 test_msg_end(result
);
212 test_msg_start("Test Linked List - Removing Nodes By Address");
213 /* removing nodes from various places */
214 list_clear(test_list1
);
218 if(list_rm_node(NULL
, test_list1
->pNext
)!= -1) result
++;
219 if(list_rm_node(test_list1
, NULL
) != -1) result
++;
220 test_node1
= list_ins_head(test_list1
);
221 test_node2
= list_ins_head(test_list1
);
222 list_rm_node(test_list1
, test_list1
->pNext
);
223 if(list_len(test_list1
) != 1) result
++;
224 test_node1
= list_tail(test_list1
);
225 list_rm_node(test_list1
, test_node1
);
226 if(list_len(test_list1
) != 0) result
++;
227 if(list_rm_node(test_list1
, list_tail(test_list1
)) != -1) result
++;
228 test_msg_end(result
);
230 test_msg_start("Test Linked List - Removing Nodes After Address");
231 list_clear(test_list1
);
234 test_node1
= list_ins_tail(test_list1
);
235 test_node2
= list_ins_tail(test_list1
);
236 if(list_rm_next(test_list1
, test_node1
) != 1) result
++;
237 test_msg_end(result
);
239 test_msg_start("Test Linked List - Removing Nodes Before Address");
240 list_clear(test_list1
);
243 if(list_rm_before(test_list1
, NULL
) != -1) result
++;
244 if(list_rm_before(NULL
, NULL
) != -1) result
++;
245 if(list_rm_before(test_list1
+ 1000, NULL
) != -1) result
++;
246 test_node1
= list_ins_tail(test_list1
);
247 test_node2
= list_ins_tail(test_list1
);
248 if(list_rm_before(test_list1
, test_node2
+ 1000) != -1) result
++;
249 if(list_rm_before(test_list1
, test_node2
) != 1) result
++;
250 test_msg_end(result
);
252 test_msg_start("Test Linked List - Copying List");
253 list_clear(test_list1
);
254 list_clear(test_list2
);
255 test_node1
= list_ins_tail(test_list1
);
256 test_node1
->pData
= &result
;
257 test_node2
= list_ins_tail(test_list1
);
258 if(list_copy(test_list2
, test_list1
) != 0) result
++;
259 if(test_list1
->pNext
== test_list2
->pNext
) result
++;
260 if(test_list1
->count
!= 2) result
++;
261 if(test_list2
->count
!= 2) result
++;
262 if(test_list1
->pNext
->pData
!= test_list2
->pNext
->pData
) result
++;
263 test_msg_end(result
);
265 test_msg_start("Test Linked List - Copying Empty List");
266 list_clear(test_list1
);
267 list_clear(test_list2
);
268 if(list_copy(test_list2
, test_list1
) != 0) result
++;
269 if(test_list1
->pNext
!= NULL
) result
++;
270 if(test_list2
->pNext
!= NULL
) result
++;
271 if(test_list1
->count
!= 0) result
++;
272 if(test_list2
->count
!= 0) result
++;
273 test_msg_end(result
);
275 test_msg_start("Test Linked List - Get Node Address By Node Number - First Node");
276 list_clear(test_list1
);
277 test_node1
= list_ins_head(test_list1
);
278 test_node2
= list_ins_head(test_list1
);
279 test_node3
= list_get_num(test_list1
, 1);
280 if(test_node3
!= test_node2
) result
++;
281 test_msg_end(result
);
283 test_msg_start("Test Linked List - Get Node Address By Node Number - Middle Node");
284 list_clear(test_list1
);
285 list_ins_tail(test_list1
);
286 list_ins_tail(test_list1
);
287 list_ins_tail(test_list1
);
288 list_ins_tail(test_list1
);
289 test_node2
= list_ins_tail(test_list1
);
290 list_ins_tail(test_list1
);
291 list_ins_tail(test_list1
);
292 list_ins_tail(test_list1
);
293 list_ins_tail(test_list1
);
294 test_node3
= list_get_num(test_list1
, 5);
295 if(test_node3
!= test_node2
) result
++;
296 test_msg_end(result
);
298 test_msg_start("Test Linked List - Get Node Address By Node Number - Last Node");
299 list_clear(test_list1
);
300 test_node1
= list_ins_tail(test_list1
);
301 test_node2
= list_ins_tail(test_list1
);
302 test_node3
= list_get_num(test_list1
, 2);
303 if(test_node3
!= test_node2
) result
++;
304 test_msg_end(result
);
306 test_msg_start("Test Linked List - Get Node Address By Node Number - Empty List");
307 list_clear(test_list1
);
308 test_node1
= list_get_num(test_list1
, 1);
309 if(test_node1
!= NULL
) result
++;
310 test_node1
= list_get_num(test_list1
, 55);
311 if(test_node1
!= NULL
) result
++;
312 test_msg_end(result
);
314 test_msg_start("Test Linked List - Swap Nodes In List");
315 list_clear(test_list1
);
316 test_node1
= list_ins_tail(test_list1
);
317 test_node2
= list_ins_tail(test_list1
);
318 test_node3
= list_ins_tail(test_list1
);
319 pTrack
[1] = test_node1
->pNext
;
320 pTrack
[2] = test_node2
->pNext
;
321 if(list_node_swap(test_node1
, test_node2
) != 0) result
++;
322 if(test_node1
->pNext
!= pTrack
[2]) result
++;
323 if(test_node2
->pNext
!= pTrack
[1]) result
++;
324 test_msg_end(result
);
326 test_msg_start("Test Linked List - List Reverse - Pointer Tracking");
327 list_clear(test_list1
);
328 for(i
= 0; i
< 5; i
++) {
329 pTrack
[i
] = list_ins_tail(test_list1
);
330 pTrack
[i
]->pData
= &pTrack
[i
]->pData
;
332 test_list1
= list_reverse(test_list1
);
333 for(i
= 1, j
= 4; i
<= 4; i
++, j
--) {
334 test_node1
= list_get_num(test_list1
, i
);
335 if(test_node1
->pData
!= pTrack
[j
]) result
++;
337 test_msg_end(result
);
339 test_msg_start("Test Linked List - List Next Preprocessor");
340 list_clear(test_list1
);
341 list_clear(test_list2
);
344 test_node1
= list_ins_head(test_list1
);
345 test_node2
= list_ins_head(test_list1
);
346 if(list_next(test_node1
) == test_node2
) result
++;
347 test_msg_end(result
);
349 test_msg_start("Test Linked List - Default Payload");
350 list_clear(test_list1
);
353 test_node1
= list_ins_tail(test_list1
);
354 test_node2
= list_ins_tail(test_list1
);
355 if(test_node1
->pData
!= NULL
) result
++;
357 /* make data point to something and test again... */
358 test_node1
->pData
= test_node1
;
359 if(list_data(test_node1
) != test_node1
) result
++;
360 test_msg_end(result
);
362 test_msg_start("Test Linked List - List Is Head Preprocessor");
363 if(list_is_head(test_list1
, test_node2
) != 0) result
++;
364 if(list_is_head(test_list1
, test_node1
) != 1) result
++;
365 test_msg_end(result
);
367 test_msg_start("Test Linked List - List Is Tail Preprocessor");
368 if(list_is_tail(test_node2
) != 1) result
++;
369 if(list_is_tail(test_node1
) != 0) result
++;
370 test_msg_end(result
);
372 test_msg_start("Test Linked List - List Head Preprocessor");
373 if(list_head(test_list1
) != test_node1
) result
++;
374 test_msg_end(result
);
376 test_msg_start("Test Linked List - Append Lists - Pointer Tracking");
377 list_clear(test_list1
);
378 list_clear(test_list2
);
379 list_ins_tail(test_list1
);
380 list_ins_tail(test_list1
);
381 list_ins_tail(test_list1
);
382 pTrack
[0] = list_ins_tail(test_list1
);
383 pTrack
[1] = list_ins_tail(test_list2
);
384 list_ins_tail(test_list2
);
385 list_ins_tail(test_list2
);
386 list_append(test_list1
, test_list2
);
387 if(test_list1
->count
!= 7) result
++;
388 if(!list_search(test_list1
, pTrack
[0])) result
++;
389 if(!list_search(test_list1
, pTrack
[1])) result
++;
390 if(pTrack
[0] != list_get_num(test_list1
, 4)) result
++;
391 if(pTrack
[1] != list_get_num(test_list1
, 5)) result
++;
392 test_msg_end(result
);
394 test_msg_start("Test Linked List - Create Data Array - Pointer Tracking");
395 list_clear(test_list1
);
396 pTrack
[0] = list_ins_tail(test_list1
);
397 pTrack
[0] = pTrack
[0]->pData
= &test_list1
;
398 pTrack
[1] = list_ins_tail(test_list1
);
399 pTrack
[1] = pTrack
[1]->pData
= &test_list2
;
400 pTrack
[2] = list_ins_tail(test_list1
);
401 pTrack
[2] = pTrack
[2]->pData
= &pTrack
;
402 pTrack
[3] = list_ins_tail(test_list1
);
403 pTrack
[3] = pTrack
[3]->pData
= &test_node1
;
404 pTrack
[4] = list_ins_tail(test_list1
);
405 pTrack
[4] = pTrack
[4]->pData
= &test_node2
;
406 pArr
[5] = &test_list1
;
407 if(list_data_array(test_list1
, pArr
, 6) != 0) result
++;
408 if(pArr
[0] != pTrack
[0]) result
++;
409 if(pArr
[1] != pTrack
[1]) result
++;
410 if(pArr
[2] != pTrack
[2]) result
++;
411 if(pArr
[3] != pTrack
[3]) result
++;
412 if(pArr
[4] != pTrack
[4]) result
++;
413 if(pArr
[5] != NULL
) result
++;
414 test_msg_end(result
);
416 test_msg_start("Test Linked List - Create Node Array - Pointer Tracking");
417 list_clear(test_list1
);
418 pTrack
[0] = list_ins_tail(test_list1
);
419 pTrack
[1] = list_ins_tail(test_list1
);
420 pTrack
[2] = list_ins_tail(test_list1
);
421 pTrack
[3] = list_ins_tail(test_list1
);
422 pTrack
[4] = list_ins_tail(test_list1
);
423 pArr
[5] = &test_list1
;
424 if(list_node_array(test_list1
, pArr
, 6) != 0) result
++;
425 if(pArr
[0] != pTrack
[0]) result
++;
426 if(pArr
[1] != pTrack
[1]) result
++;
427 if(pArr
[2] != pTrack
[2]) result
++;
428 if(pArr
[3] != pTrack
[3]) result
++;
429 if(pArr
[4] != pTrack
[4]) result
++;
430 if(pArr
[5] != NULL
) result
++;
431 test_msg_end(result
);
433 test_msg_start("Test Linked List - Search List");
434 list_clear(test_list1
);
435 if(list_search(test_list1
, test_node1
) != 0) result
++;
436 test_node1
= list_ins_head(test_list1
);
437 if(list_search(test_list1
, test_node1
) != 1) result
++;
438 if(list_search(test_list1
, test_node2
) != 0) result
++;
439 if(list_search(test_list1
, test_node3
) != 0) result
++;
440 if(list_search(test_list1
, NULL
) != 0) result
++;
441 if(list_search(test_list1
, (List_Node
*)test_list1
) != 0) result
++;
442 test_node2
= list_ins_head(test_list1
);
443 if(list_search(test_list1
, test_node1
) != 1) result
++;
444 if(list_search(test_list1
, test_node2
) != 1) result
++;
445 if(list_search(test_list1
, test_node3
) != 0) result
++;
446 if(list_search(test_list1
, NULL
) != 0) result
++;
447 if(list_search(test_list1
, (List_Node
*)test_list1
) != 0) result
++;
448 list_clear(test_list1
);
449 if(list_search(test_list1
, test_node1
) != 0) result
++;
450 if(list_search(test_list1
, test_node2
) != 0) result
++;
451 if(list_search(test_list1
, test_node3
) != 0) result
++;
452 if(list_search(test_list1
, NULL
) != 0) result
++;
453 if(list_search(test_list1
, (List_Node
*)test_list1
) != 0) result
++;
454 test_msg_end(result
);
463 char data
[] = "This is some test data\n";
465 Stack_Head
*test_stack
= vstack_new();
466 Stack_Node
*temp_node1
= NULL
, *temp_node2
= NULL
;
468 test_msg_start("Test Variable Stack - Creating New Stack");
469 if(!test_stack
) result
++;
470 test_msg_end(result
);
472 test_msg_start("Test Variable Stack - Pushing Data Into Stack");
473 while(data
[i
] != '\0')
475 temp_node1
= vstack_push(test_stack
);
476 /* reserve memory for node payload - pointer to memory in pData */
477 pCh
= malloc(sizeof(char));
479 temp_node1
->pData
= pCh
;
482 test_msg_end(result
);
484 test_msg_start("Test Variable Stack - Popping Data Off Of Stack");
488 temp_node1
= vstack_peek(test_stack
);
489 /* verify data of this node */
490 pCh
= temp_node1
->pData
;
491 if(*pCh
!= data
[i
]) result
++;
492 vstack_pop(test_stack
);
494 test_msg_end(result
);
496 test_msg_start("Test Variable Stack - Popping Data Off Empty Stack");
497 vstack_clear(test_stack
);
498 if(vstack_pop(test_stack
) != -1) result
++;
499 test_msg_end(result
);
501 test_msg_start("Test Variable Stack - Tracking Stack Size");
502 vstack_clear(test_stack
);
503 if(vstack_size(test_stack
) != 0) result
++;
504 vstack_push(test_stack
);
505 if(vstack_size(test_stack
) != 1) result
++;
506 temp_node1
= vstack_peek(test_stack
);
507 if(vstack_size(test_stack
) != 1) result
++;
508 vstack_pop(test_stack
);
509 if(vstack_size(test_stack
) != 0) result
++;
510 test_msg_end(result
);
512 test_msg_start("Test Variable Stack - Tracking Node Address With Peek and Push");
513 vstack_clear(test_stack
);
515 temp_node1
= vstack_push(test_stack
);
516 temp_node2
= vstack_push(test_stack
);
517 if(vstack_peek(test_stack
) != temp_node2
) result
++;
518 vstack_pop(test_stack
);
519 if(vstack_peek(test_stack
) != temp_node1
) result
++;
520 test_msg_end(result
);
531 Queue_Head
*test_q1
= vq_new();
532 Queue_Head
*test_q2
= vq_new();
534 Queue_Node
*test_node1
= NULL
;
535 Queue_Node
*test_node2
= NULL
;
536 Queue_Node
*test_node3
= NULL
;
538 Queue_Node
*pTrack
[5];
540 test_msg_start("Test Queue - Creating New Queue");
541 if(!test_q1
) result
++;
542 test_msg_end(result
);
544 test_msg_start("Test Queue - Pushing Data Into Queue");
545 while(data
[i
] != '\0')
547 test_node1
= vq_enq(test_q1
);
548 /* reserve memory for node payload - pointer to memory in pData */
549 pCh
= malloc(sizeof(char));
551 test_node1
->pData
= pCh
;
554 test_msg_end(result
);
556 test_msg_start("Test Queue - Popping Data Off Of Queue");
558 while(data
[i
] != '\n')
560 test_node1
= vq_peek(test_q1
);
561 /* verify data of this node */
562 pCh
= test_node1
->pData
;
563 if(*pCh
!= data
[i
]) result
++;
567 test_msg_end(result
);
569 test_msg_start("Test Queue - Popping Data Off Empty Queue");
571 if(vq_deq(test_q1
) != -1) result
++;
572 test_msg_end(result
);
574 test_msg_start("Test Queue - Tracking Queue Size");
576 if(vq_size(test_q1
) != 0) result
++;
578 if(vq_size(test_q1
) != 1) result
++;
579 test_node1
= vq_peek(test_q1
);
580 if(vq_size(test_q1
) != 1) result
++;
582 if(vq_size(test_q1
) != 0) result
++;
583 test_msg_end(result
);
585 test_msg_start("Test Queue - Tracking Node Address With Enqueue and Dequeue");
586 vq_clear(test_q1
); test_node1
= NULL
; test_node2
= NULL
;
587 test_node1
= vq_enq(test_q1
);
588 test_node2
= vq_enq(test_q1
);
589 if(vq_peek(test_q1
) != test_node1
) result
++;
591 if(vq_peek(test_q1
) != test_node2
) result
++;
592 test_msg_end(result
);
594 test_msg_start("Test Queue - Copying Queue");
597 test_node1
= vq_enq(test_q1
);
598 test_node1
->pData
= &result
;
599 test_node2
= vq_enq(test_q1
);
600 if(vq_copy(test_q2
, test_q1
) != 0) result
++;
601 if(test_q1
->pNext
== test_q2
->pNext
) result
++;
602 if(test_q1
->count
!= 2) result
++;
603 if(test_q2
->count
!= 2) result
++;
604 if(test_q1
->pNext
->pData
!= test_q2
->pNext
->pData
) result
++;
605 test_msg_end(result
);
607 test_msg_start("Test Queue - Copying Empty Queue");
610 if(vq_copy(test_q2
, test_q1
) != 0) result
++;
611 if(test_q1
->pNext
!= NULL
) result
++;
612 if(test_q2
->pNext
!= NULL
) result
++;
613 if(test_q1
->count
!= 0) result
++;
614 if(test_q2
->count
!= 0) result
++;
615 test_msg_end(result
);
617 test_msg_start("Test Queue - Get Node Address By Node Number - First Node");
619 test_node1
= vq_enq(test_q1
);
620 test_node2
= vq_enq(test_q1
);
621 test_node3
= vq_get_num(test_q1
, 1);
622 if(test_node3
!= test_node2
) result
++;
623 test_msg_end(result
);
625 test_msg_start("Test Queue - Get Node Address By Node Number - Middle Node");
631 test_node2
= vq_enq(test_q1
);
636 test_node3
= vq_get_num(test_q1
, 5);
637 if(test_node3
!= test_node2
) result
++;
638 test_msg_end(result
);
640 test_msg_start("Test Queue - Get Node Address By Node Number - Last Node");
642 test_node1
= list_ins_tail(test_q2
);
643 test_node2
= list_ins_tail(test_q2
);
644 test_node3
= list_get_num(test_q2
, 2);
645 if(test_node3
!= test_node2
) result
++;
646 test_msg_end(result
);
648 test_msg_start("Test Queue - Get Node Address By Node Number - Empty List");
650 test_node1
= vq_get_num(test_q2
, 1);
651 if(test_node1
!= NULL
) result
++;
652 test_node1
= vq_get_num(test_q2
, 55);
653 if(test_node1
!= NULL
) result
++;
654 test_msg_end(result
);
656 test_msg_start("Test Queue - Swap Nodes In List");
658 test_node1
= vq_enq(test_q2
);
659 test_node2
= vq_enq(test_q2
);
660 test_node3
= vq_enq(test_q2
);
661 pTrack
[1] = test_node1
->pNext
;
662 pTrack
[2] = test_node2
->pNext
;
663 if(vq_node_swap(test_node1
, test_node2
) != 0) result
++;
664 if(test_node1
->pNext
!= pTrack
[2]) result
++;
665 if(test_node2
->pNext
!= pTrack
[1]) result
++;
666 test_msg_end(result
);
671 /* test outcome of sort algorithm - all data should be sorted */
672 int test_sort_data(int data
[], int lo
, int hi
)
674 int i
= lo
, result
= 0;
677 if(!(data
[i
] <= data
[i
+1])) result
++;
683 /* test specific position of data */
684 int test_sort_data_loc(int data
[])
686 int i
= 0, result
= 0;
688 if(data
[i
] != i
) result
++;
694 /* set pre-selected data in array */
695 void sort_set_array(int data
[])
697 assert(data
!= NULL
);
710 /* fill random length array with random data */
711 void sort_rnd_data_fill(int *data
, int length
, int min
, int max
)
716 data
[i
]= random_int(min
, max
);
723 int i
, result
= 0, length
, min_data_val
, max_data_val
;
727 test_msg_start("Test Selection Sort - Preset Array");
728 sort_set_array(data
);
729 sort_selection(data
, 0, 9);
730 result
+= test_sort_data(data
, 0, 9);
731 result
+= test_sort_data_loc(data
);
732 test_msg_end(result
);
734 test_msg_start("Test Selection Sort - Random Data");
735 for(i
= 0; i
< SORT_TESTS
; i
++) {
737 min_data_val
= random_int(INT_MIN
+1, (INT_MAX
/2)-1);
738 max_data_val
= random_int(min_data_val
, (INT_MAX
/2)-1);
739 length
= random_int(500, 1000); /* get length of a new array */
740 temp_data
= malloc(sizeof(int) * length
);
741 sort_rnd_data_fill(temp_data
, length
, min_data_val
, max_data_val
);
742 sort_selection(temp_data
, 0, length
);
743 result
+= test_sort_data(temp_data
, 0, length
);
747 test_msg_end(result
);
749 test_msg_start("Test Insertion Sort - Preset Array");
750 sort_set_array(data
);
751 sort_insertion(data
, 0, 9);
752 result
+= test_sort_data(data
, 0, 9);
753 result
+= test_sort_data_loc(data
);
754 test_msg_end(result
);
756 test_msg_start("Test Insertion Sort - Random Data");
757 for(i
= 0; i
< SORT_TESTS
; i
++) {
759 min_data_val
= random_int(INT_MIN
+1, (INT_MAX
/2)-1);
760 max_data_val
= random_int(min_data_val
, (INT_MAX
/2)-1);
761 length
= random_int(500, 1000); /* get length of a new array */
762 temp_data
= malloc(sizeof(int) * length
);
763 sort_rnd_data_fill(temp_data
, length
, min_data_val
, max_data_val
);
764 sort_insertion(temp_data
, 0, length
);
765 result
+= test_sort_data(temp_data
, 0, length
);
769 test_msg_end(result
);
771 test_msg_start("Test Quick Sort (Recursive) - Preset Array");
772 sort_set_array(data
);
773 sort_quick(data
, 0, 9);
774 result
+= test_sort_data(data
, 0, 9);
775 result
+= test_sort_data_loc(data
);
776 test_msg_end(result
);
778 test_msg_start("Test Quick Sort (Recursive) - Random Data");
779 for(i
= 0; i
< SORT_TESTS
; i
++) {
781 min_data_val
= random_int(INT_MIN
+1, (INT_MAX
/2)-1);
782 max_data_val
= random_int(min_data_val
, (INT_MAX
/2)-1);
783 length
= random_int(500, 1000); /* get length of a new array */
784 temp_data
= malloc(sizeof(int) * length
);
785 sort_rnd_data_fill(temp_data
, length
, min_data_val
, max_data_val
);
786 sort_quick(temp_data
, 0, length
);
787 result
+= test_sort_data(temp_data
, 0, length
);
791 test_msg_end(result
);
793 test_msg_start("Test Quick Sort - Preset Array");
794 sort_set_array(data
);
795 sort_quick_norecurse(data
, 0, 9);
796 result
+= test_sort_data(data
, 0, 9);
797 result
+= test_sort_data_loc(data
);
798 test_msg_end(result
);
800 test_msg_start("Test Quick Sort - Random Data");
801 for(i
= 0; i
< SORT_TESTS
; i
++) {
803 min_data_val
= random_int(INT_MIN
+1, (INT_MAX
/2)-1);
804 max_data_val
= random_int(min_data_val
, (INT_MAX
/2)-1);
805 length
= random_int(500, 1000); /* get length of a new array */
806 temp_data
= malloc(sizeof(int) * length
);
807 sort_rnd_data_fill(temp_data
, length
, min_data_val
, max_data_val
);
808 sort_quick_norecurse(temp_data
, 0, length
);
809 result
+= test_sort_data(temp_data
, 0, length
);
813 test_msg_end(result
);
822 test_msg_start("Test Hash - Prime Number Generator");
823 if(is_prime(0)) result
++;
824 if(is_prime(1)) result
++;
825 if(!is_prime(2)) result
++;
826 if(!is_prime(3571)) result
++;
827 if(is_prime(3570)) result
++;
828 test_msg_end(result
);
830 test_msg_start("Test Hash - Twin Prime Number Generator");
831 if(next_twinprime(6) != 7) result
++;
832 if(next_twinprime(72) != 73) result
++;
833 if(next_twinprime(1000) != 1021) result
++;
834 if(next_twinprime(79154) != 79231) result
++;
835 if(next_twinprime(INT_MAX
) != -1) result
++;
836 test_msg_end(result
);
838 test_msg_start("Test Hash - Create New Hash");
839 h
= hash_new_prime(100);
840 if(hash_empty(h
) != 0) result
++;
841 if(h
.size
!= 103) result
++;
842 if(h
.data
== NULL
) result
++;
843 test_msg_end(result
);
845 test_msg_start("Test Hash - Insert and Verify Data");
846 hash_insert(h
, "hello", 6);
847 if(hash_search(h
, "hello", 6) == NULL
) result
++;
848 if(hash_search(h
, "goodbye", 7) != NULL
) result
++;
849 if(hash_search(h
, "", 0) != NULL
) result
++;
850 test_msg_end(result
);
852 test_msg_start("Test Hash - Fill Hash and Clear Data");
854 /* if(hash_full(h) != 0) result++; */
855 test_msg_end(result
);
857 test_msg_start("Test Hash - Fill Hash and Remove Specific Data");
858 test_msg_end(result
);
860 test_msg_start("Test Hash - Insert and Verify Data");
861 test_msg_end(result
);
869 result
+= test_random();
870 result
+= test_linked_list();
871 result
+= test_vstack();
872 result
+= test_vqueue();
873 result
+= test_sort();
874 /* result += test_hash(); HASH IS NOT COMPLETE */
880 printf("\nRUNNING ALL UNIT TESTS ON DATA STRUCTURES.\n\n");
883 printf("\nUNIT TEST COMPLETE - ALL TESTS RETURNED PASSED.\n\n");
885 exit_error("UNIT TEST FAILED.\n\n");