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