package org.mockserver.collections; import com.google.common.collect.Sets; import org.junit.Test; import java.util.Arrays; import java.util.HashMap; import static org.junit.Assert.*; /** * @author jamesdbloom */ public class CircularMultiMapTest { @Test public void shouldStoreMultipleValuesAgainstSingleKey() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); // when circularMultiMap.put("1", "1_1"); circularMultiMap.put("1", "1_2"); circularMultiMap.put("1", "1_3"); circularMultiMap.put("2", "2"); // then assertEquals(Arrays.asList("1_1", "1_2", "1_3"), circularMultiMap.getAll("1")); assertEquals(Arrays.asList("2"), circularMultiMap.getAll("2")); assertEquals(Arrays.asList("1", "1", "1", "2"), circularMultiMap.getKeyListForValues()); } @Test public void shouldNotContainMoreThenMaximumNumberOfKeys() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); // when circularMultiMap.put("1", "1"); circularMultiMap.put("2", "2"); circularMultiMap.put("3", "3"); circularMultiMap.put("4", "4"); // then assertEquals(3, circularMultiMap.size()); assertFalse(circularMultiMap.containsKey("1")); assertTrue(circularMultiMap.containsKey("2")); assertTrue(circularMultiMap.containsKey("3")); assertTrue(circularMultiMap.containsKey("4")); assertEquals(Sets.newHashSet("2", "3", "4"), circularMultiMap.keySet()); assertEquals(Arrays.asList("2", "3", "4"), circularMultiMap.getKeyListForValues()); } @Test public void shouldNotAllowAddingMoreThenMaximumNumberOfValuePerKey() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); // when circularMultiMap.put("1", "1"); circularMultiMap.put("1", "2"); circularMultiMap.put("1", "3"); circularMultiMap.put("1", "4"); circularMultiMap.put("1", "5"); circularMultiMap.put("2", "2"); circularMultiMap.put("2", "3"); // then // - should have correct keys assertTrue(circularMultiMap.containsKey("1")); assertTrue(circularMultiMap.containsKey("2")); assertEquals(Sets.newHashSet("1", "2"), circularMultiMap.keySet()); assertEquals(Arrays.asList("1", "1", "1", "2", "2"), circularMultiMap.getKeyListForValues()); // - should have correct values assertFalse(circularMultiMap.containsValue("1")); assertTrue(circularMultiMap.containsValue("2")); assertTrue(circularMultiMap.containsValue("3")); assertTrue(circularMultiMap.containsValue("4")); assertTrue(circularMultiMap.containsValue("5")); assertEquals(Arrays.asList("3", "4", "5", "2", "3"), circularMultiMap.values()); // - should have correct values per key assertEquals("3", circularMultiMap.get("1")); assertEquals("2", circularMultiMap.get("2")); assertEquals(Arrays.asList("3", "4", "5"), circularMultiMap.getAll("1")); assertEquals(Arrays.asList("2", "3"), circularMultiMap.getAll("2")); } @Test public void shouldSupportPuttingAllEntriesInAMap() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); // when circularMultiMap.put("1", "1_1"); circularMultiMap.putAll(new HashMap<String, String>() { private static final long serialVersionUID = -580164440676146851L; { put("1", "1_2"); put("2", "2"); } }); circularMultiMap.put("1", "1_3"); // then assertEquals(Arrays.asList("1_1", "1_2", "1_3"), circularMultiMap.getAll("1")); assertEquals(Arrays.asList("2"), circularMultiMap.getAll("2")); assertEquals(Arrays.asList("1", "1", "1", "2"), circularMultiMap.getKeyListForValues()); } @Test public void shouldIndicateWhenEmpty() { assertTrue(new CircularMultiMap<String, String>(3, 3).isEmpty()); } @Test public void shouldSupportBeingCleared() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); circularMultiMap.put("1", "1_1"); circularMultiMap.put("1", "1_2"); circularMultiMap.put("1", "1_3"); circularMultiMap.put("2", "2"); // when circularMultiMap.clear(); // then assertTrue(circularMultiMap.isEmpty()); assertFalse(circularMultiMap.containsKey("1")); assertFalse(circularMultiMap.containsKey("2")); assertFalse(circularMultiMap.containsValue("1_2")); assertFalse(circularMultiMap.containsValue("2")); assertEquals(Arrays.asList(), circularMultiMap.getKeyListForValues()); } @Test public void shouldReturnEntrySet() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); // when circularMultiMap.put("1", "1_1"); circularMultiMap.put("1", "1_2"); circularMultiMap.put("1", "1_3"); circularMultiMap.put("2", "2"); // then assertEquals(Sets.newHashSet( new CircularMultiMap.ImmutableEntry[]{ circularMultiMap.new ImmutableEntry("1", "1_1"), circularMultiMap.new ImmutableEntry("1", "1_2"), circularMultiMap.new ImmutableEntry("1", "1_3"), circularMultiMap.new ImmutableEntry("2", "2") }), circularMultiMap.entrySet()); assertEquals(Arrays.asList("1", "1", "1", "2"), circularMultiMap.getKeyListForValues()); } @Test public void shouldCorrectlyConstructAndGetEntryValue() { // when CircularMultiMap.ImmutableEntry immutableEntry = new CircularMultiMap<String, String>(3, 3).new ImmutableEntry("key", "value"); // then assertEquals(immutableEntry.getKey(), "key"); assertEquals(immutableEntry.getValue(), "value"); } @Test(expected = UnsupportedOperationException.class) public void shouldNotAllowImmutableEntryToBeModified() { new CircularMultiMap<String, String>(3, 3).new ImmutableEntry("key", "value").setValue("new_value"); } @Test public void shouldSupportRemovingAllValues() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); circularMultiMap.put("1", "1_1"); circularMultiMap.put("1", "1_2"); circularMultiMap.put("1", "1_3"); circularMultiMap.put("2", "2"); // when assertEquals(Arrays.asList("1_1", "1_2", "1_3"), circularMultiMap.removeAll("1")); assertNull(circularMultiMap.removeAll("3")); // then // - should have correct keys assertFalse(circularMultiMap.containsKey("1")); assertTrue(circularMultiMap.containsKey("2")); assertEquals(Sets.newHashSet("2"), circularMultiMap.keySet()); assertEquals(Arrays.asList("2"), circularMultiMap.getKeyListForValues()); // - should have correct values assertFalse(circularMultiMap.containsValue("1_1")); assertFalse(circularMultiMap.containsValue("1_2")); assertFalse(circularMultiMap.containsValue("1_3")); assertTrue(circularMultiMap.containsValue("2")); assertEquals(Arrays.asList("2"), circularMultiMap.values()); // - should have correct values per key assertNull(circularMultiMap.get("1")); assertEquals("2", circularMultiMap.get("2")); assertEquals(0, circularMultiMap.getAll("1").size()); assertEquals(Arrays.asList("2"), circularMultiMap.getAll("2")); } @Test public void shouldSupportRemovingAValue() { // given CircularMultiMap<String, String> circularMultiMap = new CircularMultiMap<String, String>(3, 3); circularMultiMap.put("1", "1_1"); circularMultiMap.put("1", "1_2"); circularMultiMap.put("1", "1_3"); circularMultiMap.put("2", "2"); // when assertEquals("1_1", circularMultiMap.remove("1")); assertNull(circularMultiMap.remove("3")); // then // - should have correct keys assertTrue(circularMultiMap.containsKey("1")); assertTrue(circularMultiMap.containsKey("2")); assertEquals(Sets.newHashSet("1", "2"), circularMultiMap.keySet()); assertEquals(Arrays.asList("1", "1", "2"), circularMultiMap.getKeyListForValues()); // - should have correct values assertFalse(circularMultiMap.containsValue("1_1")); assertTrue(circularMultiMap.containsValue("1_2")); assertTrue(circularMultiMap.containsValue("1_3")); assertTrue(circularMultiMap.containsValue("2")); assertEquals(Arrays.asList("1_2", "1_3", "2"), circularMultiMap.values()); // - should have correct values per key assertEquals("1_2", circularMultiMap.get("1")); assertEquals("2", circularMultiMap.get("2")); assertEquals(Arrays.asList("1_2", "1_3"), circularMultiMap.getAll("1")); assertEquals(Arrays.asList("2"), circularMultiMap.getAll("2")); } }