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