package com.opengamma.sesame;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.opengamma.util.test.TestGroup;
/**
* Tests {@link EngineTestUtils#compareMaps(Map, Map)}.
*/
@Test(groups= TestGroup.UNIT)
public class MapCompareTest {
@Test
public void equal() {
Map<Object, Object> m = map("a", 1, "b", 2);
assertTrue(EngineTestUtils.compareMaps(m, m).isEmpty());
}
@Test
public void equalNestedMaps() {
Map<Object, Object> m = map("a", map("b", 2, "c", map("d", 4)));
assertTrue(EngineTestUtils.compareMaps(m, m).isEmpty());
}
@Test
public void equalLists() {
Map<Object, Object> m = map("a", list(1, 2, 3), "b", list(2, 3, 4), "c", list(map("d", 4, "e", 5)));
assertTrue(EngineTestUtils.compareMaps(m, m).isEmpty());
}
@Test
public void differentMaps() {
Map<Object, Object> m1 = map("a", 1, "b", 2);
Map<Object, Object> m2 = map("a", 1, "b", 3);
List<Object> expected = list(diff(2, 3, "b"));
assertEquals(expected, EngineTestUtils.compareMaps(m1, m2));
}
@Test
public void differentNestedMaps() {
Map<Object, Object> m1 = map("a", 1, "b", map("c", 3));
Map<Object, Object> m2 = map("a", 1, "b", map("c", 4));
List<Object> expected = list(diff(3, 4, "b", "c"));
assertEquals(expected, EngineTestUtils.compareMaps(m1, m2));
}
@Test
public void multipleDifferences() {
Map<Object, Object> m1 = map("a", 1, "b", map("c", 3), "d", map("e", 6));
Map<Object, Object> m2 = map("a", 1, "b", map("c", 4), "d", map("e", 5));
List<Object> expected = list(diff(3, 4, "b", "c"), diff(6, 5, "d", "e"));
assertEquals(expected, EngineTestUtils.compareMaps(m1, m2));
}
@Test
public void missingMapValues() {
Map<Object, Object> m1 = map("a", 1, "b", 2);
Map<Object, Object> m2 = map("a", 1);
List<Object> expected = list(diff(2, null, "b"));
assertEquals(expected, EngineTestUtils.compareMaps(m1, m2));
}
@Test
public void differentLengthLists() {
Map<Object, Object> m1 = map("a", list(1, 2, 3));
Map<Object, Object> m2 = map("a", list(1, 2));
List<Object> expected = list(diff(3, null, "a", 2));
assertEquals(expected, EngineTestUtils.compareMaps(m1, m2));
}
private static Map<Object, Object> map(Object... keyVals) {
ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder();
for (int i = 0; i < keyVals.length / 2; i++) {
builder.put(keyVals[2 * i], keyVals[(2 * i) + 1]);
}
return builder.build();
}
private static List<Object> list(Object... elements) {
return ImmutableList.copyOf(elements);
}
private static EngineTestUtils.MapDifference diff(Object left, Object right, Object... path) {
return new EngineTestUtils.MapDifference(left, right, Arrays.asList(path));
}
}