1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package tests.api.org.xml.sax.ext;
18
19import junit.framework.TestCase;
20
21import org.xml.sax.Attributes;
22import org.xml.sax.ext.Attributes2Impl;
23import org.xml.sax.helpers.AttributesImpl;
24
25public class Attributes2ImplTest extends TestCase {
26
27    // Note: The original SAX2 implementation of Attributes2Impl is
28    // severely broken. Thus all of these tests will probably fail
29    // unless the Android implementation of the class gets fixed.
30
31    private Attributes2Impl empty = new Attributes2Impl();
32
33    private Attributes2Impl multi = new Attributes2Impl();
34
35    private Attributes2Impl cdata = new Attributes2Impl();
36
37    @Override
38    public void setUp() {
39        multi.addAttribute("http://some.uri", "foo", "ns1:foo",
40                "string", "abc");
41        multi.addAttribute("http://some.uri", "bar", "ns1:bar",
42                "string", "xyz");
43        multi.addAttribute("http://some.other.uri", "answer", "ns2:answer",
44                "int", "42");
45        multi.addAttribute("http://yet.another.uri", "gabba", "ns3:gabba",
46                "string", "gabba");
47
48        multi.setDeclared(0, false);
49        multi.setSpecified(0, false);
50
51        multi.setDeclared(1, true);
52        multi.setSpecified(1, false);
53
54        multi.setDeclared(2, false);
55        multi.setSpecified(2, true);
56
57        multi.setDeclared(3, true);
58        multi.setSpecified(3, true);
59
60        cdata.addAttribute("http://yet.another.uri", "hey", "ns3:hey",
61                "CDATA", "hey");
62    }
63
64    public void testSetAttributes() {
65        // Ordinary case with Attributes2Impl
66        Attributes2Impl attrs = new Attributes2Impl();
67        attrs.addAttribute("", "", "john", "string", "doe");
68
69        attrs.setAttributes(empty);
70        assertEquals(0, attrs.getLength());
71
72        attrs.setAttributes(multi);
73        for (int i = 0; i < multi.getLength(); i++) {
74            assertEquals(multi.getURI(i), attrs.getURI(i));
75            assertEquals(multi.getLocalName(i), attrs.getLocalName(i));
76            assertEquals(multi.getQName(i), attrs.getQName(i));
77            assertEquals(multi.getType(i), attrs.getType(i));
78            assertEquals(multi.getValue(i), attrs.getValue(i));
79            assertEquals(multi.isDeclared(i), attrs.isDeclared(i));
80            assertEquals(multi.isSpecified(i), attrs.isSpecified(i));
81        }
82
83        attrs.setAttributes(empty);
84        assertEquals(0, attrs.getLength());
85
86        // Ordinary case with AttributesImpl
87        attrs.setAttributes(new AttributesImpl(multi));
88        assertEquals(multi.getLength(), attrs.getLength());
89
90        for (int i = 0; i < multi.getLength(); i++) {
91            assertEquals(multi.getURI(i), attrs.getURI(i));
92            assertEquals(multi.getLocalName(i), attrs.getLocalName(i));
93            assertEquals(multi.getQName(i), attrs.getQName(i));
94            assertEquals(multi.getType(i), attrs.getType(i));
95            assertEquals(multi.getValue(i), attrs.getValue(i));
96            assertEquals(true, attrs.isDeclared(i));
97            assertEquals(true, attrs.isSpecified(i));
98        }
99
100        // Special case with CDATA
101        attrs.setAttributes(new AttributesImpl(cdata));
102        assertEquals(1, attrs.getLength());
103        assertEquals(false, attrs.isDeclared(0));
104        assertEquals(true, attrs.isSpecified(0));
105
106        // null case
107        try {
108            attrs.setAttributes(null);
109            fail("NullPointerException expected");
110        } catch (NullPointerException e) {
111            // Expected
112        }
113    }
114
115    public void testAddAttribute() {
116        Attributes2Impl attrs = new Attributes2Impl();
117
118        // Ordinary case
119        attrs.addAttribute("http://yet.another.uri", "doe", "john:doe",
120                "string", "abc");
121
122        assertEquals(1, attrs.getLength());
123
124        assertEquals("http://yet.another.uri", attrs.getURI(0));
125        assertEquals("doe", attrs.getLocalName(0));
126        assertEquals("john:doe", attrs.getQName(0));
127        assertEquals("string", attrs.getType(0));
128        assertEquals("abc", attrs.getValue(0));
129
130        assertEquals(true, attrs.isDeclared(0));
131        assertEquals(true, attrs.isSpecified(0));
132
133        // CDATA case
134        attrs.addAttribute("http://yet.another.uri", "doe", "jane:doe",
135                "CDATA", "abc");
136
137        assertEquals(2, attrs.getLength());
138
139        assertEquals("http://yet.another.uri", attrs.getURI(1));
140        assertEquals("doe", attrs.getLocalName(1));
141        assertEquals("jane:doe", attrs.getQName(1));
142        assertEquals("CDATA", attrs.getType(1));
143        assertEquals("abc", attrs.getValue(1));
144
145        assertEquals(false, attrs.isDeclared(1));
146        assertEquals(true, attrs.isSpecified(1));
147    }
148
149    public void testRemoveAttribute() {
150        Attributes2Impl attrs = new Attributes2Impl(multi);
151
152        // Ordinary case
153        attrs.removeAttribute(1);
154
155        assertEquals(3, attrs.getLength());
156
157        assertEquals(multi.getURI(0), attrs.getURI(0));
158        assertEquals(multi.getLocalName(0), attrs.getLocalName(0));
159        assertEquals(multi.getQName(0), attrs.getQName(0));
160        assertEquals(multi.getType(0), attrs.getType(0));
161        assertEquals(multi.getValue(0), attrs.getValue(0));
162        assertEquals(multi.isDeclared(0), attrs.isDeclared(0));
163        assertEquals(multi.isSpecified(0), attrs.isSpecified(0));
164
165        assertEquals(multi.getURI(2), attrs.getURI(1));
166        assertEquals(multi.getLocalName(2), attrs.getLocalName(1));
167        assertEquals(multi.getQName(2), attrs.getQName(1));
168        assertEquals(multi.getType(2), attrs.getType(1));
169        assertEquals(multi.getValue(2), attrs.getValue(1));
170        assertEquals(multi.isDeclared(2), attrs.isDeclared(1));
171        assertEquals(multi.isSpecified(2), attrs.isSpecified(1));
172
173        // Out of range
174        try {
175            attrs.removeAttribute(-1);
176            fail("ArrayIndexOutOfBoundsException expected");
177        } catch (ArrayIndexOutOfBoundsException e) {
178            // Expected
179        }
180
181        try {
182            attrs.removeAttribute(3);
183            fail("ArrayIndexOutOfBoundsException expected");
184        } catch (ArrayIndexOutOfBoundsException e) {
185            // Expected
186        }
187    }
188
189    public void testAttributes2Impl() {
190        assertEquals(0, empty.getLength());
191    }
192
193    public void testAttributes2ImplAttributes() {
194        // Ordinary case with Attributes2Impl
195        Attributes2Impl attrs = new Attributes2Impl(multi);
196        assertEquals(multi.getLength(), attrs.getLength());
197
198        for (int i = 0; i < multi.getLength(); i++) {
199            assertEquals(multi.getURI(i), attrs.getURI(i));
200            assertEquals(multi.getLocalName(i), attrs.getLocalName(i));
201            assertEquals(multi.getQName(i), attrs.getQName(i));
202            assertEquals(multi.getType(i), attrs.getType(i));
203            assertEquals(multi.getValue(i), attrs.getValue(i));
204            assertEquals(multi.isDeclared(i), attrs.isDeclared(i));
205            assertEquals(multi.isSpecified(i), attrs.isSpecified(i));
206        }
207
208        attrs = new Attributes2Impl(empty);
209        assertEquals(0, attrs.getLength());
210
211        // Ordinary case with AttributesImpl
212        attrs = new Attributes2Impl(new AttributesImpl(multi));
213        assertEquals(multi.getLength(), attrs.getLength());
214
215        for (int i = 0; i < multi.getLength(); i++) {
216            assertEquals(multi.getURI(i), attrs.getURI(i));
217            assertEquals(multi.getLocalName(i), attrs.getLocalName(i));
218            assertEquals(multi.getQName(i), attrs.getQName(i));
219            assertEquals(multi.getType(i), attrs.getType(i));
220            assertEquals(multi.getValue(i), attrs.getValue(i));
221            assertEquals(true, attrs.isDeclared(i));
222            assertEquals(true, attrs.isSpecified(i));
223        }
224
225        // Special case with CDATA
226        attrs = new Attributes2Impl(new AttributesImpl(cdata));
227        assertEquals(1, attrs.getLength());
228        assertEquals(false, attrs.isDeclared(0));
229        assertEquals(true, attrs.isSpecified(0));
230
231        // null case
232        try {
233            attrs = new Attributes2Impl(null);
234            fail("NullPointerException expected");
235        } catch (NullPointerException e) {
236            // Expected
237        }
238    }
239
240    public void testIsDeclaredInt() {
241        // Ordinary cases
242        assertEquals(false, multi.isDeclared(0));
243        assertEquals(true, multi.isDeclared(1));
244
245        // Out of range
246        try {
247            multi.isDeclared(-1);
248            fail("ArrayIndexOutOfBoundsException expected");
249        } catch (ArrayIndexOutOfBoundsException e) {
250            // Expected
251        }
252
253        try {
254            multi.isDeclared(4);
255            fail("ArrayIndexOutOfBoundsException expected");
256        } catch (ArrayIndexOutOfBoundsException e) {
257            // Expected
258        }
259    }
260
261    public void testIsDeclaredStringString() {
262        // Ordinary cases
263        assertEquals(false, multi.isDeclared("http://some.uri", "foo"));
264        assertEquals(true, multi.isDeclared("http://some.uri", "bar"));
265
266        // Not found
267        try {
268            assertFalse(multi.isDeclared("not", "found"));
269            fail("IllegalArgumentException expected");
270        } catch (IllegalArgumentException e) {
271            // Expected
272        }
273    }
274
275    public void testIsDeclaredString() {
276        // Ordinary cases
277        assertEquals(false, multi.isDeclared("ns1:foo"));
278        assertEquals(true, multi.isDeclared("ns1:bar"));
279
280        // Not found
281        try {
282            assertFalse(multi.isDeclared("notfound"));
283            fail("IllegalArgumentException expected");
284        } catch (IllegalArgumentException e) {
285            // Expected
286        }
287    }
288
289    public void testIsSpecifiedInt() {
290        // Ordinary cases
291        assertEquals(false, multi.isSpecified(1));
292        assertEquals(true, multi.isSpecified(2));
293
294        // Out of range
295        try {
296            multi.isSpecified(-1);
297            fail("ArrayIndexOutOfBoundsException expected");
298        } catch (ArrayIndexOutOfBoundsException e) {
299            // Expected
300        }
301
302        try {
303            multi.isSpecified(4);
304            fail("ArrayIndexOutOfBoundsException expected");
305        } catch (ArrayIndexOutOfBoundsException e) {
306            // Expected
307        }
308    }
309
310    public void testIsSpecifiedStringString() {
311        // Ordinary cases
312        assertEquals(false, multi.isSpecified("http://some.uri", "bar"));
313        assertEquals(true, multi.isSpecified("http://some.other.uri", "answer"));
314
315        // Not found
316        try {
317            assertFalse(multi.isSpecified("not", "found"));
318            fail("IllegalArgumentException expected");
319        } catch (IllegalArgumentException e) {
320            // Expected
321        }
322    }
323
324    public void testIsSpecifiedString() {
325        // Ordinary cases
326        assertEquals(false, multi.isSpecified("ns1:bar"));
327        assertEquals(true, multi.isSpecified("ns2:answer"));
328
329        // Not found
330        try {
331            assertFalse(multi.isSpecified("notfound"));
332            fail("IllegalArgumentException expected");
333        } catch (IllegalArgumentException e) {
334            // Expected
335        }
336    }
337
338    public void testSetDeclared() {
339        // Ordinary cases
340        multi.setSpecified(0, false);
341        assertEquals(false, multi.isSpecified(0));
342
343        multi.setSpecified(0, true);
344        assertEquals(true, multi.isSpecified(0));
345
346        multi.setSpecified(0, false);
347        assertEquals(false, multi.isSpecified(0));
348
349        // Out of range
350        try {
351            multi.setSpecified(-1, true);
352            fail("ArrayIndexOutOfBoundsException expected");
353        } catch (ArrayIndexOutOfBoundsException e) {
354            // Expected
355        }
356
357        try {
358            multi.setSpecified(5, true);
359            fail("ArrayIndexOutOfBoundsException expected");
360        } catch (ArrayIndexOutOfBoundsException e) {
361            // Expected
362        }
363    }
364
365    public void testSetSpecified() {
366        // Ordinary cases
367        multi.setSpecified(0, false);
368        assertEquals(false, multi.isSpecified(0));
369
370        multi.setSpecified(0, true);
371        assertEquals(true, multi.isSpecified(0));
372
373        multi.setSpecified(0, false);
374        assertEquals(false, multi.isSpecified(0));
375
376        // Out of range
377        try {
378            multi.setSpecified(-1, true);
379            fail("ArrayIndexOutOfBoundsException expected");
380        } catch (ArrayIndexOutOfBoundsException e) {
381            // Expected
382        }
383
384        try {
385            multi.setSpecified(5, true);
386            fail("ArrayIndexOutOfBoundsException expected");
387        } catch (ArrayIndexOutOfBoundsException e) {
388            // Expected
389        }
390    }
391
392}
393