package com.shazam.shazamcrest; import static com.google.common.collect.Maps.newHashMap; import static com.shazam.shazamcrest.MatcherAssert.assertThat; import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs; import static com.shazam.shazamcrest.model.Bean.Builder.bean; import static java.util.Arrays.asList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import com.shazam.shazamcrest.model.Bean; /** * Tests which verifies maps comparison is not affected by the order of the entries. */ @RunWith(Parameterized.class) public class MatcherAssertMapsTest { @Parameterized.Parameters public static List<Object[]> data() { return asList(new Object[20][0]); } public MatcherAssertMapsTest() {} @Test public void ignoresOrderingInMap() { Map<Bean, Bean> expectedMap = newHashMap(); expectedMap.put(bean().string("key1").build(), bean().string("value1").build()); expectedMap.put(bean().string("key2").build(), bean().string("value2").build()); Bean expected = bean().map(expectedMap).build(); Map<Bean, Bean> actualMap = newHashMap(); actualMap.put(bean().string("key1").build(), bean().string("value1").build()); actualMap.put(bean().string("key2").build(), bean().string("value2").build()); Bean actual = bean().map(actualMap).build(); assertThat(actual, sameBeanAs(expected)); } @Test public void ignoresOrderingInMapImplementations() { HashMap<Bean, Bean> expectedMap = newHashMap(); expectedMap.put(bean().string("key1").build(), bean().string("value1").build()); expectedMap.put(bean().string("key2").build(), bean().string("value2").build()); Bean expected = bean().hashMap(expectedMap).build(); HashMap<Bean, Bean> actualMap = newHashMap(); actualMap.put(bean().string("key1").build(), bean().string("value1").build()); actualMap.put(bean().string("key2").build(), bean().string("value2").build()); Bean actual = bean().hashMap(actualMap).build(); assertThat(actual, sameBeanAs(expected)); } @Test public void ignoresOrderingInMapWithTwoEntriesWithSameJsonRepresentationAsKeyButDifferentValues() { Map<Bean, Bean> expectedMap = newHashMap(); expectedMap.put(bean().string("key1").build(), bean().string("value1").build()); expectedMap.put(bean().string("key1").build(), bean().string("value2").build()); expectedMap.put(bean().string("key2").build(), bean().string("value3").build()); Bean expected = bean().map(expectedMap).build(); Map<Bean, Bean> actualMap = newHashMap(); actualMap.put(bean().string("key1").build(), bean().string("value1").build()); actualMap.put(bean().string("key1").build(), bean().string("value2").build()); actualMap.put(bean().string("key2").build(), bean().string("value3").build()); Bean actual = bean().map(actualMap).build(); assertThat(actual, sameBeanAs(expected)); } @Test public void ignoresOrderingInNestedMap() { Map<Bean, Bean> expectedNestedMap1 = newHashMap(); expectedNestedMap1.put(bean().string("nestedMap1Key1").build(), bean().string("nestedMap1Value1").build()); expectedNestedMap1.put(bean().string("nestedMap1Key2").build(), bean().string("nestedMap1Value2").build()); Map<Bean, Bean> expectedNestedMap2 = newHashMap(); expectedNestedMap2.put(bean().string("nestedMap2Key1").build(), bean().string("nestedMap2Value1").build()); expectedNestedMap2.put(bean().string("nestedMap2Key2").build(), bean().string("nestedMap2Value2").build()); Map<Bean, Bean> expectedMap = newHashMap(); expectedMap.put(bean().string("key1").build(), bean().string("value1").map(expectedNestedMap1).build()); expectedMap.put(bean().string("key2").build(), bean().string("value2").map(expectedNestedMap2).build()); Bean expected = bean().map(expectedMap).build(); Map<Bean, Bean> actualNestedMap1 = newHashMap(); actualNestedMap1.put(bean().string("nestedMap1Key1").build(), bean().string("nestedMap1Value1").build()); actualNestedMap1.put(bean().string("nestedMap1Key2").build(), bean().string("nestedMap1Value2").build()); Map<Bean, Bean> actualNestedMap2 = newHashMap(); actualNestedMap2.put(bean().string("nestedMap2Key1").build(), bean().string("nestedMap2Value1").build()); actualNestedMap2.put(bean().string("nestedMap2Key2").build(), bean().string("nestedMap2Value2").build()); Map<Bean, Bean> actualMap = newHashMap(); actualMap.put(bean().string("key1").build(), bean().string("value1").map(actualNestedMap1).build()); actualMap.put(bean().string("key2").build(), bean().string("value2").map(actualNestedMap2).build()); Bean actual = bean().map(actualMap).build(); assertThat(actual, sameBeanAs(expected)); } }