1de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki/* 2de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Copyright (C) 2010 The Android Open Source Project 3de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * 4de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * you may not use this file except in compliance with the License. 6de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * You may obtain a copy of the License at 7de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * 8de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * 10de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Unless required by applicable law or agreed to in writing, software 11de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * See the License for the specific language governing permissions and 14de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * limitations under the License. 15de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki */ 16de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 17de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukipackage com.android.email.activity; 18de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 19de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukiimport android.content.Context; 20de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukiimport android.database.AbstractCursor; 21de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukiimport android.database.Cursor; 22de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukiimport android.os.Handler; 23de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukiimport android.test.ProviderTestCase2; 24de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukiimport android.test.suitebuilder.annotation.SmallTest; 25de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 26513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komaloimport com.android.email.MessageListContext; 27513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komaloimport com.android.email.provider.EmailProvider; 28513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komaloimport com.android.emailcommon.provider.EmailContent; 29513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komaloimport com.android.emailcommon.utility.DelayedOperations; 30513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komalo 31de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukiimport junit.framework.Assert; 32de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 33de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki@SmallTest 34de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onukipublic class MessageOrderManagerTest extends ProviderTestCase2<EmailProvider> { 35de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 36de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki private MyCallback mCallback; 37de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 38de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override protected void setUp() throws Exception { 39de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki super.setUp(); 40de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback = new MyCallback(); 41de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 42de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 43de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public MessageOrderManagerTest() { 4431d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank super(EmailProvider.class, EmailContent.AUTHORITY); 45de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 46de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 47de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki private static void assertCanMove(MessageOrderManager mom, boolean newer, boolean older) { 48de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki Assert.assertEquals(older, mom.canMoveToOlder()); 49de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki Assert.assertEquals(newer, mom.canMoveToNewer()); 50de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 51de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 52de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void testBasic() { 53de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki MessageOrderManagerForTest mom = new MessageOrderManagerForTest(getContext(), 1, mCallback); 54de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.assertStartQueryCalledAndReset(); 55de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 56de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // moveTo not called, so it returns -1 57de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(-1, mom.getCurrentMessageId()); 58de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 59de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Task not finished, so all returns false. 60de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, false, false); 61de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertFalse(mom.moveToNewer()); 62de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertFalse(mom.moveToOlder()); 63de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 64de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Set current message 65de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.moveTo(54); 66de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(54, mom.getCurrentMessageId()); 67de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 68de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Task still not finished, so all returns false. 69de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, false, false); 70de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertFalse(mom.moveToNewer()); 71de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertFalse(mom.moveToOlder()); 72de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 73de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Both callbacks shouldn't have called. 74de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, false); 75931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki 76931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki // Cursor not open yet, so these are both 0. 77931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(0, mom.getCurrentPosition()); 78931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(0, mom.getTotalMessageCount()); 79de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 80de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 81de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki /** 82de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Test with actual message list. 83de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * 84de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * In this test, {@link MessageOrderManager#moveTo} is called AFTER the cursor opens. 85de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki */ 86de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void testWithList() { 87de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki MessageOrderManagerForTest mom = new MessageOrderManagerForTest(getContext(), 1, mCallback); 88de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.assertStartQueryCalledAndReset(); 89de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 90de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Callback not called yet. 91de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, false); 92de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 93de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Inject mock cursor. (Imitate async query done.) 94de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki MyCursor cursor = new MyCursor(11, 22, 33, 44); // Newer to older 95de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.onCursorOpenDone(cursor); 96de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 97931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(0, mom.getCurrentPosition()); 98931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(4, mom.getTotalMessageCount()); 99931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki 100de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Current message id not set yet, so callback should have called yet. 101de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, false); 102de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 103de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Set current message id -- now onMessagesChanged() should get called. 104de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.moveTo(22); 105931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(1, mom.getCurrentPosition()); 106de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 107de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 108de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, true); 109de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 110de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Move to row 1 111de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertTrue(mom.moveToNewer()); 112931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(0, mom.getCurrentPosition()); 113de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(11, mom.getCurrentMessageId()); 114de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, false, true); 115de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 116de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 117de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Try to move to newer, but no newer messages 118de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertFalse(mom.moveToNewer()); 119931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(0, mom.getCurrentPosition()); 120de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(11, mom.getCurrentMessageId()); // Still row 1 121de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, false); 122de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 123de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Move to row 2 124de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertTrue(mom.moveToOlder()); 125931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(1, mom.getCurrentPosition()); 126de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 127de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, true); 128de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 129de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 130de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Move to row 3 131de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertTrue(mom.moveToOlder()); 132931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(2, mom.getCurrentPosition()); 133de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(33, mom.getCurrentMessageId()); 134de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, true); 135de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 136de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 137de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Move to row 4 138de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertTrue(mom.moveToOlder()); 139931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(3, mom.getCurrentPosition()); 140de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(44, mom.getCurrentMessageId()); 141de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, false); 142de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 143de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 144de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Try to move older, but no Older messages 145de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertFalse(mom.moveToOlder()); 146931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(3, mom.getCurrentPosition()); 147de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, false); 148de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 149de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Move to row 3 150de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertTrue(mom.moveToNewer()); 151931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(2, mom.getCurrentPosition()); 152de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(33, mom.getCurrentMessageId()); 153de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, true); 154de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 155de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 156de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 157de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki /** 158de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Test with actual message list. 159de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * 160de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * In this test, {@link MessageOrderManager#moveTo} is called BEFORE the cursor opens. 161de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki */ 162de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void testWithList2() { 163de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki MessageOrderManagerForTest mom = new MessageOrderManagerForTest(getContext(), 1, mCallback); 164de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.assertStartQueryCalledAndReset(); 165de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 166de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Callback not called yet. 167de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, false); 168de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 169de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.moveTo(22); 170de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, false); // Cursor not open, callback not called yet. 171de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 172de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 173931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki // cursor not open yet 174931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(0, mom.getCurrentPosition()); 175931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(0, mom.getTotalMessageCount()); 176931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki 177de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Inject mock cursor. (Imitate async query done.) 178de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki MyCursor cursor = new MyCursor(11, 22, 33, 44); // Newer to older 179de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.onCursorOpenDone(cursor); 180de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 181de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // As soon as the cursor opens, callback gets called. 182de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 183de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 184931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki 185931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(1, mom.getCurrentPosition()); 186931ca67a1f1baa0c1fd115124e35183c7786fc63Makoto Onuki assertEquals(4, mom.getTotalMessageCount()); 187de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 188de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 189de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void testContentChanged() { 190de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki MessageOrderManagerForTest mom = new MessageOrderManagerForTest(getContext(), 1, mCallback); 191de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 192de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Inject mock cursor. (Imitate async query done.) 193de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki MyCursor cursor = new MyCursor(11, 22, 33, 44); // Newer to older 194de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.onCursorOpenDone(cursor); 195de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 196de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Move to 22 197de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.moveTo(22); 198de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 199de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 200de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, true); 201de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 202de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Delete 33 203de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.updateMessageList(11, 22, 44); 204de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 205de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 206de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 207de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, true); 208de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 209de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Delete 44 210de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.updateMessageList(11, 22); 211de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 212de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 213de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 214de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, false); // Can't move to older 215de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 216de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Append 55 217de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.updateMessageList(11, 22, 55); 218de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 219de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 220de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 221de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, true, true); 222de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 223de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Delete 11 224de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.updateMessageList(22, 55); 225de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 226de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 227de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 228de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, false, true); 229de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 230de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Delete 55 231de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.updateMessageList(22); 232de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 233de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(true, false); 234de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(22, mom.getCurrentMessageId()); 235de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertCanMove(mom, false, false); // Can't move either way 236de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 237638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki // Delete 22 -- no messages left. 238638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki mom.updateMessageList(); 239638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki mCallback.assertCallbacksCalled(false, true); 240de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 241638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki // Test for the case where list is not empty, but the current message is gone. 242638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki // First, set up a list with 22 as the current message. 243638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki mom.updateMessageList(11, 22, 33, 44); 244638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki mom.moveTo(22); 245638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki assertEquals(22, mom.getCurrentMessageId()); 246638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki mCallback.assertCallbacksCalled(true, false); 247638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki 248638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki // Then remove the current message. 249638c67f4dbad4055b1d89834ca2e140f55a06d66Makoto Onuki mom.updateMessageList(11, 33, 44); 250de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCallback.assertCallbacksCalled(false, true); 251de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 252de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 253de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki /** 254de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Test using the actual {@link MessageOrderManager} rather than 255de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * {@link MessageOrderManagerForTest}. 256de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki */ 257de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void testWithActualClass() { 258de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // There are not many things we can test synchronously. 259de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Just open & close just to make sure it won't crash. 260513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komalo MessageOrderManager mom = new MessageOrderManager( 261513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komalo getContext(), MessageListContext.forMailbox(1, 1), new MyCallback()); 262de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.moveTo(123); 263de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mom.close(); 264de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 265de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 266de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki private static class MyCallback implements MessageOrderManager.Callback { 267de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public boolean mCalledOnMessageNotFound; 268de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public boolean mCalledOnMessagesChanged; 269de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 270de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public void onMessagesChanged() { 271de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCalledOnMessagesChanged = true; 272de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 273de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 274de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public void onMessageNotFound() { 275de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCalledOnMessageNotFound = true; 276de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 277de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 278de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki /** 279de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Asserts that the callbacks have/have not been called, and reset the flags. 280de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki */ 281de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void assertCallbacksCalled(boolean messagesChanged, boolean messageNotFound) { 282de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(messagesChanged, mCalledOnMessagesChanged); 283de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertEquals(messageNotFound, mCalledOnMessageNotFound); 284de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 285de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCalledOnMessagesChanged = false; 286de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mCalledOnMessageNotFound = false; 287de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 288de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 289de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 290de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki /** 2912ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki * "Non" delayed operation -- runs the runnable immediately 2922ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki */ 2932ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki private static final class NonDelayedOperations extends DelayedOperations { 2942ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki public NonDelayedOperations() { 2952ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki super(new Handler()); 2962ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki } 2972ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki 2982ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki @Override 2992ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki public void post(Runnable r) { 3002ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki r.run(); 3012ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki } 3022ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki } 3032ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki 3042ac164f609faea134b8fa1d6c0ebc90ccda91166Makoto Onuki /** 305de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * MessageOrderManager for test. Overrides {@link #startQuery} 306de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki */ 307de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki private static class MessageOrderManagerForTest extends MessageOrderManager { 308de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki private Cursor mLastCursor; 309de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public boolean mStartQueryCalled; 310de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 311de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public MessageOrderManagerForTest(Context context, long mailboxId, Callback callback) { 312513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komalo super(context, MessageListContext.forMailbox(1, mailboxId), 313513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komalo callback, new NonDelayedOperations()); 314de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 315de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 316de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override void startQuery() { 317de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // To make tests synchronous, we replace this method. 318de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mStartQueryCalled = true; 319de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 320de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 321de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override /* package */ Handler getHandlerForContentObserver() { 322de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki return null; 323de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 324de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 325de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override void onCursorOpenDone(Cursor cursor) { 326de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki super.onCursorOpenDone(cursor); 327de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mLastCursor = cursor; 328de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 329de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 330de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki /** 331de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki * Utility method to emulate data set changed. 332de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki */ 333de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void updateMessageList(long... idList) { 334de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertNotNull(mLastCursor); // Make sure a cursor is set. 335de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 336de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Notify dataset change -- it should end up startQuery() gets called. 337de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki ((MyCursor) mLastCursor).notifyChanged(); 338de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertStartQueryCalledAndReset(); // Start 339de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 340de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki // Set a new cursor with a new list. 341de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki onCursorOpenDone(new MyCursor(idList)); 342de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 343de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 344de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void assertStartQueryCalledAndReset() { 345de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki assertTrue(mStartQueryCalled); 346de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mStartQueryCalled = false; 347de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 348de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 349de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 350de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki private static class MyCursor extends AbstractCursor { 351513486cfb5d446f098b1c97d16932e51e316d1a7Ben Komalo private final long[] mList; 352de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 353de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public MyCursor(long... idList) { 354de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki mList = (idList == null) ? new long[0] : idList; 355de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 356de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 357de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki public void notifyChanged() { 358de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki onChange(false); 359de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 360de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 361de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public int getColumnCount() { 362de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki return 1; 363de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 364de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 365de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public int getCount() { 366de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki return mList.length; 367de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 368de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 369de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public String[] getColumnNames() { 370de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki return new String[] {EmailContent.RECORD_ID}; 371de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 372de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 373de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public long getLong(int columnIndex) { 374de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki Assert.assertEquals(EmailContent.ID_PROJECTION_COLUMN, columnIndex); 375de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki return mList[mPos]; 376de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 377de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 378de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public double getDouble(int column) { 379de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki throw new junit.framework.AssertionFailedError(); 380de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 381de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 382de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public float getFloat(int column) { 383de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki throw new junit.framework.AssertionFailedError(); 384de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 385de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 386de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public int getInt(int column) { 387de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki throw new junit.framework.AssertionFailedError(); 388de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 389de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 390de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public short getShort(int column) { 391de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki throw new junit.framework.AssertionFailedError(); 392de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 393de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 394de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public String getString(int column) { 395de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki throw new junit.framework.AssertionFailedError(); 396de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 397de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki 398de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki @Override public boolean isNull(int column) { 399de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki throw new junit.framework.AssertionFailedError(); 400de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 401de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki } 402de0a1c33c9507e96d554ca645d42d07f1241157eMakoto Onuki} 403