00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #undef NDEBUG
00011 #include <debug.h>
00012 #include <limits.h>
00013 #include <random.h>
00014 #include <stdlib.h>
00015 #include <stdio.h>
00016 #include "threads/test.h"
00017
00018
00019 #define MAX_CNT 4096
00020
00021 static void shuffle (int[], size_t);
00022 static int compare_ints (const void *, const void *);
00023 static void verify_order (const int[], size_t);
00024 static void verify_bsearch (const int[], size_t);
00025
00026
00027 void
00028 test (void)
00029 {
00030 int cnt;
00031
00032 printf ("testing various size arrays:");
00033 for (cnt = 0; cnt < MAX_CNT; cnt = cnt * 4 / 3 + 1)
00034 {
00035 int repeat;
00036
00037 printf (" %zu", cnt);
00038 for (repeat = 0; repeat < 10; repeat++)
00039 {
00040 static int values[MAX_CNT];
00041 int i;
00042
00043
00044 for (i = 0; i < cnt; i++)
00045 values[i] = i;
00046 shuffle (values, cnt);
00047
00048
00049 qsort (values, cnt, sizeof *values, compare_ints);
00050 verify_order (values, cnt);
00051 verify_bsearch (values, cnt);
00052 }
00053 }
00054
00055 printf (" done\n");
00056 printf ("stdlib: PASS\n");
00057 }
00058
00059
00060 static void
00061 shuffle (int *array, size_t cnt)
00062 {
00063 size_t i;
00064
00065 for (i = 0; i < cnt; i++)
00066 {
00067 size_t j = i + random_ulong () % (cnt - i);
00068 int t = array[j];
00069 array[j] = array[i];
00070 array[i] = t;
00071 }
00072 }
00073
00074
00075
00076
00077 static int
00078 compare_ints (const void *a_, const void *b_)
00079 {
00080 const int *a = a_;
00081 const int *b = b_;
00082
00083 return *a < *b ? -1 : *a > *b;
00084 }
00085
00086
00087 static void
00088 verify_order (const int *array, size_t cnt)
00089 {
00090 int i;
00091
00092 for (i = 0; (size_t) i < cnt; i++)
00093 ASSERT (array[i] == i);
00094 }
00095
00096
00097
00098 static void
00099 verify_bsearch (const int *array, size_t cnt)
00100 {
00101 int not_in_array[] = {0, -1, INT_MAX, MAX_CNT, MAX_CNT + 1, MAX_CNT * 2};
00102 int i;
00103
00104
00105 for (i = 0; (size_t) i < cnt; i++)
00106 ASSERT (bsearch (&i, array, cnt, sizeof *array, compare_ints)
00107 == array + i);
00108
00109
00110 not_in_array[0] = cnt;
00111 for (i = 0; (size_t) i < sizeof not_in_array / sizeof *not_in_array; i++)
00112 ASSERT (bsearch (¬_in_array[i], array, cnt, sizeof *array, compare_ints)
00113 == NULL);
00114 }