Jelajahi Sumber

MultiHashMap - test
fix: MultiHashMap#removeFirst/Last/Item - remove key if last value removed

Ranides Atterwim 11 tahun lalu
induk
melakukan
bfa2a0cafc

+ 24 - 8
src/main/java/net/ranides/assira/collection/map/MultiHashMap.java

@@ -129,35 +129,51 @@ public class MultiHashMap<K,V> extends HashMap<K, Collection<V>> implements Mult
     @Override
     public V removeFirst(K key) {
         Collection<V> list = get(key);
-        if( null == list || list.isEmpty() ) { return null; }
+        if( null == list || list.isEmpty() ) { 
+			return null; 
+		}
         Iterator<V> iterator = list.iterator();
         V result = iterator.next();
-        iterator.remove();
+		if(1 == list.size()) {
+			remove(key);
+		} else {
+			iterator.remove();
+		}
         return result;
     }
 
     @Override
     public V removeLast(K key) {
         Collection<V> elements = get(key);
-        if( null == elements || elements.isEmpty() ) { return null; }
-        
+        if( null == elements || elements.isEmpty() ) { 
+			return null; 
+		}
+		V result = null;
         if (elements instanceof List) {
             List<V> list = (List<V>) elements;
-            return list.remove(list.size()-1);
+            result = list.remove(list.size()-1);
         } else {
             Iterator<V> iterator = elements.iterator();
-            V result = null;
             while(iterator.hasNext()) { result = iterator.next(); }
             iterator.remove();
-            return result;
         }
+		if(elements.isEmpty()) {
+			remove(key);
+		}
+		return result;
     }
 
     @Override
     public boolean removeItem(K key, V value) {
         Collection<V> list = get(key);
         if( null == list || list.isEmpty() ) { return false; }
-        return list.remove(value);
+        if(!list.remove(value)) {
+			return false;
+		}
+		if(list.isEmpty()) {
+			remove(key);
+		}
+		return true;
     }
 
     @Override

+ 70 - 6
src/test/java/net/ranides/assira/collection/map/MultiHashMapTest.java

@@ -7,15 +7,9 @@
 package net.ranides.assira.collection.map;
 
 import java.io.IOException;
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import net.ranides.assira.generic.Serializer;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import static org.junit.Assert.*;
 /**
@@ -54,4 +48,74 @@ public class MultiHashMapTest {
 		
 		assertEquals(imap, mmap);
 	}
+	
+	@Test
+	public void testPutItems() {
+		MultiHashMap<Integer, Integer> map1 = new MultiHashMap<>();
+		map1.putItem(1, 1000);
+		map1.putItem(1, 1001);
+		map1.putItem(1, 1002);
+		map1.putItem(2, 2000);
+		map1.putItem(3, 3000);
+		
+		Map<Integer, Integer> map2 = new HashMap<>();
+		map2.put(1, 60);
+		map2.put(5, 5000);
+				
+		MultiHashMap<Integer, Integer> map3 = new MultiHashMap<>();
+		map3.putItem(1, 70);
+		map3.putItem(1, 71);
+		map3.putItem(1, 71);
+		map3.putItem(1, 1000);
+		map3.putItem(6, 4000);
+		
+		MultiHashMap<Integer, Integer> omap = new MultiHashMap<>();
+		omap.putItems(map1);
+		omap.putItems(map2);
+		omap.putItems(map3);
+		
+		assertEquals(10, omap.multiSize());
+		assertEquals(5, omap.size());
+		
+		assertTrue(omap.containsItem(70));
+		assertTrue(omap.containsItem(1000));
+		assertTrue(omap.containsItem(5000));
+		assertFalse(omap.containsItem(10));
+	}
+	
+	@Test
+	public void testRemove() {
+		MultiHashMap<Integer, Integer> omap = new MultiHashMap<>();
+		omap.putItem(1, 10);
+		omap.putItem(1, 11);
+		omap.putItem(1, 12);
+		omap.putItem(2, 20);
+		omap.putItem(2, 21);
+		omap.putItem(3, 30);
+		
+		assertNull(omap.removeFirst(7));
+		
+		Integer v1 = omap.getLast(2);
+		assertEquals(v1, omap.removeLast(2));
+		
+		Integer v2 = omap.getFirst(1);
+		assertEquals(v2, omap.removeFirst(1));
+		
+		assertTrue( omap.containsKey(2) );
+		omap.removeFirst(2);
+		assertFalse( omap.containsKey(2) );
+		assertNull( omap.getFirst(2) );
+		
+		assertTrue( omap.containsKey(1) );
+		omap.removeLast(1);
+		omap.removeLast(1);
+		assertFalse( omap.containsKey(1) );
+		assertNull( omap.getFirst(1) );
+		
+		assertTrue(omap.containsKey(3));
+		assertFalse(omap.removeItem(3, 100));
+		assertTrue(omap.containsKey(3));
+		assertTrue(omap.removeItem(3, 30));
+		assertFalse(omap.containsKey(3));
+	}
 }