diff --git a/second-part/hw-01/src/app/src/test/java/org/example/MyHashMapTest.java b/second-part/hw-01/src/app/src/test/java/org/example/MyHashMapTest.java index 18866e8..ee35923 100644 --- a/second-part/hw-01/src/app/src/test/java/org/example/MyHashMapTest.java +++ b/second-part/hw-01/src/app/src/test/java/org/example/MyHashMapTest.java @@ -118,4 +118,202 @@ class MyHashMapTest { assertEquals(100, map.remove(null)); assertNull(map.get(null)); } + + @Test + void shouldHandleNullValue() { + MyHashMap map = new MyHashMap<>(4); + + assertNull(map.put("A", null)); + assertNull(map.get("A")); + + assertNull(map.put("A", 10)); + assertEquals(10, map.get("A")); + } + + @Test + void shouldUpdateNullValue() { + MyHashMap map = new MyHashMap<>(4); + + map.put("A", 10); + + assertEquals(10, map.put("A", null)); + assertNull(map.get("A")); + } + + @Test + void shouldRemoveMiddleElementFromCollisionChain() { + MyHashMap map = new MyHashMap<>(4); + + map.put(1, "A"); + map.put(5, "B"); + map.put(9, "C"); + + assertEquals("B", map.remove(5)); + + assertEquals("A", map.get(1)); + assertNull(map.get(5)); + assertEquals("C", map.get(9)); + } + + @Test + void shouldRemoveLastElementFromCollisionChain() { + MyHashMap map = new MyHashMap<>(4); + + map.put(1, "A"); + map.put(5, "B"); + map.put(9, "C"); + + assertEquals("C", map.remove(9)); + + assertEquals("A", map.get(1)); + assertEquals("B", map.get(5)); + assertNull(map.get(9)); + } + + @Test + void shouldReinsertRemovedKey() { + MyHashMap map = new MyHashMap<>(4); + + map.put("A", 10); + assertEquals(10, map.remove("A")); + + assertNull(map.get("A")); + assertNull(map.put("A", 20)); + assertEquals(20, map.get("A")); + } + + @Test + void shouldKeepCollidingEntriesAfterRemovingFirst() { + MyHashMap map = new MyHashMap<>(4); + + map.put(1, "A"); + map.put(5, "B"); + map.put(9, "C"); + + map.remove(1); + + assertEquals("B", map.get(5)); + assertEquals("C", map.get(9)); + } + + @Test + void shouldKeepCollidingEntriesAfterRemovingMiddle() { + MyHashMap map = new MyHashMap<>(4); + + map.put(1, "A"); + map.put(5, "B"); + map.put(9, "C"); + map.put(13, "D"); + + map.remove(5); + + assertEquals("A", map.get(1)); + assertEquals("C", map.get(9)); + assertEquals("D", map.get(13)); + } + + @Test + void shouldHandleManyCollisions() { + MyHashMap map = new MyHashMap<>(2); + + map.put(1, "A"); + map.put(3, "B"); + map.put(5, "C"); + map.put(7, "D"); + map.put(9, "E"); + + assertEquals("A", map.get(1)); + assertEquals("B", map.get(3)); + assertEquals("C", map.get(5)); + assertEquals("D", map.get(7)); + assertEquals("E", map.get(9)); + } + + @Test + void shouldResizeAndKeepCollisions() { + MyHashMap map = new MyHashMap<>(2); + + map.put(1, "A"); + map.put(3, "B"); + map.put(5, "C"); + map.put(7, "D"); + map.put(9, "E"); + map.put(11, "F"); + + assertEquals("A", map.get(1)); + assertEquals("B", map.get(3)); + assertEquals("C", map.get(5)); + assertEquals("D", map.get(7)); + assertEquals("E", map.get(9)); + assertEquals("F", map.get(11)); + } + + @Test + void shouldUpdateCollidingKey() { + MyHashMap map = new MyHashMap<>(4); + + map.put(1, "A"); + map.put(5, "B"); + map.put(9, "C"); + + assertEquals("B", map.put(5, "NEW")); + + assertEquals("A", map.get(1)); + assertEquals("NEW", map.get(5)); + assertEquals("C", map.get(9)); + } + + @Test + void shouldHandleEqualButDifferentStringInstances() { + MyHashMap map = new MyHashMap<>(4); + + map.put(new String("A"), 10); + + assertEquals(10, map.get(new String("A"))); + assertEquals(10, map.remove(new String("A"))); + } + + @Test + void shouldNotAffectOtherKeysWhenUpdating() { + MyHashMap map = new MyHashMap<>(4); + + map.put(1, "A"); + map.put(2, "B"); + map.put(3, "C"); + + map.put(2, "UPDATED"); + + assertEquals("A", map.get(1)); + assertEquals("UPDATED", map.get(2)); + assertEquals("C", map.get(3)); + } + + @Test + void shouldNotFindKeyAfterRemoveAndResize() { + MyHashMap map = new MyHashMap<>(2); + + map.put(1, "A"); + map.put(2, "B"); + map.put(3, "C"); + map.put(4, "D"); + + map.remove(2); + + assertNull(map.get(2)); + assertEquals("A", map.get(1)); + assertEquals("C", map.get(3)); + assertEquals("D", map.get(4)); + } + + @Test + void shouldHandleRepeatedPutAndRemove() { + MyHashMap map = new MyHashMap<>(4); + + for (int i = 0; i < 100; i++) { + assertNull(map.put("A", i)); + assertEquals(i, map.get("A")); + assertEquals(i, map.remove("A")); + assertNull(map.get("A")); + } + } }