HandlerTest.java revision 40674c5041023f9b5cb5570b8c5b81b5968ec585
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
2d18686a842f75eeef2845925147fa17f16af6459Christian Williams
3d18686a842f75eeef2845925147fa17f16af6459Christian Williamsimport android.os.Handler;
4d18686a842f75eeef2845925147fa17f16af6459Christian Williamsimport android.os.Looper;
5500a8f2575826f53dd09cf2400eb587a7ea687abMark Bakkerimport android.os.Message;
6345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
707257335f88da163910cc0bd039e6163edc38580Gregg Van Hove & Phil Goodwinimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
8b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultzimport com.xtremelabs.robolectric.util.TestRunnable;
9a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.Transcript;
10d18686a842f75eeef2845925147fa17f16af6459Christian Williamsimport org.junit.Before;
11d18686a842f75eeef2845925147fa17f16af6459Christian Williamsimport org.junit.Test;
12d18686a842f75eeef2845925147fa17f16af6459Christian Williamsimport org.junit.runner.RunWith;
13d18686a842f75eeef2845925147fa17f16af6459Christian Williams
14345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williamsimport static com.xtremelabs.robolectric.Robolectric.newInstanceOf;
15e7a41c9b39233781c97dd599ff61024f0510e308Christian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
16a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwinimport static org.hamcrest.CoreMatchers.equalTo;
17d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkelimport static org.hamcrest.CoreMatchers.nullValue;
18b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultzimport static org.junit.Assert.assertThat;
19478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetskyimport static org.junit.Assert.assertTrue;
2004e66088f357467378221115b4981cb8cf3f8764Daveimport static org.junit.Assert.assertFalse;
21d18686a842f75eeef2845925147fa17f16af6459Christian Williams
2207257335f88da163910cc0bd039e6163edc38580Gregg Van Hove & Phil Goodwin@RunWith(WithTestDefaultsRunner.class)
23d18686a842f75eeef2845925147fa17f16af6459Christian Williamspublic class HandlerTest {
24d18686a842f75eeef2845925147fa17f16af6459Christian Williams    private Transcript transcript;
25b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    TestRunnable scratchRunnable = new TestRunnable();
26d18686a842f75eeef2845925147fa17f16af6459Christian Williams
27816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    private Handler.Callback callback = new Handler.Callback() {
28816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        @Override
29816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        public boolean handleMessage(Message msg) {
30816362580ec2c74e4bf15f8f3d1081084dac0a61Dave            hasHandlerCallbackHandledMessage = true;
31816362580ec2c74e4bf15f8f3d1081084dac0a61Dave            return false;
32816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        }
33816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    };
34816362580ec2c74e4bf15f8f3d1081084dac0a61Dave
35816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    private Boolean hasHandlerCallbackHandledMessage = false;
36816362580ec2c74e4bf15f8f3d1081084dac0a61Dave
37d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Before
38d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void setUp() throws Exception {
39d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript = new Transcript();
40d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
41d18686a842f75eeef2845925147fa17f16af6459Christian Williams
42d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Test
43d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void testInsertsRunnablesBasedOnLooper() throws Exception {
44d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Looper looper = newInstanceOf(Looper.class);
45d18686a842f75eeef2845925147fa17f16af6459Christian Williams
46d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler1 = new Handler(looper);
47d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler1.post(new Say("first thing"));
48d18686a842f75eeef2845925147fa17f16af6459Christian Williams
49d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler2 = new Handler(looper);
50d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler2.post(new Say("second thing"));
51d18686a842f75eeef2845925147fa17f16af6459Christian Williams
52433b46be67768332f764eab6879e0649993d79e3Christian Williams        shadowOf(looper).idle();
53d18686a842f75eeef2845925147fa17f16af6459Christian Williams
54d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript.assertEventsSoFar("first thing", "second thing");
55d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
56d18686a842f75eeef2845925147fa17f16af6459Christian Williams
57d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Test
58d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void testDefaultConstructorUsesDefaultLooper() throws Exception {
59d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler1 = new Handler();
60d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler1.post(new Say("first thing"));
61d18686a842f75eeef2845925147fa17f16af6459Christian Williams
62d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler2 = new Handler(Looper.myLooper());
63d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler2.post(new Say("second thing"));
64d18686a842f75eeef2845925147fa17f16af6459Christian Williams
65433b46be67768332f764eab6879e0649993d79e3Christian Williams        shadowOf(Looper.myLooper()).idle();
66d18686a842f75eeef2845925147fa17f16af6459Christian Williams
67d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript.assertEventsSoFar("first thing", "second thing");
68d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
69d18686a842f75eeef2845925147fa17f16af6459Christian Williams
70d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Test
71d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void testDifferentLoopersGetDifferentQueues() throws Exception {
72345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williams        Looper looper1 = Robolectric.newInstanceOf(Looper.class);
735dab156481a91717311fa47ff7e27a54865abfa3Phil Goodwin & Tyler Schultz        Robolectric.pauseLooper(looper1);
749cc6655219ea2788432360cf7f791488882bfbc3Phil Goodwin & Tyler Schultz
75345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williams        Looper looper2 = Robolectric.newInstanceOf(Looper.class);
765dab156481a91717311fa47ff7e27a54865abfa3Phil Goodwin & Tyler Schultz        Robolectric.pauseLooper(looper2);
77534fd31dba68daad0ad9d98c3c480139a3efa5a1Christian Williams & Tyler Schultz
78534fd31dba68daad0ad9d98c3c480139a3efa5a1Christian Williams & Tyler Schultz        Handler handler1 = new Handler(looper1);
79d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler1.post(new Say("first thing"));
80d18686a842f75eeef2845925147fa17f16af6459Christian Williams
81534fd31dba68daad0ad9d98c3c480139a3efa5a1Christian Williams & Tyler Schultz        Handler handler2 = new Handler(looper2);
82d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler2.post(new Say("second thing"));
83d18686a842f75eeef2845925147fa17f16af6459Christian Williams
84433b46be67768332f764eab6879e0649993d79e3Christian Williams        shadowOf(looper2).idle();
85d18686a842f75eeef2845925147fa17f16af6459Christian Williams
86d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript.assertEventsSoFar("second thing");
87d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
88d18686a842f75eeef2845925147fa17f16af6459Christian Williams
89b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
90816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    public void shouldCallProvidedHandlerCallback() {
91816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        Handler handler = new Handler(callback);
92816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        handler.sendMessage(new Message());
93816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        assertTrue(hasHandlerCallbackHandledMessage);
94816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    }
95816362580ec2c74e4bf15f8f3d1081084dac0a61Dave
96816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    @Test
97b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostAndIdleMainLooper() throws Exception {
98b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().post(scratchRunnable);
99b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.idleMainLooper();
100b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(true));
101b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
102b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
103b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
104b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void postDelayedThenIdleMainLooper_shouldNotRunRunnable() throws Exception {
105b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(scratchRunnable, 1);
106b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.idleMainLooper();
107b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(false));
108b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
109b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
110b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
111b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedThenRunMainLooperOneTask() throws Exception {
112b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(scratchRunnable, 1);
113b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperOneTask();
114b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(true));
115b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
116b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
117b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
118e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    public void testRemoveCallbacks() throws Exception {
119e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        Handler handler = new Handler();
120e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        ShadowLooper shadowLooper = shadowOf(handler.getLooper());
121e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        shadowLooper.pause();
122e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        handler.post(scratchRunnable);
123e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        handler.removeCallbacks(scratchRunnable);
124e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire
125e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        shadowLooper.unPause();
126e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire
127e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        assertThat(scratchRunnable.wasRun, equalTo(false));
128e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    }
129e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire
130e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    @Test
131b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedThenRunMainLooperToNextTask_shouldRunOneTask() throws Exception {
132b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(scratchRunnable, 1);
133b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperToNextTask();
134b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(true));
135b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
136b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
137b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
138b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedTwiceThenRunMainLooperToNextTask_shouldRunMultipleTasks() throws Exception {
139b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task1 = new TestRunnable();
140b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task2 = new TestRunnable();
141b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
142b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task1, 1);
143b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task2, 1);
144b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
145b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperToNextTask();
146b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task1.wasRun, equalTo(true));
147b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task2.wasRun, equalTo(true));
148b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
149b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
150b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
151b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedTwiceThenRunMainLooperOneTask_shouldRunOnlyOneTask() throws Exception {
152b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task1 = new TestRunnable();
153b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task2 = new TestRunnable();
154b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
155b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task1, 1);
156b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task2, 1);
157b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
158b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperOneTask();
159b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task1.wasRun, equalTo(true));
160b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task2.wasRun, equalTo(false));
161b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
162b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
163b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
164b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedMultipleThenRunMainLooperOneTask_shouldRunMultipleTask() throws Exception {
165b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task1 = new TestRunnable();
166b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task2 = new TestRunnable();
167b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task3 = new TestRunnable();
168b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
169b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task1, 1);
170b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task2, 10);
171b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task3, 100);
172b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
173b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperToEndOfTasks();
174b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task1.wasRun, equalTo(true));
175b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task2.wasRun, equalTo(true));
176b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task3.wasRun, equalTo(true));
177b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
178b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
179500a8f2575826f53dd09cf2400eb587a7ea687abMark Bakker    @Test
180478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    public void testPostAtFrontOfQueueThenRunMainLooperOneTaskAtATime_shouldRunFrontOfQueueTaskFirst() throws Exception {
181478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        TestRunnable task1 = new TestRunnable();
182478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        TestRunnable task2 = new TestRunnable();
183478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
184478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        ShadowLooper.pauseMainLooper();
185478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        new Handler().post(task1);
186478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        boolean result = new Handler().postAtFrontOfQueue(task2);
187478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
188478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertTrue(result);
189478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
190478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        ShadowHandler.runMainLooperOneTask();
191478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertThat(task2.wasRun, equalTo(true));
192478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertThat(task1.wasRun, equalTo(false));
193478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        ShadowHandler.runMainLooperOneTask();
194478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertThat(task1.wasRun, equalTo(true));
195478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    }
196478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
197478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    @Test
19806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void sendEmptyMessage_addMessageToQueue() {
19906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
20006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler();
20106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
20206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessage(123);
20306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(456), equalTo(false));
20406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(true));
20506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.idleMainLooper(0);
20606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
20706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
208d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
20906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    @Test
21006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void sendEmptyMessageDelayed_sendsMessageAtCorrectTime() {
21106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
21206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler();
21306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessageDelayed(123, 500);
21406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(true));
21506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.idleMainLooper(100);
21606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(true));
21706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.idleMainLooper(400);
21806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
21906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
22006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard
22106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    @Test
22206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void removeMessages_takesMessageOutOfQueue() {
22306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
22406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler();
22506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessageDelayed(123, 500);
22606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.removeMessages(123);
22706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
22806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
22906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard
23006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    @Test
2313fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel    public void removeMessage_withSpecifiedObject() throws Exception {
2323fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Robolectric.pauseMainLooper();
2333fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Handler handler = new Handler();
2343fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Message.obtain(handler, 123, "foo").sendToTarget();
2353fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Message.obtain(handler, 123, "bar").sendToTarget();
2363fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2373fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123), equalTo(true));
2383fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123, "foo"), equalTo(true));
2393fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123, "bar"), equalTo(true));
2403fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123, "baz"), equalTo(false));
2413fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2423fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        handler.removeMessages(123, "foo");
2433fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123), equalTo(true));
2443fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2453fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        handler.removeMessages(123, "bar");
2463fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123), equalTo(false));
2473fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel    }
2483fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2493fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel    @Test
25004e66088f357467378221115b4981cb8cf3f8764Dave    public void testHasMessagesWithWhatAndObject() {
25104e66088f357467378221115b4981cb8cf3f8764Dave        Robolectric.pauseMainLooper();
25204e66088f357467378221115b4981cb8cf3f8764Dave        Object testObject = new Object();
25304e66088f357467378221115b4981cb8cf3f8764Dave        Handler handler = new Handler();
25404e66088f357467378221115b4981cb8cf3f8764Dave        Message message = handler.obtainMessage(123, testObject);
25504e66088f357467378221115b4981cb8cf3f8764Dave
25604e66088f357467378221115b4981cb8cf3f8764Dave        assertFalse(handler.hasMessages(123, testObject));
25704e66088f357467378221115b4981cb8cf3f8764Dave
25804e66088f357467378221115b4981cb8cf3f8764Dave        handler.sendMessage(message);
25904e66088f357467378221115b4981cb8cf3f8764Dave
26004e66088f357467378221115b4981cb8cf3f8764Dave        assertTrue(handler.hasMessages(123, testObject));
26104e66088f357467378221115b4981cb8cf3f8764Dave    }
26204e66088f357467378221115b4981cb8cf3f8764Dave
26304e66088f357467378221115b4981cb8cf3f8764Dave    @Test
26440674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen    public void testSendToTarget() {
26540674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Robolectric.pauseMainLooper();
26640674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Object testObject = new Object();
26740674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Handler handler = new Handler();
26840674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Message message = handler.obtainMessage(123, testObject);
26940674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
27040674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        assertThat(handler, equalTo(message.getTarget()));
27140674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
27240674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        message.sendToTarget();
27340674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
27440674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        assertTrue(handler.hasMessages(123, testObject));
27540674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen    }
27640674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
27740674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen    @Test
27806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void removeMessages_removesFromLooperQueueAsWell() {
27906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        final boolean[] wasRun = new boolean[1];
28006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
28106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler() {
28206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard            @Override
28306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard            public void handleMessage(Message msg) {
28406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard                wasRun[0] = true;
28506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard            }
28606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        };
28706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessageDelayed(123, 500);
28806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.removeMessages(123);
28906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.unPauseMainLooper();
29006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(wasRun[0], equalTo(false));
29106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
29206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard
293d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel    @Test
294d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel    public void shouldObtainMessage() throws Exception {
295d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m0 = new Handler().obtainMessage();
296d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m0.what, equalTo(0));
297d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m0.obj, nullValue());
298d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
299d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m1 = new Handler().obtainMessage(1);
300d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m1.what, equalTo(1));
301d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m1.obj, nullValue());
302d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
303d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m2 = new Handler().obtainMessage(1, "foo");
304d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m2.what, equalTo(1));
305d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m2.obj, equalTo((Object)"foo"));
306d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
307d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m3 = new Handler().obtainMessage(1, 2, 3);
308d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.what, equalTo(1));
309d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.arg1, equalTo(2));
310d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.arg2, equalTo(3));
311d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.obj, nullValue());
312d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
313d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m4 = new Handler().obtainMessage(1, 2, 3, "foo");
314d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.what, equalTo(1));
315d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.arg1, equalTo(2));
316d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.arg2, equalTo(3));
317d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.obj, equalTo((Object)"foo"));
318d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel    }
319d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
320d18686a842f75eeef2845925147fa17f16af6459Christian Williams    private class Say implements Runnable {
321d18686a842f75eeef2845925147fa17f16af6459Christian Williams        private String event;
322d18686a842f75eeef2845925147fa17f16af6459Christian Williams
323d18686a842f75eeef2845925147fa17f16af6459Christian Williams        public Say(String event) {
324d18686a842f75eeef2845925147fa17f16af6459Christian Williams            this.event = event;
325d18686a842f75eeef2845925147fa17f16af6459Christian Williams        }
326d18686a842f75eeef2845925147fa17f16af6459Christian Williams
327d18686a842f75eeef2845925147fa17f16af6459Christian Williams        @Override
328d18686a842f75eeef2845925147fa17f16af6459Christian Williams        public void run() {
329d18686a842f75eeef2845925147fa17f16af6459Christian Williams            transcript.add(event);
330d18686a842f75eeef2845925147fa17f16af6459Christian Williams        }
331d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
332d18686a842f75eeef2845925147fa17f16af6459Christian Williams}
333