test/pqueue.c
00001 #include <u/libu.h>
00002 #include <float.h>
00003
00004 int test_suite_pqueue_register (u_test_t *t);
00005
00006 static int test_top10 (u_test_case_t *tc);
00007 static int test_heapsort (u_test_case_t *tc);
00008
00009 static int test_top10 (u_test_case_t *tc)
00010 {
00011 enum { EMAX = 10 };
00012 size_t i;
00013 double key, keymax = DBL_MAX;
00014 u_pq_t *pq = NULL;
00015
00016 srand(time(NULL));
00017
00018 u_test_err_if (u_pq_create(EMAX, &pq));
00019
00020
00021 for (i = 0; i < EMAX; i++)
00022 u_test_err_if (u_pq_push(pq, (double) rand(), NULL));
00023
00024
00025 for (i = EMAX; i < 10000000; i++)
00026 {
00027 (void) u_pq_peekmax(pq, &keymax);
00028
00029 if (keymax > (key = (double) rand()))
00030 {
00031 (void) u_pq_delmax(pq, NULL);
00032 u_test_err_if (u_pq_push(pq, key, NULL));
00033 }
00034 }
00035
00036
00037 for (i = 0; !u_pq_empty(pq); i++)
00038 {
00039 (void) u_pq_delmax(pq, &key);
00040 u_test_case_printf(tc, "%zu: %.0lf", EMAX - i, key);
00041 }
00042
00043 u_pq_free(pq);
00044 return U_TEST_SUCCESS;
00045 err:
00046 u_pq_free(pq);
00047 return U_TEST_FAILURE;
00048 }
00049
00050 static int test_heapsort (u_test_case_t *tc)
00051 {
00052 size_t i;
00053 enum { EMAX = 1000000 };
00054 double key, prev_key = -1;
00055 u_pq_t *pq = NULL;
00056
00057 srand(time(NULL));
00058
00059 u_test_err_if (u_pq_create(EMAX, &pq));
00060
00061 for (i = 0; i < EMAX - 1; i++)
00062 u_test_err_if (u_pq_push(pq, (double) rand(), NULL));
00063
00064 while (!u_pq_empty(pq))
00065 {
00066 (void) u_pq_delmax(pq, &key);
00067 u_test_err_if (prev_key != -1 && key > prev_key);
00068 prev_key = key;
00069 }
00070
00071 u_pq_free(pq);
00072
00073 return U_TEST_SUCCESS;
00074 err:
00075 u_pq_free(pq);
00076 return U_TEST_FAILURE;
00077 }
00078
00079 int test_suite_pqueue_register (u_test_t *t)
00080 {
00081 u_test_suite_t *ts = NULL;
00082
00083 con_err_if (u_test_suite_new("Priority Queues", &ts));
00084
00085 con_err_if (u_test_case_register("Top 10 (reverse) in 10 million",
00086 test_top10, ts));
00087 con_err_if (u_test_case_register("Heap sort 1 million random entries",
00088 test_heapsort, ts));
00089
00090 return u_test_suite_add(ts, t);
00091 err:
00092 u_test_suite_free(ts);
00093 return ~0;
00094 }