Home | History | Annotate | Download | only in tests
      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  */
     16 package com.android.vcard.tests;
     17 
     18 import com.android.vcard.VCardConfig;
     19 import com.android.vcard.tests.testutils.ContentValuesVerifier;
     20 import com.android.vcard.tests.testutils.ContentValuesVerifierElem;
     21 import com.android.vcard.tests.testutils.PropertyNodesVerifierElem.TypeSet;
     22 import com.android.vcard.tests.testutils.VCardTestsBase;
     23 
     24 import android.content.ContentValues;
     25 import android.provider.ContactsContract.CommonDataKinds.Email;
     26 import android.provider.ContactsContract.CommonDataKinds.Event;
     27 import android.provider.ContactsContract.CommonDataKinds.Im;
     28 import android.provider.ContactsContract.CommonDataKinds.Nickname;
     29 import android.provider.ContactsContract.CommonDataKinds.Note;
     30 import android.provider.ContactsContract.CommonDataKinds.Organization;
     31 import android.provider.ContactsContract.CommonDataKinds.Phone;
     32 import android.provider.ContactsContract.CommonDataKinds.Photo;
     33 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
     34 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
     35 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
     36 import android.provider.ContactsContract.CommonDataKinds.Website;
     37 import android.provider.ContactsContract.Data;
     38 
     39 import java.util.Arrays;
     40 
     41 public class VCardImporterTests extends VCardTestsBase {
     42     // Push data into int array at first since values like 0x80 are
     43     // interpreted as int by the compiler and casting all of them is
     44     // cumbersome...
     45     private static final int[] sPhotoIntArrayForComplicatedCase = {
     46         0xff, 0xd8, 0xff, 0xe1, 0x0a, 0x0f, 0x45, 0x78, 0x69, 0x66, 0x00,
     47         0x00, 0x4d, 0x4d, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0d,
     48         0x01, 0x0e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
     49         0xaa, 0x01, 0x0f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
     50         0x00, 0xba, 0x01, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00,
     51         0x00, 0x00, 0xc2, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
     52         0x00, 0x01, 0x00, 0x00, 0x01, 0x1a, 0x00, 0x05, 0x00, 0x00, 0x00,
     53         0x01, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x1b, 0x00, 0x05, 0x00, 0x00,
     54         0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x28, 0x00, 0x03, 0x00,
     55         0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x01, 0x31, 0x00, 0x02,
     56         0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xd8, 0x01, 0x32, 0x00,
     57         0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xe6, 0x02, 0x13,
     58         0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82,
     59         0x98, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xfa,
     60         0x87, 0x69, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
     61         0x84, 0xc4, 0xa5, 0x00, 0x07, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00,
     62         0x01, 0x08, 0x00, 0x00, 0x04, 0x1e, 0x32, 0x30, 0x30, 0x38, 0x31,
     63         0x30, 0x32, 0x39, 0x31, 0x33, 0x35, 0x35, 0x33, 0x31, 0x00, 0x00,
     64         0x44, 0x6f, 0x43, 0x6f, 0x4d, 0x6f, 0x00, 0x00, 0x44, 0x39, 0x30,
     65         0x35, 0x69, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01,
     66         0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x44, 0x39, 0x30,
     67         0x35, 0x69, 0x20, 0x56, 0x65, 0x72, 0x31, 0x2e, 0x30, 0x30, 0x00,
     68         0x32, 0x30, 0x30, 0x38, 0x3a, 0x31, 0x30, 0x3a, 0x32, 0x39, 0x20,
     69         0x31, 0x33, 0x3a, 0x35, 0x35, 0x3a, 0x34, 0x37, 0x00, 0x20, 0x20,
     70         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
     71         0x00, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x49, 0x4d, 0x00, 0x30, 0x33,
     72         0x30, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x14, 0x00,
     73         0x14, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
     74         0x00, 0x34, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
     75         0x00, 0x00, 0x00, 0x01, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
     76         0x11, 0x09, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x0f, 0x0b, 0x00,
     77         0x00, 0x27, 0x10, 0x00, 0x00, 0x05, 0x97, 0x00, 0x00, 0x27, 0x10,
     78         0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x1c,
     79         0x01, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x02, 0x5e, 0x00, 0x00,
     80         0x27, 0x10, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x27, 0x10, 0x00,
     81         0x00, 0x03, 0xcb, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x1b, 0xe5,
     82         0x00, 0x00, 0x27, 0x10, 0x00, 0x28, 0x82, 0x9a, 0x00, 0x05, 0x00,
     83         0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x6a, 0x82, 0x9d, 0x00, 0x05,
     84         0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x72, 0x88, 0x22, 0x00,
     85         0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x90, 0x00,
     86         0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x30, 0x32, 0x32, 0x30, 0x90,
     87         0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x03, 0x7a,
     88         0x90, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x03,
     89         0x8e, 0x91, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x01, 0x02,
     90         0x03, 0x00, 0x91, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,
     91         0x00, 0x03, 0xa2, 0x92, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01,
     92         0x00, 0x00, 0x03, 0xaa, 0x92, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
     93         0x01, 0x00, 0x00, 0x03, 0xb2, 0x92, 0x04, 0x00, 0x0a, 0x00, 0x00,
     94         0x00, 0x01, 0x00, 0x00, 0x03, 0xba, 0x92, 0x05, 0x00, 0x05, 0x00,
     95         0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xc2, 0x92, 0x07, 0x00, 0x03,
     96         0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x92, 0x08, 0x00,
     97         0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x92, 0x09,
     98         0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x92,
     99         0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xca,
    100         0x92, 0x7c, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    101         0x00, 0x92, 0x86, 0x00, 0x07, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
    102         0x03, 0xd2, 0xa0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x30,
    103         0x31, 0x30, 0x30, 0xa0, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
    104         0x00, 0x01, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00,
    105         0x01, 0x00, 0x60, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x03, 0x00, 0x00,
    106         0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x04, 0x00,
    107         0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0xa2, 0x0e, 0x00, 0x05,
    108         0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xe8, 0xa2, 0x0f, 0x00,
    109         0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xf0, 0xa2, 0x10,
    110         0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0xa2,
    111         0x17, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00,
    112         0xa3, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00,
    113         0x00, 0xa3, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
    114         0x00, 0x00, 0xa4, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00,
    115         0x00, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
    116         0x00, 0x00, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
    117         0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x05, 0x00, 0x00,
    118         0x00, 0x01, 0x00, 0x00, 0x03, 0xf8, 0xa4, 0x05, 0x00, 0x03, 0x00,
    119         0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x03,
    120         0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x07, 0x00,
    121         0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x08,
    122         0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4,
    123         0x09, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
    124         0xa4, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    125         0x00, 0xa4, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
    126         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00,
    127         0x00, 0x27, 0x10, 0x00, 0x00, 0x01, 0x5e, 0x00, 0x00, 0x00, 0x64,
    128         0x32, 0x30, 0x30, 0x38, 0x3a, 0x31, 0x30, 0x3a, 0x32, 0x39, 0x20,
    129         0x31, 0x33, 0x3a, 0x35, 0x35, 0x3a, 0x33, 0x31, 0x00, 0x32, 0x30,
    130         0x30, 0x38, 0x3a, 0x31, 0x30, 0x3a, 0x32, 0x39, 0x20, 0x31, 0x33,
    131         0x3a, 0x35, 0x35, 0x3a, 0x34, 0x37, 0x00, 0x00, 0x00, 0x29, 0x88,
    132         0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x02, 0xb2, 0x00, 0x00, 0x00,
    133         0x64, 0x00, 0x00, 0x01, 0x5e, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00,
    134         0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x25, 0x00,
    135         0x00, 0x00, 0x0a, 0x00, 0x00, 0x0e, 0x92, 0x00, 0x00, 0x03, 0xe8,
    136         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x30, 0x30,
    137         0x38, 0x31, 0x30, 0x32, 0x39, 0x31, 0x33, 0x35, 0x35, 0x33, 0x31,
    138         0x00, 0x00, 0x20, 0x2a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x2a,
    139         0xe2, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    140         0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
    141         0x04, 0x52, 0x39, 0x38, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
    142         0x00, 0x04, 0x30, 0x31, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
    143         0x06, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06,
    144         0x00, 0x00, 0x01, 0x1a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,
    145         0x00, 0x04, 0x6c, 0x01, 0x1b, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01,
    146         0x00, 0x00, 0x04, 0x74, 0x01, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00,
    147         0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00,
    148         0x00, 0x01, 0x00, 0x00, 0x04, 0x7c, 0x02, 0x02, 0x00, 0x04, 0x00,
    149         0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x8b, 0x00, 0x00, 0x00, 0x00,
    150         0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    151         0x48, 0x00, 0x00, 0x00, 0x01, 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84,
    152         0x00, 0x20, 0x16, 0x18, 0x1c, 0x18, 0x14, 0x20, 0x1c, 0x1a, 0x1c,
    153         0x24, 0x22, 0x20, 0x26, 0x30, 0x50, 0x34, 0x30, 0x2c, 0x2c, 0x30,
    154         0x62, 0x46, 0x4a, 0x3a, 0x50, 0x74, 0x66, 0x7a, 0x78, 0x72, 0x66,
    155         0x70, 0x6e, 0x80, 0x90, 0xb8, 0x9c, 0x80, 0x88, 0xae, 0x8a, 0x6e,
    156         0x70, 0xa0, 0xda, 0xa2, 0xae, 0xbe, 0xc4, 0xce, 0xd0, 0xce, 0x7c,
    157         0x9a, 0xe2, 0xf2, 0xe0, 0xc8, 0xf0, 0xb8, 0xca, 0xce, 0xc6, 0x01,
    158         0x22, 0x24, 0x24, 0x30, 0x2a, 0x30, 0x5e, 0x34, 0x34, 0x5e, 0xc6,
    159         0x84, 0x70, 0x84, 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, 0xc6, 0xc6,
    162         0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
    163         0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xff, 0xc0,
    164         0x00, 0x11, 0x08, 0x00, 0x78, 0x00, 0xa0, 0x03, 0x01, 0x21, 0x00,
    165         0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x01, 0xa2, 0x00,
    166         0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
    167         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
    168         0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03,
    169         0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01,
    170         0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31,
    171         0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81,
    172         0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
    173         0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19,
    174         0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37,
    175         0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
    176         0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65,
    177         0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
    178         0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92,
    179         0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
    180         0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
    181         0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
    182         0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
    183         0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1,
    184         0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x01, 0x00,
    185         0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    186         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
    187         0x07, 0x08, 0x09, 0x0a, 0x0b, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04,
    188         0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77,
    189         0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12,
    190         0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14,
    191         0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15,
    192         0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17,
    193         0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37,
    194         0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
    195         0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65,
    196         0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
    197         0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a,
    198         0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3,
    199         0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5,
    200         0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
    201         0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
    202         0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2,
    203         0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x00,
    204         0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00,
    205         0x14, 0x54, 0xaa, 0x2a, 0x46, 0x48, 0xa2, 0xa4, 0x55, 0xa6, 0x04,
    206         0x8a, 0x29, 0xe0, 0x53, 0x10, 0xe0, 0x29, 0xc0, 0x50, 0x03, 0xb1,
    207         0x46, 0x29, 0x80, 0x84, 0x52, 0x11, 0x40, 0x0d, 0x22, 0x9a, 0x45,
    208         0x20, 0x23, 0x61, 0x51, 0x30, 0xa0, 0x08, 0xc8, 0xa8, 0xd8, 0x52,
    209         0x02, 0x26, 0x15, 0x0b, 0x0a, 0x00, 0xb4, 0xa2, 0xa5, 0x5a, 0x00,
    210         0x91, 0x45, 0x4a, 0xa2, 0x81, 0x92, 0x01, 0x4e, 0x02, 0x98, 0x87,
    211         0x0a, 0x70, 0xa0, 0x07, 0x62, 0x8c, 0x50, 0x21, 0x0d, 0x25, 0x00,
    212         0x34, 0x8a, 0x61, 0x14, 0x0c, 0x63, 0x0a, 0x89, 0x85, 0x00, 0x46,
    213         0xd5, 0x1b, 0x52, 0x02, 0x16, 0xa8, 0x98, 0x50, 0x05, 0x94, 0xa9,
    214         0x16, 0x80, 0x25, 0x5a, 0x95, 0x68, 0x18, 0xf1, 0x4f, 0x14, 0xc4,
    215         0x3b, 0xb5, 0x22, 0xb6, 0x38, 0x34, 0x00, 0xe3, 0x22, 0x8e, 0xf4,
    216         0x79, 0x8a, 0x7b, 0xd1, 0x71, 0x03, 0x30, 0xc7, 0x14, 0x83, 0xa5,
    217         0x00, 0x06, 0x98, 0x68, 0x01, 0x8d, 0x51, 0x35, 0x03, 0x22, 0x6a,
    218         0x8d, 0xa9, 0x01, 0x13, 0x54, 0x4d, 0x40, 0x13, 0xa5, 0x4a, 0x28,
    219         0x02, 0x45, 0x35, 0x2a, 0x9a, 0x00, 0x78, 0x34, 0xf0, 0x69, 0x80,
    220         0x34, 0x81, 0x45, 0x40, 0xce, 0x58, 0xe6, 0xa2, 0x4c, 0x06, 0xe4,
    221         0xfa, 0xd1, 0x93, 0x50, 0x21, 0xca, 0xe4, 0x55, 0x84, 0x90, 0x30,
    222         0xab, 0x8b, 0x18, 0xa6, 0x9a, 0x6a, 0xc4, 0x31, 0xaa, 0x26, 0xa0,
    223         0x64, 0x4d, 0x51, 0xb5, 0x20, 0x23, 0x6a, 0x89, 0xa8, 0x02, 0x44,
    224         0x35, 0x2a, 0x9a, 0x00, 0x95, 0x4d, 0x48, 0xa6, 0x80, 0x24, 0x53,
    225         0x4e, 0xce, 0x05, 0x30, 0x2b, 0x3b, 0xee, 0x6a, 0x91, 0x5d, 0x76,
    226         0x63, 0xbd, 0x65, 0x7d, 0x40, 0x66, 0x68, 0xa9, 0x02, 0x45, 0x2b,
    227         0xb3, 0x9e, 0xb4, 0xc5, 0x6d, 0xad, 0x9a, 0xa0, 0x2c, 0x06, 0xc8,
    228         0xcd, 0x04, 0xd6, 0xa2, 0x23, 0x63, 0x51, 0xb1, 0xa0, 0x64, 0x4d,
    229         0x51, 0x93, 0x48, 0x08, 0xda, 0xa2, 0x6a, 0x00, 0x72, 0x1a, 0x99,
    230         0x4d, 0x00, 0x48, 0xa6, 0xa4, 0x53, 0x4c, 0x07, 0x86, 0x03, 0xbd,
    231         0x2b, 0x9c, 0xa7, 0x14, 0x98, 0x10, 0x85, 0x34, 0xe0, 0xa6, 0xb3,
    232         0xb0, 0x0b, 0xb5, 0xa8, 0x0a, 0xd4, 0x58, 0x42, 0xed, 0x3e, 0x94,
    233         0xd2, 0xa6, 0x8b, 0x01, 0x34, 0x44, 0xed, 0xe6, 0x9c, 0x4d, 0x6a,
    234         0x80, 0x8d, 0x8d, 0x46, 0xc6, 0x80, 0x23, 0x63, 0x51, 0x9a, 0x06,
    235         0x46, 0xd5, 0x13, 0x52, 0x01, 0x54, 0xd4, 0xaa, 0x68, 0x02, 0x40,
    236         0x6a, 0x40, 0x78, 0xa0, 0x08, 0x59, 0xce, 0xee, 0xb5, 0x2a, 0x39,
    237         0xd9, 0x59, 0xa7, 0xa8, 0x00, 0x73, 0xeb, 0x4e, 0x0e, 0x7d, 0x69,
    238         0x5c, 0x05, 0xf3, 0x0f, 0xad, 0x1e, 0x61, 0xf5, 0xa7, 0x71, 0x0b,
    239         0xe6, 0x35, 0x21, 0x90, 0xd3, 0xb8, 0x0e, 0x32, 0x10, 0x95, 0x10,
    240         0x91, 0xb3, 0xd6, 0x9b, 0x60, 0x4b, 0x9c, 0x8a, 0x63, 0x1a, 0xb0,
    241         0x18, 0x4d, 0x46, 0xc6, 0x80, 0x22, 0x6a, 0x61, 0xa4, 0x31, 0xaa,
    242         0x6a, 0x55, 0x34, 0x01, 0x2a, 0x9a, 0x7e, 0x78, 0xa0, 0x08, 0x09,
    243         0xf9, 0xaa, 0x58, 0xcf, 0xca, 0x6b, 0x3e, 0xa0, 0x00, 0xd3, 0x81,
    244         0xa9, 0x01, 0x73, 0x46, 0x69, 0x80, 0xb9, 0xa4, 0xcd, 0x00, 0x2b,
    245         0x1f, 0x92, 0xa3, 0x07, 0x9a, 0x6f, 0x70, 0x26, 0xcf, 0x14, 0xd2,
    246         0x6b, 0x51, 0x0c, 0x63, 0x51, 0xb1, 0xa0, 0x08, 0xda, 0x98, 0x69,
    247         0x0c, 0x8d, 0x4d, 0x4a, 0xa6, 0x80, 0x24, 0x53, 0x52, 0x03, 0xc5,
    248         0x02, 0x21, 0x27, 0xe6, 0xa9, 0x23, 0x3f, 0x29, 0xac, 0xfa, 0x8c,
    249         0x01, 0xe6, 0x9c, 0x0d, 0x48, 0x0a, 0x0d, 0x2e, 0x68, 0x01, 0x73,
    250         0x49, 0x9a, 0x60, 0x2b, 0x1f, 0x92, 0x98, 0x3a, 0xd3, 0x7b, 0x81,
    251         0x36, 0x78, 0xa6, 0x93, 0x5a, 0x88, 0x8c, 0x9a, 0x63, 0x1a, 0x00,
    252         0x8c, 0xd3, 0x0d, 0x21, 0x91, 0x29, 0xa9, 0x14, 0xd0, 0x04, 0x8a,
    253         0x69, 0xe0, 0xd3, 0x11, 0x1b, 0x1e, 0x6a, 0x48, 0xcf, 0xca, 0x6b,
    254         0x3e, 0xa3, 0x10, 0x1a, 0x70, 0x35, 0x20, 0x38, 0x1a, 0x5c, 0xd2,
    255         0x01, 0x73, 0x49, 0x9a, 0x60, 0x39, 0x8f, 0xca, 0x29, 0x8b, 0xf7,
    256         0xaa, 0xba, 0x88, 0x96, 0x9a, 0x6b, 0x40, 0x18, 0xc6, 0xa3, 0x26,
    257         0x80, 0x18, 0x69, 0xa6, 0x90, 0xc8, 0x14, 0xd4, 0x8a, 0x69, 0x80,
    258         0xf0, 0x6a, 0x40, 0x68, 0x10, 0xbb, 0x41, 0xa7, 0xe3, 0x0b, 0xc5,
    259         0x2b, 0x01, 0x10, 0xa7, 0x03, 0x59, 0x0c, 0x76, 0x69, 0x73, 0x40,
    260         0x0b, 0x9a, 0x28, 0x11, 0x28, 0x19, 0x5e, 0x69, 0x02, 0x81, 0x5a,
    261         0xd8, 0x00, 0xd3, 0x4d, 0x50, 0x0c, 0x6a, 0x8c, 0xd2, 0x01, 0xa6,
    262         0x98, 0x69, 0x0c, 0xae, 0xa6, 0xa4, 0x06, 0x80, 0x1e, 0xa6, 0x9e,
    263         0x0d, 0x31, 0x12, 0x03, 0x4f, 0x06, 0x80, 0x13, 0x60, 0x34, 0xd3,
    264         0xc1, 0xa8, 0x92, 0x01, 0xf1, 0x8d, 0xdd, 0x69, 0xcc, 0xa1, 0x69,
    265         0x5b, 0x4b, 0x80, 0x83, 0x93, 0x52, 0x04, 0x14, 0xe2, 0xae, 0x03,
    266         0xa9, 0x0d, 0x68, 0x03, 0x4d, 0x34, 0xd0, 0x03, 0x0d, 0x30, 0xd2,
    267         0x01, 0x86, 0x9a, 0x68, 0x19, 0x58, 0x1a, 0x78, 0xa4, 0x04, 0x8a,
    268         0x69, 0xe0, 0xd3, 0x10, 0xe0, 0x69, 0xe0, 0xd0, 0x03, 0xc1, 0xa8,
    269         0xdb, 0xad, 0x4c, 0x81, 0x12, 0x45, 0xd6, 0x9d, 0x25, 0x1d, 0x00,
    270         0x6a, 0xf5, 0xa9, 0xe8, 0x80, 0x31, 0x29, 0x0d, 0x58, 0x08, 0x69,
    271         0x86, 0x80, 0x1a, 0x69, 0x86, 0x90, 0x0c, 0x34, 0xd3, 0x48, 0x65,
    272         0x51, 0x4f, 0x06, 0x98, 0x0f, 0x14, 0xf0, 0x68, 0x10, 0xf0, 0x69,
    273         0xe0, 0xd0, 0x03, 0x81, 0xa5, 0x2b, 0x9a, 0x1a, 0xb8, 0x87, 0xa8,
    274         0xdb, 0x4a, 0x46, 0x68, 0xb6, 0x80, 0x2a, 0xa8, 0x14, 0xea, 0x12,
    275         0xb0, 0x05, 0x21, 0xa6, 0x02, 0x1a, 0x61, 0xa0, 0x06, 0x9a, 0x61,
    276         0xa4, 0x31, 0x86, 0x9a, 0x69, 0x0c, 0xa8, 0x0d, 0x3c, 0x53, 0x01,
    277         0xe2, 0x9e, 0x28, 0x10, 0xf1, 0x4e, 0x06, 0x98, 0x0f, 0x06, 0x9e,
    278         0x0d, 0x02, 0x1c, 0x29, 0xc2, 0x80, 0x16, 0x96, 0x80, 0x0a, 0x4a,
    279         0x00, 0x43, 0x4d, 0x34, 0x0c, 0x61, 0xa6, 0x1a, 0x40, 0x34, 0xd3,
    280         0x4d, 0x21, 0x80, 0xff, 0xd9, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0a,
    281         0x07, 0x07, 0x08, 0x07, 0x06, 0x0a, 0x08, 0x08, 0x08, 0x0b, 0x0a,
    282         0x0a, 0x0b, 0x0e, 0x18, 0x10, 0x0e, 0x0d, 0x0d, 0x0e, 0x1d, 0x15,
    283         0x16, 0x11, 0x18, 0x23, 0x1f, 0x25, 0x24, 0x22, 0x1f, 0x22, 0x21,
    284         0x26, 0x2b, 0x37, 0x2f, 0x26, 0x29, 0x34, 0x29, 0x21, 0x22, 0x30,
    285         0x41, 0x31, 0x34, 0x39, 0x3b, 0x3e, 0x3e, 0x3e, 0x25, 0x2e, 0x44,
    286         0x49, 0x43, 0x3c, 0x48, 0x37, 0x3d, 0x3e, 0x3b, 0x01, 0x0a, 0x0b,
    287         0x0b, 0x0e, 0x0d, 0x0e, 0x1c, 0x10, 0x10, 0x1c, 0x3b, 0x28, 0x22,
    288         0x28, 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, 0x3b, 0x3b, 0x3b, 0x3b,
    291         0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
    292         0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xff, 0xc0, 0x00, 0x11,
    293         0x08, 0x00, 0x48, 0x00, 0x60, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11,
    294         0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x01, 0xa2, 0x00, 0x00, 0x01,
    295         0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
    296         0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    297         0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
    298         0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01,
    299         0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
    300         0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1,
    301         0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33,
    302         0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
    303         0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
    304         0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54,
    305         0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67,
    306         0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
    307         0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94,
    308         0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
    309         0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8,
    310         0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
    311         0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
    312         0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
    313         0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x01, 0x00, 0x03, 0x01,
    314         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
    315         0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
    316         0x09, 0x0a, 0x0b, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03,
    317         0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01,
    318         0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51,
    319         0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
    320         0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72,
    321         0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19,
    322         0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39,
    323         0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54,
    324         0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67,
    325         0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
    326         0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93,
    327         0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
    328         0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
    329         0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
    330         0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2,
    331         0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
    332         0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03,
    333         0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x9e, 0xd2,
    334         0x2e, 0x07, 0x15, 0xaf, 0x6d, 0x08, 0xe2, 0xb3, 0x45, 0x1a, 0xf6,
    335         0xd0, 0x00, 0x01, 0xc5, 0x68, 0x45, 0x17, 0x4a, 0xb4, 0x22, 0xe4,
    336         0x70, 0x8c, 0x74, 0xa9, 0x3c, 0xa1, 0x8e, 0x95, 0x48, 0x96, 0x31,
    337         0xe2, 0x18, 0xe9, 0x55, 0xa5, 0x8c, 0x7a, 0x50, 0x05, 0x0b, 0x88,
    338         0x86, 0x0f, 0x15, 0x8f, 0x75, 0x1f, 0x26, 0x93, 0x19, 0x91, 0x77,
    339         0x18, 0xc1, 0xac, 0x4b, 0xc8, 0xfa, 0xd6, 0x63, 0x37, 0x6d, 0x31,
    340         0xb4, 0x73, 0x5b, 0x36, 0xa0, 0x1c, 0x50, 0x80, 0xd7, 0x83, 0xa0,
    341         0xab, 0xd1, 0x62, 0xad, 0x09, 0x8f, 0x17, 0x29, 0x03, 0xb2, 0xcc,
    342         0xe0, 0x77, 0x14, 0xa3, 0x56, 0xb3, 0x27, 0x1e, 0x67, 0xe9, 0x52,
    343         0xea, 0xc6, 0x3a, 0x36, 0x48, 0xef, 0x3d, 0x27, 0x70, 0x22, 0x60,
    344         0x47, 0x52, 0x69, 0xb2, 0xe2, 0xad, 0x3b, 0xea, 0x80, 0xa3, 0x38,
    345         0xe0, 0xd6, 0x3d, 0xd8, 0x1c, 0xd0, 0xca, 0x46, 0x3d, 0xd0, 0x18,
    346         0x35, 0x89, 0x78, 0xa3, 0x9a, 0xcd, 0x8c, 0xd2, 0xb3, 0x93, 0x2a,
    347         0x2b, 0x66, 0xd5, 0xf1, 0x8a, 0x10, 0x1a, 0xd6, 0xf2, 0x03, 0x8a,
    348         0x9e, 0xe6, 0xf4, 0x5a, 0xdb, 0xef, 0xfe, 0x23, 0xc0, 0xa7, 0x27,
    349         0xcb, 0x16, 0xc4, 0xcc, 0xdd, 0xe2, 0x78, 0x9a, 0x69, 0x66, 0xcc,
    350         0x99, 0xe1, 0x4d, 0x47, 0xba, 0xbc, 0xd9, 0x6a, 0xee, 0x26, 0x59,
    351         0x59, 0x4d, 0xac, 0x69, 0x34, 0x52, 0xe5, 0x8f, 0x55, 0xad, 0x58,
    352         0xae, 0x85, 0xc4, 0x22, 0x41, 0xdf, 0xad, 0x76, 0x61, 0xe5, 0x6f,
    353         0x74, 0x45, 0x69, 0xdc, 0x00, 0x79, 0xac, 0x8b, 0xa6, 0xc9, 0x35,
    354         0xd4, 0x34, 0x64, 0xdc, 0x37, 0x06, 0xb1, 0xae, 0x88, 0xc1, 0xac,
    355         0xd8, 0xc9, 0x2c, 0xa6, 0xe0, 0x73, 0x5b, 0x36, 0xf3, 0x74, 0xe6,
    356         0x84, 0x05, 0xe3, 0xa9, 0x47, 0x6a, 0x14, 0xb6, 0x49, 0x3d, 0x85,
    357         0x3a, 0xee, 0xee, 0x2b, 0xa8, 0xe2, 0x6f, 0x30, 0x81, 0xe9, 0x8a,
    358         0xca, 0xa4, 0xe2, 0xd3, 0x8b, 0x01, 0xb1, 0xf9, 0x04, 0x7f, 0xaf,
    359         0x23, 0xf0, 0xa9, 0x54, 0x41, 0x9c, 0xfd, 0xa3, 0xf4, 0xae, 0x65,
    360         0x18, 0xf7, 0x25, 0x8a, 0xe2, 0x02, 0x38, 0xb8, 0xfd, 0x2a, 0x7b,
    361         0x5b, 0xa8, 0x6d, 0x6d, 0x5d, 0x9a, 0x5d, 0xcb, 0xbb, 0xd2, 0xb6,
    362         0xa6, 0xa3, 0x19, 0x5e, 0xe2, 0x03, 0x7b, 0x1d, 0xc2, 0x17, 0x8d,
    363         0xb8, 0xac, 0xfb, 0x89, 0x39, 0x35, 0xd6, 0x9a, 0x6a, 0xe8, 0x66,
    364         0x55, 0xcb, 0xf5, 0xac, 0x7b, 0x96, 0xeb, 0x50, 0xc6, 0x88, 0x6d,
    365         0x66, 0xe9, 0xcd, 0x6c, 0xdb, 0x4f, 0xd3, 0x9a, 0x00, 0x2f, 0xe6,
    366         0xf9, 0xa3, 0xe7, 0xb5, 0x4a, 0x93, 0x7f, 0xa2, 0xc6, 0x73, 0xdc,
    367         0xd7, 0x15, 0x55, 0xef, 0x48, 0x7d, 0x09, 0x52, 0x6e, 0x3a, 0xd4,
    368         0xab, 0x2f, 0xbd, 0x61, 0x16, 0x0c, 0x73, 0x49, 0xc5, 0x24, 0x92,
    369         0x7f, 0xa2, 0x63, 0xfd, 0xaa, 0xd6, 0x2f, 0x71, 0x0e, 0xb1, 0x93,
    370         0xf7, 0x2d, 0xf5, 0xa4, 0x9e, 0x4e, 0xb5, 0xdd, 0x4b, 0xf8, 0x68,
    371         0x4c, 0xcb, 0xb9, 0x93, 0xad, 0x65, 0xce, 0xd9, 0x26, 0xa9, 0x8d,
    372         0x19, 0xf6, 0xf2, 0xf4, 0xe6, 0xb5, 0xad, 0xe7, 0xc6, 0x39, 0xa0,
    373         0x18, 0xeb, 0xc9, 0x77, 0x6c, 0x35, 0x2a, 0x4b, 0xfe, 0x8a, 0x9c,
    374         0xff, 0x00, 0x11, 0xae, 0x3a, 0x8b, 0xde, 0x61, 0xd0, 0x9e, 0x39,
    375         0xb8, 0xeb, 0x53, 0xac, 0xb9, 0xae, 0x5b, 0x00, 0xf3, 0x27, 0x14,
    376         0x92, 0xc9, 0xfe, 0x8a, 0x3f, 0xde, 0x35, 0xac, 0x3a, 0x88, 0x92,
    377         0xcd, 0xb1, 0x6e, 0x7d, 0xcd, 0x32, 0x67, 0xeb, 0xcd, 0x7a, 0x14,
    378         0xfe, 0x04, 0x26, 0x66, 0xce, 0xf9, 0x26, 0xb3, 0xe6, 0x6e, 0xb4,
    379         0xd9, 0x48, 0xc8, 0x82, 0x4e, 0x07, 0x35, 0xa7, 0x6f, 0x2f, 0x02,
    380         0x9a, 0x06, 0x5f, 0x8c, 0xa4, 0x83, 0x0e, 0x32, 0x2a, 0x69, 0xe3,
    381         0xdd, 0x12, 0x08, 0x97, 0x85, 0xec, 0x2a, 0x2a, 0x42, 0xf1, 0x76,
    382         0x26, 0xe4, 0x6a, 0x59, 0x0e, 0x18, 0x10, 0x6a, 0xd2, 0x89, 0x02,
    383         0x6e, 0x2a, 0x71, 0xeb, 0x5c, 0x1c, 0x8c, 0xa6, 0x48, 0xbb, 0xdc,
    384         0x61, 0x41, 0x35, 0x72, 0x28, 0x87, 0xd9, 0xf6, 0x4a, 0xb9, 0xe7,
    385         0x38, 0xae, 0x8c, 0x3d, 0x36, 0xdd, 0xde, 0xc4, 0xb0, 0x21, 0x51,
    386         0x76, 0xa8, 0xc0, 0xaa, 0x93, 0x31, 0xe6, 0xbb, 0x2d, 0x65, 0x61,
    387         0x19, 0xd3, 0x1e, 0xb5, 0x46, 0x5a, 0x96, 0x5a, 0x30, 0xa0, 0x7e,
    388         0x05, 0x69, 0x5b, 0xc9, 0xc6, 0x28, 0x40, 0xcd, 0x08, 0x64, 0x3c,
    389         0x73, 0x57, 0xe1, 0x94, 0xf1, 0xcd, 0x5a, 0x21, 0x8c, 0xb9, 0x63,
    390         0xe7, 0x67, 0x1d, 0xab, 0x40, 0xb1, 0xfb, 0x00, 0x1d, 0xf0, 0x2b,
    391         0x99, 0x2d, 0x66, 0x3e, 0x88, 0x75, 0x81, 0x3f, 0x31, 0xf6, 0xab,
    392         0x64, 0xd6, 0xb4, 0x17, 0xee, 0xd0, 0x9e, 0xe4, 0x32, 0x1a, 0xa7,
    393         0x31, 0xad, 0x18, 0x14, 0x26, 0xef, 0x54, 0xa5, 0xa8, 0x65, 0xa3,
    394         0x9c, 0x81, 0xfa, 0x56, 0x8c, 0x2d, 0xce, 0x68, 0x40, 0xcb, 0xf1,
    395         0x37, 0xbd, 0x5e, 0x85, 0xea, 0xd1, 0x0c, 0xbb, 0x19, 0x56, 0x23,
    396         0x20, 0x1f, 0xad, 0x5c, 0x42, 0x08, 0x03, 0xb5, 0x55, 0x91, 0x04,
    397         0xc9, 0x80, 0x38, 0x00, 0x0a, 0x71, 0x34, 0x6c, 0x32, 0x27, 0xe9,
    398         0x55, 0x25, 0x15, 0x2c, 0x68, 0xa3, 0x30, 0xeb, 0x54, 0xa5, 0x15,
    399         0x0c, 0xd1, 0x00, 0xff, 0xd9};
    400 
    401     /* package */ static final byte[] sPhotoByteArrayForComplicatedCase;
    402 
    403     static {
    404         final int length = sPhotoIntArrayForComplicatedCase.length;
    405         sPhotoByteArrayForComplicatedCase = new byte[length];
    406         for (int i = 0; i < length; i++) {
    407             sPhotoByteArrayForComplicatedCase[i] = (byte)sPhotoIntArrayForComplicatedCase[i];
    408         }
    409     }
    410 
    411     public void testV21SimpleCase1_Parsing() {
    412         mVerifier.initForImportTest(V21, R.raw.v21_simple_1);
    413         mVerifier.addPropertyNodesVerifierElemWithoutVersion()  // no "VERSION:2.1" line.
    414                 .addExpectedNodeWithOrder("N", "Ando;Roid;", Arrays.asList("Ando", "Roid", ""));
    415     }
    416 
    417     public void testV21SimpleCase1_Type_Generic() {
    418         mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_GENERIC, R.raw.v21_simple_1);
    419         mVerifier.addContentValuesVerifierElem()
    420                 .addExpected(StructuredName.CONTENT_ITEM_TYPE)
    421                         .put(StructuredName.FAMILY_NAME, "Ando")
    422                         .put(StructuredName.GIVEN_NAME, "Roid")
    423                         .put(StructuredName.DISPLAY_NAME, "Roid Ando");
    424     }
    425 
    426     public void testV21SimpleCase1_Type_Japanese() {
    427         mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_simple_1);
    428         mVerifier.addContentValuesVerifierElem()
    429                 .addExpected(StructuredName.CONTENT_ITEM_TYPE)
    430                         .put(StructuredName.FAMILY_NAME, "Ando")
    431                         .put(StructuredName.GIVEN_NAME, "Roid")
    432                         // If name-related strings only contains printable Ascii,
    433                         // the order is remained to be US's:
    434                         // "Prefix Given Middle Family Suffix"
    435                         .put(StructuredName.DISPLAY_NAME, "Roid Ando");
    436     }
    437 
    438     public void testV21SimpleCase2() {
    439         mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_simple_2);
    440         mVerifier.addContentValuesVerifierElem()
    441                 .addExpected(StructuredName.CONTENT_ITEM_TYPE)
    442                         .put(StructuredName.DISPLAY_NAME, "Ando Roid");
    443     }
    444 
    445     public void testV21SimpleCase3() {
    446         mVerifier.initForImportTest(V21, R.raw.v21_simple_3);
    447         mVerifier.addContentValuesVerifierElem()
    448                 .addExpected(StructuredName.CONTENT_ITEM_TYPE)
    449                         .put(StructuredName.FAMILY_NAME, "Ando")
    450                         .put(StructuredName.GIVEN_NAME, "Roid")
    451                         // "FN" field should be prefered since it should contain the original
    452                         // order intended by the author of the file.
    453                         .put(StructuredName.DISPLAY_NAME, "Ando Roid");
    454     }
    455 
    456     /**
    457      * Tests ';' is properly handled by VCardParser implementation.
    458      */
    459     public void testV21BackslashCase_Parsing() {
    460         mVerifier.initForImportTest(V21, R.raw.v21_backslash);
    461         mVerifier.addPropertyNodesVerifierElem()
    462                 .addExpectedNodeWithOrder("N", ";A;B\\;C\\;;D;:E;\\\\;",
    463                         Arrays.asList("", "A;B\\", "C\\;", "D", ":E", "\\\\", ""))
    464                 .addExpectedNodeWithOrder("FN", "A;B\\C\\;D:E\\\\");
    465 
    466     }
    467 
    468     /**
    469      * Tests ContactStruct correctly ignores redundant fields in "N" property values and
    470      * inserts name related data.
    471      */
    472     public void testV21BackslashCase() {
    473         mVerifier.initForImportTest(V21, R.raw.v21_backslash);
    474         mVerifier.addContentValuesVerifierElem()
    475                 .addExpected(StructuredName.CONTENT_ITEM_TYPE)
    476                         // FAMILY_NAME is empty and removed in this test...
    477                         .put(StructuredName.GIVEN_NAME, "A;B\\")
    478                         .put(StructuredName.MIDDLE_NAME, "C\\;")
    479                         .put(StructuredName.PREFIX, "D")
    480                         .put(StructuredName.SUFFIX, ":E")
    481                         .put(StructuredName.DISPLAY_NAME, "A;B\\C\\;D:E\\\\");
    482     }
    483 
    484     public void testOrgBeforTitle() {
    485         mVerifier.initForImportTest(V21, R.raw.v21_org_before_title);
    486         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    487         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    488                 .put(StructuredName.DISPLAY_NAME, "Normal Guy");
    489         elem.addExpected(Organization.CONTENT_ITEM_TYPE)
    490                 .put(Organization.COMPANY, "Company")
    491                 .put(Organization.DEPARTMENT, "Organization Devision Room Sheet No.")
    492                 .put(Organization.TITLE, "Excellent Janitor")
    493                 .put(Organization.TYPE, Organization.TYPE_WORK);
    494     }
    495 
    496     public void testTitleBeforOrg() {
    497         mVerifier.initForImportTest(V21, R.raw.v21_title_before_org);
    498         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    499         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    500                 .put(StructuredName.DISPLAY_NAME, "Nice Guy");
    501         elem.addExpected(Organization.CONTENT_ITEM_TYPE)
    502                 .put(Organization.COMPANY, "Marverous")
    503                 .put(Organization.DEPARTMENT, "Perfect Great Good Bad Poor")
    504                 .put(Organization.TITLE, "Cool Title")
    505                 .put(Organization.TYPE, Organization.TYPE_WORK);
    506     }
    507 
    508     /**
    509      * Verifies that vCard importer correctly interpret "PREF" attribute to IS_PRIMARY.
    510      * The data contain three cases: one "PREF", no "PREF" and multiple "PREF", in each type.
    511      */
    512     public void testV21PrefToIsPrimary() {
    513         mVerifier.initForImportTest(V21, R.raw.v21_pref_handling);
    514         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    515         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    516                 .put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
    517                 .put(StructuredName.DISPLAY_NAME, "Smith");
    518         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    519                 .put(Phone.NUMBER, "1")
    520                 .put(Phone.TYPE, Phone.TYPE_HOME);
    521         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    522                 .put(Phone.NUMBER, "2")
    523                 .put(Phone.TYPE, Phone.TYPE_WORK)
    524                 .put(Phone.IS_PRIMARY, 1);
    525         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    526                 .put(Phone.NUMBER, "3")
    527                 .put(Phone.TYPE, Phone.TYPE_ISDN);
    528         elem.addExpected(Email.CONTENT_ITEM_TYPE)
    529                 .put(Email.DATA, "test (at) example.com")
    530                 .put(Email.TYPE, Email.TYPE_HOME)
    531                 .put(Email.IS_PRIMARY, 1);
    532         elem.addExpected(Email.CONTENT_ITEM_TYPE)
    533                 .put(Email.DATA, "test2 (at) examination.com")
    534                 .put(Email.TYPE, Email.TYPE_MOBILE)
    535                 .put(Email.IS_PRIMARY, 1);
    536         elem.addExpected(Organization.CONTENT_ITEM_TYPE)
    537                 .put(Organization.COMPANY, "Company")
    538                 .put(Organization.TITLE, "Engineer")
    539                 .put(Organization.TYPE, Organization.TYPE_WORK);
    540         elem.addExpected(Organization.CONTENT_ITEM_TYPE)
    541                 .put(Organization.COMPANY, "Mystery")
    542                 .put(Organization.TITLE, "Blogger")
    543                 .put(Organization.TYPE, Organization.TYPE_WORK);
    544         elem.addExpected(Organization.CONTENT_ITEM_TYPE)
    545                 .put(Organization.COMPANY, "Poetry")
    546                 .put(Organization.TITLE, "Poet")
    547                 .put(Organization.TYPE, Organization.TYPE_WORK);
    548     }
    549 
    550     /**
    551      * Tests all the properties in a complicated vCard are correctly parsed by the VCardParser.
    552      */
    553     public void testV21ComplicatedCase_Parsing() {
    554         mVerifier.initForImportTest(V21, R.raw.v21_complicated);
    555         mVerifier.addPropertyNodesVerifierElem()
    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 (at) walladalla.com",
    588                         new TypeSet("PREF", "INTERNET"))
    589                 .addExpectedNodeWithOrder("EMAIL", "cell (at) 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 (at) 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 (at) 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 (at) example.com>");
    695     }
    696 
    697     public void testV30Simple_Parsing() {
    698         mVerifier.initForImportTest(V30, R.raw.v30_simple);
    699         mVerifier.addPropertyNodesVerifierElem()
    700                 .addExpectedNodeWithOrder("FN", "And Roid")
    701                 .addExpectedNodeWithOrder("N", "And;Roid;;;",
    702                         Arrays.asList("And", "Roid", "", "", ""))
    703                 .addExpectedNodeWithOrder("ORG", "Open;Handset; Alliance",
    704                         Arrays.asList("Open", "Handset", " Alliance"))
    705                 .addExpectedNodeWithOrder("SORT-STRING", "android")
    706                 .addExpectedNodeWithOrder("TEL", "0300000000", new TypeSet("PREF", "VOICE"))
    707                 .addExpectedNodeWithOrder("CLASS", "PUBLIC")
    708                 .addExpectedNodeWithOrder("X-GNO", "0")
    709                 .addExpectedNodeWithOrder("X-GN", "group0")
    710                 .addExpectedNodeWithOrder("X-REDUCTION", "0")
    711                 .addExpectedNodeWithOrder("REV", "20081031T065854Z");
    712     }
    713 
    714     public void testV30Simple() {
    715         mVerifier.initForImportTest(V30, R.raw.v30_simple);
    716         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    717         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    718                 .put(StructuredName.FAMILY_NAME, "And")
    719                 .put(StructuredName.GIVEN_NAME, "Roid")
    720                 .put(StructuredName.DISPLAY_NAME, "And Roid")
    721                 .put(StructuredName.PHONETIC_GIVEN_NAME, "android");
    722         elem.addExpected(Organization.CONTENT_ITEM_TYPE)
    723                 .put(Organization.COMPANY, "Open")
    724                 .put(Organization.DEPARTMENT, "Handset  Alliance")
    725                 .put(Organization.TYPE, Organization.TYPE_WORK);
    726         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    727                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    728                 .put(Phone.LABEL, "VOICE")
    729                 .put(Phone.NUMBER, "030-000-0000")
    730                 .put(Phone.IS_PRIMARY, 1);
    731     }
    732 
    733     public void testV21Japanese1_Parsing() {
    734         // Though Japanese careers append ";;;;" at the end of the value of "SOUND",
    735         // vCard 2.1/3.0 specification does not allow multiple values.
    736         // Do not need to handle it as multiple values.
    737         mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_japanese_1);
    738         mVerifier.addPropertyNodesVerifierElem()
    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("N", "\u5B89\u85E4;\u30ED\u30A4\u30C9\u0031;;;",
    800                         Arrays.asList("\u5B89\u85E4", "\u30ED\u30A4\u30C9\u0031",
    801                                 "", "", ""),
    802                         null, mContentValuesForSJis, null, null)
    803                 .addExpectedNodeWithOrder("FN", "\u5B89\u85E4\u0020\u30ED\u30A4\u30C9\u0020\u0031",
    804                         null, null, mContentValuesForSJis, null, null)
    805                 .addExpectedNodeWithOrder("SOUND",
    806                         "\uFF71\uFF9D\uFF84\uFF9E\uFF73;\uFF9B\uFF72\uFF84\uFF9E\u0031;;;",
    807                         null, null, mContentValuesForSJis,
    808                         new TypeSet("X-IRMC-N"), null)
    809                 .addExpectedNodeWithOrder("ADR",
    810                         ";\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
    811                         "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
    812                         "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC\u0036" +
    813                         "\u968E;;;;150-8512;",
    814                         Arrays.asList("",
    815                                 "\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
    816                                 "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
    817                                 "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" +
    818                                 "\u0036\u968E", "", "", "", "150-8512", ""),
    819                         null, mContentValuesForQPAndSJis, new TypeSet("HOME"), null)
    820                 .addExpectedNodeWithOrder("NOTE", "\u30E1\u30E2", null, null,
    821                         mContentValuesForQPAndSJis, null, null);
    822     }
    823 
    824     public void testV21Japanese2_Type_Generic_Utf8() {
    825         mVerifier.initForImportTest(V21, R.raw.v21_japanese_2);
    826         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    827         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    828                 .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4")
    829                 .put(StructuredName.GIVEN_NAME, "\u30ED\u30A4\u30C9\u0031")
    830                 .put(StructuredName.DISPLAY_NAME,
    831                         "\u5B89\u85E4\u0020\u30ED\u30A4\u30C9\u0020\u0031")
    832                 // ContactStruct should correctly split "SOUND" property into several elements,
    833                 // even though VCardParser side does not care it.
    834                 .put(StructuredName.PHONETIC_FAMILY_NAME, "\uFF71\uFF9D\uFF84\uFF9E\uFF73")
    835                 .put(StructuredName.PHONETIC_GIVEN_NAME, "\uFF9B\uFF72\uFF84\uFF9E\u0031");
    836         elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
    837                 .put(StructuredPostal.POSTCODE, "150-8512")
    838                 .put(StructuredPostal.STREET,
    839                         "\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
    840                         "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
    841                         "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" +
    842                         "\u0036\u968E")
    843                 .put(StructuredPostal.FORMATTED_ADDRESS,
    844                         "\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
    845                         "\u4E18\u753A\u0032\u0036\u002D\u0031\u30BB" +
    846                         "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" +
    847                         "\u0036\u968E 150-8512")
    848                 .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME);
    849         elem.addExpected(Note.CONTENT_ITEM_TYPE)
    850                 .put(Note.NOTE, "\u30E1\u30E2");
    851     }
    852 
    853     public void testV21MultipleEntryCase_Parse() {
    854         mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_multiple_entry);
    855         mVerifier.addPropertyNodesVerifierElem()
    856                 .addExpectedNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033;;;;",
    857                         Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0033", "", "", "", ""),
    858                         null, mContentValuesForSJis, null, null)
    859                 .addExpectedNodeWithOrder("SOUND",
    860                         "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0033;;;;",
    861                         null, null, mContentValuesForSJis,
    862                         new TypeSet("X-IRMC-N"), null)
    863                 .addExpectedNodeWithOrder("TEL", "9", new TypeSet("X-NEC-SECRET"))
    864                 .addExpectedNodeWithOrder("TEL", "10", new TypeSet("X-NEC-HOTEL"))
    865                 .addExpectedNodeWithOrder("TEL", "11", new TypeSet("X-NEC-SCHOOL"))
    866                 .addExpectedNodeWithOrder("TEL", "12", new TypeSet("FAX", "HOME"));
    867         mVerifier.addPropertyNodesVerifierElem()
    868                 .addExpectedNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034;;;;",
    869                         Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0034", "", "", "", ""),
    870                         null, mContentValuesForSJis, null, null)
    871                 .addExpectedNodeWithOrder("SOUND",
    872                         "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0034;;;;",
    873                         null, null, mContentValuesForSJis,
    874                         new TypeSet("X-IRMC-N"), null)
    875                 .addExpectedNodeWithOrder("TEL", "13", new TypeSet("MODEM"))
    876                 .addExpectedNodeWithOrder("TEL", "14", new TypeSet("PAGER"))
    877                 .addExpectedNodeWithOrder("TEL", "15", new TypeSet("X-NEC-FAMILY"))
    878                 .addExpectedNodeWithOrder("TEL", "16", new TypeSet("X-NEC-GIRL"));
    879         mVerifier.addPropertyNodesVerifierElem()
    880                 .addExpectedNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035;;;;",
    881                         Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0035", "", "", "", ""),
    882                         null, mContentValuesForSJis, null, null)
    883                 .addExpectedNodeWithOrder("SOUND",
    884                         "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0035;;;;",
    885                         null, null, mContentValuesForSJis,
    886                         new TypeSet("X-IRMC-N"), null)
    887                 .addExpectedNodeWithOrder("TEL", "17", new TypeSet("X-NEC-BOY"))
    888                 .addExpectedNodeWithOrder("TEL", "18", new TypeSet("X-NEC-FRIEND"))
    889                 .addExpectedNodeWithOrder("TEL", "19", new TypeSet("X-NEC-PHS"))
    890                 .addExpectedNodeWithOrder("TEL", "20", new TypeSet("X-NEC-RESTAURANT"));
    891     }
    892 
    893     public void testV21MultipleEntryCase() {
    894         mVerifier.initForImportTest(VCardConfig.VCARD_TYPE_V21_JAPANESE, R.raw.v21_multiple_entry);
    895         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    896         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    897                 .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033")
    898                 .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033")
    899                 .put(StructuredName.PHONETIC_GIVEN_NAME,
    900                         "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0033");
    901         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    902                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    903                 .put(Phone.LABEL, "NEC-SECRET")
    904                 .put(Phone.NUMBER, "9");
    905         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    906                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    907                 .put(Phone.LABEL, "NEC-HOTEL")
    908                 .put(Phone.NUMBER, "10");
    909         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    910                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    911                 .put(Phone.LABEL, "NEC-SCHOOL")
    912                 .put(Phone.NUMBER, "11");
    913         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    914                 .put(Phone.TYPE, Phone.TYPE_FAX_HOME)
    915                 .put(Phone.NUMBER, "12");
    916 
    917         elem = mVerifier.addContentValuesVerifierElem();
    918         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    919                 .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034")
    920                 .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034")
    921                 .put(StructuredName.PHONETIC_GIVEN_NAME,
    922                         "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0034");
    923         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    924                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    925                 .put(Phone.LABEL, "MODEM")
    926                 .put(Phone.NUMBER, "13");
    927         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    928                 .put(Phone.TYPE, Phone.TYPE_PAGER)
    929                 .put(Phone.NUMBER, "14");
    930         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    931                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    932                 .put(Phone.LABEL, "NEC-FAMILY")
    933                 .put(Phone.NUMBER, "15");
    934         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    935                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    936                 .put(Phone.LABEL, "NEC-GIRL")
    937                 .put(Phone.NUMBER, "16");
    938 
    939         elem = mVerifier.addContentValuesVerifierElem();
    940         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    941                 .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035")
    942                 .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035")
    943                 .put(StructuredName.PHONETIC_GIVEN_NAME,
    944                         "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0035");
    945         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    946                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    947                 .put(Phone.LABEL, "NEC-BOY")
    948                 .put(Phone.NUMBER, "17");
    949         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    950                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    951                 .put(Phone.LABEL, "NEC-FRIEND")
    952                 .put(Phone.NUMBER, "18");
    953         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    954                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    955                 .put(Phone.LABEL, "NEC-PHS")
    956                 .put(Phone.NUMBER, "19");
    957         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
    958                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
    959                 .put(Phone.LABEL, "NEC-RESTAURANT")
    960                 .put(Phone.NUMBER, "20");
    961     }
    962 
    963     public void testIgnoreAgentV21_Parse() {
    964         mVerifier.initForImportTest(V21, R.raw.v21_winmo_65);
    965         ContentValues contentValuesForValue = new ContentValues();
    966         contentValuesForValue.put("VALUE", "DATE");
    967         mVerifier.addPropertyNodesVerifierElem()
    968                 .addExpectedNodeWithOrder("N", Arrays.asList("Example", "", "", "", ""))
    969                 .addExpectedNodeWithOrder("FN", "Example")
    970                 .addExpectedNodeWithOrder("ANNIVERSARY", "20091010", contentValuesForValue)
    971                 .addExpectedNodeWithOrder("AGENT", "")
    972                 .addExpectedNodeWithOrder("X-CLASS", "PUBLIC")
    973                 .addExpectedNodeWithOrder("X-REDUCTION", "")
    974                 .addExpectedNodeWithOrder("X-NO", "");
    975     }
    976 
    977     public void testIgnoreAgentV21() {
    978         mVerifier.initForImportTest(V21, R.raw.v21_winmo_65);
    979         ContentValuesVerifier verifier = new ContentValuesVerifier();
    980         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    981         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    982                 .put(StructuredName.FAMILY_NAME, "Example")
    983                 .put(StructuredName.DISPLAY_NAME, "Example");
    984         elem.addExpected(Event.CONTENT_ITEM_TYPE)
    985                 .put(Event.TYPE, Event.TYPE_ANNIVERSARY)
    986                 .put(Event.START_DATE, "20091010");
    987     }
    988 
    989     public void testTolerateInvalidCommentLikeLineV21() {
    990         mVerifier.initForImportTest(V21, R.raw.v21_invalid_comment_line);
    991         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
    992         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
    993                 .put(StructuredName.GIVEN_NAME, "Conference Call")
    994                 .put(StructuredName.DISPLAY_NAME, "Conference Call");
    995         elem.addExpected(Note.CONTENT_ITEM_TYPE)
    996                 .put(Note.NOTE, "This is an (sharp ->#<- sharp) example. "
    997                         + "This message must NOT be ignored.");
    998     }
    999 
   1000     public void testPagerV30_Parse() {
   1001         mVerifier.initForImportTest(V30, R.raw.v30_pager);
   1002         mVerifier.addPropertyNodesVerifierElem()
   1003                 .addExpectedNodeWithOrder("N", Arrays.asList("F", "G", "M", "", ""))
   1004                 .addExpectedNodeWithOrder("TEL", "6101231234 (at) pagersample.com",
   1005                         new TypeSet("WORK", "MSG", "PAGER"));
   1006     }
   1007 
   1008     public void testPagerV30() {
   1009         mVerifier.initForImportTest(V30, R.raw.v30_pager);
   1010         ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1011         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1012                 .put(StructuredName.FAMILY_NAME, "F")
   1013                 .put(StructuredName.MIDDLE_NAME, "M")
   1014                 .put(StructuredName.GIVEN_NAME, "G")
   1015                 .put(StructuredName.DISPLAY_NAME, "G M F");
   1016         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
   1017                 .put(Phone.TYPE, Phone.TYPE_PAGER)
   1018                 .put(Phone.NUMBER, "6101231234 (at) pagersample.com");
   1019     }
   1020 
   1021     public void testMultiBytePropV30_Parse() {
   1022         mVerifier.initForImportTest(V30, R.raw.v30_multibyte_param);
   1023         mVerifier.addPropertyNodesVerifierElem()
   1024                 .addExpectedNodeWithOrder("N", Arrays.asList("F", "G", "M", "", ""))
   1025                 .addExpectedNodeWithOrder("TEL", "1", new TypeSet("\u8D39"));
   1026     }
   1027 
   1028     public void testMultiBytePropV30() {
   1029         mVerifier.initForImportTest(V30, R.raw.v30_multibyte_param);
   1030         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1031         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1032                 .put(StructuredName.FAMILY_NAME, "F")
   1033                 .put(StructuredName.MIDDLE_NAME, "M")
   1034                 .put(StructuredName.GIVEN_NAME, "G")
   1035                 .put(StructuredName.DISPLAY_NAME, "G M F");
   1036         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
   1037                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
   1038                 .put(Phone.LABEL, "\u8D39")
   1039                 .put(Phone.NUMBER, "1");
   1040     }
   1041 
   1042     public void testCommaSeparatedParamsV30_Parse() {
   1043         mVerifier.initForImportTest(V30, R.raw.v30_comma_separated);
   1044         mVerifier.addPropertyNodesVerifierElem()
   1045                 .addExpectedNodeWithOrder("N", Arrays.asList("F", "G", "M", "", ""),
   1046                         new TypeSet("PREF", "HOME"))
   1047                 .addExpectedNodeWithOrder("TEL", "1",
   1048                         new TypeSet("COMMA,SEPARATED:INSIDE.DQUOTE", "PREF"));
   1049     }
   1050 
   1051     public void testSortAsV40_Parse() {
   1052         mVerifier.initForImportTest(V40, R.raw.v40_sort_as);
   1053 
   1054         final ContentValues contentValuesForSortAsN = new ContentValues();
   1055         contentValuesForSortAsN.put("SORT-AS",
   1056                 "\u3042\u3093\u3069\u3046;\u308D\u3044\u3069");
   1057         final ContentValues contentValuesForSortAsOrg = new ContentValues();
   1058         contentValuesForSortAsOrg.put("SORT-AS",
   1059                 "\u3050\u30FC\u3050\u308B;\u3051\u3093\u3055\u304F\u3076\u3082\u3093");
   1060 
   1061         mVerifier.addPropertyNodesVerifierElem()
   1062                 .addExpectedNodeWithOrder("FN", "\u5B89\u85E4\u0020\u30ED\u30A4\u30C9")
   1063                 .addExpectedNodeWithOrder("N",
   1064                         Arrays.asList("\u5B89\u85E4", "\u30ED\u30A4\u30C9", "", "", ""),
   1065                         contentValuesForSortAsN)
   1066                 .addExpectedNodeWithOrder("ORG",
   1067                         Arrays.asList("\u30B0\u30FC\u30B0\u30EB", "\u691C\u7D22\u90E8\u9580"),
   1068                         contentValuesForSortAsOrg, new TypeSet("WORK"));
   1069     }
   1070 
   1071     public void testSortAsV40() {
   1072         mVerifier.initForImportTest(V40, R.raw.v40_sort_as);
   1073         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1074         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1075                 .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4")
   1076                 .put(StructuredName.GIVEN_NAME, "\u30ED\u30A4\u30C9")
   1077                 .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u0020\u30ED\u30A4\u30C9")
   1078                 .put(StructuredName.PHONETIC_FAMILY_NAME, "\u3042\u3093\u3069\u3046")
   1079                 .put(StructuredName.PHONETIC_GIVEN_NAME,
   1080                         "\u308D\u3044\u3069");
   1081         elem.addExpected(Organization.CONTENT_ITEM_TYPE)
   1082                 .put(Organization.TYPE, Organization.TYPE_WORK)
   1083                 .put(Organization.COMPANY, "\u30B0\u30FC\u30B0\u30EB")
   1084                 .put(Organization.DEPARTMENT, "\u691C\u7D22\u90E8\u9580")
   1085                 .put(Organization.PHONETIC_NAME,
   1086                         "\u3050\u30FC\u3050\u308B\u3051\u3093\u3055\u304F\u3076\u3082\u3093");
   1087     }
   1088 
   1089     public void testIMV21_Parse() {
   1090         mVerifier.initForImportTest(V21, R.raw.v21_im);
   1091         mVerifier.addPropertyNodesVerifierElem()
   1092                 .addExpectedNodeWithOrder("X-ANDROID-CUSTOM",
   1093                         Arrays.asList("vnd.android.cursor.item/nickname", "Nick", "1",
   1094                                 "", "", "", "", "", "", "", "", "", "", "", "", ""))  // 13
   1095                 .addExpectedNodeWithOrder("X-GOOGLE-TALK", "hhh (at) gmail.com");
   1096     }
   1097 
   1098     public void testIMV21() {
   1099         mVerifier.initForImportTest(V21, R.raw.v21_im);
   1100         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1101         elem.addExpected(Nickname.CONTENT_ITEM_TYPE)
   1102                 .put(Nickname.NAME, "Nick")
   1103                 .put(Nickname.TYPE, "1");
   1104         elem.addExpected(Im.CONTENT_ITEM_TYPE)
   1105                 .put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK)
   1106                 .put(Im.TYPE, Im.TYPE_HOME)
   1107                 .put(Im.DATA, "hhh (at) gmail.com");
   1108     }
   1109 
   1110     public void testSipV30_Parse() {
   1111         mVerifier.initForImportTest(V30, R.raw.v30_sip);
   1112         mVerifier.addPropertyNodesVerifierElem()
   1113                 .addExpectedNodeWithOrder("FN", "Android")
   1114                 .addExpectedNodeWithOrder("IMPP", "sip:android (at) android.example.com",
   1115                         new TypeSet("personal"));
   1116     }
   1117 
   1118     public void testSipV30() {
   1119         mVerifier.initForImportTest(V30, R.raw.v30_sip);
   1120         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1121         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1122                 .put(StructuredName.DISPLAY_NAME, "Android");
   1123         // Type is ignored silently.
   1124         elem.addExpected(SipAddress.CONTENT_ITEM_TYPE)
   1125                 .put(SipAddress.TYPE, SipAddress.TYPE_CUSTOM)
   1126                 .put(SipAddress.LABEL, "personal")
   1127                 .put(SipAddress.SIP_ADDRESS, "android (at) android.example.com");
   1128     }
   1129 
   1130     public void testSipV21_Parse() {
   1131         mVerifier.initForImportTest(V21, R.raw.v21_sip);
   1132         mVerifier.addPropertyNodesVerifierElem()
   1133                 .addExpectedNodeWithOrder("FN", "Android")
   1134                 .addExpectedNodeWithOrder("X-SIP", "888")
   1135                 .addExpectedNodeWithOrder("X-SIP", "sip:90-180-360");
   1136     }
   1137 
   1138     public void testSipV21() {
   1139         mVerifier.initForImportTest(V21, R.raw.v21_sip);
   1140         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1141         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1142                 .put(StructuredName.DISPLAY_NAME, "Android");
   1143         elem.addExpected(SipAddress.CONTENT_ITEM_TYPE)
   1144                 .put(SipAddress.TYPE, SipAddress.TYPE_OTHER)
   1145                 .put(SipAddress.SIP_ADDRESS, "888");
   1146         // "sip:" should be removed.
   1147         elem.addExpected(SipAddress.CONTENT_ITEM_TYPE)
   1148                 .put(SipAddress.TYPE, SipAddress.TYPE_OTHER)
   1149                 .put(SipAddress.SIP_ADDRESS, "90-180-360");
   1150     }
   1151 
   1152     public void testSipV40() {
   1153         mVerifier.initForImportTest(V40, R.raw.v40_sip);
   1154         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1155         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1156                 .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4")
   1157                 .put(StructuredName.GIVEN_NAME, "\u30ED\u30A4\u30C9")
   1158                 .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u0020\u30ED\u30A4\u30C9");
   1159         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
   1160                 .put(Phone.TYPE, Phone.TYPE_HOME)
   1161                 .put(Phone.NUMBER, "1");
   1162         elem.addExpected(SipAddress.CONTENT_ITEM_TYPE)
   1163                 .put(SipAddress.TYPE, SipAddress.TYPE_HOME)
   1164                 .put(SipAddress.SIP_ADDRESS, "example (at) example.com");
   1165     }
   1166 
   1167     public void testCustomPropertyV21_Parse() {
   1168         mVerifier.initForImportTest(V21, R.raw.v21_x_param);
   1169         mVerifier.addPropertyNodesVerifierElem()
   1170                 .addExpectedNodeWithOrder("N", "Ando;Roid;", Arrays.asList("Ando", "Roid", ""))
   1171                 .addExpectedNodeWithOrder("ADR", "pobox;street", Arrays.asList("pobox", "street"),
   1172                         new TypeSet("X-custom"))
   1173                 .addExpectedNodeWithOrder("TEL", "1", new TypeSet("X-CuStoMpRop"))
   1174                 .addExpectedNodeWithOrder("TEL", "2", new TypeSet("custompropertywithoutx"))
   1175                 .addExpectedNodeWithOrder("EMAIL", "email (at) example.com",
   1176                         new TypeSet("X-cUstomPrOperty"))
   1177                 .addExpectedNodeWithOrder("EMAIL", "email2 (at) example.com",
   1178                         new TypeSet("CUSTOMPROPERTYWITHOUTX"));
   1179     }
   1180 
   1181     public void testCustomPropertyV21() {
   1182         mVerifier.initForImportTest(V21, R.raw.v21_x_param);
   1183         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1184         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1185                 .put(StructuredName.FAMILY_NAME, "Ando")
   1186                 .put(StructuredName.GIVEN_NAME, "Roid")
   1187                 .put(StructuredName.DISPLAY_NAME, "Roid Ando");
   1188         elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
   1189                 .put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
   1190                 .put(StructuredPostal.LABEL, "custom")
   1191                 .put(StructuredPostal.POBOX, "pobox")
   1192                 .put(StructuredPostal.STREET, "street")
   1193                 .put(StructuredPostal.FORMATTED_ADDRESS, "pobox street");
   1194         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
   1195                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
   1196                 .put(Phone.LABEL, "CuStoMpRop")
   1197                 .put(Phone.NUMBER, "1");
   1198         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
   1199                 .put(Phone.TYPE, Phone.TYPE_CUSTOM)
   1200                 .put(Phone.LABEL, "custompropertywithoutx")
   1201                 .put(Phone.NUMBER, "2");
   1202         elem.addExpected(Email.CONTENT_ITEM_TYPE)
   1203                 .put(Email.TYPE, Email.TYPE_CUSTOM)
   1204                 .put(Email.LABEL, "cUstomPrOperty")
   1205                 .put(Email.ADDRESS, "email (at) example.com");
   1206         elem.addExpected(Email.CONTENT_ITEM_TYPE)
   1207                 .put(Email.TYPE, Email.TYPE_CUSTOM)
   1208                 .put(Email.LABEL, "CUSTOMPROPERTYWITHOUTX")
   1209                 .put(Email.ADDRESS, "email2 (at) example.com");
   1210     }
   1211 
   1212     public void testBase64Without2CrLf_Parse() {
   1213         mVerifier.initForImportTest(V21, R.raw.v21_base64_no_2_crlf);
   1214         mVerifier.addPropertyNodesVerifierElem()
   1215                 .addExpectedNodeWithOrder("N", "name")
   1216                 .addExpectedNodeWithOrder("FN", "fullname")
   1217                 .addExpectedNodeWithOrder("PHOTO", null,
   1218                         null, sPhotoByteArrayForComplicatedCase, mContentValuesForBase64V21,
   1219                         new TypeSet("JPEG"), null);
   1220     }
   1221 
   1222     public void testAndroidCustomPropertyV21() {
   1223         mVerifier.initForImportTest(V21, R.raw.v21_android_custom_prop);
   1224         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1225         elem.addExpected("custom_mime1")
   1226                 .put("data1", "1").put("data2", "2").put("data3", "3").put("data4", "4")
   1227                 .put("data5", "5").put("data6", "6").put("data7", "7").put("data8", "8")
   1228                 .put("data9", "9").put("data10", "10").put("data11", "11").put("data12", "12")
   1229                 .put("data13", "13").put("data14", "14").put("data15", "15");
   1230         // 16'th elemnt ('p') should be ignored
   1231         elem.addExpected("custom_mime2")
   1232                 .put("data1", "a").put("data2", "b").put("data3", "c").put("data4", "d")
   1233                 .put("data5", "e").put("data6", "f").put("data7", "g").put("data8", "h")
   1234                 .put("data9", "i").put("data10", "j").put("data11", "k").put("data12", "l")
   1235                 .put("data13", "m").put("data14", "n").put("data15", "o");
   1236 
   1237         // custom_mime3 shouldn't be here, as there's no data
   1238 
   1239         // Smoke test.
   1240         elem.addExpected("custom_mime4").put("data1", "z");
   1241     }
   1242 
   1243     public void testPauseWaitV30_Parse() {
   1244         mVerifier.initForImportTest(V30, R.raw.v30_pause_wait);
   1245         mVerifier.addPropertyNodesVerifierElem()
   1246                 .addExpectedNodeWithOrder("FN", "Pause Wait")
   1247                 .addExpectedNodeWithOrder("N", "Pause;Wait;;;",
   1248                         Arrays.asList("Pause", "Wait", "", "", ""))
   1249                 .addExpectedNodeWithOrder("TEL", "p1234p5678w9");
   1250      }
   1251 
   1252     public void testPauseWaitV30() {
   1253         mVerifier.initForImportTest(V30, R.raw.v30_pause_wait);
   1254         final ContentValuesVerifierElem elem = mVerifier.addContentValuesVerifierElem();
   1255         elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
   1256                 .put(StructuredName.FAMILY_NAME, "Pause")
   1257                 .put(StructuredName.GIVEN_NAME, "Wait")
   1258                 .put(StructuredName.DISPLAY_NAME, "Pause Wait");
   1259         // See PhoneNumberUtils in Android SDK.
   1260         elem.addExpected(Phone.CONTENT_ITEM_TYPE)
   1261                 .put(Phone.TYPE, Phone.TYPE_HOME)
   1262                 .put(Phone.NUMBER, ",1234,5678;9");
   1263     }
   1264 }
   1265