// Copyright 2015 The Cobalt 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.

#include <sstream>
#include <string>

#include "base/message_loop.h"
#include "cobalt/dom/document.h"
#include "cobalt/dom/document_type.h"
#include "cobalt/dom/element.h"
#include "cobalt/dom/html_element_context.h"
#include "cobalt/dom/serializer.h"
#include "cobalt/dom_parser/parser.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace dom {

class SerializerTest : public ::testing::Test {
 protected:
  SerializerTest();
  ~SerializerTest() override {}

  scoped_ptr<dom_parser::Parser> dom_parser_;
  scoped_ptr<DomStatTracker> dom_stat_tracker_;
  HTMLElementContext html_element_context_;
  scoped_refptr<Document> document_;
  scoped_refptr<Element> root_;
  base::SourceLocation source_location_;
  MessageLoop message_loop_;
};

SerializerTest::SerializerTest()
    : dom_parser_(new dom_parser::Parser()),
      dom_stat_tracker_(new DomStatTracker("SerializerTest")),
      html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                            NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                            dom_stat_tracker_.get(), "",
                            base::kApplicationStateStarted, NULL),
      document_(new Document(&html_element_context_)),
      root_(new Element(document_, base::Token("root"))),
      source_location_(base::SourceLocation("[object SerializerTest]", 1, 1)) {}

TEST_F(SerializerTest, Serialize) {
  const std::string input = "<div a><div b><div c></div></div></div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.Serialize(root_->first_element_child());
  EXPECT_EQ(input, oss.str());
}

TEST_F(SerializerTest, SerializeSelfOnly) {
  const std::string input = "<div a><div b><div c></div></div></div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeSelfOnly(root_->first_element_child());
  EXPECT_EQ("<div a>...</div>", oss.str());
}

TEST_F(SerializerTest, SerializeDescendantsOnly) {
  const std::string input = "<div a><div b><div c></div></div></div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_->first_element_child());
  EXPECT_EQ("<div b><div c></div></div>", oss.str());
}

TEST_F(SerializerTest, Empty) {
  const std::string input = "";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_);
  EXPECT_EQ(input, oss.str());
}

TEST_F(SerializerTest, Comment) {
  const std::string input = "<div><!-- some comment --></div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_);
  EXPECT_EQ(input, oss.str());
}

TEST_F(SerializerTest, Document) {
  const std::string input = "<html><body><div></div></body></html>";
  document_ = dom_parser_->ParseDocument(input, &html_element_context_,
                                         source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.Serialize(document_);
  EXPECT_EQ(input, oss.str());
}

TEST_F(SerializerTest, DocumentType) {
  // Currently doctype is not generated by the parser, so not using it here.
  scoped_refptr<DocumentType> doctype =
      new DocumentType(document_, base::Token("html"), "", "");

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.Serialize(doctype);
  EXPECT_EQ("<!DOCTYPE html>", oss.str());
}

TEST_F(SerializerTest, ElementBothOpeningAndClosingTagShouldBeOutput) {
  const std::string input = "<br/>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_);
  EXPECT_EQ("<br></br>", oss.str());
}

TEST_F(SerializerTest, ElementAttributesShouldBeSorted) {
  const std::string input = "<div c b a></div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_);
  EXPECT_EQ("<div a b c></div>", oss.str());
}

TEST_F(SerializerTest, ElementAttributeEmptyValuesShouldBeOmitted) {
  const std::string input = "<div a b=\"\" c=\"value\"></div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_);
  EXPECT_EQ("<div a b c=\"value\"></div>", oss.str());
}

TEST_F(SerializerTest, ElementAttributeSpacesShouldBeCollapsed) {
  const std::string input = "<div a    b         c></div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_);
  EXPECT_EQ("<div a b c></div>", oss.str());
}

TEST_F(SerializerTest, Text) {
  const std::string input = "<div> some text </div>";
  dom_parser_->ParseDocumentFragment(input, document_, root_, NULL,
                                     source_location_);

  std::ostringstream oss;
  Serializer serializer(&oss);
  serializer.SerializeDescendantsOnly(root_);
  EXPECT_EQ(input, oss.str());
}

}  // namespace dom
}  // namespace cobalt
