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.arrayOf;
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 TestMatchersArrayOf {
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 = arrayOf(asList(m, m, m));
assertFalse(matcher.matches(new Object[] {}));
assertFalse(matcher.matches(new Object[] { a }));
assertFalse(matcher.matches(new Object[] { a, a }));
assertTrue(matcher.matches(new Object[] { a, a, a }));
assertFalse(matcher.matches(new Object[] { a, a, a, a }));
assertFalse(matcher.matches(new Object[] { a, a, a, a, a }));
}
@Test
public void requires_all_elements_to_match() {
matcher = arrayOf(asList(ma, mb, mc));
assertTrue(matcher.matches(new Object[] { a, b, c }));
assertFalse(matcher.matches(new Object[] { x, b, c }));
assertFalse(matcher.matches(new Object[] { a, x, c }));
assertFalse(matcher.matches(new Object[] { a, b, x }));
}
@Test
public void requires_elements_in_order() {
matcher = arrayOf(asList(ma, mb, mc));
assertTrue(matcher.matches(new Object[] { a, b, c }));
assertFalse(matcher.matches(new Object[] { a, c, b }));
assertFalse(matcher.matches(new Object[] { b, a, c }));
assertFalse(matcher.matches(new Object[] { b, c, a }));
assertFalse(matcher.matches(new Object[] { c, a, b }));
assertFalse(matcher.matches(new Object[] { c, b, a }));
}
@Test
public void handles_primitive_arrays() {
matcher = arrayOf(asList(m, m, m));
assertTrue(matcher.matches(new int[] { 1, 2, 3 }));
}
@Test
public void rejects_non_arrays() {
matcher = arrayOf(asList(m));
assertFalse(matcher.matches(new Object()));
assertFalse(matcher.matches(null));
}
@Test
public void prints_matchers() {
matcher = arrayOf(asList(ma, mb, mc));
assertEquals("arrayOf(" + ma + ", " + mb + ", " + mc + ")", matcher.toString());
}
@Test
public void defensive_copy_matchers() {
elements = new ArrayList<>(asList(m, m, m));
matcher = arrayOf(elements);
elements.clear();
assertTrue(matcher.matches(new Object[] { a, a, a }));
assertFalse(matcher.matches(new Object[] {}));
}
@Test
public void fails_for_null_matcher() {
try {
arrayOf(asList(m, null, m));
fail();
} catch (NullPointerException e) {}
}
@Test
public void fails_for_null_list() {
try {
arrayOf(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 + ")";
}
};
}
}