1a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki/*
2a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * Copyright (C) 2012 The Android Open Source Project
3a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki *
4a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
5a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * you may not use this file except in compliance with the License.
6a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * You may obtain a copy of the License at
7a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki *
8a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
9a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki *
10a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * Unless required by applicable law or agreed to in writing, software
11a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
12a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * See the License for the specific language governing permissions and
14a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki * limitations under the License.
15a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki */
16a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
17a5d37c8a968edf94755215617b593d3f61738a92Makoto Onukipackage com.android.ex.chips;
18a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
19a5d37c8a968edf94755215617b593d3f61738a92Makoto Onukiimport android.database.Cursor;
20a5d37c8a968edf94755215617b593d3f61738a92Makoto Onukiimport android.database.MatrixCursor;
2187b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedyimport android.net.Uri;
2287b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedyimport android.provider.ContactsContract.DisplayNameSources;
23a5d37c8a968edf94755215617b593d3f61738a92Makoto Onukiimport android.test.AndroidTestCase;
24a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
2587b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedyimport com.android.ex.chips.RecipientAlternatesAdapter;
2687b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedyimport com.android.ex.chips.RecipientEntry;
2787b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
28a5d37c8a968edf94755215617b593d3f61738a92Makoto Onukipublic class RecipientAlternatesAdapterTest extends AndroidTestCase {
29a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
307a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    public void testRemoveUndesiredDestinations() {
31a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        MatrixCursor c = new MatrixCursor(Queries.EMAIL.getProjection());
32a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        Cursor result;
33a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
34a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        // Test: Empty input
357a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        assertEquals(0, RecipientAlternatesAdapter.removeUndesiredDestinations(c,
367a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                null /* desiredMimeType */, null /* lookupKey */).getCount());
37a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
38a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
39a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        // Test: One row
40a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        addRow(c, "a", "1@android.com", 1, "home", 1000, 2000, "x", 0);
41a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
427a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        result = RecipientAlternatesAdapter.removeUndesiredDestinations(c,
437a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                null /* desiredMimeType */, null /* lookupKey */);
44a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(1, result.getCount());
45a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertRow(result, 0, "a", "1@android.com", 1, "home", 1000, 2000, "x", 0);
46a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
47a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        // Test: two unique rows, different destinations
48a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        addRow(c, "a", "2@android.com", 1, "home", 1000, 2000, "x", 0);
49a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
507a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        result = RecipientAlternatesAdapter.removeUndesiredDestinations(c,
517a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                null /* desiredMimeType */, null /* lookupKey */);
52a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(2, result.getCount());
53a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertRow(result, 0, "a", "1@android.com", 1, "home", 1000, 2000, "x", 0);
54a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertRow(result, 1, "a", "2@android.com", 1, "home", 1000, 2000, "x", 0);
55a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
56a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        // Test: add a third row with a non-unique destination.
57a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        addRow(c, "ax", "1@android.com", 11, "homex", 10001, 2000, "xx", 1);
58a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
59a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        // Third row should be removed.
607a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        result = RecipientAlternatesAdapter.removeUndesiredDestinations(c,
617a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                null /* desiredMimeType */, null /* lookupKey */);
62a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(2, result.getCount());
63a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertRow(result, 0, "a", "1@android.com", 1, "home", 1000, 2000, "x", 0);
64a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertRow(result, 1, "a", "2@android.com", 1, "home", 1000, 2000, "x", 0);
65a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
66a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        // Test: add a forth row with a non-unique destination again.
67a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        addRow(c, "ax", "2@android.com", 11, "homex", 10001, 2000, "xx", 1);
68a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
69a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        // Forth row should also be removed.
707a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        result = RecipientAlternatesAdapter.removeUndesiredDestinations(c,
717a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                null /* desiredMimeType */, null /* lookupKey */);
72a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(2, result.getCount());
73a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertRow(result, 0, "a", "1@android.com", 1, "home", 1000, 2000, "x", 0);
74a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertRow(result, 1, "a", "2@android.com", 1, "home", 1000, 2000, "x", 0);
75a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki    }
76a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
77a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki    private static MatrixCursor addRow(MatrixCursor c,
78a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String displayName,
79a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String destination,
80a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            int destinationType,
81a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String destinationLabel,
82a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            long contactId,
83a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            long dataId,
84a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String photoUri,
85a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            int displayNameSource
86a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            ) {
87a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        c.addRow(new Object[] {displayName, destination, destinationType, destinationLabel,
88a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki                contactId, dataId, photoUri, displayNameSource});
89a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        return c;
90a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki    }
91a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki
92a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki    private static void assertRow(Cursor c, int position,
93a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String displayName,
94a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String destination,
95a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            int destinationType,
96a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String destinationLabel,
97a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            long contactId,
98a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            long dataId,
99a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            String photoUri,
100a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            int displayNameSource
101a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki            ) {
102a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertTrue(c.moveToPosition(position));
103a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(displayName, c.getString(0));
104a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(destination, c.getString(1));
105a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(destinationType, c.getInt(2));
106a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(destinationLabel, c.getString(3));
107a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(contactId, c.getLong(4));
108a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(dataId, c.getLong(5));
109a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(photoUri, c.getString(6));
110a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki        assertEquals(displayNameSource, c.getInt(7));
111a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki    }
11287b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
11387b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy    public void testGetBetterRecipient() {
11487b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        // Ensure that if either (but not both) parameters are null, the other is returned
11587b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        {
11687b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry1 =
11787b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy                    RecipientEntry.constructFakeEntry("1@android.com", true);
11887b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry2 = null;
11987b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
12087b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry1, entry2), entry1);
12187b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry2, entry1), entry1);
12287b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        }
12387b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
12487b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        // Ensure that if only one has a display name, it is used
12587b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        {
12687b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry1 =
12787b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy                    RecipientEntry.constructTopLevelEntry("Android", DisplayNameSources.NICKNAME,
1287a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            "1@android.com", 0, null, 0, null /* directoryId */, 0, (Uri) null,
1297a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            true, null /* lookupKey */);
13087b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry2 = RecipientEntry.constructFakeEntry("1@android.com", true);
13187b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
13287b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry1, entry2), entry1);
13387b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry2, entry1), entry1);
13487b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        }
13587b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
13687b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        // Ensure that if one has a display name different from its destination, and the other's
13787b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        // is equal to its destination, we use the unique one
13887b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        {
13987b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry1 =
14087b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy                    RecipientEntry.constructTopLevelEntry("Android", DisplayNameSources.NICKNAME,
1417a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            "1@android.com", 0, null, 0, null /* directoryId */, 0, (Uri) null,
1427a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            true, null /* lookupKey */);
14387b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry2 =
14487b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy                    RecipientEntry.constructTopLevelEntry("2@android.com", DisplayNameSources.EMAIL,
1457a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            "2@android.com", 0, null, 0, null /* directoryId */, 0, (Uri) null,
1467a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            true, null /* lookupKey */);
14787b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
14887b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry1, entry2), entry1);
14987b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry2, entry1), entry1);
15087b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        }
15187b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
15287b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        // Ensure that if only one has a photo, it is used
15387b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        {
15487b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry1 =
15587b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy                    RecipientEntry.constructTopLevelEntry("Android", DisplayNameSources.NICKNAME,
1567a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            "1@android.com", 0, null, 0, null /* directoryId */, 0,
1577a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            Uri.parse("http://www.android.com"), true, null /* lookupKey */);
15887b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            final RecipientEntry entry2 =
15987b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy                    RecipientEntry.constructTopLevelEntry("Android", DisplayNameSources.EMAIL,
1607a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            "2@android.com", 0, null, 0, null /* directoryId */,
1617a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                            0, (Uri) null, true, null /* lookupKey */);
16287b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy
16387b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry1, entry2), entry1);
16487b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy            assertEquals(RecipientAlternatesAdapter.getBetterRecipient(entry2, entry1), entry1);
16587b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy        }
16687b683e238bbf8f64237fd4cf20950e8e84fd763Scott Kennedy    }
167a5d37c8a968edf94755215617b593d3f61738a92Makoto Onuki}
168