def setUp(self): self.ht = HashTable() push = self.ht.push push("apple", 100) # hashed key: 10 push("orange", 200) # hashed key: 9 push("melon", 300) # hashed key: 2 push("strawberry", 400) # hashed key: 4 push("banana", 500) # hashed key: 1 push("watermelon", 600) # hashed key: 10 push("mango", 550) # hashed key: 4
def test_contains(self): ht = HashTable() ht.set('I', 1) ht.set('V', 5) ht.set('X', 10) assert ht.contains('I') is True assert ht.contains('V') is True assert ht.contains('X') is True assert ht.contains('A') is False
def test_size(self): ht = HashTable() assert ht.size == 0 ht.set('I', 1) assert ht.size == 1 ht.set('V', 5) assert ht.size == 2 ht.set('X', 10) assert ht.size == 3
class TestHashTable(unittest.TestCase): def setUp(self): self.ht = HashTable() push = self.ht.push push("apple", 100) # hashed key: 10 push("orange", 200) # hashed key: 9 push("melon", 300) # hashed key: 2 push("strawberry", 400) # hashed key: 4 push("banana", 500) # hashed key: 1 push("watermelon", 600) # hashed key: 10 push("mango", 550) # hashed key: 4 def tearDown(self): del self.ht def test_01_peek(self): self.assertEqual(self.ht.peek("apple"), 100) self.assertEqual(self.ht.peek("orange"), 200) self.assertEqual(self.ht.peek("melon"), 300) self.assertEqual(self.ht.peek("strawberry"), 400) self.assertEqual(self.ht.peek("banana"), 500) self.assertEqual(self.ht.peek("watermelon"), 600) self.assertEqual(self.ht.peek("mango"), 550) def test_02_pop(self): self.assertEqual(self.ht.pop("apple"), 100) self.assertEqual(self.ht.pop("orange"), 200) self.assertEqual(self.ht.pop("melon"), 300) self.assertEqual(self.ht.pop("strawberry"), 400) self.assertEqual(self.ht.pop("banana"), 500) self.assertEqual(self.ht.pop("watermelon"), 600) self.assertEqual(self.ht.pop("mango"), 550) with self.assertRaises(KeyError): self.ht.pop("apple") def test_03_expand(self): push = self.ht.push self.assertEqual(self.ht.capacity, 10) push("tomato", 101) push("pear", 102) push("peach", 103) push("another", 104) push("other", 105) push("something", 106) self.assertEqual(self.ht.capacity, 15) def test_04_modify(self): push = self.ht.push push("apple", 101) push("orange", 201) push("melon", 301) push("strawberry", 401) push("banana", 501) push("watermelon", 601) push("mango", 551) self.assertEqual(self.ht.peek("apple"), 101) self.assertEqual(self.ht.peek("orange"), 201) self.assertEqual(self.ht.peek("melon"), 301) self.assertEqual(self.ht.peek("strawberry"), 401) self.assertEqual(self.ht.peek("banana"), 501) self.assertEqual(self.ht.peek("watermelon"), 601) self.assertEqual(self.ht.peek("mango"), 551)
def test_set_and_get(self): ht = HashTable() ht.set('I', 1) ht.set('V', 5) ht.set('X', 10) assert ht.get('I') == 1 assert ht.get('V') == 5 assert ht.get('X') == 10 assert ht.length() == 3 assert ht.size == 3 with self.assertRaises(KeyError): ht.get('A') # Key does not exist
def test_resize(self): ht = HashTable(2) # Set init_size to 2 assert ht.size == 0 assert len(ht.buckets) == 2 assert ht.load_factor() == 0 ht.set('I', 1) assert ht.size == 1 assert len(ht.buckets) == 2 assert ht.load_factor() == 0.5 ht.set('V', 5) # Should trigger resize assert ht.size == 2 assert len(ht.buckets) == 4 assert ht.load_factor() == 0.5 ht.set('X', 10) assert ht.size == 3 assert len(ht.buckets) == 4 assert ht.load_factor() == 0.75 ht.set('L', 50) # Should trigger resize assert ht.size == 4 assert len(ht.buckets) == 8 assert ht.load_factor() == 0.5
def test_items(self): ht = HashTable() assert ht.items() == [] ht.set('I', 1) assert ht.items() == [('I', 1)] ht.set('V', 5) self.assertCountEqual(ht.items(), [('I', 1), ('V', 5)]) ht.set('X', 10) self.assertCountEqual(ht.items(), [('I', 1), ('V', 5), ('X', 10)])
def test_length(self): ht = HashTable() assert ht.length() == 0 ht.set('I', 1) assert ht.length() == 1 ht.set('V', 5) assert ht.length() == 2 ht.set('X', 10) assert ht.length() == 3
def test_values(self): ht = HashTable() assert ht.values() == [] ht.set('I', 1) assert ht.values() == [1] ht.set('V', 5) self.assertCountEqual(ht.values(), [1, 5]) # Ignore item order ht.set('X', 10) self.assertCountEqual(ht.values(), [1, 5, 10]) # Ignore item order
def test_keys(self): ht = HashTable() assert ht.keys() == [] ht.set('I', 1) assert ht.keys() == ['I'] ht.set('V', 5) self.assertCountEqual(ht.keys(), ['I', 'V']) # Ignore item order ht.set('X', 10) self.assertCountEqual(ht.keys(), ['I', 'V', 'X']) # Ignore item order
def test_delete(self): ht = HashTable(4) ht.set('I', 1) ht.set('V', 5) ht.set('X', 10) assert ht.load == 4 assert ht.length() == 3 assert ht.size == 3 ht.delete('I') ht.delete('X') assert ht.length() == 1 assert ht.size == 1 with self.assertRaises(KeyError): ht.delete('X') # Key no longer exists with self.assertRaises(KeyError): ht.delete('A') # Key does not exist ht.set('I', 1) ht.set('V', 5) ht.set('X', 10) ht.set('II', 2) ht.set('IV', 4) ht.set('XI', 11) assert ht.length() == 6 assert ht.size == 6
def test_set_twice_and_get(self): ht = HashTable() ht.set('I', 1) ht.set('V', 4) ht.set('X', 9) assert ht.length() == 3 assert ht.size == 3 ht.set('V', 5) # Update value ht.set('X', 10) # Update value assert ht.get('I') == 1 assert ht.get('V') == 5 assert ht.get('X') == 10 assert ht.length() == 3 # Check length is not overcounting assert ht.size == 3 # Check size is not overcounting
def test_init(self): ht = HashTable(4) assert len(ht.buckets) == 4 assert ht.length() == 0 assert ht.size == 0