// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.util; import static org.hamcrest.Matchers.nullValue; 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 key = "formats"; mm.put(key,"gzip"); assertMapSize(mm,1); assertValues(mm,key,"gzip"); } /** * Tests {@link MultiMap#put(Object, Object)} */ @Test public void testPut_Null_String() { MultiMap<String> mm = new MultiMap<>(); String key = "formats"; String val = null; mm.put(key,val); assertMapSize(mm,1); assertNullValues(mm,key); } /** * Tests {@link MultiMap#put(Object, Object)} */ @Test public void testPut_Null_List() { MultiMap<String> mm = new MultiMap<>(); String key = "formats"; List<String> vals = null; mm.put(key,vals); assertMapSize(mm,1); assertNullValues(mm,key); } /** * Tests {@link MultiMap#put(Object, Object)} */ @Test public void testPut_Replace() { MultiMap<String> mm = new MultiMap<>(); 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(String, List)} */ @Test public void testPutValues_List() { MultiMap<String> mm = new MultiMap<>(); 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(String, Object[])} */ @Test public void testPutValues_StringArray() { MultiMap<String> mm = new MultiMap<>(); 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(String, List)} */ @Test public void testPutValues_VarArgs() { MultiMap<String> mm = new MultiMap<>(); String key = "formats"; mm.putValues(key,"gzip", "jar", "pack200"); assertMapSize(mm,1); assertValues(mm,key,"gzip","jar","pack200"); } /** * Tests {@link MultiMap#add(String, Object)} */ @Test public void testAdd() { MultiMap<String> mm = new MultiMap<>(); 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(String, List)} */ @Test public void testAddValues_List() { MultiMap<String> mm = new MultiMap<>(); 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(String, List)} */ @Test public void testAddValues_List_Empty() { MultiMap<String> mm = new MultiMap<>(); 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(String, Object[])} */ @Test public void testAddValues_StringArray() { MultiMap<String> mm = new MultiMap<>(); 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(String, Object[])} */ @Test public void testAddValues_StringArray_Empty() { MultiMap<String> mm = new MultiMap<>(); 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(String, Object)} */ @Test public void testRemoveValue() { MultiMap<String> mm = new MultiMap<>(); 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(String, Object)} */ @Test public void testRemoveValue_InvalidItem() { MultiMap<String> mm = new MultiMap<>(); 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(String, Object)} */ @Test public void testRemoveValue_AllItems() { MultiMap<String> mm = new MultiMap<>(); 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(String, Object)} */ @Test public void testRemoveValue_FromEmpty() { MultiMap<String> mm = new MultiMap<>(); 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<>(); 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.putAllValues(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<>(); assertMapSize(mm,0); // Shouldn't have anything yet. MultiMap<String> input = new MultiMap<>(); 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<>(); assertMapSize(mm,0); // Shouldn't have anything yet. MultiMap<String> input = new MultiMap<>(); 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<>(); 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<>(); 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<>(); 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<>(); 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#containsSimpleValue(Object)} */ @Test public void testContainsSimpleValue() { MultiMap<String> mm = new MultiMap<>(); mm.putValues("food","apple","cherry","raspberry"); mm.put("color","red"); mm.putValues("amount","bushel","pint"); Assert.assertTrue("Contains Value [red]", mm.containsSimpleValue("red")); Assert.assertFalse("Contains Value [nutrition]", mm.containsValue("nutrition")); } /** * Tests {@link MultiMap#containsValue(Object)} */ @Test public void testContainsValue() { MultiMap<String> mm = new MultiMap<>(); mm.putValues("food","apple","cherry","raspberry"); mm.put("color","red"); mm.putValues("amount","bushel","pint"); List<String> acr = new ArrayList<>(); acr.add("apple"); acr.add("cherry"); acr.add("raspberry"); Assert.assertTrue("Contains Value [apple,cherry,raspberry]", mm.containsValue(acr)); Assert.assertFalse("Contains Value [nutrition]", mm.containsValue("nutrition")); } /** * Tests {@link MultiMap#containsValue(Object)} */ @Test public void testContainsValue_LazyList() { MultiMap<String> mm = new MultiMap<>(); 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<String> values = mm.getValues(key); String prefix = "MultiMap.getValues(" + key + ")"; Assert.assertEquals(prefix + ".size",expectedValues.length,values.size()); int len = expectedValues.length; for (int i = 0; i < len; i++) { if(expectedValues[i] == null) { Assert.assertThat(prefix + "[" + i + "]",values.get(i),nullValue()); } else { Assert.assertEquals(prefix + "[" + i + "]",expectedValues[i],values.get(i)); } } } private void assertNullValues(MultiMap<String> mm, String key) { List<String> values = mm.getValues(key); String prefix = "MultiMap.getValues(" + key + ")"; Assert.assertThat(prefix + ".size",values,nullValue()); } private void assertEmptyValues(MultiMap<String> mm, String key) { List<String> 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()); } }