package org.testory;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import static org.testory.Testory.given;
import static org.testory.Testory.mock;
import static org.testory.Testory.thenCalled;
import static org.testory.Testory.thenCalledTimes;
import static org.testory.Testory.when;
import static org.testory.Testory.willReturn;
import static org.testory.testing.Fakes.newObject;
import static org.testory.testing.Purging.triggerPurge;
import org.junit.Before;
import org.junit.Test;
import org.testory.common.Closure;
import org.testory.proxy.Invocation;
import org.testory.proxy.InvocationMatcher;
public class TestPurging {
private Mockable mock;
private Object object;
@Before
public void before() {
mock = mock(Mockable.class);
object = newObject("object");
}
@Test
public void purge_disables_invocation() {
triggerPurge();
try {
mock.getObject();
fail();
} catch (TestoryException e) {}
}
@Test
public void purge_disables_stubbing() {
triggerPurge();
try {
given(willReturn(object), mock);
fail();
} catch (TestoryException e) {}
}
@Test
public void purge_disables_verification() {
triggerPurge();
try {
thenCalled(mock);
fail();
} catch (TestoryException e) {}
}
@Test
public void does_not_purge_single_when() {
given(willReturn(object), onInstance(mock));
when("");
assertSame(object, mock.getObject());
}
@Test
public void does_not_purge_single_chained_when() {
given(willReturn(object), onInstance(mock));
when(new Object()).toString();
assertSame(object, mock.getObject());
}
@Test
public void purges_previous_when() {
when(mock.getObject());
triggerPurge();
thenCalledTimes(0, onInstance(mock));
}
@Test
public void purges_previous_when_closure() {
when(new Closure() {
public Object invoke() {
mock.getObject();
return null;
}
});
triggerPurge();
thenCalledTimes(0, onInstance(mock));
}
@Test
public void purges_previous_when_chained() {
when(mock).getObject();
triggerPurge();
thenCalledTimes(0, onInstance(mock));
}
private static InvocationMatcher onInstance(final Object mock) {
return new InvocationMatcher() {
public boolean matches(Invocation invocation) {
return invocation.instance == mock;
}
};
}
private static abstract class Mockable {
abstract Object getObject();
}
}