// Copyright 2010 The Bazel Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.testing.junit.runner.model; import static org.junit.Assert.assertEquals; import com.google.common.base.Joiner; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Tests for {@link XmlWriter} */ @RunWith(JUnit4.class) public class XmlWriterTest { private static final Joiner LINE_JOINER = Joiner.on(XmlWriter.EOL); private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); @Rule public final ExpectedException expectedException = ExpectedException.none(); @Test public void encodingShouldBeUtf8() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("String"); String utf8String = "z\u0080\u0800\u010000"; // 1+2+3+4 bytes xmlWriter.writeCharacters(utf8String); xmlWriter.close(); // Note: assertHasContents() reads the bytes of the outputStream as a UTF-8 string assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<String>" + utf8String, "</String>"); } @Test public void header() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>"); } @Test public void emptyDocument() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("DocumentName"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<DocumentName />"); } @Test public void emptyDocumentWithOneAttribute() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Properties"); xmlWriter.writeAttribute("name", "value"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Properties name='value' />"); } @Test public void emptyDocumentWithTwoAttributes() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("TestSuite"); xmlWriter.writeAttribute("count", 7); xmlWriter.writeAttribute("size", "large"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<TestSuite count='7' size='large' />"); } @Test public void emptyDocumentWithThreeAttributes() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("TestSuite"); xmlWriter.writeAttribute("count", 7); xmlWriter.writeAttribute("size", "large"); xmlWriter.writeAttribute("time", 1.0); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<TestSuite count='7' size='large' time='1.0' />"); } @Test public void documentWithOneEmptyElement() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Root"); xmlWriter.writeAttribute("childCount", 1); xmlWriter.startElement("Child"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Root childCount='1'>", " <Child />", "</Root>"); } @Test public void documentWithOneEmptyElementWithAttribute() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Root"); xmlWriter.startElement("Child"); xmlWriter.writeAttribute("name", "value"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Root>", " <Child name='value' />", "</Root>"); } @Test public void documentWithOneElementWithCharactersNoEscaping() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Root"); xmlWriter.startElement("Child"); xmlWriter.writeCharacters("some text\nmore text"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Root>", " <Child>some text", "more text", " </Child>", "</Root>"); } @Test public void documentWithOneElementWithCharactersNeedingEscaping() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Root"); xmlWriter.startElement("Child"); xmlWriter.writeCharacters("foo]]>bar"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Root>", " <Child>foo]]>bar", " </Child>", "</Root>"); } @Test public void documentWithOneElementChild() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Root"); xmlWriter.startElement("Child"); xmlWriter.writeAttribute("name", "value"); xmlWriter.startElement("Grandchild"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Root>", " <Child name='value'>", " <Grandchild />", " </Child>", "</Root>"); } @Test public void documentWithTwoElements() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Parent"); xmlWriter.startElement("Child"); xmlWriter.writeAttribute("name", "Deanna"); xmlWriter.endElement(); xmlWriter.startElement("Child"); xmlWriter.writeAttribute("name", "Kyle"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Parent>", " <Child name='Deanna' />", " <Child name='Kyle' />", "</Parent>"); } @Test public void attributeValuesEscaped() throws Exception { XmlWriter xmlWriter = new XmlWriter(outputStream); xmlWriter.startDocument(); xmlWriter.startElement("Expression"); xmlWriter.writeAttribute("name", "a > b"); xmlWriter.close(); assertHasContents("<?xml version='1.0' encoding='UTF-8'?>", "<Expression name='a > b' />"); } private void assertHasContents(String... contents) throws UnsupportedEncodingException { Object[] expected = contents; assertEquals(LINE_JOINER.join(expected).trim(), outputStream.toString("UTF-8").trim()); } }