1package com.xtremelabs.robolectric.util;
2
3import org.junit.Before;
4import org.junit.Test;
5
6import static org.hamcrest.CoreMatchers.equalTo;
7import static org.junit.Assert.assertThat;
8
9public class SchedulerTest {
10    private Transcript transcript;
11    private Scheduler scheduler;
12
13    @Before
14    public void setUp() throws Exception {
15        scheduler = new Scheduler();
16        scheduler.pause();
17        transcript = new Transcript();
18    }
19
20    @Test
21    public void testTick_ReturnsTrueIffSomeJobWasRun() throws Exception {
22        scheduler.postDelayed(new AddToTranscript("one"), 0);
23        scheduler.postDelayed(new AddToTranscript("two"), 0);
24        scheduler.postDelayed(new AddToTranscript("three"), 1000);
25
26        assertThat(scheduler.advanceBy(0), equalTo(true));
27        transcript.assertEventsSoFar("one", "two");
28
29        assertThat(scheduler.advanceBy(0), equalTo(false));
30        transcript.assertNoEventsSoFar();
31
32        assertThat(scheduler.advanceBy(1000), equalTo(true));
33        transcript.assertEventsSoFar("three");
34    }
35
36    @Test
37    public void testShadowPostDelayed() throws Exception {
38        scheduler.postDelayed(new AddToTranscript("one"), 1000);
39        scheduler.postDelayed(new AddToTranscript("two"), 2000);
40        scheduler.postDelayed(new AddToTranscript("three"), 3000);
41
42        scheduler.advanceBy(1000);
43        transcript.assertEventsSoFar("one");
44
45        scheduler.advanceBy(500);
46        transcript.assertNoEventsSoFar();
47
48        scheduler.advanceBy(501);
49        transcript.assertEventsSoFar("two");
50
51        scheduler.advanceBy(999);
52        transcript.assertEventsSoFar("three");
53    }
54
55    @Test
56    public void testShadowPostAtFrontOfQueue() throws Exception {
57        scheduler.post(new AddToTranscript("one"));
58        scheduler.post(new AddToTranscript("two"));
59        scheduler.postAtFrontOfQueue(new AddToTranscript("three"));
60
61        scheduler.runOneTask();
62        transcript.assertEventsSoFar("three");
63
64        scheduler.runOneTask();
65        transcript.assertEventsSoFar("one");
66
67        scheduler.runOneTask();
68        transcript.assertEventsSoFar("two");
69    }
70
71    @Test
72    public void testShadowPostAtFrontOfQueue_whenUnpaused() throws Exception {
73        scheduler.unPause();
74        scheduler.postAtFrontOfQueue(new AddToTranscript("three"));
75        transcript.assertEventsSoFar("three");
76    }
77
78    @Test
79    public void testShadowPostDelayed_WhenMoreItemsAreAdded() throws Exception {
80        scheduler.postDelayed(new Runnable() {
81            @Override
82            public void run() {
83                transcript.add("one");
84                scheduler.postDelayed(new Runnable() {
85                    @Override
86                    public void run() {
87                        transcript.add("two");
88                        scheduler.postDelayed(new AddToTranscript("three"), 1000);
89                    }
90                }, 1000);
91            }
92        }, 1000);
93
94        scheduler.advanceBy(1000);
95        transcript.assertEventsSoFar("one");
96
97        scheduler.advanceBy(500);
98        transcript.assertNoEventsSoFar();
99
100        scheduler.advanceBy(501);
101        transcript.assertEventsSoFar("two");
102
103        scheduler.advanceBy(999);
104        transcript.assertEventsSoFar("three");
105    }
106
107    @Test
108    public void removeShouldRemoveAllInstancesOfRunnableFromQueue() throws Exception {
109        scheduler.post(new TestRunnable());
110        TestRunnable runnable = new TestRunnable();
111        scheduler.post(runnable);
112        scheduler.post(runnable);
113        assertThat(scheduler.enqueuedTaskCount(), equalTo(3));
114        scheduler.remove(runnable);
115        assertThat(scheduler.enqueuedTaskCount(), equalTo(1));
116        scheduler.advanceToLastPostedRunnable();
117        assertThat(runnable.wasRun, equalTo(false));
118    }
119
120    @Test
121    public void resetShouldUnPause() throws Exception {
122        scheduler.pause();
123
124        TestRunnable runnable = new TestRunnable();
125        scheduler.post(runnable);
126
127        assertThat(runnable.wasRun, equalTo(false));
128
129        scheduler.reset();
130        scheduler.post(runnable);
131        assertThat(runnable.wasRun, equalTo(true));
132    }
133
134    @Test
135    public void resetShouldClearPendingRunnables() throws Exception {
136        scheduler.pause();
137
138        TestRunnable runnable1 = new TestRunnable();
139        scheduler.post(runnable1);
140
141        assertThat(runnable1.wasRun, equalTo(false));
142
143        scheduler.reset();
144
145        TestRunnable runnable2 = new TestRunnable();
146        scheduler.post(runnable2);
147
148        assertThat(runnable1.wasRun, equalTo(false));
149        assertThat(runnable2.wasRun, equalTo(true));
150    }
151
152    private class AddToTranscript implements Runnable {
153        private String event;
154
155        public AddToTranscript(String event) {
156            this.event = event;
157        }
158
159        @Override
160        public void run() {
161            transcript.add(event);
162        }
163    }
164}
165