// Copyright 2014 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 <memory>
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/css/style_engine.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/element.h"
#include "third_party/blink/renderer/core/frame/local_frame_view.h"
#include "third_party/blink/renderer/core/testing/dummy_page_holder.h"

namespace blink {

TEST(DragUpdateTest, AffectedByDragUpdate) {
  // Check that when dragging the div in the document below, you only get a
  // single element style recalc.

  auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600));
  Document& document = dummy_page_holder->GetDocument();
  document.documentElement()->setInnerHTML(R"HTML(
    <style>div {width:100px;height:100px} div:-webkit-drag {
    background-color: green }</style>
    <div id='div'>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    </div>
  )HTML");

  document.View()->UpdateAllLifecyclePhasesForTest();
  unsigned start_count = document.GetStyleEngine().StyleForElementCount();

  document.getElementById("div")->SetDragged(true);
  document.View()->UpdateAllLifecyclePhasesForTest();

  unsigned element_count =
      document.GetStyleEngine().StyleForElementCount() - start_count;

  ASSERT_EQ(1U, element_count);
}

TEST(DragUpdateTest, ChildAffectedByDragUpdate) {
  // Check that when dragging the div in the document below, you get a
  // single element style recalc.

  auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600));
  Document& document = dummy_page_holder->GetDocument();
  document.documentElement()->setInnerHTML(R"HTML(
    <style>div {width:100px;height:100px} div:-webkit-drag .drag {
    background-color: green }</style>
    <div id='div'>
    <span></span>
    <span></span>
    <span class='drag'></span>
    <span></span>
    </div>
  )HTML");

  document.UpdateStyleAndLayout(DocumentUpdateReason::kTest);
  unsigned start_count = document.GetStyleEngine().StyleForElementCount();

  document.getElementById("div")->SetDragged(true);
  document.UpdateStyleAndLayout(DocumentUpdateReason::kTest);

  unsigned element_count =
      document.GetStyleEngine().StyleForElementCount() - start_count;

  ASSERT_EQ(1U, element_count);
}

TEST(DragUpdateTest, SiblingAffectedByDragUpdate) {
  // Check that when dragging the div in the document below, you get a
  // single element style recalc.

  auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600));
  Document& document = dummy_page_holder->GetDocument();
  document.documentElement()->setInnerHTML(R"HTML(
    <style>div {width:100px;height:100px} div:-webkit-drag + .drag {
    background-color: green }</style>
    <div id='div'>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    </div>
    <span class='drag'></span>
  )HTML");

  document.UpdateStyleAndLayout(DocumentUpdateReason::kTest);
  unsigned start_count = document.GetStyleEngine().StyleForElementCount();

  document.getElementById("div")->SetDragged(true);
  document.UpdateStyleAndLayout(DocumentUpdateReason::kTest);

  unsigned element_count =
      document.GetStyleEngine().StyleForElementCount() - start_count;

  ASSERT_EQ(1U, element_count);
}

}  // namespace blink
