| // 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 "tools/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); |
| } |