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     /* fill the pqueue */
00021     for (i = 0; i < EMAX; i++)
00022         u_test_err_if (u_pq_push(pq, (double) rand(), NULL));
00023 
00024     /* del-push cycle */
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     /* print results */
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 }

←Products
© 2005-2012 - KoanLogic S.r.l. - All rights reserved