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