Make test compontent support multiple vCard input.

Internal issue number: 2195990
This commit is contained in:
Daisuke Miyakawa
2009-11-04 11:41:50 +09:00
parent 231e01e792
commit f035b47774
5 changed files with 797 additions and 503 deletions

View File

@@ -392,7 +392,9 @@ public class VCardComposer {
* Must call before {{@link #init()}. * Must call before {{@link #init()}.
*/ */
public void addHandler(OneEntryHandler handler) { public void addHandler(OneEntryHandler handler) {
mHandlerList.add(handler); if (handler != null) {
mHandlerList.add(handler);
}
} }
/** /**
@@ -1865,11 +1867,11 @@ public class VCardComposer {
switch (typeAsPrimitive) { switch (typeAsPrimitive) {
case Phone.TYPE_HOME: case Phone.TYPE_HOME:
parameterList.addAll( parameterList.addAll(
Arrays.asList(Constants.PARAM_TYPE_HOME, Constants.PARAM_TYPE_VOICE)); Arrays.asList(Constants.PARAM_TYPE_HOME));
break; break;
case Phone.TYPE_WORK: case Phone.TYPE_WORK:
parameterList.addAll( parameterList.addAll(
Arrays.asList(Constants.PARAM_TYPE_WORK, Constants.PARAM_TYPE_VOICE)); Arrays.asList(Constants.PARAM_TYPE_WORK));
break; break;
case Phone.TYPE_FAX_HOME: case Phone.TYPE_FAX_HOME:
parameterList.addAll( parameterList.addAll(

View File

@@ -17,14 +17,73 @@
package com.android.unit_tests.vcard; package com.android.unit_tests.vcard;
import android.content.ContentValues; import android.content.ContentValues;
import android.pim.vcard.VCardConfig;
import android.pim.vcard.VCardParser;
import android.pim.vcard.VCardParser_V21;
import android.pim.vcard.VCardParser_V30;
import android.pim.vcard.exception.VCardException;
import android.test.AndroidTestCase;
import android.util.Log;
import junit.framework.TestCase;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import junit.framework.TestCase; public class PropertyNodesVerifier extends VNodeBuilder {
private final List<PropertyNodesVerifierElem> mPropertyNodesVerifierElemList;
private final AndroidTestCase mAndroidTestCase;
private int mIndex;
public PropertyNodesVerifier(AndroidTestCase testCase) {
mPropertyNodesVerifierElemList = new ArrayList<PropertyNodesVerifierElem>();
mAndroidTestCase = testCase;
}
public PropertyNodesVerifierElem addPropertyNodesVerifierElem() {
PropertyNodesVerifierElem elem = new PropertyNodesVerifierElem(mAndroidTestCase);
mPropertyNodesVerifierElemList.add(elem);
return elem;
}
public void verify(int resId, int vCardType)
throws IOException, VCardException {
verify(mAndroidTestCase.getContext().getResources().openRawResource(resId), vCardType);
}
public void verify(InputStream is, int vCardType) throws IOException, VCardException {
final VCardParser vCardParser;
if (VCardConfig.isV30(vCardType)) {
vCardParser = new VCardParser_V30(true); // use StrictParsing
} else {
vCardParser = new VCardParser_V21();
}
try {
vCardParser.parse(is, this);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
}
@Override
public void endRecord() {
super.endRecord();
mAndroidTestCase.assertTrue(mIndex < mPropertyNodesVerifierElemList.size());
mAndroidTestCase.assertTrue(mIndex < vNodeList.size());
mPropertyNodesVerifierElemList.get(mIndex).verify(vNodeList.get(mIndex));
mIndex++;
}
}
/** /**
* Utility class which verifies input VNode. * Utility class which verifies input VNode.
@@ -34,7 +93,7 @@ import junit.framework.TestCase;
* If the node does not exist in the "ordered list", the class refers to * If the node does not exist in the "ordered list", the class refers to
* "unorderd expected property set" and checks the node is expected somewhere. * "unorderd expected property set" and checks the node is expected somewhere.
*/ */
public class PropertyNodesVerifier { class PropertyNodesVerifierElem {
public static class TypeSet extends HashSet<String> { public static class TypeSet extends HashSet<String> {
public TypeSet(String ... array) { public TypeSet(String ... array) {
super(Arrays.asList(array)); super(Arrays.asList(array));
@@ -53,7 +112,7 @@ public class PropertyNodesVerifier {
private final ArrayList<PropertyNode> mUnorderedNodeList; private final ArrayList<PropertyNode> mUnorderedNodeList;
private final TestCase mTestCase; private final TestCase mTestCase;
public PropertyNodesVerifier(TestCase testCase) { public PropertyNodesVerifierElem(TestCase testCase) {
mOrderedNodeMap = new HashMap<String, List<PropertyNode>>(); mOrderedNodeMap = new HashMap<String, List<PropertyNode>>();
mUnorderedNodeList = new ArrayList<PropertyNode>(); mUnorderedNodeList = new ArrayList<PropertyNode>();
mTestCase = testCase; mTestCase = testCase;
@@ -61,16 +120,16 @@ public class PropertyNodesVerifier {
// WithOrder // WithOrder
public PropertyNodesVerifier addNodeWithOrder(String propName, String propValue) { public PropertyNodesVerifierElem addNodeWithOrder(String propName, String propValue) {
return addNodeWithOrder(propName, propValue, null, null, null, null, null); return addNodeWithOrder(propName, propValue, null, null, null, null, null);
} }
public PropertyNodesVerifier addNodeWithOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithOrder(String propName, String propValue,
List<String> propValueList) { List<String> propValueList) {
return addNodeWithOrder(propName, propValue, propValueList, null, null, null, null); return addNodeWithOrder(propName, propValue, propValueList, null, null, null, null);
} }
public PropertyNodesVerifier addNodeWithOrder(String propName, List<String> propValueList) { public PropertyNodesVerifierElem addNodeWithOrder(String propName, List<String> propValueList) {
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
boolean first = true; boolean first = true;
for (String propValueElem : propValueList) { for (String propValueElem : propValueList) {
@@ -85,18 +144,18 @@ public class PropertyNodesVerifier {
null, null, null, null); null, null, null, null);
} }
public PropertyNodesVerifier addNodeWithOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithOrder(String propName, String propValue,
TypeSet paramMap_TYPE) { TypeSet paramMap_TYPE) {
return addNodeWithOrder(propName, propValue, null, null, null, paramMap_TYPE, null); return addNodeWithOrder(propName, propValue, null, null, null, paramMap_TYPE, null);
} }
public PropertyNodesVerifier addNodeWithOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithOrder(String propName, String propValue,
List<String> propValueList, TypeSet paramMap_TYPE) { List<String> propValueList, TypeSet paramMap_TYPE) {
return addNodeWithOrder(propName, propValue, propValueList, null, null, return addNodeWithOrder(propName, propValue, propValueList, null, null,
paramMap_TYPE, null); paramMap_TYPE, null);
} }
public PropertyNodesVerifier addNodeWithOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithOrder(String propName, String propValue,
List<String> propValueList, byte[] propValue_bytes, List<String> propValueList, byte[] propValue_bytes,
ContentValues paramMap, TypeSet paramMap_TYPE, GroupSet propGroupSet) { ContentValues paramMap, TypeSet paramMap_TYPE, GroupSet propGroupSet) {
PropertyNode propertyNode = new PropertyNode(propName, PropertyNode propertyNode = new PropertyNode(propName,
@@ -113,16 +172,16 @@ public class PropertyNodesVerifier {
// WithoutOrder // WithoutOrder
public PropertyNodesVerifier addNodeWithoutOrder(String propName, String propValue) { public PropertyNodesVerifierElem addNodeWithoutOrder(String propName, String propValue) {
return addNodeWithoutOrder(propName, propValue, null, null, null, null, null); return addNodeWithoutOrder(propName, propValue, null, null, null, null, null);
} }
public PropertyNodesVerifier addNodeWithoutOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithoutOrder(String propName, String propValue,
List<String> propValueList) { List<String> propValueList) {
return addNodeWithoutOrder(propName, propValue, propValueList, null, null, null, null); return addNodeWithoutOrder(propName, propValue, propValueList, null, null, null, null);
} }
public PropertyNodesVerifier addNodeWithoutOrder(String propName, List<String> propValueList) { public PropertyNodesVerifierElem addNodeWithoutOrder(String propName, List<String> propValueList) {
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
boolean first = true; boolean first = true;
for (String propValueElem : propValueList) { for (String propValueElem : propValueList) {
@@ -137,18 +196,18 @@ public class PropertyNodesVerifier {
null, null, null, null); null, null, null, null);
} }
public PropertyNodesVerifier addNodeWithoutOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithoutOrder(String propName, String propValue,
TypeSet paramMap_TYPE) { TypeSet paramMap_TYPE) {
return addNodeWithoutOrder(propName, propValue, null, null, null, paramMap_TYPE, null); return addNodeWithoutOrder(propName, propValue, null, null, null, paramMap_TYPE, null);
} }
public PropertyNodesVerifier addNodeWithoutOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithoutOrder(String propName, String propValue,
List<String> propValueList, TypeSet paramMap_TYPE) { List<String> propValueList, TypeSet paramMap_TYPE) {
return addNodeWithoutOrder(propName, propValue, propValueList, null, null, return addNodeWithoutOrder(propName, propValue, propValueList, null, null,
paramMap_TYPE, null); paramMap_TYPE, null);
} }
public PropertyNodesVerifier addNodeWithoutOrder(String propName, String propValue, public PropertyNodesVerifierElem addNodeWithoutOrder(String propName, String propValue,
List<String> propValueList, byte[] propValue_bytes, List<String> propValueList, byte[] propValue_bytes,
ContentValues paramMap, TypeSet paramMap_TYPE, GroupSet propGroupSet) { ContentValues paramMap, TypeSet paramMap_TYPE, GroupSet propGroupSet) {
mUnorderedNodeList.add(new PropertyNode(propName, propValue, mUnorderedNodeList.add(new PropertyNode(propName, propValue,
@@ -185,8 +244,7 @@ public class PropertyNodesVerifier {
if (size > 0) { if (size > 0) {
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
PropertyNode expectedNode = expectedNodeList.get(i); PropertyNode expectedNode = expectedNodeList.get(i);
List<PropertyNode> expectedButDifferentValueList = List<PropertyNode> expectedButDifferentValueList = new ArrayList<PropertyNode>();
new ArrayList<PropertyNode>();
if (expectedNode.propName.equals(propName)) { if (expectedNode.propName.equals(propName)) {
if (expectedNode.equals(actualNode)) { if (expectedNode.equals(actualNode)) {
expectedNodeList.remove(i); expectedNodeList.remove(i);

View File

@@ -17,7 +17,6 @@
package com.android.unit_tests.vcard; package com.android.unit_tests.vcard;
import android.content.ContentValues; import android.content.ContentValues;
import android.pim.vcard.VCardComposer;
import android.pim.vcard.VCardConfig; import android.pim.vcard.VCardConfig;
import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Event; import android.provider.ContactsContract.CommonDataKinds.Event;
@@ -31,7 +30,7 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website; import android.provider.ContactsContract.CommonDataKinds.Website;
import com.android.unit_tests.vcard.PropertyNodesVerifier.TypeSet; import com.android.unit_tests.vcard.PropertyNodesVerifierElem.TypeSet;
import java.util.Arrays; import java.util.Arrays;
@@ -44,42 +43,24 @@ public class VCardExporterTests extends VCardTestsBase {
private static final byte[] sPhotoByteArray = private static final byte[] sPhotoByteArray =
VCardImporterTests.sPhotoByteArrayForComplicatedCase; VCardImporterTests.sPhotoByteArrayForComplicatedCase;
private void verifyOneComposition(ExportTestResolver resolver,
VCardVerificationHandler handler, int version) {
final boolean isV30 = (version == V30);
final int vcardType = (isV30 ? VCardConfig.VCARD_TYPE_V30_GENERIC_UTF8
: VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
VCardComposer composer = new VCardComposer(new CustomMockContext(resolver), vcardType);
composer.addHandler(handler);
if (!composer.init(VCardComposer.CONTACTS_TEST_CONTENT_URI, null, null, null)) {
fail("init() failed. Reason: " + composer.getErrorReason());
}
assertFalse(composer.isAfterLast());
assertTrue(composer.createOneEntry());
assertTrue(composer.isAfterLast());
composer.terminate();
}
public void testSimpleV21() { public void testSimpleV21() {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "Ando") .put(StructuredName.FAMILY_NAME, "Ando")
.put(StructuredName.GIVEN_NAME, "Roid"); .put(StructuredName.GIVEN_NAME, "Roid");
VCardVerificationHandler handler = new VCardVerificationHandler(this, V21); VCardVerifier verifier = new VCardVerifier(resolver, V21);
handler.addPropertyNodesVerifier() verifier.addPropertyNodesVerifierElem()
.addNodeWithoutOrder("FN", "Roid Ando") .addNodeWithoutOrder("FN", "Roid Ando")
.addNodeWithoutOrder("N", "Ando;Roid;;;", Arrays.asList("Ando", "Roid", "", "", "")); .addNodeWithoutOrder("N", "Ando;Roid;;;", Arrays.asList("Ando", "Roid", "", "", ""));
verifier.verify();
verifyOneComposition(resolver, handler, V21);
} }
private void testStructuredNameBasic(int version) { private void testStructuredNameBasic(int version) {
final boolean isV30 = (version == V30); final boolean isV30 = VCardConfig.isV30(version);
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "AppropriateFamilyName") .put(StructuredName.FAMILY_NAME, "AppropriateFamilyName")
.put(StructuredName.GIVEN_NAME, "AppropriateGivenName") .put(StructuredName.GIVEN_NAME, "AppropriateGivenName")
.put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName") .put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName")
@@ -89,8 +70,8 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_GIVEN_NAME, "AppropriatePhoneticGiven") .put(StructuredName.PHONETIC_GIVEN_NAME, "AppropriatePhoneticGiven")
.put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle"); .put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle");
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
PropertyNodesVerifier verifier = handler.addPropertyNodesVerifier() PropertyNodesVerifierElem elem = verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("N", .addNodeWithOrder("N",
"AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;" "AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
+ "AppropriatePrefix;AppropriateSuffix", + "AppropriatePrefix;AppropriateSuffix",
@@ -104,12 +85,12 @@ public class VCardExporterTests extends VCardTestsBase {
.addNodeWithoutOrder("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily"); .addNodeWithoutOrder("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily");
if (isV30) { if (isV30) {
verifier.addNodeWithoutOrder("SORT-STRING", elem.addNodeWithoutOrder("SORT-STRING",
"AppropriatePhoneticGiven AppropriatePhoneticMiddle " "AppropriatePhoneticGiven AppropriatePhoneticMiddle "
+ "AppropriatePhoneticFamily"); + "AppropriatePhoneticFamily");
} }
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testStructuredNameBasicV21() { public void testStructuredNameBasicV21() {
@@ -130,7 +111,8 @@ public class VCardExporterTests extends VCardTestsBase {
final boolean isV30 = (version == V30); final boolean isV30 = (version == V30);
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName1") .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName1")
.put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName1") .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName1")
.put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName1") .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName1")
@@ -141,7 +123,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle1"); .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle1");
// With "IS_PRIMARY=1". This is what we should use. // With "IS_PRIMARY=1". This is what we should use.
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "AppropriateFamilyName") .put(StructuredName.FAMILY_NAME, "AppropriateFamilyName")
.put(StructuredName.GIVEN_NAME, "AppropriateGivenName") .put(StructuredName.GIVEN_NAME, "AppropriateGivenName")
.put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName") .put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName")
@@ -153,7 +135,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.IS_PRIMARY, 1); .put(StructuredName.IS_PRIMARY, 1);
// With "IS_PRIMARY=1", but we should ignore this time, since this is second, not first. // With "IS_PRIMARY=1", but we should ignore this time, since this is second, not first.
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName2") .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName2")
.put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName2") .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName2")
.put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName2") .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName2")
@@ -164,8 +146,8 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle2") .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle2")
.put(StructuredName.IS_PRIMARY, 1); .put(StructuredName.IS_PRIMARY, 1);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
PropertyNodesVerifier verifier = handler.addPropertyNodesVerifier() PropertyNodesVerifierElem elem = verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("N", .addNodeWithOrder("N",
"AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;" "AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
+ "AppropriatePrefix;AppropriateSuffix", + "AppropriatePrefix;AppropriateSuffix",
@@ -179,12 +161,12 @@ public class VCardExporterTests extends VCardTestsBase {
.addNodeWithoutOrder("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily"); .addNodeWithoutOrder("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily");
if (isV30) { if (isV30) {
verifier.addNodeWithoutOrder("SORT-STRING", elem.addNodeWithoutOrder("SORT-STRING",
"AppropriatePhoneticGiven AppropriatePhoneticMiddle " "AppropriatePhoneticGiven AppropriatePhoneticMiddle "
+ "AppropriatePhoneticFamily"); + "AppropriatePhoneticFamily");
} }
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testStructuredNameUsePrimaryV21() { public void testStructuredNameUsePrimaryV21() {
@@ -203,7 +185,8 @@ public class VCardExporterTests extends VCardTestsBase {
final boolean isV30 = (version == V30); final boolean isV30 = (version == V30);
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName1") .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName1")
.put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName1") .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName1")
.put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName1") .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName1")
@@ -214,7 +197,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle1"); .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle1");
// With "IS_PRIMARY=1", but we should ignore this time. // With "IS_PRIMARY=1", but we should ignore this time.
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName2") .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName2")
.put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName2") .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName2")
.put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName2") .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName2")
@@ -226,7 +209,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.IS_PRIMARY, 1); .put(StructuredName.IS_PRIMARY, 1);
// With "IS_SUPER_PRIMARY=1". This is what we should use. // With "IS_SUPER_PRIMARY=1". This is what we should use.
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "AppropriateFamilyName") .put(StructuredName.FAMILY_NAME, "AppropriateFamilyName")
.put(StructuredName.GIVEN_NAME, "AppropriateGivenName") .put(StructuredName.GIVEN_NAME, "AppropriateGivenName")
.put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName") .put(StructuredName.MIDDLE_NAME, "AppropriateMiddleName")
@@ -237,7 +220,7 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle") .put(StructuredName.PHONETIC_MIDDLE_NAME, "AppropriatePhoneticMiddle")
.put(StructuredName.IS_SUPER_PRIMARY, 1); .put(StructuredName.IS_SUPER_PRIMARY, 1);
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName3") .put(StructuredName.FAMILY_NAME, "DoNotEmitFamilyName3")
.put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName3") .put(StructuredName.GIVEN_NAME, "DoNotEmitGivenName3")
.put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName3") .put(StructuredName.MIDDLE_NAME, "DoNotEmitMiddleName3")
@@ -248,8 +231,8 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle3") .put(StructuredName.PHONETIC_MIDDLE_NAME, "DoNotEmitPhoneticMiddle3")
.put(StructuredName.IS_PRIMARY, 1); .put(StructuredName.IS_PRIMARY, 1);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
PropertyNodesVerifier verifier = handler.addPropertyNodesVerifier() PropertyNodesVerifierElem elem = verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("N", .addNodeWithOrder("N",
"AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;" "AppropriateFamilyName;AppropriateGivenName;AppropriateMiddleName;"
+ "AppropriatePrefix;AppropriateSuffix", + "AppropriatePrefix;AppropriateSuffix",
@@ -263,12 +246,12 @@ public class VCardExporterTests extends VCardTestsBase {
.addNodeWithoutOrder("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily"); .addNodeWithoutOrder("X-PHONETIC-LAST-NAME", "AppropriatePhoneticFamily");
if (isV30) { if (isV30) {
verifier.addNodeWithoutOrder("SORT-STRING", elem.addNodeWithoutOrder("SORT-STRING",
"AppropriatePhoneticGiven AppropriatePhoneticMiddle" "AppropriatePhoneticGiven AppropriatePhoneticMiddle"
+ " AppropriatePhoneticFamily"); + " AppropriatePhoneticFamily");
} }
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testStructuredNameUseSuperPrimaryV21() { public void testStructuredNameUseSuperPrimaryV21() {
@@ -281,28 +264,28 @@ public class VCardExporterTests extends VCardTestsBase {
public void testNickNameV30() { public void testNickNameV30() {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Nickname.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(Nickname.CONTENT_ITEM_TYPE)
.put(Nickname.NAME, "Nicky"); .put(Nickname.NAME, "Nicky");
VCardVerificationHandler handler = new VCardVerificationHandler(this, V30); VCardVerifier verifier = new VCardVerifier(resolver, V30);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithOrder("NICKNAME", "Nicky"); .addNodeWithOrder("NICKNAME", "Nicky");
verifyOneComposition(resolver, handler, V30); verifier.verify();
} }
private void testPhoneBasicCommon(int version) { private void testPhoneBasicCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Phone.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "1") .put(Phone.NUMBER, "1")
.put(Phone.TYPE, Phone.TYPE_HOME); .put(Phone.TYPE, Phone.TYPE_HOME);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("TEL", "1", new TypeSet("HOME", "VOICE")); .addNodeWithoutOrder("TEL", "1", new TypeSet("HOME"));
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testPhoneBasicV21() { public void testPhoneBasicV21() {
@@ -319,72 +302,58 @@ public class VCardExporterTests extends VCardTestsBase {
private void testPhoneVariousTypeSupport(int version) { private void testPhoneVariousTypeSupport(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Phone.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "10") .put(Phone.NUMBER, "10")
.put(Phone.TYPE, Phone.TYPE_HOME); .put(Phone.TYPE, Phone.TYPE_HOME);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "20") .put(Phone.NUMBER, "20")
.put(Phone.TYPE, Phone.TYPE_WORK); .put(Phone.TYPE, Phone.TYPE_WORK);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "30") .put(Phone.NUMBER, "30")
.put(Phone.TYPE, Phone.TYPE_FAX_HOME); .put(Phone.TYPE, Phone.TYPE_FAX_HOME);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "40") .put(Phone.NUMBER, "40")
.put(Phone.TYPE, Phone.TYPE_FAX_WORK); .put(Phone.TYPE, Phone.TYPE_FAX_WORK);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "50") .put(Phone.NUMBER, "50")
.put(Phone.TYPE, Phone.TYPE_MOBILE); .put(Phone.TYPE, Phone.TYPE_MOBILE);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "60") .put(Phone.NUMBER, "60")
.put(Phone.TYPE, Phone.TYPE_PAGER); .put(Phone.TYPE, Phone.TYPE_PAGER);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "70") .put(Phone.NUMBER, "70")
.put(Phone.TYPE, Phone.TYPE_OTHER); .put(Phone.TYPE, Phone.TYPE_OTHER);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "80") .put(Phone.NUMBER, "80")
.put(Phone.TYPE, Phone.TYPE_CAR); .put(Phone.TYPE, Phone.TYPE_CAR);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "90") .put(Phone.NUMBER, "90")
.put(Phone.TYPE, Phone.TYPE_COMPANY_MAIN); .put(Phone.TYPE, Phone.TYPE_COMPANY_MAIN);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "100") .put(Phone.NUMBER, "100")
.put(Phone.TYPE, Phone.TYPE_ISDN); .put(Phone.TYPE, Phone.TYPE_ISDN);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "110") .put(Phone.NUMBER, "110")
.put(Phone.TYPE, Phone.TYPE_MAIN); .put(Phone.TYPE, Phone.TYPE_MAIN);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "120") .put(Phone.NUMBER, "120")
.put(Phone.TYPE, Phone.TYPE_OTHER_FAX); .put(Phone.TYPE, Phone.TYPE_OTHER_FAX);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "130") .put(Phone.NUMBER, "130")
.put(Phone.TYPE, Phone.TYPE_TELEX); .put(Phone.TYPE, Phone.TYPE_TELEX);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "140") .put(Phone.NUMBER, "140")
.put(Phone.TYPE, Phone.TYPE_WORK_MOBILE); .put(Phone.TYPE, Phone.TYPE_WORK_MOBILE);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "150") .put(Phone.NUMBER, "150")
.put(Phone.TYPE, Phone.TYPE_WORK_PAGER); .put(Phone.TYPE, Phone.TYPE_WORK_PAGER);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "160") .put(Phone.NUMBER, "160")
.put(Phone.TYPE, Phone.TYPE_MMS); .put(Phone.TYPE, Phone.TYPE_MMS);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("TEL", "10", new TypeSet("HOME")) .addNodeWithoutOrder("TEL", "10", new TypeSet("HOME"))
.addNodeWithoutOrder("TEL", "20", new TypeSet("WORK")) .addNodeWithoutOrder("TEL", "20", new TypeSet("WORK"))
.addNodeWithoutOrder("TEL", "30", new TypeSet("HOME", "FAX")) .addNodeWithoutOrder("TEL", "30", new TypeSet("HOME", "FAX"))
@@ -398,9 +367,10 @@ public class VCardExporterTests extends VCardTestsBase {
.addNodeWithoutOrder("TEL", "110", new TypeSet("PREF")) .addNodeWithoutOrder("TEL", "110", new TypeSet("PREF"))
.addNodeWithoutOrder("TEL", "120", new TypeSet("FAX")) .addNodeWithoutOrder("TEL", "120", new TypeSet("FAX"))
.addNodeWithoutOrder("TEL", "130", new TypeSet("TLX")) .addNodeWithoutOrder("TEL", "130", new TypeSet("TLX"))
.addNodeWithoutOrder("TEL", "140", new TypeSet("WORK", "MOBILE")) .addNodeWithoutOrder("TEL", "140", new TypeSet("WORK", "CELL"))
.addNodeWithoutOrder("TEL", "150", new TypeSet("WORK", "PAGER")) .addNodeWithoutOrder("TEL", "150", new TypeSet("WORK", "PAGER"))
.addNodeWithoutOrder("TEL", "160", new TypeSet("MSG")); .addNodeWithoutOrder("TEL", "160", new TypeSet("MSG"));
verifier.verify();
} }
public void testPhoneVariousTypeSupportV21() { public void testPhoneVariousTypeSupportV21() {
@@ -416,33 +386,29 @@ public class VCardExporterTests extends VCardTestsBase {
*/ */
private void testPhonePrefHandlingCommon(int version) { private void testPhonePrefHandlingCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
ContactEntry entry = resolver.buildContactEntry();
resolver.buildInput(Phone.CONTENT_ITEM_TYPE) entry.buildData(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "1") .put(Phone.NUMBER, "1")
.put(Phone.TYPE, Phone.TYPE_HOME); .put(Phone.TYPE, Phone.TYPE_HOME);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "2") .put(Phone.NUMBER, "2")
.put(Phone.TYPE, Phone.TYPE_WORK) .put(Phone.TYPE, Phone.TYPE_WORK)
.put(Phone.IS_PRIMARY, 1); .put(Phone.IS_PRIMARY, 1);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "3") .put(Phone.NUMBER, "3")
.put(Phone.TYPE, Phone.TYPE_FAX_HOME) .put(Phone.TYPE, Phone.TYPE_FAX_HOME)
.put(Phone.IS_PRIMARY, 1); .put(Phone.IS_PRIMARY, 1);
entry.buildData(Phone.CONTENT_ITEM_TYPE)
resolver.buildInput(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "4") .put(Phone.NUMBER, "4")
.put(Phone.TYPE, Phone.TYPE_FAX_WORK); .put(Phone.TYPE, Phone.TYPE_FAX_WORK);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("TEL", "4", new TypeSet("WORK", "FAX")) .addNodeWithoutOrder("TEL", "4", new TypeSet("WORK", "FAX"))
.addNodeWithoutOrder("TEL", "3", new TypeSet("HOME", "FAX", "PREF")) .addNodeWithoutOrder("TEL", "3", new TypeSet("HOME", "FAX", "PREF"))
.addNodeWithoutOrder("TEL", "2", new TypeSet("WORK", "VOICE", "PREF")) .addNodeWithoutOrder("TEL", "2", new TypeSet("WORK", "PREF"))
.addNodeWithoutOrder("TEL", "1", new TypeSet("HOME", "VOICE")); .addNodeWithoutOrder("TEL", "1", new TypeSet("HOME"));
verifier.verify();
verifyOneComposition(resolver, handler, version);
} }
public void testPhonePrefHandlingV21() { public void testPhonePrefHandlingV21() {
@@ -455,15 +421,15 @@ public class VCardExporterTests extends VCardTestsBase {
private void testEmailBasicCommon(int version) { private void testEmailBasicCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Email.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "sample@example.com"); .put(Email.DATA, "sample@example.com");
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("EMAIL", "sample@example.com"); .addNodeWithoutOrder("EMAIL", "sample@example.com");
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testEmailBasicV21() { public void testEmailBasicV21() {
@@ -477,31 +443,29 @@ public class VCardExporterTests extends VCardTestsBase {
private void testEmailVariousTypeSupportCommon(int version) { private void testEmailVariousTypeSupportCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Email.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "type_home@example.com") .put(Email.DATA, "type_home@example.com")
.put(Email.TYPE, Email.TYPE_HOME); .put(Email.TYPE, Email.TYPE_HOME);
entry.buildData(Email.CONTENT_ITEM_TYPE)
resolver.buildInput(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "type_work@example.com") .put(Email.DATA, "type_work@example.com")
.put(Email.TYPE, Email.TYPE_WORK); .put(Email.TYPE, Email.TYPE_WORK);
entry.buildData(Email.CONTENT_ITEM_TYPE)
resolver.buildInput(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "type_mobile@example.com") .put(Email.DATA, "type_mobile@example.com")
.put(Email.TYPE, Email.TYPE_MOBILE); .put(Email.TYPE, Email.TYPE_MOBILE);
entry.buildData(Email.CONTENT_ITEM_TYPE)
resolver.buildInput(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "type_other@example.com") .put(Email.DATA, "type_other@example.com")
.put(Email.TYPE, Email.TYPE_OTHER); .put(Email.TYPE, Email.TYPE_OTHER);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("EMAIL", "type_home@example.com", new TypeSet("HOME")) .addNodeWithoutOrder("EMAIL", "type_home@example.com", new TypeSet("HOME"))
.addNodeWithoutOrder("EMAIL", "type_work@example.com", new TypeSet("WORK")) .addNodeWithoutOrder("EMAIL", "type_work@example.com", new TypeSet("WORK"))
.addNodeWithoutOrder("EMAIL", "type_mobile@example.com", new TypeSet("CELL")) .addNodeWithoutOrder("EMAIL", "type_mobile@example.com", new TypeSet("CELL"))
.addNodeWithoutOrder("EMAIL", "type_other@example.com"); .addNodeWithoutOrder("EMAIL", "type_other@example.com");
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testEmailVariousTypeSupportV21() { public void testEmailVariousTypeSupportV21() {
@@ -515,22 +479,22 @@ public class VCardExporterTests extends VCardTestsBase {
private void testEmailPrefHandlingCommon(int version) { private void testEmailPrefHandlingCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Email.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "type_home@example.com") .put(Email.DATA, "type_home@example.com")
.put(Email.TYPE, Email.TYPE_HOME) .put(Email.TYPE, Email.TYPE_HOME)
.put(Email.IS_PRIMARY, 1); .put(Email.IS_PRIMARY, 1);
entry.buildData(Email.CONTENT_ITEM_TYPE)
resolver.buildInput(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "type_notype@example.com") .put(Email.DATA, "type_notype@example.com")
.put(Email.IS_PRIMARY, 1); .put(Email.IS_PRIMARY, 1);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("EMAIL", "type_notype@example.com", new TypeSet("PREF")) .addNodeWithoutOrder("EMAIL", "type_notype@example.com", new TypeSet("PREF"))
.addNodeWithoutOrder("EMAIL", "type_home@example.com", new TypeSet("HOME", "PREF")); .addNodeWithoutOrder("EMAIL", "type_home@example.com", new TypeSet("HOME", "PREF"));
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testEmailPrefHandlingV21() { public void testEmailPrefHandlingV21() {
@@ -547,7 +511,7 @@ public class VCardExporterTests extends VCardTestsBase {
// adr-value = 0*6(text-value ";") text-value // adr-value = 0*6(text-value ";") text-value
// ; PO Box, Extended Address, Street, Locality, Region, Postal Code, // ; PO Box, Extended Address, Street, Locality, Region, Postal Code,
// ; Country Name // ; Country Name
resolver.buildInput(StructuredPostal.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(StructuredPostal.CONTENT_ITEM_TYPE)
.put(StructuredPostal.POBOX, "Pobox") .put(StructuredPostal.POBOX, "Pobox")
.put(StructuredPostal.NEIGHBORHOOD, "Neighborhood") .put(StructuredPostal.NEIGHBORHOOD, "Neighborhood")
.put(StructuredPostal.STREET, "Street") .put(StructuredPostal.STREET, "Street")
@@ -555,13 +519,13 @@ public class VCardExporterTests extends VCardTestsBase {
.put(StructuredPostal.REGION, "Region") .put(StructuredPostal.REGION, "Region")
.put(StructuredPostal.POSTCODE, "100") .put(StructuredPostal.POSTCODE, "100")
.put(StructuredPostal.COUNTRY, "Country"); .put(StructuredPostal.COUNTRY, "Country");
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("ADR", "Pobox;Neighborhood;Street;City;Region;100;Country", .addNodeWithoutOrder("ADR", "Pobox;Neighborhood;Street;City;Region;100;Country",
Arrays.asList("Pobox", "Neighborhood", "Street", "City", Arrays.asList("Pobox", "Neighborhood", "Street", "City",
"Region", "100", "Country"), new TypeSet("HOME")); "Region", "100", "Country"), new TypeSet("HOME"));
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testPostalOnlyWithStructuredDataV21() { public void testPostalOnlyWithStructuredDataV21() {
@@ -575,17 +539,17 @@ public class VCardExporterTests extends VCardTestsBase {
private void testPostalOnlyWithFormattedAddressCommon(int version) { private void testPostalOnlyWithFormattedAddressCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredPostal.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(StructuredPostal.CONTENT_ITEM_TYPE)
.put(StructuredPostal.FORMATTED_ADDRESS, .put(StructuredPostal.FORMATTED_ADDRESS,
"Formatted address CA 123-334 United Statue"); "Formatted address CA 123-334 United Statue");
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithOrder("ADR", ";Formatted address CA 123-334 United Statue;;;;;", .addNodeWithOrder("ADR", ";Formatted address CA 123-334 United Statue;;;;;",
Arrays.asList("", "Formatted address CA 123-334 United Statue", Arrays.asList("", "Formatted address CA 123-334 United Statue",
"", "", "", "", ""), new TypeSet("HOME")); "", "", "", "", ""), new TypeSet("HOME"));
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testPostalOnlyWithFormattedAddressV21() { public void testPostalOnlyWithFormattedAddressV21() {
@@ -603,19 +567,19 @@ public class VCardExporterTests extends VCardTestsBase {
private void testPostalWithBothStructuredAndFormattedCommon(int version) { private void testPostalWithBothStructuredAndFormattedCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredPostal.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(StructuredPostal.CONTENT_ITEM_TYPE)
.put(StructuredPostal.POBOX, "Pobox") .put(StructuredPostal.POBOX, "Pobox")
.put(StructuredPostal.COUNTRY, "Country") .put(StructuredPostal.COUNTRY, "Country")
.put(StructuredPostal.FORMATTED_ADDRESS, .put(StructuredPostal.FORMATTED_ADDRESS,
"Formatted address CA 123-334 United Statue"); // Should be ignored "Formatted address CA 123-334 United Statue"); // Should be ignored
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("ADR", "Pobox;;;;;;Country", .addNodeWithoutOrder("ADR", "Pobox;;;;;;Country",
Arrays.asList("Pobox", "", "", "", "", "", "Country"), Arrays.asList("Pobox", "", "", "", "", "", "Country"),
new TypeSet("HOME")); new TypeSet("HOME"));
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testPostalWithBothStructuredAndFormattedV21() { public void testPostalWithBothStructuredAndFormattedV21() {
@@ -628,7 +592,8 @@ public class VCardExporterTests extends VCardTestsBase {
private void testOrganizationCommon(int version) { private void testOrganizationCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Organization.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "CompanyX") .put(Organization.COMPANY, "CompanyX")
.put(Organization.DEPARTMENT, "DepartmentY") .put(Organization.DEPARTMENT, "DepartmentY")
.put(Organization.TITLE, "TitleZ") .put(Organization.TITLE, "TitleZ")
@@ -637,20 +602,20 @@ public class VCardExporterTests extends VCardTestsBase {
.put(Organization.PHONETIC_NAME, "PhoneticName!") // Ignored .put(Organization.PHONETIC_NAME, "PhoneticName!") // Ignored
.put(Organization.SYMBOL, "(^o^)/~~"); // Ignore him (her). .put(Organization.SYMBOL, "(^o^)/~~"); // Ignore him (her).
resolver.buildInput(Organization.CONTENT_ITEM_TYPE) entry.buildData(Organization.CONTENT_ITEM_TYPE)
.putNull(Organization.COMPANY) .putNull(Organization.COMPANY)
.put(Organization.DEPARTMENT, "DepartmentXX") .put(Organization.DEPARTMENT, "DepartmentXX")
.putNull(Organization.TITLE); .putNull(Organization.TITLE);
resolver.buildInput(Organization.CONTENT_ITEM_TYPE) entry.buildData(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "CompanyXYZ") .put(Organization.COMPANY, "CompanyXYZ")
.putNull(Organization.DEPARTMENT) .putNull(Organization.DEPARTMENT)
.put(Organization.TITLE, "TitleXYZYX"); .put(Organization.TITLE, "TitleXYZYX");
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
// Currently we do not use group but depend on the order. // Currently we do not use group but depend on the order.
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithOrder("ORG", "CompanyX;DepartmentY", .addNodeWithOrder("ORG", "CompanyX;DepartmentY",
Arrays.asList("CompanyX", "DepartmentY")) Arrays.asList("CompanyX", "DepartmentY"))
.addNodeWithOrder("TITLE", "TitleZ") .addNodeWithOrder("TITLE", "TitleZ")
@@ -658,7 +623,7 @@ public class VCardExporterTests extends VCardTestsBase {
.addNodeWithOrder("ORG", "CompanyXYZ") .addNodeWithOrder("ORG", "CompanyXYZ")
.addNodeWithOrder("TITLE", "TitleXYZYX"); .addNodeWithOrder("TITLE", "TitleXYZYX");
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testOrganizationV21() { public void testOrganizationV21() {
@@ -672,46 +637,47 @@ public class VCardExporterTests extends VCardTestsBase {
private void testImVariousTypeSupportCommon(int version) { private void testImVariousTypeSupportCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Im.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_AIM) .put(Im.PROTOCOL, Im.PROTOCOL_AIM)
.put(Im.DATA, "aim"); .put(Im.DATA, "aim");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_MSN) .put(Im.PROTOCOL, Im.PROTOCOL_MSN)
.put(Im.DATA, "msn"); .put(Im.DATA, "msn");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_YAHOO) .put(Im.PROTOCOL, Im.PROTOCOL_YAHOO)
.put(Im.DATA, "yahoo"); .put(Im.DATA, "yahoo");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_SKYPE) .put(Im.PROTOCOL, Im.PROTOCOL_SKYPE)
.put(Im.DATA, "skype"); .put(Im.DATA, "skype");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_QQ) .put(Im.PROTOCOL, Im.PROTOCOL_QQ)
.put(Im.DATA, "qq"); .put(Im.DATA, "qq");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK) .put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK)
.put(Im.DATA, "google talk"); .put(Im.DATA, "google talk");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_ICQ) .put(Im.PROTOCOL, Im.PROTOCOL_ICQ)
.put(Im.DATA, "icq"); .put(Im.DATA, "icq");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_JABBER) .put(Im.PROTOCOL, Im.PROTOCOL_JABBER)
.put(Im.DATA, "jabber"); .put(Im.DATA, "jabber");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_NETMEETING) .put(Im.PROTOCOL, Im.PROTOCOL_NETMEETING)
.put(Im.DATA, "netmeeting"); .put(Im.DATA, "netmeeting");
// No determined way to express unknown type... // No determined way to express unknown type...
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("X-JABBER", "jabber") .addNodeWithoutOrder("X-JABBER", "jabber")
.addNodeWithoutOrder("X-ICQ", "icq") .addNodeWithoutOrder("X-ICQ", "icq")
.addNodeWithoutOrder("X-GOOGLE-TALK", "google talk") .addNodeWithoutOrder("X-GOOGLE-TALK", "google talk")
@@ -722,7 +688,7 @@ public class VCardExporterTests extends VCardTestsBase {
.addNodeWithoutOrder("X-NETMEETING", "netmeeting") .addNodeWithoutOrder("X-NETMEETING", "netmeeting")
.addNodeWithoutOrder("X-AIM", "aim"); .addNodeWithoutOrder("X-AIM", "aim");
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testImBasiV21() { public void testImBasiV21() {
@@ -736,22 +702,23 @@ public class VCardExporterTests extends VCardTestsBase {
private void testImPrefHandlingCommon(int version) { private void testImPrefHandlingCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Im.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_AIM) .put(Im.PROTOCOL, Im.PROTOCOL_AIM)
.put(Im.DATA, "aim1"); .put(Im.DATA, "aim1");
resolver.buildInput(Im.CONTENT_ITEM_TYPE) entry.buildData(Im.CONTENT_ITEM_TYPE)
.put(Im.PROTOCOL, Im.PROTOCOL_AIM) .put(Im.PROTOCOL, Im.PROTOCOL_AIM)
.put(Im.DATA, "aim2") .put(Im.DATA, "aim2")
.put(Im.TYPE, Im.TYPE_HOME) .put(Im.TYPE, Im.TYPE_HOME)
.put(Im.IS_PRIMARY, 1); .put(Im.IS_PRIMARY, 1);
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("X-AIM", "aim1") .addNodeWithoutOrder("X-AIM", "aim1")
.addNodeWithoutOrder("X-AIM", "aim2", new TypeSet("HOME", "PREF")); .addNodeWithoutOrder("X-AIM", "aim2", new TypeSet("HOME", "PREF"));
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testImPrefHandlingV21() { public void testImPrefHandlingV21() {
@@ -765,21 +732,21 @@ public class VCardExporterTests extends VCardTestsBase {
private void testWebsiteCommon(int version) { private void testWebsiteCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Website.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Website.CONTENT_ITEM_TYPE)
.put(Website.URL, "http://website.example.android.com/index.html") .put(Website.URL, "http://website.example.android.com/index.html")
.put(Website.TYPE, Website.TYPE_BLOG); .put(Website.TYPE, Website.TYPE_BLOG);
resolver.buildInput(Website.CONTENT_ITEM_TYPE) entry.buildData(Website.CONTENT_ITEM_TYPE)
.put(Website.URL, "ftp://ftp.example.android.com/index.html") .put(Website.URL, "ftp://ftp.example.android.com/index.html")
.put(Website.TYPE, Website.TYPE_FTP); .put(Website.TYPE, Website.TYPE_FTP);
// We drop TYPE information since vCard (especially 3.0) does not allow us to emit it. // We drop TYPE information since vCard (especially 3.0) does not allow us to emit it.
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("URL", "ftp://ftp.example.android.com/index.html") .addNodeWithoutOrder("URL", "ftp://ftp.example.android.com/index.html")
.addNodeWithoutOrder("URL", "http://website.example.android.com/index.html"); .addNodeWithoutOrder("URL", "http://website.example.android.com/index.html");
verifier.verify();
verifyOneComposition(resolver, handler, version);
} }
public void testWebsiteV21() { public void testWebsiteV21() {
@@ -793,32 +760,29 @@ public class VCardExporterTests extends VCardTestsBase {
private void testEventCommon(int version) { private void testEventCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Event.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Event.CONTENT_ITEM_TYPE)
.put(Event.TYPE, Event.TYPE_ANNIVERSARY) .put(Event.TYPE, Event.TYPE_ANNIVERSARY)
.put(Event.START_DATE, "1982-06-16"); .put(Event.START_DATE, "1982-06-16");
entry.buildData(Event.CONTENT_ITEM_TYPE)
resolver.buildInput(Event.CONTENT_ITEM_TYPE)
.put(Event.TYPE, Event.TYPE_BIRTHDAY) .put(Event.TYPE, Event.TYPE_BIRTHDAY)
.put(Event.START_DATE, "2008-10-22"); .put(Event.START_DATE, "2008-10-22");
entry.buildData(Event.CONTENT_ITEM_TYPE)
resolver.buildInput(Event.CONTENT_ITEM_TYPE)
.put(Event.TYPE, Event.TYPE_OTHER) .put(Event.TYPE, Event.TYPE_OTHER)
.put(Event.START_DATE, "2018-03-12"); .put(Event.START_DATE, "2018-03-12");
entry.buildData(Event.CONTENT_ITEM_TYPE)
resolver.buildInput(Event.CONTENT_ITEM_TYPE)
.put(Event.TYPE, Event.TYPE_CUSTOM) .put(Event.TYPE, Event.TYPE_CUSTOM)
.put(Event.LABEL, "The last day") .put(Event.LABEL, "The last day")
.put(Event.START_DATE, "When the Tower of Hanoi with 64 rings is completed."); .put(Event.START_DATE, "When the Tower of Hanoi with 64 rings is completed.");
entry.buildData(Event.CONTENT_ITEM_TYPE)
resolver.buildInput(Event.CONTENT_ITEM_TYPE)
.put(Event.TYPE, Event.TYPE_BIRTHDAY) .put(Event.TYPE, Event.TYPE_BIRTHDAY)
.put(Event.START_DATE, "2009-05-19"); .put(Event.START_DATE, "2009-05-19");
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithoutOrder("BDAY", "2008-10-22"); .addNodeWithoutOrder("BDAY", "2008-10-22");
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testEventV21() { public void testEventV21() {
@@ -832,19 +796,19 @@ public class VCardExporterTests extends VCardTestsBase {
private void testNoteCommon(int version) { private void testNoteCommon(int version) {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Note.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(Note.CONTENT_ITEM_TYPE)
.put(Note.NOTE, "note1"); .put(Note.NOTE, "note1");
entry.buildData(Note.CONTENT_ITEM_TYPE)
resolver.buildInput(Note.CONTENT_ITEM_TYPE)
.put(Note.NOTE, "note2") .put(Note.NOTE, "note2")
.put(Note.IS_PRIMARY, 1); // Just ignored. .put(Note.IS_PRIMARY, 1); // Just ignored.
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithOrder("NOTE", "note1") .addNodeWithOrder("NOTE", "note1")
.addNodeWithOrder("NOTE", "note2"); .addNodeWithOrder("NOTE", "note2");
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testNoteV21() { public void testNoteV21() {
@@ -858,23 +822,23 @@ public class VCardExporterTests extends VCardTestsBase {
private void testPhotoCommon(int version) { private void testPhotoCommon(int version) {
final boolean isV30 = version == V30; final boolean isV30 = version == V30;
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) ContactEntry entry = resolver.buildContactEntry();
entry.buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "PhotoTest"); .put(StructuredName.FAMILY_NAME, "PhotoTest");
entry.buildData(Photo.CONTENT_ITEM_TYPE)
resolver.buildInput(Photo.CONTENT_ITEM_TYPE)
.put(Photo.PHOTO, sPhotoByteArray); .put(Photo.PHOTO, sPhotoByteArray);
ContentValues contentValuesForPhoto = new ContentValues(); ContentValues contentValuesForPhoto = new ContentValues();
contentValuesForPhoto.put("ENCODING", (isV30 ? "b" : "BASE64")); contentValuesForPhoto.put("ENCODING", (isV30 ? "b" : "BASE64"));
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
handler.addPropertyNodesVerifier() verifier.addPropertyNodesVerifierElem()
.addNodeWithoutOrder("FN", "PhotoTest") .addNodeWithoutOrder("FN", "PhotoTest")
.addNodeWithoutOrder("N", "PhotoTest;;;;", .addNodeWithoutOrder("N", "PhotoTest;;;;",
Arrays.asList("PhotoTest", "", "", "", "")) Arrays.asList("PhotoTest", "", "", "", ""))
.addNodeWithOrder("PHOTO", null, null, sPhotoByteArray, .addNodeWithOrder("PHOTO", null, null, sPhotoByteArray,
contentValuesForPhoto, new TypeSet("JPEG"), null); contentValuesForPhoto, new TypeSet("JPEG"), null);
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
public void testPhotoV21() { public void testPhotoV21() {
@@ -888,21 +852,22 @@ public class VCardExporterTests extends VCardTestsBase {
public void testV30HandleEscape() { public void testV30HandleEscape() {
final int version = V30; final int version = V30;
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(StructuredName.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "\\") .put(StructuredName.FAMILY_NAME, "\\")
.put(StructuredName.GIVEN_NAME, ";") .put(StructuredName.GIVEN_NAME, ";")
.put(StructuredName.MIDDLE_NAME, ",") .put(StructuredName.MIDDLE_NAME, ",")
.put(StructuredName.PREFIX, "\n") .put(StructuredName.PREFIX, "\n")
.put(StructuredName.DISPLAY_NAME, "[<{Unescaped:Asciis}>]"); .put(StructuredName.DISPLAY_NAME, "[<{Unescaped:Asciis}>]");
VCardVerificationHandler handler = new VCardVerificationHandler(this, version); VCardVerifier verifier = new VCardVerifier(resolver, version);
// Verifies the vCard String correctly escapes each character which must be escaped. // Verifies the vCard String correctly escapes each character which must be escaped.
handler.addExpectedLine("N:\\\\;\\;;\\,;\\n;") verifier.addLineVerifier()
.addExpectedLine("FN:[<{Unescaped:Asciis}>]"); .addExpected("N:\\\\;\\;;\\,;\\n;")
handler.addPropertyNodesVerifier() .addExpected("FN:[<{Unescaped:Asciis}>]");
verifier.addPropertyNodesVerifierElem()
.addNodeWithoutOrder("FN", "[<{Unescaped:Asciis}>]") .addNodeWithoutOrder("FN", "[<{Unescaped:Asciis}>]")
.addNodeWithoutOrder("N", Arrays.asList("\\", ";", ",", "\n", "")); .addNodeWithoutOrder("N", Arrays.asList("\\", ";", ",", "\n", ""));
verifyOneComposition(resolver, handler, version); verifier.verify();
} }
/** /**
@@ -912,18 +877,16 @@ public class VCardExporterTests extends VCardTestsBase {
*/ */
public void testNickNameV21() { public void testNickNameV21() {
ExportTestResolver resolver = new ExportTestResolver(); ExportTestResolver resolver = new ExportTestResolver();
resolver.buildInput(Nickname.CONTENT_ITEM_TYPE) resolver.buildContactEntry().buildData(Nickname.CONTENT_ITEM_TYPE)
.put(Nickname.NAME, "Nicky"); .put(Nickname.NAME, "Nicky");
VCardVerificationHandler handler = new VCardVerificationHandler(this, V21); VCardVerifier verifier = new VCardVerifier(resolver, V21);
handler.addPropertyVerifierWithEmptyName() verifier.addPropertyNodesVerifierWithEmptyName()
.addNodeWithOrder("X-ANDROID-CUSTOM", .addNodeWithOrder("X-ANDROID-CUSTOM",
Nickname.CONTENT_ITEM_TYPE + ";Nicky;;;;;;;;;;;;;;"); Nickname.CONTENT_ITEM_TYPE + ";Nicky;;;;;;;;;;;;;;");
verifier.addImportVerifier()
handler.addContentValuesVerifier() .addExpected(Nickname.CONTENT_ITEM_TYPE)
.buildExpected(Nickname.CONTENT_ITEM_TYPE)
.put(Nickname.NAME, "Nicky"); .put(Nickname.NAME, "Nicky");
verifier.verify();
verifyOneComposition(resolver, handler, V21);
} }
} }

View File

@@ -19,7 +19,6 @@ package com.android.unit_tests.vcard;
import android.content.ContentValues; import android.content.ContentValues;
import android.pim.vcard.VCardConfig; import android.pim.vcard.VCardConfig;
import android.pim.vcard.VCardParser_V21; import android.pim.vcard.VCardParser_V21;
import android.pim.vcard.VCardParser_V30;
import android.pim.vcard.exception.VCardException; import android.pim.vcard.exception.VCardException;
import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -33,7 +32,7 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website; import android.provider.ContactsContract.CommonDataKinds.Website;
import com.android.unit_tests.R; import com.android.unit_tests.R;
import com.android.unit_tests.vcard.PropertyNodesVerifier.TypeSet; import com.android.unit_tests.vcard.PropertyNodesVerifierElem.TypeSet;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -410,53 +409,52 @@ public class VCardImporterTests extends VCardTestsBase {
} }
public void testV21SimpleCase1_Parsing() throws IOException, VCardException { public void testV21SimpleCase1_Parsing() throws IOException, VCardException {
VCardParser_V21 parser = new VCardParser_V21(); PropertyNodesVerifier verifier = new PropertyNodesVerifier(this);
VNodeBuilder builder = new VNodeBuilder(); verifier.addPropertyNodesVerifierElem()
InputStream is = getContext().getResources().openRawResource(R.raw.v21_simple_1);
assertEquals(true, parser.parse(is,"ISO-8859-1", builder));
is.close();
assertEquals(1, builder.vNodeList.size());
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this)
.addNodeWithOrder("N", "Ando;Roid;", Arrays.asList("Ando", "Roid", "")); .addNodeWithOrder("N", "Ando;Roid;", Arrays.asList("Ando", "Roid", ""));
verifier.verify(builder.vNodeList.get(0)); verifier.verify(R.raw.v21_simple_1, V21);
} }
public void testV21SimpleCase1_Type_Generic() throws IOException, VCardException { public void testV21SimpleCase1_Type_Generic() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) verifier.addImportVerifierElem()
.put(StructuredName.FAMILY_NAME, "Ando") .addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.GIVEN_NAME, "Roid") .put(StructuredName.FAMILY_NAME, "Ando")
.put(StructuredName.DISPLAY_NAME, "Roid Ando"); .put(StructuredName.GIVEN_NAME, "Roid")
.put(StructuredName.DISPLAY_NAME, "Roid Ando");
verifier.verify(R.raw.v21_simple_1, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8); verifier.verify(R.raw.v21_simple_1, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
} }
public void testV21SimpleCase1_Type_Japanese() throws IOException, VCardException { public void testV21SimpleCase1_Type_Japanese() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) verifier.addImportVerifierElem()
.put(StructuredName.FAMILY_NAME, "Ando") .addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.GIVEN_NAME, "Roid") .put(StructuredName.FAMILY_NAME, "Ando")
// If name-related strings only contains printable Ascii, .put(StructuredName.GIVEN_NAME, "Roid")
// the order is remained to be US's: // If name-related strings only contains printable Ascii,
// "Prefix Given Middle Family Suffix" // the order is remained to be US's:
.put(StructuredName.DISPLAY_NAME, "Roid Ando"); // "Prefix Given Middle Family Suffix"
.put(StructuredName.DISPLAY_NAME, "Roid Ando");
verifier.verify(R.raw.v21_simple_1, VCardConfig.VCARD_TYPE_V21_JAPANESE_SJIS); verifier.verify(R.raw.v21_simple_1, VCardConfig.VCARD_TYPE_V21_JAPANESE_SJIS);
} }
public void testV21SimpleCase2() throws IOException, VCardException { public void testV21SimpleCase2() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) verifier.addImportVerifierElem()
.put(StructuredName.DISPLAY_NAME, "Ando Roid"); .addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.DISPLAY_NAME, "Ando Roid");
verifier.verify(R.raw.v21_simple_2, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8); verifier.verify(R.raw.v21_simple_2, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
} }
public void testV21SimpleCase3() throws IOException, VCardException { public void testV21SimpleCase3() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) verifier.addImportVerifierElem()
.put(StructuredName.FAMILY_NAME, "Ando") .addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.GIVEN_NAME, "Roid") .put(StructuredName.FAMILY_NAME, "Ando")
// "FN" field should be prefered since it should contain the original order .put(StructuredName.GIVEN_NAME, "Roid")
// intended by the author of the file. // "FN" field should be prefered since it should contain the original
.put(StructuredName.DISPLAY_NAME, "Ando Roid"); // order intended by the author of the file.
.put(StructuredName.DISPLAY_NAME, "Ando Roid");
verifier.verify(R.raw.v21_simple_3, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8); verifier.verify(R.raw.v21_simple_3, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
} }
@@ -464,18 +462,13 @@ public class VCardImporterTests extends VCardTestsBase {
* Tests ';' is properly handled by VCardParser implementation. * Tests ';' is properly handled by VCardParser implementation.
*/ */
public void testV21BackslashCase_Parsing() throws IOException, VCardException { public void testV21BackslashCase_Parsing() throws IOException, VCardException {
VCardParser_V21 parser = new VCardParser_V21(); PropertyNodesVerifier verifier = new PropertyNodesVerifier(this);
VNodeBuilder builder = new VNodeBuilder(); verifier.addPropertyNodesVerifierElem()
InputStream is = getContext().getResources().openRawResource(R.raw.v21_backslash);
assertEquals(true, parser.parse(is,"ISO-8859-1", builder));
is.close();
assertEquals(1, builder.vNodeList.size());
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this)
.addNodeWithOrder("VERSION", "2.1") .addNodeWithOrder("VERSION", "2.1")
.addNodeWithOrder("N", ";A;B\\;C\\;;D;:E;\\\\;", .addNodeWithOrder("N", ";A;B\\;C\\;;D;:E;\\\\;",
Arrays.asList("", "A;B\\", "C\\;", "D", ":E", "\\\\", "")) Arrays.asList("", "A;B\\", "C\\;", "D", ":E", "\\\\", ""))
.addNodeWithOrder("FN", "A;B\\C\\;D:E\\\\"); .addNodeWithOrder("FN", "A;B\\C\\;D:E\\\\");
verifier.verify(builder.vNodeList.get(0)); verifier.verify(R.raw.v21_backslash, V21);
} }
/** /**
@@ -483,23 +476,25 @@ public class VCardImporterTests extends VCardTestsBase {
* inserts name related data. * inserts name related data.
*/ */
public void testV21BackslashCase() throws IOException, VCardException { public void testV21BackslashCase() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) verifier.addImportVerifierElem()
// FAMILY_NAME is empty and removed in this test... .addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.GIVEN_NAME, "A;B\\") // FAMILY_NAME is empty and removed in this test...
.put(StructuredName.MIDDLE_NAME, "C\\;") .put(StructuredName.GIVEN_NAME, "A;B\\")
.put(StructuredName.PREFIX, "D") .put(StructuredName.MIDDLE_NAME, "C\\;")
.put(StructuredName.SUFFIX, ":E") .put(StructuredName.PREFIX, "D")
.put(StructuredName.DISPLAY_NAME, "A;B\\C\\;D:E\\\\"); .put(StructuredName.SUFFIX, ":E")
.put(StructuredName.DISPLAY_NAME, "A;B\\C\\;D:E\\\\");
verifier.verify(R.raw.v21_backslash, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8); verifier.verify(R.raw.v21_backslash, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
} }
public void testOrgBeforTitle() throws IOException, VCardException { public void testOrgBeforTitle() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) ImportVerifierElem elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.DISPLAY_NAME, "Normal Guy"); .put(StructuredName.DISPLAY_NAME, "Normal Guy");
verifier.buildExpected(Organization.CONTENT_ITEM_TYPE) elem.addExpected(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "Company") .put(Organization.COMPANY, "Company")
.put(Organization.DEPARTMENT, "Organization Devision Room Sheet No.") .put(Organization.DEPARTMENT, "Organization Devision Room Sheet No.")
.put(Organization.TITLE, "Excellent Janitor") .put(Organization.TITLE, "Excellent Janitor")
@@ -508,11 +503,12 @@ public class VCardImporterTests extends VCardTestsBase {
} }
public void testTitleBeforOrg() throws IOException, VCardException { public void testTitleBeforOrg() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) ImportVerifierElem elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.DISPLAY_NAME, "Nice Guy"); .put(StructuredName.DISPLAY_NAME, "Nice Guy");
verifier.buildExpected(Organization.CONTENT_ITEM_TYPE) elem.addExpected(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "Marverous") .put(Organization.COMPANY, "Marverous")
.put(Organization.DEPARTMENT, "Perfect Great Good Bad Poor") .put(Organization.DEPARTMENT, "Perfect Great Good Bad Poor")
.put(Organization.TITLE, "Cool Title") .put(Organization.TITLE, "Cool Title")
@@ -525,45 +521,46 @@ public class VCardImporterTests extends VCardTestsBase {
* The data contain three cases: one "PREF", no "PREF" and multiple "PREF", in each type. * The data contain three cases: one "PREF", no "PREF" and multiple "PREF", in each type.
*/ */
public void testV21PrefToIsPrimary() throws IOException, VCardException { public void testV21PrefToIsPrimary() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) ImportVerifierElem elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) .put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.DISPLAY_NAME, "Smith"); .put(StructuredName.DISPLAY_NAME, "Smith");
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "1") .put(Phone.NUMBER, "1")
.put(Phone.TYPE, Phone.TYPE_HOME); .put(Phone.TYPE, Phone.TYPE_HOME);
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "2") .put(Phone.NUMBER, "2")
.put(Phone.TYPE, Phone.TYPE_WORK) .put(Phone.TYPE, Phone.TYPE_WORK)
.put(Phone.IS_PRIMARY, 1); .put(Phone.IS_PRIMARY, 1);
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.NUMBER, "3") .put(Phone.NUMBER, "3")
.put(Phone.TYPE, Phone.TYPE_ISDN); .put(Phone.TYPE, Phone.TYPE_ISDN);
verifier.buildExpected(Email.CONTENT_ITEM_TYPE) elem.addExpected(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "test@example.com") .put(Email.DATA, "test@example.com")
.put(Email.TYPE, Email.TYPE_HOME) .put(Email.TYPE, Email.TYPE_HOME)
.put(Email.IS_PRIMARY, 1); .put(Email.IS_PRIMARY, 1);
verifier.buildExpected(Email.CONTENT_ITEM_TYPE) elem.addExpected(Email.CONTENT_ITEM_TYPE)
.put(Email.DATA, "test2@examination.com") .put(Email.DATA, "test2@examination.com")
.put(Email.TYPE, Email.TYPE_MOBILE) .put(Email.TYPE, Email.TYPE_MOBILE)
.put(Email.IS_PRIMARY, 1); .put(Email.IS_PRIMARY, 1);
verifier.buildExpected(Organization.CONTENT_ITEM_TYPE) elem.addExpected(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "Company") .put(Organization.COMPANY, "Company")
.put(Organization.TITLE, "Engineer") .put(Organization.TITLE, "Engineer")
.put(Organization.TYPE, Organization.TYPE_WORK); .put(Organization.TYPE, Organization.TYPE_WORK);
verifier.buildExpected(Organization.CONTENT_ITEM_TYPE) elem.addExpected(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "Mystery") .put(Organization.COMPANY, "Mystery")
.put(Organization.TITLE, "Blogger") .put(Organization.TITLE, "Blogger")
.put(Organization.TYPE, Organization.TYPE_WORK); .put(Organization.TYPE, Organization.TYPE_WORK);
verifier.buildExpected(Organization.CONTENT_ITEM_TYPE) elem.addExpected(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "Poetry") .put(Organization.COMPANY, "Poetry")
.put(Organization.TITLE, "Poet") .put(Organization.TITLE, "Poet")
.put(Organization.TYPE, Organization.TYPE_WORK); .put(Organization.TYPE, Organization.TYPE_WORK);
@@ -574,17 +571,12 @@ public class VCardImporterTests extends VCardTestsBase {
* Tests all the properties in a complicated vCard are correctly parsed by the VCardParser. * Tests all the properties in a complicated vCard are correctly parsed by the VCardParser.
*/ */
public void testV21ComplicatedCase_Parsing() throws IOException, VCardException { public void testV21ComplicatedCase_Parsing() throws IOException, VCardException {
VCardParser_V21 parser = new VCardParser_V21();
VNodeBuilder builder = new VNodeBuilder();
InputStream is = getContext().getResources().openRawResource(R.raw.v21_complicated);
assertEquals(true, parser.parse(is,"ISO-8859-1", builder));
is.close();
assertEquals(1, builder.vNodeList.size());
ContentValues contentValuesForQP = new ContentValues(); ContentValues contentValuesForQP = new ContentValues();
contentValuesForQP.put("ENCODING", "QUOTED-PRINTABLE"); contentValuesForQP.put("ENCODING", "QUOTED-PRINTABLE");
ContentValues contentValuesForPhoto = new ContentValues(); ContentValues contentValuesForPhoto = new ContentValues();
contentValuesForPhoto.put("ENCODING", "BASE64"); contentValuesForPhoto.put("ENCODING", "BASE64");
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this) PropertyNodesVerifier verifier = new PropertyNodesVerifier(this);
verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("VERSION", "2.1") .addNodeWithOrder("VERSION", "2.1")
.addNodeWithOrder("N", "Gump;Forrest;Hoge;Pos;Tao", .addNodeWithOrder("N", "Gump;Forrest;Hoge;Pos;Tao",
Arrays.asList("Gump", "Forrest", "Hoge", "Pos", "Tao")) Arrays.asList("Gump", "Forrest", "Hoge", "Pos", "Tao"))
@@ -631,7 +623,7 @@ public class VCardImporterTests extends VCardTestsBase {
.addNodeWithOrder("GEO", "35.6563854,139.6994233") .addNodeWithOrder("GEO", "35.6563854,139.6994233")
.addNodeWithOrder("URL", "http://www.example.com/") .addNodeWithOrder("URL", "http://www.example.com/")
.addNodeWithOrder("REV", "20080424T195243Z"); .addNodeWithOrder("REV", "20080424T195243Z");
verifier.verify(builder.vNodeList.get(0)); verifier.verify(R.raw.v21_complicated, V21);
} }
/** /**
@@ -639,8 +631,9 @@ public class VCardImporterTests extends VCardTestsBase {
* into ContentResolver. * into ContentResolver.
*/ */
public void testV21ComplicatedCase() throws IOException, VCardException { public void testV21ComplicatedCase() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) ImportVerifierElem elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "Gump") .put(StructuredName.FAMILY_NAME, "Gump")
.put(StructuredName.GIVEN_NAME, "Forrest") .put(StructuredName.GIVEN_NAME, "Forrest")
.put(StructuredName.MIDDLE_NAME, "Hoge") .put(StructuredName.MIDDLE_NAME, "Hoge")
@@ -648,36 +641,36 @@ public class VCardImporterTests extends VCardTestsBase {
.put(StructuredName.SUFFIX, "Tao") .put(StructuredName.SUFFIX, "Tao")
.put(StructuredName.DISPLAY_NAME, "Joe Due"); .put(StructuredName.DISPLAY_NAME, "Joe Due");
verifier.buildExpected(Organization.CONTENT_ITEM_TYPE) elem.addExpected(Organization.CONTENT_ITEM_TYPE)
.put(Organization.TYPE, Organization.TYPE_WORK) .put(Organization.TYPE, Organization.TYPE_WORK)
.put(Organization.COMPANY, "Gump Shrimp Co.") .put(Organization.COMPANY, "Gump Shrimp Co.")
.put(Organization.DEPARTMENT, "Sales Dept.;Manager Fish keeper") .put(Organization.DEPARTMENT, "Sales Dept.;Manager Fish keeper")
.put(Organization.TITLE, "Shrimp Man"); .put(Organization.TITLE, "Shrimp Man");
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_WORK) .put(Phone.TYPE, Phone.TYPE_WORK)
// Phone number is expected to be formated with NAMP format in default. // Phone number is expected to be formated with NAMP format in default.
.put(Phone.NUMBER, "111-555-1212"); .put(Phone.NUMBER, "111-555-1212");
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_HOME) .put(Phone.TYPE, Phone.TYPE_HOME)
.put(Phone.NUMBER, "404-555-1212"); .put(Phone.NUMBER, "404-555-1212");
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_MOBILE) .put(Phone.TYPE, Phone.TYPE_MOBILE)
.put(Phone.NUMBER, "031-111-1111"); .put(Phone.NUMBER, "031-111-1111");
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM) .put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "VIDEO") .put(Phone.LABEL, "VIDEO")
.put(Phone.NUMBER, "032-222-2222"); .put(Phone.NUMBER, "032-222-2222");
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM) .put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "VOICE") .put(Phone.LABEL, "VOICE")
.put(Phone.NUMBER, "033-333-3333"); .put(Phone.NUMBER, "033-333-3333");
verifier.buildExpected(StructuredPostal.CONTENT_ITEM_TYPE) elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
.put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK) .put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK)
.put(StructuredPostal.COUNTRY, "United States of America") .put(StructuredPostal.COUNTRY, "United States of America")
.put(StructuredPostal.POSTCODE, "30314") .put(StructuredPostal.POSTCODE, "30314")
@@ -687,7 +680,7 @@ public class VCardImporterTests extends VCardTestsBase {
.put(StructuredPostal.FORMATTED_ADDRESS, .put(StructuredPostal.FORMATTED_ADDRESS,
"100 Waters Edge Baytown LA 30314 United States of America"); "100 Waters Edge Baytown LA 30314 United States of America");
verifier.buildExpected(StructuredPostal.CONTENT_ITEM_TYPE) elem.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
.put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME) .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME)
.put(StructuredPostal.COUNTRY, "United States of America") .put(StructuredPostal.COUNTRY, "United States of America")
.put(StructuredPostal.POSTCODE, "30314") .put(StructuredPostal.POSTCODE, "30314")
@@ -697,46 +690,41 @@ public class VCardImporterTests extends VCardTestsBase {
.put(StructuredPostal.FORMATTED_ADDRESS, .put(StructuredPostal.FORMATTED_ADDRESS,
"42 Plantation St. Baytown LA 30314 United States of America"); "42 Plantation St. Baytown LA 30314 United States of America");
verifier.buildExpected(Email.CONTENT_ITEM_TYPE) elem.addExpected(Email.CONTENT_ITEM_TYPE)
// "TYPE=INTERNET" -> TYPE_CUSTOM + the label "INTERNET" // "TYPE=INTERNET" -> TYPE_CUSTOM + the label "INTERNET"
.put(Email.TYPE, Email.TYPE_CUSTOM) .put(Email.TYPE, Email.TYPE_CUSTOM)
.put(Email.LABEL, "INTERNET") .put(Email.LABEL, "INTERNET")
.put(Email.DATA, "forrestgump@walladalla.com") .put(Email.DATA, "forrestgump@walladalla.com")
.put(Email.IS_PRIMARY, 1); .put(Email.IS_PRIMARY, 1);
verifier.buildExpected(Email.CONTENT_ITEM_TYPE) elem.addExpected(Email.CONTENT_ITEM_TYPE)
.put(Email.TYPE, Email.TYPE_MOBILE) .put(Email.TYPE, Email.TYPE_MOBILE)
.put(Email.DATA, "cell@example.com"); .put(Email.DATA, "cell@example.com");
verifier.buildExpected(Note.CONTENT_ITEM_TYPE) elem.addExpected(Note.CONTENT_ITEM_TYPE)
.put(Note.NOTE, "The following note is the example from RFC 2045."); .put(Note.NOTE, "The following note is the example from RFC 2045.");
verifier.buildExpected(Note.CONTENT_ITEM_TYPE) elem.addExpected(Note.CONTENT_ITEM_TYPE)
.put(Note.NOTE, .put(Note.NOTE,
"Now's the time for all folk to come to the aid of their country."); "Now's the time for all folk to come to the aid of their country.");
verifier.buildExpected(Photo.CONTENT_ITEM_TYPE) elem.addExpected(Photo.CONTENT_ITEM_TYPE)
// No information about its image format can be inserted. // No information about its image format can be inserted.
.put(Photo.PHOTO, sPhotoByteArrayForComplicatedCase); .put(Photo.PHOTO, sPhotoByteArrayForComplicatedCase);
verifier.buildExpected(Event.CONTENT_ITEM_TYPE) elem.addExpected(Event.CONTENT_ITEM_TYPE)
.put(Event.START_DATE, "19800101") .put(Event.START_DATE, "19800101")
.put(Event.TYPE, Event.TYPE_BIRTHDAY); .put(Event.TYPE, Event.TYPE_BIRTHDAY);
verifier.buildExpected(Website.CONTENT_ITEM_TYPE) elem.addExpected(Website.CONTENT_ITEM_TYPE)
.put(Website.URL, "http://www.example.com/") .put(Website.URL, "http://www.example.com/")
.put(Website.TYPE, Website.TYPE_HOMEPAGE); .put(Website.TYPE, Website.TYPE_HOMEPAGE);
verifier.verify(R.raw.v21_complicated, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8); verifier.verify(R.raw.v21_complicated, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
} }
public void testV30Simple_Parsing() throws IOException, VCardException { public void testV30Simple_Parsing() throws IOException, VCardException {
VCardParser_V21 parser = new VCardParser_V30(); PropertyNodesVerifier verifier = new PropertyNodesVerifier(this);
VNodeBuilder builder = new VNodeBuilder(); verifier.addPropertyNodesVerifierElem()
InputStream is = getContext().getResources().openRawResource(R.raw.v30_simple);
assertEquals(true, parser.parse(is,"ISO-8859-1", builder));
is.close();
assertEquals(1, builder.vNodeList.size());
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this)
.addNodeWithOrder("VERSION", "3.0") .addNodeWithOrder("VERSION", "3.0")
.addNodeWithOrder("FN", "And Roid") .addNodeWithOrder("FN", "And Roid")
.addNodeWithOrder("N", "And;Roid;;;", Arrays.asList("And", "Roid", "", "", "")) .addNodeWithOrder("N", "And;Roid;;;", Arrays.asList("And", "Roid", "", "", ""))
@@ -749,24 +737,22 @@ public class VCardImporterTests extends VCardTestsBase {
.addNodeWithOrder("X-GN", "group0") .addNodeWithOrder("X-GN", "group0")
.addNodeWithOrder("X-REDUCTION", "0") .addNodeWithOrder("X-REDUCTION", "0")
.addNodeWithOrder("REV", "20081031T065854Z"); .addNodeWithOrder("REV", "20081031T065854Z");
verifier.verify(builder.vNodeList.get(0)); verifier.verify(R.raw.v30_simple, V30);
} }
public void testV30Simple() throws IOException, VCardException { public void testV30Simple() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
ImportVerifierElem elem = verifier.addImportVerifierElem();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "And") .put(StructuredName.FAMILY_NAME, "And")
.put(StructuredName.GIVEN_NAME, "Roid") .put(StructuredName.GIVEN_NAME, "Roid")
.put(StructuredName.DISPLAY_NAME, "And Roid") .put(StructuredName.DISPLAY_NAME, "And Roid")
.put(StructuredName.PHONETIC_GIVEN_NAME, "android"); .put(StructuredName.PHONETIC_GIVEN_NAME, "android");
elem.addExpected(Organization.CONTENT_ITEM_TYPE)
verifier.buildExpected(Organization.CONTENT_ITEM_TYPE)
.put(Organization.COMPANY, "Open") .put(Organization.COMPANY, "Open")
.put(Organization.DEPARTMENT, "Handset Alliance") .put(Organization.DEPARTMENT, "Handset Alliance")
.put(Organization.TYPE, Organization.TYPE_WORK); .put(Organization.TYPE, Organization.TYPE_WORK);
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM) .put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "VOICE") .put(Phone.LABEL, "VOICE")
.put(Phone.NUMBER, "030-000-0000") .put(Phone.NUMBER, "030-000-0000")
@@ -775,18 +761,13 @@ public class VCardImporterTests extends VCardTestsBase {
} }
public void testV21Japanese1_Parsing() throws IOException, VCardException { public void testV21Japanese1_Parsing() throws IOException, VCardException {
VCardParser_V21 parser = new VCardParser_V21();
VNodeBuilder builder = new VNodeBuilder();
InputStream is = getContext().getResources().openRawResource(R.raw.v21_japanese_1);
assertEquals(true, parser.parse(is,"ISO-8859-1", builder));
is.close();
assertEquals(1, builder.vNodeList.size());
ContentValues contentValuesForShiftJis = new ContentValues();
contentValuesForShiftJis.put("CHARSET", "SHIFT_JIS");
// Though Japanese careers append ";;;;" at the end of the value of "SOUND", // Though Japanese careers append ";;;;" at the end of the value of "SOUND",
// vCard 2.1/3.0 specification does not allow multiple values. // vCard 2.1/3.0 specification does not allow multiple values.
// Do not need to handle it as multiple values. // Do not need to handle it as multiple values.
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this) ContentValues contentValuesForShiftJis = new ContentValues();
contentValuesForShiftJis.put("CHARSET", "SHIFT_JIS");
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this);
verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("VERSION", "2.1", null, null, null, null, null) .addNodeWithOrder("VERSION", "2.1", null, null, null, null, null)
.addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9;;;;", .addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9;;;;",
Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9", "", "", "", ""), Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9", "", "", "", ""),
@@ -797,13 +778,14 @@ public class VCardImporterTests extends VCardTestsBase {
new TypeSet("X-IRMC-N"), null) new TypeSet("X-IRMC-N"), null)
.addNodeWithOrder("TEL", "0300000000", null, null, null, .addNodeWithOrder("TEL", "0300000000", null, null, null,
new TypeSet("VOICE", "PREF"), null); new TypeSet("VOICE", "PREF"), null);
verifier.verify(builder.vNodeList.get(0)); verifier.verify(R.raw.v21_japanese_1, VCardConfig.VCARD_TYPE_V21_JAPANESE_SJIS);
} }
private void testV21Japanese1Common(int resId, int vcardType, boolean japanese) private void testV21Japanese1Common(int resId, int vcardType, boolean japanese)
throws IOException, VCardException { throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifier verifier = new ImportVerifier();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) ImportVerifierElem elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9") .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9")
.put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9") .put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9")
// While vCard parser does not split "SOUND" property values, // While vCard parser does not split "SOUND" property values,
@@ -811,7 +793,7 @@ public class VCardImporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_FAMILY_NAME, .put(StructuredName.PHONETIC_FAMILY_NAME,
"\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E"); "\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E");
verifier.buildExpected(Phone.CONTENT_ITEM_TYPE) elem.addExpected(Phone.CONTENT_ITEM_TYPE)
// Phone number formatting is different. // Phone number formatting is different.
.put(Phone.NUMBER, (japanese ? "03-0000-0000" : "030-000-0000")) .put(Phone.NUMBER, (japanese ? "03-0000-0000" : "030-000-0000"))
.put(Phone.TYPE, Phone.TYPE_CUSTOM) .put(Phone.TYPE, Phone.TYPE_CUSTOM)
@@ -849,18 +831,13 @@ public class VCardImporterTests extends VCardTestsBase {
} }
public void testV21Japanese2_Parsing() throws IOException, VCardException { public void testV21Japanese2_Parsing() throws IOException, VCardException {
VCardParser_V21 parser = new VCardParser_V21();
VNodeBuilder builder = new VNodeBuilder();
InputStream is = getContext().getResources().openRawResource(R.raw.v21_japanese_2);
assertEquals(true, parser.parse(is,"ISO-8859-1", builder));
is.close();
assertEquals(1, builder.vNodeList.size());
ContentValues contentValuesForShiftJis = new ContentValues(); ContentValues contentValuesForShiftJis = new ContentValues();
contentValuesForShiftJis.put("CHARSET", "SHIFT_JIS"); contentValuesForShiftJis.put("CHARSET", "SHIFT_JIS");
ContentValues contentValuesForQPAndSJ = new ContentValues(); ContentValues contentValuesForQPAndSJ = new ContentValues();
contentValuesForQPAndSJ.put("ENCODING", "QUOTED-PRINTABLE"); contentValuesForQPAndSJ.put("ENCODING", "QUOTED-PRINTABLE");
contentValuesForQPAndSJ.put("CHARSET", "SHIFT_JIS"); contentValuesForQPAndSJ.put("CHARSET", "SHIFT_JIS");
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this) PropertyNodesVerifier verifier = new PropertyNodesVerifier(this);
verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("VERSION", "2.1") .addNodeWithOrder("VERSION", "2.1")
.addNodeWithOrder("N", "\u5B89\u85E4;\u30ED\u30A4\u30C9\u0031;;;", .addNodeWithOrder("N", "\u5B89\u85E4;\u30ED\u30A4\u30C9\u0031;;;",
Arrays.asList("\u5B89\u85E4", "\u30ED\u30A4\u30C9\u0031", Arrays.asList("\u5B89\u85E4", "\u30ED\u30A4\u30C9\u0031",
@@ -885,12 +862,12 @@ public class VCardImporterTests extends VCardTestsBase {
null, contentValuesForQPAndSJ, new TypeSet("HOME"), null) null, contentValuesForQPAndSJ, new TypeSet("HOME"), null)
.addNodeWithOrder("NOTE", "\u30E1\u30E2", null, null, .addNodeWithOrder("NOTE", "\u30E1\u30E2", null, null,
contentValuesForQPAndSJ, null, null); contentValuesForQPAndSJ, null, null);
verifier.verify(builder.vNodeList.get(0)); verifier.verify(R.raw.v21_japanese_2, VCardConfig.VCARD_TYPE_V21_JAPANESE_SJIS);
} }
public void testV21Japanese2_Type_Generic_Utf8() throws IOException, VCardException { public void testV21Japanese2_Type_Generic_Utf8() throws IOException, VCardException {
ContentValuesVerifier verifier = new ContentValuesVerifier(); ImportVerifierElem verifier = new ImportVerifierElem();
verifier.buildExpected(StructuredName.CONTENT_ITEM_TYPE) verifier.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "\u5B89\u85E4") .put(StructuredName.FAMILY_NAME, "\u5B89\u85E4")
.put(StructuredName.GIVEN_NAME, "\u30ED\u30A4\u30C9\u0031") .put(StructuredName.GIVEN_NAME, "\u30ED\u30A4\u30C9\u0031")
.put(StructuredName.DISPLAY_NAME, .put(StructuredName.DISPLAY_NAME,
@@ -900,7 +877,7 @@ public class VCardImporterTests extends VCardTestsBase {
.put(StructuredName.PHONETIC_FAMILY_NAME, "\uFF71\uFF9D\uFF84\uFF9E\uFF73") .put(StructuredName.PHONETIC_FAMILY_NAME, "\uFF71\uFF9D\uFF84\uFF9E\uFF73")
.put(StructuredName.PHONETIC_GIVEN_NAME, "\uFF9B\uFF72\uFF84\uFF9E\u0031"); .put(StructuredName.PHONETIC_GIVEN_NAME, "\uFF9B\uFF72\uFF84\uFF9E\u0031");
verifier.buildExpected(StructuredPostal.CONTENT_ITEM_TYPE) verifier.addExpected(StructuredPostal.CONTENT_ITEM_TYPE)
.put(StructuredPostal.POSTCODE, "150-8512") .put(StructuredPostal.POSTCODE, "150-8512")
.put(StructuredPostal.NEIGHBORHOOD, .put(StructuredPostal.NEIGHBORHOOD,
"\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" + "\u6771\u4EAC\u90FD\u6E0B\u8C37\u533A\u685C" +
@@ -913,21 +890,16 @@ public class VCardImporterTests extends VCardTestsBase {
"\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" + "\u30EB\u30EA\u30A2\u30F3\u30BF\u30EF\u30FC" +
"\u0036\u968E 150-8512") "\u0036\u968E 150-8512")
.put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME); .put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME);
verifier.buildExpected(Note.CONTENT_ITEM_TYPE) verifier.addExpected(Note.CONTENT_ITEM_TYPE)
.put(Note.NOTE, "\u30E1\u30E2"); .put(Note.NOTE, "\u30E1\u30E2");
verifier.verify(R.raw.v21_japanese_2, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8); verifier.verify(R.raw.v21_japanese_2, VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
} }
public void testV21MultipleEntryCase() throws IOException, VCardException { public void testV21MultipleEntryCase_Parse() throws IOException, VCardException {
VCardParser_V21 parser = new VCardParser_V21();
VNodeBuilder builder = new VNodeBuilder();
InputStream is = getContext().getResources().openRawResource(R.raw.v21_multiple_entry);
assertEquals(true, parser.parse(is,"ISO-8859-1", builder));
is.close();
assertEquals(3, builder.vNodeList.size());
ContentValues contentValuesForShiftJis = new ContentValues(); ContentValues contentValuesForShiftJis = new ContentValues();
contentValuesForShiftJis.put("CHARSET", "SHIFT_JIS"); contentValuesForShiftJis.put("CHARSET", "SHIFT_JIS");
PropertyNodesVerifier verifier = new PropertyNodesVerifier(this) PropertyNodesVerifier verifier = new PropertyNodesVerifier(this);
verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("VERSION", "2.1") .addNodeWithOrder("VERSION", "2.1")
.addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033;;;;", .addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033;;;;",
Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0033", "", "", "", ""), Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0033", "", "", "", ""),
@@ -940,9 +912,8 @@ public class VCardImporterTests extends VCardTestsBase {
.addNodeWithOrder("TEL", "10", new TypeSet("X-NEC-HOTEL")) .addNodeWithOrder("TEL", "10", new TypeSet("X-NEC-HOTEL"))
.addNodeWithOrder("TEL", "11", new TypeSet("X-NEC-SCHOOL")) .addNodeWithOrder("TEL", "11", new TypeSet("X-NEC-SCHOOL"))
.addNodeWithOrder("TEL", "12", new TypeSet("FAX", "HOME")); .addNodeWithOrder("TEL", "12", new TypeSet("FAX", "HOME"));
verifier.verify(builder.vNodeList.get(0));
verifier.addPropertyNodesVerifierElem()
verifier = new PropertyNodesVerifier(this)
.addNodeWithOrder("VERSION", "2.1") .addNodeWithOrder("VERSION", "2.1")
.addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034;;;;", .addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034;;;;",
Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0034", "", "", "", ""), Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0034", "", "", "", ""),
@@ -955,8 +926,8 @@ public class VCardImporterTests extends VCardTestsBase {
.addNodeWithOrder("TEL", "14", new TypeSet("PAGER")) .addNodeWithOrder("TEL", "14", new TypeSet("PAGER"))
.addNodeWithOrder("TEL", "15", new TypeSet("X-NEC-FAMILY")) .addNodeWithOrder("TEL", "15", new TypeSet("X-NEC-FAMILY"))
.addNodeWithOrder("TEL", "16", new TypeSet("X-NEC-GIRL")); .addNodeWithOrder("TEL", "16", new TypeSet("X-NEC-GIRL"));
verifier.verify(builder.vNodeList.get(1));
verifier = new PropertyNodesVerifier(this) verifier.addPropertyNodesVerifierElem()
.addNodeWithOrder("VERSION", "2.1") .addNodeWithOrder("VERSION", "2.1")
.addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035;;;;", .addNodeWithOrder("N", "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035;;;;",
Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0035", "", "", "", ""), Arrays.asList("\u5B89\u85E4\u30ED\u30A4\u30C9\u0035", "", "", "", ""),
@@ -969,6 +940,77 @@ public class VCardImporterTests extends VCardTestsBase {
.addNodeWithOrder("TEL", "18", new TypeSet("X-NEC-FRIEND")) .addNodeWithOrder("TEL", "18", new TypeSet("X-NEC-FRIEND"))
.addNodeWithOrder("TEL", "19", new TypeSet("X-NEC-PHS")) .addNodeWithOrder("TEL", "19", new TypeSet("X-NEC-PHS"))
.addNodeWithOrder("TEL", "20", new TypeSet("X-NEC-RESTAURANT")); .addNodeWithOrder("TEL", "20", new TypeSet("X-NEC-RESTAURANT"));
verifier.verify(builder.vNodeList.get(2)); verifier.verify(R.raw.v21_multiple_entry, VCardConfig.VCARD_TYPE_V21_JAPANESE_SJIS);
}
public void testV21MultipleEntryCase() throws IOException, VCardException {
ImportVerifier verifier = new ImportVerifier();
ImportVerifierElem elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033")
.put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0033")
.put(StructuredName.PHONETIC_FAMILY_NAME,
"\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0033");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-SECRET")
.put(Phone.NUMBER, "9");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-HOTEL")
.put(Phone.NUMBER, "10");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-SCHOOL")
.put(Phone.NUMBER, "11");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_FAX_HOME)
.put(Phone.NUMBER, "12");
elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034")
.put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0034")
.put(StructuredName.PHONETIC_FAMILY_NAME,
"\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0034");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "MODEM")
.put(Phone.NUMBER, "13");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_PAGER)
.put(Phone.NUMBER, "14");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-FAMILY")
.put(Phone.NUMBER, "15");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-GIRL")
.put(Phone.NUMBER, "16");
elem = verifier.addImportVerifierElem();
elem.addExpected(StructuredName.CONTENT_ITEM_TYPE)
.put(StructuredName.FAMILY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035")
.put(StructuredName.DISPLAY_NAME, "\u5B89\u85E4\u30ED\u30A4\u30C9\u0035")
.put(StructuredName.PHONETIC_FAMILY_NAME,
"\uFF71\uFF9D\uFF84\uFF9E\uFF73\uFF9B\uFF72\uFF84\uFF9E\u0035");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-BOY")
.put(Phone.NUMBER, "17");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-FRIEND")
.put(Phone.NUMBER, "18");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-PHS")
.put(Phone.NUMBER, "19");
elem.addExpected(Phone.CONTENT_ITEM_TYPE)
.put(Phone.TYPE, Phone.TYPE_CUSTOM)
.put(Phone.LABEL, "NEC-RESTAURANT")
.put(Phone.NUMBER, "20");
verifier.verify(R.raw.v21_multiple_entry, VCardConfig.VCARD_TYPE_V21_JAPANESE_SJIS);
} }
} }

View File

@@ -33,7 +33,11 @@ import android.net.Uri;
import android.os.IBinder; import android.os.IBinder;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.RemoteException; import android.os.RemoteException;
import android.pim.vcard.ContactStruct;
import android.pim.vcard.EntryCommitter; import android.pim.vcard.EntryCommitter;
import android.pim.vcard.EntryHandler;
import android.pim.vcard.VCardBuilder;
import android.pim.vcard.VCardBuilderCollection;
import android.pim.vcard.VCardComposer; import android.pim.vcard.VCardComposer;
import android.pim.vcard.VCardConfig; import android.pim.vcard.VCardConfig;
import android.pim.vcard.VCardDataBuilder; import android.pim.vcard.VCardDataBuilder;
@@ -62,6 +66,7 @@ import android.test.mock.MockContentResolver;
import android.test.mock.MockContext; import android.test.mock.MockContext;
import android.test.mock.MockCursor; import android.test.mock.MockCursor;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import junit.framework.TestCase; import junit.framework.TestCase;
@@ -177,24 +182,24 @@ class CustomMockContext extends MockContext {
* Please do not add each unit test here. * Please do not add each unit test here.
*/ */
/* package */ class VCardTestsBase extends AndroidTestCase { /* package */ class VCardTestsBase extends AndroidTestCase {
public static final int V21 = 0; public static final int V21 = VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8;
public static final int V30 = 1; public static final int V30 = VCardConfig.VCARD_TYPE_V30_GENERIC_UTF8;
public class ImportVerificationResolver extends MockContentResolver { public class ImportTestResolver extends MockContentResolver {
ImportVerificationProvider mVerificationProvider = new ImportVerificationProvider(); ImportTestProvider mProvider = new ImportTestProvider();
@Override @Override
public ContentProviderResult[] applyBatch(String authority, public ContentProviderResult[] applyBatch(String authority,
ArrayList<ContentProviderOperation> operations) { ArrayList<ContentProviderOperation> operations) {
equalsString(authority, RawContacts.CONTENT_URI.toString()); equalsString(authority, RawContacts.CONTENT_URI.toString());
return mVerificationProvider.applyBatch(operations); return mProvider.applyBatch(operations);
} }
public void addExpectedContentValues(ContentValues expectedContentValues) { public void addExpectedContentValues(ContentValues expectedContentValues) {
mVerificationProvider.addExpectedContentValues(expectedContentValues); mProvider.addExpectedContentValues(expectedContentValues);
} }
public void verify() { public void verify() {
mVerificationProvider.verify(); mProvider.verify();
} }
} }
@@ -208,10 +213,10 @@ class CustomMockContext extends MockContext {
Relation.CONTENT_ITEM_TYPE, Event.CONTENT_ITEM_TYPE, Relation.CONTENT_ITEM_TYPE, Event.CONTENT_ITEM_TYPE,
GroupMembership.CONTENT_ITEM_TYPE)); GroupMembership.CONTENT_ITEM_TYPE));
public class ImportVerificationProvider extends MockContentProvider { public class ImportTestProvider extends MockContentProvider {
final Map<String, Collection<ContentValues>> mMimeTypeToExpectedContentValues; final Map<String, Collection<ContentValues>> mMimeTypeToExpectedContentValues;
public ImportVerificationProvider() { public ImportTestProvider() {
mMimeTypeToExpectedContentValues = mMimeTypeToExpectedContentValues =
new HashMap<String, Collection<ContentValues>>(); new HashMap<String, Collection<ContentValues>>();
for (String acceptanbleMimeType : sKnownMimeTypeSet) { for (String acceptanbleMimeType : sKnownMimeTypeSet) {
@@ -303,11 +308,11 @@ class CustomMockContext extends MockContext {
} }
boolean checked = false; boolean checked = false;
for (ContentValues expectedContentValues : contentValuesCollection) { for (ContentValues expectedContentValues : contentValuesCollection) {
/* for testing /*for testing
Log.d("@@@", "expected: " Log.d("@@@", "expected: "
+ convertToEasilyReadableString(expectedContentValues)); + convertToEasilyReadableString(expectedContentValues));
Log.d("@@@", "actual : " Log.d("@@@", "actual : "
+ convertToEasilyReadableString(actualContentValues)); */ + convertToEasilyReadableString(actualContentValues));*/
if (equalsForContentValues(expectedContentValues, if (equalsForContentValues(expectedContentValues,
actualContentValues)) { actualContentValues)) {
assertTrue(contentValuesCollection.remove(expectedContentValues)); assertTrue(contentValuesCollection.remove(expectedContentValues));
@@ -346,15 +351,16 @@ class CustomMockContext extends MockContext {
} }
} }
public class ContentValuesVerifier { class ImportVerifierElem {
private final ImportVerificationResolver mResolver; private final ImportTestResolver mResolver;
// private final String mCharset; private final EntryHandler mHandler;
public ContentValuesVerifier() { public ImportVerifierElem() {
mResolver = new ImportVerificationResolver(); mResolver = new ImportTestResolver();
mHandler = new EntryCommitter(mResolver);
} }
public ContentValuesBuilder buildExpected(String mimeType) { public ContentValuesBuilder addExpected(String mimeType) {
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(Data.MIMETYPE, mimeType); contentValues.put(Data.MIMETYPE, mimeType);
mResolver.addExpectedContentValues(contentValues); mResolver.addExpectedContentValues(contentValues);
@@ -366,8 +372,7 @@ class CustomMockContext extends MockContext {
verify(getContext().getResources().openRawResource(resId), vCardType); verify(getContext().getResources().openRawResource(resId), vCardType);
} }
public void verify(InputStream is, int vCardType) public void verify(InputStream is, int vCardType) throws IOException, VCardException {
throws IOException, VCardException {
final VCardParser vCardParser; final VCardParser vCardParser;
if (VCardConfig.isV30(vCardType)) { if (VCardConfig.isV30(vCardType)) {
vCardParser = new VCardParser_V30(true); // use StrictParsing vCardParser = new VCardParser_V30(true); // use StrictParsing
@@ -375,8 +380,8 @@ class CustomMockContext extends MockContext {
vCardParser = new VCardParser_V21(); vCardParser = new VCardParser_V21();
} }
VCardDataBuilder builder = VCardDataBuilder builder =
new VCardDataBuilder(null, null, false, vCardType, null); new VCardDataBuilder(null, null, false, vCardType, null);
builder.addEntryHandler(new EntryCommitter(mResolver)); builder.addEntryHandler(mHandler);
try { try {
vCardParser.parse(is, builder); vCardParser.parse(is, builder);
} finally { } finally {
@@ -387,8 +392,81 @@ class CustomMockContext extends MockContext {
} }
} }
} }
verifyResolver();
}
public void verifyResolver() {
mResolver.verify(); mResolver.verify();
} }
public void onParsingStart() {
mHandler.onParsingStart();
}
public void onEntryCreated(ContactStruct entry) {
mHandler.onEntryCreated(entry);
}
public void onParsingEnd() {
mHandler.onParsingEnd();
}
}
class ImportVerifier implements EntryHandler {
private List<ImportVerifierElem> mImportVerifierElemList =
new ArrayList<ImportVerifierElem>();
private int mIndex;
public ImportVerifierElem addImportVerifierElem() {
ImportVerifierElem importVerifier = new ImportVerifierElem();
mImportVerifierElemList.add(importVerifier);
return importVerifier;
}
public void verify(int resId, int vCardType) throws IOException, VCardException {
verify(getContext().getResources().openRawResource(resId), vCardType);
}
public void verify(InputStream is, int vCardType) throws IOException, VCardException {
final VCardParser vCardParser;
if (VCardConfig.isV30(vCardType)) {
vCardParser = new VCardParser_V30(true); // use StrictParsing
} else {
vCardParser = new VCardParser_V21();
}
VCardDataBuilder builder =
new VCardDataBuilder(null, null, false, vCardType, null);
builder.addEntryHandler(this);
try {
vCardParser.parse(is, builder);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
}
public void onParsingStart() {
for (ImportVerifierElem elem : mImportVerifierElemList) {
elem.onParsingStart();
}
}
public void onEntryCreated(ContactStruct entry) {
assertTrue(mIndex < mImportVerifierElemList.size());
mImportVerifierElemList.get(mIndex).onEntryCreated(entry);
mIndex++;
}
public void onParsingEnd() {
for (ImportVerifierElem elem : mImportVerifierElemList) {
elem.onParsingEnd();
elem.verifyResolver();
}
}
} }
public class ExportTestResolver extends MockContentResolver { public class ExportTestResolver extends MockContentResolver {
@@ -398,24 +476,23 @@ class CustomMockContext extends MockContext {
addProvider(RawContacts.CONTENT_URI.getAuthority(), mProvider); addProvider(RawContacts.CONTENT_URI.getAuthority(), mProvider);
} }
public ContentValuesBuilder buildInput(String mimeType) { public ContactEntry buildContactEntry() {
return mProvider.buildData(mimeType); return mProvider.buildInputEntry();
} }
} }
public static class MockEntityIterator implements EntityIterator { public static class MockEntityIterator implements EntityIterator {
Collection<Entity> mEntityCollection; List<Entity> mEntityList;
Iterator<Entity> mIterator; Iterator<Entity> mIterator;
// TODO: Support multiple vCard entries. public MockEntityIterator(List<ContentValues> contentValuesList) {
public MockEntityIterator(Collection<ContentValues> contentValuesCollection) { mEntityList = new ArrayList<Entity>();
mEntityCollection = new ArrayList<Entity>();
Entity entity = new Entity(new ContentValues()); Entity entity = new Entity(new ContentValues());
for (ContentValues contentValues : contentValuesCollection) { for (ContentValues contentValues : contentValuesList) {
entity.addSubValue(Data.CONTENT_URI, contentValues); entity.addSubValue(Data.CONTENT_URI, contentValues);
} }
mEntityCollection.add(entity); mEntityList.add(entity);
mIterator = mEntityCollection.iterator(); mIterator = mEntityList.iterator();
} }
public boolean hasNext() { public boolean hasNext() {
@@ -427,15 +504,20 @@ class CustomMockContext extends MockContext {
} }
public void reset() { public void reset() {
mIterator = mEntityCollection.iterator(); mIterator = mEntityList.iterator();
} }
public void close() { public void close() {
} }
} }
public class ExportTestProvider extends MockContentProvider { /**
List<ContentValues> mContentValuesList = new ArrayList<ContentValues>(); * Represents one contact, which should contain multiple ContentValues like
* StructuredName, Email, etc.
*/
static class ContactEntry {
private final List<ContentValues> mContentValuesList = new ArrayList<ContentValues>();
public ContentValuesBuilder buildData(String mimeType) { public ContentValuesBuilder buildData(String mimeType) {
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(Data.MIMETYPE, mimeType); contentValues.put(Data.MIMETYPE, mimeType);
@@ -443,28 +525,50 @@ class CustomMockContext extends MockContext {
return new ContentValuesBuilder(contentValues); return new ContentValuesBuilder(contentValues);
} }
@Override public List<ContentValues> getList() {
public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs, return mContentValuesList;
String sortOrder) { }
assert(uri != null); }
assert(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()));
final String authority = uri.getAuthority();
assert(RawContacts.CONTENT_URI.getAuthority().equals(authority));
return new MockEntityIterator(mContentValuesList); class ExportTestProvider extends MockContentProvider {
ArrayList<ContactEntry> mContactEntryList = new ArrayList<ContactEntry>();
public ContactEntry buildInputEntry() {
ContactEntry contactEntry = new ContactEntry();
mContactEntryList.add(contactEntry);
return contactEntry;
} }
@Override @Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs,
String sortOrder) { String sortOrder) {
assert(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri)); assertTrue(uri != null);
// Support multiple rows. assertTrue(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()));
final String authority = uri.getAuthority();
assertTrue(RawContacts.CONTENT_URI.getAuthority().equals(authority));
assertTrue((Data.CONTACT_ID + "=?").equals(selection));
assertEquals(1, selectionArgs.length);
int id = Integer.parseInt(selectionArgs[0]);
assertTrue(id >= 0 && id < mContactEntryList.size());
return new MockEntityIterator(mContactEntryList.get(id).getList());
}
@Override
public Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
assertTrue(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri));
// In this test, following arguments are not supported.
assertNull(selection);
assertNull(selectionArgs);
assertNull(sortOrder);
return new MockCursor() { return new MockCursor() {
int mCurrentPosition = -1; int mCurrentPosition = -1;
@Override @Override
public int getCount() { public int getCount() {
return 1; return mContactEntryList.size();
} }
@Override @Override
@@ -475,7 +579,7 @@ class CustomMockContext extends MockContext {
@Override @Override
public boolean moveToNext() { public boolean moveToNext() {
if (mCurrentPosition == 0 || mCurrentPosition == -1) { if (mCurrentPosition < mContactEntryList.size()) {
mCurrentPosition++; mCurrentPosition++;
return true; return true;
} else { } else {
@@ -490,7 +594,7 @@ class CustomMockContext extends MockContext {
@Override @Override
public boolean isAfterLast() { public boolean isAfterLast() {
return mCurrentPosition > 0; return mCurrentPosition >= mContactEntryList.size();
} }
@Override @Override
@@ -502,7 +606,9 @@ class CustomMockContext extends MockContext {
@Override @Override
public int getInt(int columnIndex) { public int getInt(int columnIndex) {
assertEquals(0, columnIndex); assertEquals(0, columnIndex);
return 0; assertTrue(mCurrentPosition >= 0
&& mCurrentPosition < mContactEntryList.size());
return mCurrentPosition;
} }
@Override @Override
@@ -517,130 +623,252 @@ class CustomMockContext extends MockContext {
} }
} }
public class VCardVerificationHandler implements VCardComposer.OneEntryHandler { class LineVerifierElem {
final private TestCase mTestCase; private final List<String> mExpectedLineList = new ArrayList<String>();
final private List<PropertyNodesVerifier> mPropertyNodesVerifierList; private final boolean mIsV30;
final private boolean mIsV30;
// To allow duplication, use list instead of set.
// TODO: support multiple vCard entries.
final private List<String> mExpectedLineList;
final private List<ContentValuesVerifier> mContentValuesVerifierList;
final private int mVCardType;
int mCount;
public VCardVerificationHandler(final TestCase testCase, final int version) { public LineVerifierElem(boolean isV30) {
mTestCase = testCase; mIsV30 = isV30;
mPropertyNodesVerifierList = new ArrayList<PropertyNodesVerifier>();
mIsV30 = (version == V30);
mExpectedLineList = new ArrayList<String>();
mContentValuesVerifierList = new ArrayList<ContentValuesVerifier>();
mVCardType = (version == V30 ? VCardConfig.VCARD_TYPE_V30_GENERIC_UTF8
: VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
mCount = 1;
} }
public PropertyNodesVerifier addPropertyNodesVerifier() { public LineVerifierElem addExpected(final String line) {
PropertyNodesVerifier verifier = new PropertyNodesVerifier(mTestCase); if (!TextUtils.isEmpty(line)) {
mPropertyNodesVerifierList.add(verifier); mExpectedLineList.add(line);
verifier.addNodeWithOrder("VERSION", mIsV30 ? "3.0" : "2.1");
return verifier;
}
public PropertyNodesVerifier addPropertyVerifierWithEmptyName() {
PropertyNodesVerifier verifier = addPropertyNodesVerifier();
if (mIsV30) {
verifier.addNodeWithOrder("N", "").addNodeWithOrder("FN", "");
} }
return verifier;
}
public ContentValuesVerifier addContentValuesVerifier() {
ContentValuesVerifier verifier = new ContentValuesVerifier();
mContentValuesVerifierList.add(verifier);
return verifier;
}
public VCardVerificationHandler addExpectedLine(String line) {
mExpectedLineList.add(line);
return this; return this;
} }
public boolean onInit(final Context context) { public void verify(final String vcard) {
return true;
}
public boolean onEntryCreated(final String vcard) {
if (!mExpectedLineList.isEmpty()) {
verifyLines(vcard);
}
verifyNodes(vcard);
return true;
}
private void verifyLines(final String vcard) {
final String[] lineArray = vcard.split("\\r?\\n"); final String[] lineArray = vcard.split("\\r?\\n");
final int length = lineArray.length; final int length = lineArray.length;
final TestCase testCase = VCardTestsBase.this;
boolean beginExists = false;
boolean endExists = false;
boolean versionExists = false;
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
final String line = lineArray[i]; final String line = lineArray[i];
// TODO: support multiple vcard entries. if (TextUtils.isEmpty(line)) {
if ("BEGIN:VCARD".equals(line) || "END:VCARD".equals(line) ||
(mIsV30 ? "VERSION:3.0" : "VERSION:2.1").equals(line)) {
continue; continue;
} }
if ("BEGIN:VCARD".equalsIgnoreCase(line)) {
if (beginExists) {
testCase.fail("Multiple \"BEGIN:VCARD\" line found");
} else {
beginExists = true;
continue;
}
} else if ("END:VCARD".equalsIgnoreCase(line)) {
if (endExists) {
testCase.fail("Multiple \"END:VCARD\" line found");
} else {
endExists = true;
continue;
}
} else if (
(mIsV30 ? "VERSION:3.0" : "VERSION:2.1").equalsIgnoreCase(line)) {
if (versionExists) {
testCase.fail("Multiple VERSION line + found");
} else {
versionExists = true;
continue;
}
}
if (!beginExists) {
testCase.fail(
"Property other than BEGIN came before BEGIN property: " + line);
} else if (endExists) {
testCase.fail("Property other than END came after END property: " + line);
}
final int index = mExpectedLineList.indexOf(line); final int index = mExpectedLineList.indexOf(line);
if (index >= 0) { if (index >= 0) {
mExpectedLineList.remove(index); mExpectedLineList.remove(index);
} else { } else {
mTestCase.fail("Unexpected line: " + line); testCase.fail("Unexpected line: " + line);
} }
} }
if (!mExpectedLineList.isEmpty()) { if (!mExpectedLineList.isEmpty()) {
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
for (String expectedLine : mExpectedLineList) { for (String expectedLine : mExpectedLineList) {
buffer.append(expectedLine); buffer.append(expectedLine);
buffer.append("\n"); buffer.append("\n");
} }
mTestCase.fail("Expected line(s) not found:" + buffer.toString());
testCase.fail("Expected line(s) not found:" + buffer.toString());
} }
} }
}
private void verifyNodes(final String vcard) { class LineVerifier implements VCardComposer.OneEntryHandler {
if (mPropertyNodesVerifierList.size() == 0) { private final ArrayList<LineVerifierElem> mLineVerifierElemList;
mTestCase.fail("Too many vCard entries seems to be inserted(No." private final boolean mIsV30;
+ mCount + " of the entries (No.1 is the first entry))"); private int index;
}
PropertyNodesVerifier propertyNodesVerifier = public LineVerifier(final boolean isV30) {
mPropertyNodesVerifierList.get(0); mLineVerifierElemList = new ArrayList<LineVerifierElem>();
mPropertyNodesVerifierList.remove(0); mIsV30 = isV30;
VCardParser parser = (mIsV30 ? new VCardParser_V30(true) : new VCardParser_V21()); }
VNodeBuilder builder = new VNodeBuilder();
InputStream is; public LineVerifierElem addLineVerifierElem() {
try { LineVerifierElem lineVerifier = new LineVerifierElem(mIsV30);
is = new ByteArrayInputStream(vcard.getBytes("UTF-8")); mLineVerifierElemList.add(lineVerifier);
mTestCase.assertEquals(true, parser.parse(is, null, builder)); return lineVerifier;
is.close(); }
mTestCase.assertEquals(1, builder.vNodeList.size());
propertyNodesVerifier.verify(builder.vNodeList.get(0)); public void verify(String vcard) {
if (!mContentValuesVerifierList.isEmpty()) { if (index >= mLineVerifierElemList.size()) {
ContentValuesVerifier contentValuesVerifier = VCardTestsBase.this.fail("Insufficient number of LineVerifier (" + index + ")");
mContentValuesVerifierList.get(0);
is = new ByteArrayInputStream(vcard.getBytes("UTF-8"));
contentValuesVerifier.verify(is, mVCardType);
is.close();
}
} catch (IOException e) {
mTestCase.fail("Unexpected IOException: " + e.getMessage());
} catch (VCardException e) {
mTestCase.fail("Unexpected VCardException: " + e.getMessage());
} finally {
mCount++;
} }
LineVerifierElem lineVerifier = mLineVerifierElemList.get(index);
lineVerifier.verify(vcard);
index++;
}
public boolean onEntryCreated(String vcard) {
verify(vcard);
return true;
}
public boolean onInit(Context context) {
return true;
} }
public void onTerminate() { public void onTerminate() {
} }
} }
class VCardVerifier {
private class VCardVerifierInternal implements VCardComposer.OneEntryHandler {
public boolean onInit(Context context) {
return true;
}
public boolean onEntryCreated(String vcard) {
verifyOneVCard(vcard);
return true;
}
public void onTerminate() {
}
}
private final VCardVerifierInternal mVCardVerifierInternal;
private final ExportTestResolver mResolver;
private final int mVCardType;
private final boolean mIsV30;
// To allow duplication, use list instead of set.
// When null, we don't need to do the verification.
private PropertyNodesVerifier mPropertyNodesVerifier;
private LineVerifier mLineVerificationHandler;
private ImportVerifier mImportVerifier;
public VCardVerifier(ExportTestResolver resolver, int vcardType) {
mVCardVerifierInternal = new VCardVerifierInternal();
mResolver = resolver;
mIsV30 = VCardConfig.isV30(vcardType);
mVCardType = vcardType;
}
public PropertyNodesVerifierElem addPropertyNodesVerifierElem() {
if (mPropertyNodesVerifier == null) {
mPropertyNodesVerifier = new PropertyNodesVerifier(VCardTestsBase.this);
}
PropertyNodesVerifierElem elem =
mPropertyNodesVerifier.addPropertyNodesVerifierElem();
elem.addNodeWithOrder("VERSION", (mIsV30 ? "3.0" : "2.1"));
return elem;
}
public PropertyNodesVerifierElem addPropertyNodesVerifierWithEmptyName() {
PropertyNodesVerifierElem elem = addPropertyNodesVerifierElem();
if (mIsV30) {
elem.addNodeWithOrder("N", "").addNodeWithOrder("FN", "");
}
return elem;
}
public LineVerifierElem addLineVerifier() {
if (mLineVerificationHandler == null) {
mLineVerificationHandler = new LineVerifier(mIsV30);
}
return mLineVerificationHandler.addLineVerifierElem();
}
public ImportVerifierElem addImportVerifier() {
if (mImportVerifier == null) {
mImportVerifier = new ImportVerifier();
}
return mImportVerifier.addImportVerifierElem();
}
private void verifyOneVCard(final String vcard) {
final VCardBuilder builder;
if (mImportVerifier != null) {
final VNodeBuilder vnodeBuilder = mPropertyNodesVerifier;
final VCardDataBuilder vcardDataBuilder = new VCardDataBuilder();
vcardDataBuilder.addEntryHandler(mImportVerifier);
if (mPropertyNodesVerifier != null) {
builder = new VCardBuilderCollection(Arrays.asList(
vcardDataBuilder, mPropertyNodesVerifier));
} else {
builder = vnodeBuilder;
}
} else {
if (mPropertyNodesVerifier != null) {
builder = mPropertyNodesVerifier;
} else {
return;
}
}
final VCardParser parser =
(mIsV30 ? new VCardParser_V30(true) : new VCardParser_V21());
final TestCase testCase = VCardTestsBase.this;
InputStream is = null;
try {
is = new ByteArrayInputStream(vcard.getBytes("UTF-8"));
testCase.assertEquals(true, parser.parse(is, null, builder));
} catch (IOException e) {
testCase.fail("Unexpected IOException: " + e.getMessage());
} catch (VCardException e) {
testCase.fail("Unexpected VCardException: " + e.getMessage());
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
}
public void verify() {
VCardComposer composer =
new VCardComposer(new CustomMockContext(mResolver), mVCardType);
composer.addHandler(mLineVerificationHandler);
composer.addHandler(mVCardVerifierInternal);
if (!composer.init(VCardComposer.CONTACTS_TEST_CONTENT_URI, null, null, null)) {
fail("init() failed. Reason: " + composer.getErrorReason());
}
assertFalse(composer.isAfterLast());
try {
while (!composer.isAfterLast()) {
assertTrue(composer.createOneEntry());
}
} finally {
composer.terminate();
}
}
}
/** /**
* Utility method to print ContentValues whose content is printed with sorted keys. * Utility method to print ContentValues whose content is printed with sorted keys.
*/ */
@@ -683,6 +911,7 @@ class CustomMockContext extends MockContext {
} else if (expected == null || actual == null || expected.size() != actual.size()) { } else if (expected == null || actual == null || expected.size() != actual.size()) {
return false; return false;
} }
for (Entry<String, Object> entry : expected.valueSet()) { for (Entry<String, Object> entry : expected.valueSet()) {
final String key = entry.getKey(); final String key = entry.getKey();
final Object value = entry.getValue(); final Object value = entry.getValue();