// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.lagarto.dom; import jodd.io.FileUtil; import jodd.util.StringUtil; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class DomXmlTest { protected String testDataRoot; @Before public void setUp() throws Exception { if (testDataRoot != null) { return; } URL data = NodeSelectorTest.class.getResource("test"); testDataRoot = data.getFile(); } @Test public void testPeopleXml() throws IOException { File file = new File(testDataRoot, "people.xml"); String xmlContent = FileUtil.readString(file); LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); Document doc = lagartoDOMBuilder.parse(xmlContent); assertEquals(2, doc.getChildNodesCount()); // not 3! XmlDeclaration xml = (XmlDeclaration) doc.getFirstChild(); assertEquals(0, xml.getAttributesCount()); Element peopleList = (Element) doc.getChild(1); assertEquals(1, peopleList.getChildNodesCount()); Element person = peopleList.getFirstChildElement(); assertEquals(3, person.getChildNodesCount()); Element name = (Element) person.getChild(0); assertEquals("Fred Bloggs", name.getTextContent()); assertEquals("Male", person.getChild(2).getTextContent()); xmlContent = StringUtil.removeChars(xmlContent, "\n\r\t"); assertEquals(xmlContent, doc.getHtml()); assertTrue(doc.check()); } @Test public void testUpheaWebXml() throws IOException { File file = new File(testDataRoot, "uphea-web.xml"); String xmlContent = FileUtil.readString(file); LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); Document doc = lagartoDOMBuilder.parse(xmlContent); xmlContent = StringUtil.removeChars(xmlContent, "\n\r\t"); assertEquals(xmlContent, doc.getHtml()); assertTrue(doc.check()); } @Test public void testWhitespaces() throws IOException { String xmlContent = "<foo> <!--c--> <bar> </bar> <x/> </foo>"; LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); lagartoDOMBuilder.getConfig().setSelfCloseVoidTags(true); Document doc = lagartoDOMBuilder.parse(xmlContent); assertEquals(1, doc.getChildNodesCount()); Element foo = (Element) doc.getChild(0); assertEquals("foo", foo.getNodeName()); assertEquals(3, foo.getChildNodesCount()); Element bar = (Element) foo.getChild(1); assertEquals("bar", bar.getNodeName()); assertEquals(1, bar.getChildNodesCount()); // must be 1 as whitespaces are between open/closed tag assertEquals("<foo><!--c--><bar> </bar><x/></foo>", doc.getHtml()); assertTrue(doc.check()); } @Test public void testIgnoreComments() throws IOException { String xmlContent = "<foo> <!--c--> <bar> </bar> <!--c--> <x/> <!--c--> </foo>"; LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); lagartoDOMBuilder.getConfig().setIgnoreComments(true); Document doc = lagartoDOMBuilder.parse(xmlContent); assertEquals("<foo><bar> </bar><x></x></foo>", doc.getHtml()); assertTrue(doc.check()); } @Test public void testConditionalComments() throws IOException { String xmlContent = "<foo><!--[if !IE]>--><bar>Jodd</bar><!--<![endif]--></foo>"; LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); lagartoDOMBuilder.getConfig().setIgnoreComments(true); Document doc = lagartoDOMBuilder.parse(xmlContent); assertEquals("<foo><bar>Jodd</bar></foo>", doc.getHtml()); assertTrue(doc.check()); } @Test public void testConditionalComments2() throws IOException { String xmlContent = "<foo><![if !IE]><bar>Jodd</bar></foo>"; LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); lagartoDOMBuilder.getConfig().setIgnoreComments(true); lagartoDOMBuilder.getConfig().setCollectErrors(true); lagartoDOMBuilder.getConfig().setCalculatePosition(true); Document doc = lagartoDOMBuilder.parse(xmlContent); List<String> errors = doc.getErrors(); assertEquals(1, errors.size()); assertEquals("<foo><bar>Jodd</bar></foo>", doc.getHtml()); assertTrue(doc.check()); } @Test public void testAddDeleteModifyNode() throws IOException { File file = new File(testDataRoot, "people.xml"); String xmlContent = FileUtil.readString(file); LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); Document xml = lagartoDOMBuilder.parse(xmlContent); // find all persons NodeSelector nodeSelector = new NodeSelector(xml); List<Node> persons = nodeSelector.select("person"); assertEquals(1, persons.size()); Node man = persons.get(0); assertEquals("Fred Bloggs", man.getChild(0).getTextContent()); // update man.getChild(0).getChild(0).setNodeValue("Just Joe"); // append Element newPerson = new Element(xml, "person", false, false, false); newPerson.addChild(new Element(xml, "name", false, false, false)); newPerson.getChild(0).addChild(new Text(xml, "Just Maria")); man.getParentNode().addChild(newPerson); xmlContent = xml.getHtml(); // yeah, its XML content assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + "<people_list>" + "<person>" + "<name>Just Joe</name>" + "<birthdate>2008-11-27</birthdate>" + "<gender>Male</gender>" + "</person>" + "<person>" + "<name>Just Maria</name>" + "</person>" + "</people_list>", xmlContent); } @Test public void testXmlAndSingleQuotes() throws IOException { File file = new File(testDataRoot, "people2.xml"); String xmlContent = FileUtil.readString(file); LagartoDOMBuilder lagartoDOMBuilder = new LagartoDOMBuilder(); lagartoDOMBuilder.enableXmlMode(); Document xml = lagartoDOMBuilder.parse(xmlContent); XmlDeclaration xmlDeclaration = (XmlDeclaration) xml.getChild(0); assertEquals("1.0", xmlDeclaration.getVersion()); assertEquals("UTF-8", xmlDeclaration.getEncoding()); } }