// Copyright 2013 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 "cc/test/layer_tree_json_parser.h"

#include <stddef.h>

#include "cc/layers/layer.h"
#include "cc/test/fake_impl_task_runner_provider.h"
#include "cc/test/fake_layer_tree_host.h"
#include "cc/test/fake_layer_tree_host_impl.h"
#include "cc/test/geometry_test_utils.h"
#include "cc/test/test_task_graph_runner.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cc {

namespace {

bool LayerTreesMatch(LayerImpl* const layer_impl,
                     Layer* const layer) {
#define RETURN_IF_EXPECTATION_FAILS(exp) \
  do { \
    exp; \
    if (testing::UnitTest::GetInstance()->current_test_info()-> \
            result()->Failed()) \
      return false; \
  } while (0)

  RETURN_IF_EXPECTATION_FAILS(
      EXPECT_EQ(layer_impl->test_properties()->children.size(),
                layer->children().size()));
  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->bounds(), layer->bounds()));
  RETURN_IF_EXPECTATION_FAILS(EXPECT_TRANSFORMATION_MATRIX_EQ(
      layer_impl->test_properties()->transform, layer->transform()));
  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->contents_opaque(),
                                        layer->contents_opaque()));
  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->scrollable(),
                                        layer->scrollable()));

  RETURN_IF_EXPECTATION_FAILS(
      EXPECT_FLOAT_EQ(layer_impl->Opacity(), layer->opacity()));
  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->touch_action_region(),
                                        layer->touch_action_region()));

  for (size_t i = 0; i < layer_impl->test_properties()->children.size(); ++i) {
    RETURN_IF_EXPECTATION_FAILS(
        EXPECT_TRUE(LayerTreesMatch(layer_impl->test_properties()->children[i],
                                    layer->children()[i].get())));
  }

  return true;
#undef RETURN_IF_EXPECTATION_FAILS
}

}  // namespace

class LayerTreeJsonParserSanityCheck : public testing::Test {
};

TEST_F(LayerTreeJsonParserSanityCheck, Basic) {
  FakeImplTaskRunnerProvider task_runner_provider;
  TestTaskGraphRunner task_graph_runner;
  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
  LayerTreeImpl* tree = host_impl.active_tree();

  std::unique_ptr<LayerImpl> root_impl(LayerImpl::Create(tree, 1));
  std::unique_ptr<LayerImpl> parent(LayerImpl::Create(tree, 2));
  std::unique_ptr<LayerImpl> child(LayerImpl::Create(tree, 3));

  root_impl->SetBounds(gfx::Size(100, 100));
  parent->SetBounds(gfx::Size(50, 50));
  child->SetBounds(gfx::Size(40, 40));

  gfx::Transform translate;
  translate.Translate(10, 15);
  child->test_properties()->transform = translate;

  parent->test_properties()->position = gfx::PointF(25.f, 25.f);

  parent->test_properties()->AddChild(std::move(child));
  root_impl->test_properties()->AddChild(std::move(parent));
  tree->SetRootLayerForTesting(std::move(root_impl));
  tree->BuildPropertyTreesForTesting();

  std::string json = tree->LayerTreeAsJson();
  scoped_refptr<Layer> root = ParseTreeFromJson(json, nullptr);
  ASSERT_TRUE(root.get());
  EXPECT_TRUE(LayerTreesMatch(host_impl.active_tree()->root_layer_for_testing(),
                              root.get()));
}

TEST_F(LayerTreeJsonParserSanityCheck, EventHandlerRegions) {
  FakeImplTaskRunnerProvider task_runner_provider;
  TestTaskGraphRunner task_graph_runner;
  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
  LayerTreeImpl* tree = host_impl.active_tree();

  std::unique_ptr<LayerImpl> root_impl(LayerImpl::Create(tree, 1));
  std::unique_ptr<LayerImpl> touch_layer(LayerImpl::Create(tree, 2));

  root_impl->SetBounds(gfx::Size(100, 100));
  touch_layer->SetBounds(gfx::Size(50, 50));

  TouchActionRegion touch_action_region;
  touch_action_region.Union(kTouchActionNone, gfx::Rect(10, 10, 20, 30));
  touch_action_region.Union(kTouchActionNone, gfx::Rect(40, 10, 20, 20));
  touch_layer->SetTouchActionRegion(std::move(touch_action_region));

  root_impl->test_properties()->AddChild(std::move(touch_layer));
  tree->SetRootLayerForTesting(std::move(root_impl));
  tree->BuildPropertyTreesForTesting();

  std::string json = tree->LayerTreeAsJson();
  scoped_refptr<Layer> root = ParseTreeFromJson(json, nullptr);
  ASSERT_TRUE(root.get());
  EXPECT_TRUE(LayerTreesMatch(host_impl.active_tree()->root_layer_for_testing(),
                              root.get()));
}

}  // namespace cc
