def test_rehashing(self): keys = [ "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth" ] values = list(range(1, 11)) hm = HashMap() self.assertEqual(hm.size(), 0) self.assertEqual(hm.capacity(), 8) for i in range(0, 5): hm.set(keys[i], values[i]) self.assertEqual(hm.size(), 5) self.assertEqual(hm.capacity(), 8) output = hm.keys() self.assertEqual(len(output), 5) for key in output: self.assertIn(key, keys) for i in range(5, 10): hm.set(keys[i], values[i]) self.assertEqual(hm.size(), 10) self.assertEqual(hm.capacity(), 16) output = hm.keys() for key in output: self.assertIn(key, keys) for key in keys: self.assertIn(key, output)
def test_put_remove(self): hash_map = HashMap() size = 20 for key in range(1, size + 1): value = key * 2 hash_map.put(key, value) self.assertEqual(hash_map.size(), size) for key in range(1, size + 1): hash_map.remove(key) self.assertEqual(hash_map.size(), 0)
def test_key_present(self): hm = HashMap() self.assertEqual(hm.get("asdf"), None) self.assertEqual(hm.get("asdf", 0), 0) hm.set("qwerty", 12345) self.assertEqual(hm.get("qwerty"), 12345) self.assertEqual(hm.size(), 1) self.assertEqual(hm.capacity(), 8)
def test_rehashing(): keys = [(r, r) for r in (range(10))] values = list(range(1, 11)) hm = HashMap() for k, v in zip(keys, values): hm.set(k, v) assert hm.size() == 10 assert hm.capacity() == 13
def test_clear(): hm = HashMap() keys = [(r, r) for r in (range(10))] values = list(range(1, 11)) for k, v in zip(keys, values): hm.set(k, v) hm.clear() assert hm.capacity() == 7 assert hm.size() == 0
def test_ten_keys(self): hm = HashMap() keys = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"] values = list(range(1, 11)) for i in range(len(keys)): hm.set(keys[i], values[i]) self.assertEqual(hm.get("sixth"), 6) self.assertNotEqual(hm.get("sixth"), 7) self.assertNotEqual(hm.get("sixth"), 5) hm.set("third", 409) self.assertEqual(hm.get("third"), 409) self.assertEqual(hm.size(), 10) self.assertEqual(hm.capacity(), 16)
def test_empty_map(self): hm = HashMap() self.assertEqual(hm.capacity(), 8) self.assertEqual(hm.size(), 0)
class HashMapTest(unittest.TestCase): def setUp(self): self.hashmap = HashMap() def populate(self, values): for value in values: self.hashmap.put(*value) def remove(self, values): for value in values: self.hashmap.remove(value) def test_put(self): # Can add to hashmap self.hashmap.put('Apples', 5) self.assertEqual(self.hashmap.get('Apples'), 5) # Size should increase with added elements self.assertEqual(self.hashmap.size(), 1) # Hashmap should no longer be marked as empty self.assertEqual(self.hashmap.is_empty(), False) # Should still work with multiple items added fruits = [('Oranges', 1), ('Pineapples', 10), ('Mangos', 7), ('Grapefruit', 9), ('Avocado', 53), ('Blueberry', 16), ('Strawberries', 42), ('Cherries', 21), ('Durian', 18), ('Guava', 99), ('Blackberries', 53), ('Cranberries', 42)] self.populate(fruits) # All inputted items should be retrievable for fruit in fruits: self.assertEqual(self.hashmap.get(fruit[0]), fruit[1]) self.assertEqual(self.hashmap.size(), len(fruits) + 1) # Should be able to override pre-existing values self.hashmap.put('Apples', 20) self.assertEqual(self.hashmap.get('Apples'), 20) # Should not increase hashmap size self.assertEqual(self.hashmap.size(), len(fruits) + 1) def test_remove(self): # Should work if hashmap contains only one element in bucket self.hashmap.put('Apples', 15) self.hashmap.remove('Apples') self.assertEqual(self.hashmap.get('Apples'), None) fruits = [('Oranges', 1), ('Bananas', 2), ('Pineapples', 10), ('Mangos', 7)] self.populate(fruits) # Should remove pre-existing element self.hashmap.remove('Bananas') self.assertEqual(self.hashmap.get('Bananas'), None) # Size should decrease self.assertEqual(self.hashmap.size(), len(fruits) - 1) for fruit in fruits: self.hashmap.remove(fruit[0]) # Hash Map should be empty self.assertEqual(self.hashmap.size(), 0) self.assertEqual(self.hashmap.is_empty(), True) def test_resize(self): # Initialize HashMap with Initial Capacity of 4 self.hashmap = HashMap(4) self.assertEqual(self.hashmap.capacity(), 4) fruits = [('Oranges', 1), ('Bananas', 2), ('Pineapples', 10), ('Mangos', 7)] self.populate(fruits) # Hashmap should double in capacity self.assertEqual(self.hashmap.size(), 4) self.assertEqual(self.hashmap.capacity(), 8) # Items should still be accessible for fruit in fruits: self.assertEqual(self.hashmap.get(fruit[0]), fruit[1]) for fruit in fruits: self.hashmap.remove(fruit[0]) # Hashmap should halve in size self.assertEqual(self.hashmap.capacity(), 4) def test_mixed_calls(self): fruits = [('Oranges', 1), ('Pineapples', 10), ('Mangos', 7), ('Grapefruit', 9), ('Avocado', 53), ('Blueberries', 16), ('Strawberries', 42), ('Cherries', 21), ('Durian', 18), ('Guava', 99), ('Blackberries', 53), ('Cranberries', 42)] self.populate(fruits) # Hashmap capacity should increase self.assertEqual(self.hashmap.capacity() > 8, True) fruits_to_remove = {'Grapefruit', 'Cherries', 'Guava', 'Oranges'} # Remove fruits from hashmap for fruit in fruits_to_remove: self.hashmap.remove(fruit) # Checks to make sure they are all deleted self.remove(fruits_to_remove) remaining = len(fruits) - len(fruits_to_remove) self.assertEqual(self.hashmap.size(), remaining) # Make sure all other fruits are still fine for fruit, val in fruits: if fruit in fruits_to_remove: continue self.assertEqual(self.hashmap.get(fruit), val) # Add some more fruits additional_fruits = [('Longan', 32), ('Pomegranate', 82), ('Papaya', 92)] self.populate(additional_fruits) # Size should update accordingly new_size = remaining + len(additional_fruits) self.assertEqual(self.hashmap.size(), new_size) # Updating some existing fruit values updates = [('Papaya', 53), ('Cranberries', 32), ('Durian', 9)] self.populate(updates) # Size should not increase self.assertEqual(self.hashmap.size(), new_size) additional_fruits_to_remove = { 'Longan', 'Pomegranate', 'Papaya', 'Strawberries', 'Blueberries', 'Blackberries', 'Durian', 'Cranberries' } fruits_to_remove = fruits_to_remove.union(additional_fruits_to_remove) self.remove(fruits_to_remove) # Hashmap size should be a quarter of its capacity, capacity should halve self.assertEqual(self.hashmap.capacity(), 8)
def test_empty_map(): hm = HashMap() assert hm.capacity() == 7 assert hm.size() == 0