package org.testory; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.testory.Testory.any; import static org.testory.Testory.given; import static org.testory.Testory.mock; import static org.testory.Testory.when; import static org.testory.Testory.willReturn; import static org.testory.testing.DynamicMatchers.deepEqual; import static org.testory.testing.DynamicMatchers.same; import static org.testory.testing.Fakes.newObject; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestAnyRepairing { private Object a, b, x; private int i, j, k; private Mockable mock; @Before public void before() { mock = mock(Mockable.class); a = newObject("a"); b = newObject("b"); x = newObject("x"); i = 123; j = 456; k = 789; } @After public void after() { when(""); when(""); } @Test public void solves_objects() { given(willReturn(true), mock).objects( a, any(Object.class, same(b)), a); assertTrue(mock.objects(a, b, a)); assertFalse(mock.objects(x, b, a)); assertFalse(mock.objects(a, x, a)); assertFalse(mock.objects(a, b, x)); } @Test public void solves_final_type() { given(willReturn(true), mock).objects( a, any(FinalClass.class, same(b)), a); assertTrue(mock.objects(a, b, a)); assertFalse(mock.objects(x, b, a)); assertFalse(mock.objects(a, x, a)); assertFalse(mock.objects(a, b, x)); } @Test public void solves_array() { given(willReturn(true), mock).objects( a, any(Object[].class, same(b)), a); assertTrue(mock.objects(a, b, a)); assertFalse(mock.objects(x, b, a)); assertFalse(mock.objects(a, x, a)); assertFalse(mock.objects(a, b, x)); } @Test public void solves_wrappers() { given(willReturn(true), mock).objects( a, any(int.class, same(b)), a); assertTrue(mock.objects(a, b, a)); assertFalse(mock.objects(x, b, a)); assertFalse(mock.objects(a, x, a)); assertFalse(mock.objects(a, b, x)); } @Test public void solves_surrounded_primitive_types() { given(willReturn(true), mock).objects( a, any(Object.class, same(a)), any(Integer.class, deepEqual(i)), any(Integer.class, deepEqual(i)), any(Object.class, same(a)), a); assertTrue(mock.objects(a, a, i, i, a, a)); assertFalse(mock.objects(x, a, i, i, a, a)); assertFalse(mock.objects(a, x, i, i, a, a)); assertFalse(mock.objects(a, a, j, i, a, a)); assertFalse(mock.objects(a, a, i, j, a, a)); assertFalse(mock.objects(a, a, i, i, x, a)); assertFalse(mock.objects(a, a, i, i, a, x)); } @Test public void solves_unsurrounded_primitive_types() { given(willReturn(true), mock).objects( a, a, any(Integer.class, deepEqual(i)), any(Integer.class, deepEqual(i)), a, a); assertTrue(mock.objects(a, a, i, i, a, a)); assertFalse(mock.objects(x, a, i, i, a, a)); assertFalse(mock.objects(a, x, i, i, a, a)); assertFalse(mock.objects(a, a, j, i, a, a)); assertFalse(mock.objects(a, a, i, j, a, a)); assertFalse(mock.objects(a, a, i, i, x, a)); assertFalse(mock.objects(a, a, i, i, a, x)); } @Test public void cannot_solve_more_anys_than_parameters() { try { any(Object.class); given(willReturn(true), mock).objects( any(Object.class), any(Object.class), any(Object.class)); } catch (TestoryException e) {} } @Test public void solves_varargs() { given(willReturn(true), mock).varargs( a, a, any(Object.class, same(b)), a); assertTrue(mock.varargs(a, a, b, a)); assertFalse(mock.varargs(x, a, b, a)); assertFalse(mock.varargs(a, x, b, a)); assertFalse(mock.varargs(a, a, x, a)); assertFalse(mock.varargs(a, a, b, x)); } @Test public void solves_primitive_varargs() { given(willReturn(true), mock).primitiveVarargs( any(int.class, deepEqual(i)), any(int.class, deepEqual(i)), any(int.class, deepEqual(j)), any(int.class, deepEqual(i))); assertTrue(mock.primitiveVarargs(i, i, j, i)); assertFalse(mock.primitiveVarargs(k, i, j, i)); assertFalse(mock.primitiveVarargs(i, k, j, i)); assertFalse(mock.primitiveVarargs(i, i, k, i)); assertFalse(mock.primitiveVarargs(i, i, j, k)); } @Test public void solves_varargs_for_explicit_object() { given(willReturn(true), mock).varargs( a, any(Object.class)); assertFalse(mock.varargs(a)); assertTrue(mock.varargs(a, a)); assertFalse(mock.varargs(a, a, a)); } @Test public void solves_varargs_for_explicit_array() { given(willReturn(true), mock).varargs( a, any(Object[].class)); assertTrue(mock.varargs(a)); assertTrue(mock.varargs(a, b)); assertTrue(mock.varargs(a, b, b)); } private static final class FinalClass {} private static abstract class Mockable { abstract boolean objects(Object a, Object b, Object c); abstract boolean objects(Object a, Object b, int c, int d, Object e, Object f); abstract boolean varargs(Object a, Object... os); abstract boolean primitiveVarargs(int i, int... is); } }