|
7 | 7 | from pydatastructs.utils.misc_util import Backend
|
8 | 8 | import random
|
9 | 9 |
|
10 |
| -################### C++ Backend Tests below ################### |
11 |
| - |
12 |
| -def test_cpp_BinaryTree(): |
13 |
| - b = BinaryTree(1,100,backend=Backend.CPP) |
14 |
| - assert raises(NotImplementedError, b.insert) |
15 |
| - assert raises(NotImplementedError, b.delete) |
16 |
| - assert raises(NotImplementedError, b.search) |
17 |
| - assert str(b) == "[(None, 1, 100, None)]" |
18 |
| - |
19 |
| -def test_cpp_BST1(): |
20 |
| - b = BinarySearchTree(1,100, backend=Backend.CPP) |
21 |
| - assert str(b) == "[(None, 1, 100, None)]" |
22 |
| - assert b.search(1) == 0 |
23 |
| - assert b.search(1,parent=False) == 0 |
24 |
| - assert b.search(1,parent=True) == (0, None) |
25 |
| - assert b.search(2) is None |
26 |
| - b.insert(1) |
27 |
| - assert str(b) == "[(None, 1, None, None)]" |
28 |
| - b.insert(1,100) |
29 |
| - assert str(b) == "[(None, 1, 100, None)]" |
30 |
| - b.insert(20,200) |
31 |
| - b.insert(30,300) |
32 |
| - b.insert(40,400) |
33 |
| - assert str(b) == "[(None, 1, 100, 1), (None, 20, 200, 2), (None, 30, 300, 3), (None, 40, 400, None)]" |
34 |
| - b.insert(0,9) |
35 |
| - assert str(b) == "[(4, 1, 100, 1), (None, 20, 200, 2), (None, 30, 300, 3), (None, 40, 400, None), (None, 0, 9, None)]" |
36 |
| - |
37 |
| -def test_cpp_BST2(): |
38 |
| - BST = BinarySearchTree |
39 |
| - b = BST(8, 8, backend=Backend.CPP) |
40 |
| - |
41 |
| - ##### insert() and delete() tests ##### |
42 |
| - b.delete(8) |
43 |
| - b.insert(8, 8) |
44 |
| - b.insert(3, 3) |
45 |
| - b.insert(10, 10) |
46 |
| - b.insert(1, 1) |
47 |
| - b.insert(6, 6) |
48 |
| - b.insert(4, 4) |
49 |
| - b.insert(7, 7) |
50 |
| - b.insert(14, 14) |
51 |
| - b.insert(13, 13) |
52 |
| - # Explicit check for the __str__ method of Binary Trees Class |
53 |
| - assert str(b) == \ |
54 |
| - ("[(1, 8, 8, 2), (3, 3, 3, 4), (None, 10, 10, 7), (None, 1, 1, None), " |
55 |
| - "(5, 6, 6, 6), (None, 4, 4, None), (None, 7, 7, None), (8, 14, 14, None), " |
56 |
| - "(None, 13, 13, None)]") |
57 |
| - |
58 |
| - ##### BinaryTreeTraversal pre_order test ##### |
59 |
| - trav = BinaryTreeTraversal(b, backend=Backend.CPP) |
60 |
| - p = trav.depth_first_search(order="pre_order") |
61 |
| - assert [node.key for node in p] == [8, 3, 1, 6, 4, 7, 10, 14, 13] |
62 |
| - |
63 |
| - ##### _simple_path() test ##### |
64 |
| - path = b._simple_path(1,0) |
65 |
| - assert path[0] == 0 |
66 |
| - assert path[1] == 1 |
67 |
| - assert path[2] == 3 |
68 |
| - |
69 |
| - ##### search() and delete() tests ##### |
70 |
| - assert b.search(10) == 2 |
71 |
| - assert b.search(-1) is None |
72 |
| - assert b.delete(13) is True |
73 |
| - assert b.delete(13) is None |
74 |
| - assert b.search(13) is None |
75 |
| - assert b.delete(10) is True |
76 |
| - assert b.search(10) is None |
77 |
| - assert b.delete(3) is True |
78 |
| - assert b.search(3) is None |
79 |
| - assert b.delete(13) is None |
80 |
| - assert str(b) == "[(1, 8, 8, 7), (3, 4, 4, 4), '', (None, 1, 1, None), (None, 6, 6, 6), '', (None, 7, 7, None), (None, 14, 14, None)]" |
81 |
| - |
82 |
| - b.delete(7) |
83 |
| - b.delete(6) |
84 |
| - assert b.delete(1, balancing_info=True) == 1 |
85 |
| - b.delete(4) |
86 |
| - assert str(b) == "[(None, 8, 8, 2), '', (None, 14, 14, None)]" |
87 |
| - |
88 |
| - bc = BST(1, 1, backend=Backend.CPP) |
89 |
| - assert bc.insert(1, 2) is None |
90 |
| - assert bc.delete(1, balancing_info=True) is None |
91 |
| - |
92 |
| - b2 = BST(-8, 8, backend=Backend.CPP) |
93 |
| - b2.insert(-3, 3) |
94 |
| - b2.insert(-10, 10) |
95 |
| - b2.insert(-1, 1) |
96 |
| - b2.insert(-6, 6) |
97 |
| - b2.insert(-4, 4) |
98 |
| - b2.insert(-7, 7) |
99 |
| - b2.insert(-14, 14) |
100 |
| - b2.insert(-13, 13) |
101 |
| - assert str(b2) == "[(2, -8, 8, 1), (4, -3, 3, 3), (7, -10, 10, None), (None, -1, 1, None), (6, -6, 6, 5), (None, -4, 4, None), (None, -7, 7, None), (None, -14, 14, 8), (None, -13, 13, None)]" |
102 |
| - b2.delete(-13) |
103 |
| - assert str(b2) == "[(2, -8, 8, 1), (4, -3, 3, 3), (7, -10, 10, None), (None, -1, 1, None), (6, -6, 6, 5), (None, -4, 4, None), (None, -7, 7, None), (None, -14, 14, None)]" |
104 |
| - b2.delete(-10) |
105 |
| - b2.delete(-3) |
106 |
| - b2.delete(-13) |
107 |
| - assert str(b2) == "[(7, -8, 8, 1), (4, -1, 1, None), '', '', (6, -6, 6, 5), (None, -4, 4, None), (None, -7, 7, None), (None, -14, 14, None)]" |
108 |
| - |
109 |
| - bl1 = BST(backend=Backend.CPP) |
110 |
| - nodes = [50, 30, 90, 70, 100, 60, 80, 55, 20, 40, 15, 10, 16, 17, 18] |
111 |
| - for node in nodes: |
112 |
| - bl1.insert(node, node) |
113 |
| - assert str(bl1) == "[(1, 50, 50, 2), (8, 30, 30, 9), (3, 90, 90, 4), (5, 70, 70, 6), (None, 100, 100, None), (7, 60, 60, None), (None, 80, 80, None), (None, 55, 55, None), (10, 20, 20, None), (None, 40, 40, None), (11, 15, 15, 12), (None, 10, 10, None), (None, 16, 16, 13), (None, 17, 17, 14), (None, 18, 18, None)]" |
114 |
| - |
115 |
| - ##### lowest common ancestor _lca2_() tests ##### |
116 |
| - assert bl1.lowest_common_ancestor(80, 55, 2) == 70 |
117 |
| - assert bl1.lowest_common_ancestor(60, 70, 2) == 70 |
118 |
| - assert bl1.lowest_common_ancestor(18, 18, 2) == 18 |
119 |
| - assert bl1.lowest_common_ancestor(40, 90, 2) == 50 |
120 |
| - |
121 |
| - assert bl1.lowest_common_ancestor(18, 10, 2) == 15 |
122 |
| - assert bl1.lowest_common_ancestor(55, 100, 2) == 90 |
123 |
| - assert bl1.lowest_common_ancestor(16, 80, 2) == 50 |
124 |
| - assert bl1.lowest_common_ancestor(30, 55, 2) == 50 |
125 |
| - |
126 |
| - assert raises(ValueError, lambda: bl1.lowest_common_ancestor(60, 200, 2)) |
127 |
| - assert raises(ValueError, lambda: bl1.lowest_common_ancestor(200, 60, 2)) |
128 |
| - assert raises(ValueError, lambda: bl1.lowest_common_ancestor(-3, 4, 2)) |
129 |
| - |
130 |
| - bl2 = BST(backend=Backend.CPP) |
131 |
| - nodes = [50, 30, 90, 70, 100, 60, 80, 55, 20, 40, 15, 10, 16, 17, 18] |
132 |
| - for node in nodes: |
133 |
| - bl2.insert(node, node) |
134 |
| - assert str(bl2) == "[(1, 50, 50, 2), (8, 30, 30, 9), (3, 90, 90, 4), (5, 70, 70, 6), (None, 100, 100, None), (7, 60, 60, None), (None, 80, 80, None), (None, 55, 55, None), (10, 20, 20, None), (None, 40, 40, None), (11, 15, 15, 12), (None, 10, 10, None), (None, 16, 16, 13), (None, 17, 17, 14), (None, 18, 18, None)]" |
135 |
| - |
136 |
| - ##### lowest common ancestor _lca1_() tests ##### |
137 |
| - assert bl2.lowest_common_ancestor(80, 55, 1) == 70 |
138 |
| - assert bl2.lowest_common_ancestor(60, 70, 1) == 70 |
139 |
| - assert bl2.lowest_common_ancestor(18, 18, 1) == 18 |
140 |
| - assert bl2.lowest_common_ancestor(40, 90, 1) == 50 |
141 |
| - |
142 |
| - assert bl2.lowest_common_ancestor(18, 10, 1) == 15 |
143 |
| - assert bl2.lowest_common_ancestor(55, 100, 1) == 90 |
144 |
| - assert bl2.lowest_common_ancestor(16, 80, 1) == 50 |
145 |
| - assert bl2.lowest_common_ancestor(30, 55, 1) == 50 |
146 |
| - |
147 |
| - assert raises(ValueError, lambda: bl2.lowest_common_ancestor(60, 200, 1)) |
148 |
| - assert raises(ValueError, lambda: bl2.lowest_common_ancestor(200, 60, 1)) |
149 |
| - assert raises(ValueError, lambda: bl2.lowest_common_ancestor(-3, 4, 1)) |
150 |
| - |
151 |
| - ##### rank() tests ##### |
152 |
| - assert bl2.rank(18) == 5 |
153 |
| - assert bl2.rank(10) == 1 |
154 |
| - rank_list = [2, 2, 4, 4, 5, 4, 5, 3, 2, 3, 2, 1, 3, 4, 5] |
155 |
| - for i,node in enumerate(nodes): |
156 |
| - assert bl2.rank(node) == rank_list[i] |
157 |
| - assert bl2.rank(200) is None |
158 |
| - |
159 |
| - ##### select() tests ##### |
160 |
| - select_list = [10, 50, 55, 90, 100] |
161 |
| - for i in range(5): |
162 |
| - assert bl2.select(i+1).key == select_list[i] |
163 |
| - |
164 |
| - b3 = BST(backend=Backend.CPP) |
165 |
| - b3.insert(10, 10) |
166 |
| - b3.insert(18, 18) |
167 |
| - b3.insert(7, 7) |
168 |
| - |
169 |
| - ##### upper_bound() tests ##### |
170 |
| - assert b3.upper_bound(9) == 10 |
171 |
| - assert b3.upper_bound(7) == 10 |
172 |
| - assert b3.upper_bound(-1) == 7 |
173 |
| - assert b3.upper_bound(20) is None |
174 |
| - |
175 |
| - ##### lower_bound() tests ##### |
176 |
| - assert b3.lower_bound(9) == 10 |
177 |
| - assert b3.lower_bound(7) == 7 |
178 |
| - assert b3.lower_bound(-1) == 7 |
179 |
| - assert b3.lower_bound(20) is None |
180 |
| - |
181 |
| - |
182 |
| -def test_cpp_BST_speed(): |
183 |
| - BST = BinarySearchTree |
184 |
| - import time |
185 |
| - b = BST() |
186 |
| - t1 = time.time() |
187 |
| - for node in range(-1000,1000): |
188 |
| - b.insert(node, node) |
189 |
| - t2 = time.time() |
190 |
| - b2 = BST(backend=Backend.CPP) |
191 |
| - t3 = time.time() |
192 |
| - for node in range(-1000,1000): |
193 |
| - b2.insert(node, node) |
194 |
| - t4 = time.time() |
195 |
| - print("Time taken by Python backend: ",t2-t1,"s") |
196 |
| - print("Time taken by C++ backend: ",t4-t3,"s") |
197 |
| - |
198 |
| - |
199 |
| -################### Python Tests below ################### |
200 |
| - |
201 | 10 | def _test_BinarySearchTree(backend):
|
202 | 11 | BST = BinarySearchTree
|
203 | 12 | b = BST(8, 8, backend=backend)
|
|
0 commit comments