Skip to content

Commit b7d5db1

Browse files
Hai Hoang Danggoswami-rahul
authored andcommitted
Add test for map (keon#386)
1 parent 5fd9d6d commit b7d5db1

File tree

4 files changed

+154
-152
lines changed

4 files changed

+154
-152
lines changed

algorithms/map/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .hashtable import *
2+
from .separate_chaining_hashtable import *

algorithms/map/hashtable.py

Lines changed: 0 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
from unittest import TestCase
2-
import unittest
3-
41
class HashTable(object):
52
"""
63
HashMap Data Type
@@ -120,93 +117,3 @@ def __resize(self):
120117
for key, value in zip(keys, values):
121118
if key is not self._empty and key is not self._deleted:
122119
self.put(key, value)
123-
124-
125-
class TestHashTable(TestCase):
126-
def test_one_entry(self):
127-
m = HashTable(10)
128-
m.put(1, '1')
129-
self.assertEqual('1', m.get(1))
130-
131-
def test_add_entry_bigger_than_table_size(self):
132-
m = HashTable(10)
133-
m.put(11, '1')
134-
self.assertEqual('1', m.get(11))
135-
136-
def test_get_none_if_key_missing_and_hash_collision(self):
137-
m = HashTable(10)
138-
m.put(1, '1')
139-
self.assertEqual(None, m.get(11))
140-
141-
def test_two_entries_with_same_hash(self):
142-
m = HashTable(10)
143-
m.put(1, '1')
144-
m.put(11, '11')
145-
self.assertEqual('1', m.get(1))
146-
self.assertEqual('11', m.get(11))
147-
148-
def test_get_on_full_table_does_halts(self):
149-
# and does not search forever
150-
m = HashTable(10)
151-
for i in range(10, 20):
152-
m.put(i, i)
153-
self.assertEqual(None, m.get(1))
154-
155-
def test_delete_key(self):
156-
m = HashTable(10)
157-
for i in range(5):
158-
m.put(i, i**2)
159-
m.del_(1)
160-
self.assertEqual(None, m.get(1))
161-
self.assertEqual(4,m.get(2))
162-
163-
def test_delete_key_and_reassign(self):
164-
m = HashTable(10)
165-
m.put(1, 1)
166-
del m[1]
167-
m.put(1, 2)
168-
self.assertEqual(2, m.get(1))
169-
170-
def test_assigning_to_full_table_throws_error(self):
171-
m = HashTable(3)
172-
m.put(1, 1)
173-
m.put(2, 2)
174-
m.put(3, 3)
175-
with self.assertRaises(ValueError):
176-
m.put(4, 4)
177-
178-
def test_len_trivial(self):
179-
m = HashTable(10)
180-
self.assertEqual(0, len(m))
181-
for i in range(10):
182-
m.put(i, i)
183-
self.assertEqual(i + 1, len(m))
184-
185-
def test_len_after_deletions(self):
186-
m = HashTable(10)
187-
m.put(1, 1)
188-
self.assertEqual(1, len(m))
189-
m.del_(1)
190-
self.assertEqual(0, len(m))
191-
m.put(11, 42)
192-
self.assertEqual(1, len(m))
193-
194-
def test_resizable_hash_table(self):
195-
m = ResizableHashTable()
196-
self.assertEqual(ResizableHashTable.MIN_SIZE, m.size)
197-
for i in range(ResizableHashTable.MIN_SIZE):
198-
m.put(i, 'foo')
199-
self.assertEqual(ResizableHashTable.MIN_SIZE * 2, m.size)
200-
self.assertEqual('foo', m.get(1))
201-
self.assertEqual('foo', m.get(3))
202-
self.assertEqual('foo', m.get(ResizableHashTable.MIN_SIZE - 1))
203-
204-
def test_fill_up_the_limit(self):
205-
m = HashTable(10)
206-
for i in range(10):
207-
m.put(i,i**2)
208-
for i in range(10):
209-
self.assertEqual(i**2,m.get(i))
210-
211-
if __name__ == "__main__":
212-
unittest.main()

algorithms/map/separate_chaining_hashtable.py

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -82,62 +82,3 @@ def __delitem__(self, key):
8282

8383
def __setitem__(self, key, value):
8484
self.put(key, value)
85-
86-
87-
class TestSeparateChainingHashTable(unittest.TestCase):
88-
def test_one_entry(self):
89-
m = SeparateChainingHashTable(10)
90-
m.put(1, '1')
91-
self.assertEqual('1', m.get(1))
92-
93-
def test_two_entries_with_same_hash(self):
94-
m = SeparateChainingHashTable(10)
95-
m.put(1, '1')
96-
m.put(11, '11')
97-
self.assertEqual('1', m.get(1))
98-
self.assertEqual('11', m.get(11))
99-
100-
def test_len_trivial(self):
101-
m = SeparateChainingHashTable(10)
102-
self.assertEqual(0, len(m))
103-
for i in range(10):
104-
m.put(i, i)
105-
self.assertEqual(i + 1, len(m))
106-
107-
def test_len_after_deletions(self):
108-
m = SeparateChainingHashTable(10)
109-
m.put(1, 1)
110-
self.assertEqual(1, len(m))
111-
m.del_(1)
112-
self.assertEqual(0, len(m))
113-
m.put(11, 42)
114-
self.assertEqual(1, len(m))
115-
116-
def test_delete_key(self):
117-
m = SeparateChainingHashTable(10)
118-
for i in range(5):
119-
m.put(i, i**2)
120-
m.del_(1)
121-
self.assertEqual(None, m.get(1))
122-
self.assertEqual(4, m.get(2))
123-
124-
def test_delete_key_and_reassign(self):
125-
m = SeparateChainingHashTable(10)
126-
m.put(1, 1)
127-
del m[1]
128-
m.put(1, 2)
129-
self.assertEqual(2, m.get(1))
130-
131-
def test_add_entry_bigger_than_table_size(self):
132-
m = SeparateChainingHashTable(10)
133-
m.put(11, '1')
134-
self.assertEqual('1', m.get(11))
135-
136-
def test_get_none_if_key_missing_and_hash_collision(self):
137-
m = SeparateChainingHashTable(10)
138-
m.put(1, '1')
139-
self.assertEqual(None, m.get(11))
140-
141-
142-
if __name__ == '__main__':
143-
unittest.main()

tests/test_map.py

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
from algorithms.map import (
2+
HashTable, ResizableHashTable,
3+
Node, SeparateChainingHashTable
4+
)
5+
6+
import unittest
7+
8+
class TestHashTable(unittest.TestCase):
9+
def test_one_entry(self):
10+
m = HashTable(10)
11+
m.put(1, '1')
12+
self.assertEqual('1', m.get(1))
13+
14+
def test_add_entry_bigger_than_table_size(self):
15+
m = HashTable(10)
16+
m.put(11, '1')
17+
self.assertEqual('1', m.get(11))
18+
19+
def test_get_none_if_key_missing_and_hash_collision(self):
20+
m = HashTable(10)
21+
m.put(1, '1')
22+
self.assertEqual(None, m.get(11))
23+
24+
def test_two_entries_with_same_hash(self):
25+
m = HashTable(10)
26+
m.put(1, '1')
27+
m.put(11, '11')
28+
self.assertEqual('1', m.get(1))
29+
self.assertEqual('11', m.get(11))
30+
31+
def test_get_on_full_table_does_halts(self):
32+
# and does not search forever
33+
m = HashTable(10)
34+
for i in range(10, 20):
35+
m.put(i, i)
36+
self.assertEqual(None, m.get(1))
37+
38+
def test_delete_key(self):
39+
m = HashTable(10)
40+
for i in range(5):
41+
m.put(i, i**2)
42+
m.del_(1)
43+
self.assertEqual(None, m.get(1))
44+
self.assertEqual(4,m.get(2))
45+
46+
def test_delete_key_and_reassign(self):
47+
m = HashTable(10)
48+
m.put(1, 1)
49+
del m[1]
50+
m.put(1, 2)
51+
self.assertEqual(2, m.get(1))
52+
53+
def test_assigning_to_full_table_throws_error(self):
54+
m = HashTable(3)
55+
m.put(1, 1)
56+
m.put(2, 2)
57+
m.put(3, 3)
58+
with self.assertRaises(ValueError):
59+
m.put(4, 4)
60+
61+
def test_len_trivial(self):
62+
m = HashTable(10)
63+
self.assertEqual(0, len(m))
64+
for i in range(10):
65+
m.put(i, i)
66+
self.assertEqual(i + 1, len(m))
67+
68+
def test_len_after_deletions(self):
69+
m = HashTable(10)
70+
m.put(1, 1)
71+
self.assertEqual(1, len(m))
72+
m.del_(1)
73+
self.assertEqual(0, len(m))
74+
m.put(11, 42)
75+
self.assertEqual(1, len(m))
76+
77+
def test_resizable_hash_table(self):
78+
m = ResizableHashTable()
79+
self.assertEqual(ResizableHashTable.MIN_SIZE, m.size)
80+
for i in range(ResizableHashTable.MIN_SIZE):
81+
m.put(i, 'foo')
82+
self.assertEqual(ResizableHashTable.MIN_SIZE * 2, m.size)
83+
self.assertEqual('foo', m.get(1))
84+
self.assertEqual('foo', m.get(3))
85+
self.assertEqual('foo', m.get(ResizableHashTable.MIN_SIZE - 1))
86+
87+
def test_fill_up_the_limit(self):
88+
m = HashTable(10)
89+
for i in range(10):
90+
m.put(i,i**2)
91+
for i in range(10):
92+
self.assertEqual(i**2,m.get(i))
93+
94+
95+
class TestSeparateChainingHashTable(unittest.TestCase):
96+
def test_one_entry(self):
97+
m = SeparateChainingHashTable(10)
98+
m.put(1, '1')
99+
self.assertEqual('1', m.get(1))
100+
101+
def test_two_entries_with_same_hash(self):
102+
m = SeparateChainingHashTable(10)
103+
m.put(1, '1')
104+
m.put(11, '11')
105+
self.assertEqual('1', m.get(1))
106+
self.assertEqual('11', m.get(11))
107+
108+
def test_len_trivial(self):
109+
m = SeparateChainingHashTable(10)
110+
self.assertEqual(0, len(m))
111+
for i in range(10):
112+
m.put(i, i)
113+
self.assertEqual(i + 1, len(m))
114+
115+
def test_len_after_deletions(self):
116+
m = SeparateChainingHashTable(10)
117+
m.put(1, 1)
118+
self.assertEqual(1, len(m))
119+
m.del_(1)
120+
self.assertEqual(0, len(m))
121+
m.put(11, 42)
122+
self.assertEqual(1, len(m))
123+
124+
def test_delete_key(self):
125+
m = SeparateChainingHashTable(10)
126+
for i in range(5):
127+
m.put(i, i**2)
128+
m.del_(1)
129+
self.assertEqual(None, m.get(1))
130+
self.assertEqual(4, m.get(2))
131+
132+
def test_delete_key_and_reassign(self):
133+
m = SeparateChainingHashTable(10)
134+
m.put(1, 1)
135+
del m[1]
136+
m.put(1, 2)
137+
self.assertEqual(2, m.get(1))
138+
139+
def test_add_entry_bigger_than_table_size(self):
140+
m = SeparateChainingHashTable(10)
141+
m.put(11, '1')
142+
self.assertEqual('1', m.get(11))
143+
144+
def test_get_none_if_key_missing_and_hash_collision(self):
145+
m = SeparateChainingHashTable(10)
146+
m.put(1, '1')
147+
self.assertEqual(None, m.get(11))
148+
149+
150+
151+
if __name__ == "__main__":
152+
unittest.main()

0 commit comments

Comments
 (0)