package com.dhemery.polling;
import org.hamcrest.Description;
import org.jmock.Expectations;
import org.jmock.Sequence;
import org.jmock.auto.Mock;
import org.junit.Before;
import org.junit.Test;
public class ATickingPoller extends PollerContract {
private Poller poller;
@Mock public Ticker ticker;
@Before
public void setup() {
poller = new TickingPoller(ticker);
}
@Test
public void startsTheTickerBeforePolling() {
final Sequence polling = context.sequence("polling");
context.checking(new Expectations(){{
oneOf(ticker).start(); inSequence(polling);
oneOf(condition).isSatisfied(); will(returnValue(true)); inSequence(polling);
}});
poller.poll(condition);
}
@Test
public void pollsBeforeCheckingForTickerExpiration() {
final Sequence polling = context.sequence("polling");
context.checking(new Expectations(){{
allowing(ticker).start();
oneOf(condition).isSatisfied(); will(returnValue(true)); inSequence(polling);
never(ticker).isExpired(); inSequence(polling);
}});
poller.poll(condition);
}
@Test
public void ticksAfterEachDissatisfactionIfTickerIsNotExpired() {
final Sequence polling = context.sequence("polling");
context.checking(new Expectations() {{
ignoring(ticker).start();
allowing(ticker).isExpired(); will(returnValue(false));
oneOf(condition).isSatisfied(); will(returnValue(false)); inSequence(polling);
oneOf(ticker).tick(); inSequence(polling);
oneOf(condition).isSatisfied(); will(returnValue(false)); inSequence(polling);
oneOf(ticker).tick(); inSequence(polling);
oneOf(condition).isSatisfied(); will(returnValue(false)); inSequence(polling);
oneOf(ticker).tick(); inSequence(polling);
oneOf(condition).isSatisfied(); will(returnValue(true)); inSequence(polling);
}});
poller.poll(condition);
}
@Test
public void doesNotTickAfterSatisfaction() {
final Sequence polling = context.sequence("polling");
context.checking(new Expectations(){{
ignoring(ticker).start();
allowing(condition).isSatisfied(); will(returnValue(true)); inSequence(polling);
never(ticker).tick(); inSequence(polling);
}});
poller.poll(condition);
}
@Test(expected = PollTimeoutException.class)
public void throwsIfTickerExpiresBeforeConditionIsSatisfied() {
context.checking(new Expectations(){{
ignoring(condition).describeDissatisfactionTo(with(any(Description.class)));
ignoring(condition).describeTo(with(any(Description.class)));
ignoring(ticker).start();
allowing(condition).isSatisfied(); will(returnValue(false));
allowing(ticker).isExpired(); will(returnValue(true));
}});
poller.poll(condition);
}
@Override
protected Poller pollerForContract() {
context.checking(new Expectations(){{
ignoring(ticker);
}});
return poller;
}
}