15757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson/*
25757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * Copyright (C) 2011 The Android Open Source Project
35757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson *
45757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
55757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * you may not use this file except in compliance with the License.
65757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * You may obtain a copy of the License at
75757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson *
85757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
95757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson *
105757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * Unless required by applicable law or agreed to in writing, software
115757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
125757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * See the License for the specific language governing permissions and
145757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson * limitations under the License.
155757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson */
165757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
175757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonpackage libcore.xml;
185757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
195757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport java.io.StringWriter;
205757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport javax.xml.parsers.DocumentBuilder;
215757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport javax.xml.parsers.DocumentBuilderFactory;
225757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport javax.xml.transform.Transformer;
235757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport javax.xml.transform.TransformerFactory;
245757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport javax.xml.transform.dom.DOMSource;
255757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport javax.xml.transform.stream.StreamResult;
265757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport junit.framework.TestCase;
275757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport org.w3c.dom.Attr;
285757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport org.w3c.dom.Document;
295757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonimport org.w3c.dom.Element;
305757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
315757d1d948906c432110f70d8281b18b4ce6824cJesse Wilsonpublic final class DomSerializationTest extends TestCase {
325757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    private DocumentBuilder documentBuilder;
335757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    private Transformer transformer;
345757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
355757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    @Override protected void setUp() throws Exception {
365757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
375757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        documentBuilder = builderFactory.newDocumentBuilder();
385757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        transformer = TransformerFactory.newInstance().newTransformer();
395757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    }
405757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
415757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    public void testWriteDocument() throws Exception {
425757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        Document document = documentBuilder.newDocument();
435757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        Element foo = document.createElement("foo");
445757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        Attr quux = document.createAttribute("quux");
455757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        quux.setValue("abc");
465757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        foo.setAttributeNode(quux);
475757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        foo.appendChild(document.createElement("bar"));
485757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        foo.appendChild(document.createElement("baz"));
495757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        document.appendChild(foo);
505757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        assertXmlEquals("<foo quux=\"abc\"><bar/><baz/></foo>", document);
515757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    }
525757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
535757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    public void testWriteSpecialCharactersInText() throws Exception {
545757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        Document document = documentBuilder.newDocument();
555757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        Element foo = document.createElement("foo");
565757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        foo.appendChild(document.createTextNode("5'8\", 5 < 6 & 7 > 3!"));
575757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        document.appendChild(foo);
585757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        assertXmlEquals("<foo>5'8\", 5 &lt; 6 &amp; 7 &gt; 3!</foo>", document);
595757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    }
605757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
615757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    private String toXml(Document document) throws Exception {
625757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        StringWriter stringWriter = new StringWriter();
635757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        transformer.transform(new DOMSource(document), new StreamResult(stringWriter));
645757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        return stringWriter.toString();
655757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    }
665757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson
675757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    private void assertXmlEquals(String expectedXml, Document document) throws Exception {
685757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        String actual = toXml(document);
695757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        String declarationA = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
705757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        String declarationB = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
715757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson        assertTrue(actual, actual.equals(declarationA + expectedXml)
725757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson                || actual.equals(declarationB + expectedXml));
735757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson    }
745757d1d948906c432110f70d8281b18b4ce6824cJesse Wilson}
75