| // Copyright 2016 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "gn/xml_element_writer.h" | |
| #include <sstream> | |
| #include "util/test/test.h" | |
| namespace { | |
| class MockValueWriter { | |
| public: | |
| explicit MockValueWriter(const std::string& value) : value_(value) {} | |
| void operator()(std::ostream& out) const { out << value_; } | |
| private: | |
| std::string value_; | |
| }; | |
| } // namespace | |
| TEST(XmlElementWriter, EmptyElement) { | |
| std::ostringstream out; | |
| { | |
| XmlElementWriter writer(out, "foo", XmlAttributes()); | |
| } | |
| EXPECT_EQ("<foo />\n", out.str()); | |
| std::ostringstream out_attr; | |
| { | |
| XmlElementWriter writer(out_attr, "foo", | |
| XmlAttributes("bar", "abc").add("baz", "123")); | |
| } | |
| EXPECT_EQ("<foo bar=\"abc\" baz=\"123\" />\n", out_attr.str()); | |
| std::ostringstream out_indent; | |
| { | |
| XmlElementWriter writer(out_indent, "foo", XmlAttributes("bar", "baz"), 2); | |
| } | |
| EXPECT_EQ(" <foo bar=\"baz\" />\n", out_indent.str()); | |
| std::ostringstream out_writer; | |
| { | |
| XmlElementWriter writer(out_writer, "foo", "bar", MockValueWriter("baz"), | |
| 2); | |
| } | |
| EXPECT_EQ(" <foo bar=\"baz\" />\n", out_writer.str()); | |
| } | |
| TEST(XmlElementWriter, ElementWithText) { | |
| std::ostringstream out; | |
| { | |
| XmlElementWriter writer(out, "foo", XmlAttributes("bar", "baz")); | |
| writer.Text("Hello world!"); | |
| } | |
| EXPECT_EQ("<foo bar=\"baz\">Hello world!</foo>\n", out.str()); | |
| } | |
| TEST(XmlElementWriter, SubElements) { | |
| std::ostringstream out; | |
| { | |
| XmlElementWriter writer(out, "root", XmlAttributes("aaa", "000")); | |
| writer.SubElement("foo", XmlAttributes()); | |
| writer.SubElement("bar", XmlAttributes("bbb", "111"))->Text("hello"); | |
| writer.SubElement("baz", "ccc", MockValueWriter("222")) | |
| ->SubElement("grandchild"); | |
| } | |
| std::string expected = | |
| "<root aaa=\"000\">\n" | |
| " <foo />\n" | |
| " <bar bbb=\"111\">hello</bar>\n" | |
| " <baz ccc=\"222\">\n" | |
| " <grandchild />\n" | |
| " </baz>\n" | |
| "</root>\n"; | |
| EXPECT_EQ(expected, out.str()); | |
| } | |
| TEST(XmlElementWriter, StartContent) { | |
| std::ostringstream out; | |
| { | |
| XmlElementWriter writer(out, "foo", XmlAttributes("bar", "baz")); | |
| writer.StartContent(false) << "Hello world!"; | |
| } | |
| EXPECT_EQ("<foo bar=\"baz\">Hello world!</foo>\n", out.str()); | |
| } | |
| TEST(XmlElementWriter, TestXmlEscape) { | |
| std::string input = "\r \n \t & < > \""; | |
| std::string output = XmlEscape(input); | |
| std::string expected = " 	 & < > ""; | |
| EXPECT_EQ(expected, output); | |
| } |