VCardImporterTests.java revision 58ca5f9943bb5c8aeeab3150ac96f1143dfd86ba
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.Email;
20import android.provider.ContactsContract.CommonDataKinds.Event;
21import android.provider.ContactsContract.CommonDataKinds.Note;
22import android.provider.ContactsContract.CommonDataKinds.Organization;
23import android.provider.ContactsContract.CommonDataKinds.Phone;
24import android.provider.ContactsContract.CommonDataKinds.Photo;
25import android.provider.ContactsContract.CommonDataKinds.StructuredName;
26import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
27import android.provider.ContactsContract.CommonDataKinds.Website;
28import android.provider.ContactsContract.Data;
29
30import com.android.vcard.VCardConfig;
31import com.android.vcard.tests.test_utils.ContentValuesVerifier;
32import com.android.vcard.tests.test_utils.ContentValuesVerifierElem;
33import com.android.vcard.tests.test_utils.PropertyNodesVerifierElem.TypeSet;
34
35import junit.framework.TestCase;
36
37import java.util.Arrays;
38
39public class VCardImporterTests extends VCardTestsBase {
40    // Push data into int array at first since values like 0x80 are
41    // interpreted as int by the compiler and casting all of them is
42    // cumbersome...
43    private static final int[] sPhotoIntArrayForComplicatedCase = {
44        0xff, 0xd8, 0xff, 0xe1, 0x0a, 0x0f, 0x45, 0x78, 0x69, 0x66, 0x00,
45        0x00, 0x4d, 0x4d, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0d,
46        0x01, 0x0e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
47        0xaa, 0x01, 0x0f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
48        0x00, 0xba, 0x01, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00,
49        0x00, 0x00, 0xc2, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
50        0x00, 0x01, 0x00, 0x00, 0x01, 0x1a, 0x00, 0x05, 0x00, 0x00, 0x00,
51        0x01, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x1b, 0x00, 0x05, 0x00, 0x00,
52        0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x28, 0x00, 0x03, 0x00,
53        0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x01, 0x31, 0x00, 0x02,
54        0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xd8, 0x01, 0x32, 0x00,
55        0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xe6, 0x02, 0x13,
56        0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82,
57        0x98, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xfa,
58        0x87, 0x69, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
59        0x84, 0xc4, 0xa5, 0x00, 0x07, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00,
60        0x01, 0x08, 0x00, 0x00, 0x04, 0x1e, 0x32, 0x30, 0x30, 0x38, 0x31,
61        0x30, 0x32, 0x39, 0x31, 0x33, 0x35, 0x35, 0x33, 0x31, 0x00, 0x00,
62        0x44, 0x6f, 0x43, 0x6f, 0x4d, 0x6f, 0x00, 0x00, 0x44, 0x39, 0x30,
63        0x35, 0x69, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01,
64        0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x44, 0x39, 0x30,
65        0x35, 0x69, 0x20, 0x56, 0x65, 0x72, 0x31, 0x2e, 0x30, 0x30, 0x00,
66        0x32, 0x30, 0x30, 0x38, 0x3a, 0x31, 0x30, 0x3a, 0x32, 0x39, 0x20,
67        0x31, 0x33, 0x3a, 0x35, 0x35, 0x3a, 0x34, 0x37, 0x00, 0x20, 0x20,
68        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
69        0x00, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x49, 0x4d, 0x00, 0x30, 0x33,
70        0x30, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x14, 0x00,
71        0x14, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
72        0x00, 0x34, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
73        0x00, 0x00, 0x00, 0x01, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
74        0x11, 0x09, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x0f, 0x0b, 0x00,
75        0x00, 0x27, 0x10, 0x00, 0x00, 0x05, 0x97, 0x00, 0x00, 0x27, 0x10,
76        0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x1c,
77        0x01, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x02, 0x5e, 0x00, 0x00,
78        0x27, 0x10, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x27, 0x10, 0x00,
79        0x00, 0x03, 0xcb, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x1b, 0xe5,
80        0x00, 0x00, 0x27, 0x10, 0x00, 0x28, 0x82, 0x9a, 0x00, 0x05, 0x00,
81        0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x6a, 0x82, 0x9d, 0x00, 0x05,
82        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x72, 0x88, 0x22, 0x00,
83        0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x90, 0x00,
84        0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x30, 0x32, 0x32, 0x30, 0x90,
85        0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x03, 0x7a,
86        0x90, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x03,
87        0x8e, 0x91, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x01, 0x02,
88        0x03, 0x00, 0x91, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,
89        0x00, 0x03, 0xa2, 0x92, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01,
90        0x00, 0x00, 0x03, 0xaa, 0x92, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
91        0x01, 0x00, 0x00, 0x03, 0xb2, 0x92, 0x04, 0x00, 0x0a, 0x00, 0x00,
92        0x00, 0x01, 0x00, 0x00, 0x03, 0xba, 0x92, 0x05, 0x00, 0x05, 0x00,
93        0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xc2, 0x92, 0x07, 0x00, 0x03,
94        0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x92, 0x08, 0x00,
95        0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x92, 0x09,
96        0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x92,
97        0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xca,
98        0x92, 0x7c, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
99        0x00, 0x92, 0x86, 0x00, 0x07, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
100        0x03, 0xd2, 0xa0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x30,
101        0x31, 0x30, 0x30, 0xa0, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
102        0x00, 0x01, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00,
103        0x01, 0x00, 0x60, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x03, 0x00, 0x00,
104        0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x04, 0x00,
105        0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0xa2, 0x0e, 0x00, 0x05,
106        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xe8, 0xa2, 0x0f, 0x00,
107        0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xf0, 0xa2, 0x10,
108        0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0xa2,
109        0x17, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00,
110        0xa3, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00,
111        0x00, 0xa3, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
112        0x00, 0x00, 0xa4, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00,
113        0x00, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
114        0x00, 0x00, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
115        0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x05, 0x00, 0x00,
116        0x00, 0x01, 0x00, 0x00, 0x03, 0xf8, 0xa4, 0x05, 0x00, 0x03, 0x00,
117        0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x03,
118        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x07, 0x00,
119        0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x08,
120        0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4,
121        0x09, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
122        0xa4, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
123        0x00, 0xa4, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
124        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00,
125        0x00, 0x27, 0x10, 0x00, 0x00, 0x01, 0x5e, 0x00, 0x00, 0x00, 0x64,
126        0x32, 0x30, 0x30, 0x38, 0x3a, 0x31, 0x30, 0x3a, 0x32, 0x39, 0x20,
127        0x31, 0x33, 0x3a, 0x35, 0x35, 0x3a, 0x33, 0x31, 0x00, 0x32, 0x30,
128        0x30, 0x38, 0x3a, 0x31, 0x30, 0x3a, 0x32, 0x39, 0x20, 0x31, 0x33,
129        0x3a, 0x35, 0x35, 0x3a, 0x34, 0x37, 0x00, 0x00, 0x00, 0x29, 0x88,
130        0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x02, 0xb2, 0x00, 0x00, 0x00,
131        0x64, 0x00, 0x00, 0x01, 0x5e, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00,
132        0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x25, 0x00,
133        0x00, 0x00, 0x0a, 0x00, 0x00, 0x0e, 0x92, 0x00, 0x00, 0x03, 0xe8,
134        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x30, 0x30,
135        0x38, 0x31, 0x30, 0x32, 0x39, 0x31, 0x33, 0x35, 0x35, 0x33, 0x31,
136        0x00, 0x00, 0x20, 0x2a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x2a,
137        0xe2, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138        0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
139        0x04, 0x52, 0x39, 0x38, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
140        0x00, 0x04, 0x30, 0x31, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
141        0x06, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06,
142        0x00, 0x00, 0x01, 0x1a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,
143        0x00, 0x04, 0x6c, 0x01, 0x1b, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01,
144        0x00, 0x00, 0x04, 0x74, 0x01, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00,
145        0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00,
146        0x00, 0x01, 0x00, 0x00, 0x04, 0x7c, 0x02, 0x02, 0x00, 0x04, 0x00,
147        0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x8b, 0x00, 0x00, 0x00, 0x00,
148        0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
149        0x48, 0x00, 0x00, 0x00, 0x01, 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84,
150        0x00, 0x20, 0x16, 0x18, 0x1c, 0x18, 0x14, 0x20, 0x1c, 0x1a, 0x1c,
151        0x24, 0x22, 0x20, 0x26, 0x30, 0x50, 0x34, 0x30, 0x2c, 0x2c, 0x30,
152        0x62, 0x46, 0x4a, 0x3a, 0x50, 0x74, 0x66, 0x7a, 0x78, 0x72, 0x66,
153        0x70, 0x6e, 0x80, 0x90, 0xb8, 0x9c, 0x80, 0x88, 0xae, 0x8a, 0x6e,
154        0x70, 0xa0, 0xda, 0xa2, 0xae, 0xbe, 0xc4, 0xce, 0xd0, 0xce, 0x7c,
155        0x9a, 0xe2, 0xf2, 0xe0, 0xc8, 0xf0, 0xb8, 0xca, 0xce, 0xc6, 0x01,
156        0x22, 0x24, 0x24, 0x30, 0x2a, 0x30, 0x5e, 0x34, 0x34, 0x5e, 0xc6,
157        0x84, 0x70, 0x84, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
158        0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
159        0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
160        0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
161        0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xff, 0xc0,
162        0x00, 0x11, 0x08, 0x00, 0x78, 0x00, 0xa0, 0x03, 0x01, 0x21, 0x00,
163        0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x01, 0xa2, 0x00,
164        0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
165        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
166        0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03,
167        0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01,
168        0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31,
169        0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81,
170        0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
171        0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19,
172        0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37,
173        0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
174        0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65,
175        0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
176        0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92,
177        0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
178        0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
179        0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
180        0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
181        0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1,
182        0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x01, 0x00,
183        0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
184        0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
185        0x07, 0x08, 0x09, 0x0a, 0x0b, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04,
186        0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77,
187        0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12,
188        0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14,
189        0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15,
190        0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17,
191        0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37,
192        0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
193        0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65,
194        0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
195        0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a,
196        0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3,
197        0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5,
198        0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
199        0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
200        0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2,
201        0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x00,
202        0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00,
203        0x14, 0x54, 0xaa, 0x2a, 0x46, 0x48, 0xa2, 0xa4, 0x55, 0xa6, 0x04,
204        0x8a, 0x29, 0xe0, 0x53, 0x10, 0xe0, 0x29, 0xc0, 0x50, 0x03, 0xb1,
205        0x46, 0x29, 0x80, 0x84, 0x52, 0x11, 0x40, 0x0d, 0x22, 0x9a, 0x45,
206        0x20, 0x23, 0x61, 0x51, 0x30, 0xa0, 0x08, 0xc8, 0xa8, 0xd8, 0x52,
207        0x02, 0x26, 0x15, 0x0b, 0x0a, 0x00, 0xb4, 0xa2, 0xa5, 0x5a, 0x00,
208        0x91, 0x45, 0x4a, 0xa2, 0x81, 0x92, 0x01, 0x4e, 0x02, 0x98, 0x87,
209        0x0a, 0x70, 0xa0, 0x07, 0x62, 0x8c, 0x50, 0x21, 0x0d, 0x25, 0x00,
210        0x34, 0x8a, 0x61, 0x14, 0x0c, 0x63, 0x0a, 0x89, 0x85, 0x00, 0x46,
211        0xd5, 0x1b, 0x52, 0x02, 0x16, 0xa8, 0x98, 0x50, 0x05, 0x94, 0xa9,
212        0x16, 0x80, 0x25, 0x5a, 0x95, 0x68, 0x18, 0xf1, 0x4f, 0x14, 0xc4,
213        0x3b, 0xb5, 0x22, 0xb6, 0x38, 0x34, 0x00, 0xe3, 0x22, 0x8e, 0xf4,
214        0x79, 0x8a, 0x7b, 0xd1, 0x71, 0x03, 0x30, 0xc7, 0x14, 0x83, 0xa5,
215        0x00, 0x06, 0x98, 0x68, 0x01, 0x8d, 0x51, 0x35, 0x03, 0x22, 0x6a,
216        0x8d, 0xa9, 0x01, 0x13, 0x54, 0x4d, 0x40, 0x13, 0xa5, 0x4a, 0x28,
217        0x02, 0x45, 0x35, 0x2a, 0x9a, 0x00, 0x78, 0x34, 0xf0, 0x69, 0x80,
218        0x34, 0x81, 0x45, 0x40, 0xce, 0x58, 0xe6, 0xa2, 0x4c, 0x06, 0xe4,
219        0xfa, 0xd1, 0x93, 0x50, 0x21, 0xca, 0xe4, 0x55, 0x84, 0x90, 0x30,
220        0xab, 0x8b, 0x18, 0xa6, 0x9a, 0x6a, 0xc4, 0x31, 0xaa, 0x26, 0xa0,
221        0x64, 0x4d, 0x51, 0xb5, 0x20, 0x23, 0x6a, 0x89, 0xa8, 0x02, 0x44,
222        0x35, 0x2a, 0x9a, 0x00, 0x95, 0x4d, 0x48, 0xa6, 0x80, 0x24, 0x53,
223        0x4e, 0xce, 0x05, 0x30, 0x2b, 0x3b, 0xee, 0x6a, 0x91, 0x5d, 0x76,
224        0x63, 0xbd, 0x65, 0x7d, 0x40, 0x66, 0x68, 0xa9, 0x02, 0x45, 0x2b,
225        0xb3, 0x9e, 0xb4, 0xc5, 0x6d, 0xad, 0x9a, 0xa0, 0x2c, 0x06, 0xc8,
226        0xcd, 0x04, 0xd6, 0xa2, 0x23, 0x63, 0x51, 0xb1, 0xa0, 0x64, 0x4d,
227        0x51, 0x93, 0x48, 0x08, 0xda, 0xa2, 0x6a, 0x00, 0x72, 0x1a, 0x99,
228        0x4d, 0x00, 0x48, 0xa6, 0xa4, 0x53, 0x4c, 0x07, 0x86, 0x03, 0xbd,
229        0x2b, 0x9c, 0xa7, 0x14, 0x98, 0x10, 0x85, 0x34, 0xe0, 0xa6, 0xb3,
230        0xb0, 0x0b, 0xb5, 0xa8, 0x0a, 0xd4, 0x58, 0x42, 0xed, 0x3e, 0x94,
231        0xd2, 0xa6, 0x8b, 0x01, 0x34, 0x44, 0xed, 0xe6, 0x9c, 0x4d, 0x6a,
232        0x80, 0x8d, 0x8d, 0x46, 0xc6, 0x80, 0x23, 0x63, 0x51, 0x9a, 0x06,
233        0x46, 0xd5, 0x13, 0x52, 0x01, 0x54, 0xd4, 0xaa, 0x68, 0x02, 0x40,
234        0x6a, 0x40, 0x78, 0xa0, 0x08, 0x59, 0xce, 0xee, 0xb5, 0x2a, 0x39,
235        0xd9, 0x59, 0xa7, 0xa8, 0x00, 0x73, 0xeb, 0x4e, 0x0e, 0x7d, 0x69,
236        0x5c, 0x05, 0xf3, 0x0f, 0xad, 0x1e, 0x61, 0xf5, 0xa7, 0x71, 0x0b,
237        0xe6, 0x35, 0x21, 0x90, 0xd3, 0xb8, 0x0e, 0x32, 0x10, 0x95, 0x10,
238        0x91, 0xb3, 0xd6, 0x9b, 0x60, 0x4b, 0x9c, 0x8a, 0x63, 0x1a, 0xb0,
239        0x18, 0x4d, 0x46, 0xc6, 0x80, 0x22, 0x6a, 0x61, 0xa4, 0x31, 0xaa,
240        0x6a, 0x55, 0x34, 0x01, 0x2a, 0x9a, 0x7e, 0x78, 0xa0, 0x08, 0x09,
241        0xf9, 0xaa, 0x58, 0xcf, 0xca, 0x6b, 0x3e, 0xa0, 0x00, 0xd3, 0x81,
242        0xa9, 0x01, 0x73, 0x46, 0x69, 0x80, 0xb9, 0xa4, 0xcd, 0x00, 0x2b,
243        0x1f, 0x92, 0xa3, 0x07, 0x9a, 0x6f, 0x70, 0x26, 0xcf, 0x14, 0xd2,
244        0x6b, 0x51, 0x0c, 0x63, 0x51, 0xb1, 0xa0, 0x08, 0xda, 0x98, 0x69,
245        0x0c, 0x8d, 0x4d, 0x4a, 0xa6, 0x80, 0x24, 0x53, 0x52, 0x03, 0xc5,
246        0x02, 0x21, 0x27, 0xe6, 0xa9, 0x23, 0x3f, 0x29, 0xac, 0xfa, 0x8c,
247        0x01, 0xe6, 0x9c, 0x0d, 0x48, 0x0a, 0x0d, 0x2e, 0x68, 0x01, 0x73,
248        0x49, 0x9a, 0x60, 0x2b, 0x1f, 0x92, 0x98, 0x3a, 0xd3, 0x7b, 0x81,
249        0x36, 0x78, 0xa6, 0x93, 0x5a, 0x88, 0x8c, 0x9a, 0x63, 0x1a, 0x00,
250        0x8c, 0xd3, 0x0d, 0x21, 0x91, 0x29, 0xa9, 0x14, 0xd0, 0x04, 0x8a,
251        0x69, 0xe0, 0xd3, 0x11, 0x1b, 0x1e, 0x6a, 0x48, 0xcf, 0xca, 0x6b,
252        0x3e, 0xa3, 0x10, 0x1a, 0x70, 0x35, 0x20, 0x38, 0x1a, 0x5c, 0xd2,
253        0x01, 0x73, 0x49, 0x9a, 0x60, 0x39, 0x8f, 0xca, 0x29, 0x8b, 0xf7,
254        0xaa, 0xba, 0x88, 0x96, 0x9a, 0x6b, 0x40, 0x18, 0xc6, 0xa3, 0x26,
255        0x80, 0x18, 0x69, 0xa6, 0x90, 0xc8, 0x14, 0xd4, 0x8a, 0x69, 0x80,
256        0xf0, 0x6a, 0x40, 0x68, 0x10, 0xbb, 0x41, 0xa7, 0xe3, 0x0b, 0xc5,
257        0x2b, 0x01, 0x10, 0xa7, 0x03, 0x59, 0x0c, 0x76, 0x69, 0x73, 0x40,
258        0x0b, 0x9a, 0x28, 0x11, 0x28, 0x19, 0x5e, 0x69, 0x02, 0x81, 0x5a,
259        0xd8, 0x00, 0xd3, 0x4d, 0x50, 0x0c, 0x6a, 0x8c, 0xd2, 0x01, 0xa6,
260        0x98, 0x69, 0x0c, 0xae, 0xa6, 0xa4, 0x06, 0x80, 0x1e, 0xa6, 0x9e,
261        0x0d, 0x31, 0x12, 0x03, 0x4f, 0x06, 0x80, 0x13, 0x60, 0x34, 0xd3,
262        0xc1, 0xa8, 0x92, 0x01, 0xf1, 0x8d, 0xdd, 0x69, 0xcc, 0xa1, 0x69,
263        0x5b, 0x4b, 0x80, 0x83, 0x93, 0x52, 0x04, 0x14, 0xe2, 0xae, 0x03,
264        0xa9, 0x0d, 0x68, 0x03, 0x4d, 0x34, 0xd0, 0x03, 0x0d, 0x30, 0xd2,
265        0x01, 0x86, 0x9a, 0x68, 0x19, 0x58, 0x1a, 0x78, 0xa4, 0x04, 0x8a,
266        0x69, 0xe0, 0xd3, 0x10, 0xe0, 0x69, 0xe0, 0xd0, 0x03, 0xc1, 0xa8,
267        0xdb, 0xad, 0x4c, 0x81, 0x12, 0x45, 0xd6, 0x9d, 0x25, 0x1d, 0x00,
268        0x6a, 0xf5, 0xa9, 0xe8, 0x80, 0x31, 0x29, 0x0d, 0x58, 0x08, 0x69,
269        0x86, 0x80, 0x1a, 0x69, 0x86, 0x90, 0x0c, 0x34, 0xd3, 0x48, 0x65,
270        0x51, 0x4f, 0x06, 0x98, 0x0f, 0x14, 0xf0, 0x68, 0x10, 0xf0, 0x69,
271        0xe0, 0xd0, 0x03, 0x81, 0xa5, 0x2b, 0x9a, 0x1a, 0xb8, 0x87, 0xa8,
272        0xdb, 0x4a, 0x46, 0x68, 0xb6, 0x80, 0x2a, 0xa8, 0x14, 0xea, 0x12,
273        0xb0, 0x05, 0x21, 0xa6, 0x02, 0x1a, 0x61, 0xa0, 0x06, 0x9a, 0x61,
274        0xa4, 0x31, 0x86, 0x9a, 0x69, 0x0c, 0xa8, 0x0d, 0x3c, 0x53, 0x01,
275        0xe2, 0x9e, 0x28, 0x10, 0xf1, 0x4e, 0x06, 0x98, 0x0f, 0x06, 0x9e,
276        0x0d, 0x02, 0x1c, 0x29, 0xc2, 0x80, 0x16, 0x96, 0x80, 0x0a, 0x4a,
277        0x00, 0x43, 0x4d, 0x34, 0x0c, 0x61, 0xa6, 0x1a, 0x40, 0x34, 0xd3,
278        0x4d, 0x21, 0x80, 0xff, 0xd9, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0a,
279        0x07, 0x07, 0x08, 0x07, 0x06, 0x0a, 0x08, 0x08, 0x08, 0x0b, 0x0a,
280        0x0a, 0x0b, 0x0e, 0x18, 0x10, 0x0e, 0x0d, 0x0d, 0x0e, 0x1d, 0x15,
281        0x16, 0x11, 0x18, 0x23, 0x1f, 0x25, 0x24, 0x22, 0x1f, 0x22, 0x21,
282        0x26, 0x2b, 0x37, 0x2f, 0x26, 0x29, 0x34, 0x29, 0x21, 0x22, 0x30,
283        0x41, 0x31, 0x34, 0x39, 0x3b, 0x3e, 0x3e, 0x3e, 0x25, 0x2e, 0x44,
284        0x49, 0x43, 0x3c, 0x48, 0x37, 0x3d, 0x3e, 0x3b, 0x01, 0x0a, 0x0b,
285        0x0b, 0x0e, 0x0d, 0x0e, 0x1c, 0x10, 0x10, 0x1c, 0x3b, 0x28, 0x22,
286        0x28, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
287        0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
288        0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
289        0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
290        0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xff, 0xc0, 0x00, 0x11,
291        0x08, 0x00, 0x48, 0x00, 0x60, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11,
292        0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x01, 0xa2, 0x00, 0x00, 0x01,
293        0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
294        0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
295        0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
296        0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01,
297        0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
298        0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1,
299        0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33,
300        0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
301        0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
302        0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54,
303        0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67,
304        0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
305        0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94,
306        0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
307        0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8,
308        0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
309        0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
310        0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
311        0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x01, 0x00, 0x03, 0x01,
312        0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
313        0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
314        0x09, 0x0a, 0x0b, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03,
315        0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01,
316        0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51,
317        0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
318        0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72,
319        0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19,
320        0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39,
321        0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54,
322        0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67,
323        0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
324        0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93,
325        0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
326        0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
327        0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
328        0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2,
329        0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
330        0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03,
331        0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x9e, 0xd2,
332        0x2e, 0x07, 0x15, 0xaf, 0x6d, 0x08, 0xe2, 0xb3, 0x45, 0x1a, 0xf6,
333        0xd0, 0x00, 0x01, 0xc5, 0x68, 0x45, 0x17, 0x4a, 0xb4, 0x22, 0xe4,
334        0x70, 0x8c, 0x74, 0xa9, 0x3c, 0xa1, 0x8e, 0x95, 0x48, 0x96, 0x31,
335        0xe2, 0x18, 0xe9, 0x55, 0xa5, 0x8c, 0x7a, 0x50, 0x05, 0x0b, 0x88,
336        0x86, 0x0f, 0x15, 0x8f, 0x75, 0x1f, 0x26, 0x93, 0x19, 0x91, 0x77,
337        0x18, 0xc1, 0xac, 0x4b, 0xc8, 0xfa, 0xd6, 0x63, 0x37, 0x6d, 0x31,
338        0xb4, 0x73, 0x5b, 0x36, 0xa0, 0x1c, 0x50, 0x80, 0xd7, 0x83, 0xa0,
339        0xab, 0xd1, 0x62, 0xad, 0x09, 0x8f, 0x17, 0x29, 0x03, 0xb2, 0xcc,
340        0xe0, 0x77, 0x14, 0xa3, 0x56, 0xb3, 0x27, 0x1e, 0x67, 0xe9, 0x52,
341        0xea, 0xc6, 0x3a, 0x36, 0x48, 0xef, 0x3d, 0x27, 0x70, 0x22, 0x60,
342        0x47, 0x52, 0x69, 0xb2, 0xe2, 0xad, 0x3b, 0xea, 0x80, 0xa3, 0x38,
343        0xe0, 0xd6, 0x3d, 0xd8, 0x1c, 0xd0, 0xca, 0x46, 0x3d, 0xd0, 0x18,
344        0x35, 0x89, 0x78, 0xa3, 0x9a, 0xcd, 0x8c, 0xd2, 0xb3, 0x93, 0x2a,
345        0x2b, 0x66, 0xd5, 0xf1, 0x8a, 0x10, 0x1a, 0xd6, 0xf2, 0x03, 0x8a,
346        0x9e, 0xe6, 0xf4, 0x5a, 0xdb, 0xef, 0xfe, 0x23, 0xc0, 0xa7, 0x27,
347        0xcb, 0x16, 0xc4, 0xcc, 0xdd, 0xe2, 0x78, 0x9a, 0x69, 0x66, 0xcc,
348        0x99, 0xe1, 0x4d, 0x47, 0xba, 0xbc, 0xd9, 0x6a, 0xee, 0x26, 0x59,
349        0x59, 0x4d, 0xac, 0x69, 0x34, 0x52, 0xe5, 0x8f, 0x55, 0xad, 0x58,
350        0xae, 0x85, 0xc4, 0x22, 0x41, 0xdf, 0xad, 0x76, 0x61, 0xe5, 0x6f,
351        0x74, 0x45, 0x69, 0xdc, 0x00, 0x79, 0xac, 0x8b, 0xa6, 0xc9, 0x35,
352        0xd4, 0x34, 0x64, 0xdc, 0x37, 0x06, 0xb1, 0xae, 0x88, 0xc1, 0xac,
353        0xd8, 0xc9, 0x2c, 0xa6, 0xe0, 0x73, 0x5b, 0x36, 0xf3, 0x74, 0xe6,
354        0x84, 0x05, 0xe3, 0xa9, 0x47, 0x6a, 0x14, 0xb6, 0x49, 0x3d, 0x85,
355        0x3a, 0xee, 0xee, 0x2b, 0xa8, 0xe2, 0x6f, 0x30, 0x81, 0xe9, 0x8a,
356        0xca, 0xa4, 0xe2, 0xd3, 0x8b, 0x01, 0xb1, 0xf9, 0x04, 0x7f, 0xaf,
357        0x23, 0xf0, 0xa9, 0x54, 0x41, 0x9c, 0xfd, 0xa3, 0xf4, 0xae, 0x65,
358        0x18, 0xf7, 0x25, 0x8a, 0xe2, 0x02, 0x38, 0xb8, 0xfd, 0x2a, 0x7b,
359        0x5b, 0xa8, 0x6d, 0x6d, 0x5d, 0x9a, 0x5d, 0xcb, 0xbb, 0xd2, 0xb6,
360        0xa6, 0xa3, 0x19, 0x5e, 0xe2, 0x03, 0x7b, 0x1d, 0xc2, 0x17, 0x8d,
361        0xb8, 0xac, 0xfb, 0x89, 0x39, 0x35, 0xd6, 0x9a, 0x6a, 0xe8, 0x66,
362        0x55, 0xcb, 0xf5, 0xac, 0x7b, 0x96, 0xeb, 0x50, 0xc6, 0x88, 0x6d,
363        0x66, 0xe9, 0xcd, 0x6c, 0xdb, 0x4f, 0xd3, 0x9a, 0x00, 0x2f, 0xe6,
364        0xf9, 0xa3, 0xe7, 0xb5, 0x4a, 0x93, 0x7f, 0xa2, 0xc6, 0x73, 0xdc,
365        0xd7, 0x15, 0x55, 0xef, 0x48, 0x7d, 0x09, 0x52, 0x6e, 0x3a, 0xd4,
366        0xab, 0x2f, 0xbd, 0x61, 0x16, 0x0c, 0x73, 0x49, 0xc5, 0x24, 0x92,
367        0x7f, 0xa2, 0x63, 0xfd, 0xaa, 0xd6, 0x2f, 0x71, 0x0e, 0xb1, 0x93,
368        0xf7, 0x2d, 0xf5, 0xa4, 0x9e, 0x4e, 0xb5, 0xdd, 0x4b, 0xf8, 0x68,
369        0x4c, 0xcb, 0xb9, 0x93, 0xad, 0x65, 0xce, 0xd9, 0x26, 0xa9, 0x8d,
370        0x19, 0xf6, 0xf2, 0xf4, 0xe6, 0xb5, 0xad, 0xe7, 0xc6, 0x39, 0xa0,
371        0x18, 0xeb, 0xc9, 0x77, 0x6c, 0x35, 0x2a, 0x4b, 0xfe, 0x8a, 0x9c,
372        0xff, 0x00, 0x11, 0xae, 0x3a, 0x8b, 0xde, 0x61, 0xd0, 0x9e, 0x39,
373        0xb8, 0xeb, 0x53, 0xac, 0xb9, 0xae, 0x5b, 0x00, 0xf3, 0x27, 0x14,
374        0x92, 0xc9, 0xfe, 0x8a, 0x3f, 0xde, 0x35, 0xac, 0x3a, 0x88, 0x92,
375        0xcd, 0xb1, 0x6e, 0x7d, 0xcd, 0x32, 0x67, 0xeb, 0xcd, 0x7a, 0x14,
376        0xfe, 0x04, 0x26, 0x66, 0xce, 0xf9, 0x26, 0xb3, 0xe6, 0x6e, 0xb4,
377        0xd9, 0x48, 0xc8, 0x82, 0x4e, 0x07, 0x35, 0xa7, 0x6f, 0x2f, 0x02,
378        0x9a, 0x06, 0x5f, 0x8c, 0xa4, 0x83, 0x0e, 0x32, 0x2a, 0x69, 0xe3,
379        0xdd, 0x12, 0x08, 0x97, 0x85, 0xec, 0x2a, 0x2a, 0x42, 0xf1, 0x76,
380        0x26, 0xe4, 0x6a, 0x59, 0x0e, 0x18, 0x10, 0x6a, 0xd2, 0x89, 0x02,
381        0x6e, 0x2a, 0x71, 0xeb, 0x5c, 0x1c, 0x8c, 0xa6, 0x48, 0xbb, 0xdc,
382        0x61, 0x41, 0x35, 0x72, 0x28, 0x87, 0xd9, 0xf6, 0x4a, 0xb9, 0xe7,
383        0x38, 0xae, 0x8c, 0x3d, 0x36, 0xdd, 0xde, 0xc4, 0xb0, 0x21, 0x51,
384        0x76, 0xa8, 0xc0, 0xaa, 0x93, 0x31, 0xe6, 0xbb, 0x2d, 0x65, 0x61,
385        0x19, 0xd3, 0x1e, 0xb5, 0x46, 0x5a, 0x96, 0x5a, 0x30, 0xa0, 0x7e,
386        0x05, 0x69, 0x5b, 0xc9, 0xc6, 0x28, 0x40, 0xcd, 0x08, 0x64, 0x3c,
387        0x73, 0x57, 0xe1, 0x94, 0xf1, 0xcd, 0x5a, 0x21, 0x8c, 0xb9, 0x63,
388        0xe7, 0x67, 0x1d, 0xab, 0x40, 0xb1, 0xfb, 0x00, 0x1d, 0xf0, 0x2b,
389        0x99, 0x2d, 0x66, 0x3e, 0x88, 0x75, 0x81, 0x3f, 0x31, 0xf6, 0xab,
390        0x64, 0xd6, 0xb4, 0x17, 0xee, 0xd0, 0x9e, 0xe4, 0x32, 0x1a, 0xa7,
391        0x31, 0xad, 0x18, 0x14, 0x26, 0xef, 0x54, 0xa5, 0xa8, 0x65, 0xa3,
392        0x9c, 0x81, 0xfa, 0x56, 0x8c, 0x2d, 0xce, 0x68, 0x40, 0xcb, 0xf1,
393        0x37, 0xbd, 0x5e, 0x85, 0xea, 0xd1, 0x0c, 0xbb, 0x19, 0x56, 0x23,
394        0x20, 0x1f, 0xad, 0x5c, 0x42, 0x08, 0x03, 0xb5, 0x55, 0x91, 0x04,
395        0xc9, 0x80, 0x38, 0x00, 0x0a, 0x71, 0x34, 0x6c, 0x32, 0x27, 0xe9,
396        0x55, 0x25, 0x15, 0x2c, 0x68, 0xa3, 0x30, 0xeb, 0x54, 0xa5, 0x15,
397        0x0c, 0xd1, 0x00, 0xff, 0xd9};
398
399    /* package */ static final byte[] sPhotoByteArrayForComplicatedCase;
400
401    static {
402        final int length = sPhotoIntArrayForComplicatedCase.length;
403        sPhotoByteArrayForComplicatedCase = new byte[length];
404        for (int i = 0; i < length; i++) {
405            sPhotoByteArrayForComplicatedCase[i] = (byte)sPhotoIntArrayForComplicatedCase[i];
406        }
407    }
408
409    public void testV21SimpleCase1_Parsing() {
410        mVerifier.initForImportTest(V21, R.raw.v21_simple_1);
411        mVerifier.addPropertyNodesVerifierElem()
412                .addExpectedNodeWithOrder("N", "Ando;Roid;", Arrays.asList("Ando", "Roid", ""));
413    }
414
415    public void testV21SimpleCase1_Type_Generic() {
416        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_GENERIC, R.raw.v21_simple_1);
417        mVerifier.addContentValuesVerifierElem()
418                .addExpected(StructuredName.CONTENT_ITEM_TYPE)
419                        .put(StructuredName.FAMILY_NAME, "Ando")
420                        .put(StructuredName.GIVEN_NAME, "Roid")
421                        .put(StructuredName.DISPLAY_NAME, "Roid Ando");
422    }
423
424    public void testV21SimpleCase1_Type_Japanese() {
425        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_simple_1);
426        mVerifier.addContentValuesVerifierElem()
427                .addExpected(StructuredName.CONTENT_ITEM_TYPE)
428                        .put(StructuredName.FAMILY_NAME, "Ando")
429                        .put(StructuredName.GIVEN_NAME, "Roid")
430                        // If name-related strings only contains printable Ascii,
431                        // the order is remained to be US's:
432                        // "Prefix Given Middle Family Suffix"
433                        .put(StructuredName.DISPLAY_NAME, "Roid Ando");
434    }
435
436    public void testV21SimpleCase2() {
437        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_simple_2);
438        mVerifier.addContentValuesVerifierElem()
439                .addExpected(StructuredName.CONTENT_ITEM_TYPE)
440                        .put(StructuredName.DISPLAY_NAME, "Ando Roid");
441    }
442
443    public void testV21SimpleCase3() {
444        mVerifier.initForImportTest(V21, R.raw.v21_simple_3);
445        mVerifier.addContentValuesVerifierElem()
446                .addExpected(StructuredName.CONTENT_ITEM_TYPE)
447                        .put(StructuredName.FAMILY_NAME, "Ando")
448                        .put(StructuredName.GIVEN_NAME, "Roid")
449                        // "FN" field should be prefered since it should contain the original
450                        // order intended by the author of the file.
451                        .put(StructuredName.DISPLAY_NAME, "Ando Roid");
452    }
453
454    /**
455     * Tests ';' is properly handled by VCardParser implementation.
456     */
457    public void testV21BackslashCase_Parsing() {
458        mVerifier.initForImportTest(V21, R.raw.v21_backslash);
459        mVerifier.addPropertyNodesVerifierElem()
460                .addExpectedNodeWithOrder("VERSION", "2.1")
461                .addExpectedNodeWithOrder("N", ";A;B\\;C\\;;D;:E;\\\\;",
462                        Arrays.asList("", "A;B\\", "C\\;", "D", ":E", "\\\\", ""))
463                .addExpectedNodeWithOrder("FN", "A;B\\C\\;D:E\\\\");
464
465    }
466
467    /**
468     * Tests ContactStruct correctly ignores redundant fields in "N" property values and
469     * inserts name related data.
470     */
471    public void testV21BackslashCase() {
472        mVerifier.initForImportTest(V21, R.raw.v21_backslash);
473        mVerifier.addContentValuesVerifierElem()
474                .addExpected(StructuredName.CONTENT_ITEM_TYPE)
475                        // FAMILY_NAME is empty and removed in this test...
476                        .put(StructuredName.GIVEN_NAME, "A;B\\")
477                        .put(StructuredName.MIDDLE_NAME, "C\\;")
478                        .put(StructuredName.PREFIX, "D")
479                        .put(StructuredName.SUFFIX, ":E")
480                        .put(StructuredName.DISPLAY_NAME, "A;B\\C\\;D:E\\\\");
481    }
482
483    public void testOrgBeforTitle() {
484        mVerifier.initForImportTest(V21, R.raw.v21_org_before_title);
485        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
486        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
487                .put(StructuredName.DISPLAY_NAME, "Normal Guy");
488        elem.addExpected(Organization.CONTENT_ITEM_TYPE)
489                .put(Organization.COMPANY, "Company")
490                .put(Organization.DEPARTMENT, "Organization Devision Room Sheet No.")
491                .put(Organization.TITLE, "Excellent Janitor")
492                .put(Organization.TYPE, Organization.TYPE_WORK);
493    }
494
495    public void testTitleBeforOrg() {
496        mVerifier.initForImportTest(V21, R.raw.v21_title_before_org);
497        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
498        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
499                .put(StructuredName.DISPLAY_NAME, "Nice Guy");
500        elem.addExpected(Organization.CONTENT_ITEM_TYPE)
501                .put(Organization.COMPANY, "Marverous")
502                .put(Organization.DEPARTMENT, "Perfect Great Good Bad Poor")
503                .put(Organization.TITLE, "Cool Title")
504                .put(Organization.TYPE, Organization.TYPE_WORK);
505    }
506
507    /**
508     * Verifies that vCard importer correctly interpret "PREF" attribute to IS_PRIMARY.
509     * The data contain three cases: one "PREF", no "PREF" and multiple "PREF", in each type.
510     */
511    public void testV21PrefToIsPrimary() {
512        mVerifier.initForImportTest(V21, R.raw.v21_pref_handling);
513        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
514        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
515                .put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
516                .put(StructuredName.DISPLAY_NAME, "Smith");
517        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
518                .put(Phone.NUMBER, "1")
519                .put(Phone.TYPE, Phone.TYPE_HOME);
520        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
521                .put(Phone.NUMBER, "2")
522                .put(Phone.TYPE, Phone.TYPE_WORK)
523                .put(Phone.IS_PRIMARY, 1);
524        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
525                .put(Phone.NUMBER, "3")
526                .put(Phone.TYPE, Phone.TYPE_ISDN);
527        elem.addExpected(Email.CONTENT_ITEM_TYPE)
528                .put(Email.DATA, "test@example.com")
529                .put(Email.TYPE, Email.TYPE_HOME)
530                .put(Email.IS_PRIMARY, 1);
531        elem.addExpected(Email.CONTENT_ITEM_TYPE)
532                .put(Email.DATA, "test2@examination.com")
533                .put(Email.TYPE, Email.TYPE_MOBILE)
534                .put(Email.IS_PRIMARY, 1);
535        elem.addExpected(Organization.CONTENT_ITEM_TYPE)
536                .put(Organization.COMPANY, "Company")
537                .put(Organization.TITLE, "Engineer")
538                .put(Organization.TYPE, Organization.TYPE_WORK);
539        elem.addExpected(Organization.CONTENT_ITEM_TYPE)
540                .put(Organization.COMPANY, "Mystery")
541                .put(Organization.TITLE, "Blogger")
542                .put(Organization.TYPE, Organization.TYPE_WORK);
543        elem.addExpected(Organization.CONTENT_ITEM_TYPE)
544                .put(Organization.COMPANY, "Poetry")
545                .put(Organization.TITLE, "Poet")
546                .put(Organization.TYPE, Organization.TYPE_WORK);
547    }
548
549    /**
550     * Tests all the properties in a complicated vCard are correctly parsed by the VCardParser.
551     */
552    public void testV21ComplicatedCase_Parsing() {
553        mVerifier.initForImportTest(V21, R.raw.v21_complicated);
554        mVerifier.addPropertyNodesVerifierElem()
555                .addExpectedNodeWithOrder("VERSION", "2.1")
556                .addExpectedNodeWithOrder("N", "Gump;Forrest;Hoge;Pos;Tao",
557                        Arrays.asList("Gump", "Forrest", "Hoge", "Pos", "Tao"))
558                .addExpectedNodeWithOrder("FN", "Joe Due")
559                .addExpectedNodeWithOrder("ORG",
560                        "Gump Shrimp Co.;Sales Dept.;Manager;Fish keeper",
561                        Arrays.asList("Gump Shrimp Co.", "Sales Dept.;Manager", "Fish keeper"))
562                .addExpectedNodeWithOrder("ROLE", "Fish Cake Keeper!")
563                .addExpectedNodeWithOrder("TITLE", "Shrimp Man")
564                .addExpectedNodeWithOrder("X-CLASS", "PUBLIC")
565                .addExpectedNodeWithOrder("TEL", "(111) 555-1212", new TypeSet("WORK", "VOICE"))
566                .addExpectedNodeWithOrder("TEL", "(404) 555-1212", new TypeSet("HOME", "VOICE"))
567                .addExpectedNodeWithOrder("TEL", "0311111111", new TypeSet("CELL"))
568                .addExpectedNodeWithOrder("TEL", "0322222222", new TypeSet("VIDEO"))
569                .addExpectedNodeWithOrder("TEL", "0333333333", new TypeSet("VOICE"))
570                .addExpectedNodeWithOrder("ADR",
571                        ";;100 Waters Edge;Baytown;LA;30314;United States of America",
572                        Arrays.asList("", "", "100 Waters Edge", "Baytown",
573                                "LA", "30314", "United States of America"),
574                                null, null, new TypeSet("WORK"), null)
575                .addExpectedNodeWithOrder("LABEL",
576                        "100 Waters Edge\r\nBaytown, LA 30314\r\nUnited  States of America",
577                        null, null, mContentValuesForQP, new TypeSet("WORK"), null)
578                .addExpectedNodeWithOrder("ADR",
579                        ";;42 Plantation St.;Baytown;LA;30314;United States of America",
580                        Arrays.asList("", "", "42 Plantation St.", "Baytown",
581                                "LA", "30314", "United States of America"), null, null,
582                                new TypeSet("HOME"), null)
583                .addExpectedNodeWithOrder("LABEL",
584                        "42 Plantation St.\r\nBaytown, LA 30314\r\nUnited  States of America",
585                        null, null, mContentValuesForQP,
586                        new TypeSet("HOME"), null)
587                .addExpectedNodeWithOrder("EMAIL", "forrestgump@walladalla.com",
588                        new TypeSet("PREF", "INTERNET"))
589                .addExpectedNodeWithOrder("EMAIL", "cell@example.com", new TypeSet("CELL"))
590                .addExpectedNodeWithOrder("NOTE",
591                        "The following note is the example from RFC 2045.")
592                .addExpectedNodeWithOrder("NOTE",
593                        "Now's the time for all folk to come to the aid of their country.",
594                        null, null, mContentValuesForQP, null, null)
595                .addExpectedNodeWithOrder("PHOTO", null,
596                        null, sPhotoByteArrayForComplicatedCase, mContentValuesForBase64V21,
597                        new TypeSet("JPEG"), null)
598                .addExpectedNodeWithOrder("X-ATTRIBUTE", "Some String")
599                .addExpectedNodeWithOrder("BDAY", "19800101")
600                .addExpectedNodeWithOrder("GEO", "35.6563854,139.6994233")
601                .addExpectedNodeWithOrder("URL", "http://www.example.com/")
602                .addExpectedNodeWithOrder("REV", "20080424T195243Z");
603    }
604
605    /**
606     * Checks ContactStruct correctly inserts values in a complicated vCard
607     * into ContentResolver.
608     */
609    public void testV21ComplicatedCase() {
610        mVerifier.initForImportTest(V21, R.raw.v21_complicated);
611        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
612        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
613                .put(StructuredName.FAMILY_NAME, "Gump")
614                .put(StructuredName.GIVEN_NAME, "Forrest")
615                .put(StructuredName.MIDDLE_NAME, "Hoge")
616                .put(StructuredName.PREFIX, "Pos")
617                .put(StructuredName.SUFFIX, "Tao")
618                .put(StructuredName.DISPLAY_NAME, "Joe Due");
619        elem.addExpected(Organization.CONTENT_ITEM_TYPE)
620                .put(Organization.TYPE, Organization.TYPE_WORK)
621                .put(Organization.COMPANY, "Gump Shrimp Co.")
622                .put(Organization.DEPARTMENT, "Sales Dept.;Manager Fish keeper")
623                .put(Organization.TITLE, "Shrimp Man");
624        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
625                .put(Phone.TYPE, Phone.TYPE_WORK)
626                // Phone number is expected to be formated with NAMP format in default.
627                .put(Phone.NUMBER, "111-555-1212");
628        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
629                .put(Phone.TYPE, Phone.TYPE_HOME)
630                .put(Phone.NUMBER, "404-555-1212");
631        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
632                .put(Phone.TYPE, Phone.TYPE_MOBILE)
633                .put(Phone.NUMBER, "031-111-1111");
634        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
635                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
636                .put(Phone.LABEL, "VIDEO")
637                .put(Phone.NUMBER, "032-222-2222");
638        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
639                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
640                .put(Phone.LABEL, "VOICE")
641                .put(Phone.NUMBER, "033-333-3333");
642        elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
643                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK)
644                .put(StructuredPostal.COUNTRY, "United States of America")
645                .put(StructuredPostal.POSTCODE, "30314")
646                .put(StructuredPostal.REGION, "LA")
647                .put(StructuredPostal.CITY, "Baytown")
648                .put(StructuredPostal.STREET, "100 Waters Edge")
649                .put(StructuredPostal.FORMATTED_ADDRESS,
650                        "100 Waters Edge Baytown LA 30314 United States of America");
651        elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
652                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME)
653                .put(StructuredPostal.COUNTRY, "United States of America")
654                .put(StructuredPostal.POSTCODE, "30314")
655                .put(StructuredPostal.REGION, "LA")
656                .put(StructuredPostal.CITY, "Baytown")
657                .put(StructuredPostal.STREET, "42 Plantation St.")
658                .put(StructuredPostal.FORMATTED_ADDRESS,
659                        "42 Plantation St. Baytown LA 30314 United States of America");
660        elem.addExpected(Email.CONTENT_ITEM_TYPE)
661                // "TYPE=INTERNET" -> TYPE_CUSTOM + the label "INTERNET"
662                .put(Email.TYPE, Email.TYPE_CUSTOM)
663                .put(Email.LABEL, "INTERNET")
664                .put(Email.DATA, "forrestgump@walladalla.com")
665                .put(Email.IS_PRIMARY, 1);
666        elem.addExpected(Email.CONTENT_ITEM_TYPE)
667                .put(Email.TYPE, Email.TYPE_MOBILE)
668                .put(Email.DATA, "cell@example.com");
669        elem.addExpected(Note.CONTENT_ITEM_TYPE)
670                .put(Note.NOTE, "The following note is the example from RFC 2045.");
671        elem.addExpected(Note.CONTENT_ITEM_TYPE)
672                .put(Note.NOTE,
673                        "Now's the time for all folk to come to the aid of their country.");
674        elem.addExpected(Photo.CONTENT_ITEM_TYPE)
675                // No information about its image format can be inserted.
676                .put(Photo.PHOTO, sPhotoByteArrayForComplicatedCase);
677        elem.addExpected(Event.CONTENT_ITEM_TYPE)
678                .put(Event.START_DATE, "19800101")
679                .put(Event.TYPE, Event.TYPE_BIRTHDAY);
680        elem.addExpected(Website.CONTENT_ITEM_TYPE)
681                .put(Website.URL, "http://www.example.com/")
682                .put(Website.TYPE, Website.TYPE_HOMEPAGE);
683    }
684
685    public void testInvalidMultipleLineV21() {
686        mVerifier.initForImportTest(V21, R.raw.v21_invalid_multiple_line);
687        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
688        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
689                .put(StructuredName.GIVEN_NAME, "Omega")
690                .put(StructuredName.DISPLAY_NAME, "Omega");
691        elem.addExpected(Email.CONTENT_ITEM_TYPE)
692                .put(Email.TYPE, Email.TYPE_CUSTOM)
693                .put(Email.LABEL, "INTERNET")
694                .put(Email.ADDRESS, "\"Omega\" <omega@example.com>");
695    }
696
697    public void testV30Simple_Parsing() {
698        mVerifier.initForImportTest(V30, R.raw.v30_simple);
699        mVerifier.addPropertyNodesVerifierElem()
700                .addExpectedNodeWithOrder("VERSION", "3.0")
701                .addExpectedNodeWithOrder("FN", "And Roid")
702                .addExpectedNodeWithOrder("N", "And;Roid;;;",
703                        Arrays.asList("And", "Roid", "", "", ""))
704                .addExpectedNodeWithOrder("ORG", "Open;Handset; Alliance",
705                        Arrays.asList("Open", "Handset", " Alliance"))
706                .addExpectedNodeWithOrder("SORT-STRING", "android")
707                .addExpectedNodeWithOrder("TEL", "0300000000", new TypeSet("PREF", "VOICE"))
708                .addExpectedNodeWithOrder("CLASS", "PUBLIC")
709                .addExpectedNodeWithOrder("X-GNO", "0")
710                .addExpectedNodeWithOrder("X-GN", "group0")
711                .addExpectedNodeWithOrder("X-REDUCTION", "0")
712                .addExpectedNodeWithOrder("REV", "20081031T065854Z");
713    }
714
715    public void testV30Simple() {
716        mVerifier.initForImportTest(V30, R.raw.v30_simple);
717        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
718        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
719                .put(StructuredName.FAMILY_NAME, "And")
720                .put(StructuredName.GIVEN_NAME, "Roid")
721                .put(StructuredName.DISPLAY_NAME, "And Roid")
722                .put(StructuredName.PHONETIC_GIVEN_NAME, "android");
723        elem.addExpected(Organization.CONTENT_ITEM_TYPE)
724                .put(Organization.COMPANY, "Open")
725                .put(Organization.DEPARTMENT, "Handset  Alliance")
726                .put(Organization.TYPE, Organization.TYPE_WORK);
727        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
728                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
729                .put(Phone.LABEL, "VOICE")
730                .put(Phone.NUMBER, "030-000-0000")
731                .put(Phone.IS_PRIMARY, 1);
732    }
733
734    public void testV21Japanese1_Parsing() {
735        // Though Japanese careers append ";;;;" at the end of the value of "SOUND",
736        // vCard 2.1/3.0 specification does not allow multiple values.
737        // Do not need to handle it as multiple values.
738        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_japanese_1);
739        mVerifier.addPropertyNodesVerifierElem()
740                .addExpectedNodeWithOrder("VERSION", "2.1", null, null, null, null, null)
741                .addExpectedNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9;;;;",
742                        Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9", "", "", "", ""),
743                        null, mContentValuesForSJis, null, null)
744                .addExpectedNodeWithOrder("SOUND",
745                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E;;;;",
746                        null, null, mContentValuesForSJis,
747                        new TypeSet("X-IRMC-N"), null)
748                .addExpectedNodeWithOrder("TEL", "0300000000", null, null, null,
749                        new TypeSet("VOICE", "PREF"), null);
750    }
751
752    private void testV21Japanese1Common(int resId, int vcardType, boolean japanese) {
753        mVerifier.initForImportTest(vcardType, resId);
754        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
755        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
756                .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9")
757                .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9")
758                // While vCard parser does not split "SOUND" property values,
759                // ContactStruct care it.
760                .put(StructuredName.PHONETIC_GIVEN_NAME,
761                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E");
762        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
763                // Phone number formatting is different.
764                .put(Phone.NUMBER, (japanese ? "03-0000-0000" : "030-000-0000"))
765                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
766                .put(Phone.LABEL, "VOICE")
767                .put(Phone.IS_PRIMARY, 1);
768    }
769
770    /**
771     * Verifies vCard with Japanese can be parsed correctly with
772     * {@link com.android.vcard.VCardConfig#VCARD_TYPE_V21_GENERIC}.
773     */
774    public void testV21Japanese1_Type_Generic_Utf8() {
775        testV21Japanese1Common(
776                R.raw.v21_japanese_1, VCardConfig.VCARD_TYPE_V21_GENERIC, false);
777    }
778
779    /**
780     * Verifies vCard with Japanese can be parsed correctly with
781     * {@link com.android.vcard.VCardConfig#VCARD_TYPE_V21_JAPANESE}.
782     */
783    public void testV21Japanese1_Type_Japanese_Sjis() {
784        testV21Japanese1Common(
785                R.raw.v21_japanese_1, VCardConfig.VCARD_TYPE_V21_JAPANESE, true);
786    }
787
788    /**
789     * Verifies vCard with Japanese can be parsed correctly with
790     * {@link com.android.vcard.VCardConfig#VCARD_TYPE_V21_JAPANESE}.
791     * since vCard 2.1 specifies the charset of each line if it contains non-Ascii.
792     */
793    public void testV21Japanese1_Type_Japanese_Utf8() {
794        testV21Japanese1Common(
795                R.raw.v21_japanese_1, VCardConfig.VCARD_TYPE_V21_JAPANESE, true);
796    }
797
798    public void testV21Japanese2_Parsing() {
799        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_japanese_2);
800        mVerifier.addPropertyNodesVerifierElem()
801                .addExpectedNodeWithOrder("VERSION", "2.1")
802                .addExpectedNodeWithOrder("N", "\u5B89\u85E4;\u30ED\u30A4\u30C9\u0031;;;",
803                        Arrays.asList("\u5B89\u85E4", "\u30ED\u30A4\u30C9\u0031",
804                                "", "", ""),
805                        null, mContentValuesForSJis, null, null)
806                .addExpectedNodeWithOrder("FN", "\u5B89\u85E4\u0020\u30ED\u30A4\u30C9\u0020\u0031",
807                        null, null, mContentValuesForSJis, null, null)
808                .addExpectedNodeWithOrder("SOUND",
809                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73;\uFF9B\uFF72\uFF84\uFF9E\u0031;;;",
810                        null, null, mContentValuesForSJis,
811                        new TypeSet("X-IRMC-N"), null)
812                .addExpectedNodeWithOrder("ADR",
813                        ";\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
814                        "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
815                        "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC\u0036" +
816                        "\u968E;;;;150-8512;",
817                        Arrays.asList("",
818                                "\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
819                                "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
820                                "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" +
821                                "\u0036\u968E", "", "", "", "150-8512", ""),
822                        null, mContentValuesForQPAndSJis, new TypeSet("HOME"), null)
823                .addExpectedNodeWithOrder("NOTE", "\u30E1\u30E2", null, null,
824                        mContentValuesForQPAndSJis, null, null);
825    }
826
827    public void testV21Japanese2_Type_Generic_Utf8() {
828        mVerifier.initForImportTest(V21, R.raw.v21_japanese_2);
829        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
830        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
831                .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4")
832                .put(StructuredName.GIVEN_NAME, "\u30ED\u30A4\u30C9\u0031")
833                .put(StructuredName.DISPLAY_NAME,
834                        "\u5B89\u85E4\u0020\u30ED\u30A4\u30C9\u0020\u0031")
835                // ContactStruct should correctly split "SOUND" property into several elements,
836                // even though VCardParser side does not care it.
837                .put(StructuredName.PHONETIC_FAMILY_NAME, "\uFF71\uFF9D\uFF84\uFF9E\uFF73")
838                .put(StructuredName.PHONETIC_GIVEN_NAME, "\uFF9B\uFF72\uFF84\uFF9E\u0031");
839        elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
840                .put(StructuredPostal.POSTCODE, "150-8512")
841                .put(StructuredPostal.STREET,
842                        "\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
843                        "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
844                        "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" +
845                        "\u0036\u968E")
846                .put(StructuredPostal.FORMATTED_ADDRESS,
847                        "\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
848                        "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
849                        "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" +
850                        "\u0036\u968E 150-8512")
851                .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME);
852        elem.addExpected(Note.CONTENT_ITEM_TYPE)
853                .put(Note.NOTE, "\u30E1\u30E2");
854    }
855
856    public void testV21MultipleEntryCase_Parse() {
857        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_multiple_entry);
858        mVerifier.addPropertyNodesVerifierElem()
859                .addExpectedNodeWithOrder("VERSION", "2.1")
860                .addExpectedNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033;;;;",
861                        Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0033", "", "", "", ""),
862                        null, mContentValuesForSJis, null, null)
863                .addExpectedNodeWithOrder("SOUND",
864                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0033;;;;",
865                        null, null, mContentValuesForSJis,
866                        new TypeSet("X-IRMC-N"), null)
867                .addExpectedNodeWithOrder("TEL", "9", new TypeSet("X-NEC-SECRET"))
868                .addExpectedNodeWithOrder("TEL", "10", new TypeSet("X-NEC-HOTEL"))
869                .addExpectedNodeWithOrder("TEL", "11", new TypeSet("X-NEC-SCHOOL"))
870                .addExpectedNodeWithOrder("TEL", "12", new TypeSet("FAX", "HOME"));
871        mVerifier.addPropertyNodesVerifierElem()
872                .addExpectedNodeWithOrder("VERSION", "2.1")
873                .addExpectedNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034;;;;",
874                        Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0034", "", "", "", ""),
875                        null, mContentValuesForSJis, null, null)
876                .addExpectedNodeWithOrder("SOUND",
877                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0034;;;;",
878                        null, null, mContentValuesForSJis,
879                        new TypeSet("X-IRMC-N"), null)
880                .addExpectedNodeWithOrder("TEL", "13", new TypeSet("MODEM"))
881                .addExpectedNodeWithOrder("TEL", "14", new TypeSet("PAGER"))
882                .addExpectedNodeWithOrder("TEL", "15", new TypeSet("X-NEC-FAMILY"))
883                .addExpectedNodeWithOrder("TEL", "16", new TypeSet("X-NEC-GIRL"));
884        mVerifier.addPropertyNodesVerifierElem()
885                .addExpectedNodeWithOrder("VERSION", "2.1")
886                .addExpectedNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035;;;;",
887                        Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0035", "", "", "", ""),
888                        null, mContentValuesForSJis, null, null)
889                .addExpectedNodeWithOrder("SOUND",
890                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0035;;;;",
891                        null, null, mContentValuesForSJis,
892                        new TypeSet("X-IRMC-N"), null)
893                .addExpectedNodeWithOrder("TEL", "17", new TypeSet("X-NEC-BOY"))
894                .addExpectedNodeWithOrder("TEL", "18", new TypeSet("X-NEC-FRIEND"))
895                .addExpectedNodeWithOrder("TEL", "19", new TypeSet("X-NEC-PHS"))
896                .addExpectedNodeWithOrder("TEL", "20", new TypeSet("X-NEC-RESTAURANT"));
897    }
898
899    public void testV21MultipleEntryCase() {
900        mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_multiple_entry);
901        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
902        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
903                .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033")
904                .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033")
905                .put(StructuredName.PHONETIC_GIVEN_NAME,
906                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0033");
907        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
908                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
909                .put(Phone.LABEL, "NEC-SECRET")
910                .put(Phone.NUMBER, "9");
911        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
912                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
913                .put(Phone.LABEL, "NEC-HOTEL")
914                .put(Phone.NUMBER, "10");
915        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
916                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
917                .put(Phone.LABEL, "NEC-SCHOOL")
918                .put(Phone.NUMBER, "11");
919        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
920                .put(Phone.TYPE, Phone.TYPE_FAX_HOME)
921                .put(Phone.NUMBER, "12");
922
923        elem = mVerifier.addContentValuesVerifierElem();
924        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
925                .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034")
926                .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034")
927                .put(StructuredName.PHONETIC_GIVEN_NAME,
928                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0034");
929        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
930                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
931                .put(Phone.LABEL, "MODEM")
932                .put(Phone.NUMBER, "13");
933        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
934                .put(Phone.TYPE, Phone.TYPE_PAGER)
935                .put(Phone.NUMBER, "14");
936        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
937                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
938                .put(Phone.LABEL, "NEC-FAMILY")
939                .put(Phone.NUMBER, "15");
940        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
941                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
942                .put(Phone.LABEL, "NEC-GIRL")
943                .put(Phone.NUMBER, "16");
944
945        elem = mVerifier.addContentValuesVerifierElem();
946        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
947                .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035")
948                .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035")
949                .put(StructuredName.PHONETIC_GIVEN_NAME,
950                        "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0035");
951        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
952                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
953                .put(Phone.LABEL, "NEC-BOY")
954                .put(Phone.NUMBER, "17");
955        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
956                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
957                .put(Phone.LABEL, "NEC-FRIEND")
958                .put(Phone.NUMBER, "18");
959        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
960                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
961                .put(Phone.LABEL, "NEC-PHS")
962                .put(Phone.NUMBER, "19");
963        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
964                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
965                .put(Phone.LABEL, "NEC-RESTAURANT")
966                .put(Phone.NUMBER, "20");
967    }
968
969    public void testIgnoreAgentV21_Parse() {
970        mVerifier.initForImportTest(V21, R.raw.v21_winmo_65);
971        ContentValues contentValuesForValue = new ContentValues();
972        contentValuesForValue.put("VALUE", "DATE");
973        mVerifier.addPropertyNodesVerifierElem()
974                .addExpectedNodeWithOrder("VERSION", "2.1")
975                .addExpectedNodeWithOrder("N", Arrays.asList("Example", "", "", "", ""))
976                .addExpectedNodeWithOrder("FN", "Example")
977                .addExpectedNodeWithOrder("ANNIVERSARY", "20091010", contentValuesForValue)
978                .addExpectedNodeWithOrder("AGENT", "")
979                .addExpectedNodeWithOrder("X-CLASS", "PUBLIC")
980                .addExpectedNodeWithOrder("X-REDUCTION", "")
981                .addExpectedNodeWithOrder("X-NO", "");
982    }
983
984    public void testIgnoreAgentV21() {
985        mVerifier.initForImportTest(V21, R.raw.v21_winmo_65);
986        ContentValuesVerifier verifier = new ContentValuesVerifier();
987        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
988        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
989                .put(StructuredName.FAMILY_NAME, "Example")
990                .put(StructuredName.DISPLAY_NAME, "Example");
991        elem.addExpected(Event.CONTENT_ITEM_TYPE)
992                .put(Event.TYPE, Event.TYPE_ANNIVERSARY)
993                .put(Event.START_DATE, "20091010");
994    }
995
996    public void testTolerateInvalidCommentLikeLineV21() {
997        mVerifier.initForImportTest(V21, R.raw.v21_invalid_comment_line);
998        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
999        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
1000                .put(StructuredName.GIVEN_NAME, "Conference Call")
1001                .put(StructuredName.DISPLAY_NAME, "Conference Call");
1002        elem.addExpected(Note.CONTENT_ITEM_TYPE)
1003                .put(Note.NOTE, "This is an (sharp ->#<- sharp) example. "
1004                        + "This message must NOT be ignored.");
1005    }
1006
1007    public void testPagerV30_Parse() {
1008        mVerifier.initForImportTest(V30, R.raw.v30_pager);
1009        mVerifier.addPropertyNodesVerifierElem()
1010                .addExpectedNodeWithOrder("VERSION", "3.0")
1011                .addExpectedNodeWithOrder("N", Arrays.asList("F", "G", "M", "", ""))
1012                .addExpectedNodeWithOrder("TEL", "6101231234@pagersample.com",
1013                        new TypeSet("WORK", "MSG", "PAGER"));
1014    }
1015
1016    public void testPagerV30() {
1017        mVerifier.initForImportTest(V30, R.raw.v30_pager);
1018        ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
1019        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
1020                .put(StructuredName.FAMILY_NAME, "F")
1021                .put(StructuredName.MIDDLE_NAME, "M")
1022                .put(StructuredName.GIVEN_NAME, "G")
1023                .put(StructuredName.DISPLAY_NAME, "G M F");
1024        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
1025                .put(Phone.TYPE, Phone.TYPE_PAGER)
1026                .put(Phone.NUMBER, "6101231234@pagersample.com");
1027    }
1028
1029    public void testMultiBytePropV30_Parse() {
1030        mVerifier.initForImportTest(V30, R.raw.v30_multibyte_param);
1031        mVerifier.addPropertyNodesVerifierElem()
1032                .addExpectedNodeWithOrder("VERSION", "3.0")
1033                .addExpectedNodeWithOrder("N", Arrays.asList("F", "G", "M", "", ""))
1034                .addExpectedNodeWithOrder("TEL", "1", new TypeSet("\u8D39"));
1035    }
1036
1037    public void testMultiBytePropV30() {
1038        mVerifier.initForImportTest(V30, R.raw.v30_multibyte_param);
1039        final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
1040        elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
1041                .put(StructuredName.FAMILY_NAME, "F")
1042                .put(StructuredName.MIDDLE_NAME, "M")
1043                .put(StructuredName.GIVEN_NAME, "G")
1044                .put(StructuredName.DISPLAY_NAME, "G M F");
1045        elem.addExpected(Phone.CONTENT_ITEM_TYPE)
1046                .put(Phone.TYPE, Phone.TYPE_CUSTOM)
1047                .put(Phone.LABEL, "\u8D39")
1048                .put(Phone.NUMBER, "1");
1049    }
1050
1051    public void testCommaSeparatedParamsV30_Parse() {
1052        mVerifier.initForImportTest(V30, R.raw.v30_comma_separated);
1053        mVerifier.addPropertyNodesVerifierElem()
1054                .addExpectedNodeWithOrder("VERSION", "3.0")
1055                .addExpectedNodeWithOrder("N", Arrays.asList("F", "G", "M", "", ""),
1056                        new TypeSet("PREF", "HOME"))
1057                .addExpectedNodeWithOrder("TEL", "1",
1058                        new TypeSet("COMMA,SEPARATED", "PREF"));
1059    }
1060}
1061