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
22962dfc938fd6829f96079d4749f050da9118b8cbJan Berkelimport java.util.ArrayList;
23962dfc938fd6829f96079d4749f050da9118b8cbJan Berkelimport java.util.List;
24962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel
2507257335f88da163910cc0bd039e6163edc38580Gregg Van Hove & Phil Goodwin@RunWith(WithTestDefaultsRunner.class)
26d18686a842f75eeef2845925147fa17f16af6459Christian Williamspublic class HandlerTest {
27d18686a842f75eeef2845925147fa17f16af6459Christian Williams    private Transcript transcript;
28b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    TestRunnable scratchRunnable = new TestRunnable();
29d18686a842f75eeef2845925147fa17f16af6459Christian Williams
30816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    private Handler.Callback callback = new Handler.Callback() {
31816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        @Override
32816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        public boolean handleMessage(Message msg) {
33816362580ec2c74e4bf15f8f3d1081084dac0a61Dave            hasHandlerCallbackHandledMessage = true;
34816362580ec2c74e4bf15f8f3d1081084dac0a61Dave            return false;
35816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        }
36816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    };
37816362580ec2c74e4bf15f8f3d1081084dac0a61Dave
38816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    private Boolean hasHandlerCallbackHandledMessage = false;
39816362580ec2c74e4bf15f8f3d1081084dac0a61Dave
40d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Before
41d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void setUp() throws Exception {
42d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript = new Transcript();
43d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
44d18686a842f75eeef2845925147fa17f16af6459Christian Williams
45d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Test
46d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void testInsertsRunnablesBasedOnLooper() throws Exception {
47d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Looper looper = newInstanceOf(Looper.class);
48d18686a842f75eeef2845925147fa17f16af6459Christian Williams
49d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler1 = new Handler(looper);
50d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler1.post(new Say("first thing"));
51d18686a842f75eeef2845925147fa17f16af6459Christian Williams
52d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler2 = new Handler(looper);
53d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler2.post(new Say("second thing"));
54d18686a842f75eeef2845925147fa17f16af6459Christian Williams
55433b46be67768332f764eab6879e0649993d79e3Christian Williams        shadowOf(looper).idle();
56d18686a842f75eeef2845925147fa17f16af6459Christian Williams
57d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript.assertEventsSoFar("first thing", "second thing");
58d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
59d18686a842f75eeef2845925147fa17f16af6459Christian Williams
60d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Test
61d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void testDefaultConstructorUsesDefaultLooper() throws Exception {
62d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler1 = new Handler();
63d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler1.post(new Say("first thing"));
64d18686a842f75eeef2845925147fa17f16af6459Christian Williams
65d18686a842f75eeef2845925147fa17f16af6459Christian Williams        Handler handler2 = new Handler(Looper.myLooper());
66d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler2.post(new Say("second thing"));
67d18686a842f75eeef2845925147fa17f16af6459Christian Williams
68433b46be67768332f764eab6879e0649993d79e3Christian Williams        shadowOf(Looper.myLooper()).idle();
69d18686a842f75eeef2845925147fa17f16af6459Christian Williams
70d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript.assertEventsSoFar("first thing", "second thing");
71d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
72d18686a842f75eeef2845925147fa17f16af6459Christian Williams
73d18686a842f75eeef2845925147fa17f16af6459Christian Williams    @Test
74d18686a842f75eeef2845925147fa17f16af6459Christian Williams    public void testDifferentLoopersGetDifferentQueues() throws Exception {
75345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williams        Looper looper1 = Robolectric.newInstanceOf(Looper.class);
765dab156481a91717311fa47ff7e27a54865abfa3Phil Goodwin & Tyler Schultz        Robolectric.pauseLooper(looper1);
779cc6655219ea2788432360cf7f791488882bfbc3Phil Goodwin & Tyler Schultz
78345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williams        Looper looper2 = Robolectric.newInstanceOf(Looper.class);
795dab156481a91717311fa47ff7e27a54865abfa3Phil Goodwin & Tyler Schultz        Robolectric.pauseLooper(looper2);
80534fd31dba68daad0ad9d98c3c480139a3efa5a1Christian Williams & Tyler Schultz
81534fd31dba68daad0ad9d98c3c480139a3efa5a1Christian Williams & Tyler Schultz        Handler handler1 = new Handler(looper1);
82d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler1.post(new Say("first thing"));
83d18686a842f75eeef2845925147fa17f16af6459Christian Williams
84534fd31dba68daad0ad9d98c3c480139a3efa5a1Christian Williams & Tyler Schultz        Handler handler2 = new Handler(looper2);
85d18686a842f75eeef2845925147fa17f16af6459Christian Williams        handler2.post(new Say("second thing"));
86d18686a842f75eeef2845925147fa17f16af6459Christian Williams
87433b46be67768332f764eab6879e0649993d79e3Christian Williams        shadowOf(looper2).idle();
88d18686a842f75eeef2845925147fa17f16af6459Christian Williams
89d18686a842f75eeef2845925147fa17f16af6459Christian Williams        transcript.assertEventsSoFar("second thing");
90d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
91d18686a842f75eeef2845925147fa17f16af6459Christian Williams
92b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
93816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    public void shouldCallProvidedHandlerCallback() {
94816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        Handler handler = new Handler(callback);
95816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        handler.sendMessage(new Message());
96816362580ec2c74e4bf15f8f3d1081084dac0a61Dave        assertTrue(hasHandlerCallbackHandledMessage);
97816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    }
98816362580ec2c74e4bf15f8f3d1081084dac0a61Dave
99816362580ec2c74e4bf15f8f3d1081084dac0a61Dave    @Test
100b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostAndIdleMainLooper() throws Exception {
101b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().post(scratchRunnable);
102b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.idleMainLooper();
103b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(true));
104b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
105b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
106b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
107b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void postDelayedThenIdleMainLooper_shouldNotRunRunnable() throws Exception {
108b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(scratchRunnable, 1);
109b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.idleMainLooper();
110b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(false));
111b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
112b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
113b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
114b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedThenRunMainLooperOneTask() throws Exception {
115b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(scratchRunnable, 1);
116b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperOneTask();
117b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(true));
118b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
119b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
120b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
121e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    public void testRemoveCallbacks() throws Exception {
122e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        Handler handler = new Handler();
123e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        ShadowLooper shadowLooper = shadowOf(handler.getLooper());
124e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        shadowLooper.pause();
125e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        handler.post(scratchRunnable);
126e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        handler.removeCallbacks(scratchRunnable);
127e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire
128e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        shadowLooper.unPause();
129e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire
130e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire        assertThat(scratchRunnable.wasRun, equalTo(false));
131e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    }
132e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire
133e2c2daa717063899e30b0cafd4d81e60a36d6b0fpivotal-jiwire    @Test
134b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedThenRunMainLooperToNextTask_shouldRunOneTask() throws Exception {
135b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(scratchRunnable, 1);
136b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperToNextTask();
137b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(scratchRunnable.wasRun, equalTo(true));
138b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
139b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
140b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
141b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedTwiceThenRunMainLooperToNextTask_shouldRunMultipleTasks() throws Exception {
142b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task1 = new TestRunnable();
143b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task2 = new TestRunnable();
144b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
145b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task1, 1);
146b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task2, 1);
147b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
148b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperToNextTask();
149b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task1.wasRun, equalTo(true));
150b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task2.wasRun, equalTo(true));
151b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
152b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
153b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
154b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedTwiceThenRunMainLooperOneTask_shouldRunOnlyOneTask() throws Exception {
155b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task1 = new TestRunnable();
156b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task2 = new TestRunnable();
157b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
158b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task1, 1);
159b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task2, 1);
160b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
161b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperOneTask();
162b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task1.wasRun, equalTo(true));
163b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task2.wasRun, equalTo(false));
164b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
165b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
166b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    @Test
167b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    public void testPostDelayedMultipleThenRunMainLooperOneTask_shouldRunMultipleTask() throws Exception {
168b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task1 = new TestRunnable();
169b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task2 = new TestRunnable();
170b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        TestRunnable task3 = new TestRunnable();
171b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
172b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task1, 1);
173b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task2, 10);
174b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        new Handler().postDelayed(task3, 100);
175b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
176b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        ShadowHandler.runMainLooperToEndOfTasks();
177b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task1.wasRun, equalTo(true));
178b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task2.wasRun, equalTo(true));
179b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz        assertThat(task3.wasRun, equalTo(true));
180b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz    }
181b54505e42361f87b8ba24a785ae257f7d15feb2fPhil Goodwin & Tyler Schultz
182500a8f2575826f53dd09cf2400eb587a7ea687abMark Bakker    @Test
183478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    public void testPostAtFrontOfQueueThenRunMainLooperOneTaskAtATime_shouldRunFrontOfQueueTaskFirst() throws Exception {
184478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        TestRunnable task1 = new TestRunnable();
185478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        TestRunnable task2 = new TestRunnable();
186478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
187478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        ShadowLooper.pauseMainLooper();
188478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        new Handler().post(task1);
189478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        boolean result = new Handler().postAtFrontOfQueue(task2);
190478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
191478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertTrue(result);
192478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
193478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        ShadowHandler.runMainLooperOneTask();
194478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertThat(task2.wasRun, equalTo(true));
195478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertThat(task1.wasRun, equalTo(false));
196478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        ShadowHandler.runMainLooperOneTask();
197478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky        assertThat(task1.wasRun, equalTo(true));
198478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    }
199478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky
200478a40ed43134ef1568a19ab5233a5736a21c57bGlenn Jahnke & Lenny Turetsky    @Test
201bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen    public void testSendMessageAtFrontOfQueueThenRunMainLooperOneMsgAtATime_shouldRunFrontOfQueueMsgFirst() throws Exception {
202bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        Handler handler = new Handler();
203bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen
204bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        ShadowLooper.pauseMainLooper();
205bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        // Post two messages to handler. Handle first message and confirm that msg posted
206bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        // to front is removed.
207bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        handler.obtainMessage(123).sendToTarget();
208bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        Message frontMsg = handler.obtainMessage(345);
209bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        boolean result = handler.sendMessageAtFrontOfQueue(frontMsg);
210bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen
211bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        assertTrue(result);
212bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen
213bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        assertTrue(handler.hasMessages(123));
214bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        assertTrue(handler.hasMessages(345));
215bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        ShadowHandler.runMainLooperOneTask();
216bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        assertTrue(handler.hasMessages(123));
217bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        assertFalse(handler.hasMessages(345));
218bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        ShadowHandler.runMainLooperOneTask();
219bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        assertFalse(handler.hasMessages(123));
220bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen        assertFalse(handler.hasMessages(345));
221bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen    }
222bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen
223bcc9e9a8e0c59d3b18a75af01213499ab16d849aJon Boekenoogen    @Test
22406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void sendEmptyMessage_addMessageToQueue() {
22506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
22606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler();
22706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
22806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessage(123);
22906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(456), equalTo(false));
23006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(true));
23106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.idleMainLooper(0);
23206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
23306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
234d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
23506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    @Test
23606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void sendEmptyMessageDelayed_sendsMessageAtCorrectTime() {
23706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
23806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler();
23906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessageDelayed(123, 500);
24006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(true));
24106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.idleMainLooper(100);
24206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(true));
24306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.idleMainLooper(400);
24406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
24506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
24606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard
24706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    @Test
24806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void removeMessages_takesMessageOutOfQueue() {
24906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
25006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler();
25106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessageDelayed(123, 500);
25206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.removeMessages(123);
25306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(handler.hasMessages(123), equalTo(false));
25406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
25506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard
25606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    @Test
2573fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel    public void removeMessage_withSpecifiedObject() throws Exception {
2583fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Robolectric.pauseMainLooper();
2593fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Handler handler = new Handler();
2603fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Message.obtain(handler, 123, "foo").sendToTarget();
2613fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        Message.obtain(handler, 123, "bar").sendToTarget();
2623fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2633fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123), equalTo(true));
2643fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123, "foo"), equalTo(true));
2653fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123, "bar"), equalTo(true));
2663fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123, "baz"), equalTo(false));
2673fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2683fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        handler.removeMessages(123, "foo");
2693fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123), equalTo(true));
2703fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2713fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        handler.removeMessages(123, "bar");
2723fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel        assertThat(handler.hasMessages(123), equalTo(false));
2733fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel    }
2743fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel
2753fbb2f6e44960007166cb8824218f3dc2bb7893aJan Berkel    @Test
27604e66088f357467378221115b4981cb8cf3f8764Dave    public void testHasMessagesWithWhatAndObject() {
27704e66088f357467378221115b4981cb8cf3f8764Dave        Robolectric.pauseMainLooper();
27804e66088f357467378221115b4981cb8cf3f8764Dave        Object testObject = new Object();
27904e66088f357467378221115b4981cb8cf3f8764Dave        Handler handler = new Handler();
28004e66088f357467378221115b4981cb8cf3f8764Dave        Message message = handler.obtainMessage(123, testObject);
28104e66088f357467378221115b4981cb8cf3f8764Dave
28204e66088f357467378221115b4981cb8cf3f8764Dave        assertFalse(handler.hasMessages(123, testObject));
28304e66088f357467378221115b4981cb8cf3f8764Dave
28404e66088f357467378221115b4981cb8cf3f8764Dave        handler.sendMessage(message);
28504e66088f357467378221115b4981cb8cf3f8764Dave
28604e66088f357467378221115b4981cb8cf3f8764Dave        assertTrue(handler.hasMessages(123, testObject));
28704e66088f357467378221115b4981cb8cf3f8764Dave    }
28804e66088f357467378221115b4981cb8cf3f8764Dave
28904e66088f357467378221115b4981cb8cf3f8764Dave    @Test
29040674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen    public void testSendToTarget() {
29140674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Robolectric.pauseMainLooper();
29240674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Object testObject = new Object();
29340674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Handler handler = new Handler();
29440674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        Message message = handler.obtainMessage(123, testObject);
29540674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
29640674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        assertThat(handler, equalTo(message.getTarget()));
29740674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
29840674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        message.sendToTarget();
29940674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
30040674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen        assertTrue(handler.hasMessages(123, testObject));
30140674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen    }
30240674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen
30340674c5041023f9b5cb5570b8c5b81b5968ec585Jon Boekenoogen    @Test
30406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    public void removeMessages_removesFromLooperQueueAsWell() {
30506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        final boolean[] wasRun = new boolean[1];
30606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.pauseMainLooper();
30706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Handler handler = new Handler() {
30806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard            @Override
30906aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard            public void handleMessage(Message msg) {
31006aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard                wasRun[0] = true;
31106aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard            }
31206aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        };
31306aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.sendEmptyMessageDelayed(123, 500);
31406aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        handler.removeMessages(123);
31506aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        Robolectric.unPauseMainLooper();
31606aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard        assertThat(wasRun[0], equalTo(false));
31706aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard    }
31806aa4a5c70de83a58c935212bfd42056a14a8003Phil Plante & Ryan Richard
319d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel    @Test
320d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel    public void shouldObtainMessage() throws Exception {
321d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m0 = new Handler().obtainMessage();
322d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m0.what, equalTo(0));
323d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m0.obj, nullValue());
324d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
325d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m1 = new Handler().obtainMessage(1);
326d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m1.what, equalTo(1));
327d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m1.obj, nullValue());
328d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
329d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m2 = new Handler().obtainMessage(1, "foo");
330d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m2.what, equalTo(1));
331d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m2.obj, equalTo((Object)"foo"));
332d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
333d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m3 = new Handler().obtainMessage(1, 2, 3);
334d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.what, equalTo(1));
335d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.arg1, equalTo(2));
336d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.arg2, equalTo(3));
337d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m3.obj, nullValue());
338d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
339d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        Message m4 = new Handler().obtainMessage(1, 2, 3, "foo");
340d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.what, equalTo(1));
341d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.arg1, equalTo(2));
342d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.arg2, equalTo(3));
343d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel        assertThat(m4.obj, equalTo((Object)"foo"));
344d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel    }
345d642b5dd37e4e1c143e610e835ef72ef495a3272Jan Berkel
346962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel    @Test
347962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel    public void shouldSetWhenOnMessage() throws Exception {
348962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        final List<Message>  msgs = new ArrayList<Message>();
349962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        Handler h = new Handler(new Handler.Callback() {
350962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel            @Override
351962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel            public boolean handleMessage(Message msg) {
352962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel                msgs.add(msg);
353962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel                return false;
354962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel            }
355962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        });
356962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel
357962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        h.sendEmptyMessage(0);
358962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        h.sendEmptyMessageDelayed(0, 4000l);
359962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        Robolectric.getUiThreadScheduler().advanceToLastPostedRunnable();
360962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        h.sendEmptyMessageDelayed(0, 12000l);
361962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        Robolectric.getUiThreadScheduler().advanceToLastPostedRunnable();
362962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        assertThat(msgs.size(), equalTo(3));
363962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel
364962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        Message m0 = msgs.get(0);
365962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        Message m1 = msgs.get(1);
366962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        Message m2 = msgs.get(2);
367962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel
368962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        assertThat(m0.getWhen(), equalTo(0l));
369962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        assertThat(m1.getWhen(), equalTo(4000l));
370962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel        assertThat(m2.getWhen(), equalTo(16000l));
371962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel    }
372962dfc938fd6829f96079d4749f050da9118b8cbJan Berkel
373130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel    @Test
374130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel    public void shouldRemoveMessageFromQueueBeforeDispatching() throws Exception {
375130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel        Handler h = new Handler(Looper.myLooper()) {
376130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel            @Override
377130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel            public void handleMessage(Message msg) {
378130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel                assertFalse(hasMessages(0));
379130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel            }
380130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel        };
381130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel        h.sendEmptyMessage(0);
382130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel        h.sendMessageAtFrontOfQueue(h.obtainMessage());
383130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel    }
384130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel
385130c9efc4c26359166f0c0dc5856dab5fa269a43Jan Berkel
386d18686a842f75eeef2845925147fa17f16af6459Christian Williams    private class Say implements Runnable {
387d18686a842f75eeef2845925147fa17f16af6459Christian Williams        private String event;
388d18686a842f75eeef2845925147fa17f16af6459Christian Williams
389d18686a842f75eeef2845925147fa17f16af6459Christian Williams        public Say(String event) {
390d18686a842f75eeef2845925147fa17f16af6459Christian Williams            this.event = event;
391d18686a842f75eeef2845925147fa17f16af6459Christian Williams        }
392d18686a842f75eeef2845925147fa17f16af6459Christian Williams
393d18686a842f75eeef2845925147fa17f16af6459Christian Williams        @Override
394d18686a842f75eeef2845925147fa17f16af6459Christian Williams        public void run() {
395d18686a842f75eeef2845925147fa17f16af6459Christian Williams            transcript.add(event);
396d18686a842f75eeef2845925147fa17f16af6459Christian Williams        }
397d18686a842f75eeef2845925147fa17f16af6459Christian Williams    }
398d18686a842f75eeef2845925147fa17f16af6459Christian Williams}
399