| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.email.activity; |
| |
| import com.android.email.DBTestHelper; |
| import com.android.email.provider.ProviderTestUtils; |
| import com.android.emailcommon.provider.Account; |
| import com.android.emailcommon.provider.Mailbox; |
| |
| import android.content.Context; |
| import android.test.AndroidTestCase; |
| |
| /** |
| * Unit tests for {@link MailboxListFragment.FindParentMailboxTask}. |
| */ |
| public class FindParentMailboxTaskTest extends AndroidTestCase { |
| private Context mProviderContext; |
| |
| /** ID of the account created by {@link #setUpMailboxes}. */ |
| private long mAccountId; |
| |
| /** |
| * IDs for the mailboxes created by {@link #setUpMailboxes}. |
| * |
| * Mailbox hierarchy: |
| * <pre> |
| * |-Inbox |
| * |-Parent |
| * |-Child1 |
| * |-Child2 |
| * |-GrandChild1 |
| * |-GrandChild2 |
| * </pre> |
| */ |
| private long mIdInbox; |
| private long mIdParent; |
| private long mIdChild1; |
| private long mIdChild2; |
| private long mIdGrandChild1; |
| private long mIdGrandChild2; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext( |
| getContext()); |
| setUpMailboxes(); |
| } |
| |
| /** |
| * Set up a test account and mailboxes. |
| */ |
| private void setUpMailboxes() { |
| Account a = ProviderTestUtils.setupAccount("a", true, mProviderContext); |
| mAccountId = a.mId; |
| |
| mIdInbox = createMailboxAndGetId("Inbox", a, Mailbox.TYPE_INBOX, Mailbox.NO_MAILBOX); |
| mIdParent = createMailboxAndGetId("P", a, Mailbox.TYPE_MAIL, Mailbox.NO_MAILBOX); |
| mIdChild1 = createMailboxAndGetId("C1", a, Mailbox.TYPE_MAIL, mIdParent); |
| mIdChild2 = createMailboxAndGetId("C2", a, Mailbox.TYPE_MAIL, mIdParent); |
| mIdGrandChild1 = createMailboxAndGetId("G1", a, Mailbox.TYPE_MAIL, mIdChild2); |
| mIdGrandChild2 = createMailboxAndGetId("G2", a, Mailbox.TYPE_MAIL, mIdChild2); |
| } |
| |
| private long createMailboxAndGetId(String name, Account account, int type, |
| long parentMailboxId) { |
| Mailbox m = ProviderTestUtils.setupMailbox(name, account.mId, false, mProviderContext, |
| type); |
| m.mParentKey = parentMailboxId; |
| m.save(mProviderContext); |
| return m.mId; |
| } |
| |
| /** |
| * Tests for two-pane. (highlighting is enabled) |
| */ |
| public void testWithHighlight() { |
| /* |
| * In the comments below, [MAILBOX] indicates "highlighted", and MAILBOX* indicates |
| * "selected". |
| */ |
| /* |
| * from: |
| * - [Child2] |
| * - GChild1 |
| * - GChild2 |
| * |
| * to: |
| * - Parent |
| * - Child1 |
| * - [Child2]* |
| */ |
| doCheckWithHighlight( |
| mIdChild2, // Current parent |
| mIdChild2, // Current highlighted |
| |
| mIdParent, // Next root |
| mIdChild2, // Next highlighted |
| mIdChild2 // Next selected |
| ); |
| |
| /* |
| * from: |
| * - Child2 |
| * - [GChild1] |
| * - GChild2 |
| * |
| * to: |
| * - [Parent]* |
| * - Child1 |
| * - Child2 |
| */ |
| doCheckWithHighlight( |
| mIdChild2, // Current parent |
| mIdGrandChild1, // Current highlighted |
| |
| mIdParent, // Next root |
| mIdParent, // Next highlighted |
| mIdParent // Next selected |
| ); |
| |
| /* |
| * from: |
| * - [Parent] |
| * - Child1 |
| * - Child2 |
| * |
| * to: |
| * - Inbox |
| * - [Parent]* |
| */ |
| doCheckWithHighlight( |
| mIdParent, // Current parent |
| mIdParent, // Current highlighted |
| |
| Mailbox.NO_MAILBOX, // Next root |
| mIdParent, // Next highlighted |
| mIdParent // Next selected |
| ); |
| |
| /* |
| * from: |
| * - Parent |
| * - [Child1] |
| * - Child2 |
| * |
| * to: |
| * - [Inbox]* |
| * - Parent |
| */ |
| doCheckWithHighlight( |
| mIdParent, // Current parent |
| mIdChild1, // Current highlighted |
| |
| Mailbox.NO_MAILBOX, // Next root |
| mIdInbox, // Next highlighted |
| mIdInbox // Next selected |
| ); |
| |
| /* |
| * Special case. |
| * Up from root view, with "Parent" highlighted. "Up" will be disabled in this case, but |
| * if we were to run the task, it'd work as if the current parent mailbox is gone. |
| * i.e. just show the top level mailboxes, with Inbox highlighted. |
| * |
| * from: |
| * - Inbox |
| * - [Parent] |
| * |
| * to: |
| * - [Inbox] |
| * - Parent |
| */ |
| doCheckWithHighlight( |
| Mailbox.NO_MAILBOX, // Current parent |
| mIdParent, // Current highlighted |
| |
| Mailbox.NO_MAILBOX, // Next root |
| mIdInbox, // Next highlighted |
| mIdInbox // Next selected |
| ); |
| |
| /* |
| * Special case. |
| * Current parent mailbox is gone. The result should be same as the above. |
| * |
| * from: |
| * (current mailbox just removed) |
| * |
| * to: |
| * - [Inbox] |
| * - Parent |
| */ |
| doCheckWithHighlight( |
| 12312234234L, // Current parent |
| mIdParent, // Current highlighted |
| |
| Mailbox.NO_MAILBOX, // Next root |
| mIdInbox, // Next highlighted |
| mIdInbox // Next selected |
| ); |
| } |
| |
| private void doCheckWithHighlight( |
| long parentMailboxId, long highlightedMailboxId, |
| long expectedNextParent, long expectedNextHighlighted, long expectedNextSelected) { |
| doCheck(true, parentMailboxId, highlightedMailboxId, |
| expectedNextParent, expectedNextHighlighted, expectedNextSelected); |
| } |
| |
| /** |
| * Tests for one-pane. (highlighting is disable) |
| */ |
| public void testWithNoHighlight() { |
| /* |
| * from: |
| * - Child2 |
| * - GChild1 |
| * - GChild2 |
| * |
| * to: |
| * - Parent |
| * - Child1 |
| * - Child2 |
| */ |
| doCheckWithNoHighlight( |
| mIdChild2, // Current parent |
| mIdParent // Next root |
| ); |
| /* |
| * from: |
| * - Parent |
| * - Child1 |
| * - Child2 |
| * |
| * to: |
| * - Inbox |
| * - Parent |
| */ |
| doCheckWithNoHighlight( |
| mIdParent, // Current parent |
| Mailbox.NO_MAILBOX // Next root |
| ); |
| |
| /* |
| * Special case. |
| * Current parent mailbox is gone. The top-level mailboxes should be shown. |
| * |
| * from: |
| * (current mailbox just removed) |
| * |
| * to: |
| * - Inbox |
| * - Parent |
| */ |
| doCheckWithNoHighlight( |
| 12312234234L, // Current parent |
| Mailbox.NO_MAILBOX // Next root |
| ); |
| } |
| |
| private void doCheckWithNoHighlight(long parentMailboxId, long expectedNextParent) { |
| doCheck(false, parentMailboxId, Mailbox.NO_MAILBOX, |
| expectedNextParent, Mailbox.NO_MAILBOX, |
| expectedNextParent /* parent should always be selected */); |
| } |
| |
| private void doCheck(boolean enableHighlight, |
| long parentMailboxId, long highlightedMailboxId, |
| long expectedNextParent, long expectedNextHighlighted, long expectedNextSelected) { |
| ResultCallback result = new ResultCallback(); |
| |
| MailboxListFragment.FindParentMailboxTask task |
| = new MailboxListFragment.FindParentMailboxTask( |
| mProviderContext, null, mAccountId, enableHighlight, parentMailboxId, |
| highlightedMailboxId, result); |
| |
| // Can't execute an async task on the test thread, so emulate execution... |
| task.onSuccess(task.doInBackground((Void[]) null)); |
| |
| assertEquals("parent", expectedNextParent, result.mNextParentMailboxId); |
| assertEquals("highlighted", expectedNextHighlighted, result.mNextHighlightedMailboxId); |
| assertEquals("selected", expectedNextSelected, result.mNextSelectedMailboxId); |
| } |
| |
| private static class ResultCallback |
| implements MailboxListFragment.FindParentMailboxTask.ResultCallback { |
| public long mNextParentMailboxId; |
| public long mNextHighlightedMailboxId; |
| public long mNextSelectedMailboxId; |
| |
| @Override |
| public void onResult(long nextParentMailboxId, long nextHighlightedMailboxId, |
| long nextSelectedMailboxId) { |
| mNextParentMailboxId = nextParentMailboxId; |
| mNextHighlightedMailboxId = nextHighlightedMailboxId; |
| mNextSelectedMailboxId = nextSelectedMailboxId; |
| } |
| } |
| } |