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
17c4145311fb4a343f59851aea9f36dcabc84ff737Jesse Wilsonpackage libcore.xml;
18b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
19b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport java.io.ByteArrayInputStream;
20b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport java.io.StringReader;
21b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport junit.framework.TestCase;
22b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport org.xmlpull.v1.XmlPullParser;
23b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport org.xmlpull.v1.XmlPullParserException;
24b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
25b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonpublic abstract class PullParserTest extends TestCase {
26b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
27406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testAttributeNoValueWithRelaxed() throws Exception {
28406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
29406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
30406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<input checked></input>"));
31406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
32406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("input", parser.getName());
33406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("checked", parser.getAttributeName(0));
34406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("checked", parser.getAttributeValue(0));
35406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
36406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
37406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testAttributeUnquotedValueWithRelaxed() throws Exception {
38406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
39406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
40406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<input checked=true></input>"));
41406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
42406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("input", parser.getName());
43406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("checked", parser.getAttributeName(0));
44406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("true", parser.getAttributeValue(0));
45406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
46406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
47406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testUnterminatedEntityWithRelaxed() throws Exception {
48406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
49406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
50406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo bar='A&W'>mac&cheese</foo>"));
51406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
52406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("foo", parser.getName());
53406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("bar", parser.getAttributeName(0));
54406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("A&W", parser.getAttributeValue(0));
55406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
56406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("mac&cheese", parser.getText());
57406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
58406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
59406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testEntitiesAndNamespaces() throws Exception {
60406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
61406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#process-namespaces", true);
62406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
63406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo:a xmlns:foo='http://foo' xmlns:bar='http://bar'><bar:b/></foo:a>"));
64406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testNamespace(parser);
65406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
66406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
67406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testEntitiesAndNamespacesWithRelaxed() throws Exception {
68406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
69406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#process-namespaces", true);
70406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
71406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
72406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo:a xmlns:foo='http://foo' xmlns:bar='http://bar'><bar:b/></foo:a>"));
73bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        testNamespace(parser);
74406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
75406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
76995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    private void testNamespace(XmlPullParser parser) throws Exception {
77406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
78406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://foo", parser.getNamespace());
79406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("a", parser.getName());
80406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
81406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://bar", parser.getNamespace());
82406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b", parser.getName());
83406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
84406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://bar", parser.getNamespace());
85406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b", parser.getName());
86406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
87406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("http://foo", parser.getNamespace());
88406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("a", parser.getName());
89406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
90406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
913b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    public void testRegularNumericEntities() throws Exception {
923b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        XmlPullParser parser = newPullParser();
933b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        parser.setInput(new StringReader("<foo>&#65;</foo>"));
943b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
953b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken());
963b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals("#65", parser.getName());
973b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals("A", parser.getText());
983b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    }
993b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson
100e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    public void testNumericEntitiesLargerThanChar() throws Exception {
101995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo>&#2147483647; &#-2147483648;</foo>");
102406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
103406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
104e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    public void testNumericEntitiesLargerThanInt() throws Exception {
105995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo>&#2147483648;</foo>");
106406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
107406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
108e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    public void testCharacterReferenceOfHexUtf16Surrogates() throws Exception {
109e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        testCharacterReferenceOfUtf16Surrogates("<foo>&#x10000; &#x10381; &#x10FFF0;</foo>");
110e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    }
111e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson
112e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    public void testCharacterReferenceOfDecimalUtf16Surrogates() throws Exception {
113e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        testCharacterReferenceOfUtf16Surrogates("<foo>&#65536; &#66433; &#1114096;</foo>");
114e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    }
115e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson
116e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    private void testCharacterReferenceOfUtf16Surrogates(String xml) throws Exception {
117e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        XmlPullParser parser = newPullParser();
118e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        parser.setInput(new StringReader(xml));
119e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
120e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
121995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertEquals(new String(new int[]{65536, ' ', 66433, ' ', 1114096}, 0, 5),
122e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson                parser.getText());
123e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
124e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    }
125e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson
126e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    public void testCharacterReferenceOfLastUtf16Surrogate() throws Exception {
127e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        XmlPullParser parser = newPullParser();
128e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        parser.setInput(new StringReader("<foo>&#x10FFFF;</foo>"));
129e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
130e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
131995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertEquals(new String(new int[]{0x10FFFF}, 0, 1), parser.getText());
132e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
133e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    }
134e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson
1353b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    public void testOmittedNumericEntities() throws Exception {
136995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo>&#;</foo>");
137406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
138406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
139406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    /**
140406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     * Carriage returns followed by line feeds are silently discarded.
141406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     */
142406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCarriageReturnLineFeed() throws Exception {
143406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testLineEndings("\r\n<foo\r\na='b\r\nc'\r\n>d\r\ne</foo\r\n>\r\n");
144406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
145406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
146406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    /**
147406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     * Lone carriage returns are treated like newlines.
148406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     */
149406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLoneCarriageReturn() throws Exception {
150406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testLineEndings("\r<foo\ra='b\rc'\r>d\re</foo\r>\r");
151406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
152406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
153406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLoneNewLine() throws Exception {
154406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        testLineEndings("\n<foo\na='b\nc'\n>d\ne</foo\n>\n");
155406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
156406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
157995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    private void testLineEndings(String xml) throws Exception {
158406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
159406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(xml));
160406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
161406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("foo", parser.getName());
162406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b c", parser.getAttributeValue(0));
163406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
164406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("d\ne", parser.getText());
165406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
166406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("foo", parser.getName());
167406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
168406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
169406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
170406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testXmlDeclaration() throws Exception {
171406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
172406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
173406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<?xml version='1.0' encoding='UTF-8' standalone='no'?><foo/>"));
174406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
175406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("1.0", parser.getProperty(
176406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "http://xmlpull.org/v1/doc/properties.html#xmldecl-version"));
177406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(Boolean.FALSE, parser.getProperty(
178406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone"));
179406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("UTF-8", parser.getInputEncoding());
180406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
181406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
182406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testXmlDeclarationExtraAttributes() throws Exception {
183995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<?xml version='1.0' encoding='UTF-8' standalone='no' a='b'?><foo/>");
184b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
185b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
186406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCustomEntitiesUsingNext() throws Exception {
187406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
188406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
189406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo a='cd&aaaaaaaaaa;ef'>wx&aaaaaaaaaa;yz</foo>"));
190406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.defineEntityReplacementText("aaaaaaaaaa", "b");
191406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
192406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cdbef", parser.getAttributeValue(0));
193406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
194406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("wxbyz", parser.getText());
195406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
196406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
197406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCustomEntitiesUsingNextToken() throws Exception {
198406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
199406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(
200406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                "<foo a='cd&aaaaaaaaaa;ef'>wx&aaaaaaaaaa;yz</foo>"));
201406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.defineEntityReplacementText("aaaaaaaaaa", "b");
202406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
203406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cdbef", parser.getAttributeValue(0));
204406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
205406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("wx", parser.getText());
206406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken());
207406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("aaaaaaaaaa", parser.getName());
208406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("b", parser.getText());
209406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
210406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("yz", parser.getText());
211406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
212406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
21376c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson    public void testCustomEntitiesAreNotEvaluated() throws Exception {
21476c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson        XmlPullParser parser = newPullParser();
21576c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson        parser.setInput(new StringReader(
21676c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson                "<foo a='&a;'>&a;</foo>"));
21776c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson        parser.defineEntityReplacementText("a", "&amp; &a;");
21876c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
21976c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson        assertEquals("&amp; &a;", parser.getAttributeValue(0));
22076c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
22176c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson        assertEquals("&amp; &a;", parser.getText());
22276c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson    }
22376c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson
2243b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    public void testMissingEntities() throws Exception {
225995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo>&aaa;</foo>");
2263b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    }
2273b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson
2283b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    public void testMissingEntitiesWithRelaxed() throws Exception {
2293b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        XmlPullParser parser = newPullParser();
2303b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
2313b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        parser.setInput(new StringReader("<foo>&aaa;</foo>"));
2323b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
2333b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
2343b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(null, parser.getName());
235086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals("Expected unresolved entities to be left in-place. The old parser "
236086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson                + "would resolve these to the empty string.", "&aaa;", parser.getText());
2373b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
2383b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    }
2393b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson
2403b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    public void testMissingEntitiesUsingNextToken() throws Exception {
2413b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        XmlPullParser parser = newPullParser();
2423b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        testMissingEntitiesUsingNextToken(parser);
2433b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    }
2443b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson
2453b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    public void testMissingEntitiesUsingNextTokenWithRelaxed() throws Exception {
2463b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        XmlPullParser parser = newPullParser();
2473b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
2483b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        testMissingEntitiesUsingNextToken(parser);
2493b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    }
2503b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson
251995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    private void testMissingEntitiesUsingNextToken(XmlPullParser parser) throws Exception {
2523b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        parser.setInput(new StringReader("<foo>&aaa;</foo>"));
2533b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
2543b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken());
2553b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals("aaa", parser.getName());
2563b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(null, parser.getText());
2573b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
2583b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson    }
2593b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson
260086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testEntityInAttributeUsingNextToken() throws Exception {
261bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        XmlPullParser parser = newPullParser();
262bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        parser.setInput(new StringReader("<foo bar=\"&amp;\"></foo>"));
263bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
264bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals("foo", parser.getName());
265bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals("&", parser.getAttributeValue(null, "bar"));
266bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson    }
267bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson
268086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testMissingEntitiesInAttributesUsingNext() throws Exception {
269995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo b='&aaa;'></foo>");
270086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    }
271086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson
272086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testMissingEntitiesInAttributesUsingNextWithRelaxed() throws Exception {
273086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        XmlPullParser parser = newPullParser();
274086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        parser.setInput(new StringReader("<foo b='&aaa;'></foo>"));
275086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
276086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
277086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals(1, parser.getAttributeCount());
278086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals("b", parser.getAttributeName(0));
279086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals("Expected unresolved entities to be left in-place. The old parser "
280086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson                + "would resolve these to the empty string.", "&aaa;", parser.getAttributeValue(0));
281086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    }
282086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson
283086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testMissingEntitiesInAttributesUsingNextToken() throws Exception {
284086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        XmlPullParser parser = newPullParser();
285086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        parser.setInput(new StringReader("<foo b='&aaa;'></foo>"));
286086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        testMissingEntitiesInAttributesUsingNextToken(parser);
287086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    }
288086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson
289086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testMissingEntitiesInAttributesUsingNextTokenWithRelaxed() throws Exception {
290086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        XmlPullParser parser = newPullParser();
291086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        parser.setInput(new StringReader("<foo b='&aaa;'></foo>"));
292086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
293086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        testMissingEntitiesInAttributesUsingNextToken(parser);
294086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    }
295086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson
296086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    private void testMissingEntitiesInAttributesUsingNextToken(XmlPullParser parser)
297995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson            throws Exception {
298086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
299086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals(1, parser.getAttributeCount());
300086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals("b", parser.getAttributeName(0));
301086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        assertEquals("Expected unresolved entities to be left in-place. The old parser "
302086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson                + "would resolve these to the empty string.", "&aaa;", parser.getAttributeValue(0));
303086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    }
304086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson
305406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testGreaterThanInText() throws Exception {
306406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
307406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>></foo>"));
308406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
309406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
310e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(">", parser.getText());
311406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
312406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
313406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testGreaterThanInAttribute() throws Exception{
314406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
315406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo a='>'></foo>"));
316406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
317e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(">", parser.getAttributeValue(0));
318406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
319406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
320406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLessThanInText() throws Exception{
321995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo><</foo>");
322406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
323406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
324406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testLessThanInAttribute() throws Exception{
325995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo a='<'></foo>");
326406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
327406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
328406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testQuotesInAttribute() throws Exception{
329406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
330406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo a='\"' b=\"'\"></foo>"));
331406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
332406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("\"", parser.getAttributeValue(0));
333406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("'", parser.getAttributeValue(1));
334406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
335406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
336406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testQuotesInText() throws Exception{
337406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
338406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>\" '</foo>"));
339406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
340406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
341406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("\" '", parser.getText());
342406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
343406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
344406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCdataDelimiterInAttribute() throws Exception{
345406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
346406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo a=']]>'></foo>"));
347406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
348406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("]]>", parser.getAttributeValue(0));
349406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
350406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
351406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testCdataDelimiterInText() throws Exception{
352995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo>]]></foo>");
353fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
354fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
355fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testUnexpectedEof() throws Exception {
356995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo><![C");
357fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
358fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
359fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testUnexpectedSequence() throws Exception {
360995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo><![Cdata[bar]]></foo>");
361fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
362fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
363fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testThreeDashCommentDelimiter() throws Exception {
364995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo><!--a---></foo>");
365fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
366fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
367fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testTwoDashesInComment() throws Exception {
368995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo><!-- -- --></foo>");
369fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
370fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
371fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testEmptyComment() throws Exception {
372fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
373fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><!----></foo>"));
374fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
375fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
376fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("", parser.getText());
377406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
378406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
379406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    /**
380406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     * Close braces require lookaheads because we need to defend against "]]>".
381406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson     */
382406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testManyCloseBraces() throws Exception{
383406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
384406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>]]]]]]]]]]]]]]]]]]]]]]]</foo>"));
385406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
386406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
387406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("]]]]]]]]]]]]]]]]]]]]]]]", parser.getText());
388406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
389406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
390086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testCommentUsingNext() throws Exception {
391406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
392406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<!-- comment! -->cd</foo>"));
393406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
394406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
395406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("abcd", parser.getText());
396406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
397406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
398086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testCommentUsingNextToken() throws Exception {
399406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
400406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<!-- comment! -->cd</foo>"));
401406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
402406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
403406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("ab", parser.getText());
404406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
405406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(" comment! ", parser.getText());
406406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
407406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cd", parser.getText());
408406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
409406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
410086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testCdataUsingNext() throws Exception {
411406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
412406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<![CDATA[cdef]]gh&amp;i]]>jk</foo>"));
413406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
414406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
415406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("abcdef]]gh&amp;ijk", parser.getText());
416e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
417406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
418406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
419086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testCdataUsingNextToken() throws Exception {
420406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
421406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<![CDATA[cdef]]gh&amp;i]]>jk</foo>"));
422406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
423406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
424406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("ab", parser.getText());
425406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.CDSECT, parser.nextToken());
426406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cdef]]gh&amp;i", parser.getText());
427406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
428406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("jk", parser.getText());
429406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
430406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
431406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
432406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testEntityLooksLikeCdataClose() throws Exception {
433406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
434406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>&#93;&#93;></foo>"));
435406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
436406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
437406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("]]>", parser.getText());
438406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
439406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
440086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testProcessingInstructionUsingNext() throws Exception {
441406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
442406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<?cd efg hij?>kl</foo>"));
443406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
444406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
445406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("abkl", parser.getText());
446406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
447406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
448406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
449086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testProcessingInstructionUsingNextToken() throws Exception {
450406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
451406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader("<foo>ab<?cd efg hij?>kl</foo>"));
452406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
453406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
454406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("ab", parser.getText());
455406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken());
456406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("cd efg hij", parser.getText());
457406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
458406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals("kl", parser.getText());
459406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
460406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
461406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
462086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testWhitespaceUsingNextToken() throws Exception {
463bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        XmlPullParser parser = newPullParser();
464bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        parser.setInput(new StringReader("  \n  <foo> \n </foo>   \n   "));
465bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken());
466bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(true, parser.isWhitespace());
467bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals("  \n  ", parser.getText());
468bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
469bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
470bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(true, parser.isWhitespace());
471bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(" \n ", parser.getText());
472bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
473bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken());
474bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(true, parser.isWhitespace());
475bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals("   \n   ", parser.getText());
476bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.nextToken());
477bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson    }
478bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson
479fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    public void testLinesAndColumns() throws Exception {
480fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
481fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("\n"
482fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "  <foo><bar a='\n"
483fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "' b='cde'></bar\n"
484fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "><!--\n"
485fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "\n"
486fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "--><baz/>fg\n"
487fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson                + "</foo>"));
488fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("1,1", parser.getLineNumber() + "," + parser.getColumnNumber());
489fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken());
490fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("2,3", parser.getLineNumber() + "," + parser.getColumnNumber());
491fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
492fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("2,8", parser.getLineNumber() + "," + parser.getColumnNumber());
493fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
494fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("3,11", parser.getLineNumber() + "," + parser.getColumnNumber());
495fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
496fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("4,2", parser.getLineNumber() + "," + parser.getColumnNumber());
497fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
498fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("6,4", parser.getLineNumber() + "," + parser.getColumnNumber());
499fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
500fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber());
501fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
502fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber());
503fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.nextToken());
504fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("7,1", parser.getLineNumber() + "," + parser.getColumnNumber());
505fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
506fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber());
507fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.nextToken());
508fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber());
509fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
510fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
511086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testEmptyEntityReferenceUsingNext() throws Exception {
512bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        XmlPullParser parser = newPullParser();
513bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        parser.setInput(new StringReader("<foo>&empty;</foo>"));
514bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        parser.defineEntityReplacementText("empty", "");
515bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
516bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
517bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson    }
518bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson
519086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testEmptyEntityReferenceUsingNextToken() throws Exception {
520bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        XmlPullParser parser = newPullParser();
521bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        parser.setInput(new StringReader("<foo>&empty;</foo>"));
522bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        parser.defineEntityReplacementText("empty", "");
523bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
524bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken());
525bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals("empty", parser.getName());
526bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals("", parser.getText());
527bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
528bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson    }
529bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson
530086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testEmptyCdataUsingNext() throws Exception {
531fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        XmlPullParser parser = newPullParser();
532fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        parser.setInput(new StringReader("<foo><![CDATA[]]></foo>"));
533fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
534e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
535e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson    }
536e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson
537086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public void testEmptyCdataUsingNextToken() throws Exception {
538e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        XmlPullParser parser = newPullParser();
539e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        parser.setInput(new StringReader("<foo><![CDATA[]]></foo>"));
540e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
541e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson        assertEquals(XmlPullParser.CDSECT, parser.nextToken());
542fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals("", parser.getText());
543fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
544fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
545fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
546406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testParseReader() throws Exception {
547406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        String snippet = "<dagny dad=\"bob\">hello</dagny>";
548406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
549406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
550406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(snippet));
551406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        validate(parser);
552406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
553406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
554406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testParseInputStream() throws Exception {
555406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        String snippet = "<dagny dad=\"bob\">hello</dagny>";
556406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        XmlPullParser parser = newPullParser();
557406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
558406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new ByteArrayInputStream(snippet.getBytes()), "UTF-8");
559406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        validate(parser);
560406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    }
561406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson
562995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    static void validate(XmlPullParser parser) throws Exception {
563b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_DOCUMENT, parser.getEventType());
564b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getDepth());
565b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
566b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
567b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("dagny", parser.getName());
568b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getAttributeCount());
569b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("dad", parser.getAttributeName(0));
570b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("bob", parser.getAttributeValue(0));
571b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("bob", parser.getAttributeValue(null, "dad"));
572b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
573b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
574b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("hello", parser.getText());
575b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
576b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
577b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("dagny", parser.getName());
578b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
579b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getDepth());
580b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
581b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
58238e84b835c2101206d846f7ab6fc444914661753Jesse Wilson    public void testNextAfterEndDocument() throws Exception {
58338e84b835c2101206d846f7ab6fc444914661753Jesse Wilson        XmlPullParser parser = newPullParser();
58438e84b835c2101206d846f7ab6fc444914661753Jesse Wilson        parser.setInput(new StringReader("<foo></foo>"));
58538e84b835c2101206d846f7ab6fc444914661753Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
58638e84b835c2101206d846f7ab6fc444914661753Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
58738e84b835c2101206d846f7ab6fc444914661753Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
58838e84b835c2101206d846f7ab6fc444914661753Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
58938e84b835c2101206d846f7ab6fc444914661753Jesse Wilson    }
59038e84b835c2101206d846f7ab6fc444914661753Jesse Wilson
591406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson    public void testNamespaces() throws Exception {
592406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        String xml = "<one xmlns='ns:default' xmlns:n1='ns:1' a='b'>\n"
593406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                + "  <n1:two c='d' n1:e='f' xmlns:n2='ns:2'>text</n1:two>\n"
594406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson                + "</one>";
595b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
596b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        XmlPullParser parser = newPullParser();
597b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
598406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson        parser.setInput(new StringReader(xml));
599b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
600b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getDepth());
601b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getNamespaceCount(0));
602b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
603b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        try {
604b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            parser.getNamespaceCount(1);
605b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            fail();
606b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        } catch (IndexOutOfBoundsException e) { /* expected */ }
607b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
608b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // one
609b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
610b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
611b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
612b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInOne(parser);
613b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
614b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // n1:two
615b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextTag());
616b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
617b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(2, parser.getDepth());
618b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInTwo(parser);
619b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
620b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Body of two.
621b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.TEXT, parser.next());
622b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
623b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // End of two.
624b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextTag());
625b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
626b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Depth should still be 2.
627b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(2, parser.getDepth());
628b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
629b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We should still be able to see the namespaces from two.
630b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInTwo(parser);
631b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
632b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // End of one.
633b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextTag());
634b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
635b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Depth should be back to 1.
636b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(1, parser.getDepth());
637b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
638b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We can still see the namespaces in one.
639b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInOne(parser);
640b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
641b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We shouldn't be able to see the namespaces in two anymore.
642b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        try {
643b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            parser.getNamespaceCount(2);
644b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            fail();
645b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        } catch (IndexOutOfBoundsException e) { /* expected */ }
646b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
647b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
648b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
649b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // We shouldn't be able to see the namespaces in one anymore.
650b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        try {
651b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            parser.getNamespaceCount(1);
652b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson            fail();
653b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        } catch (IndexOutOfBoundsException e) { /* expected */ }
654b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
655b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(0, parser.getNamespaceCount(0));
656b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
657b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
658b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    private void checkNamespacesInOne(XmlPullParser parser) throws XmlPullParserException {
659b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(2, parser.getNamespaceCount(1));
660b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
661b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Prefix for default namespace is null.
662b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertNull(parser.getNamespacePrefix(0));
663b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:default", parser.getNamespaceUri(0));
664b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
665b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("n1", parser.getNamespacePrefix(1));
666b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:1", parser.getNamespaceUri(1));
667b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
668b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:default", parser.getNamespace(null));
669b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
670b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // KXML returns null.
671b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // assertEquals("ns:default", parser.getNamespace(""));
672b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
673b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
674b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    private void checkNamespacesInTwo(XmlPullParser parser) throws XmlPullParserException {
675b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // These should still be valid.
676b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        checkNamespacesInOne(parser);
677b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
678b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals(3, parser.getNamespaceCount(2));
679b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
680b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        // Default ns should still be in the stack
681b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertNull(parser.getNamespacePrefix(0));
682b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson        assertEquals("ns:default", parser.getNamespaceUri(0));
683b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    }
684b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson
685995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    public void testTextBeforeDocumentElement() throws Exception {
686995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("not xml<foo/>");
687995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    }
688995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson
689995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    public void testTextAfterDocumentElement() throws Exception {
690995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("<foo/>not xml");
691995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    }
692995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson
693995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    public void testTextNoDocumentElement() throws Exception {
694995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        assertParseFailure("not xml");
695995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    }
696995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson
6976ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson    public void testBomAndByteInput() throws Exception {
6986ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        byte[] xml = "\ufeff<?xml version='1.0'?><input/>".getBytes("UTF-8");
6996ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        XmlPullParser parser = newPullParser();
7006ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        parser.setInput(new ByteArrayInputStream(xml), null);
7016ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
7026ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals("input", parser.getName());
7036ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
7046ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals("input", parser.getName());
7056ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
7066ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson    }
7076ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson
7086ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson    public void testBomAndByteInputWithExplicitCharset() throws Exception {
7096ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        byte[] xml = "\ufeff<?xml version='1.0'?><input/>".getBytes("UTF-8");
7106ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        XmlPullParser parser = newPullParser();
7116ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        parser.setInput(new ByteArrayInputStream(xml), "UTF-8");
7126ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
7136ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals("input", parser.getName());
7146ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.next());
7156ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals("input", parser.getName());
7166ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
7176ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson    }
7186ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson
7196ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson    public void testBomAndCharacterInput() throws Exception {
7206ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson        assertParseFailure("\ufeff<?xml version='1.0'?><input/>");
7216ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson    }
7226ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson
72348d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson    // http://code.google.com/p/android/issues/detail?id=21425
72448d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson    public void testNextTextAdvancesToEndTag() throws Exception {
72548d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        XmlPullParser parser = newPullParser();
72648d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        parser.setInput(new StringReader("<foo>bar</foo>"));
72748d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.next());
72848d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals("bar", parser.nextText());
72948d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.getEventType());
73048d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson    }
73148d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson
73248d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson    public void testNextTag() throws Exception {
73348d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        XmlPullParser parser = newPullParser();
73448d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        parser.setInput(new StringReader("<foo> <bar></bar> </foo>"));
73548d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextTag());
73648d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals("foo", parser.getName());
73748d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals(XmlPullParser.START_TAG, parser.nextTag());
73848d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals("bar", parser.getName());
73948d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextTag());
74048d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals("bar", parser.getName());
74148d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals(XmlPullParser.END_TAG, parser.nextTag());
74248d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson        assertEquals("foo", parser.getName());
74348d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson    }
74448d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson
7459349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    public void testEofInElementSpecRelaxed() throws Exception {
7469349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertRelaxedParseFailure("<!DOCTYPE foo [<!ELEMENT foo (unterminated");
7479349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7489349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
7499349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    public void testEofInAttributeValue() throws Exception {
7509349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertParseFailure("<!DOCTYPE foo [<!ATTLIST foo x y \"unterminated");
7519349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7529349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
7539349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    public void testEofInEntityValue() throws Exception {
7549349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertParseFailure("<!DOCTYPE foo [<!ENTITY aaa \"unterminated");
7559349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7569349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
7579349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    public void testEofInStartTagAttributeValue() throws Exception {
7589349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertParseFailure("<long foo=\"unterminated");
7599349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7609349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
7619349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    public void testEofInReadCharRelaxed() throws Exception {
7629349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertRelaxedParseFailure("<!DOCTYPE foo [<!ELEMENT foo ()"); // EOF in read('>')
7639349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7649349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
7659349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    public void testEofAfterReadCharArrayRelaxed() throws Exception {
7669349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertRelaxedParseFailure("<!DOCTYPE foo [<!ELEMENT foo EMPTY"); // EOF in read('>')
7679349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7689349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
769995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson    private void assertParseFailure(String xml) throws Exception {
770995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        XmlPullParser parser = newPullParser();
7719349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertParseFailure(xml, parser);
7729349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7739349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
7749349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    private void assertRelaxedParseFailure(String xml) throws Exception {
7759349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        XmlPullParser parser = newPullParser();
7769349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true);
7779349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko        assertParseFailure(xml, parser);
7789349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    }
7799349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko
7809349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko    private void assertParseFailure(String xml, XmlPullParser parser) throws Exception {
781995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson        parser.setInput(new StringReader(xml));
782fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        try {
783773533775fab54079cebc329d54f6286f5ac16f2Jesse Wilson            while (parser.next() != XmlPullParser.END_DOCUMENT) {
784773533775fab54079cebc329d54f6286f5ac16f2Jesse Wilson            }
785fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson            fail();
786fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        } catch (XmlPullParserException expected) {
787fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson        }
788fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson    }
789fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson
790b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    /**
791838419e39510cb3bf04cf5bfef2929a7cf759e65Jesse Wilson     * Creates a new pull parser.
792b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson     */
793b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson    abstract XmlPullParser newPullParser();
794b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson}
795