/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.marketdata;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.core.Is.is;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.opengamma.util.test.TestGroup;
@Test(groups = TestGroup.UNIT)
public class BidirectionalMultiMapTest {
private BidirectionalMultiMap<String, Integer> _bidirectionalMultiMap;
@BeforeMethod
public void setUp() {
_bidirectionalMultiMap = new BidirectionalMultiMap<>();
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullKeysProhibited() {
_bidirectionalMultiMap.put(null, 42);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullValuesProhibited() {
_bidirectionalMultiMap.put("forty two", null);
}
@Test
public void testValuesAreAccumulated() {
_bidirectionalMultiMap.put("A", 1);
_bidirectionalMultiMap.put("A", 2);
_bidirectionalMultiMap.put("A", 3);
assertThat(_bidirectionalMultiMap.get("A"), containsInAnyOrder(1, 2, 3));
}
@Test
public void testDuplicateEntryIsIgnored() {
_bidirectionalMultiMap.put("A", 1);
_bidirectionalMultiMap.put("A", 2);
_bidirectionalMultiMap.put("A", 2);
assertThat(_bidirectionalMultiMap.get("A"), containsInAnyOrder(1, 2));
}
@Test
public void testGetWithNullKeyReturnsEmpty() {
assertThat(_bidirectionalMultiMap.get(null).isEmpty(), is(true));
}
@Test
public void testMappingsAndInversesAreHeld() {
_bidirectionalMultiMap.put("A", 1);
_bidirectionalMultiMap.put("A", 2);
_bidirectionalMultiMap.put("A", 3);
_bidirectionalMultiMap.put("B", 2);
_bidirectionalMultiMap.put("B", 3);
_bidirectionalMultiMap.put("C", 3);
assertThat(_bidirectionalMultiMap.get("A"), containsInAnyOrder(1, 2, 3));
assertThat(_bidirectionalMultiMap.get("B"), containsInAnyOrder(2, 3));
assertThat(_bidirectionalMultiMap.get("C"), containsInAnyOrder(3));
assertThat(_bidirectionalMultiMap.inverse().get(1), containsInAnyOrder("A"));
assertThat(_bidirectionalMultiMap.inverse().get(2), containsInAnyOrder("A", "B"));
assertThat(_bidirectionalMultiMap.inverse().get(3), containsInAnyOrder("A", "B", "C"));
}
@Test
public void testContainsKey() {
_bidirectionalMultiMap.put("A", 1);
_bidirectionalMultiMap.put("A", 2);
_bidirectionalMultiMap.put("A", 3);
_bidirectionalMultiMap.put("B", 2);
_bidirectionalMultiMap.put("B", 3);
_bidirectionalMultiMap.put("C", 3);
assertThat(_bidirectionalMultiMap.containsKey("A"), is(true));
assertThat(_bidirectionalMultiMap.containsKey("Z"), is(false));
assertThat(_bidirectionalMultiMap.containsKey(null), is(false));
assertThat(_bidirectionalMultiMap.inverse().containsKey(1), is(true));
assertThat(_bidirectionalMultiMap.inverse().containsKey(3), is(true));
assertThat(_bidirectionalMultiMap.inverse().containsKey(99), is(false));
}
@Test
public void testKeysAreHeld() {
_bidirectionalMultiMap.put("A", 1);
_bidirectionalMultiMap.put("A", 2);
_bidirectionalMultiMap.put("A", 3);
_bidirectionalMultiMap.put("B", 2);
_bidirectionalMultiMap.put("B", 3);
_bidirectionalMultiMap.put("C", 3);
assertThat(_bidirectionalMultiMap.keySet(), containsInAnyOrder("A", "B", "C"));
assertThat(_bidirectionalMultiMap.inverse().keySet(), containsInAnyOrder(1, 2, 3));
}
@Test
public void testRemoval() {
_bidirectionalMultiMap.put("A", 1);
_bidirectionalMultiMap.put("A", 2);
_bidirectionalMultiMap.put("A", 3);
_bidirectionalMultiMap.put("B", 2);
_bidirectionalMultiMap.put("B", 3);
_bidirectionalMultiMap.put("C", 3);
assertThat(_bidirectionalMultiMap.size(), is(6));
assertThat(_bidirectionalMultiMap.containsKey("A"), is(true));
assertThat(_bidirectionalMultiMap.inverse().containsKey(1), is(true));
assertThat(_bidirectionalMultiMap.get("A"), containsInAnyOrder(1, 2, 3));
assertThat(_bidirectionalMultiMap.inverse().get(1), containsInAnyOrder("A"));
_bidirectionalMultiMap.remove("A", 1);
assertThat(_bidirectionalMultiMap.size(), is(5));
assertThat(_bidirectionalMultiMap.containsKey("A"), is(true));
assertThat(_bidirectionalMultiMap.inverse().containsKey(1), is(false));
assertThat(_bidirectionalMultiMap.get("A"), containsInAnyOrder(2, 3));
assertThat(_bidirectionalMultiMap.inverse().get(1).isEmpty(), is(true));
}
@Test
public void testRemovalOfNonExistentElementDoesNothing() {
_bidirectionalMultiMap.put("A", 1);
_bidirectionalMultiMap.put("A", 2);
_bidirectionalMultiMap.put("A", 3);
_bidirectionalMultiMap.put("B", 2);
_bidirectionalMultiMap.put("B", 3);
_bidirectionalMultiMap.put("C", 3);
assertThat(_bidirectionalMultiMap.size(), is(6));
_bidirectionalMultiMap.remove("A", 99);
_bidirectionalMultiMap.remove("Z", 1);
_bidirectionalMultiMap.remove("Z", 99);
assertThat(_bidirectionalMultiMap.size(), is(6));
}
@Test
public void testInverseOfInverseIsOriginal() {
// Want to test reference equality
assertThat(_bidirectionalMultiMap.inverse().inverse() == _bidirectionalMultiMap, is(true));
}
@Test
public void testInverseOfInverseOfInverseIsInverse() {
// Want to test reference equality
assertThat(_bidirectionalMultiMap.inverse() == _bidirectionalMultiMap.inverse().inverse().inverse(), is(true));
}
}