test: add comprehensive MyHashMap tests
This commit is contained in:
@@ -118,4 +118,202 @@ class MyHashMapTest {
|
||||
assertEquals(100, map.remove(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