diff options
| author | manuel <manuel@mausz.at> | 2012-03-27 11:51:08 +0200 |
|---|---|---|
| committer | manuel <manuel@mausz.at> | 2012-03-27 11:51:08 +0200 |
| commit | 4f670845ff9ab6c48bcb5f7bf4d4ef6dc3c3064b (patch) | |
| tree | 868c52e06f207b5ec8a3cc141f4b8b2bdfcc165c /tests/internal/stdlib.c | |
| parent | eae0bd57f0a26314a94785061888d193d186944a (diff) | |
| download | progos-4f670845ff9ab6c48bcb5f7bf4d4ef6dc3c3064b.tar.gz progos-4f670845ff9ab6c48bcb5f7bf4d4ef6dc3c3064b.tar.bz2 progos-4f670845ff9ab6c48bcb5f7bf4d4ef6dc3c3064b.zip | |
reorganize file structure to match the upstream requirements
Diffstat (limited to 'tests/internal/stdlib.c')
| -rw-r--r-- | tests/internal/stdlib.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/tests/internal/stdlib.c b/tests/internal/stdlib.c new file mode 100644 index 0000000..ad0f0f9 --- /dev/null +++ b/tests/internal/stdlib.c | |||
| @@ -0,0 +1,114 @@ | |||
| 1 | /* Test program for sorting and searching in lib/stdlib.c. | ||
| 2 | |||
| 3 | Attempts to test the sorting and searching functionality that | ||
| 4 | is not sufficiently tested elsewhere in Pintos. | ||
| 5 | |||
| 6 | This is not a test we will run on your submitted projects. | ||
| 7 | It is here for completeness. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #undef NDEBUG | ||
| 11 | #include <debug.h> | ||
| 12 | #include <limits.h> | ||
| 13 | #include <random.h> | ||
| 14 | #include <stdlib.h> | ||
| 15 | #include <stdio.h> | ||
| 16 | #include "threads/test.h" | ||
| 17 | |||
| 18 | /* Maximum number of elements in an array that we will test. */ | ||
| 19 | #define MAX_CNT 4096 | ||
| 20 | |||
| 21 | static void shuffle (int[], size_t); | ||
| 22 | static int compare_ints (const void *, const void *); | ||
| 23 | static void verify_order (const int[], size_t); | ||
| 24 | static void verify_bsearch (const int[], size_t); | ||
| 25 | |||
| 26 | /* Test sorting and searching implementations. */ | ||
| 27 | void | ||
| 28 | test (void) | ||
| 29 | { | ||
| 30 | int cnt; | ||
| 31 | |||
| 32 | printf ("testing various size arrays:"); | ||
| 33 | for (cnt = 0; cnt < MAX_CNT; cnt = cnt * 4 / 3 + 1) | ||
| 34 | { | ||
| 35 | int repeat; | ||
| 36 | |||
| 37 | printf (" %zu", cnt); | ||
| 38 | for (repeat = 0; repeat < 10; repeat++) | ||
| 39 | { | ||
| 40 | static int values[MAX_CNT]; | ||
| 41 | int i; | ||
| 42 | |||
| 43 | /* Put values 0...CNT in random order in VALUES. */ | ||
| 44 | for (i = 0; i < cnt; i++) | ||
| 45 | values[i] = i; | ||
| 46 | shuffle (values, cnt); | ||
| 47 | |||
| 48 | /* Sort VALUES, then verify ordering. */ | ||
| 49 | qsort (values, cnt, sizeof *values, compare_ints); | ||
| 50 | verify_order (values, cnt); | ||
| 51 | verify_bsearch (values, cnt); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | printf (" done\n"); | ||
| 56 | printf ("stdlib: PASS\n"); | ||
| 57 | } | ||
| 58 | |||
| 59 | /* Shuffles the CNT elements in ARRAY into random order. */ | ||
| 60 | static void | ||
| 61 | shuffle (int *array, size_t cnt) | ||
| 62 | { | ||
| 63 | size_t i; | ||
| 64 | |||
| 65 | for (i = 0; i < cnt; i++) | ||
| 66 | { | ||
| 67 | size_t j = i + random_ulong () % (cnt - i); | ||
| 68 | int t = array[j]; | ||
| 69 | array[j] = array[i]; | ||
| 70 | array[i] = t; | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | /* Returns 1 if *A is greater than *B, | ||
| 75 | 0 if *A equals *B, | ||
| 76 | -1 if *A is less than *B. */ | ||
| 77 | static int | ||
| 78 | compare_ints (const void *a_, const void *b_) | ||
| 79 | { | ||
| 80 | const int *a = a_; | ||
| 81 | const int *b = b_; | ||
| 82 | |||
| 83 | return *a < *b ? -1 : *a > *b; | ||
| 84 | } | ||
| 85 | |||
| 86 | /* Verifies that ARRAY contains the CNT ints 0...CNT-1. */ | ||
| 87 | static void | ||
| 88 | verify_order (const int *array, size_t cnt) | ||
| 89 | { | ||
| 90 | int i; | ||
| 91 | |||
| 92 | for (i = 0; (size_t) i < cnt; i++) | ||
| 93 | ASSERT (array[i] == i); | ||
| 94 | } | ||
| 95 | |||
| 96 | /* Checks that bsearch() works properly in ARRAY. ARRAY must | ||
| 97 | contain the values 0...CNT-1. */ | ||
| 98 | static void | ||
| 99 | verify_bsearch (const int *array, size_t cnt) | ||
| 100 | { | ||
| 101 | int not_in_array[] = {0, -1, INT_MAX, MAX_CNT, MAX_CNT + 1, MAX_CNT * 2}; | ||
| 102 | int i; | ||
| 103 | |||
| 104 | /* Check that all the values in the array are found properly. */ | ||
| 105 | for (i = 0; (size_t) i < cnt; i++) | ||
| 106 | ASSERT (bsearch (&i, array, cnt, sizeof *array, compare_ints) | ||
| 107 | == array + i); | ||
| 108 | |||
| 109 | /* Check that some values not in the array are not found. */ | ||
| 110 | not_in_array[0] = cnt; | ||
| 111 | for (i = 0; (size_t) i < sizeof not_in_array / sizeof *not_in_array; i++) | ||
| 112 | ASSERT (bsearch (¬_in_array[i], array, cnt, sizeof *array, compare_ints) | ||
| 113 | == NULL); | ||
| 114 | } | ||
