From ee2f9094a377d877fc1cf44d93bb0a2c2a0bae64 Mon Sep 17 00:00:00 2001
From: Jirka Fink <fink@ktiml.mff.cuni.cz>
Date: Tue, 20 Feb 2024 10:43:20 +0100
Subject: [PATCH] More tests for the tree_successor assignment

---
 01-tree_successor/cpp/tree_successor_test.cpp | 56 +++++++++++++++++--
 .../python/tree_successor_test.py             | 39 ++++++++++++-
 2 files changed, 87 insertions(+), 8 deletions(-)

diff --git a/01-tree_successor/cpp/tree_successor_test.cpp b/01-tree_successor/cpp/tree_successor_test.cpp
index d26af4d..552762a 100644
--- a/01-tree_successor/cpp/tree_successor_test.cpp
+++ b/01-tree_successor/cpp/tree_successor_test.cpp
@@ -24,11 +24,15 @@ void test(const vector<int>& sequence, Tree &tree) {
     EXPECT(!node, "Expected no successor, got " + to_string(node->key));
 }
 
-void test_path(bool right) {
+vector<int> get_linear_sequence() {
     vector<int> numbers;
     for (int i = 0; i < 10000000; i++)
         numbers.push_back((int)(7.13*i));
+    return numbers;
+}
 
+void test_path(bool right) {
+    vector<int> numbers = get_linear_sequence();
     Tree tree;
     Node *node = nullptr;
     if (right)
@@ -41,11 +45,20 @@ void test_path(bool right) {
     test(numbers, tree);
 }
 
-void test_random() {
-    vector<int> sequence = {997};
-    for (int i = 2; i < 199999; i++)
-        sequence.push_back((sequence.back() * int64_t(997)) % 199999);
+void test_two_paths() {
+    vector<int> numbers = get_linear_sequence();
+    Tree tree;
+    Node *node = nullptr;
+    for(size_t i = numbers.size()/2; i < numbers.size(); i++)
+        node = tree.insert(numbers[i], node);
+    node = nullptr;
+    for(int i = numbers.size()/2 - 1; i >= 0; i--)
+        node = tree.insert(numbers[i], node);
+
+    test(numbers, tree);
+}
 
+void test_sequence(vector<int> &&sequence) {
     Tree tree;
     for (const auto& element : sequence)
         tree.insert(element);
@@ -54,8 +67,39 @@ void test_random() {
     test(sequence, tree);
 }
 
+void test_random() {
+    vector<int> sequence = {997};
+    for (int i = 2; i < 199999; i++)
+        sequence.push_back((sequence.back() * int64_t(997)) % 199999);
+    test_sequence(move(sequence));
+}
+
+void test_trivial() {
+    test_sequence({5});
+    test_sequence({7,9});
+    test_sequence({7,3});
+    test_sequence({5,3,7});
+}
+
+void test_comb() {
+    vector<int> numbers = get_linear_sequence();
+    Tree tree;
+    Node *node = nullptr;
+    for(size_t i = numbers.size()/2; i < numbers.size(); i++)
+        node = tree.insert(numbers[i], node);
+    node = nullptr;
+    for(int i = numbers.size()/2 - 1; i >= 0; i-=2) {
+        node = tree.insert(numbers[i-1], node);
+        tree.insert(numbers[i], node);
+    }
+    test(numbers, tree);
+}
+
 vector<pair<string, function<void()>>> tests = {
+    { "trivial", test_trivial },
     { "right_path", []{ test_path(true); } },
     { "left_path", []{ test_path(false); } },
-    {"random_tree", test_random },
+    { "random_tree", test_random },
+    { "two_paths", test_two_paths },
+    { "comb", test_comb }
 };
diff --git a/01-tree_successor/python/tree_successor_test.py b/01-tree_successor/python/tree_successor_test.py
index db3df55..3415b8f 100644
--- a/01-tree_successor/python/tree_successor_test.py
+++ b/01-tree_successor/python/tree_successor_test.py
@@ -11,14 +11,22 @@ def test_tree(tree, sequence):
         node = tree.successor(node)
     assert node is None, "Expected no successor, got {}".format(node.key)
 
-def test_random_tree():
-    sequence = [pow(997, i, 199999) for i in range(1, 199999)]
+def test_sequence(sequence):
     tree = Tree()
     for i in sequence:
         tree.insert(i)
     sequence.sort()
     test_tree(tree, sequence)
 
+def test_trivial_tree():
+    test_sequence([5])
+    test_sequence([7,9])
+    test_sequence([7,3])
+    test_sequence([5,3,7])
+
+def test_random_tree():
+    test_sequence([pow(997, i, 199999) for i in range(1, 199999)])
+
 def test_path(right):
     sequence = [int(7.13*i) for i in range(1000000)]
     tree = Tree()
@@ -28,10 +36,37 @@ def test_path(right):
         node = tree.insert(key, node)
     test_tree(tree, sequence)
 
+def test_two_paths():
+    sequence_left = [int(7.13*i) for i in range(1000000)]
+    sequence_right = [int(7.13*i) for i in range(1000000, 2000000)]
+    tree = Tree()
+    node = None
+    for key in sequence_right:
+        node = tree.insert(key, node)
+    node = None
+    for key in reversed(sequence_left):
+        node = tree.insert(key, node)
+    test_tree(tree, sequence_left + sequence_right)
+
+def test_comb():
+    sequence = [int(7.13*i) for i in range(1000000)]
+    tree = Tree()
+    node = None
+    for i in range(len(sequence)//2, len(sequence)):
+        node = tree.insert(sequence[i], node)
+    node = None
+    for i in range(len(sequence)//2-1, 0, -2):
+        node = tree.insert(sequence[i-1], node)
+        tree.insert(sequence[i], node)
+    test_tree(tree, sequence)
+
 tests = [
+    ("trivial", test_trivial_tree),
     ("random_tree", test_random_tree),
     ("right_path", lambda: test_path(True)),
     ("left_path", lambda: test_path(False)),
+    ("two_paths", test_two_paths),
+    ("comb", test_comb),
 ]
 
 if __name__ == "__main__":
-- 
GitLab