Skip to content

Commit 89e9994

Browse files
binary-search-tree : add test template (#2157)
Co-authored-by: Corey McCandless <[email protected]>
1 parent 82528d0 commit 89e9994

File tree

3 files changed

+94
-40
lines changed

3 files changed

+94
-40
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{%- import "generator_macros.j2" as macros with context -%}
2+
3+
{%- macro build_tree(tree_obj) -%}
4+
{%- if tree_obj is none -%}
5+
None
6+
{%- else -%}
7+
TreeNode("{{ tree_obj["data"] }}",
8+
{{- build_tree(tree_obj["left"]) -}},
9+
{{- build_tree(tree_obj["right"]) -}})
10+
{%- endif -%}
11+
{%- endmacro -%}
12+
13+
{%- macro test_case(case) %}
14+
def test_{{ case["description"] | to_snake }}(self):
15+
{%- set prop = case["property"] -%}
16+
{%- set tree_data = case["input"]["treeData"] -%}
17+
{%- set expected = case["expected"] -%}
18+
{%- if expected is mapping %}
19+
{%- set assertion = "assertTreeEqual" %}
20+
expected = {{ build_tree(expected) }}
21+
{%- else %}
22+
{%- set assertion = "assertEqual" %}
23+
expected = {{ expected }}
24+
{%- endif %}
25+
self.{{ assertion }}(BinarySearchTree({{ tree_data }}).{{ prop | to_snake }}(),expected)
26+
{%- endmacro -%}
27+
28+
{{ macros.header (imports=["BinarySearchTree", "TreeNode"]) }}
29+
30+
class {{ exercise | camel_case }}Test(unittest.TestCase):
31+
{%- for case in cases %}
32+
{%- if "cases" in case %}
33+
{%- for subcase in case["cases"] %}
34+
{{ test_case(subcase) }}
35+
{%- endfor %}
36+
{%- else -%}
37+
{{ test_case(case) }}
38+
{%- endif %}
39+
{%- endfor %}
40+
41+
# Utilities
42+
def assertTreeEqual(self, tree_one, tree_two):
43+
try:
44+
self.compare_tree(tree_one, tree_two)
45+
except AssertionError:
46+
raise AssertionError("{} != {}".format(tree_one, tree_two))
47+
48+
def compare_tree(self, tree_one, tree_two):
49+
self.assertEqual(tree_one.data, tree_two.data)
50+
51+
# Compare left tree nodes
52+
if tree_one.left and tree_two.left:
53+
self.compare_tree(tree_one.left, tree_two.left)
54+
elif tree_one.left is None and tree_two.left is None:
55+
pass
56+
else:
57+
raise AssertionError
58+
59+
# Compare right tree nodes
60+
if tree_one.right and tree_two.right:
61+
self.compare_tree(tree_one.right, tree_two.right)
62+
elif tree_one.right is None and tree_two.right is None:
63+
pass
64+
else:
65+
raise AssertionError
66+
67+
68+
{{ macros.footer() }}

exercises/binary-search-tree/binary_search_tree.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class TreeNode:
2-
def __init__(self, data, left, right):
2+
def __init__(self, data, left=None, right=None):
33
self.data = None
44
self.left = None
55
self.right = None

exercises/binary-search-tree/binary_search_tree_test.py

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,70 +2,56 @@
22

33
from binary_search_tree import BinarySearchTree, TreeNode
44

5-
65
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
76

8-
class BinarySearchTreeTest(unittest.TestCase):
97

8+
class BinarySearchTreeTest(unittest.TestCase):
109
def test_data_is_retained(self):
11-
expected = TreeNode('4', None, None)
12-
self.assertTreeEqual(BinarySearchTree(['4']).data(), expected)
10+
expected = TreeNode("4", None, None)
11+
self.assertTreeEqual(BinarySearchTree(["4"]).data(), expected)
1312

14-
# Test inserting data at proper node
15-
def test_smaller_data_at_left_node(self):
16-
expected = TreeNode('4', TreeNode('2', None, None), None)
17-
self.assertTreeEqual(BinarySearchTree(['4', '2']).data(), expected)
13+
def test_smaller_number_at_left_node(self):
14+
expected = TreeNode("4", TreeNode("2", None, None), None)
15+
self.assertTreeEqual(BinarySearchTree(["4", "2"]).data(), expected)
1816

1917
def test_same_number_at_left_node(self):
20-
expected = TreeNode('4', TreeNode('4', None, None), None)
21-
self.assertTreeEqual(BinarySearchTree(['4', '4']).data(), expected)
18+
expected = TreeNode("4", TreeNode("4", None, None), None)
19+
self.assertTreeEqual(BinarySearchTree(["4", "4"]).data(), expected)
2220

2321
def test_greater_number_at_right_node(self):
24-
expected = TreeNode('4', None, TreeNode('5', None, None))
25-
self.assertTreeEqual(BinarySearchTree(['4', '5']).data(), expected)
22+
expected = TreeNode("4", None, TreeNode("5", None, None))
23+
self.assertTreeEqual(BinarySearchTree(["4", "5"]).data(), expected)
2624

2725
def test_can_create_complex_tree(self):
2826
expected = TreeNode(
29-
'4',
30-
TreeNode(
31-
'2',
32-
TreeNode('1', None, None),
33-
TreeNode('3', None, None)
34-
),
35-
TreeNode(
36-
'6',
37-
TreeNode('5', None, None),
38-
TreeNode('7', None, None)
39-
)
27+
"4",
28+
TreeNode("2", TreeNode("1", None, None), TreeNode("3", None, None)),
29+
TreeNode("6", TreeNode("5", None, None), TreeNode("7", None, None)),
4030
)
4131
self.assertTreeEqual(
42-
BinarySearchTree(['4', '2', '6', '1', '3', '5', '7']).data(),
43-
expected
32+
BinarySearchTree(["4", "2", "6", "1", "3", "5", "7"]).data(), expected
4433
)
4534

46-
# Test can sort data
4735
def test_can_sort_single_number(self):
48-
self.assertEqual(BinarySearchTree(['2']).sorted_data(), ['2'])
36+
expected = ["2"]
37+
self.assertEqual(BinarySearchTree(["2"]).sorted_data(), expected)
4938

5039
def test_can_sort_if_second_number_is_smaller_than_first(self):
51-
self.assertEqual(
52-
BinarySearchTree(['2', '1']).sorted_data(), ['1', '2']
53-
)
40+
expected = ["1", "2"]
41+
self.assertEqual(BinarySearchTree(["2", "1"]).sorted_data(), expected)
5442

5543
def test_can_sort_if_second_number_is_same_as_first(self):
56-
self.assertEqual(
57-
BinarySearchTree(['2', '2']).sorted_data(), ['2', '2']
58-
)
44+
expected = ["2", "2"]
45+
self.assertEqual(BinarySearchTree(["2", "2"]).sorted_data(), expected)
5946

6047
def test_can_sort_if_second_number_is_greater_than_first(self):
61-
self.assertEqual(
62-
BinarySearchTree(['2', '3']).sorted_data(), ['2', '3']
63-
)
48+
expected = ["2", "3"]
49+
self.assertEqual(BinarySearchTree(["2", "3"]).sorted_data(), expected)
6450

6551
def test_can_sort_complex_tree(self):
52+
expected = ["1", "2", "3", "5", "6", "7"]
6653
self.assertEqual(
67-
BinarySearchTree(['2', '1', '3', '6', '7', '5']).sorted_data(),
68-
['1', '2', '3', '5', '6', '7']
54+
BinarySearchTree(["2", "1", "3", "6", "7", "5"]).sorted_data(), expected
6955
)
7056

7157
# Utilities
@@ -95,5 +81,5 @@ def compare_tree(self, tree_one, tree_two):
9581
raise AssertionError
9682

9783

98-
if __name__ == '__main__':
84+
if __name__ == "__main__":
9985
unittest.main()

0 commit comments

Comments
 (0)