15ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/*
25ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Copyright (C) 2009 The Android Open Source Project
35ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
45ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Licensed under the Apache License, Version 2.0 (the "License");
55ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * you may not use this file except in compliance with the License.
65ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * You may obtain a copy of the License at
75ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
85ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *      http://www.apache.org/licenses/LICENSE-2.0
95ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Unless required by applicable law or agreed to in writing, software
115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * distributed under the License is distributed on an "AS IS" BASIS,
125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * See the License for the specific language governing permissions and
145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * limitations under the License.
155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepackage com.android.contacts.common;
185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport static android.content.ContentProviderOperation.TYPE_DELETE;
205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport static android.content.ContentProviderOperation.TYPE_INSERT;
215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport static android.content.ContentProviderOperation.TYPE_UPDATE;
225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.ContentProviderOperation;
245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.ContentValues;
255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.net.Uri;
265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.os.Bundle;
275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract;
285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Email;
295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Event;
305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Im;
315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Organization;
325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Phone;
335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Data;
365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Intents.Insert;
375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.RawContacts;
385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.AndroidTestCase;
395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.suitebuilder.annotation.LargeTest;
405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.AccountTypeManager;
425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContact;
435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContactDelta;
445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.ValuesDelta;
455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContactDeltaList;
465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContactModifier;
475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType;
485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType.EditType;
495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.ExchangeAccountType;
505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.GoogleAccountType;
515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.dataitem.DataKind;
525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.ContactsMockContext;
535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockAccountTypeManager;
545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockContentProvider;
555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.google.common.collect.Lists;
565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.ArrayList;
585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.List;
595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/**
615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Tests for {@link RawContactModifier} to verify that {@link AccountType}
625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * constraints are being enforced correctly.
635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee@LargeTest
655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepublic class RawContactModifierTests extends AndroidTestCase {
665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public static final String TAG = "EntityModifierTests";
675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public static final long VER_FIRST = 100;
695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final long TEST_ID = 4;
715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String TEST_PHONE = "218-555-1212";
725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String TEST_NAME = "Adam Young";
735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String TEST_NAME2 = "Breanne Duren";
745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String TEST_IM = "example@example.com";
755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String TEST_POSTAL = "1600 Amphitheatre Parkway";
765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String TEST_ACCOUNT_NAME = "unittest@example.com";
785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String TEST_ACCOUNT_TYPE = "com.example.unittest";
795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private static final String EXCHANGE_ACCT_TYPE = "com.android.exchange";
815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    @Override
835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void setUp() {
845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContext = getContext();
855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public static class MockContactsSource extends AccountType {
885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        MockContactsSource() {
905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            try {
915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                this.accountType = TEST_ACCOUNT_TYPE;
925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final DataKind nameKind = new DataKind(StructuredName.CONTENT_ITEM_TYPE,
945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        R.string.nameLabelsGroup, -1, true);
955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                nameKind.typeOverallMax = 1;
965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                addKind(nameKind);
975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                // Phone allows maximum 2 home, 1 work, and unlimited other, with
995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                // constraint of 5 numbers maximum.
1005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final DataKind phoneKind = new DataKind(
1015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Phone.CONTENT_ITEM_TYPE, -1, 10, true);
1025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.typeOverallMax = 5;
1045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.typeColumn = Phone.TYPE;
1055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.typeList = Lists.newArrayList();
1065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.typeList.add(new EditType(Phone.TYPE_HOME, -1).setSpecificMax(2));
1075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.typeList.add(new EditType(Phone.TYPE_WORK, -1).setSpecificMax(1));
1085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, -1).setSecondary(true));
1095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.typeList.add(new EditType(Phone.TYPE_OTHER, -1));
1105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.fieldList = Lists.newArrayList();
1125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.fieldList.add(new EditField(Phone.NUMBER, -1, -1));
1135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                phoneKind.fieldList.add(new EditField(Phone.LABEL, -1, -1));
1145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                addKind(phoneKind);
1165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                // Email is unlimited
1185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final DataKind emailKind = new DataKind(Email.CONTENT_ITEM_TYPE, -1, 10, true);
1195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                emailKind.typeOverallMax = -1;
1205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                emailKind.fieldList = Lists.newArrayList();
1215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                emailKind.fieldList.add(new EditField(Email.DATA, -1, -1));
1225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                addKind(emailKind);
1235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                // IM is only one
1255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final DataKind imKind = new DataKind(Im.CONTENT_ITEM_TYPE, -1, 10, true);
1265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                imKind.typeOverallMax = 1;
1275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                imKind.fieldList = Lists.newArrayList();
1285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                imKind.fieldList.add(new EditField(Im.DATA, -1, -1));
1295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                addKind(imKind);
1305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                // Organization is only one
1325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final DataKind orgKind = new DataKind(Organization.CONTENT_ITEM_TYPE, -1, 10, true);
1335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                orgKind.typeOverallMax = 1;
1345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                orgKind.fieldList = Lists.newArrayList();
1355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                orgKind.fieldList.add(new EditField(Organization.COMPANY, -1, -1));
1365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                orgKind.fieldList.add(new EditField(Organization.TITLE, -1, -1));
1375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                addKind(orgKind);
1385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            } catch (DefinitionException e) {
1395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                throw new RuntimeException(e);
1405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            }
1415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
1425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        @Override
1445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        public boolean isGroupMembershipEditable() {
1455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            return false;
1465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
1475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        @Override
1495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        public boolean areContactsWritable() {
1505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            return true;
1515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
1525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
1555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Build a {@link AccountType} that has various odd constraints for
1565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * testing purposes.
1575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
1585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected AccountType getAccountType() {
1595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return new MockContactsSource();
1605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
1635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Build {@link AccountTypeManager} instance.
1645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
1655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected AccountTypeManager getAccountTypes(AccountType... types) {
1665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return new MockAccountTypeManager(types, null);
1675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
1705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Build an {@link RawContact} with the requested set of phone numbers.
1715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
1725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected RawContactDelta getRawContact(Long existingId, ContentValues... entries) {
1735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues contact = new ContentValues();
1745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        if (existingId != null) {
1755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            contact.put(RawContacts._ID, existingId);
1765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
1775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        contact.put(RawContacts.ACCOUNT_NAME, TEST_ACCOUNT_NAME);
1785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        contact.put(RawContacts.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE);
1795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContact before = new RawContact(contact);
1815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        for (ContentValues values : entries) {
1825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            before.addDataItemValues(values);
1835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
1845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return RawContactDelta.fromBefore(before);
1855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
1885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Assert this {@link List} contains the given {@link Object}.
1895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
1905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected void assertContains(List<?> list, Object object) {
1915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue("Missing expected value", list.contains(object));
1925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
1955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Assert this {@link List} does not contain the given {@link Object}.
1965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
1975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected void assertNotContains(List<?> list, Object object) {
1985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertFalse("Contained unexpected value", list.contains(object));
1995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Insert various rows to test
2035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * {@link RawContactModifier#getValidTypes(RawContactDelta, DataKind, EditType)}
2045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testValidTypes() {
2065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build a source and pull specific types
2075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
2085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
2095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
2105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeWork = RawContactModifier.getType(kindPhone, Phone.TYPE_WORK);
2115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeOther = RawContactModifier.getType(kindPhone, Phone.TYPE_OTHER);
2125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<EditType> validTypes;
2145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add first home, first work
2165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
2175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
2185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeWork);
2195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Expecting home, other
2215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        validTypes = RawContactModifier.getValidTypes(state, kindPhone, null);
2225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertContains(validTypes, typeHome);
2235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotContains(validTypes, typeWork);
2245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertContains(validTypes, typeOther);
2255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add second home
2275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
2285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Expecting other
2305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        validTypes = RawContactModifier.getValidTypes(state, kindPhone, null);
2315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotContains(validTypes, typeHome);
2325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotContains(validTypes, typeWork);
2335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertContains(validTypes, typeOther);
2345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add third and fourth home (invalid, but possible)
2365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
2375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
2385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Expecting none
2405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        validTypes = RawContactModifier.getValidTypes(state, kindPhone, null);
2415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotContains(validTypes, typeHome);
2425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotContains(validTypes, typeWork);
2435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotContains(validTypes, typeOther);
2445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Test {@link RawContactModifier#canInsert(RawContactDelta, DataKind)} by
2485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * inserting various rows.
2495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testCanInsert() {
2515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build a source and pull specific types
2525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
2535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
2545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
2555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeWork = RawContactModifier.getType(kindPhone, Phone.TYPE_WORK);
2565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeOther = RawContactModifier.getType(kindPhone, Phone.TYPE_OTHER);
2575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add first home, first work
2595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
2605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
2615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeWork);
2625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue("Unable to insert", RawContactModifier.canInsert(state, kindPhone));
2635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add two other, which puts us just under "5" overall limit
2655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeOther);
2665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeOther);
2675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue("Unable to insert", RawContactModifier.canInsert(state, kindPhone));
2685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add second home, which should push to snug limit
2705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
2715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertFalse("Able to insert", RawContactModifier.canInsert(state, kindPhone));
2725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Test
2765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * {@link RawContactModifier#getBestValidType(RawContactDelta, DataKind, boolean, int)}
2775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * by asserting expected best options in various states.
2785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testBestValidType() {
2805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build a source and pull specific types
2815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
2825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
2835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
2845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeWork = RawContactModifier.getType(kindPhone, Phone.TYPE_WORK);
2855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeFaxWork = RawContactModifier.getType(kindPhone, Phone.TYPE_FAX_WORK);
2865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeOther = RawContactModifier.getType(kindPhone, Phone.TYPE_OTHER);
2875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        EditType suggested;
2895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Default suggestion should be home
2915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
2925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE);
2935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected suggestion", typeHome, suggested);
2945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add first home, should now suggest work
2965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
2975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE);
2985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected suggestion", typeWork, suggested);
2995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add work fax, should still suggest work
3015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeFaxWork);
3025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE);
3035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected suggestion", typeWork, suggested);
3045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add other, should still suggest work
3065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeOther);
3075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE);
3085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected suggestion", typeWork, suggested);
3095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Add work, now should suggest other
3115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeWork);
3125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE);
3135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected suggestion", typeOther, suggested);
3145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testIsEmptyEmpty() {
3175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
3185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
3195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Test entirely empty row
3215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues after = new ContentValues();
3225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ValuesDelta values = ValuesDelta.fromAfter(after);
3235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue("Expected empty", RawContactModifier.isEmpty(values, kindPhone));
3255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testIsEmptyDirectFields() {
3285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
3295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
3305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
3315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Test row that has type values, but core fields are empty
3335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
3345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ValuesDelta values = RawContactModifier.insertChild(state, kindPhone, typeHome);
3355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue("Expected empty", RawContactModifier.isEmpty(values, kindPhone));
3375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Insert some data to trigger non-empty state
3395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        values.put(Phone.NUMBER, TEST_PHONE);
3405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertFalse("Expected non-empty", RawContactModifier.isEmpty(values, kindPhone));
3425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimEmptySingle() {
3455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
3465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
3475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
3485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Test row that has type values, but core fields are empty
3505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
3515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
3525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting insert for data row and update enforcement
3545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
3555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
3565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 3, diff.size());
3575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
3585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
3595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
3605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
3615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
3635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(1);
3645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_INSERT, oper.getType());
3655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri());
3665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
3685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(2);
3695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
3705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
3715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Trim empty rows and try again, expecting delete of overall contact
3745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(state, source);
3755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
3765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
3775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 1, diff.size());
3785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
3795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
3805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_DELETE, oper.getType());
3815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
3825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimEmptySpaces() {
3865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
3875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
3885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
3895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Test row that has type values, but values are spaces
3915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = RawContactDeltaListTests.buildBeforeEntity(mContext, TEST_ID,
3925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                VER_FIRST);
3935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ValuesDelta values = RawContactModifier.insertChild(state, kindPhone, typeHome);
3945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        values.put(Phone.NUMBER, "   ");
3955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting insert for data row and update enforcement
3975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDeltaListTests.assertDiffPattern(state,
3985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildAssertVersion(VER_FIRST),
3995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildUpdateAggregationSuspended(),
4005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildOper(Data.CONTENT_URI, TYPE_INSERT,
4015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContactDeltaListTests.buildDataInsert(values, TEST_ID)),
4025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildUpdateAggregationDefault());
4035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Trim empty rows and try again, expecting delete of overall contact
4055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(state, source);
4065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDeltaListTests.assertDiffPattern(state,
4075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildAssertVersion(VER_FIRST),
4085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildDelete(RawContacts.CONTENT_URI));
4095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimLeaveValid() {
4125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
4135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
4145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
4155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Test row that has type values with valid number
4175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = RawContactDeltaListTests.buildBeforeEntity(mContext, TEST_ID,
4185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                VER_FIRST);
4195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ValuesDelta values = RawContactModifier.insertChild(state, kindPhone, typeHome);
4205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        values.put(Phone.NUMBER, TEST_PHONE);
4215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting insert for data row and update enforcement
4235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDeltaListTests.assertDiffPattern(state,
4245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildAssertVersion(VER_FIRST),
4255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildUpdateAggregationSuspended(),
4265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildOper(Data.CONTENT_URI, TYPE_INSERT,
4275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContactDeltaListTests.buildDataInsert(values, TEST_ID)),
4285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildUpdateAggregationDefault());
4295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Trim empty rows and try again, expecting no differences
4315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(state, source);
4325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDeltaListTests.assertDiffPattern(state,
4335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildAssertVersion(VER_FIRST),
4345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildUpdateAggregationSuspended(),
4355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildOper(Data.CONTENT_URI, TYPE_INSERT,
4365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContactDeltaListTests.buildDataInsert(values, TEST_ID)),
4375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                RawContactDeltaListTests.buildUpdateAggregationDefault());
4385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimEmptyUntouched() {
4415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
4425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
4435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
4445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build "before" that has empty row
4465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
4475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues before = new ContentValues();
4485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        before.put(Data._ID, TEST_ID);
4495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        before.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
4505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.addEntry(ValuesDelta.fromBefore(before));
4515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting no changes
4535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
4545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
4555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 0, diff.size());
4565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Try trimming existing empty, which we shouldn't touch
4585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(state, source);
4595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
4605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
4615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 0, diff.size());
4625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimEmptyAfterUpdate() {
4655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType source = getAccountType();
4665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
4675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
4685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build "before" that has row with some phone number
4705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues before = new ContentValues();
4715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        before.put(Data._ID, TEST_ID);
4725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        before.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
4735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        before.put(kindPhone.typeColumn, typeHome.rawValue);
4745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        before.put(Phone.NUMBER, TEST_PHONE);
4755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID, before);
4765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting no changes
4785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
4795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
4805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 0, diff.size());
4815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Now update row by changing number to empty string, expecting single update
4835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ValuesDelta child = state.getEntry(TEST_ID);
4845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        child.put(Phone.NUMBER, "");
4855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
4865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
4875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 3, diff.size());
4885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
4895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
4905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
4915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
4925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
4935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
4945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(1);
4955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_UPDATE, oper.getType());
4965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri());
4975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
4985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
4995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(2);
5005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
5015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
5025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
5035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Now run trim, which should turn that update into delete
5055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(state, source);
5065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
5075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
5085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 1, diff.size());
5095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
5105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
5115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_DELETE, oper.getType());
5125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
5135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
5145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
5155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimInsertEmpty() {
5175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
5185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountTypeManager accountTypes = getAccountTypes(accountType);
5195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
5205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
5215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Try creating a contact without any child entries
5235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(null);
5245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDeltaList set = new RawContactDeltaList();
5255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        set.add(state);
5265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting single insert
5295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
5305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
5315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 2, diff.size());
5325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
5335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
5345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_INSERT, oper.getType());
5355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
5365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
5375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Trim empty rows and try again, expecting no insert
5395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(set, accountTypes);
5405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
5415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
5425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 0, diff.size());
5435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
5445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimInsertInsert() {
5465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
5475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountTypeManager accountTypes = getAccountTypes(accountType);
5485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
5495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
5505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Try creating a contact with single empty entry
5525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(null);
5535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.insertChild(state, kindPhone, typeHome);
5545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDeltaList set = new RawContactDeltaList();
5555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        set.add(state);
5565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting two insert operations
5585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
5595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
5605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 3, diff.size());
5615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
5625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
5635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_INSERT, oper.getType());
5645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
5655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
5665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
5675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(1);
5685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_INSERT, oper.getType());
5695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri());
5705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
5715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Trim empty rows and try again, expecting silence
5735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(set, accountTypes);
5745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
5755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
5765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 0, diff.size());
5775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
5785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimUpdateRemain() {
5805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
5815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountTypeManager accountTypes = getAccountTypes(accountType);
5825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
5835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
5845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build "before" with two phone numbers
5865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues first = new ContentValues();
5875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data._ID, TEST_ID);
5885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
5895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(kindPhone.typeColumn, typeHome.rawValue);
5905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Phone.NUMBER, TEST_PHONE);
5915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues second = new ContentValues();
5935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        second.put(Data._ID, TEST_ID);
5945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        second.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
5955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        second.put(kindPhone.typeColumn, typeHome.rawValue);
5965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        second.put(Phone.NUMBER, TEST_PHONE);
5975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
5985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID, first, second);
5995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDeltaList set = new RawContactDeltaList();
6005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        set.add(state);
6015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting no changes
6035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
6045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
6055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 0, diff.size());
6065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Now update row by changing number to empty string, expecting single update
6085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ValuesDelta child = state.getEntry(TEST_ID);
6095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        child.put(Phone.NUMBER, "");
6105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
6115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
6125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 3, diff.size());
6135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
6155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
6165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
6175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(1);
6205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_UPDATE, oper.getType());
6215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri());
6225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(2);
6255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
6265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
6275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Now run trim, which should turn that update into delete
6305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(set, accountTypes);
6315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
6325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
6335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 3, diff.size());
6345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
6365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
6375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
6385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(1);
6415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_DELETE, oper.getType());
6425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri());
6435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(2);
6465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
6475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
6485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
6505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testTrimUpdateUpdate() {
6525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
6535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountTypeManager accountTypes = getAccountTypes(accountType);
6545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
6555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME);
6565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build "before" with two phone numbers
6585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues first = new ContentValues();
6595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data._ID, TEST_ID);
6605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
6615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(kindPhone.typeColumn, typeHome.rawValue);
6625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Phone.NUMBER, TEST_PHONE);
6635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID, first);
6655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDeltaList set = new RawContactDeltaList();
6665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        set.add(state);
6675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build diff, expecting no changes
6695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
6705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
6715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 0, diff.size());
6725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Now update row by changing number to empty string, expecting single update
6745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ValuesDelta child = state.getEntry(TEST_ID);
6755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        child.put(Phone.NUMBER, "");
6765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
6775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
6785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 3, diff.size());
6795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
6815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
6825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
6835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(1);
6865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_UPDATE, oper.getType());
6875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri());
6885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
6905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(2);
6915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType());
6925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
6935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
6945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
6955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Now run trim, which should turn into deleting the whole contact
6965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.trimEmpty(set, accountTypes);
6975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        diff.clear();
6985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        state.buildDiff(diff);
6995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected operations", 1, diff.size());
7005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        {
7015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final ContentProviderOperation oper = diff.get(0);
7025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect type", TYPE_DELETE, oper.getType());
7035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri());
7045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
7055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
7065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testParseExtrasExistingName() {
7085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
7095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build "before" name
7115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues first = new ContentValues();
7125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data._ID, TEST_ID);
7135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
7145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(StructuredName.GIVEN_NAME, TEST_NAME);
7155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Parse extras, making sure we keep single name
7175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID, first);
7185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Bundle extras = new Bundle();
7195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        extras.putString(Insert.NAME, TEST_NAME2);
7205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.parseExtras(mContext, accountType, state, extras);
7215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final int nameCount = state.getMimeEntriesCount(StructuredName.CONTENT_ITEM_TYPE, true);
7235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Unexpected names", 1, nameCount);
7245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
7255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testParseExtrasIgnoreLimit() {
7275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
7285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Build "before" IM
7305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContentValues first = new ContentValues();
7315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data._ID, TEST_ID);
7325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
7335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        first.put(Im.DATA, TEST_IM);
7345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID, first);
7365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final int beforeCount = state.getMimeEntries(Im.CONTENT_ITEM_TYPE).size();
7375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // We should ignore data that doesn't fit account type rules, since account type
7395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // only allows single Im
7405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Bundle extras = new Bundle();
7415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        extras.putInt(Insert.IM_PROTOCOL, Im.PROTOCOL_GOOGLE_TALK);
7425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        extras.putString(Insert.IM_HANDLE, TEST_IM);
7435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.parseExtras(mContext, accountType, state, extras);
7445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final int afterCount = state.getMimeEntries(Im.CONTENT_ITEM_TYPE).size();
7465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Broke account type rules", beforeCount, afterCount);
7475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
7485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testParseExtrasIgnoreUnhandled() {
7505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
7515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
7525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // We should silently ignore types unsupported by account type
7545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Bundle extras = new Bundle();
7555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        extras.putString(Insert.POSTAL, TEST_POSTAL);
7565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.parseExtras(mContext, accountType, state, extras);
7575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNull("Broke accoun type rules",
7595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                state.getMimeEntries(StructuredPostal.CONTENT_ITEM_TYPE));
7605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
7615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testParseExtrasJobTitle() {
7635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final AccountType accountType = getAccountType();
7645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final RawContactDelta state = getRawContact(TEST_ID);
7655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Make sure that we create partial Organizations
7675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Bundle extras = new Bundle();
7685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        extras.putString(Insert.JOB_TITLE, TEST_NAME);
7695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.parseExtras(mContext, accountType, state, extras);
7705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final int count = state.getMimeEntries(Organization.CONTENT_ITEM_TYPE).size();
7725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("Expected to create organization", 1, count);
7735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
7745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateWithDisplayNameFromGoogleToExchange1() {
7765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
7775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
7785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
7795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactsMockContext context = new ContactsMockContext(getContext());
7815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
7835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
7845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
7855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.PREFIX, "prefix");
7865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.GIVEN_NAME, "given");
7875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.MIDDLE_NAME, "middle");
7885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.FAMILY_NAME, "family");
7895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.SUFFIX, "suffix");
7905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "PHONETIC_FAMILY");
7915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.PHONETIC_MIDDLE_NAME, "PHONETIC_MIDDLE");
7925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "PHONETIC_GIVEN");
7935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
7945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
7955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
7965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateStructuredName(context, oldState, newState, kind);
7975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE);
7985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());
7995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues output = list.get(0).getAfter();
8015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("prefix", output.getAsString(StructuredName.PREFIX));
8025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("given", output.getAsString(StructuredName.GIVEN_NAME));
8035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("middle", output.getAsString(StructuredName.MIDDLE_NAME));
8045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("family", output.getAsString(StructuredName.FAMILY_NAME));
8055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("suffix", output.getAsString(StructuredName.SUFFIX));
8065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Phonetic middle name isn't supported by Exchange.
8075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("PHONETIC_FAMILY", output.getAsString(StructuredName.PHONETIC_FAMILY_NAME));
8085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("PHONETIC_GIVEN", output.getAsString(StructuredName.PHONETIC_GIVEN_NAME));
8095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
8105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateWithDisplayNameFromGoogleToExchange2() {
8125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
8135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
8145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
8155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactsMockContext context = new ContactsMockContext(getContext());
8175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        MockContentProvider provider = context.getContactsProvider();
8185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        String inputDisplayName = "prefix given middle family suffix";
8205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // The method will ask the provider to split/join StructuredName.
8215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Uri uriForBuildDisplayName =
8225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                ContactsContract.AUTHORITY_URI
8235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .buildUpon()
8245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendPath("complete_name")
8255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendQueryParameter(StructuredName.DISPLAY_NAME, inputDisplayName)
8265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .build();
8275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        provider.expectQuery(uriForBuildDisplayName)
8285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                .returnRow("prefix", "given", "middle", "family", "suffix")
8295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                .withProjection(StructuredName.PREFIX, StructuredName.GIVEN_NAME,
8305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        StructuredName.MIDDLE_NAME, StructuredName.FAMILY_NAME,
8315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        StructuredName.SUFFIX);
8325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
8345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
8355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
8365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.DISPLAY_NAME, inputDisplayName);
8375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
8385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
8405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateStructuredName(context, oldState, newState, kind);
8415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE);
8425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());
8435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
8455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("prefix", outputValues.getAsString(StructuredName.PREFIX));
8465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("given", outputValues.getAsString(StructuredName.GIVEN_NAME));
8475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("middle", outputValues.getAsString(StructuredName.MIDDLE_NAME));
8485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("family", outputValues.getAsString(StructuredName.FAMILY_NAME));
8495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("suffix", outputValues.getAsString(StructuredName.SUFFIX));
8505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
8515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateWithStructuredNameFromExchangeToGoogle() {
8535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
8545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new GoogleAccountType(getContext(), "");
8555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
8565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactsMockContext context = new ContactsMockContext(getContext());
8585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        MockContentProvider provider = context.getContactsProvider();
8595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // The method will ask the provider to split/join StructuredName.
8615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Uri uriForBuildDisplayName =
8625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                ContactsContract.AUTHORITY_URI
8635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .buildUpon()
8645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendPath("complete_name")
8655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendQueryParameter(StructuredName.PREFIX, "prefix")
8665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendQueryParameter(StructuredName.GIVEN_NAME, "given")
8675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendQueryParameter(StructuredName.MIDDLE_NAME, "middle")
8685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendQueryParameter(StructuredName.FAMILY_NAME, "family")
8695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .appendQueryParameter(StructuredName.SUFFIX, "suffix")
8705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        .build();
8715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        provider.expectQuery(uriForBuildDisplayName)
8725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                .returnRow("prefix given middle family suffix")
8735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                .withProjection(StructuredName.DISPLAY_NAME);
8745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
8765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
8775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
8785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.PREFIX, "prefix");
8795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.GIVEN_NAME, "given");
8805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.MIDDLE_NAME, "middle");
8815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.FAMILY_NAME, "family");
8825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredName.SUFFIX, "suffix");
8835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
8845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
8865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateStructuredName(context, oldState, newState, kind);
8875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE);
8895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
8905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());
8915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
8925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("prefix given middle family suffix",
8935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                outputValues.getAsString(StructuredName.DISPLAY_NAME));
8945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
8955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
8965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigratePostalFromGoogleToExchange() {
8975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
8985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
8995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE);
9005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
9025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
9035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE);
9045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredPostal.FORMATTED_ADDRESS, "formatted_address");
9055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
9065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
9085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migratePostal(oldState, newState, kind);
9095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(StructuredPostal.CONTENT_ITEM_TYPE);
9115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
9125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());
9135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
9145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // FORMATTED_ADDRESS isn't supported by Exchange.
9155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNull(outputValues.getAsString(StructuredPostal.FORMATTED_ADDRESS));
9165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("formatted_address", outputValues.getAsString(StructuredPostal.STREET));
9175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
9185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigratePostalFromExchangeToGoogle() {
9205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
9215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new GoogleAccountType(getContext(), "");
9225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE);
9235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
9255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
9265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE);
9275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredPostal.COUNTRY, "country");
9285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredPostal.POSTCODE, "postcode");
9295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredPostal.REGION, "region");
9305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredPostal.CITY, "city");
9315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(StructuredPostal.STREET, "street");
9325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
9335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
9355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migratePostal(oldState, newState, kind);
9365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(StructuredPostal.CONTENT_ITEM_TYPE);
9385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
9395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());
9405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
9415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Check FORMATTED_ADDRESS contains all info.
9435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        String formattedAddress = outputValues.getAsString(StructuredPostal.FORMATTED_ADDRESS);
9445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(formattedAddress);
9455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(formattedAddress.contains("country"));
9465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(formattedAddress.contains("postcode"));
9475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(formattedAddress.contains("region"));
9485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(formattedAddress.contains("postcode"));
9495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(formattedAddress.contains("city"));
9505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(formattedAddress.contains("street"));
9515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
9525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateEventFromGoogleToExchange1() {
9545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        testMigrateEventCommon(new GoogleAccountType(getContext(), ""),
9555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE));
9565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
9575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateEventFromExchangeToGoogle() {
9595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        testMigrateEventCommon(new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE),
9605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                new GoogleAccountType(getContext(), ""));
9615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
9625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private void testMigrateEventCommon(AccountType oldAccountType, AccountType newAccountType) {
9645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(Event.CONTENT_ITEM_TYPE);
9655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
9675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
9685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
9695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Event.START_DATE, "1972-02-08");
9705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Event.TYPE, Event.TYPE_BIRTHDAY);
9715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
9725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
9745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateEvent(oldState, newState, kind, 1990);
9755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(Event.CONTENT_ITEM_TYPE);
9775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
9785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());  // Anniversary should be dropped.
9795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
9805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("1972-02-08", outputValues.getAsString(Event.START_DATE));
9825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Event.TYPE_BIRTHDAY, outputValues.getAsInteger(Event.TYPE).intValue());
9835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
9845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateEventFromGoogleToExchange2() {
9865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
9875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
9885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(Event.CONTENT_ITEM_TYPE);
9895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
9905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
9915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
9925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
9935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // No year format is not supported by Exchange.
9945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Event.START_DATE, "--06-01");
9955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Event.TYPE, Event.TYPE_BIRTHDAY);
9965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
9975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
9985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
9995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Event.START_DATE, "1980-08-02");
10005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Anniversary is not supported by Exchange
10015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Event.TYPE, Event.TYPE_ANNIVERSARY);
10025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
10055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateEvent(oldState, newState, kind, 1990);
10065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(Event.CONTENT_ITEM_TYPE);
10085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
10095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());  // Anniversary should be dropped.
10105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
10115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Default year should be used.
10135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("1990-06-01", outputValues.getAsString(Event.START_DATE));
10145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Event.TYPE_BIRTHDAY, outputValues.getAsInteger(Event.TYPE).intValue());
10155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
10165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateEmailFromGoogleToExchange() {
10185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
10195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
10205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(Email.CONTENT_ITEM_TYPE);
10215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
10235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
10245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
10255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.TYPE, Email.TYPE_CUSTOM);
10265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.LABEL, "custom_type");
10275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.ADDRESS, "address1");
10285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
10305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
10315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.TYPE, Email.TYPE_HOME);
10325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.ADDRESS, "address2");
10335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
10355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
10365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.TYPE, Email.TYPE_WORK);
10375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.ADDRESS, "address3");
10385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Exchange can have up to 3 email entries. This 4th entry should be dropped.
10405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
10415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
10425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.TYPE, Email.TYPE_OTHER);
10435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Email.ADDRESS, "address4");
10445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
10475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateGenericWithTypeColumn(oldState, newState, kind);
10485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(Email.CONTENT_ITEM_TYPE);
10505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
10515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(3, list.size());
10525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
10545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Email.TYPE_CUSTOM, outputValues.getAsInteger(Email.TYPE).intValue());
10555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("custom_type", outputValues.getAsString(Email.LABEL));
10565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("address1", outputValues.getAsString(Email.ADDRESS));
10575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        outputValues = list.get(1).getAfter();
10595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Email.TYPE_HOME, outputValues.getAsInteger(Email.TYPE).intValue());
10605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("address2", outputValues.getAsString(Email.ADDRESS));
10615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        outputValues = list.get(2).getAfter();
10635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Email.TYPE_WORK, outputValues.getAsInteger(Email.TYPE).intValue());
10645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("address3", outputValues.getAsString(Email.ADDRESS));
10655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
10665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateImFromGoogleToExchange() {
10685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
10695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
10705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(Im.CONTENT_ITEM_TYPE);
10715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
10735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
10745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
10755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Exchange doesn't support TYPE_HOME
10765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.TYPE, Im.TYPE_HOME);
10775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_JABBER);
10785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.DATA, "im1");
10795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
10825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
10835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Exchange doesn't support TYPE_WORK
10845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.TYPE, Im.TYPE_WORK);
10855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_YAHOO);
10865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.DATA, "im2");
10875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
10905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
10915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.TYPE, Im.TYPE_OTHER);
10925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
10935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.CUSTOM_PROTOCOL, "custom_protocol");
10945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.DATA, "im3");
10955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
10965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
10975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Exchange can have up to 3 IM entries. This 4th entry should be dropped.
10985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
10995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
11005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.TYPE, Im.TYPE_OTHER);
11015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK);
11025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Im.DATA, "im4");
11035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
11045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
11065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateGenericWithTypeColumn(oldState, newState, kind);
11075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(Im.CONTENT_ITEM_TYPE);
11095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
11105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(3, list.size());
11115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(kind.defaultValues.getAsInteger(Im.TYPE));
11135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        int defaultType = kind.defaultValues.getAsInteger(Im.TYPE);
11155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
11175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // HOME should become default type.
11185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(defaultType, outputValues.getAsInteger(Im.TYPE).intValue());
11195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Im.PROTOCOL_JABBER, outputValues.getAsInteger(Im.PROTOCOL).intValue());
11205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("im1", outputValues.getAsString(Im.DATA));
11215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        outputValues = list.get(1).getAfter();
11235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(defaultType, outputValues.getAsInteger(Im.TYPE).intValue());
11245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Im.PROTOCOL_YAHOO, outputValues.getAsInteger(Im.PROTOCOL).intValue());
11255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("im2", outputValues.getAsString(Im.DATA));
11265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        outputValues = list.get(2).getAfter();
11285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(defaultType, outputValues.getAsInteger(Im.TYPE).intValue());
11295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Im.PROTOCOL_CUSTOM, outputValues.getAsInteger(Im.PROTOCOL).intValue());
11305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("custom_protocol", outputValues.getAsString(Im.CUSTOM_PROTOCOL));
11315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("im3", outputValues.getAsString(Im.DATA));
11325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
11335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigratePhoneFromGoogleToExchange() {
11355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
11365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
11375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
11385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Create 5 numbers.
11405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "1" -- HOME
11415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "2" -- WORK
11425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "3" -- CUSTOM
11435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "4" -- WORK
11445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "5" -- WORK_MOBILE
11455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Then we convert it to Exchange account type.
11465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "1" -- HOME
11475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "2" -- WORK
11485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "3" -- Because CUSTOM is not supported, it'll be changed to the default, MOBILE
11495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "4" -- WORK
11505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "5" -- WORK_MOBILE not suppoted again, so will be MOBILE.
11515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // But then, Exchange doesn't support multiple MOBILE numbers, so "5" will be removed.
11525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // i.e. the result will be:
11535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "1" -- HOME
11545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "2" -- WORK
11555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "3" -- MOBILE
11565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // - "4" -- WORK
11575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
11595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
11605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
11615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.TYPE, Phone.TYPE_HOME);
11625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.NUMBER, "1");
11635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
11645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
11655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
11665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK);
11675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.NUMBER, "2");
11685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
11695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
11705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
11715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Exchange doesn't support this type. Default to MOBILE
11725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.TYPE, Phone.TYPE_CUSTOM);
11735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.LABEL, "custom_type");
11745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.NUMBER, "3");
11755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
11765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
11775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
11785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK);
11795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.NUMBER, "4");
11805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
11815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues = new ContentValues();
11825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
11845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK_MOBILE);
11855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Phone.NUMBER, "5");
11865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
11875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
11895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateGenericWithTypeColumn(oldState, newState, kind);
11905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(Phone.CONTENT_ITEM_TYPE);
11925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
11935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(4, list.size());
11945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        int defaultType = Phone.TYPE_MOBILE;
11965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
11975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
11985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Phone.TYPE_HOME, outputValues.getAsInteger(Phone.TYPE).intValue());
11995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("1", outputValues.getAsString(Phone.NUMBER));
12005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        outputValues = list.get(1).getAfter();
12015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Phone.TYPE_WORK, outputValues.getAsInteger(Phone.TYPE).intValue());
12025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("2", outputValues.getAsString(Phone.NUMBER));
12035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        outputValues = list.get(2).getAfter();
12045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(defaultType, outputValues.getAsInteger(Phone.TYPE).intValue());
12055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNull(outputValues.getAsInteger(Phone.LABEL));
12065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("3", outputValues.getAsString(Phone.NUMBER));
12075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        outputValues = list.get(3).getAfter();
12085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(Phone.TYPE_WORK, outputValues.getAsInteger(Phone.TYPE).intValue());
12095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("4", outputValues.getAsString(Phone.NUMBER));
12105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
12115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
12125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testMigrateOrganizationFromGoogleToExchange() {
12135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType oldAccountType = new GoogleAccountType(getContext(), "");
12145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
12155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        DataKind kind = newAccountType.getKindForMimetype(Organization.CONTENT_ITEM_TYPE);
12165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
12175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta oldState = new RawContactDelta();
12185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues mockNameValues = new ContentValues();
12195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
12205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Organization.COMPANY, "company1");
12215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mockNameValues.put(Organization.DEPARTMENT, "department1");
12225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
12235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
12245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactDelta newState = new RawContactDelta();
12255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContactModifier.migrateGenericWithoutTypeColumn(oldState, newState, kind);
12265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
12275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        List<ValuesDelta> list = newState.getMimeEntries(Organization.CONTENT_ITEM_TYPE);
12285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertNotNull(list);
12295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, list.size());
12305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
12315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContentValues outputValues = list.get(0).getAfter();
12325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("company1", outputValues.getAsString(Organization.COMPANY));
12335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals("department1", outputValues.getAsString(Organization.DEPARTMENT));
12345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
12355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee}
1236