7
7
root_folder = os .path .abspath (src_dir )
8
8
sys .path .append (root_folder )
9
9
from data_structures .heap .max_heap import MaxHeap
10
+ from utils .comparator import Comparator
10
11
11
12
12
13
class TestCase (unittest .TestCase ):
@@ -19,6 +20,168 @@ def test_create_empty_max_heap(self):
19
20
self .assertIsNone (maxHeap .peek ())
20
21
self .assertTrue (maxHeap .isEmpty ())
21
22
23
+ def test_add_items_to_heap (self ):
24
+ """
25
+ Test to add items to the heap and heapify it up
26
+ """
27
+ maxHeap = MaxHeap ()
28
+
29
+ maxHeap .add (5 )
30
+
31
+ self .assertFalse (maxHeap .isEmpty ())
32
+ self .assertEqual (maxHeap .peek (), 5 )
33
+ self .assertEqual (maxHeap .toList (), [5 ])
34
+
35
+ maxHeap .add (3 )
36
+
37
+ self .assertEqual (maxHeap .peek (), 5 )
38
+ self .assertEqual (maxHeap .toList (), [5 , 3 ])
39
+
40
+ maxHeap .add (10 )
41
+
42
+ self .assertEqual (maxHeap .peek (), 10 )
43
+ self .assertEqual (maxHeap .toList (), [10 , 3 , 5 ])
44
+
45
+ def test_poll_items_from_heap (self ):
46
+ """
47
+ Test to poll items from the heap and heapify it down
48
+ """
49
+ maxHeap = MaxHeap ()
50
+
51
+ maxHeap .add (5 )
52
+ maxHeap .add (3 )
53
+ maxHeap .add (10 )
54
+ maxHeap .add (11 )
55
+ maxHeap .add (1 )
56
+
57
+ self .assertEqual (maxHeap .toList (), [11 , 10 , 5 , 3 , 1 ])
58
+
59
+ self .assertEqual (maxHeap .poll (), 11 )
60
+ self .assertEqual (maxHeap .toList (), [10 , 3 , 5 , 1 ])
61
+
62
+ self .assertEqual (maxHeap .poll (), 10 )
63
+ self .assertEqual (maxHeap .toList (), [5 , 3 , 1 ])
64
+
65
+ self .assertEqual (maxHeap .poll (), 5 )
66
+ self .assertEqual (maxHeap .toList (), [3 , 1 ])
67
+
68
+ self .assertEqual (maxHeap .poll (), 3 )
69
+ self .assertEqual (maxHeap .toList (), [1 ])
70
+
71
+ self .assertEqual (maxHeap .poll (), 1 )
72
+ self .assertEqual (maxHeap .toList (), [])
73
+
74
+ self .assertEqual (maxHeap .poll (), None )
75
+ self .assertEqual (maxHeap .toList (), [])
76
+
77
+ def test_heapify_down_from_right_beanch_in_heap (self ):
78
+ """
79
+ Test to heapify down through the right branch as well
80
+ """
81
+ maxHeap = MaxHeap ()
82
+
83
+ maxHeap .add (3 )
84
+ maxHeap .add (12 )
85
+ maxHeap .add (10 )
86
+
87
+ self .assertEqual (maxHeap .toList (), [12 , 3 , 10 ])
88
+
89
+ maxHeap .add (11 )
90
+ self .assertEqual (maxHeap .toList (), [12 , 11 , 10 , 3 ])
91
+
92
+ self .assertEqual (maxHeap .poll (), 12 )
93
+ self .assertEqual (maxHeap .toList (), [11 , 3 , 10 ])
94
+
95
+ def test_find_item_indices_in_heap (self ):
96
+ """
97
+ Test to find item indices in heap
98
+ """
99
+ maxHeap = MaxHeap ()
100
+
101
+ maxHeap .add (3 )
102
+ maxHeap .add (12 )
103
+ maxHeap .add (10 )
104
+ maxHeap .add (11 )
105
+ maxHeap .add (11 )
106
+
107
+ self .assertEqual (maxHeap .toList (), [12 , 11 , 10 , 3 , 11 ])
108
+
109
+ self .assertEqual (maxHeap .find (5 ), [])
110
+ self .assertEqual (maxHeap .find (12 ), [0 ])
111
+ self .assertEqual (maxHeap .find (11 ), [1 , 4 ])
112
+
113
+ def test_remove_items_with_heapify_down_from_heap (self ):
114
+ """
115
+ Test to remove items from heap with heapify down
116
+ """
117
+ maxHeap = MaxHeap ()
118
+
119
+ maxHeap .add (3 )
120
+ maxHeap .add (12 )
121
+ maxHeap .add (10 )
122
+ maxHeap .add (11 )
123
+ maxHeap .add (11 )
124
+
125
+ self .assertEqual (maxHeap .toList (), [12 , 11 , 10 , 3 , 11 ])
126
+
127
+ self .assertEqual (maxHeap .remove (12 ).toList (), [11 , 11 , 10 , 3 ])
128
+ self .assertEqual (maxHeap .remove (12 ).peek (), 11 )
129
+ self .assertEqual (maxHeap .remove (11 ).toList (), [10 , 3 ])
130
+ self .assertEqual (maxHeap .remove (10 ).peek (), 3 )
131
+
132
+ def test_remove_items_with_heapify_up_from_heap (self ):
133
+ """
134
+ Test to remove items from heap with heapify up
135
+ """
136
+ maxHeap = MaxHeap ()
137
+
138
+ maxHeap .add (3 )
139
+ maxHeap .add (10 )
140
+ maxHeap .add (5 )
141
+ maxHeap .add (6 )
142
+ maxHeap .add (7 )
143
+ maxHeap .add (4 )
144
+ maxHeap .add (6 )
145
+ maxHeap .add (8 )
146
+ maxHeap .add (2 )
147
+ maxHeap .add (1 )
148
+
149
+ self .assertEqual (maxHeap .toList (), [10 , 8 , 6 , 7 , 6 , 4 , 5 , 3 , 2 , 1 ])
150
+
151
+ self .assertEqual (maxHeap .remove (4 ).toList (), [10 , 8 , 6 , 7 , 6 , 1 , 5 , 3 , 2 ])
152
+ self .assertEqual (maxHeap .remove (3 ).toList (), [10 , 8 , 6 , 7 , 6 , 1 , 5 , 2 ])
153
+ self .assertEqual (maxHeap .remove (5 ).toList (), [10 , 8 , 6 , 7 , 6 , 1 , 2 ])
154
+ self .assertEqual (maxHeap .remove (10 ).toList (), [2 , 8 , 6 , 7 , 6 , 1 ])
155
+ self .assertEqual (maxHeap .remove (6 ).toList (), [2 , 8 , 1 , 7 ])
156
+ self .assertEqual (maxHeap .remove (2 ).toList (), [7 , 8 , 1 ])
157
+ self .assertEqual (maxHeap .remove (1 ).toList (), [7 , 8 ])
158
+ self .assertEqual (maxHeap .remove (7 ).toList (), [8 ])
159
+ self .assertEqual (maxHeap .remove (8 ).toList (), [])
160
+
161
+ def test_remove_items_with_custom_comparator_from_heap (self ):
162
+ """
163
+ Test to remove items from heap with custom finding comparator
164
+ """
165
+ maxHeap = MaxHeap ()
166
+
167
+ maxHeap .add ("a" )
168
+ maxHeap .add ("bb" )
169
+ maxHeap .add ("ccc" )
170
+ maxHeap .add ("dddd" )
171
+
172
+ self .assertEqual (maxHeap .toList (), ["dddd" , "ccc" , "bb" , "a" ])
173
+
174
+ def customFun (a , b ):
175
+ if len (a ) == len (b ):
176
+ return 0
177
+
178
+ return - 1 if (len (a ) < len (b )) else 1
179
+
180
+ comparator = Comparator (customFun )
181
+
182
+ maxHeap .remove ("ccc" , comparator )
183
+ self .assertEqual (maxHeap .toList (), ["dddd" , "a" , "bb" ])
184
+
22
185
23
186
if __name__ == "__main__" :
24
187
unittest .main ()
0 commit comments