1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.vcard.tests;
17
18import com.android.vcard.VCardInterpreter;
19import com.android.vcard.VCardParser;
20import com.android.vcard.VCardParser_V21;
21import com.android.vcard.VCardProperty;
22import com.android.vcard.exception.VCardException;
23
24import android.test.AndroidTestCase;
25
26import java.io.IOException;
27import java.io.InputStream;
28import java.util.ArrayList;
29import java.util.Arrays;
30import java.util.List;
31
32/**
33 * Tests for basic {@link VCardParser} capability (e.g. if it calls callbacks
34 * in {@link VCardInterpreter}}.
35 */
36public class VCardParserTests extends AndroidTestCase {
37    private enum Order {
38        START,
39        END,
40        START_ENTRY,
41        END_ENTRY,
42        PROPERTY_CREATED,
43    }
44
45    private class MockVCardInterpreter implements VCardInterpreter {
46        private final List<Order> mHistory = new ArrayList<Order>();
47        private final List<Order> mExpectedOrder = new ArrayList<Order>();
48
49        public MockVCardInterpreter addExpectedOrder(Order order) {
50            mExpectedOrder.add(order);
51            return this;
52        }
53
54        private void inspectOrder(Order order) {
55            mHistory.add(order);
56            final Order top = mExpectedOrder.get(0);
57            assertEquals(top, order);
58            mExpectedOrder.remove(0);
59        }
60
61        public void verify() {
62            assertTrue(String.format("Remaining: " + Arrays.toString(mExpectedOrder.toArray())),
63                    mExpectedOrder.isEmpty());
64        }
65
66        @Override
67        public void onVCardStarted() {
68            inspectOrder(Order.START);
69        }
70
71        @Override
72        public void onVCardEnded() {
73            inspectOrder(Order.END);
74        }
75
76        @Override
77        public void onEntryStarted() {
78            inspectOrder(Order.START_ENTRY);
79        }
80
81        @Override
82        public void onEntryEnded() {
83            inspectOrder(Order.END_ENTRY);
84        }
85
86        @Override
87        public void onPropertyCreated(VCardProperty property) {
88            inspectOrder(Order.PROPERTY_CREATED);
89        }
90    }
91
92    public void testSimple() throws IOException, VCardException {
93        InputStream inputStream = getContext().getResources().openRawResource(R.raw.v21_simple_1);
94        try {
95            VCardParser parser = new VCardParser_V21();
96            MockVCardInterpreter interpreter = new MockVCardInterpreter();
97            interpreter.addExpectedOrder(Order.START)
98                    .addExpectedOrder(Order.START_ENTRY)
99                    .addExpectedOrder(Order.PROPERTY_CREATED)
100                    .addExpectedOrder(Order.END_ENTRY)
101                    .addExpectedOrder(Order.END);
102            parser.addInterpreter(interpreter);
103            parser.parse(inputStream);
104            interpreter.verify();
105        } finally {
106            inputStream.close();
107        }
108    }
109
110    public void testNest() throws IOException, VCardException {
111        InputStream inputStream = getContext().getResources().openRawResource(R.raw.v21_nest);
112        try {
113            VCardParser parser = new VCardParser_V21();
114            MockVCardInterpreter interpreter = new MockVCardInterpreter();
115            interpreter.addExpectedOrder(Order.START)
116                    .addExpectedOrder(Order.START_ENTRY)
117                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
118                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
119                    .addExpectedOrder(Order.START_ENTRY)  // First nested vCard begins
120                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
121                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
122                    .addExpectedOrder(Order.END_ENTRY)  // First nested vCard ends
123                    .addExpectedOrder(Order.START_ENTRY)  // Second nested vCard begins
124                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
125                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
126                    .addExpectedOrder(Order.END_ENTRY)  // Second nested vCard ends
127                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
128                    .addExpectedOrder(Order.END_ENTRY)
129                    .addExpectedOrder(Order.END);
130            parser.addInterpreter(interpreter);
131            parser.parse(inputStream);
132            interpreter.verify();
133        } finally {
134            inputStream.close();
135        }
136    }
137
138    /**
139     * Tests if {@link VCardParser#parse(InputStream)} parses the whole vCard file and
140     * {@link VCardParser#parseOne(InputStream)} parses just first entry of a vCard file
141     * with multiple vCard entries.
142     */
143    public void testParseOne() throws IOException, VCardException {
144        InputStream inputStream =
145                getContext().getResources().openRawResource(R.raw.v21_multiple_entry);
146        try {
147            VCardParser parser = new VCardParser_V21();
148            MockVCardInterpreter interpreter = new MockVCardInterpreter();
149            interpreter.addExpectedOrder(Order.START)
150                    .addExpectedOrder(Order.START_ENTRY)
151                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
152                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
153                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
154                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
155                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
156                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
157                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
158                    .addExpectedOrder(Order.END_ENTRY)
159                    .addExpectedOrder(Order.START_ENTRY)
160                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
161                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
162                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
163                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
164                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
165                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
166                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
167                    .addExpectedOrder(Order.END_ENTRY)
168                    .addExpectedOrder(Order.START_ENTRY)
169                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
170                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
171                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
172                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
173                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
174                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
175                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
176                    .addExpectedOrder(Order.END_ENTRY)
177                    .addExpectedOrder(Order.END);
178            parser.addInterpreter(interpreter);
179            // Use parse() to check we
180            parser.parse(inputStream);
181            interpreter.verify();
182        } finally {
183            inputStream.close();
184        }
185
186        inputStream = getContext().getResources().openRawResource(R.raw.v21_multiple_entry);
187        try {
188            VCardParser parser = new VCardParser_V21();
189            MockVCardInterpreter interpreter = new MockVCardInterpreter();
190            interpreter.addExpectedOrder(Order.START)
191                    .addExpectedOrder(Order.START_ENTRY)
192                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For VERSION
193                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For N
194                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For SOUND
195                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
196                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
197                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
198                    .addExpectedOrder(Order.PROPERTY_CREATED)  // For TEL
199                    .addExpectedOrder(Order.END_ENTRY)
200                    .addExpectedOrder(Order.END);
201            parser.addInterpreter(interpreter);
202            parser.parseOne(inputStream);
203            interpreter.verify();
204        } finally {
205            inputStream.close();
206        }
207
208    }
209}