@Test
public void testRepeatingRunnable()
throws Exception
{
Ticker ticker = executorService.getTicker();
long initialTick = ticker.read();
Counter counter = new TickedCounter(ticker, 10, 15, 20);
ScheduledFuture<?> future = executorService.scheduleAtFixedRate(counter, 10, 5, TimeUnit.NANOSECONDS);
assertFalse(future.isDone());
assertFalse(future.isCancelled());
assertEquals(counter.getCount(), 0);
// After 9 nanoseconds, we shouldn't have run yet, and should have 1 nanosecond left
executorService.elapseTime(9, TimeUnit.NANOSECONDS);
assertFalse(future.isDone());
assertFalse(future.isCancelled());
assertEquals(future.getDelay(TimeUnit.NANOSECONDS), 1);
assertEquals(counter.getCount(), 0);
assertEquals(ticker.read() - initialTick, 9);
// After 1 more nanosecond, we should have run once, and should have 5 nanoseconds remaining
executorService.elapseTime(1, TimeUnit.NANOSECONDS);
assertFalse(future.isDone());
assertFalse(future.isCancelled());
assertEquals(future.getDelay(TimeUnit.NANOSECONDS), 5);
assertEquals(counter.getCount(), 1);
assertEquals(ticker.read() - initialTick, 10);
// After another 10 nanoseconds, we should have run twice more
executorService.elapseTime(10, TimeUnit.NANOSECONDS);
assertEquals(counter.getCount(), 3);
assertEquals(ticker.read() - initialTick, 20);
}