Skip to content

Commit acd5e4e

Browse files
Added tests for sorting algorithms.
Tests for selection, insertion, and quick sort. For a more through test, adjust SORT_TESTS.
1 parent a628b44 commit acd5e4e

File tree

2 files changed

+168
-1
lines changed

2 files changed

+168
-1
lines changed

lib_test.c

+168
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
#include <assert.h>
2+
#include <limits.h>
13
#include <stdbool.h>
24
#include <stdio.h>
35
#include <stdlib.h>
46
#include <string.h>
7+
#include <time.h>
58

69
#include "lib_test.h"
710
#include "lib_ll.h"
@@ -13,6 +16,8 @@
1316
#define PASSED 0
1417
#define FAILED 1
1518

19+
#define SORT_TESTS 1000
20+
1621
void exit_error(const char *err_msg)
1722
{
1823
fprintf(stderr, "ERROR: %s\n", err_msg);
@@ -393,6 +398,168 @@ int test_vqueue()
393398
return result;
394399
}
395400

401+
/* test outcome of sort algorithm - all data should be sorted */
402+
int test_sort_data(int data[], int lo, int hi)
403+
{
404+
int i = lo, result = 0;
405+
while(i < hi)
406+
{
407+
if(!(data[i] <= data[i+1])) result++;
408+
i++;
409+
}
410+
return result;
411+
}
412+
413+
/* test specific position of data */
414+
int test_sort_data_loc(int data[])
415+
{
416+
int i = 0, result = 0;
417+
while(i < 10) {
418+
if(data[i] != i) result++;
419+
i++;
420+
}
421+
return result;
422+
}
423+
424+
/* generate random number from min to max */
425+
int random_int(int min, int max)
426+
{
427+
assert(min > INT_MIN);
428+
assert(max < INT_MAX/2);
429+
assert(max >= min);
430+
return rand() % max + min;
431+
}
432+
433+
/* use clock in system to create random seed for number generator */
434+
void seed_rand()
435+
{
436+
srand(time(0));
437+
}
438+
439+
/* set pre-selected data in array */
440+
void sort_set_array(int data[])
441+
{
442+
assert(data != NULL);
443+
data[0] = 4;
444+
data[1] = 5;
445+
data[2] = 7;
446+
data[3] = 9;
447+
data[4] = 8;
448+
data[5] = 1;
449+
data[6] = 6;
450+
data[7] = 0;
451+
data[8] = 3;
452+
data[9] = 2;
453+
}
454+
455+
/* fill random length array with random data */
456+
void sort_rnd_data_fill(int *data, int length, int min, int max)
457+
{
458+
int i = 0;
459+
seed_rand();
460+
while(i < length) {
461+
data[i]= random_int(min, max);
462+
i++;
463+
}
464+
}
465+
466+
int test_sort()
467+
{
468+
int i, result = 0, length, min_data_val, max_data_val;
469+
int *temp_data;
470+
int data[10];
471+
472+
test_msg_start("Test Selection Sort - Preset Array");
473+
sort_set_array(data);
474+
sort_selection(data, 0, 9);
475+
result += test_sort_data(data, 0, 9);
476+
result += test_sort_data_loc(data);
477+
test_msg_end(result);
478+
479+
test_msg_start("Test Selection Sort - Random Data");
480+
for(i = 0; i < SORT_TESTS; i++) {
481+
seed_rand();
482+
min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
483+
max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
484+
length = random_int(1, 1000); /* get length of a new array */
485+
temp_data = malloc(sizeof(int) * length);
486+
sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
487+
sort_selection(temp_data, 0, length);
488+
result += test_sort_data(temp_data, 0, length);
489+
free(temp_data);
490+
temp_data = NULL;
491+
}
492+
test_msg_end(result);
493+
494+
test_msg_start("Test Insertion Sort - Preset Array");
495+
sort_set_array(data);
496+
sort_insertion(data, 0, 9);
497+
result += test_sort_data(data, 0, 9);
498+
result += test_sort_data_loc(data);
499+
test_msg_end(result);
500+
501+
test_msg_start("Test Insertion Sort - Random Data");
502+
for(i = 0; i < SORT_TESTS; i++) {
503+
seed_rand();
504+
min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
505+
max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
506+
length = random_int(1, 1000); /* get length of a new array */
507+
temp_data = malloc(sizeof(int) * length);
508+
sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
509+
sort_insertion(temp_data, 0, length);
510+
result += test_sort_data(temp_data, 0, length);
511+
free(temp_data);
512+
temp_data = NULL;
513+
}
514+
test_msg_end(result);
515+
516+
test_msg_start("Test Quick Sort (Recursive) - Preset Array");
517+
sort_set_array(data);
518+
sort_quick(data, 0, 9);
519+
result += test_sort_data(data, 0, 9);
520+
result += test_sort_data_loc(data);
521+
test_msg_end(result);
522+
523+
test_msg_start("Test Quick Sort (Recursive) - Random Data");
524+
for(i = 0; i < SORT_TESTS; i++) {
525+
seed_rand();
526+
min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
527+
max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
528+
length = random_int(1, 1000); /* get length of a new array */
529+
temp_data = malloc(sizeof(int) * length);
530+
sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
531+
sort_quick(temp_data, 0, length);
532+
result += test_sort_data(temp_data, 0, length);
533+
free(temp_data);
534+
temp_data = NULL;
535+
}
536+
test_msg_end(result);
537+
538+
test_msg_start("Test Quick Sort - Preset Array");
539+
sort_set_array(data);
540+
sort_quick_norecurse(data, 0, 9);
541+
result += test_sort_data(data, 0, 9);
542+
result += test_sort_data_loc(data);
543+
test_msg_end(result);
544+
545+
test_msg_start("Test Quick Sort - Random Data");
546+
for(i = 0; i < SORT_TESTS; i++) {
547+
seed_rand();
548+
min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
549+
max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
550+
length = random_int(1, 1000); /* get length of a new array */
551+
temp_data = malloc(sizeof(int) * length);
552+
sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
553+
sort_quick_norecurse(temp_data, 0, length);
554+
result += test_sort_data(temp_data, 0, length);
555+
free(temp_data);
556+
temp_data = NULL;
557+
}
558+
test_msg_end(result);
559+
560+
return result;
561+
}
562+
396563
int test_stack_array()
397564
{
398565
int result = 0;
@@ -407,6 +574,7 @@ int test_all()
407574
result += test_stack_array();
408575
result += test_vstack();
409576
result += test_vqueue();
577+
result += test_sort();
410578
return result;
411579
}
412580

lib_test.h

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ void test_msg_end(int);
1414

1515
int test_ll_new();
1616

17-
1817
int test_all();
1918

2019
#endif /* LIB_TEST_H_ */

0 commit comments

Comments
 (0)