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