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