1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.email.activity;
18
19import com.android.email.DBTestHelper;
20import com.android.email.provider.ProviderTestUtils;
21import com.android.emailcommon.provider.Account;
22import com.android.emailcommon.provider.Mailbox;
23
24import android.content.Context;
25import android.test.AndroidTestCase;
26
27/**
28 * Unit tests for {@link MailboxListFragment.FindParentMailboxTask}.
29 */
30public class FindParentMailboxTaskTest extends AndroidTestCase {
31    private Context mProviderContext;
32
33    /** ID of the account created by {@link #setUpMailboxes}. */
34    private long mAccountId;
35
36    /**
37     * IDs for the mailboxes created by {@link #setUpMailboxes}.
38     *
39     * Mailbox hierarchy:
40     * <pre>
41     * |-Inbox
42     * |-Parent
43     *   |-Child1
44     *   |-Child2
45     *     |-GrandChild1
46     *     |-GrandChild2
47     * </pre>
48     */
49    private long mIdInbox;
50    private long mIdParent;
51    private long mIdChild1;
52    private long mIdChild2;
53    private long mIdGrandChild1;
54    private long mIdGrandChild2;
55
56    @Override
57    protected void setUp() throws Exception {
58        super.setUp();
59
60        mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
61                getContext());
62        setUpMailboxes();
63    }
64
65    /**
66     * Set up a test account and mailboxes.
67     */
68    private void setUpMailboxes() {
69        Account a = ProviderTestUtils.setupAccount("a", true, mProviderContext);
70        mAccountId = a.mId;
71
72        mIdInbox = createMailboxAndGetId("Inbox", a, Mailbox.TYPE_INBOX, Mailbox.NO_MAILBOX);
73        mIdParent = createMailboxAndGetId("P", a, Mailbox.TYPE_MAIL, Mailbox.NO_MAILBOX);
74        mIdChild1 = createMailboxAndGetId("C1", a, Mailbox.TYPE_MAIL, mIdParent);
75        mIdChild2 = createMailboxAndGetId("C2", a, Mailbox.TYPE_MAIL, mIdParent);
76        mIdGrandChild1 = createMailboxAndGetId("G1", a, Mailbox.TYPE_MAIL, mIdChild2);
77        mIdGrandChild2 = createMailboxAndGetId("G2", a, Mailbox.TYPE_MAIL, mIdChild2);
78    }
79
80    private long createMailboxAndGetId(String name, Account account, int type,
81            long parentMailboxId) {
82        Mailbox m = ProviderTestUtils.setupMailbox(name, account.mId, false, mProviderContext,
83                type);
84        m.mParentKey = parentMailboxId;
85        m.save(mProviderContext);
86        return m.mId;
87    }
88
89    /**
90     * Tests for two-pane.  (highlighting is enabled)
91     */
92    public void testWithHighlight() {
93        /*
94         * In the comments below, [MAILBOX] indicates "highlighted", and MAILBOX* indicates
95         * "selected".
96         */
97        /*
98         * from:
99         * - [Child2]
100         *   - GChild1
101         *   - GChild2
102         *
103         * to:
104         * - Parent
105         *   - Child1
106         *   - [Child2]*
107         */
108        doCheckWithHighlight(
109                mIdChild2, // Current parent
110                mIdChild2, // Current highlighted
111
112                mIdParent, // Next root
113                mIdChild2, // Next highlighted
114                mIdChild2 // Next selected
115                );
116
117        /*
118         * from:
119         * - Child2
120         *   - [GChild1]
121         *   - GChild2
122         *
123         * to:
124         * - [Parent]*
125         *   - Child1
126         *   - Child2
127         */
128        doCheckWithHighlight(
129                mIdChild2, // Current parent
130                mIdGrandChild1, // Current highlighted
131
132                mIdParent, // Next root
133                mIdParent, // Next highlighted
134                mIdParent // Next selected
135                );
136
137        /*
138         * from:
139         * - [Parent]
140         *   - Child1
141         *   - Child2
142         *
143         * to:
144         * - Inbox
145         * - [Parent]*
146         */
147        doCheckWithHighlight(
148                mIdParent, // Current parent
149                mIdParent, // Current highlighted
150
151                Mailbox.NO_MAILBOX, // Next root
152                mIdParent, // Next highlighted
153                mIdParent // Next selected
154                );
155
156        /*
157         * from:
158         * - Parent
159         *   - [Child1]
160         *   - Child2
161         *
162         * to:
163         * - [Inbox]*
164         * - Parent
165         */
166        doCheckWithHighlight(
167                mIdParent, // Current parent
168                mIdChild1, // Current highlighted
169
170                Mailbox.NO_MAILBOX, // Next root
171                mIdInbox, // Next highlighted
172                mIdInbox // Next selected
173                );
174
175        /*
176         * Special case.
177         * Up from root view, with "Parent" highlighted.  "Up" will be disabled in this case, but
178         * if we were to run the task, it'd work as if the current parent mailbox is gone.
179         * i.e. just show the top level mailboxes, with Inbox highlighted.
180         *
181         * from:
182         * - Inbox
183         * - [Parent]
184         *
185         * to:
186         * - [Inbox]
187         * - Parent
188         */
189        doCheckWithHighlight(
190                Mailbox.NO_MAILBOX, // Current parent
191                mIdParent, // Current highlighted
192
193                Mailbox.NO_MAILBOX, // Next root
194                mIdInbox, // Next highlighted
195                mIdInbox // Next selected
196                );
197
198        /*
199         * Special case.
200         * Current parent mailbox is gone.  The result should be same as the above.
201         *
202         * from:
203         *  (current mailbox just removed)
204         *
205         * to:
206         * - [Inbox]
207         * - Parent
208         */
209        doCheckWithHighlight(
210                12312234234L, // Current parent
211                mIdParent, // Current highlighted
212
213                Mailbox.NO_MAILBOX, // Next root
214                mIdInbox, // Next highlighted
215                mIdInbox // Next selected
216                );
217    }
218
219    private void doCheckWithHighlight(
220            long parentMailboxId, long highlightedMailboxId,
221            long expectedNextParent, long expectedNextHighlighted, long expectedNextSelected) {
222        doCheck(true, parentMailboxId, highlightedMailboxId,
223                expectedNextParent, expectedNextHighlighted, expectedNextSelected);
224    }
225
226    /**
227     * Tests for one-pane.  (highlighting is disable)
228     */
229    public void testWithNoHighlight() {
230        /*
231         * from:
232         * - Child2
233         *   - GChild1
234         *   - GChild2
235         *
236         * to:
237         * - Parent
238         *   - Child1
239         *   - Child2
240         */
241        doCheckWithNoHighlight(
242                mIdChild2, // Current parent
243                mIdParent // Next root
244                );
245        /*
246         * from:
247         * - Parent
248         *   - Child1
249         *   - Child2
250         *
251         * to:
252         * - Inbox
253         * - Parent
254         */
255        doCheckWithNoHighlight(
256                mIdParent, // Current parent
257                Mailbox.NO_MAILBOX // Next root
258                );
259
260        /*
261         * Special case.
262         * Current parent mailbox is gone.  The top-level mailboxes should be shown.
263         *
264         * from:
265         *  (current mailbox just removed)
266         *
267         * to:
268         * - Inbox
269         * - Parent
270         */
271        doCheckWithNoHighlight(
272                12312234234L, // Current parent
273                Mailbox.NO_MAILBOX // Next root
274                );
275    }
276
277    private void doCheckWithNoHighlight(long parentMailboxId, long expectedNextParent) {
278        doCheck(false, parentMailboxId, Mailbox.NO_MAILBOX,
279                expectedNextParent, Mailbox.NO_MAILBOX,
280                expectedNextParent /* parent should always be selected */);
281    }
282
283    private void doCheck(boolean enableHighlight,
284            long parentMailboxId, long highlightedMailboxId,
285            long expectedNextParent, long expectedNextHighlighted, long expectedNextSelected) {
286        ResultCallback result = new ResultCallback();
287
288        MailboxListFragment.FindParentMailboxTask task
289                = new MailboxListFragment.FindParentMailboxTask(
290                mProviderContext, null, mAccountId, enableHighlight, parentMailboxId,
291                highlightedMailboxId, result);
292
293        // Can't execute an async task on the test thread, so emulate execution...
294        task.onSuccess(task.doInBackground((Void[]) null));
295
296        assertEquals("parent", expectedNextParent, result.mNextParentMailboxId);
297        assertEquals("highlighted", expectedNextHighlighted, result.mNextHighlightedMailboxId);
298        assertEquals("selected", expectedNextSelected, result.mNextSelectedMailboxId);
299    }
300
301    private static class ResultCallback
302            implements MailboxListFragment.FindParentMailboxTask.ResultCallback {
303        public long mNextParentMailboxId;
304        public long mNextHighlightedMailboxId;
305        public long mNextSelectedMailboxId;
306
307        @Override
308        public void onResult(long nextParentMailboxId, long nextHighlightedMailboxId,
309                long nextSelectedMailboxId) {
310            mNextParentMailboxId = nextParentMailboxId;
311            mNextHighlightedMailboxId = nextHighlightedMailboxId;
312            mNextSelectedMailboxId = nextSelectedMailboxId;
313        }
314    }
315}
316