test: add comprehensive MyHashMap tests
This commit is contained in:
@@ -118,4 +118,202 @@ class MyHashMapTest {
|
|||||||
assertEquals(100, map.remove(null));
|
assertEquals(100, map.remove(null));
|
||||||
assertNull(map.get(null));
|
assertNull(map.get(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldHandleNullValue() {
|
||||||
|
MyHashMap<String, Integer> 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<String, Integer> map = new MyHashMap<>(4);
|
||||||
|
|
||||||
|
map.put("A", 10);
|
||||||
|
|
||||||
|
assertEquals(10, map.put("A", null));
|
||||||
|
assertNull(map.get("A"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldRemoveMiddleElementFromCollisionChain() {
|
||||||
|
MyHashMap<Integer, String> 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<Integer, String> 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<String, Integer> 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<Integer, String> 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<Integer, String> 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<Integer, String> 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<Integer, String> 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<Integer, String> 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<String, Integer> 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<Integer, String> 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<Integer, String> 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<String, Integer> 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"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user