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