148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa/*
248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * Copyright (C) 2011 The Android Open Source Project
348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa *
448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * you may not use this file except in compliance with the License.
648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * You may obtain a copy of the License at
748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa *
848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa *
1048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
1148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
1248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * See the License for the specific language governing permissions and
1448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * limitations under the License.
1548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa */
1648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawapackage com.android.vcard.tests;
1748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
181de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardConfig;
1948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport com.android.vcard.VCardConstants;
2048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport com.android.vcard.VCardEntry;
211de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.AndroidCustomData;
221de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.AnniversaryData;
231de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.BirthdayData;
241de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.EmailData;
251de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.EntryElement;
261de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.EntryLabel;
271de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.ImData;
281de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.NameData;
291de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.NicknameData;
301de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.NoteData;
311de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.OrganizationData;
321de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.PhoneData;
331de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.PhotoData;
341de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.PostalData;
351de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardEntry.SipData;
3648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport com.android.vcard.VCardEntryConstructor;
3748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport com.android.vcard.VCardEntryHandler;
3848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport com.android.vcard.VCardInterpreter;
391de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport com.android.vcard.VCardProperty;
4048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
4148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport android.content.ContentProviderOperation;
4248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport android.content.ContentResolver;
431de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Email;
441de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Im;
451de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Organization;
461de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Phone;
471de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
481de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.SipAddress;
4948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport android.test.AndroidTestCase;
5048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
5148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport java.util.ArrayList;
5248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport java.util.Arrays;
531de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport java.util.HashMap;
5448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawaimport java.util.List;
551de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawaimport java.util.Map;
5648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
5748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawapublic class VCardEntryTests extends AndroidTestCase {
5848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    private class MockVCardEntryHandler implements VCardEntryHandler {
5948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        private List<VCardEntry> mEntries = new ArrayList<VCardEntry>();
6048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        private boolean mOnStartCalled;
6148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        private boolean mOnEndCalled;
6248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
6348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        @Override
6448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        public void onStart() {
6548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            assertFalse(mOnStartCalled);
6648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            mOnStartCalled = true;
6748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        }
6848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
6948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        @Override
7048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        public void onEntryCreated(VCardEntry entry) {
7148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            assertTrue(mOnStartCalled);
7248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            assertFalse(mOnEndCalled);
7348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            mEntries.add(entry);
7448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        }
7548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
7648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        @Override
7748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        public void onEnd() {
7848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            assertTrue(mOnStartCalled);
7948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            assertFalse(mOnEndCalled);
8048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            mOnEndCalled = true;
8148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        }
8248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
8348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        public List<VCardEntry> getEntries() {
8448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa            return mEntries;
8548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        }
8648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    }
8748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
8848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    /**
8948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * Tests VCardEntry and related clasess can handle nested classes given
9048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * {@link VCardInterpreter} is called appropriately.
9148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     *
9248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * This test manually calls VCardInterpreter's callback mechanism and checks
9348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * {@link VCardEntryConstructor} constructs {@link VCardEntry} per given calls.
9448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     *
9548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * Intended vCard is as follows:
9648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * <code>
9748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * BEGIN:VCARD
9848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * N:test1
9948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * BEGIN:VCARD
10048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * N:test2
10148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * END:VCARD
10248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * TEL:1
10348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * END:VCARD
10448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * </code>
10548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     */
10648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    public void testNestHandling() {
10748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        VCardEntryConstructor entryConstructor = new VCardEntryConstructor();
10848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        MockVCardEntryHandler entryHandler = new MockVCardEntryHandler();
10948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        entryConstructor.addEntryHandler(entryHandler);
11048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
1111de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onVCardStarted();
1121de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onEntryStarted();
1131de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        VCardProperty property = new VCardProperty();
1141de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName(VCardConstants.PROPERTY_N);
1151de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("test1");
1161de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onPropertyCreated(property);
1171de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1181de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onEntryStarted();  // begin nest
1191de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
1201de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName(VCardConstants.PROPERTY_N);
1211de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("test2");
1221de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onPropertyCreated(property);
1231de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onEntryEnded();  // end nest
1241de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1251de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
1261de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName(VCardConstants.PROPERTY_TEL);
1271de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("1");
1281de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onPropertyCreated(property);
1291de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onEntryEnded();
1301de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entryConstructor.onVCardEnded();
13148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
13248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        List<VCardEntry> entries = entryHandler.getEntries();
13348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals(2, entries.size());
13448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        VCardEntry parent = entries.get(1);
13548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        VCardEntry child = entries.get(0);
13648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals("test1", parent.getDisplayName());
13748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals("test2", child.getDisplayName());
13848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        List<VCardEntry.PhoneData> phoneList = parent.getPhoneList();
13948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertNotNull(phoneList);
14048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals(1, phoneList.size());
1411de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertEquals("1", phoneList.get(0).getNumber());
1421de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    }
1431de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1441de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    private class MockEntryElementIterator implements VCardEntry.EntryElementIterator {
1451de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        private boolean mStartCalled;
1461de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        private boolean mEndCalled;
1471de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        private EntryLabel mLabel;
1481de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        private final Map<EntryLabel, EntryElement> mExpectedElements =
1491de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                new HashMap<EntryLabel, EntryElement>();
1501de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1511de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        public void addExpectedElement(EntryElement elem) {
1521de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            mExpectedElements.put(elem.getEntryLabel(), elem);
1531de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        }
1541de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1551de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        @Override
1561de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        public void onIterationStarted() {
1571de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertFalse(mStartCalled);
1581de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertFalse(mEndCalled);
1591de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertNull(mLabel);
1601de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            mStartCalled = true;
1611de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        }
1621de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1631de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        @Override
1641de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        public void onIterationEnded() {
1651de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertTrue(mStartCalled);
1661de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertFalse(mEndCalled);
1671de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertNull(mLabel);
1681de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertTrue("Expected Elements remaining: " +
1691de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                    Arrays.toString(mExpectedElements.values().toArray()),
1701de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                    mExpectedElements.isEmpty());
1711de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        }
1721de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1731de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        @Override
1741de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        public void onElementGroupStarted(EntryLabel label) {
1751de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertTrue(mStartCalled);
1761de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertFalse(mEndCalled);
1771de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertNull(mLabel);
1781de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            mLabel = label;
1791de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        }
1801de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1811de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        @Override
1821de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        public void onElementGroupEnded() {
1831de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertTrue(mStartCalled);
1841de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertFalse(mEndCalled);
1851de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertNotNull(mLabel);
1861de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            mLabel = null;
1871de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        }
1881de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1891de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        @Override
1901de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        public boolean onElement(EntryElement elem) {
1911de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            EntryElement expectedElem = mExpectedElements.remove(elem.getEntryLabel());
1921de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertNotNull("Unexpected elem: " + elem.toString(), expectedElem);
1931de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            assertEquals(expectedElem, elem);
1941de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa            return true;
1951de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        }
1961de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    }
1971de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1981de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    /**
1991de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa     * Tests every element in VCardEntry is iterated by
2001de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa     * {@link VCardEntry#iterateAllData(com.android.vcard.VCardEntry.EntryElementIterator)}.
2011de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa     */
2021de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    public void testEntryElementIterator() {
2031de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        VCardEntry entry = new VCardEntry();
2041de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        MockEntryElementIterator iterator = new MockEntryElementIterator();
2051de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2061de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        VCardProperty property = new VCardProperty();
2071de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("N");
2081de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("family", "given", "middle", "prefix", "suffix");
2091de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2101de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        NameData nameData = new NameData();
2111de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        nameData.setFamily("family");
2121de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        nameData.setGiven("given");
2131de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        nameData.setMiddle("middle");
2141de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        nameData.setPrefix("prefix");
2151de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        nameData.setSuffix("suffix");
2161de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(nameData);
2171de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2181de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2191de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("TEL");
2201de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setParameter("TYPE", "HOME");
2211de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("1");
2221de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2231de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        PhoneData phoneData = new PhoneData("1", Phone.TYPE_HOME, null, false);
2241de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(phoneData);
2251de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2261de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2271de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("EMAIL");
2281de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setParameter("TYPE", "WORK");
2291de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("email");
2301de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2311de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        EmailData emailData = new EmailData("email", Email.TYPE_WORK, null, false);
2321de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(emailData);
2331de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2341de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2351de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("ADR");
2361de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setParameter("TYPE", "HOME");
2371de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues(null, null, "street");
2381de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2391de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        PostalData postalData = new PostalData(null, null, "street", null, null, null,
2401de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                null, StructuredPostal.TYPE_HOME, null, false,
2411de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                VCardConfig.VCARD_TYPE_DEFAULT);
2421de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(postalData);
2431de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2441de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2451de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("ORG");
2461de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("organization", "depertment");
2471de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2481de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        OrganizationData organizationData = new OrganizationData(
2491de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                "organization", "depertment", null, null, Organization.TYPE_WORK, false);
2501de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(organizationData);
2511de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2521de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2531de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("X-GOOGLE-TALK");
2541de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setParameter("TYPE", "WORK");
2551de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("googletalk");
2561de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2571de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        ImData imData = new ImData(
2581de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                Im.PROTOCOL_GOOGLE_TALK, null, "googletalk", Im.TYPE_WORK, false);
2591de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(imData);
2601de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2611de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2621de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("PHOTO");
2631de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setParameter("TYPE", "PNG");
2641de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        byte[] photoBytes = new byte[] {1};
2651de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setByteValue(photoBytes);
2661de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2671de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        PhotoData photoData = new PhotoData("PNG", photoBytes, false);
2681de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(photoData);
2691de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2701de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2711de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("X-SIP");
2721de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("sipdata");
2731de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2741de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        SipData sipData = new SipData("sip:sipdata", SipAddress.TYPE_OTHER, null, false);
2751de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(sipData);
2761de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2771de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2781de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("NICKNAME");
2791de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("nickname");
2801de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2811de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        NicknameData nicknameData = new NicknameData("nickname");
2821de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(nicknameData);
2831de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2841de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2851de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("NOTE");
2861de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("note");
2871de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2881de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        NoteData noteData = new NoteData("note");
2891de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(noteData);
2901de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2911de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2921de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("BDAY");
2931de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("birthday");
2941de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
2951de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        BirthdayData birthdayData = new BirthdayData("birthday");
2961de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(birthdayData);
2971de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
2981de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
2991de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("ANNIVERSARY");
3001de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("anniversary");
3011de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
3021de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        AnniversaryData anniversaryData = new AnniversaryData("anniversary");
3031de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(anniversaryData);
3041de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
3051de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property = new VCardProperty();
3061de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("X-ANDROID-CUSTOM");
3071de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("mime;value");
3081de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
3091de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        AndroidCustomData androidCustom = new AndroidCustomData("mime", Arrays.asList("value"));
3101de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        iterator.addExpectedElement(androidCustom);
3111de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
3121de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.iterateAllData(iterator);
3131de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    }
3141de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
3151de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    public void testToString() {
3161de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        VCardEntry entry = new VCardEntry();
3171de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        VCardProperty property = new VCardProperty();
3181de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("N");
3191de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("Family", "Given", "Middle", "Prefix", "Suffix");
3201de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.addProperty(property);
3211de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        entry.consolidateFields();
3221de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
3231de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        String result = entry.toString();
3241de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertNotNull(result);
3251de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
3261de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertTrue(result.contains(String.valueOf(entry.hashCode())));
3271de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertTrue(result.contains(VCardEntry.EntryLabel.NAME.toString()));
3281de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertTrue(result.contains("Family"));
3291de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertTrue(result.contains("Given"));
3301de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertTrue(result.contains("Middle"));
3311de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertTrue(result.contains("Prefix"));
3321de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertTrue(result.contains("Suffix"));
33348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    }
33448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
33548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    /**
33648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * Tests that VCardEntry emits correct insert operation for name field.
33748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     */
33848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    public void testConstructInsertOperationsInsertName() {
33948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        VCardEntry entry = new VCardEntry();
3401de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        VCardProperty property = new VCardProperty();
3411de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setName("N");
3421de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        property.setValues("Family", "Given", "Middle", "Prefix", "Suffix");
34348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        entry.addProperty(property);
34448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        entry.consolidateFields();
34548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
3461de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        NameData nameData = entry.getNameData();
3471de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertEquals("Family", nameData.getFamily());
3481de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertEquals("Given", nameData.getGiven());
3491de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertEquals("Middle", nameData.getMiddle());
3501de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertEquals("Prefix", nameData.getPrefix());
3511de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        assertEquals("Suffix", nameData.getSuffix());
35248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
35348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        ContentResolver resolver = getContext().getContentResolver();
35448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        ArrayList<ContentProviderOperation> operationList =
35548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa                new ArrayList<ContentProviderOperation>();
35648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        entry.constructInsertOperations(resolver, operationList);
35748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
35848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        // Need too many details for testing these. Just check basics.
35948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        // TODO: introduce nice-to-test mechanism here.
36048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals(2, operationList.size());
36148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals(ContentProviderOperation.TYPE_INSERT, operationList.get(0).getType());
36248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals(ContentProviderOperation.TYPE_INSERT, operationList.get(1).getType());
36348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    }
36448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
36548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    /**
36648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     * Tests that VCardEntry refrains from emitting unnecessary insert operation.
36748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa     */
36848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    public void testConstructInsertOperationsEmptyData() {
36948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        VCardEntry entry = new VCardEntry();
37048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        ContentResolver resolver = getContext().getContentResolver();
37148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        ArrayList<ContentProviderOperation> operationList =
37248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa                new ArrayList<ContentProviderOperation>();
37348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        entry.constructInsertOperations(resolver, operationList);
37448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        assertEquals(0, operationList.size());
37548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    }
37648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa
37748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    // TODO: add bunch of test for constructInsertOperations..
37848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa}