package org.testory.common; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.testory.common.Matchers.listOf; import static org.testory.testing.Fakes.newObject; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; public class TestMatchersListOf { private Matcher m, ma, mb, mc; private Matcher matcher; private Object a, b, c, x; private List<Matcher> elements; @Before public void before() { a = newObject("a"); b = newObject("b"); c = newObject("c"); x = newObject("x"); m = new Matcher() { public boolean matches(Object item) { return true; } }; ma = same(a); mb = same(b); mc = same(c); } @Test public void requires_same_number_of_elements() { matcher = listOf(asList(m, m, m)); assertFalse(matcher.matches(asList())); assertFalse(matcher.matches(asList(a))); assertFalse(matcher.matches(asList(a, a))); assertTrue(matcher.matches(asList(a, a, a))); assertFalse(matcher.matches(asList(a, a, a, a))); assertFalse(matcher.matches(asList(a, a, a, a, a))); } @Test public void requires_all_elements_to_match() { matcher = listOf(asList(ma, mb, mc)); assertTrue(matcher.matches(asList(a, b, c))); assertFalse(matcher.matches(asList(x, b, c))); assertFalse(matcher.matches(asList(a, x, c))); assertFalse(matcher.matches(asList(a, b, x))); } @Test public void requires_elements_in_order() { matcher = listOf(asList(ma, mb, mc)); assertTrue(matcher.matches(asList(a, b, c))); assertFalse(matcher.matches(asList(a, c, b))); assertFalse(matcher.matches(asList(b, a, c))); assertFalse(matcher.matches(asList(b, c, a))); assertFalse(matcher.matches(asList(c, a, b))); assertFalse(matcher.matches(asList(c, b, a))); } @Test public void rejects_non_arrays() { matcher = listOf(asList(m)); assertFalse(matcher.matches(new Object())); assertFalse(matcher.matches(null)); } @Test public void prints_matchers() { matcher = listOf(asList(ma, mb, mc)); assertEquals("listOf(" + ma + ", " + mb + ", " + mc + ")", matcher.toString()); } @Test public void defensive_copy_matchers() { elements = new ArrayList<>(asList(m, m, m)); matcher = listOf(elements); elements.clear(); assertTrue(matcher.matches(asList(a, a, a))); assertFalse(matcher.matches(asList())); } @Test public void fails_for_null_matcher() { try { listOf(asList(m, null, m)); fail(); } catch (NullPointerException e) {} } @Test public void fails_for_null_list() { try { listOf(null); fail(); } catch (NullPointerException e) {} } private static Matcher same(final Object instance) { return new Matcher() { public boolean matches(Object item) { return instance == item; } public String toString() { return "same(" + instance + ")"; } }; } }