// 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 "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 = "&#13; &#10; &#9; &amp; &lt; &gt; &quot;";
  EXPECT_EQ(expected, output);
}
