// Copyright 2019 The Fuchsia 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 <gtest/gtest.h>

#include "src/lib/ui/input/gesture.h"
#include "src/ui/lib/glm_workaround/glm_workaround.h"

namespace {

class GestureTest : public testing::Test {
 protected:
  input::Gesture gesture_;
};

// Ensures that a single-pointer drag produces the expected deltas and no scale
// or rotation.
TEST_F(GestureTest, SinglePointerDrag) {
  gesture_.AddPointer(0, {0, 0});

  auto delta = gesture_.UpdatePointer(0, {1, 0});
  EXPECT_EQ(delta.translation, glm::vec2(1, 0));
  EXPECT_EQ(delta.rotation, 0);
  EXPECT_EQ(delta.scale, 1);

  delta = gesture_.UpdatePointer(0, {1, -1});
  EXPECT_EQ(delta.translation, glm::vec2(0, -1));
  EXPECT_EQ(delta.rotation, 0);
  EXPECT_EQ(delta.scale, 1);
}

// Ensures that after adding a new pointer, the delta is the average across
// both pointers and that the relative offset between the pointers does not
// skew the delta.
TEST_F(GestureTest, MultiPointerDelta) {
  gesture_.AddPointer(0, {1, 1});
  // move the first pointer to ensure no special treatment
  gesture_.UpdatePointer(0, {1, 2});

  gesture_.AddPointer(1, {10, 1});
  auto delta = gesture_.UpdatePointer(1, {10, 2});
  EXPECT_EQ(delta.translation, glm::vec2(0, .5));
}

// Basic 2-pointer scale.
TEST_F(GestureTest, Scale2) {
  gesture_.AddPointer(0, {0, 0});
  gesture_.AddPointer(1, {0, 1});

  auto delta = gesture_.UpdatePointer(1, {0, 2});
  EXPECT_EQ(delta.scale, 2);
  EXPECT_EQ(delta.rotation, 0);
}

// Ensures that 3-pointer scale is reasonable.
TEST_F(GestureTest, Scale3) {
  constexpr float kSqrt3 = -1.73f;

  gesture_.AddPointer(0, {0, -1});
  gesture_.AddPointer(1, {-kSqrt3, .5f});
  gesture_.AddPointer(2, {kSqrt3, .5f});

  input::Gesture::Delta delta;

  delta += gesture_.UpdatePointer(0, {0, -2});
  delta += gesture_.UpdatePointer(1, {2 * -kSqrt3, 1});
  delta += gesture_.UpdatePointer(2, {2 * kSqrt3, 1});

  EXPECT_NEAR(delta.scale, 2, .1f);
  EXPECT_NEAR(delta.rotation, 0, .05f);
  EXPECT_NEAR(delta.translation.x, 0, .01f);
  EXPECT_NEAR(delta.translation.y, 0, .01f);
}

TEST_F(GestureTest, Rotate2) {
  gesture_.AddPointer(0, {0, 0});
  gesture_.AddPointer(1, {0, 1});

  auto delta = gesture_.UpdatePointer(1, {.1f, 1});
  EXPECT_NEAR(delta.rotation, -.1f, .01f);
}

TEST_F(GestureTest, Rotate3) {
  constexpr float kSqrt3 = -1.73f;

  gesture_.AddPointer(0, {0, -1});
  gesture_.AddPointer(1, {-kSqrt3, .5f});
  gesture_.AddPointer(2, {kSqrt3, .5f});

  input::Gesture::Delta delta;

  delta += gesture_.UpdatePointer(0, {.1f, -1});
  delta += gesture_.UpdatePointer(1, {-kSqrt3 - .05f, .5f - .05f * kSqrt3});
  delta += gesture_.UpdatePointer(2, {kSqrt3 - .05f, .5f + .05f * kSqrt3});

  EXPECT_NEAR(delta.scale, 1, .01f);
  EXPECT_NEAR(delta.rotation, .1f, .05f);
  EXPECT_NEAR(delta.translation.x, 0, .01f);
  EXPECT_NEAR(delta.translation.y, 0, .01f);
}

TEST_F(GestureTest, RemovePointer) {
  EXPECT_FALSE(gesture_.has_pointers());
  EXPECT_EQ(gesture_.pointer_count(), 0u);

  gesture_.AddPointer(0, {0, 0});
  EXPECT_TRUE(gesture_.has_pointers());
  EXPECT_EQ(gesture_.pointer_count(), 1u);

  gesture_.AddPointer(1, {0, 1});
  EXPECT_TRUE(gesture_.has_pointers());
  EXPECT_EQ(gesture_.pointer_count(), 2u);

  // move both pointers to ensure no special treatment
  gesture_.UpdatePointer(0, {1, 0});
  gesture_.UpdatePointer(1, {1, 1});

  EXPECT_TRUE(gesture_.has_pointers());
  EXPECT_EQ(gesture_.pointer_count(), 2u);

  gesture_.RemovePointer(0);
  EXPECT_TRUE(gesture_.has_pointers());
  EXPECT_EQ(gesture_.pointer_count(), 1u);

  auto delta = gesture_.UpdatePointer(1, {1, 2});
  EXPECT_EQ(delta, input::Gesture::Delta({.translation = {0, 1}, .rotation = 0, .scale = 1}));
  EXPECT_TRUE(gesture_.has_pointers());
  EXPECT_EQ(gesture_.pointer_count(), 1u);

  gesture_.RemovePointer(1);
  EXPECT_FALSE(gesture_.has_pointers());
  EXPECT_EQ(gesture_.pointer_count(), 0u);
}

}  // namespace
