From a74e26e3deb7f0f4356ac6818251275c271ad5b4 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Mon, 4 Jul 2022 20:38:51 +0200 Subject: [PATCH] Add random generated insertion in a tree --- tests/test-mtree.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/test-mtree.c b/tests/test-mtree.c index e8461354..4f7693a0 100644 --- a/tests/test-mtree.c +++ b/tests/test-mtree.c @@ -99,8 +99,76 @@ static void test_basic(void) tree_clear(t); } +/* Random insertion in a tree. + We let the normal assertions of the tree to check for errors. */ +#define MAX_NODE_INSERT 10000 +static tree_it_t g_tree[MAX_NODE_INSERT]; +static tree_it_t g_root; +static unsigned g_num; + +static void insert(unsigned cmd, unsigned ref) +{ + assert( g_num < MAX_NODE_INSERT); + assert( cmd < 5); + assert( ref <= g_num); + int val = (int) g_num + 1; + switch (cmd) { + case 0: + g_tree[++g_num] = tree_insert_up( g_tree[ref], val); + if (tree_it_equal_p(g_tree[ref], g_root)) { + g_root = g_tree[g_num]; + } + break; + case 1: + g_tree[++g_num] = tree_insert_down( g_tree[ref], val); + break; + case 2: + g_tree[++g_num] = tree_insert_child( g_tree[ref], val); + break; + case 3: + if (tree_it_equal_p(g_tree[ref], g_root)) { + return; + } + g_tree[++g_num] = tree_insert_left( g_tree[ref], val); + break; + default: + if (tree_it_equal_p(g_tree[ref], g_root)) { + return; + } + g_tree[++g_num] = tree_insert_right( g_tree[ref], val); + break; + } +} + + +static inline unsigned int rand_get(void) +{ + static unsigned int randValue = 0; + randValue = randValue * 31421U + 6927U; + return randValue; +} + +static void test_gen(void) +{ + tree_t t; + string_t s; + tree_init(t); + string_init(s); + g_root = g_tree[++ g_num] = tree_set_root(t, 1); + tree_get_str(s, t, false); + for(unsigned i = 0; i < MAX_NODE_INSERT; i++) { + unsigned cmd = rand_get() % 5; + unsigned ref = 1 + (rand_get() % g_num); + insert(cmd, ref); + tree_get_str(s, t, false); + } + string_clear(s); + tree_clear(t); +} + int main(void) { test_basic(); + test_gen(); return 0; }