// 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 "cobalt/dom/dom_parser.h"

#include <memory>
#include <string>

#include "base/threading/platform_thread.h"
#include "cobalt/dom/document.h"
#include "cobalt/dom/html_element_context.h"
#include "cobalt/dom/testing/stub_css_parser.h"
#include "cobalt/dom/testing/stub_environment_settings.h"
#include "cobalt/dom/testing/stub_script_runner.h"
#include "cobalt/dom_parser/parser.h"
#include "cobalt/loader/fetcher_factory.h"
#include "cobalt/loader/loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace dom {

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

  testing::StubEnvironmentSettings environment_settings_;
  base::NullDebuggerHooks null_debugger_hooks_;
  loader::FetcherFactory fetcher_factory_;
  loader::LoaderFactory loader_factory_;
  testing::StubCSSParser stub_css_parser_;
  std::unique_ptr<dom_parser::Parser> dom_parser_parser_;
  testing::StubScriptRunner stub_script_runner_;
  HTMLElementContext html_element_context_;
  scoped_refptr<DOMParser> dom_parser_;
};

DOMParserTest::DOMParserTest()
    : fetcher_factory_(NULL /* network_module */),
      loader_factory_("Test" /* name */, &fetcher_factory_,
                      NULL /* resource provider */, null_debugger_hooks_,
                      0 /* encoded_image_cache_capacity */,
                      base::ThreadPriority::DEFAULT),
      dom_parser_parser_(new dom_parser::Parser()),
      html_element_context_(
          &environment_settings_, &fetcher_factory_, &loader_factory_,
          &stub_css_parser_, dom_parser_parser_.get(),
          NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
          &stub_script_runner_, NULL /* script_value_factory */,
          NULL /* media_source_registry */, NULL /* resource_provider */,
          NULL /* animated_image_tracker */, NULL /* image_cache */,
          NULL /* reduced_image_cache_capacity_manager */,
          NULL /* remote_typeface_cache */, NULL /* mesh_cache */,
          NULL /* dom_stat_tracker */, "" /* language */,
          base::kApplicationStateStarted,
          NULL /* synchronous_loader_interrupt */),
      dom_parser_(new DOMParser(&html_element_context_)) {}

TEST_F(DOMParserTest, ParsesXML) {
  const std::string input =
      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
      "<MPD xmlns:xsi=\"https://www.w3.org/2001/XMLSchema-instance\""
      " xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
      " xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\">\n"
      "  <Period>\n"
      "    <SegmentList>\n"
      "      <Initialization sourceURL=\"mp4-main-multi-h264bl_full-.mp4\""
      "       range=\"0-591\"/>\n"
      "      <SegmentURL media=\"mp4-main-multi-h264bl_full-1.m4s\""
      "       mediaRange=\"592-\"/>\n"
      "      <SegmentURL media=\"mp4-main-multi-h264bl_full-2.m4s\"/>\n"
      "    </SegmentList>\n"
      "  </Period>\n"
      "</MPD>\n";
  scoped_refptr<Document> document =
      dom_parser_->ParseFromString(input, kDOMParserSupportedTypeTextXml);
  EXPECT_TRUE(document->IsXMLDocument());
}

}  // namespace dom
}  // namespace cobalt
