package org.eclipse.jetty.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Test; public class MultiMapTest { /** * Tests {@link MultiMap#put(Object, Object)} */ @Test public void testPut() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); } /** * Tests {@link MultiMap#put(Object, Object)} */ @Test public void testPut_Null() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; mm.put(key,null); assertMapSize(mm,1); assertValues(mm,key,new Object[] { null }); } /** * Tests {@link MultiMap#put(Object, Object)} */ @Test public void testPut_Replace() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; Object ret; ret = mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); Assert.assertNull("Should not have replaced anything", ret); Object orig = mm.get(key); // Now replace it ret = mm.put(key,"jar"); assertMapSize(mm,1); assertValues(mm,key,"jar"); Assert.assertEquals("Should have replaced original", orig, ret); } /** * Tests {@link MultiMap#putValues(Object, List)} */ @Test public void testPutValues_List() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; List<String> input = new ArrayList<String>(); input.add("gzip"); input.add("jar"); input.add("pack200"); mm.putValues(key,input); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); } /** * Tests {@link MultiMap#putValues(Object, String...)} */ @Test public void testPutValues_StringArray() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; String input[] = { "gzip", "jar", "pack200" }; mm.putValues(key,input); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); } /** * Tests {@link MultiMap#putValues(Object, String...)} */ @Test public void testPutValues_VarArgs() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; mm.putValues(key,"gzip", "jar", "pack200"); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); } /** * Tests {@link MultiMap#add(Object, Object)} */ @Test public void testAdd() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); // Add to the key mm.add(key,"jar"); mm.add(key,"pack200"); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); } /** * Tests {@link MultiMap#addValues(Object, List)} */ @Test public void testAddValues_List() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); // Add to the key List<String> extras = new ArrayList<String>(); extras.add("jar"); extras.add("pack200"); extras.add("zip"); mm.addValues(key,extras); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200","zip"); } /** * Tests {@link MultiMap#addValues(Object, List)} */ @Test public void testAddValues_List_Empty() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); // Add to the key List<String> extras = new ArrayList<String>(); mm.addValues(key,extras); assertMapSize(mm,1); assertValues(mm,key,"gzip"); } /** * Tests {@link MultiMap#addValues(Object, String[])} */ @Test public void testAddValues_StringArray() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); // Add to the key String extras[] = { "jar", "pack200", "zip" }; mm.addValues(key,extras); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200","zip"); } /** * Tests {@link MultiMap#addValues(Object, String[])} */ @Test public void testAddValues_StringArray_Empty() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); // Add to the key String extras[] = new String[0]; mm.addValues(key,extras); assertMapSize(mm,1); assertValues(mm,key,"gzip"); } /** * Tests {@link MultiMap#removeValue(Object, Object)} */ @Test public void testRemoveValue() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.putValues(key,"gzip","jar","pack200"); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); // Remove a value mm.removeValue(key,"jar"); assertMapSize(mm,1); assertValues(mm,key,"gzip","pack200"); } /** * Tests {@link MultiMap#removeValue(Object, Object)} */ @Test public void testRemoveValue_InvalidItem() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.putValues(key,"gzip","jar","pack200"); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); // Remove a value that isn't there mm.removeValue(key,"msi"); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); } /** * Tests {@link MultiMap#removeValue(Object, Object)} */ @Test public void testRemoveValue_AllItems() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.putValues(key,"gzip","jar","pack200"); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); // Remove a value mm.removeValue(key,"jar"); assertMapSize(mm,1); assertValues(mm,key,"gzip","pack200"); // Remove another value mm.removeValue(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"pack200"); // Remove last value mm.removeValue(key,"pack200"); assertMapSize(mm,0); // should be empty now } /** * Tests {@link MultiMap#removeValue(Object, Object)} */ @Test public void testRemoveValue_FromEmpty() { MultiMap<String> mm = new MultiMap<String>(); String key = "formats"; // Setup the key mm.putValues(key,new String[0]); assertMapSize(mm,1); assertEmptyValues(mm,key); // Remove a value that isn't in the underlying values mm.removeValue(key,"jar"); assertMapSize(mm,1); assertEmptyValues(mm,key); } /** * Tests {@link MultiMap#putAll(java.util.Map)} */ @Test public void testPutAll_Map() { MultiMap<String> mm = new MultiMap<String>(); assertMapSize(mm,0); // Shouldn't have anything yet. Map<String,String> input = new HashMap<String,String>(); input.put("food","apple"); input.put("color","red"); input.put("amount","bushel"); mm.putAll(input); assertMapSize(mm,3); assertValues(mm,"food","apple"); assertValues(mm,"color","red"); assertValues(mm,"amount","bushel"); } /** * Tests {@link MultiMap#putAll(java.util.Map)} */ @Test public void testPutAll_MultiMap_Simple() { MultiMap<String> mm = new MultiMap<String>(); assertMapSize(mm,0); // Shouldn't have anything yet. MultiMap<String> input = new MultiMap<String>(); input.put("food","apple"); input.put("color","red"); input.put("amount","bushel"); mm.putAll(input); assertMapSize(mm,3); assertValues(mm,"food","apple"); assertValues(mm,"color","red"); assertValues(mm,"amount","bushel"); } /** * Tests {@link MultiMap#putAll(java.util.Map)} */ @Test public void testPutAll_MultiMapComplex() { MultiMap<String> mm = new MultiMap<String>(); assertMapSize(mm,0); // Shouldn't have anything yet. MultiMap<String> input = new MultiMap<String>(); input.putValues("food","apple","cherry","raspberry"); input.put("color","red"); input.putValues("amount","bushel","pint"); mm.putAll(input); assertMapSize(mm,3); assertValues(mm,"food","apple","cherry","raspberry"); assertValues(mm,"color","red"); assertValues(mm,"amount","bushel","pint"); } /** * Tests {@link MultiMap#toStringArrayMap()} */ @Test public void testToStringArrayMap() { MultiMap<String> mm = new MultiMap<String>(); mm.putValues("food","apple","cherry","raspberry"); mm.put("color","red"); mm.putValues("amount","bushel","pint"); assertMapSize(mm,3); Map<String,String[]> sam = mm.toStringArrayMap(); Assert.assertEquals("String Array Map.size",3,sam.size()); assertArray("toStringArrayMap(food)", sam.get("food"), "apple","cherry","raspberry"); assertArray("toStringArrayMap(color)", sam.get("color"), "red"); assertArray("toStringArrayMap(amount)", sam.get("amount"), "bushel","pint"); } /** * Tests {@link MultiMap#toString()} */ @Test public void testToString() { MultiMap<String> mm = new MultiMap<String>(); mm.put("color","red"); Assert.assertEquals("{color=red}", mm.toString()); mm.putValues("food","apple","cherry","raspberry"); Assert.assertEquals("{color=red, food=[apple, cherry, raspberry]}", mm.toString()); } /** * Tests {@link MultiMap#clear()} */ @Test public void testClear() { MultiMap<String> mm = new MultiMap<String>(); mm.putValues("food","apple","cherry","raspberry"); mm.put("color","red"); mm.putValues("amount","bushel","pint"); assertMapSize(mm,3); mm.clear(); assertMapSize(mm,0); } /** * Tests {@link MultiMap#containsKey(Object)} */ @Test public void testContainsKey() { MultiMap<String> mm = new MultiMap<String>(); mm.putValues("food","apple","cherry","raspberry"); mm.put("color","red"); mm.putValues("amount","bushel","pint"); Assert.assertTrue("Contains Key [color]", mm.containsKey("color")); Assert.assertFalse("Contains Key [nutrition]", mm.containsKey("nutrition")); } /** * Tests {@link MultiMap#containsValue(Object)} */ @Test public void testContainsValue() { MultiMap<String> mm = new MultiMap<String>(); mm.putValues("food","apple","cherry","raspberry"); mm.put("color","red"); mm.putValues("amount","bushel","pint"); Assert.assertTrue("Contains Value [red]", mm.containsValue("red")); Assert.assertFalse("Contains Value [nutrition]", mm.containsValue("nutrition")); } /** * Tests {@link MultiMap#containsValue(Object)} */ @Test public void testContainsValue_LazyList() { MultiMap<String> mm = new MultiMap<String>(); mm.putValues("food","apple","cherry","raspberry"); mm.put("color","red"); mm.putValues("amount","bushel","pint"); Object list = LazyList.add(null, "bushel"); list = LazyList.add(list, "pint"); Assert.assertTrue("Contains Value [" + list + "]", mm.containsValue(list)); } private void assertArray(String prefix, Object[] actualValues, Object ...expectedValues) { Assert.assertEquals(prefix + ".size",expectedValues.length,actualValues.length); int len = actualValues.length; for (int i = 0; i < len; i++) { Assert.assertEquals(prefix + "[" + i + "]",expectedValues[i],actualValues[i]); } } private void assertValues(MultiMap<String> mm, String key, Object... expectedValues) { List<Object> values = mm.getValues(key); String prefix = "MultiMap.getValues(" + key + ")"; Assert.assertNotNull(prefix,values); Assert.assertEquals(prefix + ".size",expectedValues.length,values.size()); int len = values.size(); for (int i = 0; i < len; i++) { Assert.assertEquals(prefix + "[" + i + "]",expectedValues[i],values.get(i)); } } private void assertEmptyValues(MultiMap<String> mm, String key) { List<Object> values = mm.getValues(key); String prefix = "MultiMap.getValues(" + key + ")"; Assert.assertEquals(prefix + ".size",0,LazyList.size(values)); } private void assertMapSize(MultiMap<String> mm, int expectedSize) { Assert.assertEquals("MultiMap.size",expectedSize,mm.size()); } }