1a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzpackage com.xtremelabs.robolectric.util;
2f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
39c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richardimport org.junit.Before;
4f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillipsimport org.junit.Test;
5f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
69c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richardimport static org.hamcrest.CoreMatchers.equalTo;
767142e6509cdc6c82290e955ae69400462cf52a9Christian Williams & Ian Fisherimport static org.junit.Assert.assertThat;
89c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard
9f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillipspublic class SchedulerTest {
10f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips    private Transcript transcript;
119c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard    private Scheduler scheduler;
129c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard
139c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard    @Before
149c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard    public void setUp() throws Exception {
159c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler = new Scheduler();
16a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.pause();
179c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        transcript = new Transcript();
189c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard    }
199c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard
209c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard    @Test
219c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard    public void testTick_ReturnsTrueIffSomeJobWasRun() throws Exception {
229c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler.postDelayed(new AddToTranscript("one"), 0);
239c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler.postDelayed(new AddToTranscript("two"), 0);
249c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler.postDelayed(new AddToTranscript("three"), 1000);
259c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard
26f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        assertThat(scheduler.advanceBy(0), equalTo(true));
279c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        transcript.assertEventsSoFar("one", "two");
28adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
29f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        assertThat(scheduler.advanceBy(0), equalTo(false));
309c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        transcript.assertNoEventsSoFar();
319c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard
32f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        assertThat(scheduler.advanceBy(1000), equalTo(true));
339c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        transcript.assertEventsSoFar("three");
349c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard    }
35f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
36f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips    @Test
37afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    public void testShadowPostDelayed() throws Exception {
389c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler.postDelayed(new AddToTranscript("one"), 1000);
399c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler.postDelayed(new AddToTranscript("two"), 2000);
409c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler.postDelayed(new AddToTranscript("three"), 3000);
41f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
42f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(1000);
43f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertEventsSoFar("one");
44f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
45f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(500);
46f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertNoEventsSoFar();
47f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
48f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(501);
49f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertEventsSoFar("two");
50f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
51f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(999);
52f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertEventsSoFar("three");
53f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips    }
54f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
55f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips    @Test
56478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    public void testShadowPostAtFrontOfQueue() throws Exception {
57478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.post(new AddToTranscript("one"));
58478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.post(new AddToTranscript("two"));
59478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.postAtFrontOfQueue(new AddToTranscript("three"));
60478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
61478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.runOneTask();
62478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        transcript.assertEventsSoFar("three");
63478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
64478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.runOneTask();
65478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        transcript.assertEventsSoFar("one");
66478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
67478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.runOneTask();
68478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        transcript.assertEventsSoFar("two");
69478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    }
70478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
71478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    @Test
72478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    public void testShadowPostAtFrontOfQueue_whenUnpaused() throws Exception {
73478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.unPause();
74478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        scheduler.postAtFrontOfQueue(new AddToTranscript("three"));
75478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        transcript.assertEventsSoFar("three");
76478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    }
77478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
78478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    @Test
79afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    public void testShadowPostDelayed_WhenMoreItemsAreAdded() throws Exception {
809c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard        scheduler.postDelayed(new Runnable() {
81f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips            @Override
82f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips            public void run() {
83f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips                transcript.add("one");
849c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard                scheduler.postDelayed(new Runnable() {
85f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips                    @Override
86f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips                    public void run() {
87f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips                        transcript.add("two");
889c19f7ef7122cfa9e03ed4314da4ad2a115c7e71Christian Williams & Ryan Richard                        scheduler.postDelayed(new AddToTranscript("three"), 1000);
89f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips                    }
90f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips                }, 1000);
91f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips            }
92f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        }, 1000);
93f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
94f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(1000);
95f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertEventsSoFar("one");
96f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
97f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(500);
98f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertNoEventsSoFar();
99f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
100f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(501);
101f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertEventsSoFar("two");
102f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
103f7c3a47b5eb49f49f450eb18822d51dc496fceefPhil Goodwin & Tyler Schultz        scheduler.advanceBy(999);
104f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        transcript.assertEventsSoFar("three");
105f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips    }
106f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
107a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    @Test
108e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    public void removeShouldRemoveAllInstancesOfRunnableFromQueue() throws Exception {
109e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        scheduler.post(new TestRunnable());
110e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        TestRunnable runnable = new TestRunnable();
111e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        scheduler.post(runnable);
112e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        scheduler.post(runnable);
113e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        assertThat(scheduler.enqueuedTaskCount(), equalTo(3));
114e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        scheduler.remove(runnable);
115e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        assertThat(scheduler.enqueuedTaskCount(), equalTo(1));
116e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        scheduler.advanceToLastPostedRunnable();
117e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        assertThat(runnable.wasRun, equalTo(false));
118e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    }
119e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire
120e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    @Test
121a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    public void resetShouldUnPause() throws Exception {
122a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.pause();
123a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
124a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        TestRunnable runnable = new TestRunnable();
125a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.post(runnable);
126a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
127a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        assertThat(runnable.wasRun, equalTo(false));
12840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
129a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.reset();
130a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.post(runnable);
131a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        assertThat(runnable.wasRun, equalTo(true));
132a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    }
133a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
134a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    @Test
135a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    public void resetShouldClearPendingRunnables() throws Exception {
136a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.pause();
137a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
138a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        TestRunnable runnable1 = new TestRunnable();
139a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.post(runnable1);
140a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
141a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        assertThat(runnable1.wasRun, equalTo(false));
142a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
143a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.reset();
144a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
145a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        TestRunnable runnable2 = new TestRunnable();
146a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        scheduler.post(runnable2);
14740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
148a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        assertThat(runnable1.wasRun, equalTo(false));
149a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz        assertThat(runnable2.wasRun, equalTo(true));
150a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    }
151a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
152f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips    private class AddToTranscript implements Runnable {
153f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        private String event;
154f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
155f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        public AddToTranscript(String event) {
156f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips            this.event = event;
157f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        }
158f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips
159f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        @Override
160f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        public void run() {
161f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips            transcript.add(event);
162f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips        }
163f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips    }
164f8d3ea0e4553f6f391543eccb99485f9603c5804Christian Williams & Jay Phillips}
165