VCardExporterTests.java revision 58ca5f9943bb5c8aeeab3150ac96f1143dfd86ba
14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2009 The Android Open Source Project
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License.
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License.
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapackage com.android.vcard.tests;
184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentValues;
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Email;
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Event;
224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Im;
234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Nickname;
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Note;
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Organization;
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Phone;
274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Photo;
284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Relation;
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Website;
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport com.android.vcard.VCardConfig;
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport com.android.vcard.tests.test_utils.ContactEntry;
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport com.android.vcard.tests.test_utils.PropertyNodesVerifierElem;
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport com.android.vcard.tests.test_utils.PropertyNodesVerifierElem.TypeSet;
374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Arrays;
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/**
414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Tests for the code related to vCard exporter, inculding vCard composer.
424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * This test class depends on vCard importer code, so if tests for vCard importer fail,
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * the result of this class will not be reliable.
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapublic class VCardExporterTests extends VCardTestsBase {
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final byte[] sPhotoByteArray =
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        VCardImporterTests.sPhotoByteArrayForComplicatedCase;
484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testSimpleV21() {
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(V21);
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredName.CONTENT_ITEM_TYPE)
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "Ando")
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "Roid");
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElem()
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("FN", "Roid Ando")
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("N", "Ando;Roid;;;",
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("Ando", "Roid", "", "", ""));
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testStructuredNameBasic(int vcardType) {
61be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        final boolean isV21 = VCardConfig.isVersion21(vcardType);
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredName.CONTENT_ITEM_TYPE)
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "AppropriateFamilyName")
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "AppropriateGivenName")
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName")
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "AppropriatePrefix")
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "AppropriateSuffix")
694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "AppropriatePhoneticFamily")
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "AppropriatePhoneticGiven")
714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle");
724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        PropertyNodesVerifierElem elem = mVerifier.addPropertyNodesVerifierElem()
744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("N",
754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        "AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        + "AppropriatePrefix;AppropriateSuffix",
774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("AppropriateFamilyName", "AppropriateGivenName",
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                "AppropriateMiddleName", "AppropriatePrefix", "AppropriateSuffix"))
794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("FN",
804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        "AppropriatePrefix AppropriateGivenName "
814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        + "AppropriateMiddleName AppropriateFamilyName AppropriateSuffix")
824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-FIRST-NAME", "AppropriatePhoneticGiven")
834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-MIDDLE-NAME", "AppropriatePhoneticMiddle")
844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily");
854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
86be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        if (!isV21) {
874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            elem.addExpectedNode("SORT-STRING",
884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "AppropriatePhoneticGiven AppropriatePhoneticMiddle "
894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    + "AppropriatePhoneticFamily");
904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testStructuredNameBasicV21() {
944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testStructuredNameBasic(V21);
954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testStructuredNameBasicV30() {
984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testStructuredNameBasic(V30);
994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
1024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Test that only "primary" StructuredName is emitted, so that our vCard file
1034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * will not confuse the external importer, assuming there may be some importer
1044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * which presume that there's only one property toward each of  "N", "FN", etc.
1054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Note that more than one "N", "FN", etc. properties are acceptable in vCard spec.
1064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
1074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testStructuredNameUsePrimaryCommon(int vcardType) {
1084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final boolean isV30 = (vcardType == V30);
1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName1")
1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName1")
1144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName1")
1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "DoNotEmitPrefix1")
1164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "DoNotEmitSuffix1")
1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "DoNotEmitPhoneticFamily1")
1184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "DoNotEmitPhoneticGiven1")
1194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle1");
1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // With "IS_PRIMARY=1". This is what we should use.
1224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
1234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "AppropriateFamilyName")
1244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "AppropriateGivenName")
1254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName")
1264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "AppropriatePrefix")
1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "AppropriateSuffix")
1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "AppropriatePhoneticFamily")
1294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "AppropriatePhoneticGiven")
1304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle")
1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_PRIMARY, 1);
1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // With "IS_PRIMARY=1", but we should ignore this time, since this is second, not first.
1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
1354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName2")
1364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName2")
1374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName2")
1384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "DoNotEmitPrefix2")
1394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "DoNotEmitSuffix2")
1404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "DoNotEmitPhoneticFamily2")
1414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "DoNotEmitPhoneticGiven2")
1424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle2")
1434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_PRIMARY, 1);
1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        PropertyNodesVerifierElem elem = mVerifier.addPropertyNodesVerifierElem()
1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("N",
1474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        "AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
1484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        + "AppropriatePrefix;AppropriateSuffix",
1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("AppropriateFamilyName", "AppropriateGivenName",
1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                "AppropriateMiddleName", "AppropriatePrefix", "AppropriateSuffix"))
1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("FN",
1524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        "AppropriatePrefix AppropriateGivenName "
1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        + "AppropriateMiddleName AppropriateFamilyName AppropriateSuffix")
1544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-FIRST-NAME", "AppropriatePhoneticGiven")
1554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-MIDDLE-NAME", "AppropriatePhoneticMiddle")
1564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily");
1574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (isV30) {
1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            elem.addExpectedNode("SORT-STRING",
1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "AppropriatePhoneticGiven AppropriatePhoneticMiddle "
1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    + "AppropriatePhoneticFamily");
1624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
1634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testStructuredNameUsePrimaryV21() {
1664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testStructuredNameUsePrimaryCommon(V21);
1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testStructuredNameUsePrimaryV30() {
1704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testStructuredNameUsePrimaryCommon(V30);
1714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
1744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Tests that only "super primary" StructuredName is emitted.
1754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * See also the comment in {@link #testStructuredNameUsePrimaryCommon(int)}.
1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testStructuredNameUseSuperPrimaryCommon(int vcardType) {
1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final boolean isV30 = (vcardType == V30);
1794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
1804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
1814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
1824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName1")
1834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName1")
1844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName1")
1854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "DoNotEmitPrefix1")
1864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "DoNotEmitSuffix1")
1874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "DoNotEmitPhoneticFamily1")
1884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "DoNotEmitPhoneticGiven1")
1894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle1");
1904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // With "IS_PRIMARY=1", but we should ignore this time.
1924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
1934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName2")
1944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName2")
1954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName2")
1964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "DoNotEmitPrefix2")
1974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "DoNotEmitSuffix2")
1984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "DoNotEmitPhoneticFamily2")
1994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "DoNotEmitPhoneticGiven2")
2004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle2")
2014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_PRIMARY, 1);
2024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // With "IS_SUPER_PRIMARY=1". This is what we should use.
2044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
2054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "AppropriateFamilyName")
2064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "AppropriateGivenName")
2074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName")
2084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "AppropriatePrefix")
2094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "AppropriateSuffix")
2104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "AppropriatePhoneticFamily")
2114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "AppropriatePhoneticGiven")
2124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle")
2134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_SUPER_PRIMARY, 1);
2144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
2164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName3")
2174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName3")
2184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName3")
2194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "DoNotEmitPrefix3")
2204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.SUFFIX, "DoNotEmitSuffix3")
2214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_FAMILY_NAME, "DoNotEmitPhoneticFamily3")
2224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_GIVEN_NAME, "DoNotEmitPhoneticGiven3")
2234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle3")
2244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_PRIMARY, 1);
2254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        PropertyNodesVerifierElem elem = mVerifier.addPropertyNodesVerifierElem()
2274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("N",
2284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        "AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
2294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        + "AppropriatePrefix;AppropriateSuffix",
2304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("AppropriateFamilyName", "AppropriateGivenName",
2314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                "AppropriateMiddleName", "AppropriatePrefix", "AppropriateSuffix"))
2324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("FN",
2334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        "AppropriatePrefix AppropriateGivenName "
2344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        + "AppropriateMiddleName AppropriateFamilyName AppropriateSuffix")
2354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-FIRST-NAME", "AppropriatePhoneticGiven")
2364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-MIDDLE-NAME", "AppropriatePhoneticMiddle")
2374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily");
2384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (isV30) {
2404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            elem.addExpectedNode("SORT-STRING",
2414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "AppropriatePhoneticGiven AppropriatePhoneticMiddle"
2424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    + " AppropriatePhoneticFamily");
2434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testStructuredNameUseSuperPrimaryV21() {
2474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testStructuredNameUseSuperPrimaryCommon(V21);
2484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testStructuredNameUseSuperPrimaryV30() {
2514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testStructuredNameUseSuperPrimaryCommon(V30);
2524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testNickNameV30() {
2554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(V30);
2564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(Nickname.CONTENT_ITEM_TYPE)
2574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Nickname.NAME, "Nicky");
2584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
2604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            .addExpectedNodeWithOrder("NICKNAME", "Nicky");
2614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPhoneBasicCommon(int vcardType) {
2644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
2654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(Phone.CONTENT_ITEM_TYPE)
2664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "1")
2674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_HOME);
2684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
2694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "1", new TypeSet("HOME"));
2704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhoneBasicV21() {
2734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhoneBasicCommon(V21);
2744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhoneBasicV30() {
2774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhoneBasicCommon(V30);
2784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhoneRefrainFormatting() {
2814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(V21 | VCardConfig.FLAG_REFRAIN_PHONE_NUMBER_FORMATTING);
2824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(Phone.CONTENT_ITEM_TYPE)
2834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "1234567890(abcdefghijklmnopqrstuvwxyz)")
2844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_HOME);
2854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
2864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "1234567890(abcdefghijklmnopqrstuvwxyz)",
2874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        new TypeSet("HOME"));
2884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
2914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Tests that vCard composer emits corresponding type param which we expect.
2924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
2934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPhoneVariousTypeSupport(int vcardType) {
2944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
2954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
2964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
2974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "10")
2984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_HOME);
2994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "20")
3014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_WORK);
3024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "30")
3044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_FAX_HOME);
3054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "40")
3074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_FAX_WORK);
3084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "50")
3104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_MOBILE);
3114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "60")
3134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_PAGER);
3144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "70")
3164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_OTHER);
3174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "80")
3194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CAR);
3204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "90")
3224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_COMPANY_MAIN);
3234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "100")
3254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_ISDN);
3264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "110")
3284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_MAIN);
3294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "120")
3314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_OTHER_FAX);
3324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "130")
3344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_TELEX);
3354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "140")
3374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_WORK_MOBILE);
3384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "150")
3404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_WORK_PAGER);
3414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "160")
3434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_MMS);
3444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
3464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "10", new TypeSet("HOME"))
3474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "20", new TypeSet("WORK"))
3484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "30", new TypeSet("HOME", "FAX"))
3494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "40", new TypeSet("WORK", "FAX"))
3504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "50", new TypeSet("CELL"))
3514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "60", new TypeSet("PAGER"))
3524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "70", new TypeSet("VOICE"))
3534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "80", new TypeSet("CAR"))
3544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "90", new TypeSet("WORK", "PREF"))
3554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "100", new TypeSet("ISDN"))
3564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "110", new TypeSet("PREF"))
3574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "120", new TypeSet("FAX"))
3584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "130", new TypeSet("TLX"))
3594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "140", new TypeSet("WORK", "CELL"))
3604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "150", new TypeSet("WORK", "PAGER"))
3614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "160", new TypeSet("MSG"));
3624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
3634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhoneVariousTypeSupportV21() {
3654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhoneVariousTypeSupport(V21);
3664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
3674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhoneVariousTypeSupportV30() {
3694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhoneVariousTypeSupport(V30);
3704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
3714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
3734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Tests that "PREF"s are emitted appropriately.
3744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPhonePrefHandlingCommon(int vcardType) {
3764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
3774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
3784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "1")
3804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_HOME);
3814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "2")
3834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_WORK)
3844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.IS_PRIMARY, 1);
3854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "3")
3874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_FAX_HOME)
3884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.IS_PRIMARY, 1);
3894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
3904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "4")
3914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_FAX_WORK);
3924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
3944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "4", new TypeSet("WORK", "FAX"))
3954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "3", new TypeSet("HOME", "FAX", "PREF"))
3964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "2", new TypeSet("WORK", "PREF"))
3974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "1", new TypeSet("HOME"));
3984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
3994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhonePrefHandlingV21() {
4014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhonePrefHandlingCommon(V21);
4024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhonePrefHandlingV30() {
4054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhonePrefHandlingCommon(V30);
4064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testMiscPhoneTypeHandling(int vcardType) {
4094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
4104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
4114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "1")
4134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
4144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.LABEL, "Modem");
4154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "2")
4174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
4184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.LABEL, "MSG");
4194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "3")
4214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
4224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.LABEL, "BBS");
4234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "4")
4254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
4264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.LABEL, "VIDEO");
4274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "5")
4294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM);
4304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "6")
4324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
4334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.LABEL, "_AUTO_CELL");  // The old indicator for the type mobile.
4344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "7")
4364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
4374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.LABEL, "\u643A\u5E2F");  // Mobile phone in Japanese Kanji
4384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
4394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "8")
4404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
4414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.LABEL, "invalid");
4424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        PropertyNodesVerifierElem elem = mVerifier.addPropertyNodesVerifierElemWithEmptyName();
4432bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        if (VCardConfig.isVersion30(vcardType)) {
4442bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa            // vCard 3.0 accepts "invalid". Also stop using toUpper()
4452bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa            elem.addExpectedNode("TEL", "1", new TypeSet("Modem"))
4462bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "2", new TypeSet("MSG"))
4472bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "3", new TypeSet("BBS"))
4482bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "4", new TypeSet("VIDEO"))
4492bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "5", new TypeSet("VOICE"))
4502bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "6", new TypeSet("CELL"))
4512bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "7", new TypeSet("CELL"))
4522bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "8", new TypeSet("invalid"));
4532bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        } else {
4542bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa            elem.addExpectedNode("TEL", "1", new TypeSet("MODEM"))
4552bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "2", new TypeSet("MSG"))
4562bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "3", new TypeSet("BBS"))
4572bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "4", new TypeSet("VIDEO"))
4582bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "5", new TypeSet("VOICE"))
4592bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "6", new TypeSet("CELL"))
4602bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "7", new TypeSet("CELL"))
4612bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa                    .addExpectedNode("TEL", "8", new TypeSet("X-invalid"));
4622bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        }
4634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhoneTypeHandlingV21() {
4664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testMiscPhoneTypeHandling(V21);
4674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhoneTypeHandlingV30() {
4704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testMiscPhoneTypeHandling(V30);
4714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testEmailBasicCommon(int vcardType) {
4744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
4754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(Email.CONTENT_ITEM_TYPE)
4764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.DATA, "sample@example.com");
4774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
4784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            .addExpectedNode("EMAIL", "sample@example.com");
4794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEmailBasicV21() {
4824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEmailBasicCommon(V21);
4834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEmailBasicV30() {
4864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEmailBasicCommon(V30);
4874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testEmailVariousTypeSupportCommon(int vcardType) {
4904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
4914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
4924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Email.CONTENT_ITEM_TYPE)
4934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.DATA, "type_home@example.com")
4944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.TYPE, Email.TYPE_HOME);
4954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Email.CONTENT_ITEM_TYPE)
4964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.DATA, "type_work@example.com")
4974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.TYPE, Email.TYPE_WORK);
4984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Email.CONTENT_ITEM_TYPE)
4994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.DATA, "type_mobile@example.com")
5004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.TYPE, Email.TYPE_MOBILE);
5014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Email.CONTENT_ITEM_TYPE)
5024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.DATA, "type_other@example.com")
5034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.TYPE, Email.TYPE_OTHER);
5044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
5054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("EMAIL", "type_home@example.com", new TypeSet("HOME"))
5064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("EMAIL", "type_work@example.com", new TypeSet("WORK"))
5074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("EMAIL", "type_mobile@example.com", new TypeSet("CELL"))
5084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("EMAIL", "type_other@example.com");
5094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEmailVariousTypeSupportV21() {
5124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEmailVariousTypeSupportCommon(V21);
5134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEmailVariousTypeSupportV30() {
5164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEmailVariousTypeSupportCommon(V30);
5174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testEmailPrefHandlingCommon(int vcardType) {
5204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
5214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
5224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Email.CONTENT_ITEM_TYPE)
5234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.DATA, "type_home@example.com")
5244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.TYPE, Email.TYPE_HOME)
5254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.IS_PRIMARY, 1);
5264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Email.CONTENT_ITEM_TYPE)
5274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.DATA, "type_notype@example.com")
5284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Email.IS_PRIMARY, 1);
5294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
5314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("EMAIL", "type_notype@example.com", new TypeSet("PREF"))
5324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("EMAIL", "type_home@example.com", new TypeSet("HOME", "PREF"));
5334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEmailPrefHandlingV21() {
5364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEmailPrefHandlingCommon(V21);
5374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEmailPrefHandlingV30() {
5404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEmailPrefHandlingCommon(V30);
5414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPostalAddressCommon(int vcardType) {
5444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
5454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
5464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.POBOX, "Pobox")
5474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.NEIGHBORHOOD, "Neighborhood")
5484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.STREET, "Street")
5494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.CITY, "City")
5504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.REGION, "Region")
5514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.POSTCODE, "100")
5524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.COUNTRY, "Country")
5534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.FORMATTED_ADDRESS, "Formatted Address")
5544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK);
5554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // adr-value    = 0*6(text-value ";") text-value
5564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        //              ; PO Box, Extended Address, Street, Locality, Region, Postal Code,
5574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        //              ; Country Name
5584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        //
5594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // The NEIGHBORHOOD field is appended after the CITY field.
5604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
5614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("ADR",
5624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("Pobox", "", "Street", "City Neighborhood",
5634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                "Region", "100", "Country"), new TypeSet("WORK"));
5644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalAddressV21() {
5674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalAddressCommon(V21);
5684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalAddressV30() {
5714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalAddressCommon(V30);
5724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPostalAddressNonNeighborhood(int vcardType) {
5754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
5764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
5774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.CITY, "City");
5784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
5794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("ADR",
5804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("", "", "", "City", "", "", ""), new TypeSet("HOME"));
5814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalAddressNonNeighborhoodV21() {
5844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalAddressNonNeighborhood(V21);
5854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalAddressNonNeighborhoodV30() {
5884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalAddressNonNeighborhood(V30);
5894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPostalAddressNonCity(int vcardType) {
5924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
5934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
5944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.NEIGHBORHOOD, "Neighborhood");
5954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
5964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("ADR",
5974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("", "", "", "Neighborhood", "", "", ""), new TypeSet("HOME"));
5984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalAddressNonCityV21() {
6014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalAddressNonCity(V21);
6024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalAddressNonCityV30() {
6054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalAddressNonCity(V30);
6064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPostalOnlyWithFormattedAddressCommon(int vcardType) {
6094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
6104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
6114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.REGION, "")  // Must be ignored.
6124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.FORMATTED_ADDRESS,
6134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                "Formatted address CA 123-334 United Statue");
6144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
6154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("ADR", ";Formatted address CA 123-334 United Statue;;;;;",
6164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("", "Formatted address CA 123-334 United Statue",
6174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                "", "", "", "", ""), new TypeSet("HOME"));
6184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalOnlyWithFormattedAddressV21() {
6214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalOnlyWithFormattedAddressCommon(V21);
6224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalOnlyWithFormattedAddressV30() {
6254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalOnlyWithFormattedAddressCommon(V30);
6264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
6294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Tests that the vCard composer honors formatted data when it is available
6304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * even when it is partial.
6314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
6324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPostalWithBothStructuredAndFormattedCommon(int vcardType) {
6334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
6344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
6354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.POBOX, "Pobox")
6364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.COUNTRY, "Country")
6374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredPostal.FORMATTED_ADDRESS,
6384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        "Formatted address CA 123-334 United Statue");  // Should be ignored
6394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
6404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("ADR", "Pobox;;;;;;Country",
6414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("Pobox", "", "", "", "", "", "Country"),
6424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        new TypeSet("HOME"));
6434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalWithBothStructuredAndFormattedV21() {
6464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalWithBothStructuredAndFormattedCommon(V21);
6474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPostalWithBothStructuredAndFormattedV30() {
6504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPostalWithBothStructuredAndFormattedCommon(V30);
6514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testOrganizationCommon(int vcardType) {
6544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
6554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
6564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Organization.CONTENT_ITEM_TYPE)
6574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.COMPANY, "CompanyX")
6584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.DEPARTMENT, "DepartmentY")
6594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.TITLE, "TitleZ")
6604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.JOB_DESCRIPTION, "Description Rambda")  // Ignored.
6614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.OFFICE_LOCATION, "Mountain View")  // Ignored.
6624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.PHONETIC_NAME, "PhoneticName!")  // Ignored
6634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.SYMBOL, "(^o^)/~~");  // Ignore him (her).
6644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Organization.CONTENT_ITEM_TYPE)
6654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .putNull(Organization.COMPANY)
6664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.DEPARTMENT, "DepartmentXX")
6674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .putNull(Organization.TITLE);
6684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Organization.CONTENT_ITEM_TYPE)
6694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.COMPANY, "CompanyXYZ")
6704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .putNull(Organization.DEPARTMENT)
6714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Organization.TITLE, "TitleXYZYX");
6724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Currently we do not use group but depend on the order.
6734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
6744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("ORG", "CompanyX;DepartmentY",
6754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("CompanyX", "DepartmentY"))
6764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("TITLE", "TitleZ")
6774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("ORG", "DepartmentXX")
6784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("ORG", "CompanyXYZ")
6794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("TITLE", "TitleXYZYX");
6804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testOrganizationV21() {
6834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testOrganizationCommon(V21);
6844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testOrganizationV30() {
6874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testOrganizationCommon(V30);
6884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
6894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
6904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testImVariousTypeSupportCommon(int vcardType) {
6914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
6924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
6934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
6944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_AIM)
6954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "aim");
6964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
6974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_MSN)
6984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "msn");
6994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_YAHOO)
7014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "yahoo");
7024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_SKYPE)
7044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "skype");
7054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_QQ)
7074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "qq");
7084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK)
7104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "google talk");
7114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_ICQ)
7134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "icq");
7144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_JABBER)
7164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "jabber");
7174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_NETMEETING)
7194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "netmeeting");
7204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // No determined way to express unknown type...
7224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
7234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-JABBER", "jabber")
7244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-ICQ", "icq")
7254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-GOOGLE-TALK", "google talk")
7264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-QQ", "qq")
7274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-SKYPE-USERNAME", "skype")
7284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-YAHOO", "yahoo")
7294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-MSN", "msn")
7304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-NETMEETING", "netmeeting")
7314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-AIM", "aim");
7324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testImBasiV21() {
7354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testImVariousTypeSupportCommon(V21);
7364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testImBasicV30() {
7394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testImVariousTypeSupportCommon(V30);
7404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testImPrefHandlingCommon(int vcardType) {
7434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
7444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
7454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_AIM)
7474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "aim1");
7484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Im.CONTENT_ITEM_TYPE)
7494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.PROTOCOL, Im.PROTOCOL_AIM)
7504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.DATA, "aim2")
7514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.TYPE, Im.TYPE_HOME)
7524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Im.IS_PRIMARY, 1);
7534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
7554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-AIM", "aim1")
7564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-AIM", "aim2", new TypeSet("HOME", "PREF"));
7574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testImPrefHandlingV21() {
7604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testImPrefHandlingCommon(V21);
7614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testImPrefHandlingV30() {
7644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testImPrefHandlingCommon(V30);
7654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testWebsiteCommon(int vcardType) {
7684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
7694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
7704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Website.CONTENT_ITEM_TYPE)
7714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Website.URL, "http://website.example.android.com/index.html")
7724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Website.TYPE, Website.TYPE_BLOG);
7734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Website.CONTENT_ITEM_TYPE)
7744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Website.URL, "ftp://ftp.example.android.com/index.html")
7754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Website.TYPE, Website.TYPE_FTP);
7764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // We drop TYPE information since vCard (especially 3.0) does not allow us to emit it.
7784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
7794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("URL", "ftp://ftp.example.android.com/index.html")
7804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("URL", "http://website.example.android.com/index.html");
7814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testWebsiteV21() {
7844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testWebsiteCommon(V21);
7854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testWebsiteV30() {
7884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testWebsiteCommon(V30);
7894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String getAndroidPropValue(final String mimeType, String value, Integer type) {
7924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return getAndroidPropValue(mimeType, value, type, null);
7934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
7944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private String getAndroidPropValue(final String mimeType, String value,
7964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Integer type, String label) {
7974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return (mimeType + ";" + value + ";"
7984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                + (type != null ? type : "") + ";"
7994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                + (label != null ? label : "") + ";;;;;;;;;;;;");
8004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testEventCommon(int vcardType) {
8034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
8044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
8054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Event.CONTENT_ITEM_TYPE)
8064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.TYPE, Event.TYPE_ANNIVERSARY)
8074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.START_DATE, "1982-06-16");
8084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Event.CONTENT_ITEM_TYPE)
8094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.TYPE, Event.TYPE_BIRTHDAY)
8104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.START_DATE, "2008-10-22");
8114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Event.CONTENT_ITEM_TYPE)
8124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.TYPE, Event.TYPE_OTHER)
8134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.START_DATE, "2018-03-12");
8144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Event.CONTENT_ITEM_TYPE)
8154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.TYPE, Event.TYPE_CUSTOM)
8164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.LABEL, "The last day")
8174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.START_DATE, "When the Tower of Hanoi with 64 rings is completed.");
8184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Event.CONTENT_ITEM_TYPE)
8194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.TYPE, Event.TYPE_BIRTHDAY)
8204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Event.START_DATE, "2009-05-19");  // Should be ignored.
8214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
8224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("BDAY", "2008-10-22")
8234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-ANDROID-CUSTOM",
8244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        getAndroidPropValue(
8254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                Event.CONTENT_ITEM_TYPE, "1982-06-16", Event.TYPE_ANNIVERSARY))
8264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-ANDROID-CUSTOM",
8274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        getAndroidPropValue(
8284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                Event.CONTENT_ITEM_TYPE, "2018-03-12", Event.TYPE_OTHER))
8294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-ANDROID-CUSTOM",
8304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        getAndroidPropValue(
8314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                Event.CONTENT_ITEM_TYPE,
8324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                "When the Tower of Hanoi with 64 rings is completed.",
8334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                Event.TYPE_CUSTOM, "The last day"));
8344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEventV21() {
8374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEventCommon(V21);
8384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testEventV30() {
8414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testEventCommon(V30);
8424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testNoteCommon(int vcardType) {
8454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
8464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
8474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Note.CONTENT_ITEM_TYPE)
8484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Note.NOTE, "note1");
8494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Note.CONTENT_ITEM_TYPE)
8504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Note.NOTE, "note2")
8514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Note.IS_PRIMARY, 1);  // Just ignored.
8524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
8534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("NOTE", "note1")
8544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("NOTE", "note2");
8554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testNoteV21() {
8584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testNoteCommon(V21);
8594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testNoteV30() {
8624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testNoteCommon(V30);
8634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPhotoCommon(int vcardType) {
8664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final boolean isV30 = vcardType == V30;
8674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
8684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
8694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
8704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "PhotoTest");
8714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Photo.CONTENT_ITEM_TYPE)
8724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Photo.PHOTO, sPhotoByteArray);
8734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContentValues contentValuesForPhoto = new ContentValues();
8754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        contentValuesForPhoto.put("ENCODING", (isV30 ? "b" : "BASE64"));
8764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElem()
8774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("FN", "PhotoTest")
8784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("N", "PhotoTest;;;;",
8794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Arrays.asList("PhotoTest", "", "", "", ""))
8804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNodeWithOrder("PHOTO", null, null, sPhotoByteArray,
8814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        contentValuesForPhoto, new TypeSet("JPEG"), null);
8824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhotoV21() {
8854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhotoCommon(V21);
8864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPhotoV30() {
8894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPhotoCommon(V30);
8904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
8914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
8924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testRelationCommon(int vcardType) {
8934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
8944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(Relation.CONTENT_ITEM_TYPE)
8954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Relation.TYPE, Relation.TYPE_MOTHER)
8964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Relation.NAME, "Ms. Mother");
8974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addContentValuesVerifierElem().addExpected(Relation.CONTENT_ITEM_TYPE)
8984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Relation.TYPE, Relation.TYPE_MOTHER)
8994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Relation.NAME, "Ms. Mother");
9004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testRelationV21() {
9034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testRelationCommon(V21);
9044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testRelationV30() {
9074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testRelationCommon(V30);
9084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testV30HandleEscape() {
9114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(V30);
9124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(StructuredName.CONTENT_ITEM_TYPE)
9134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "\\")
9144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.GIVEN_NAME, ";")
9154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.MIDDLE_NAME, ",")
9164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.PREFIX, "\n")
9174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.DISPLAY_NAME, "[<{Unescaped:Asciis}>]");
9184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Verifies the vCard String correctly escapes each character which must be escaped.
9194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addLineVerifierElem()
9204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpected("N:\\\\;\\;;\\,;\\n;")
9214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpected("FN:[<{Unescaped:Asciis}>]");
9224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElem()
9234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("FN", "[<{Unescaped:Asciis}>]")
9244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("N", Arrays.asList("\\", ";", ",", "\n", ""));
9254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
9284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * There's no "NICKNAME" property in vCard 2.1, while there is in vCard 3.0.
9294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We use Android-specific "X-ANDROID-CUSTOM" property.
9304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * This test verifies the functionality.
9314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
9324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testNickNameV21() {
9334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(V21);
9344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addInputEntry().addContentValues(Nickname.CONTENT_ITEM_TYPE)
9354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Nickname.NAME, "Nicky");
9364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
9374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("X-ANDROID-CUSTOM",
9384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        Nickname.CONTENT_ITEM_TYPE + ";Nicky;;;;;;;;;;;;;;");
9394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addContentValuesVerifierElem().addExpected(Nickname.CONTENT_ITEM_TYPE)
9404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Nickname.NAME, "Nicky");
9414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testTolerateBrokenPhoneNumberEntryV21() {
9444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(V21);
9454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
9464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
9474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_HOME)
9484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(Phone.NUMBER, "111-222-3333 (Miami)\n444-5555-666 (Tokyo);"
9494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        + "777-888-9999 (Chicago);111-222-3333 (Miami)");
9504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
9514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "111-222-3333", new TypeSet("HOME"))
9524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "444-555-5666", new TypeSet("HOME"))
9534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("TEL", "777-888-9999", new TypeSet("HOME"));
9544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private void testPickUpNonEmptyContentValuesCommon(int vcardType) {
9574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.initForExportTest(vcardType);
9584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry entry = mVerifier.addInputEntry();
9594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
9604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_PRIMARY, 1);  // Empty name. Should be ignored.
9614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
9624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "family1");  // Not primary. Should be ignored.
9634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
9644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_PRIMARY, 1)
9654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "family2");  // This entry is what we want.
9664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
9674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.IS_PRIMARY, 1)
9684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "family3");
9694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
9704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .put(StructuredName.FAMILY_NAME, "family4");
9714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVerifier.addPropertyNodesVerifierElem()
9724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("N", Arrays.asList("family2", "", "", "", ""))
9734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                .addExpectedNode("FN", "family2");
9744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPickUpNonEmptyContentValuesV21() {
9774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPickUpNonEmptyContentValuesCommon(V21);
9784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
9794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
9804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testPickUpNonEmptyContentValuesV30() {
9814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        testPickUpNonEmptyContentValuesCommon(V30);
9824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
98358ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa
98458ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa    public void testUseMultiByteTypeV30() {
98558ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa        mVerifier.initForExportTest(V30);
98658ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa        final ContactEntry entry = mVerifier.addInputEntry();
98758ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
98858ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
98958ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa                .put(Phone.LABEL, "\u96FB\u8A71")
99058ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa                .put(Phone.NUMBER, "1");
99158ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa        mVerifier.addLineVerifierElem()
99258ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa                .addExpected("N:")
99358ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa                .addExpected("FN:")
99458ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa                .addExpected("TEL;TYPE=\u96FB\u8A71:1");
99558ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
99658ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa                .addExpectedNode("TEL", "1", new TypeSet("\u96FB\u8A71"));
99758ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa    }
9984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
999