diff options
Diffstat (limited to 'innobase/ut/ts/tsut.c')
-rw-r--r-- | innobase/ut/ts/tsut.c | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/innobase/ut/ts/tsut.c b/innobase/ut/ts/tsut.c new file mode 100644 index 00000000000..81c9ff79f96 --- /dev/null +++ b/innobase/ut/ts/tsut.c @@ -0,0 +1,347 @@ +/************************************************************************ +The test module for the utilities + +(c) 1995 Innobase Oy + +Created 10/28/1995 Heikki Tuuri +*************************************************************************/ + +#include "../ut0lst.h" +#include "../ut0mem.h" +#include "../ut0byte.h" +#include "../ut0sort.h" +#include "../ut0rnd.h" + +typedef struct node_struct node_t; +struct node_struct { + ulint index; + ulint zyx; + UT_LIST_NODE_T(node_t) list1; + ulint yzx; + UT_LIST_NODE_T(node_t) list2; +}; + +/* Arrays to be sorted */ +ulint uarr[100000]; +ulint aux_uarr[100000]; +dulint duarr[100000]; +dulint aux_duarr[100000]; + +/********************************************************************* +Tests for two-way lists. */ + +void +test1(void) +/*=======*/ +{ + ulint i; + UT_LIST_BASE_NODE_T(node_t) base1; + UT_LIST_BASE_NODE_T(node_t) base2; + node_t* node; + node_t* node2; + + printf("-------------------------------------------\n"); + printf("TEST 1. Test of two-way lists \n"); + + UT_LIST_INIT(base1); + UT_LIST_INIT(base2); + + for (i = 0; i < 1000; i++) { + node = ut_malloc(sizeof(node_t)); + + node->index = 999 - i; + + UT_LIST_ADD_FIRST(list1, base1, node); + UT_LIST_ADD_LAST(list2, base2, node); + } + + UT_LIST_VALIDATE(list1, node_t, base1); + UT_LIST_VALIDATE(list2, node_t, base2); + + node = UT_LIST_GET_FIRST(base1); + + for (i = 0; i < 1000; i++) { + + ut_a(node); + ut_a(node->index == i); + + node = UT_LIST_GET_NEXT(list1, node); + } + + ut_a(node == NULL); + + node = UT_LIST_GET_FIRST(base2); + + for (i = 0; i < 1000; i++) { + + ut_a(node); + ut_a(node->index == 999 - i); + + node = UT_LIST_GET_NEXT(list2, node); + } + + ut_a(node == NULL); + + UT_LIST_VALIDATE(list1, node_t, base1); + UT_LIST_VALIDATE(list2, node_t, base2); + + node = UT_LIST_GET_FIRST(base1); + + for (i = 0; i < 500; i++) { + + ut_a(node); + ut_a(node->index == i); + + node = UT_LIST_GET_NEXT(list1, node); + } + + for (i = 0; i < 100; i++) { + node2 = ut_malloc(sizeof(node_t)); + + node2->index = 99 - i; + + UT_LIST_INSERT_AFTER(list1, base1, node, node2); + UT_LIST_VALIDATE(list1, node_t, base1); + } + + node2 = ut_malloc(sizeof(node_t)); + node2->index = 1000; + UT_LIST_INSERT_AFTER(list1, base1, UT_LIST_GET_LAST(base1), node2); + + node2 = node; + + for (i = 0; i < 100; i++) { + node2 = UT_LIST_GET_NEXT(list1, node2); + + ut_a(node2); + ut_a(node2->index == i); + } + + UT_LIST_VALIDATE(list1, node_t, base1); + + for (i = 0; i < 600; i++) { + + node2 = UT_LIST_GET_NEXT(list1, node); + + UT_LIST_REMOVE(list1, base1, node2); + UT_LIST_VALIDATE(list1, node_t, base1); + } + + node2 = UT_LIST_GET_NEXT(list1, node); + + UT_LIST_VALIDATE(list1, node_t, base1); + UT_LIST_VALIDATE(list2, node_t, base2); + + ut_a(UT_LIST_GET_LEN(base1) == 501); + + ut_a(UT_LIST_GET_LAST(base1) == node); + + for (i = 0; i < 500; i++) { + + node = UT_LIST_GET_PREV(list1, node); + } + + ut_a(UT_LIST_GET_FIRST(base1) == node); + + for (i = 0; i < 501; i++) { + + node2 = UT_LIST_GET_FIRST(base1); + + UT_LIST_REMOVE(list1, base1, node2); + } + + UT_LIST_VALIDATE(list1, node_t, base1); + UT_LIST_VALIDATE(list2, node_t, base2); + + ut_a(UT_LIST_GET_LEN(base1) == 0); + ut_a(UT_LIST_GET_LEN(base2) == 1000); +} + +/********************************************************************* +Tests for dulints. */ + +void +test2(void) +/*=======*/ +{ + dulint a, b; + + printf("-------------------------------------------\n"); + printf("TEST 2. Test of dulints \n"); + + a = ut_dulint_create(0xFFFFFFFF, 0xFFFFFFFF); + + b = a; + + ut_a(ut_dulint_cmp(a, b) == 0); + + ut_a(ut_dulint_get_low(b) == 0xFFFFFFFF); + ut_a(ut_dulint_get_high(b) == 0xFFFFFFFF); + + a = ut_dulint_create(0xFFFFFFFE, 0xFFFFFFFF); + ut_a(ut_dulint_cmp(a, b) == -1); + ut_a(ut_dulint_cmp(b, a) == 1); + + a = ut_dulint_create(0xFFFFFFFF, 0xFFFFFFFE); + ut_a(ut_dulint_cmp(a, b) == -1); + ut_a(ut_dulint_cmp(b, a) == 1); + + a = ut_dulint_create(5, 0xFFFFFFFF); + + a = ut_dulint_add(a, 5); + + ut_a(ut_dulint_get_low(a) == 4); + ut_a(ut_dulint_get_high(a) == 6); + + a = ut_dulint_create(5, 0x80000000); + + a = ut_dulint_add(a, 0x80000000); + + ut_a(ut_dulint_get_low(a) == 0); + ut_a(ut_dulint_get_high(a) == 6); + + a = ut_dulint_create(5, 10); + + a = ut_dulint_add(a, 20); + + ut_a(ut_dulint_get_low(a) == 30); + ut_a(ut_dulint_get_high(a) == 5); +} + +/*************************************************************** +Comparison function for ulints. */ +UNIV_INLINE +int +cmp_ulint(ulint a, ulint b) +/*=======================*/ +{ + if (a < b) { + return(-1); + } else if (b < a) { + return(1); + } else { + return(0); + } +} + +/**************************************************************** +Sort function for ulint arrays. */ +void +sort_ulint(ulint* arr, ulint* aux_arr, ulint low, ulint high) +/*=========================================================*/ +{ + ut_ad(high <= 100000); + + UT_SORT_FUNCTION_BODY(sort_ulint, arr, aux_arr, low, high, + cmp_ulint); +} + +/**************************************************************** +Sort function for dulint arrays. */ +void +sort_dulint(dulint* arr, dulint* aux_arr, ulint low, ulint high) +/*=========================================================*/ +{ + ut_ad(high <= 100000); + + UT_SORT_FUNCTION_BODY(sort_dulint, arr, aux_arr, low, high, + ut_dulint_cmp); +} + +/********************************************************************* +Tests for sorting. */ + +void +test3(void) +/*=======*/ +{ + ulint i, j; + ulint tm, oldtm; + + printf("-------------------------------------------\n"); + printf("TEST 3. Test of sorting \n"); + + for (i = 0; i < 100000; i++) { + uarr[i] = ut_rnd_gen_ulint(); + } + + oldtm = ut_clock(); + + for (j = 0; j < 1; j++) { + i = 100000; + + sort_ulint(uarr, aux_uarr, 0, i); + } + + tm = ut_clock(); + + printf("Wall clock time for sort of %lu ulints %lu millisecs\n", + j * i, tm - oldtm); + + for (i = 1; i < 100000; i++) { + ut_a(uarr[i - 1] < uarr[i]); + } + + for (i = 0; i < 100000; i++) { + uarr[i] = 99999 - i; + } + + sort_ulint(uarr, aux_uarr, 0, 100000); + + for (i = 1; i < 100000; i++) { + ut_a(uarr[i] == i); + } + + sort_ulint(uarr, aux_uarr, 0, 100000); + + for (i = 1; i < 100000; i++) { + ut_a(uarr[i] == i); + } + + sort_ulint(uarr, aux_uarr, 5, 6); + + for (i = 1; i < 100000; i++) { + ut_a(uarr[i] == i); + } + + for (i = 0; i < 100000; i++) { + uarr[i] = 5; + } + + sort_ulint(uarr, aux_uarr, 0, 100000); + + for (i = 1; i < 100000; i++) { + ut_a(uarr[i] == 5); + } + + for (i = 0; i < 100000; i++) { + duarr[i] = ut_dulint_create(ut_rnd_gen_ulint() & 0xFFFFFFFF, + ut_rnd_gen_ulint() & 0xFFFFFFFF); + } + + oldtm = ut_clock(); + + i = 100000; + + sort_dulint(duarr, aux_duarr, 0, i); + + tm = ut_clock(); + + printf("Wall clock time for sort of %lu dulints %lu millisecs\n", + j * i, tm - oldtm); + + for (i = 1; i < 100000; i++) { + ut_a(ut_dulint_cmp(duarr[i - 1], duarr[i]) < 0); + } + +} + +void +main(void) +{ + test1(); + test2(); + test3(); + + printf("TEST SUCCESSFULLY COMPLETED!\n"); +} |