2023-07-15 15:27:31 -07:00
|
|
|
# These tests are auto-generated with test data from:
|
|
|
|
|
# https://github.com/exercism/problem-specifications/tree/main/exercises/binary-search-tree/canonical-data.json
|
2023-07-21 16:54:40 -07:00
|
|
|
# File last updated on 2023-07-20
|
2023-07-15 15:27:31 -07:00
|
|
|
|
2017-11-13 19:09:54 -02:00
|
|
|
import unittest
|
|
|
|
|
|
2021-01-31 16:49:12 -05:00
|
|
|
from binary_search_tree import (
|
|
|
|
|
BinarySearchTree,
|
|
|
|
|
TreeNode,
|
|
|
|
|
)
|
2017-11-13 19:09:54 -02:00
|
|
|
|
|
|
|
|
|
2020-01-14 17:45:31 +02:00
|
|
|
class BinarySearchTreeTest(unittest.TestCase):
|
2018-02-20 05:19:49 +08:00
|
|
|
def test_data_is_retained(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = TreeNode("4", None, None)
|
|
|
|
|
self.assertTreeEqual(BinarySearchTree(["4"]).data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
2020-01-14 17:45:31 +02:00
|
|
|
def test_smaller_number_at_left_node(self):
|
|
|
|
|
expected = TreeNode("4", TreeNode("2", None, None), None)
|
|
|
|
|
self.assertTreeEqual(BinarySearchTree(["4", "2"]).data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
|
|
|
|
def test_same_number_at_left_node(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = TreeNode("4", TreeNode("4", None, None), None)
|
|
|
|
|
self.assertTreeEqual(BinarySearchTree(["4", "4"]).data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
|
|
|
|
def test_greater_number_at_right_node(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = TreeNode("4", None, TreeNode("5", None, None))
|
|
|
|
|
self.assertTreeEqual(BinarySearchTree(["4", "5"]).data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
|
|
|
|
def test_can_create_complex_tree(self):
|
|
|
|
|
expected = TreeNode(
|
2020-01-14 17:45:31 +02:00
|
|
|
"4",
|
|
|
|
|
TreeNode("2", TreeNode("1", None, None), TreeNode("3", None, None)),
|
|
|
|
|
TreeNode("6", TreeNode("5", None, None), TreeNode("7", None, None)),
|
2018-02-20 05:19:49 +08:00
|
|
|
)
|
|
|
|
|
self.assertTreeEqual(
|
2020-01-14 17:45:31 +02:00
|
|
|
BinarySearchTree(["4", "2", "6", "1", "3", "5", "7"]).data(), expected
|
2018-02-20 05:19:49 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_can_sort_single_number(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = ["2"]
|
|
|
|
|
self.assertEqual(BinarySearchTree(["2"]).sorted_data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
|
|
|
|
def test_can_sort_if_second_number_is_smaller_than_first(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = ["1", "2"]
|
|
|
|
|
self.assertEqual(BinarySearchTree(["2", "1"]).sorted_data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
|
|
|
|
def test_can_sort_if_second_number_is_same_as_first(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = ["2", "2"]
|
|
|
|
|
self.assertEqual(BinarySearchTree(["2", "2"]).sorted_data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
|
|
|
|
def test_can_sort_if_second_number_is_greater_than_first(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = ["2", "3"]
|
|
|
|
|
self.assertEqual(BinarySearchTree(["2", "3"]).sorted_data(), expected)
|
2018-02-20 05:19:49 +08:00
|
|
|
|
|
|
|
|
def test_can_sort_complex_tree(self):
|
2020-01-14 17:45:31 +02:00
|
|
|
expected = ["1", "2", "3", "5", "6", "7"]
|
2018-02-20 05:19:49 +08:00
|
|
|
self.assertEqual(
|
2020-01-14 17:45:31 +02:00
|
|
|
BinarySearchTree(["2", "1", "3", "6", "7", "5"]).sorted_data(), expected
|
2018-02-20 05:19:49 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Utilities
|
|
|
|
|
def assertTreeEqual(self, tree_one, tree_two):
|
|
|
|
|
try:
|
|
|
|
|
self.compare_tree(tree_one, tree_two)
|
|
|
|
|
except AssertionError:
|
|
|
|
|
raise AssertionError("{} != {}".format(tree_one, tree_two))
|
|
|
|
|
|
|
|
|
|
def compare_tree(self, tree_one, tree_two):
|
|
|
|
|
self.assertEqual(tree_one.data, tree_two.data)
|
|
|
|
|
|
|
|
|
|
# Compare left tree nodes
|
|
|
|
|
if tree_one.left and tree_two.left:
|
|
|
|
|
self.compare_tree(tree_one.left, tree_two.left)
|
|
|
|
|
elif tree_one.left is None and tree_two.left is None:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
raise AssertionError
|
|
|
|
|
|
|
|
|
|
# Compare right tree nodes
|
|
|
|
|
if tree_one.right and tree_two.right:
|
|
|
|
|
self.compare_tree(tree_one.right, tree_two.right)
|
|
|
|
|
elif tree_one.right is None and tree_two.right is None:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
raise AssertionError
|