156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa/*
256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * Copyright (C) 2011 The Android Open Source Project
356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa *
456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * you may not use this file except in compliance with the License.
656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * You may obtain a copy of the License at
756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa *
856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa *
1056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
1156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
1256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * See the License for the specific language governing permissions and
1456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * limitations under the License.
1556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa */
1656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawapackage com.android.vcard.tests;
1756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
1856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport com.android.vcard.VCardInterpreter;
1956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport com.android.vcard.VCardParser;
2056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport com.android.vcard.VCardParser_V21;
21210ebaab315e389ffc66278e28ecd6230e412b5fJay Shraunerimport com.android.vcard.VCardParser_V30;
2256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport com.android.vcard.VCardProperty;
2356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport com.android.vcard.exception.VCardException;
2456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
2556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport android.test.AndroidTestCase;
2656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
2756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport java.io.IOException;
2856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport java.io.InputStream;
2956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport java.util.ArrayList;
3056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport java.util.Arrays;
3156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawaimport java.util.List;
3256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
3356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa/**
3456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * Tests for basic {@link VCardParser} capability (e.g. if it calls callbacks
3556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa * in {@link VCardInterpreter}}.
3656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa */
3756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawapublic class VCardParserTests extends AndroidTestCase {
3856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    private enum Order {
3956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        START,
4056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        END,
4156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        START_ENTRY,
4256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        END_ENTRY,
4356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        PROPERTY_CREATED,
4456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    }
4556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
4656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    private class MockVCardInterpreter implements VCardInterpreter {
4756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        private final List<Order> mHistory = new ArrayList<Order>();
4856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        private final List<Order> mExpectedOrder = new ArrayList<Order>();
4956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
5056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        public MockVCardInterpreter addExpectedOrder(Order order) {
5156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            mExpectedOrder.add(order);
5256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            return this;
5356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
5456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
5556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        private void inspectOrder(Order order) {
5656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            mHistory.add(order);
5756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            final Order top = mExpectedOrder.get(0);
5856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            assertEquals(top, order);
5956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            mExpectedOrder.remove(0);
6056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
6156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
6256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        public void verify() {
6356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            assertTrue(String.format("Remaining: " + Arrays.toString(mExpectedOrder.toArray())),
6456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    mExpectedOrder.isEmpty());
6556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
6656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
6756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        @Override
6856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        public void onVCardStarted() {
6956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inspectOrder(Order.START);
7056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
7156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
7256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        @Override
7356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        public void onVCardEnded() {
7456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inspectOrder(Order.END);
7556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
7656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
7756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        @Override
7856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        public void onEntryStarted() {
7956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inspectOrder(Order.START_ENTRY);
8056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
8156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
8256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        @Override
8356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        public void onEntryEnded() {
8456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inspectOrder(Order.END_ENTRY);
8556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
8656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
8756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        @Override
8856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        public void onPropertyCreated(VCardProperty property) {
8956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inspectOrder(Order.PROPERTY_CREATED);
9056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
9156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    }
9256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
9356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    public void testSimple() throws IOException, VCardException {
9456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        InputStream inputStream = getContext().getResources().openRawResource(R.raw.v21_simple_1);
9556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        try {
9656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            VCardParser parser = new VCardParser_V21();
9756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            MockVCardInterpreter interpreter = new MockVCardInterpreter();
9856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.addExpectedOrder(Order.START)
9956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)
10056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)
10156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)
10256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END);
10356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.addInterpreter(interpreter);
10456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.parse(inputStream);
10556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.verify();
10656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        } finally {
10756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inputStream.close();
10856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
10956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    }
11056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
11156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    public void testNest() throws IOException, VCardException {
11256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        InputStream inputStream = getContext().getResources().openRawResource(R.raw.v21_nest);
11356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        try {
11456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            VCardParser parser = new VCardParser_V21();
11556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            MockVCardInterpreter interpreter = new MockVCardInterpreter();
11656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.addExpectedOrder(Order.START)
11756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)
11856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
11956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
12056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)  // First nested vCard begins
12156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
12256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
12356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)  // First nested vCard ends
12456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)  // Second nested vCard begins
12556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
12656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
12756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)  // Second nested vCard ends
12856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
12956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)
13056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END);
13156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.addInterpreter(interpreter);
13256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.parse(inputStream);
13356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.verify();
13456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        } finally {
13556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inputStream.close();
13656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
13756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    }
13856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
13956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    /**
140210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner     * Test vCard containing v3.0 line continuations and with non-standard
141210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner     * line terminators \r\r\n coming from iOS 6.1.3. Tests to make sure the
142210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner     * parser correctly skips the extra line terminators and still
143210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner     * successfully concatenates the multi-line block.
144210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner     */
145210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner    public void testIosMultiline() throws IOException, VCardException {
146210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner        InputStream inputStream = getContext().getResources().openRawResource(R.raw.v30_ios_613_multiline);
147210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner        try {
148210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner            VCardParser parser = new VCardParser_V30();
149210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner            MockVCardInterpreter interpreter = new MockVCardInterpreter();
150210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner            interpreter.addExpectedOrder(Order.START)
151210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.START_ENTRY)
152210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
153210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
154210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For FN
155210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For ORG
156210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For item1
157210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
158210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For item2
159210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For item3
160210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For PHOTO
161210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.END_ENTRY)
162210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner                    .addExpectedOrder(Order.END);
163210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner            parser.addInterpreter(interpreter);
164210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner            parser.parse(inputStream);
165210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner            interpreter.verify();
166210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner        } finally {
167210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner            inputStream.close();
168210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner        }
169210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner    }
170210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner
171210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner    /**
17256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa     * Tests if {@link VCardParser#parse(InputStream)} parses the whole vCard file and
17356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa     * {@link VCardParser#parseOne(InputStream)} parses just first entry of a vCard file
17456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa     * with multiple vCard entries.
17556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa     */
17656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    public void testParseOne() throws IOException, VCardException {
17756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        InputStream inputStream =
17856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                getContext().getResources().openRawResource(R.raw.v21_multiple_entry);
17956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        try {
18056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            VCardParser parser = new VCardParser_V21();
18156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            MockVCardInterpreter interpreter = new MockVCardInterpreter();
18256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.addExpectedOrder(Order.START)
18356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)
18456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
18556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
18656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
18756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
18856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
18956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
19056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
19156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)
19256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)
19356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
19456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
19556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
19656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
19756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
19856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
19956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
20056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)
20156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)
20256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
20356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
20456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
20556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
20656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
20756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
20856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
20956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)
21056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END);
21156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.addInterpreter(interpreter);
21256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            // Use parse() to check we
21356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.parse(inputStream);
21456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.verify();
21556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        } finally {
21656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inputStream.close();
21756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
21856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
21956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        inputStream = getContext().getResources().openRawResource(R.raw.v21_multiple_entry);
22056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        try {
22156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            VCardParser parser = new VCardParser_V21();
22256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            MockVCardInterpreter interpreter = new MockVCardInterpreter();
22356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.addExpectedOrder(Order.START)
22456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.START_ENTRY)
22556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
22656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
22756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
22856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
22956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
23056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
23156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
23256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END_ENTRY)
23356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa                    .addExpectedOrder(Order.END);
23456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.addInterpreter(interpreter);
23556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            parser.parseOne(inputStream);
23656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            interpreter.verify();
23756650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        } finally {
23856650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa            inputStream.close();
23956650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        }
24056650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
24156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    }
242210ebaab315e389ffc66278e28ecd6230e412b5fJay Shrauner}
243