package com.xtremelabs.robolectric.util; import org.junit.Before; import org.junit.Test; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; public class SchedulerTest { private Transcript transcript; private Scheduler scheduler; @Before public void setUp() throws Exception { scheduler = new Scheduler(); scheduler.pause(); transcript = new Transcript(); } @Test public void testTick_ReturnsTrueIffSomeJobWasRun() throws Exception { scheduler.postDelayed(new AddToTranscript("one"), 0); scheduler.postDelayed(new AddToTranscript("two"), 0); scheduler.postDelayed(new AddToTranscript("three"), 1000); assertThat(scheduler.advanceBy(0), equalTo(true)); transcript.assertEventsSoFar("one", "two"); assertThat(scheduler.advanceBy(0), equalTo(false)); transcript.assertNoEventsSoFar(); assertThat(scheduler.advanceBy(1000), equalTo(true)); transcript.assertEventsSoFar("three"); } @Test public void testShadowPostDelayed() throws Exception { scheduler.postDelayed(new AddToTranscript("one"), 1000); scheduler.postDelayed(new AddToTranscript("two"), 2000); scheduler.postDelayed(new AddToTranscript("three"), 3000); scheduler.advanceBy(1000); transcript.assertEventsSoFar("one"); scheduler.advanceBy(500); transcript.assertNoEventsSoFar(); scheduler.advanceBy(501); transcript.assertEventsSoFar("two"); scheduler.advanceBy(999); transcript.assertEventsSoFar("three"); } @Test public void testShadowPostAtFrontOfQueue() throws Exception { scheduler.post(new AddToTranscript("one")); scheduler.post(new AddToTranscript("two")); scheduler.postAtFrontOfQueue(new AddToTranscript("three")); scheduler.runOneTask(); transcript.assertEventsSoFar("three"); scheduler.runOneTask(); transcript.assertEventsSoFar("one"); scheduler.runOneTask(); transcript.assertEventsSoFar("two"); } @Test public void testShadowPostAtFrontOfQueue_whenUnpaused() throws Exception { scheduler.unPause(); scheduler.postAtFrontOfQueue(new AddToTranscript("three")); transcript.assertEventsSoFar("three"); } @Test public void testShadowPostDelayed_WhenMoreItemsAreAdded() throws Exception { scheduler.postDelayed(new Runnable() { @Override public void run() { transcript.add("one"); scheduler.postDelayed(new Runnable() { @Override public void run() { transcript.add("two"); scheduler.postDelayed(new AddToTranscript("three"), 1000); } }, 1000); } }, 1000); scheduler.advanceBy(1000); transcript.assertEventsSoFar("one"); scheduler.advanceBy(500); transcript.assertNoEventsSoFar(); scheduler.advanceBy(501); transcript.assertEventsSoFar("two"); scheduler.advanceBy(999); transcript.assertEventsSoFar("three"); } @Test public void removeShouldRemoveAllInstancesOfRunnableFromQueue() throws Exception { scheduler.post(new TestRunnable()); TestRunnable runnable = new TestRunnable(); scheduler.post(runnable); scheduler.post(runnable); assertThat(scheduler.enqueuedTaskCount(), equalTo(3)); scheduler.remove(runnable); assertThat(scheduler.enqueuedTaskCount(), equalTo(1)); scheduler.advanceToLastPostedRunnable(); assertThat(runnable.wasRun, equalTo(false)); } @Test public void resetShouldUnPause() throws Exception { scheduler.pause(); TestRunnable runnable = new TestRunnable(); scheduler.post(runnable); assertThat(runnable.wasRun, equalTo(false)); scheduler.reset(); scheduler.post(runnable); assertThat(runnable.wasRun, equalTo(true)); } @Test public void resetShouldClearPendingRunnables() throws Exception { scheduler.pause(); TestRunnable runnable1 = new TestRunnable(); scheduler.post(runnable1); assertThat(runnable1.wasRun, equalTo(false)); scheduler.reset(); TestRunnable runnable2 = new TestRunnable(); scheduler.post(runnable2); assertThat(runnable1.wasRun, equalTo(false)); assertThat(runnable2.wasRun, equalTo(true)); } private class AddToTranscript implements Runnable { private String event; public AddToTranscript(String event) { this.event = event; } @Override public void run() { transcript.add(event); } } }