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 org.apache.harmony.tests.org.xml.sax.helpers;
18
19import junit.framework.TestCase;
20
21import org.xml.sax.Attributes;
22import org.xml.sax.helpers.AttributesImpl;
23
24public class AttributesImplTest extends TestCase {
25
26    private AttributesImpl empty = new AttributesImpl();
27
28    private AttributesImpl multi = new AttributesImpl();
29
30    @Override
31    public void setUp() {
32        multi.addAttribute("http://some.uri", "foo", "ns1:foo",
33                "string", "abc");
34        multi.addAttribute("http://some.uri", "bar", "ns1:bar",
35                "string", "xyz");
36        multi.addAttribute("http://some.other.uri", "answer", "ns2:answer",
37                "int", "42");
38
39        multi.addAttribute("", "gabbaHey", "", "string", "1-2-3-4");
40        multi.addAttribute("", "", "gabba:hey", "string", "1-2-3-4");
41    }
42
43    public void testAttributesImpl() {
44        assertEquals(0, empty.getLength());
45        assertEquals(5, multi.getLength());
46    }
47
48    public void testAttributesImplAttributes() {
49        // Ordinary case
50        AttributesImpl ai = new AttributesImpl(empty);
51        assertEquals(0, ai.getLength());
52
53        // Another ordinary case
54        ai = new AttributesImpl(multi);
55        assertEquals(5, ai.getLength());
56
57        // No Attributes
58        try {
59            ai = new AttributesImpl(null);
60            assertEquals(0, ai.getLength());
61            fail("NullPointerException expected");
62        } catch (NullPointerException e) {
63            // Expected
64        }
65    }
66
67    public void testGetLength() {
68        AttributesImpl ai = new AttributesImpl(empty);
69        assertEquals(0, ai.getLength());
70
71        ai = new AttributesImpl(multi);
72        assertEquals(5, ai.getLength());
73
74        for (int i = 4; i >= 0; i--) {
75            ai.removeAttribute(i);
76            assertEquals(i, ai.getLength());
77        }
78    }
79
80    public void testGetURI() {
81        // Ordinary cases
82        assertEquals("http://some.uri", multi.getURI(0));
83        assertEquals("http://some.uri", multi.getURI(1));
84        assertEquals("http://some.other.uri", multi.getURI(2));
85        assertEquals("", multi.getURI(3));
86        assertEquals("", multi.getURI(4));
87
88        // Out of range
89        assertEquals(null, multi.getURI(-1));
90        assertEquals(null, multi.getURI(5));
91    }
92
93    public void testGetLocalName() {
94        // Ordinary cases
95        assertEquals("foo", multi.getLocalName(0));
96        assertEquals("bar", multi.getLocalName(1));
97        assertEquals("answer", multi.getLocalName(2));
98        assertEquals("gabbaHey", multi.getLocalName(3));
99        assertEquals("", multi.getLocalName(4));
100
101        // Out of range
102        assertEquals(null, multi.getLocalName(-1));
103        assertEquals(null, multi.getLocalName(5));
104    }
105
106    public void testGetQName() {
107        // Ordinary cases
108        assertEquals("ns1:foo", multi.getQName(0));
109        assertEquals("ns1:bar", multi.getQName(1));
110        assertEquals("ns2:answer", multi.getQName(2));
111        assertEquals("", multi.getQName(3));
112        assertEquals("gabba:hey", multi.getQName(4));
113
114        // Out of range
115        assertEquals(null, multi.getQName(-1));
116        assertEquals(null, multi.getQName(5));
117    }
118
119    public void testGetTypeInt() {
120        // Ordinary cases
121        assertEquals("string", multi.getType(0));
122        assertEquals("string", multi.getType(1));
123        assertEquals("int", multi.getType(2));
124        assertEquals("string", multi.getType(3));
125        assertEquals("string", multi.getType(4));
126
127        // Out of range
128        assertEquals(null, multi.getType(-1));
129        assertEquals(null, multi.getType(5));
130    }
131
132    public void testGetValueInt() {
133        // Ordinary cases
134        assertEquals("abc", multi.getValue(0));
135        assertEquals("xyz", multi.getValue(1));
136        assertEquals("42", multi.getValue(2));
137        assertEquals("1-2-3-4", multi.getValue(3));
138        assertEquals("1-2-3-4", multi.getValue(4));
139
140        // Out of range
141        assertEquals(null, multi.getValue(-1));
142        assertEquals(null, multi.getValue(5));
143    }
144
145    public void testGetIndexStringString() {
146        // Ordinary cases
147        assertEquals(0, multi.getIndex("http://some.uri", "foo"));
148        assertEquals(1, multi.getIndex("http://some.uri", "bar"));
149        assertEquals(2, multi.getIndex("http://some.other.uri", "answer"));
150
151        // Not found
152        assertEquals(-1, multi.getIndex("john", "doe"));
153
154        // null cases
155        assertEquals(-1, multi.getIndex("http://some.uri", null));
156        assertEquals(-1, multi.getIndex(null, "foo"));
157    }
158
159    public void testGetIndexString() {
160        // Ordinary cases
161        assertEquals(0, multi.getIndex("ns1:foo"));
162        assertEquals(1, multi.getIndex("ns1:bar"));
163        assertEquals(2, multi.getIndex("ns2:answer"));
164        assertEquals(4, multi.getIndex("gabba:hey"));
165
166        // Not found
167        assertEquals(-1, multi.getIndex("john:doe"));
168
169        // null case
170        assertEquals(-1, multi.getIndex(null));
171    }
172
173    public void testGetTypeStringString() {
174        // Ordinary cases
175        assertEquals("string", multi.getType("http://some.uri", "foo"));
176        assertEquals("string", multi.getType("http://some.uri", "bar"));
177        assertEquals("int", multi.getType("http://some.other.uri", "answer"));
178
179        // Not found
180        assertEquals(null, multi.getType("john", "doe"));
181
182        // null cases
183        assertEquals(null, multi.getType("http://some.uri", null));
184        assertEquals(null, multi.getType(null, "foo"));
185    }
186
187    public void testGetTypeString() {
188        // Ordinary cases
189        assertEquals("string", multi.getType("ns1:foo"));
190        assertEquals("string", multi.getType("ns1:bar"));
191        assertEquals("int", multi.getType("ns2:answer"));
192        assertEquals("string", multi.getType("gabba:hey"));
193
194        // Not found
195        assertEquals(null, multi.getType("john:doe"));
196
197        // null case
198        assertEquals(null, multi.getType(null));
199    }
200
201    public void testGetValueStringString() {
202        // Ordinary cases
203        assertEquals("abc", multi.getValue("http://some.uri", "foo"));
204        assertEquals("xyz", multi.getValue("http://some.uri", "bar"));
205        assertEquals("42", multi.getValue("http://some.other.uri", "answer"));
206
207        // Not found
208        assertEquals(null, multi.getValue("john", "doe"));
209
210        // null cases
211        assertEquals(null, multi.getValue("http://some.uri", null));
212        assertEquals(null, multi.getValue(null, "foo"));
213    }
214
215    public void testGetValueString() {
216        // Ordinary cases
217        assertEquals("abc", multi.getValue("ns1:foo"));
218        assertEquals("xyz", multi.getValue("ns1:bar"));
219        assertEquals("42", multi.getValue("ns2:answer"));
220        assertEquals("1-2-3-4", multi.getValue("gabba:hey"));
221
222        // Not found
223        assertEquals(null, multi.getValue("john:doe"));
224
225        // null case
226        assertEquals(null, multi.getValue(null));
227    }
228
229    public void testClear() {
230        assertEquals(5, multi.getLength());
231        multi.clear();
232        assertEquals(0, multi.getLength());
233    }
234
235    public void testSetAttributes() {
236        // Ordinary cases
237        AttributesImpl attrs = new AttributesImpl();
238        attrs.addAttribute("http://yet.another.uri", "doe", "john:doe",
239                "boolean", "false");
240
241        attrs.setAttributes(empty);
242        assertEquals(0, attrs.getLength());
243
244        attrs.setAttributes(multi);
245        assertEquals(multi.getLength(), attrs.getLength());
246
247        for (int i = 0; i < multi.getLength(); i++) {
248            assertEquals(multi.getURI(i), attrs.getURI(i));
249            assertEquals(multi.getLocalName(i), attrs.getLocalName(i));
250            assertEquals(multi.getQName(i), attrs.getQName(i));
251            assertEquals(multi.getType(i), attrs.getType(i));
252            assertEquals(multi.getValue(i), attrs.getValue(i));
253        }
254
255        // null case
256        try {
257            attrs.setAttributes(null);
258            fail("NullPointerException expected");
259        } catch (NullPointerException e) {
260            // Expected, but must be empty now
261            assertEquals(0, attrs.getLength());
262        }
263    }
264
265    public void testAddAttribute() {
266        // Ordinary case
267        multi.addAttribute("http://yet.another.uri", "doe", "john:doe",
268                "boolean", "false");
269
270        assertEquals("http://yet.another.uri", multi.getURI(5));
271        assertEquals("doe", multi.getLocalName(5));
272        assertEquals("john:doe", multi.getQName(5));
273        assertEquals("boolean", multi.getType(5));
274        assertEquals("false", multi.getValue(5));
275
276        // Duplicate case
277        multi.addAttribute("http://yet.another.uri", "doe", "john:doe",
278                "boolean", "false");
279
280        assertEquals("http://yet.another.uri", multi.getURI(6));
281        assertEquals("doe", multi.getLocalName(6));
282        assertEquals("john:doe", multi.getQName(6));
283        assertEquals("boolean", multi.getType(6));
284        assertEquals("false", multi.getValue(6));
285
286        // null case
287        multi.addAttribute(null, null, null, null, null);
288        assertEquals(null, multi.getURI(7));
289        assertEquals(null, multi.getLocalName(7));
290        assertEquals(null, multi.getQName(7));
291        assertEquals(null, multi.getType(7));
292        assertEquals(null, multi.getValue(7));
293    }
294
295    public void testSetAttribute() {
296        // Ordinary case
297        multi.setAttribute(0, "http://yet.another.uri", "doe", "john:doe",
298                "boolean", "false");
299        assertEquals("http://yet.another.uri", multi.getURI(0));
300        assertEquals("doe", multi.getLocalName(0));
301        assertEquals("john:doe", multi.getQName(0));
302        assertEquals("boolean", multi.getType(0));
303        assertEquals("false", multi.getValue(0));
304
305        // null case
306        multi.setAttribute(1, null, null, null, null, null);
307        assertEquals(null, multi.getURI(1));
308        assertEquals(null, multi.getLocalName(1));
309        assertEquals(null, multi.getQName(1));
310        assertEquals(null, multi.getType(1));
311        assertEquals(null, multi.getValue(1));
312
313        // Out of range
314        try {
315            multi.setAttribute(-1, "http://yet.another.uri", "doe", "john:doe",
316                    "boolean", "false");
317            fail("ArrayIndexOutOfBoundsException expected");
318        } catch (ArrayIndexOutOfBoundsException e) {
319            // Expected
320        }
321
322        try {
323            multi.setAttribute(5, "http://yet.another.uri", "doe", "john:doe",
324                    "boolean", "false");
325            fail("ArrayIndexOutOfBoundsException expected");
326        } catch (ArrayIndexOutOfBoundsException e) {
327            // Expected
328        }
329    }
330
331    public void testRemoveAttribute() {
332        // Ordinary case
333        multi.removeAttribute(0);
334        assertEquals("http://some.uri", multi.getURI(0));
335        assertEquals("bar", multi.getLocalName(0));
336        assertEquals("ns1:bar", multi.getQName(0));
337        assertEquals("string", multi.getType(0));
338        assertEquals("xyz", multi.getValue(0));
339
340        // Out of range
341        try {
342            multi.removeAttribute(-1);
343            fail("ArrayIndexOutOfBoundsException expected");
344        } catch (ArrayIndexOutOfBoundsException e) {
345            // Expected
346        }
347
348        try {
349            multi.removeAttribute(4);
350            fail("ArrayIndexOutOfBoundsException expected");
351        } catch (ArrayIndexOutOfBoundsException e) {
352            // Expected
353        }
354    }
355
356    public void testSetURI() {
357        // Ordinary case
358        multi.setURI(0, "http://yet.another.uri");
359        assertEquals("http://yet.another.uri", multi.getURI(0));
360
361        // null case
362        multi.setURI(1, null);
363        assertEquals(null, multi.getURI(1));
364
365        // Out of range
366        try {
367            multi.setURI(-1, "http://yet.another.uri");
368            fail("ArrayIndexOutOfBoundsException expected");
369        } catch (ArrayIndexOutOfBoundsException e) {
370            // Expected
371        }
372
373        try {
374            multi.setURI(5, "http://yet.another.uri");
375            fail("ArrayIndexOutOfBoundsException expected");
376        } catch (ArrayIndexOutOfBoundsException e) {
377            // Expected
378        }
379    }
380
381    public void testSetLocalName() {
382        // Ordinary case
383        multi.setLocalName(0, "john");
384        assertEquals("john", multi.getLocalName(0));
385
386        // null case
387        multi.setLocalName(1, null);
388        assertEquals(null, multi.getLocalName(1));
389
390        // Out of range
391        try {
392            multi.setLocalName(-1, "john");
393            fail("ArrayIndexOutOfBoundsException expected");
394        } catch (ArrayIndexOutOfBoundsException e) {
395            // Expected
396        }
397
398        try {
399            multi.setLocalName(5, "john");
400            fail("ArrayIndexOutOfBoundsException expected");
401        } catch (ArrayIndexOutOfBoundsException e) {
402            // Expected
403        }
404    }
405
406    public void testSetQName() {
407        // Ordinary case
408        multi.setQName(0, "john:doe");
409        assertEquals("john:doe", multi.getQName(0));
410
411        // null case
412        multi.setQName(1, null);
413        assertEquals(null, multi.getQName(1));
414
415        // Out of range
416        try {
417            multi.setQName(-1, "john:doe");
418            fail("ArrayIndexOutOfBoundsException expected");
419        } catch (ArrayIndexOutOfBoundsException e) {
420            // Expected
421        }
422
423        try {
424            multi.setQName(5, "john:doe");
425            fail("ArrayIndexOutOfBoundsException expected");
426        } catch (ArrayIndexOutOfBoundsException e) {
427            // Expected
428        }
429    }
430
431    public void testSetType() {
432        // Ordinary case
433        multi.setType(0, "float");
434        assertEquals("float", multi.getType(0));
435
436        // null case
437        multi.setType(1, null);
438        assertEquals(null, multi.getType(1));
439
440        // Out of range
441        try {
442            multi.setType(-1, "float");
443            fail("ArrayIndexOutOfBoundsException expected");
444        } catch (ArrayIndexOutOfBoundsException e) {
445            // Expected
446        }
447
448        try {
449            multi.setType(5, "float");
450            fail("ArrayIndexOutOfBoundsException expected");
451        } catch (ArrayIndexOutOfBoundsException e) {
452            // Expected
453        }
454    }
455
456    public void testSetValue() {
457        // Ordinary case
458        multi.setValue(0, "too much");
459        assertEquals("too much", multi.getValue(0));
460
461        // null case
462        multi.setValue(1, null);
463        assertEquals(null, multi.getValue(1));
464
465        // Out of range
466        try {
467            multi.setValue(-1, "too much");
468            fail("ArrayIndexOutOfBoundsException expected");
469        } catch (ArrayIndexOutOfBoundsException e) {
470            // Expected
471        }
472
473        try {
474            multi.setValue(5, "too much");
475            fail("ArrayIndexOutOfBoundsException expected");
476        } catch (ArrayIndexOutOfBoundsException e) {
477            // Expected
478        }
479    }
480
481}
482