PullParserTest.java revision fda724de28fe86804e6ef6a0afd7ae5be1529083
1b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson/*
2b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * Copyright (C) 2010 The Android Open Source Project
3b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson *
4b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * you may not use this file except in compliance with the License.
6b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * You may obtain a copy of the License at
7b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson *
8b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson *
10b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * See the License for the specific language governing permissions and
14b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * limitations under the License.
15b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson */
16b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
17b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonpackage org.apache.harmony.xml;
18b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
19b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport java.io.ByteArrayInputStream;
20b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport java.io.IOException;
21b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport java.io.StringReader;
22b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport junit.framework.TestCase;
23b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport org.xmlpull.v1.XmlPullParser;
24b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport org.xmlpull.v1.XmlPullParserException;
25b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
26b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonpublic abstract class PullParserTest extends TestCase {
27b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
28406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testAttributeNoValueWithRelaxed() throws Exception {
29406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
30406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
31406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<input checked></input>"));
32406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
33406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("input", parser.getName());
34406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("checked", parser.getAttributeName(0));
35406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("checked", parser.getAttributeValue(0));
36406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
37406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
38406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testAttributeUnquotedValueWithRelaxed() throws Exception {
39406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
40406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
41406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<input checked=true></input>"));
42406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
43406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("input", parser.getName());
44406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("checked", parser.getAttributeName(0));
45406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("true", parser.getAttributeValue(0));
46406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
47406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
48406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testUnterminatedEntityWithRelaxed() throws Exception {
49406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
50406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
51406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo bar='A&W'>mac&cheese</foo>"));
52406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
53406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("foo", parser.getName());
54406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("bar", parser.getAttributeName(0));
55406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("A&W", parser.getAttributeValue(0));
56406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
57406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("mac&cheese", parser.getText());
58406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
59406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
60406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testEntitiesAndNamespaces() throws Exception {
61406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
62406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#process-namespaces", true);
63406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
64406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo:a xmlns:foo='http://foo' xmlns:bar='http://bar'><bar:b/></foo:a>"));
65406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testNamespace(parser);
66406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
67406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
68406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testEntitiesAndNamespacesWithRelaxed() throws Exception {
69406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
70406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#process-namespaces", true);
71406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
72406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
73406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo:a xmlns:foo='http://foo' xmlns:bar='http://bar'><bar:b/></foo:a>"));
74406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testNamespace(parser); // TODO: end tag fails on gingerbread for relaxed mode
75406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
76406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
77406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    private void testNamespace(XmlPullParser parser) throws XmlPullParserException, IOException {
78406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
79406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://foo", parser.getNamespace());
80406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("a", parser.getName());
81406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
82406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://bar", parser.getNamespace());
83406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b", parser.getName());
84406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
85406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://bar", parser.getNamespace());
86406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b", parser.getName());
87406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
88406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://foo", parser.getNamespace());
89406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("a", parser.getName());
90406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
91406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
92406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLargeNumericEntities() throws Exception {
93406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
94406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
95406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo>&#2147483647; &#-2147483648;</foo>"));
96406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
97406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
98406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        // TODO: this can't possibly be what the spec wants; it should refuse too-large characters
99406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(new String(new char[] { (char) 2147483647, ' ', (char) -2147483648}),
100406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                parser.getText());
101406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
102406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
103406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testVeryLargeNumericEntities() throws Exception {
104406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
105406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
106406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo>&#2147483648;</foo>"));
107406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
108fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        // TODO: this can't possibly be what the spec wants; it should throw another type
109fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
110406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
111406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
112406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testOmittedNumericEntities() throws Exception {
113406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
114406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>&#;</foo>"));
115406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
116fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        // TODO: this can't possibly be what the spec wants; it should throw another type
117fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
118406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
119406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
120406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    /**
121406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     * Carriage returns followed by line feeds are silently discarded.
122406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     */
123406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCarriageReturnLineFeed() throws Exception {
124406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testLineEndings("\r\n<foo\r\na='b\r\nc'\r\n>d\r\ne</foo\r\n>\r\n");
125406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
126406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
127406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    /**
128406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     * Lone carriage returns are treated like newlines.
129406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     */
130406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLoneCarriageReturn() throws Exception {
131406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testLineEndings("\r<foo\ra='b\rc'\r>d\re</foo\r>\r");
132406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
133406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
134406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLoneNewLine() throws Exception {
135406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testLineEndings("\n<foo\na='b\nc'\n>d\ne</foo\n>\n");
136406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
137406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
138406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    private void testLineEndings(String xml) throws XmlPullParserException, IOException {
139406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
140406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(xml));
141406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
142406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("foo", parser.getName());
143406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b c", parser.getAttributeValue(0));
144406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
145406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("d\ne", parser.getText());
146406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
147406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("foo", parser.getName());
148406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
149406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
150406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
151406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testXmlDeclaration() throws Exception {
152406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
153406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
154406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<?xml version='1.0' encoding='UTF-8' standalone='no'?><foo/>"));
155406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
156406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("1.0", parser.getProperty(
157406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "http://xmlpull.org/v1/doc/properties.html#xmldecl-version"));
158406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(Boolean.FALSE, parser.getProperty(
159406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone"));
160406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("UTF-8", parser.getInputEncoding());
161406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
162406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
163406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testXmlDeclarationExtraAttributes() throws Exception {
164406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
165406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
166406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<?xml version='1.0' encoding='UTF-8' standalone='no' a='b'?><foo/>"));
167b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        try {
168406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson            parser.nextToken();
169406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson            fail();
170406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        } catch (XmlPullParserException expected) {
171b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        }
172b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
173b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
174406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCustomEntitiesUsingNext() throws Exception {
175406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
176406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
177406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo a='cd&aaaaaaaaaa;ef'>wx&aaaaaaaaaa;yz</foo>"));
178406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.defineEntityReplacementText("aaaaaaaaaa", "b");
179406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
180406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cdbef", parser.getAttributeValue(0));
181406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
182406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("wxbyz", parser.getText());
183406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
184406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
185406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCustomEntitiesUsingNextToken() throws Exception {
186406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
187406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
188406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo a='cd&aaaaaaaaaa;ef'>wx&aaaaaaaaaa;yz</foo>"));
189406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.defineEntityReplacementText("aaaaaaaaaa", "b");
190406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
191406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cdbef", parser.getAttributeValue(0));
192406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
193406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("wx", parser.getText());
194406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken());
195406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("aaaaaaaaaa", parser.getName());
196406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b", parser.getText());
197406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
198406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("yz", parser.getText());
199406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
200406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
201406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testGreaterThanInText() throws Exception {
202406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
203406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>></foo>"));
204406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
205406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
206406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(">", parser.getText()); // TODO: this should probably fail?
207406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
208406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
209406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testGreaterThanInAttribute() throws Exception{
210406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
211406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo a='>'></foo>"));
212406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
213406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(">", parser.getAttributeValue(0)); // TODO: this should probably fail?
214406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
215406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
216406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLessThanInText() throws Exception{
217406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
218406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo><</foo>"));
219406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
220fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
221406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
222406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
223406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLessThanInAttribute() throws Exception{
224406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
225406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo a='<'></foo>"));
226fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
227406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
228406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
229406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testQuotesInAttribute() throws Exception{
230406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
231406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo a='\"' b=\"'\"></foo>"));
232406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
233406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("\"", parser.getAttributeValue(0));
234406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("'", parser.getAttributeValue(1));
235406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
236406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
237406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testQuotesInText() throws Exception{
238406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
239406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>\" '</foo>"));
240406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
241406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
242406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("\" '", parser.getText());
243406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
244406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
245406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCdataDelimiterInAttribute() throws Exception{
246406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
247406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo a=']]>'></foo>"));
248406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
249406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("]]>", parser.getAttributeValue(0));
250406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
251406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
252406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCdataDelimiterInText() throws Exception{
253406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
254406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>]]></foo>"));
255406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
256fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
257fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
258fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
259fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testUnexpectedEof() throws Exception {
260fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
261fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><![C"));
262fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
263fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
264fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
265fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
266fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testUnexpectedSequence() throws Exception {
267fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
268fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><![Cdata[bar]]></foo>"));
269fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
270fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
271fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
272fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
273fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testThreeDashCommentDelimiter() throws Exception {
274fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
275fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><!--a---></foo>"));
276fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
277fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
278fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
279fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
280fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testTwoDashesInComment() throws Exception {
281fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
282fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><!-- -- --></foo>"));
283fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
284fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        // TODO: confirm with the spec that this should fail
285fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertNextFails(parser);
286fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
287fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
288fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testEmptyComment() throws Exception {
289fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
290fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><!----></foo>"));
291fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
292fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
293fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("", parser.getText());
294406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
295406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
296406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    /**
297406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     * Close braces require lookaheads because we need to defend against "]]>".
298406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     */
299406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testManyCloseBraces() throws Exception{
300406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
301406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>]]]]]]]]]]]]]]]]]]]]]]]</foo>"));
302406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
303406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
304406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("]]]]]]]]]]]]]]]]]]]]]]]", parser.getText());
305406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
306406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
307406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCommentWithNext() throws Exception {
308406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
309406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<!-- comment! -->cd</foo>"));
310406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
311406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
312406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("abcd", parser.getText());
313406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
314406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
315406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCommentWithNextToken() throws Exception {
316406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
317406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<!-- comment! -->cd</foo>"));
318406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
319406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
320406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("ab", parser.getText());
321406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
322406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(" comment! ", parser.getText());
323406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
324406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cd", parser.getText());
325406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
326406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
327406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCdataWithNext() throws Exception {
328406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
329406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<![CDATA[cdef]]gh&amp;i]]>jk</foo>"));
330406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
331406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
332406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("abcdef]]gh&amp;ijk", parser.getText());
333406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
334406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
335406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
336406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCdataWithNextToken() throws Exception {
337406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
338406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<![CDATA[cdef]]gh&amp;i]]>jk</foo>"));
339406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
340406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
341406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("ab", parser.getText());
342406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.CDSECT, parser.nextToken());
343406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cdef]]gh&amp;i", parser.getText());
344406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
345406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("jk", parser.getText());
346406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
347406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
348406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
349406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testEntityLooksLikeCdataClose() throws Exception {
350406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
351406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>&#93;&#93;></foo>"));
352406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
353406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
354406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("]]>", parser.getText());
355406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
356406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
357406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testDoctypeWithNext() throws Exception {
358406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        String s = "<!DOCTYPE foo ["
359406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson            + "  <!ENTITY bb \"bar baz\">"
360406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson            + "  <!NOTATION png SYSTEM \"image/png\">"
361406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson            + "]><foo>a&bb;c</foo>";
362406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
363406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
364406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<!DOCTYPE foo [<!ENTITY bb \"bar baz\">]><foo>a&bb;c</foo>"));
365406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
366406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
367406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("abar bazc", parser.getText()); // TODO: this fails on gingerbread
368406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
369406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
370406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
371406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testDoctypeWithNextToken() throws Exception {
372406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
373406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
374406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<!DOCTYPE foo [<!ENTITY bb \"bar baz\">]><foo>a&bb;c</foo>"));
375406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.DOCDECL, parser.nextToken());
376406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(" foo [<!ENTITY bb \"bar baz\">]", parser.getText());
377406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertNull(parser.getName());
378406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
379406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
380406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
381406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("a", parser.getText());
382406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken());
383406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("bb", parser.getName());
384406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("bar baz", parser.getText()); // TODO: this fails on gingerbread
385406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
386406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("c", parser.getText());
387406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
388406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
389406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
390406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testProcessingInstructionWithNext() throws Exception {
391406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
392406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<?cd efg hij?>kl</foo>"));
393406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
394406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
395406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("abkl", parser.getText());
396406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
397406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
398406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
399406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testProcessingInstructionWithNextToken() throws Exception {
400406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
401406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<?cd efg hij?>kl</foo>"));
402406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
403406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
404406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("ab", parser.getText());
405406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken());
406406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cd efg hij", parser.getText());
407406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
408406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("kl", parser.getText());
409406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
410406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
411406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
412fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testLinesAndColumns() throws Exception {
413fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
414fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("\n"
415fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "  <foo><bar a='\n"
416fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "' b='cde'></bar\n"
417fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "><!--\n"
418fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "\n"
419fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "--><baz/>fg\n"
420fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "</foo>"));
421fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("1,1", parser.getLineNumber() + "," + parser.getColumnNumber());
422fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken());
423fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("2,3", parser.getLineNumber() + "," + parser.getColumnNumber());
424fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
425fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("2,8", parser.getLineNumber() + "," + parser.getColumnNumber());
426fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
427fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("3,11", parser.getLineNumber() + "," + parser.getColumnNumber());
428fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
429fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("4,2", parser.getLineNumber() + "," + parser.getColumnNumber());
430fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
431fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("6,4", parser.getLineNumber() + "," + parser.getColumnNumber());
432fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
433fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber());
434fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
435fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber());
436fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
437fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("7,1", parser.getLineNumber() + "," + parser.getColumnNumber());
438fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
439fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber());
440fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.nextToken());
441fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber());
442fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
443fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
444fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testEmptyCdata() throws Exception {
445fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
446fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><![CDATA[]]></foo>"));
447fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
448fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next()); // TODO: This should probably fail!
449fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("", parser.getText());
450fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
451fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
452fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
453406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testParseReader() throws Exception {
454406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        String snippet = "<dagny dad=\"bob\">hello</dagny>";
455406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
456406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
457406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(snippet));
458406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        validate(parser);
459406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
460406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
461406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testParseInputStream() throws Exception {
462406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        String snippet = "<dagny dad=\"bob\">hello</dagny>";
463406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
464406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
465406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new ByteArrayInputStream(snippet.getBytes()), "UTF-8");
466406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        validate(parser);
467406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
468406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
469b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    static void validate(XmlPullParser parser)
470b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            throws XmlPullParserException, IOException {
471b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_DOCUMENT, parser.getEventType());
472b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getDepth());
473b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
474b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
475b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("dagny", parser.getName());
476b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getAttributeCount());
477b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("dad", parser.getAttributeName(0));
478b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("bob", parser.getAttributeValue(0));
479b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("bob", parser.getAttributeValue(null, "dad"));
480b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
481b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
482b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("hello", parser.getText());
483b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
484b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
485b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("dagny", parser.getName());
486b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
487b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getDepth());
488b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
489b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
490406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testNamespaces() throws Exception {
491406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        String xml = "<one xmlns='ns:default' xmlns:n1='ns:1' a='b'>\n"
492406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                + "  <n1:two c='d' n1:e='f' xmlns:n2='ns:2'>text</n1:two>\n"
493406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                + "</one>";
494b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
495b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        XmlPullParser parser = newPullParser();
496b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
497406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(xml));
498b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
499b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getDepth());
500b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getNamespaceCount(0));
501b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
502b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        try {
503b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            parser.getNamespaceCount(1);
504b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            fail();
505b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        } catch (IndexOutOfBoundsException e) { /* expected */ }
506b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
507b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // one
508b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
509b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
510b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
511b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInOne(parser);
512b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
513b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // n1:two
514b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextTag());
515b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
516b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(2, parser.getDepth());
517b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInTwo(parser);
518b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
519b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Body of two.
520b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
521b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
522b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // End of two.
523b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextTag());
524b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
525b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Depth should still be 2.
526b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(2, parser.getDepth());
527b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
528b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We should still be able to see the namespaces from two.
529b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInTwo(parser);
530b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
531b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // End of one.
532b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextTag());
533b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
534b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Depth should be back to 1.
535b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
536b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
537b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We can still see the namespaces in one.
538b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInOne(parser);
539b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
540b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We shouldn't be able to see the namespaces in two anymore.
541b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        try {
542b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            parser.getNamespaceCount(2);
543b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            fail();
544b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        } catch (IndexOutOfBoundsException e) { /* expected */ }
545b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
546b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
547b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
548b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We shouldn't be able to see the namespaces in one anymore.
549b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        try {
550b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            parser.getNamespaceCount(1);
551b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            fail();
552b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        } catch (IndexOutOfBoundsException e) { /* expected */ }
553b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
554b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getNamespaceCount(0));
555b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
556b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
557b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    private void checkNamespacesInOne(XmlPullParser parser) throws XmlPullParserException {
558b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(2, parser.getNamespaceCount(1));
559b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
560b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Prefix for default namespace is null.
561b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertNull(parser.getNamespacePrefix(0));
562b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:default", parser.getNamespaceUri(0));
563b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
564b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("n1", parser.getNamespacePrefix(1));
565b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:1", parser.getNamespaceUri(1));
566b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
567b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:default", parser.getNamespace(null));
568b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
569b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // KXML returns null.
570b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // assertEquals("ns:default", parser.getNamespace(""));
571b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
572b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
573b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    private void checkNamespacesInTwo(XmlPullParser parser) throws XmlPullParserException {
574b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // These should still be valid.
575b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInOne(parser);
576b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
577b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(3, parser.getNamespaceCount(2));
578b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
579b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Default ns should still be in the stack
580b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertNull(parser.getNamespacePrefix(0));
581b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:default", parser.getNamespaceUri(0));
582b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
583b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
584fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    private void assertNextFails(XmlPullParser parser) throws IOException {
585fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        try {
586fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson            parser.next();
587fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson            fail();
588fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        } catch (XmlPullParserException expected) {
589fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        }
590fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
591fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
592b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    /**
593b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson     * Creates a new pull parser with namespace support.
594b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson     */
595b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    abstract XmlPullParser newPullParser();
596b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson}
597