// Copyright 2016 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 "mojo/ui/associates/view_inspector_client.h"

#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/application_test_base.h"
#include "mojo/ui/associates/mock_view_inspector.h"
#include "mojo/ui/associates/test_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace test {

class ViewInspectorClientTest : public mojo::test::ApplicationTestBase {
 public:
  ViewInspectorClientTest() : view_inspector_binding_(&view_inspector_) {}
  ~ViewInspectorClientTest() override {}

  void SetUp() override {
    mojo::test::ApplicationTestBase::SetUp();

    mojo::InterfaceHandle<mojo::ui::ViewInspector> view_inspector;
    view_inspector_binding_.Bind(&view_inspector);
    view_inspector_client_ =
        new mojo::ui::ViewInspectorClient(view_inspector.Pass());
  }

 protected:
  void ResolveHits(mojo::gfx::composition::HitTestResultPtr hit_test_result,
                   scoped_ptr<mojo::ui::ResolvedHits>* resolved_hits) {
    base::RunLoop loop;
    view_inspector_client_->ResolveHits(
        hit_test_result.Pass(),
        base::Bind(&Capture<scoped_ptr<mojo::ui::ResolvedHits>>,
                   loop.QuitClosure(), resolved_hits));
    loop.Run();
  }

  mojo::ui::MockViewInspector view_inspector_;
  mojo::Binding<mojo::ui::ViewInspector> view_inspector_binding_;
  scoped_refptr<mojo::ui::ViewInspectorClient> view_inspector_client_;

 private:
  DISALLOW_COPY_AND_ASSIGN(ViewInspectorClientTest);
};

TEST_F(ViewInspectorClientTest, EmptyResult) {
  auto hit_test_result = mojo::gfx::composition::HitTestResult::New();

  scoped_ptr<mojo::ui::ResolvedHits> resolved_hits;
  ResolveHits(hit_test_result.Pass(), &resolved_hits);
  ASSERT_NE(nullptr, resolved_hits.get());
  EXPECT_NE(nullptr, resolved_hits->result());
  EXPECT_TRUE(resolved_hits->map().empty());
  EXPECT_EQ(0u, view_inspector_.scene_lookups());
}

TEST_F(ViewInspectorClientTest, CachingNegativeResult) {
  auto scene_token_1 = MakeDummySceneToken(1u);

  // Initial lookup, should miss cache.
  scoped_ptr<mojo::ui::ResolvedHits> resolved_hits;
  ResolveHits(MakeSimpleHitTestResult(scene_token_1.Clone()), &resolved_hits);
  ASSERT_NE(nullptr, resolved_hits.get());
  EXPECT_NE(nullptr, resolved_hits->result());
  EXPECT_TRUE(resolved_hits->map().empty());
  EXPECT_EQ(1u, view_inspector_.scene_lookups());

  // Try again, ensure no further attempts to look up scene 1.
  ResolveHits(MakeSimpleHitTestResult(scene_token_1.Clone()), &resolved_hits);
  ASSERT_NE(nullptr, resolved_hits.get());
  EXPECT_NE(nullptr, resolved_hits->result());
  EXPECT_TRUE(resolved_hits->map().empty());
  EXPECT_EQ(1u, view_inspector_.scene_lookups());
}

TEST_F(ViewInspectorClientTest, CachingPositiveResult) {
  auto scene_token_1 = MakeDummySceneToken(1u);
  auto view_token_11 = MakeDummyViewToken(11u);
  view_inspector_.SetSceneMapping(scene_token_1->value, view_token_11.Clone());

  // Initial lookup, should hit cache.
  scoped_ptr<mojo::ui::ResolvedHits> resolved_hits;
  ResolveHits(MakeSimpleHitTestResult(scene_token_1.Clone()), &resolved_hits);
  ASSERT_NE(nullptr, resolved_hits.get());
  EXPECT_NE(nullptr, resolved_hits->result());
  EXPECT_EQ(1u, resolved_hits->map().size());
  EXPECT_TRUE(
      view_token_11.Equals(resolved_hits->map().at(scene_token_1->value)));
  EXPECT_EQ(1u, view_inspector_.scene_lookups());

  // Try again, ensure no further attempts to look up scene 1.
  ResolveHits(MakeSimpleHitTestResult(scene_token_1.Clone()), &resolved_hits);
  ASSERT_NE(nullptr, resolved_hits.get());
  EXPECT_NE(nullptr, resolved_hits->result());
  EXPECT_EQ(1u, resolved_hits->map().size());
  EXPECT_TRUE(
      view_token_11.Equals(resolved_hits->map().at(scene_token_1->value)));
  EXPECT_EQ(1u, view_inspector_.scene_lookups());
}

TEST_F(ViewInspectorClientTest, CompositeSceneGraph) {
  auto scene_token_1 = MakeDummySceneToken(1u);
  auto scene_token_2 = MakeDummySceneToken(2u);
  auto scene_token_3 = MakeDummySceneToken(3u);
  auto view_token_11 = MakeDummyViewToken(11u);
  auto view_token_33 = MakeDummyViewToken(33u);
  view_inspector_.SetSceneMapping(scene_token_1->value, view_token_11.Clone());
  view_inspector_.SetSceneMapping(scene_token_3->value, view_token_33.Clone());

  // Scene graph with hits in 3 scenes, only 2 of which are views.
  auto hit_test_result = mojo::gfx::composition::HitTestResult::New();
  hit_test_result->root = mojo::gfx::composition::SceneHit::New();
  hit_test_result->root->scene_token = scene_token_1.Clone();
  hit_test_result->root->hits.push_back(mojo::gfx::composition::Hit::New());
  hit_test_result->root->hits.at(0)->set_scene(
      mojo::gfx::composition::SceneHit::New());
  hit_test_result->root->hits.at(0)->get_scene()->scene_token =
      scene_token_2.Clone();
  hit_test_result->root->hits.at(0)->get_scene()->hits.push_back(
      mojo::gfx::composition::Hit::New());
  hit_test_result->root->hits.at(0)->get_scene()->hits.at(0)->set_node(
      mojo::gfx::composition::NodeHit::New());
  hit_test_result->root->hits.push_back(mojo::gfx::composition::Hit::New());
  hit_test_result->root->hits[1]->set_scene(
      mojo::gfx::composition::SceneHit::New());
  hit_test_result->root->hits[1]->get_scene()->scene_token =
      scene_token_3.Clone();
  hit_test_result->root->hits[1]->get_scene()->hits.push_back(
      mojo::gfx::composition::Hit::New());
  hit_test_result->root->hits[1]->get_scene()->hits.at(0)->set_node(
      mojo::gfx::composition::NodeHit::New());

  scoped_ptr<mojo::ui::ResolvedHits> resolved_hits;
  ResolveHits(hit_test_result.Pass(), &resolved_hits);
  EXPECT_NE(nullptr, resolved_hits->result());
  EXPECT_EQ(2u, resolved_hits->map().size());
  EXPECT_TRUE(
      view_token_11.Equals(resolved_hits->map().at(scene_token_1->value)));
  EXPECT_TRUE(
      view_token_33.Equals(resolved_hits->map().at(scene_token_3->value)));
  EXPECT_EQ(1u, view_inspector_.scene_lookups());
}

}  // namespace test
