Skip to content

Commit c5b6646

Browse files
authored
Merge pull request #3 from DD2480-Team/issue/2
fix: issue #2 added tests to get branch coverage 100%
2 parents 326345c + 24d7f91 commit c5b6646

File tree

6 files changed

+153
-83
lines changed

6 files changed

+153
-83
lines changed

data_structures/binary_tree/binary_search_tree.py

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ def inorder(self, arr: list, node: Node):
152152
def find_kth_smallest(self, k: int, node: Node) -> int:
153153
"""Return the kth smallest element in a binary search tree"""
154154
arr: list = []
155-
self.inorder(arr, node) # append all values to list using inorder traversal
155+
# append all values to list using inorder traversal
156+
self.inorder(arr, node)
156157
return arr[k - 1]
157158

158159

@@ -186,36 +187,35 @@ def binary_search_tree():
186187
Traceback (most recent call last):
187188
...
188189
IndexError: Warning: Tree is empty! please use another.
190+
>>> t = BinarySearchTree().insert(8, 3, 6, 1, 10, 14, 13, 4, 7)
191+
>>> t.search(6)
192+
{'6': (4, 7)}
193+
>>> t.search(-1)
194+
>>> print(t.root.value)
195+
8
196+
>>> print(t)
197+
{'8': ({'3': (1, {'6': (4, 7)})}, {'10': (None, {'14': (13, None)})})}
198+
>>> t.get_max().value
199+
14
200+
>>> t.get_min().value
201+
1
202+
>>> t.find_kth_smallest(k=2,node=t.root)
203+
3
204+
>>> t.find_kth_smallest(k=5,node=t.root)
205+
7
206+
>>> t.remove(7)
207+
>>> print(" ".join(repr(i.value) for i in t.traversal_tree()))
208+
8 3 1 6 4 10 14 13
209+
>>> t.remove(10)
210+
>>> print(" ".join(repr(i.value) for i in t.traversal_tree()))
211+
8 3 1 6 4 14 13
212+
>>> t.remove(14)
213+
>>> print(" ".join(repr(i.value) for i in t.traversal_tree()))
214+
8 3 1 6 4 13
189215
"""
190-
testlist = (8, 3, 6, 1, 10, 14, 13, 4, 7)
191-
t = BinarySearchTree()
192-
for i in testlist:
193-
t.insert(i)
194-
195-
# Prints all the elements of the list in order traversal
196-
print(t)
197-
198-
if t.search(6) is not None:
199-
print("The value 6 exists")
200-
else:
201-
print("The value 6 doesn't exist")
202-
203-
if t.search(-1) is not None:
204-
print("The value -1 exists")
205-
else:
206-
print("The value -1 doesn't exist")
207-
208-
if not t.empty():
209-
print("Max Value: ", t.get_max().value)
210-
print("Min Value: ", t.get_min().value)
211-
212-
for i in testlist:
213-
t.remove(i)
214-
print(t)
215216

216217

217218
if __name__ == "__main__":
218219
import doctest
219220

220221
doctest.testmod()
221-
# binary_search_tree()

data_structures/queue/circular_queue.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,9 @@ def dequeue(self):
9292
self.front = (self.front + 1) % self.n
9393
self.size -= 1
9494
return temp
95+
96+
97+
if __name__ == "__main__":
98+
import doctest
99+
100+
doctest.testmod()

data_structures/queue/linked_queue.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,6 @@ def clear(self) -> None:
149149

150150

151151
if __name__ == "__main__":
152-
from doctest import testmod
152+
import doctest
153153

154-
testmod()
154+
doctest.testmod()

data_structures/queue/priority_queue_using_list.py

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class FixedPriorityQueue:
5959
>>> fpq.dequeue()
6060
Traceback (most recent call last):
6161
...
62-
data_structures.queue.priority_queue_using_list.UnderFlowError: All queues are empty
62+
priority_queue_using_list.UnderFlowError: All queues are empty
6363
>>> print(fpq)
6464
Priority 0: []
6565
Priority 1: []
@@ -78,6 +78,21 @@ def enqueue(self, priority: int, data: int) -> None:
7878
Add an element to a queue based on its priority.
7979
If the priority is invalid ValueError is raised.
8080
If the queue is full an OverFlowError is raised.
81+
82+
Examples
83+
Those test should fail and raise Overflowerror and value exception.
84+
85+
>>> fpq = FixedPriorityQueue()
86+
>>> fpq.enqueue(3, 10)
87+
Traceback (most recent call last):
88+
...
89+
ValueError: Valid priorities are 0, 1, and 2
90+
>>> fpq = FixedPriorityQueue()
91+
>>> q = [fpq.enqueue(0,5) for _ in range(101)]
92+
Traceback (most recent call last):
93+
...
94+
OverflowError: Maximum queue size is 100
95+
8196
"""
8297
try:
8398
if len(self.queues[priority]) >= 100:
@@ -141,9 +156,16 @@ class ElementPriorityQueue:
141156
>>> epq.dequeue()
142157
Traceback (most recent call last):
143158
...
144-
data_structures.queue.priority_queue_using_list.UnderFlowError: The queue is empty
159+
priority_queue_using_list.UnderFlowError: The queue is empty
145160
>>> print(epq)
146161
[]
162+
163+
164+
>>> epq2 = ElementPriorityQueue()
165+
>>> q = [[epq2.enqueue(11)] for _ in range(101)]
166+
Traceback (most recent call last):
167+
...
168+
priority_queue_using_list.OverFlowError: Maximum queue size is 100
147169
"""
148170

149171
def __init__(self):
@@ -153,6 +175,7 @@ def enqueue(self, data: int) -> None:
153175
"""
154176
This function enters the element into the queue
155177
If the queue is full an Exception is raised saying Over Flow!
178+
156179
"""
157180
if len(self.queue) == 100:
158181
raise OverFlowError("Maximum queue size is 100")
@@ -177,56 +200,7 @@ def __str__(self) -> str:
177200
return str(self.queue)
178201

179202

180-
def fixed_priority_queue():
181-
fpq = FixedPriorityQueue()
182-
fpq.enqueue(0, 10)
183-
fpq.enqueue(1, 70)
184-
fpq.enqueue(0, 100)
185-
fpq.enqueue(2, 1)
186-
fpq.enqueue(2, 5)
187-
fpq.enqueue(1, 7)
188-
fpq.enqueue(2, 4)
189-
fpq.enqueue(1, 64)
190-
fpq.enqueue(0, 128)
191-
print(fpq)
192-
print(fpq.dequeue())
193-
print(fpq.dequeue())
194-
print(fpq.dequeue())
195-
print(fpq.dequeue())
196-
print(fpq.dequeue())
197-
print(fpq)
198-
print(fpq.dequeue())
199-
print(fpq.dequeue())
200-
print(fpq.dequeue())
201-
print(fpq.dequeue())
202-
print(fpq.dequeue())
203-
204-
205-
def element_priority_queue():
206-
epq = ElementPriorityQueue()
207-
epq.enqueue(10)
208-
epq.enqueue(70)
209-
epq.enqueue(100)
210-
epq.enqueue(1)
211-
epq.enqueue(5)
212-
epq.enqueue(7)
213-
epq.enqueue(4)
214-
epq.enqueue(64)
215-
epq.enqueue(128)
216-
print(epq)
217-
print(epq.dequeue())
218-
print(epq.dequeue())
219-
print(epq.dequeue())
220-
print(epq.dequeue())
221-
print(epq.dequeue())
222-
print(epq)
223-
print(epq.dequeue())
224-
print(epq.dequeue())
225-
print(epq.dequeue())
226-
print(epq.dequeue())
227-
print(epq.dequeue())
228-
229-
230203
if __name__ == "__main__":
231-
fixed_priority_queue()
232-
element_priority_queue()
204+
import doctest
205+
206+
doctest.testmod()

data_structures/queue/queue_on_list.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,9 @@ def get_front(self):
5050

5151
def size(self):
5252
return self.length
53+
54+
55+
if __name__ == "__main__":
56+
import doctest
57+
58+
doctest.testmod()

data_structures/queue/queue_on_pseudo_stack.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ def __init__(self):
77
self.length = 0
88

99
def __str__(self):
10+
"""
11+
>>> q = Queue()
12+
>>> q.put(3)
13+
>>> q.put(5)
14+
>>> q.put(7)
15+
>>> print(q)
16+
<3, 5, 7>
17+
18+
>>> q = Queue()
19+
>>> print(q)
20+
<>
21+
"""
1022
printed = "<" + str(self.stack)[1:-1] + ">"
1123
return printed
1224

@@ -15,6 +27,12 @@ def __str__(self):
1527
item to enqueue"""
1628

