// 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/node_list_live.h"

#include "cobalt/dom/document.h"
#include "cobalt/dom/dom_stat_tracker.h"
#include "cobalt/dom/element.h"
#include "cobalt/dom/html_element_context.h"
#include "cobalt/dom/testing/stub_environment_settings.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace dom {

class NodeListLiveTest : public ::testing::Test {
 protected:
  NodeListLiveTest()
      : dom_stat_tracker_("NodeListLiveTest"),
        html_element_context_(&environment_settings_, NULL, NULL, NULL, NULL,
                              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                              NULL, NULL, NULL, &dom_stat_tracker_, "",
                              base::kApplicationStateStarted, NULL),
        document_(new Document(&html_element_context_)) {}

  ~NodeListLiveTest() override {}

  testing::StubEnvironmentSettings environment_settings_;
  DomStatTracker dom_stat_tracker_;
  HTMLElementContext html_element_context_;
  scoped_refptr<Document> document_;
};

TEST_F(NodeListLiveTest, NodeListLiveTest) {
  scoped_refptr<Element> root = document_->CreateElement("div");
  scoped_refptr<NodeListLive> node_list_live =
      NodeListLive::CreateWithChildren(root);
  EXPECT_EQ(0, node_list_live->length());

  scoped_refptr<Element> child1 = document_->CreateElement("div");
  scoped_refptr<Element> child2 = document_->CreateElement("div");
  scoped_refptr<Element> child3 = document_->CreateElement("div");
  root->AppendChild(child1);
  root->AppendChild(child2);
  root->AppendChild(child3);
  EXPECT_EQ(3, node_list_live->length());
  EXPECT_EQ(child1, node_list_live->Item(0));
  EXPECT_EQ(child2, node_list_live->Item(1));
  EXPECT_EQ(child3, node_list_live->Item(2));
  EXPECT_FALSE(node_list_live->Item(3));

  root->RemoveChild(child2);
  EXPECT_EQ(2, node_list_live->length());
  EXPECT_EQ(child1, node_list_live->Item(0));
  EXPECT_EQ(child3, node_list_live->Item(1));
  EXPECT_FALSE(node_list_live->Item(2));
}
}  // namespace dom
}  // namespace cobalt
