181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson/*
281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * Copyright (C) 2010 The Android Open Source Project
381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson *
481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * you may not use this file except in compliance with the License.
681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * You may obtain a copy of the License at
781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson *
881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson *
1081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * Unless required by applicable law or agreed to in writing, software
1181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
1281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * See the License for the specific language governing permissions and
1481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * limitations under the License.
1581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson */
1681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
171c92541d38ed4d0b6e958f478cd7b129f140cd44Jesse Wilsonpackage libcore.xml;
1881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
1981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport junit.framework.TestCase;
208092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilsonimport org.w3c.dom.CDATASection;
218092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilsonimport org.w3c.dom.Comment;
2281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.DOMConfiguration;
2381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.DOMError;
2481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.DOMErrorHandler;
2581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.DOMException;
2681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.Document;
2781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.Element;
2881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.Node;
2981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.NodeList;
308092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilsonimport org.w3c.dom.ProcessingInstruction;
3181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.w3c.dom.Text;
3281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport org.xml.sax.InputSource;
3381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
3481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport javax.xml.parsers.DocumentBuilderFactory;
35df138faff880612d97a8e6e3fa344a91ae9d96acJesse Wilsonimport javax.xml.transform.OutputKeys;
36df138faff880612d97a8e6e3fa344a91ae9d96acJesse Wilsonimport javax.xml.transform.Transformer;
3781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport javax.xml.transform.TransformerException;
3881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport javax.xml.transform.TransformerFactory;
3981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport javax.xml.transform.dom.DOMSource;
4081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport javax.xml.transform.stream.StreamResult;
4181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport java.io.StringReader;
4281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport java.io.StringWriter;
4381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport java.util.ArrayList;
4481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport java.util.Arrays;
458092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilsonimport java.util.Collections;
4681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonimport java.util.List;
4781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
4881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson/**
4981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * Tests the acceptance of various parameters on the DOM configuration. This
5081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * test assumes the same set of parameters as the RI version 1.5. Perfectly
5181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * correct DOM implementations may fail this test because it assumes certain
5281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson * parameters will be unsupported.
5381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson */
5481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilsonpublic class NormalizeTest extends TestCase {
5581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
5681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    private Document document;
5781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    private DOMConfiguration domConfiguration;
5881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
5981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    String[] infosetImpliesFalse = {
6081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            "validate-if-schema", "entities", "datatype-normalization", "cdata-sections" };
6181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    String[] infosetImpliesTrue = { "namespace-declarations", "well-formed",
6281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            "element-content-whitespace", "comments", "namespaces" };
6381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
6481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    @Override protected void setUp() throws Exception {
6581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
6681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        domConfiguration = document.getDomConfig();
6781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
6881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
6981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testCanonicalForm() {
708092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(false, domConfiguration.getParameter("canonical-form"));
7181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("canonical-form", false);
7281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertUnsupported("canonical-form", true);
7381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
7481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
7581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testCdataSections() {
768092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("cdata-sections"));
7781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("cdata-sections", false);
7881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("cdata-sections", true);
7981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
8081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
8181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testCheckCharacterNormalization() {
828092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(false, domConfiguration.getParameter("check-character-normalization"));
8381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("check-character-normalization", false);
8481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertUnsupported("check-character-normalization", true);
8581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
8681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
8781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testComments() {
888092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("comments"));
8981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("comments", false);
9081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("comments", true);
9181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
9281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
9381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testDatatypeNormalization() {
948092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(false, domConfiguration.getParameter("datatype-normalization"));
9581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("datatype-normalization", false);
9681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("datatype-normalization", true);
9781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
9881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        // setting this parameter to true should set validate to true...
9981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        domConfiguration.setParameter("validate", false);
10081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        domConfiguration.setParameter("datatype-normalization", true);
10181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(true, domConfiguration.getParameter("validate"));
10281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
10381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        // ...but the negative case isn't so
10481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        domConfiguration.setParameter("datatype-normalization", false);
10581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(true, domConfiguration.getParameter("validate"));
10681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
10781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
10881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testElementContentWhitespace() {
1098092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("element-content-whitespace"));
11081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertUnsupported("element-content-whitespace", false);
11181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("element-content-whitespace", true);
11281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
11381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
11481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testEntities() {
1158092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("entities"));
11681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("entities", false);
11781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("entities", true);
11881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
11981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
12081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testErrorHandler() {
1218092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(null, domConfiguration.getParameter("error-handler"));
12281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("error-handler", null);
12381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("error-handler", new DOMErrorHandler() {
12481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            public boolean handleError(DOMError error) {
12581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                return true;
12681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            }
12781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        });
12881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
12981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
13081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testInfoset() {
1318092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(false, domConfiguration.getParameter("infoset"));
13281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("infoset", false);
13381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("infoset", true);
13481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
13581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
13681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testSettingInfosetUpdatesImplied() {
13781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        // first clear those other parameters
13881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (String name : infosetImpliesFalse) {
13981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            if (domConfiguration.canSetParameter(name, true)) {
14081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                domConfiguration.setParameter(name, true);
14181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            }
14281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
14381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (String name : infosetImpliesTrue) {
14481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            if (domConfiguration.canSetParameter(name, false)) {
14581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                domConfiguration.setParameter(name, false);
14681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            }
14781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
14881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
14981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        // set infoset
15081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        domConfiguration.setParameter("infoset", true);
15181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
15281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        // now the parameters should all match what infoset implies
15381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (String name : infosetImpliesFalse) {
15481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            assertEquals(false, domConfiguration.getParameter(name));
15581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
15681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (String name : infosetImpliesTrue) {
15781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            assertEquals(true, domConfiguration.getParameter(name));
15881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
15981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
16081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
16181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testSettingImpliedUpdatesInfoset() {
16281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (String name : infosetImpliesFalse) {
16381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter("infoset", true);
16481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            if (domConfiguration.canSetParameter(name, true)) {
16581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                domConfiguration.setParameter(name, true);
16681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                assertEquals(false, domConfiguration.getParameter("infoset"));
16781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            }
16881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
16981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
17081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (String name : infosetImpliesTrue) {
17181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter("infoset", true);
17281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            if (domConfiguration.canSetParameter(name, false)) {
17381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                domConfiguration.setParameter(name, false);
17481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                assertEquals(false, domConfiguration.getParameter("infoset"));
17581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            }
17681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
17781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
17881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
17981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testNamespaces() {
1808092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("namespaces"));
18181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("namespaces", false);
18281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("namespaces", true);
18381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
18481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
18581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testNamespaceDeclarations() {
1868092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("namespace-declarations"));
18781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertUnsupported("namespace-declarations", false); // supported in RI 6
18881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("namespace-declarations", true);
18981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
19081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
19181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testNormalizeCharacters() {
1928092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(false, domConfiguration.getParameter("normalize-characters"));
19381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("normalize-characters", false);
19481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertUnsupported("normalize-characters", true);
19581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
19681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
19781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testSchemaLocation() {
1988092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(null, domConfiguration.getParameter("schema-location"));
19981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("schema-location", "http://foo");
20081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("schema-location", null);
20181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
20281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
20381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    /**
20481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson     * This fails under the RI because setParameter() succeeds even though
20581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson     * canSetParameter() returns false.
20681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson     */
20781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testSchemaTypeDtd() {
20881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertUnsupported("schema-type", "http://www.w3.org/TR/REC-xml"); // supported in RI v6
20981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
21081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
21181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testSchemaTypeXmlSchema() {
2128092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(null, domConfiguration.getParameter("schema-type"));
21381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("schema-type", null);
21481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("schema-type", "http://www.w3.org/2001/XMLSchema");
21581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
21681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
21781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testSplitCdataSections() {
2188092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("split-cdata-sections"));
21981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("split-cdata-sections", false);
22081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("split-cdata-sections", true);
22181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
22281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
22381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testValidate() {
2248092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(false, domConfiguration.getParameter("validate"));
22581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("validate", false);
22681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("validate", true);
22781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
22881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
22981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testValidateIfSchema() {
2308092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(false, domConfiguration.getParameter("validate-if-schema"));
23181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("validate-if-schema", false);
23281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertUnsupported("validate-if-schema", true);
23381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
23481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
23581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testWellFormed() {
2368092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(true, domConfiguration.getParameter("well-formed"));
23781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("well-formed", false);
23881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertSupported("well-formed", true);
23981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
24081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
24181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testMissingParameter() {
24281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertFalse(domConfiguration.canSetParameter("foo", true));
24381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
24481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.getParameter("foo");
24581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail();
24681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
24781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
24881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
24981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter("foo", true);
25081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail();
25181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
25281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
25381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
25481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
25581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testNullKey() {
25681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
25781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.canSetParameter(null, true);
25881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail();
25981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (NullPointerException e) {
26081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
26181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
26281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.getParameter(null);
26381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail();
26481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (NullPointerException e) {
26581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
26681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
26781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter(null, true);
26881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail();
26981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (NullPointerException e) {
27081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
27181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
27281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
27381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testNullValue() {
27481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        String message = "This implementation's canSetParameter() disagrees"
27581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                + " with its setParameter()";
27681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
27781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter("well-formed", null);
27881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail(message);
27981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
28081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
28181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(message, false, domConfiguration.canSetParameter("well-formed", null));
28281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
28381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
28481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testTypeMismatch() {
28581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(false, domConfiguration.canSetParameter("well-formed", "true"));
28681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
28781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter("well-formed", "true");
28881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail();
28981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
29081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
29181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
29281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(false, domConfiguration.canSetParameter("well-formed", new Object()));
29381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
29481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter("well-formed", new Object());
29581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail();
29681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
29781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
29881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
29981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
30081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    private void assertUnsupported(String name, Object value) {
30181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        String message = "This implementation's setParameter() supports an unexpected value: "
30281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                + name + "=" + value;
30381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertFalse(message, domConfiguration.canSetParameter(name, value));
30481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
30581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter(name, value);
30681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail(message);
30781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
30881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            assertEquals(DOMException.NOT_SUPPORTED_ERR, e.code);
30981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
31081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
31181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter(name.toUpperCase(), value);
31281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            fail(message);
31381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
31481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            assertEquals(DOMException.NOT_SUPPORTED_ERR, e.code);
31581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
31681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertFalse(value.equals(domConfiguration.getParameter(name)));
31781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
31881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
31981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    private void assertSupported(String name, Object value) {
32081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        String message = "This implementation's canSetParameter() disagrees"
32181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                + " with its setParameter() for " + name + "=" + value;
32281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        try {
32381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            domConfiguration.setParameter(name, value);
32481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        } catch (DOMException e) {
32581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            if (domConfiguration.canSetParameter(name, value)) {
32681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                fail(message);
32781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            } else {
32881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                fail("This implementation's setParameter() doesn't support: "
32981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                        + name + "=" + value);
33081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            }
33181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
33281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertTrue(message, domConfiguration.canSetParameter(name.toUpperCase(), value));
33381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertTrue(message, domConfiguration.canSetParameter(name, value));
33481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(value, domConfiguration.getParameter(name));
33581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        domConfiguration.setParameter(name.toUpperCase(), value);
33681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(value, domConfiguration.getParameter(name.toUpperCase()));
33781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
33881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
33981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testCdataSectionsNotHonoredByNodeNormalize() throws Exception {
34081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        String xml = "<foo>ABC<![CDATA[DEF]]>GHI</foo>";
3418092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        parse(xml);
3428092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("cdata-sections", true);
34381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.getDocumentElement().normalize();
34481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(xml, domToString(document));
34581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
3468092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        parse(xml);
3478092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("cdata-sections", false);
34881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.getDocumentElement().normalize();
34981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(xml, domToString(document));
35081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
35181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
35281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testCdataSectionsHonoredByDocumentNormalize() throws Exception {
35381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        String xml = "<foo>ABC<![CDATA[DEF]]>GHI</foo>";
3548092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        parse(xml);
3558092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("cdata-sections", true);
35681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.normalizeDocument();
35781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(xml, domToString(document));
35881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
3598092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        parse(xml);
3608092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("cdata-sections", false);
36181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.normalizeDocument();
36281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        String expected = xml.replace("<![CDATA[DEF]]>", "DEF");
36381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(expected, domToString(document));
36481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
36581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
36681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testMergeAdjacentTextNodes() throws Exception {
36781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document = createDocumentWithAdjacentTexts("abc", "def");
36881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.getDocumentElement().normalize();
36981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertChildren(document.getDocumentElement(), "abcdef");
37081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
37181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
37281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testMergeAdjacentEmptyTextNodes() throws Exception {
37381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document = createDocumentWithAdjacentTexts("", "", "");
37481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.getDocumentElement().normalize();
37581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertChildren(document.getDocumentElement());
37681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
37781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
37881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testMergeAdjacentNodesWithNonTextSiblings() throws Exception {
37981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document = createDocumentWithAdjacentTexts("abc", "def", "<br>", "ghi", "jkl");
38081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.getDocumentElement().normalize();
38181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertChildren(document.getDocumentElement(), "abcdef", "<br>", "ghijkl");
38281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
38381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
38481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    public void testMergeAdjacentNodesEliminatesEmptyTexts() throws Exception {
38581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document = createDocumentWithAdjacentTexts("", "", "<br>", "", "", "<br>", "", "<br>", "");
38681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        document.getDocumentElement().normalize();
38781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertChildren(document.getDocumentElement(), "<br>", "<br>", "<br>");
38881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
38981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
3908092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testRetainingComments() throws Exception {
3918092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        String xml = "<foo>ABC<!-- bar -->DEF<!-- baz -->GHI</foo>";
3928092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        parse(xml);
3938092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("comments", true);
3948092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.normalizeDocument();
3958092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertEquals(xml, domToString(document));
3968092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
3978092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
3988092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testCommentContainingDoubleDash() throws Exception {
3998092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
4008092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
4018092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
4028092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
4038092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
4048092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        root.appendChild(document.createComment("ABC -- DEF"));
4058092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.normalizeDocument();
4068092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        errorRecorder.assertAllErrors(DOMError.SEVERITY_ERROR, "wf-invalid-character");
4078092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
4088092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4098092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testStrippingComments() throws Exception {
4108092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        String xml = "<foo>ABC<!-- bar -->DEF<!-- baz -->GHI</foo>";
4118092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        parse(xml);
4128092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("comments", false);
4138092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.normalizeDocument();
4148092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertChildren(document.getDocumentElement(), "ABCDEFGHI");
4158092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
4168092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4178092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testSplittingCdataSectionsSplit() throws Exception {
4188092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
4198092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("split-cdata-sections", true);
4208092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
4218092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
4228092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
4238092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
4248092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        root.appendChild(document.createCDATASection("ABC]]>DEF]]>GHI"));
4258092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.normalizeDocument();
4268092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        errorRecorder.assertAllErrors(DOMError.SEVERITY_WARNING, "cdata-sections-splitted");
4278092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        assertChildren(root, "<![CDATA[ABC]]]]>", "<![CDATA[>DEF]]]]>", "<![CDATA[>GHI]]>");
4288092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
4298092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4308092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testSplittingCdataSectionsReportError() throws Exception {
4318092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
4328092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("split-cdata-sections", false);
4338092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
4348092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
4358092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
4368092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
4378092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        root.appendChild(document.createCDATASection("ABC]]>DEF"));
4388092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.normalizeDocument();
4398092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        errorRecorder.assertAllErrors(DOMError.SEVERITY_ERROR, "wf-invalid-character");
4408092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
4418092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4428092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testInvalidCharactersCdata() throws Exception {
4438092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
4448092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("cdata-sections", true);
4458092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
4468092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
4478092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
4488092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
4498092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        CDATASection cdata = document.createCDATASection("");
4508092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        root.appendChild(cdata);
4518092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4528092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        for (int c = 0; c <= Character.MAX_VALUE; c++) {
4538092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            cdata.setData(new String(new char[]{ 'A', 'B', (char) c }));
4548092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            document.normalizeDocument();
4558092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            if (isValid((char) c)) {
4568092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                assertEquals(Collections.<DOMError>emptyList(), errorRecorder.errors);
4578092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            } else {
4588092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                errorRecorder.assertAllErrors("For character " + c,
4598092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                        DOMError.SEVERITY_ERROR, "wf-invalid-character");
4608092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            }
4618092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
4628092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
4638092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4648092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testInvalidCharactersText() throws Exception {
4658092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
4668092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
4678092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
4688092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
4698092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
4708092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Text text = document.createTextNode("");
4718092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        root.appendChild(text);
4728092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4738092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        for (int c = 0; c <= Character.MAX_VALUE; c++) {
4748092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            text.setData(new String(new char[]{ 'A', 'B', (char) c }));
4758092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            document.normalizeDocument();
4768092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            if (isValid((char) c)) {
4778092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                assertEquals(Collections.<DOMError>emptyList(), errorRecorder.errors);
4788092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            } else {
4798092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                errorRecorder.assertAllErrors("For character " + c,
4808092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                        DOMError.SEVERITY_ERROR, "wf-invalid-character");
4818092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            }
4828092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
4838092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
4848092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4858092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testInvalidCharactersAttribute() throws Exception {
4868092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
4878092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
4888092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
4898092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
4908092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
4918092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
4928092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        for (int c = 0; c <= Character.MAX_VALUE; c++) {
4938092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            root.setAttribute("bar", new String(new char[] { 'A', 'B', (char) c}));
4948092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            document.normalizeDocument();
4958092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            if (isValid((char) c)) {
4968092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                assertEquals(Collections.<DOMError>emptyList(), errorRecorder.errors);
4978092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            } else {
4988092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                errorRecorder.assertAllErrors("For character " + c,
4998092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                        DOMError.SEVERITY_ERROR, "wf-invalid-character");
5008092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            }
5018092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
5028092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
5038092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
5048092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testInvalidCharactersComment() throws Exception {
5058092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
5068092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
5078092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
5088092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
5098092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
5108092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Comment comment = document.createComment("");
5118092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        root.appendChild(comment);
5128092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
5138092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        for (int c = 0; c <= Character.MAX_VALUE; c++) {
5148092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            comment.setData(new String(new char[] { 'A', 'B', (char) c}));
5158092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            document.normalizeDocument();
5168092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            if (isValid((char) c)) {
5178092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                assertEquals(Collections.<DOMError>emptyList(), errorRecorder.errors);
5188092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            } else {
5198092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                errorRecorder.assertAllErrors("For character " + c,
5208092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                        DOMError.SEVERITY_ERROR, "wf-invalid-character");
5218092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            }
5228092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
5238092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
5248092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
5258092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    public void testInvalidCharactersProcessingInstructionData() throws Exception {
5268092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ErrorRecorder errorRecorder = new ErrorRecorder();
5278092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("error-handler", errorRecorder);
5288092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration.setParameter("namespaces", false);
5298092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        Element root = document.createElement("foo");
5308092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document.appendChild(root);
5318092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        ProcessingInstruction pi = document.createProcessingInstruction("foo", "");
5328092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        root.appendChild(pi);
5338092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
5348092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        for (int c = 0; c <= Character.MAX_VALUE; c++) {
5358092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            pi.setData(new String(new char[] { 'A', 'B', (char) c}));
5368092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            document.normalizeDocument();
5378092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            if (isValid((char) c)) {
5388092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                assertEquals(Collections.<DOMError>emptyList(), errorRecorder.errors);
5398092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            } else {
5408092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                errorRecorder.assertAllErrors("For character " + c,
5418092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                        DOMError.SEVERITY_ERROR, "wf-invalid-character");
5428092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            }
5438092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
5448092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
5458092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
5468092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    // TODO: test for surrogates
5478092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
5488092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    private boolean isValid(char c) {
5498092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        // as defined by http://www.w3.org/TR/REC-xml/#charsets.
5508092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        return c == 0x9 || c == 0xA || c == 0xD || (c >= 0x20 && c <= 0xd7ff)
5518092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                || (c >= 0xe000 && c <= 0xfffd);
5528092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
5538092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
55481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    private Document createDocumentWithAdjacentTexts(String... texts) throws Exception {
55581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        Document result = DocumentBuilderFactory.newInstance()
55681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                .newDocumentBuilder().newDocument();
55781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        Element root = result.createElement("foo");
55881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        result.appendChild(root);
55981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (String text : texts) {
56081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            if (text.equals("<br>")) {
56181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                root.appendChild(result.createElement("br"));
56281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            } else {
56381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson                root.appendChild(result.createTextNode(text));
56481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            }
56581ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
56681ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        return result;
56781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
56881ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
56981ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    private void assertChildren(Element element, String... texts) {
57081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        List<String> actual = new ArrayList<String>();
57181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        NodeList nodes = element.getChildNodes();
57281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        for (int i = 0; i < nodes.getLength(); i++) {
57381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson            Node node = nodes.item(i);
5748092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            if (node.getNodeType() == Node.TEXT_NODE) {
5758092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                actual.add(((Text) node).getData());
5768092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            } else if (node.getNodeType() == Node.CDATA_SECTION_NODE) {
5778092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                actual.add("<![CDATA[" + ((CDATASection) node).getData() + "]]>");
5788092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            } else {
5798092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                actual.add("<" + node.getNodeName() + ">");
5808092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            }
58181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        }
58281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        assertEquals(Arrays.asList(texts), actual);
58381ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
58481ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson
5858092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    private void parse(String xml) throws Exception {
5868092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        document = DocumentBuilderFactory.newInstance().newDocumentBuilder()
5878092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                .parse(new InputSource(new StringReader(xml)));
5888092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        domConfiguration = document.getDomConfig();
5898092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
5908092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
59181ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    private String domToString(Document document) throws TransformerException {
59281ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson        StringWriter writer = new StringWriter();
593df138faff880612d97a8e6e3fa344a91ae9d96acJesse Wilson        Transformer transformer = TransformerFactory.newInstance() .newTransformer();
594df138faff880612d97a8e6e3fa344a91ae9d96acJesse Wilson        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
595df138faff880612d97a8e6e3fa344a91ae9d96acJesse Wilson        transformer.transform(new DOMSource(document), new StreamResult(writer));
596df138faff880612d97a8e6e3fa344a91ae9d96acJesse Wilson        return writer.toString();
59781ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson    }
5988092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
5998092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    private class ErrorRecorder implements DOMErrorHandler {
6008092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        private final List<DOMError> errors = new ArrayList<DOMError>();
6018092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
6028092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        public boolean handleError(DOMError error) {
6038092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            errors.add(error);
6048092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            return true;
6058092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
6068092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
6078092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        public void assertAllErrors(int severity, String type) {
6088092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            assertAllErrors("Expected one or more " + type + " errors", severity, type);
6098092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
6108092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson
6118092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        public void assertAllErrors(String message, int severity, String type) {
6128092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            assertFalse(message, errors.isEmpty());
6138092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            for (DOMError error : errors) {
6148092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                assertEquals(message, severity, error.getSeverity());
6158092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson                assertEquals(message, type, error.getType());
6168092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            }
6178092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson            errors.clear();
6188092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson        }
6198092253eb6a1cff91f0e4953f1387165169157b5Jesse Wilson    }
62081ca3dd430f9c038b4257e1124f45a07d0e6b543Jesse Wilson}
621