1729
def put(self, item):
30+
"""
31+
>>> q = Queue()
32+
>>> q.put(3)
33+
>>> assert q.stack == [3]
34+
>>> assert q.length == 1
35+
"""
1836
self.stack.append(item)
1937
self.length = self.length + 1
2038

@@ -24,6 +42,37 @@ def put(self, item):
2442
item that was dequeued"""
2543

2644
def get(self):
45+
"""
46+
Testing get() and inner call to rotate()
47+
48+
>>> q = Queue()
49+
>>> q.put(3)
50+
>>> q.put(5)
51+
>>> q.put(7)
52+
>>> n = q.get()
53+
>>> assert n == 3
54+
>>> assert q.stack == [5,7]
55+
56+
>>> q2 = Queue()
57+
>>> q2.put(3)
58+
>>> n = q2.get()
59+
>>> n = q2.get()
60+
Traceback (most recent call last):
61+
...
62+
IndexError: The queue is empty
63+
64+
>>> q3 = Queue()
65+
>>> n = q3.get()
66+
Traceback (most recent call last):
67+
...
68+
IndexError: The queue is empty
69+
70+
>>> q4 = Queue()
71+
>>> q4.put(3)
72+
>>> n = q4.get()
73+
>>> assert n == 3
74+
"""
75+
2776
self.rotate(1)
2877
dequeued = self.stack[self.length - 1]
2978
self.stack = self.stack[:-1]
@@ -33,10 +82,22 @@ def get(self):
3382

3483
"""Rotates the queue {@code rotation} times
3584
@param rotation
85+
@requirement: |self.length| > 0
3686
number of times to rotate queue"""
3787

3888
def rotate(self, rotation):
89+
"""
90+
>>> q = Queue()
91+
>>> q.put(3)
92+
>>> q.put(5)
93+
>>> q.put(7)
94+
>>> q.rotate(2)
95+
>>> assert q.stack == [7,3,5]
96+
"""
97+
3998
for i in range(rotation):
99+
if self.length == 0:
100+
raise IndexError("The queue is empty")
40101
temp = self.stack[0]
41102
self.stack = self.stack[1:]
42103
self.put(temp)
@@ -46,6 +107,18 @@ def rotate(self, rotation):
46107
@return item at front of self.stack"""
47108

48109
def front(self):
110+
"""
111+
>>> q = Queue()
112+
>>> q.put(3)
113+
>>> n = q.front()
114+
>>> assert n == 3
115+
116+
>>> q2 = Queue()
117+
>>> n = q2.front()
118+
Traceback (most recent call last):
119+
...
120+
IndexError: The queue is empty
121+
"""
49122
front = self.get()
50123
self.put(front)
51124
self.rotate(self.length - 1)
@@ -54,4 +127,15 @@ def front(self):
54127
"""Returns the length of this.stack"""
55128

56129
def size(self):
130+
"""
131+
>>> q = Queue()
132+
>>> q.size()
133+
0
134+
"""
57135
return self.length
136+
137+
138+
if __name__ == "__main__":
139+
import doctest
140+
141+
doctest.testmod()

0 commit comments

Comments
 (0)