1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.vcard.tests;
17
18import android.content.ContentValues;
19import android.provider.ContactsContract.CommonDataKinds.Nickname;
20import android.provider.ContactsContract.CommonDataKinds.Note;
21import android.provider.ContactsContract.CommonDataKinds.Phone;
22import android.provider.ContactsContract.CommonDataKinds.StructuredName;
23import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
24
25import com.android.vcard.VCardConfig;
26import com.android.vcard.tests.testutils.ContactEntry;
27import com.android.vcard.tests.testutils.ContentValuesBuilder;
28import com.android.vcard.tests.testutils.PropertyNodesVerifierElem;
29import com.android.vcard.tests.testutils.VCardTestsBase;
30import com.android.vcard.tests.testutils.PropertyNodesVerifierElem.TypeSet;
31
32import java.util.Arrays;
33
34public class VCardJapanizationTests extends VCardTestsBase {
35    private void testNameUtf8Common(int vcardType) {
36        mVerifier.initForExportTest(vcardType);
37        ContactEntry entry = mVerifier.addInputEntry();
38        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
39                .put(StructuredName.FAMILY_NAME, "\u3075\u308B\u3069")
40                .put(StructuredName.GIVEN_NAME, "\u3091\u308A\u304B")
41                .put(StructuredName.MIDDLE_NAME, "B")
42                .put(StructuredName.PREFIX, "Dr.")
43                .put(StructuredName.SUFFIX, "Ph.D");
44        ContentValues contentValues =
45            (VCardConfig.isVersion21(vcardType) ? mContentValuesForQPAndUtf8 : null);
46        mVerifier.addPropertyNodesVerifierElem()
47                .addExpectedNode("FN", "Dr. \u3075\u308B\u3069 B \u3091\u308A\u304B Ph.D",
48                        contentValues)
49                .addExpectedNode("N", "\u3075\u308B\u3069;\u3091\u308A\u304B;B;Dr.;Ph.D",
50                        Arrays.asList(
51                                "\u3075\u308B\u3069", "\u3091\u308A\u304B", "B", "Dr.", "Ph.D"),
52                                null, contentValues, null, null);
53    }
54
55    public void testNameUtf8V21() {
56        testNameUtf8Common(VCardConfig.VCARD_TYPE_V21_JAPANESE);
57    }
58
59    public void testNameUtf8V30() {
60        testNameUtf8Common(VCardConfig.VCARD_TYPE_V30_JAPANESE);
61    }
62
63    public void testNameShiftJis() {
64        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_V30_JAPANESE, "Shift_JIS");
65        ContactEntry entry = mVerifier.addInputEntry();
66        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
67                .put(StructuredName.FAMILY_NAME, "\u3075\u308B\u3069")
68                .put(StructuredName.GIVEN_NAME, "\u3091\u308A\u304B")
69                .put(StructuredName.MIDDLE_NAME, "B")
70                .put(StructuredName.PREFIX, "Dr.")
71                .put(StructuredName.SUFFIX, "Ph.D");
72
73        mVerifier.addPropertyNodesVerifierElem()
74                .addExpectedNode("FN", "Dr. \u3075\u308B\u3069 B \u3091\u308A\u304B Ph.D",
75                        mContentValuesForSJis)
76                .addExpectedNode("N", "\u3075\u308B\u3069;\u3091\u308A\u304B;B;Dr.;Ph.D",
77                        Arrays.asList(
78                                "\u3075\u308B\u3069", "\u3091\u308A\u304B", "B", "Dr.", "Ph.D"),
79                                null, mContentValuesForSJis, null, null);
80    }
81
82    /**
83     * DoCoMo phones require all name elements should be in "family name" field.
84     */
85    public void testNameDoCoMo() {
86        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_DOCOMO, "Shift_JIS");
87        ContactEntry entry = mVerifier.addInputEntry();
88        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
89                .put(StructuredName.FAMILY_NAME, "\u3075\u308B\u3069")
90                .put(StructuredName.GIVEN_NAME, "\u3091\u308A\u304B")
91                .put(StructuredName.MIDDLE_NAME, "B")
92                .put(StructuredName.PREFIX, "Dr.")
93                .put(StructuredName.SUFFIX, "Ph.D");
94
95        final String fullName = "Dr. \u3075\u308B\u3069 B \u3091\u308A\u304B Ph.D";
96        mVerifier.addPropertyNodesVerifierElem()
97                .addExpectedNode("N", fullName + ";;;;",
98                        Arrays.asList(fullName, "", "", "", ""),
99                        null, mContentValuesForSJis, null, null)
100                .addExpectedNode("FN", fullName, mContentValuesForSJis)
101                .addExpectedNode("SOUND", ";;;;", new TypeSet("X-IRMC-N"))
102                .addExpectedNode("TEL", "", new TypeSet("HOME"))
103                .addExpectedNode("EMAIL", "", new TypeSet("HOME"))
104                .addExpectedNode("ADR", "", new TypeSet("HOME"))
105                .addExpectedNode("X-CLASS", "PUBLIC")
106                .addExpectedNode("X-REDUCTION", "")
107                .addExpectedNode("X-NO", "")
108                .addExpectedNode("X-DCM-HMN-MODE", "");
109    }
110
111    private void testPhoneticNameCommon(int vcardType, String charset) {
112        mVerifier.initForExportTest(vcardType, charset);
113        ContactEntry entry = mVerifier.addInputEntry();
114        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
115                .put(StructuredName.PHONETIC_FAMILY_NAME, "\u3084\u307E\u3060")
116                .put(StructuredName.PHONETIC_MIDDLE_NAME, "\u30DF\u30C9\u30EB\u30CD\u30FC\u30E0")
117                .put(StructuredName.PHONETIC_GIVEN_NAME, "\u305F\u308D\u3046");
118
119        final ContentValues contentValues =
120            ("SHIFT_JIS".equalsIgnoreCase(charset) ?
121                    (VCardConfig.isVersion21(vcardType) ? mContentValuesForQPAndSJis :
122                        mContentValuesForSJis) :
123                    (VCardConfig.isVersion21(vcardType) ? mContentValuesForQPAndUtf8 : null));
124        PropertyNodesVerifierElem elem = mVerifier.addPropertyNodesVerifierElemWithEmptyName();
125        elem.addExpectedNode("X-PHONETIC-LAST-NAME", "\u3084\u307E\u3060",
126                        contentValues)
127                .addExpectedNode("X-PHONETIC-MIDDLE-NAME",
128                        "\u30DF\u30C9\u30EB\u30CD\u30FC\u30E0",
129                        contentValues)
130                .addExpectedNode("X-PHONETIC-FIRST-NAME", "\u305F\u308D\u3046",
131                        contentValues);
132        if (!VCardConfig.isVersion21(vcardType)) {
133            elem.addExpectedNode("SORT-STRING",
134                    "\u3084\u307E\u3060 \u30DF\u30C9\u30EB\u30CD\u30FC\u30E0 \u305F\u308D\u3046",
135                    contentValues);
136        }
137        ContentValuesBuilder builder = mVerifier.addContentValuesVerifierElem()
138                .addExpected(StructuredName.CONTENT_ITEM_TYPE);
139        builder.put(StructuredName.PHONETIC_FAMILY_NAME, "\u3084\u307E\u3060")
140                .put(StructuredName.PHONETIC_MIDDLE_NAME, "\u30DF\u30C9\u30EB\u30CD\u30FC\u30E0")
141                .put(StructuredName.PHONETIC_GIVEN_NAME, "\u305F\u308D\u3046")
142                .put(StructuredName.DISPLAY_NAME,
143                        "\u3084\u307E\u3060 \u30DF\u30C9\u30EB\u30CD\u30FC\u30E0 " +
144                        "\u305F\u308D\u3046");
145    }
146
147    public void testPhoneticNameForJapaneseV21Utf8() {
148        testPhoneticNameCommon(VCardConfig.VCARD_TYPE_V21_JAPANESE, null);
149    }
150
151    public void testPhoneticNameForJapaneseV21Sjis() {
152        testPhoneticNameCommon(VCardConfig.VCARD_TYPE_V21_JAPANESE, "Shift_JIS");
153    }
154
155    public void testPhoneticNameForJapaneseV30Utf8() {
156        testPhoneticNameCommon(VCardConfig.VCARD_TYPE_V30_JAPANESE, null);
157    }
158
159    public void testPhoneticNameForJapaneseV30SJis() {
160        testPhoneticNameCommon(VCardConfig.VCARD_TYPE_V30_JAPANESE, "Shift_JIS");
161    }
162
163    public void testPhoneticNameForMobileV21_1() {
164        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE_MOBILE, "Shift_JIS");
165        ContactEntry entry = mVerifier.addInputEntry();
166        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
167                .put(StructuredName.PHONETIC_FAMILY_NAME, "\u3084\u307E\u3060")
168                .put(StructuredName.PHONETIC_MIDDLE_NAME, "\u30DF\u30C9\u30EB\u30CD\u30FC\u30E0")
169                .put(StructuredName.PHONETIC_GIVEN_NAME, "\u305F\u308D\u3046");
170
171        mVerifier.addPropertyNodesVerifierElem()
172                .addExpectedNode("SOUND",
173                        "\uFF94\uFF8F\uFF80\uFF9E \uFF90\uFF84\uFF9E\uFF99\uFF88\uFF70\uFF91 " +
174                        "\uFF80\uFF9B\uFF73;;;;",
175                        mContentValuesForSJis, new TypeSet("X-IRMC-N"));
176        ContentValuesBuilder builder = mVerifier.addContentValuesVerifierElem()
177                .addExpected(StructuredName.CONTENT_ITEM_TYPE);
178        builder.put(StructuredName.PHONETIC_FAMILY_NAME, "\uFF94\uFF8F\uFF80\uFF9E")
179                .put(StructuredName.PHONETIC_MIDDLE_NAME,
180                        "\uFF90\uFF84\uFF9E\uFF99\uFF88\uFF70\uFF91")
181                .put(StructuredName.PHONETIC_GIVEN_NAME, "\uFF80\uFF9B\uFF73")
182                .put(StructuredName.DISPLAY_NAME,
183                        "\uFF94\uFF8F\uFF80\uFF9E \uFF90\uFF84\uFF9E\uFF99\uFF88\uFF70\uFF91 " +
184                        "\uFF80\uFF9B\uFF73");
185    }
186
187    public void testPhoneticNameForMobileV21_2() {
188        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE_MOBILE, "Shift_JIS");
189        ContactEntry entry = mVerifier.addInputEntry();
190        entry.addContentValues(StructuredName.CONTENT_ITEM_TYPE)
191                .put(StructuredName.PHONETIC_FAMILY_NAME, "\u3084\u307E\u3060")
192                .put(StructuredName.PHONETIC_GIVEN_NAME, "\u305F\u308D\u3046");
193
194        mVerifier.addPropertyNodesVerifierElem()
195                .addExpectedNode("SOUND", "\uFF94\uFF8F\uFF80\uFF9E \uFF80\uFF9B\uFF73;;;;",
196                                mContentValuesForSJis, new TypeSet("X-IRMC-N"));
197        ContentValuesBuilder builder = mVerifier.addContentValuesVerifierElem()
198                .addExpected(StructuredName.CONTENT_ITEM_TYPE);
199        builder.put(StructuredName.PHONETIC_FAMILY_NAME, "\uFF94\uFF8F\uFF80\uFF9E")
200                .put(StructuredName.PHONETIC_GIVEN_NAME, "\uFF80\uFF9B\uFF73")
201                .put(StructuredName.DISPLAY_NAME, "\uFF94\uFF8F\uFF80\uFF9E \uFF80\uFF9B\uFF73");
202    }
203
204    private void testPostalAddressWithJapaneseCommon(int vcardType, String charset) {
205        mVerifier.initForExportTest(vcardType, charset);
206        ContactEntry entry = mVerifier.addInputEntry();
207        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
208                .put(StructuredPostal.POBOX, "\u79C1\u66F8\u7BB107")
209                .put(StructuredPostal.STREET, "\u96DB\u898B\u6CA2\u6751")
210                .put(StructuredPostal.CITY, "\u9E7F\u9AA8\u5E02")
211                .put(StructuredPostal.REGION, "\u00D7\u00D7\u770C")
212                .put(StructuredPostal.POSTCODE, "494-1313")
213                .put(StructuredPostal.COUNTRY, "\u65E5\u672C")
214                .put(StructuredPostal.FORMATTED_ADDRESS,
215                        "\u3053\u3093\u306A\u3068\u3053\u308D\u3092\u898B"
216                        + "\u308B\u306A\u3093\u3066\u6687\u4EBA\u3067\u3059\u304B\uFF1F")
217                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
218                .put(StructuredPostal.LABEL, "\u304A\u3082\u3061\u304B\u3048\u308A");
219
220        ContentValues contentValues = ("UTF-8".equalsIgnoreCase(charset) ?
221                (VCardConfig.isVersion21(vcardType) ? mContentValuesForQPAndSJis :
222                    mContentValuesForSJis) :
223                (VCardConfig.isVersion21(vcardType) ? mContentValuesForQPAndUtf8 :
224                    mContentValuesForUtf8));
225
226        PropertyNodesVerifierElem elem = mVerifier.addPropertyNodesVerifierElemWithEmptyName();
227        // LABEL must be ignored in vCard 2.1. As for vCard 3.0, the current behavior is
228        // same as that in vCard 3.0, which can be changed in the future.
229        elem.addExpectedNode("ADR", Arrays.asList("\u79C1\u66F8\u7BB107",
230                "", "\u96DB\u898B\u6CA2\u6751", "\u9E7F\u9AA8\u5E02", "\u00D7\u00D7\u770C",
231                "494-1313", "\u65E5\u672C"),
232                contentValues);
233        mVerifier.addContentValuesVerifierElem().addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
234                .put(StructuredPostal.POBOX, "\u79C1\u66F8\u7BB107")
235                .put(StructuredPostal.STREET, "\u96DB\u898B\u6CA2\u6751")
236                .put(StructuredPostal.CITY, "\u9E7F\u9AA8\u5E02")
237                .put(StructuredPostal.REGION, "\u00D7\u00D7\u770C")
238                .put(StructuredPostal.POSTCODE, "494-1313")
239                .put(StructuredPostal.COUNTRY, "\u65E5\u672C")
240                .put(StructuredPostal.FORMATTED_ADDRESS,
241                        "\u65E5\u672C 494-1313 \u00D7\u00D7\u770C \u9E7F\u9AA8\u5E02 " +
242                        "\u96DB\u898B\u6CA2\u6751 " + "\u79C1\u66F8\u7BB107")
243                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME);
244    }
245    public void testPostalAddresswithJapaneseV21() {
246        testPostalAddressWithJapaneseCommon(VCardConfig.VCARD_TYPE_V21_JAPANESE, "Shift_JIS");
247    }
248
249    /**
250     * Verifies that only one address field is emitted toward DoCoMo phones.
251     * Prefered type must (should?) be: HOME > WORK > OTHER > CUSTOM
252     */
253    public void testPostalAdrressForDoCoMo_1() {
254        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_DOCOMO, "Shift_JIS");
255        ContactEntry entry = mVerifier.addInputEntry();
256        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
257                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK)
258                .put(StructuredPostal.POBOX, "1");
259        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
260                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_OTHER)
261                .put(StructuredPostal.POBOX, "2");
262        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
263                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME)
264                .put(StructuredPostal.POBOX, "3");
265        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
266                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
267                .put(StructuredPostal.LABEL, "custom")
268                .put(StructuredPostal.POBOX, "4");
269
270        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
271                .addExpectedNode("TEL", "", new TypeSet("HOME"))
272                .addExpectedNode("EMAIL", "", new TypeSet("HOME"))
273                .addExpectedNode("X-CLASS", "PUBLIC")
274                .addExpectedNode("X-REDUCTION", "")
275                .addExpectedNode("X-NO", "")
276                .addExpectedNode("X-DCM-HMN-MODE", "")
277                .addExpectedNode("ADR",
278                        Arrays.asList("3", "", "", "", "", "", ""), new TypeSet("HOME"));
279    }
280
281    public void testPostalAdrressForDoCoMo_2() {
282        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_DOCOMO, "Shift_JIS");
283        ContactEntry entry = mVerifier.addInputEntry();
284        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
285                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_OTHER)
286                .put(StructuredPostal.POBOX, "1");
287        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
288                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK)
289                .put(StructuredPostal.POBOX, "2");
290        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
291                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
292                .put(StructuredPostal.LABEL, "custom")
293                .put(StructuredPostal.POBOX, "3");
294
295        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
296                .addExpectedNode("TEL", "", new TypeSet("HOME"))
297                .addExpectedNode("EMAIL", "", new TypeSet("HOME"))
298                .addExpectedNode("X-CLASS", "PUBLIC")
299                .addExpectedNode("X-REDUCTION", "")
300                .addExpectedNode("X-NO", "")
301                .addExpectedNode("X-DCM-HMN-MODE", "")
302                .addExpectedNode("ADR",
303                        Arrays.asList("2", "", "", "", "", "", ""), new TypeSet("WORK"));
304    }
305
306    public void testPostalAdrressForDoCoMo_3() {
307        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_DOCOMO, "Shift_JIS");
308        ContactEntry entry = mVerifier.addInputEntry();
309        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
310                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
311                .put(StructuredPostal.LABEL, "custom1")
312                .put(StructuredPostal.POBOX, "1");
313        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
314                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_OTHER)
315                .put(StructuredPostal.POBOX, "2");
316        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
317                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
318                .put(StructuredPostal.LABEL, "custom2")
319                .put(StructuredPostal.POBOX, "3");
320
321        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
322                .addExpectedNode("TEL", "", new TypeSet("HOME"))
323                .addExpectedNode("EMAIL", "", new TypeSet("HOME"))
324                .addExpectedNode("X-CLASS", "PUBLIC")
325                .addExpectedNode("X-REDUCTION", "")
326                .addExpectedNode("X-NO", "")
327                .addExpectedNode("X-DCM-HMN-MODE", "")
328                .addExpectedNode("ADR", Arrays.asList("2", "", "", "", "", "", ""));
329    }
330
331    /**
332     * Verifies the vCard exporter tolerates null TYPE.
333     */
334    public void testPostalAdrressForDoCoMo_4() {
335        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_DOCOMO, "Shift_JIS");
336        ContactEntry entry = mVerifier.addInputEntry();
337        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
338                .put(StructuredPostal.POBOX, "1");
339        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
340                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_OTHER)
341                .put(StructuredPostal.POBOX, "2");
342        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
343                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME)
344                .put(StructuredPostal.POBOX, "3");
345        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
346                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK)
347                .put(StructuredPostal.POBOX, "4");
348        entry.addContentValues(StructuredPostal.CONTENT_ITEM_TYPE)
349                .put(StructuredPostal.POBOX, "5");
350
351        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
352                .addExpectedNode("TEL", "", new TypeSet("HOME"))
353                .addExpectedNode("EMAIL", "", new TypeSet("HOME"))
354                .addExpectedNode("X-CLASS", "PUBLIC")
355                .addExpectedNode("X-REDUCTION", "")
356                .addExpectedNode("X-NO", "")
357                .addExpectedNode("X-DCM-HMN-MODE", "")
358                .addExpectedNode("ADR",
359                        Arrays.asList("3", "", "", "", "", "", ""), new TypeSet("HOME"));
360    }
361
362    private void testJapanesePhoneNumberCommon(int vcardType) {
363        mVerifier.initForExportTest(vcardType);
364        ContactEntry entry = mVerifier.addInputEntry();
365        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
366                .put(Phone.NUMBER, "0312341234")
367                .put(Phone.TYPE, Phone.TYPE_HOME);
368        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
369                .put(Phone.NUMBER, "09012341234")
370                .put(Phone.TYPE, Phone.TYPE_MOBILE);
371        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
372                .addExpectedNode("TEL", "03-1234-1234", new TypeSet("HOME"))
373                .addExpectedNode("TEL", "090-1234-1234", new TypeSet("CELL"));
374    }
375
376    public void testJapanesePhoneNumberV21_1() {
377        testJapanesePhoneNumberCommon(VCardConfig.VCARD_TYPE_V21_JAPANESE);
378    }
379
380    public void testJapanesePhoneNumberV30() {
381        testJapanesePhoneNumberCommon(VCardConfig.VCARD_TYPE_V30_JAPANESE);
382    }
383
384    public void testJapanesePhoneNumberDoCoMo() {
385        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_DOCOMO, "Shift_JIS");
386        ContactEntry entry = mVerifier.addInputEntry();
387        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
388                .put(Phone.NUMBER, "0312341234")
389                .put(Phone.TYPE, Phone.TYPE_HOME);
390        entry.addContentValues(Phone.CONTENT_ITEM_TYPE)
391                .put(Phone.NUMBER, "09012341234")
392                .put(Phone.TYPE, Phone.TYPE_MOBILE);
393        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
394                .addExpectedNode("EMAIL", "", new TypeSet("HOME"))
395                .addExpectedNode("X-CLASS", "PUBLIC")
396                .addExpectedNode("X-REDUCTION", "")
397                .addExpectedNode("X-NO", "")
398                .addExpectedNode("X-DCM-HMN-MODE", "")
399                .addExpectedNode("ADR", "", new TypeSet("HOME"))
400                .addExpectedNode("TEL", "03-1234-1234", new TypeSet("HOME"))
401                .addExpectedNode("TEL", "090-1234-1234", new TypeSet("CELL"));
402    }
403
404    public void testNoteDoCoMo() {
405        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_DOCOMO, "Shift_JIS");
406        ContactEntry entry = mVerifier.addInputEntry();
407        entry.addContentValues(Note.CONTENT_ITEM_TYPE)
408                .put(Note.NOTE, "note1");
409        entry.addContentValues(Note.CONTENT_ITEM_TYPE)
410                .put(Note.NOTE, "note2");
411        entry.addContentValues(Note.CONTENT_ITEM_TYPE)
412                .put(Note.NOTE, "note3");
413
414        // More than one note fields must be aggregated into one note.
415        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
416                .addExpectedNode("TEL", "", new TypeSet("HOME"))
417                .addExpectedNode("EMAIL", "", new TypeSet("HOME"))
418                .addExpectedNode("X-CLASS", "PUBLIC")
419                .addExpectedNode("X-REDUCTION", "")
420                .addExpectedNode("X-NO", "")
421                .addExpectedNode("X-DCM-HMN-MODE", "")
422                .addExpectedNode("ADR", "", new TypeSet("HOME"))
423                .addExpectedNode("NOTE", "note1\nnote2\nnote3", mContentValuesForQP);
424    }
425
426    public void testAndroidCustomV21() {
427        mVerifier.initForExportTest(VCardConfig.VCARD_TYPE_V21_GENERIC);
428        mVerifier.addInputEntry().addContentValues(Nickname.CONTENT_ITEM_TYPE)
429                .put(Nickname.NAME, "\u304D\u3083\u30FC\u30A8\u30C3\u30C1\u30FC");
430        mVerifier.addPropertyNodesVerifierElemWithEmptyName()
431                .addExpectedNode("X-ANDROID-CUSTOM",
432                        Arrays.asList(Nickname.CONTENT_ITEM_TYPE,
433                                "\u304D\u3083\u30FC\u30A8\u30C3\u30C1\u30FC",
434                                "", "", "", "", "", "", "", "", "", "", "", "", "", ""),
435                        mContentValuesForQPAndUtf8);
436    }
437}
438