summaryrefslogtreecommitdiff
path: root/innobase/ut/ts/tsut.c
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/ut/ts/tsut.c')
-rw-r--r--innobase/ut/ts/tsut.c347
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");
+}