// Copyright 2017 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 <math.h>

#include "gtest/gtest.h"
#include "lib/ui/scenic/cpp/commands.h"
#include "src/ui/scenic/lib/gfx/resources/shapes/circle_shape.h"
#include "src/ui/scenic/lib/gfx/resources/shapes/rectangle_shape.h"
#include "src/ui/scenic/lib/gfx/resources/shapes/rounded_rectangle_shape.h"
#include "src/ui/scenic/lib/gfx/tests/session_test.h"

namespace scenic_impl {
namespace gfx {
namespace test {
namespace {
using escher::ray4;
using escher::vec2;
using escher::vec3;
using escher::vec4;

constexpr float kSqrt2_2 = M_SQRT2 / 2.f;
const vec4 kDownVector{0.f, 0.f, 1.f, 0.f};
const vec4 kUpVector{0.f, 0.f, -1.f, 0.f};
const vec4 kSideVector{1.f, 0.f, 0.f, 0.f};
const vec4 kZeroVector{0.f, 0.f, 0.f, 0.f};
const vec4 kAngledVector{2.f, -1.f, .5f, 0.f};
}  // namespace

using ShapeTest = SessionTest;

TEST_F(ShapeTest, Circle) {
  const ResourceId id = 1;
  EXPECT_TRUE(Apply(scenic::NewCreateCircleCmd(id, 50.f)));

  auto circle = FindResource<CircleShape>(id);
  ASSERT_NE(nullptr, circle.get());
  EXPECT_EQ(50.f, circle->radius());

  EXPECT_TRUE(circle->ContainsPoint(vec2(0.f, 0.f)));
  EXPECT_TRUE(circle->ContainsPoint(vec2(50.f, 0.f)));
  EXPECT_TRUE(circle->ContainsPoint(vec2(0.f, -50.f)));
  EXPECT_TRUE(circle->ContainsPoint(vec2(-50.f, 0.f)));
  EXPECT_TRUE(circle->ContainsPoint(vec2(0.f, 50.f)));
  EXPECT_TRUE(circle->ContainsPoint(vec2(50.f * kSqrt2_2, 50.f * kSqrt2_2)));

  EXPECT_FALSE(circle->ContainsPoint(vec2(50.1f, 0.f)));
  EXPECT_FALSE(circle->ContainsPoint(vec2(0.f, -50.1f)));
  EXPECT_FALSE(circle->ContainsPoint(vec2(-50.1f, 0.f)));
  EXPECT_FALSE(circle->ContainsPoint(vec2(0.f, 50.1f)));
  EXPECT_FALSE(circle->ContainsPoint(vec2(50.1f * kSqrt2_2, 50.1f * kSqrt2_2)));

  float distance = -1.f;
  EXPECT_TRUE(circle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(0.f, distance);
  EXPECT_TRUE(circle->GetIntersection(ray4{vec4(0.f, 0.f, -5.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(5.f, distance);
  EXPECT_TRUE(circle->GetIntersection(ray4{vec4(50.f, 0.f, -10.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(10.f, distance);
  EXPECT_TRUE(circle->GetIntersection(
      ray4{vec4(50.f * kSqrt2_2, -50.f * kSqrt2_2, 0.f, 1.f) - 40.f * kAngledVector, kAngledVector},
      &distance));
  EXPECT_EQ(40.f, distance);
  EXPECT_TRUE(circle->GetIntersection(
      ray4{vec4(50.f * kSqrt2_2 * 3.f, -50.f * kSqrt2_2 * 3.f, 0.f, 3.f) - 40.f * kAngledVector,
           kAngledVector},
      &distance));
  EXPECT_EQ(40.f, distance);

  EXPECT_FALSE(circle->GetIntersection(ray4{vec4(0.f, 0.f, 1.f, 1.f), kDownVector}, &distance));
  EXPECT_FALSE(circle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kUpVector}, &distance));
  EXPECT_FALSE(circle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kSideVector}, &distance));
  EXPECT_FALSE(circle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kZeroVector}, &distance));
  EXPECT_FALSE(circle->GetIntersection(
      ray4{vec4(50.1f * kSqrt2_2, -50.1f * kSqrt2_2, 0.f, 1.f) - 40.f * kAngledVector,
           kAngledVector},
      &distance));
}

TEST_F(ShapeTest, Rectangle) {
  const ResourceId id = 1;
  EXPECT_TRUE(Apply(scenic::NewCreateRectangleCmd(id, 30.f, 40.f)));

  auto rectangle = FindResource<RectangleShape>(id);
  ASSERT_NE(nullptr, rectangle.get());
  EXPECT_EQ(30.f, rectangle->width());
  EXPECT_EQ(40.f, rectangle->height());

  EXPECT_TRUE(rectangle->ContainsPoint(vec2(0.f, 0.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(15.f, 0.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(15.f, -20.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(0.f, -20.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(-15.f, -20.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(-15.f, 0.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(-15.f, 20.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(0.f, 20.f)));
  EXPECT_TRUE(rectangle->ContainsPoint(vec2(15.f, 20.f)));

  EXPECT_FALSE(rectangle->ContainsPoint(vec2(15.1f, 0.f)));
  EXPECT_FALSE(rectangle->ContainsPoint(vec2(15.1f, -20.1f)));
  EXPECT_FALSE(rectangle->ContainsPoint(vec2(0.f, -20.1f)));
  EXPECT_FALSE(rectangle->ContainsPoint(vec2(-15.1f, -20.1f)));
  EXPECT_FALSE(rectangle->ContainsPoint(vec2(-15.1f, 0.f)));
  EXPECT_FALSE(rectangle->ContainsPoint(vec2(-15.1f, 20.1f)));
  EXPECT_FALSE(rectangle->ContainsPoint(vec2(0.f, 20.1f)));
  EXPECT_FALSE(rectangle->ContainsPoint(vec2(15.1f, 20.1f)));

  float distance = -1.f;
  EXPECT_TRUE(rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(0.f, distance);
  EXPECT_TRUE(rectangle->GetIntersection(ray4{vec4(0.f, 0.f, -5.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(5.f, distance);
  EXPECT_TRUE(
      rectangle->GetIntersection(ray4{vec4(15.f, 20.f, -10.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(10.f, distance);
  EXPECT_TRUE(rectangle->GetIntersection(
      ray4{vec4(15.f, -20.f, 0.f, 1.f) - 40.f * kAngledVector, kAngledVector}, &distance));
  EXPECT_EQ(40.f, distance);
  EXPECT_TRUE(rectangle->GetIntersection(
      ray4{vec4(15.f * 3.f, -20.f * 3.f, 0.f, 3.f) - 40.f * kAngledVector, kAngledVector},
      &distance));
  EXPECT_EQ(40.f, distance);

  EXPECT_FALSE(rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 1.f, 1.f), kDownVector}, &distance));
  EXPECT_FALSE(rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kUpVector}, &distance));
  EXPECT_FALSE(rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kSideVector}, &distance));
  EXPECT_FALSE(rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kZeroVector}, &distance));
  EXPECT_FALSE(rectangle->GetIntersection(
      ray4{vec4(15.1f, -20.1f, 0.f, 1.f) - 40.f * kAngledVector, kAngledVector}, &distance));
}

// TODO(SCN-159): This test needs a rounded rect factory to run but it is
// not currently available in the engine for tests.
TEST_F(ShapeTest, DISABLED_RoundedRectangle) {
  const ResourceId id = 1;
  EXPECT_TRUE(Apply(scenic::NewCreateRoundedRectangleCmd(id, 30.f, 40.f, 2.f, 4.f, 6.f, 8.f)));

  auto rounded_rectangle = FindResource<RoundedRectangleShape>(id);
  ASSERT_NE(nullptr, rounded_rectangle.get());
  EXPECT_EQ(30.f, rounded_rectangle->width());
  EXPECT_EQ(40.f, rounded_rectangle->height());

  EXPECT_TRUE(rounded_rectangle->ContainsPoint(vec2(0.f, 0.f)));
  EXPECT_TRUE(rounded_rectangle->ContainsPoint(vec2(15.f, 0.f)));
  EXPECT_TRUE(
      rounded_rectangle->ContainsPoint(vec2(15.f - 4.f * kSqrt2_2, -20.f + 4.f * kSqrt2_2)));
  EXPECT_TRUE(rounded_rectangle->ContainsPoint(vec2(0.f, -20.f)));
  EXPECT_TRUE(
      rounded_rectangle->ContainsPoint(vec2(-15.f + 2.f * kSqrt2_2, -20.f + 2.f * kSqrt2_2)));
  EXPECT_TRUE(rounded_rectangle->ContainsPoint(vec2(-15.f, 0.f)));
  EXPECT_TRUE(
      rounded_rectangle->ContainsPoint(vec2(-15.f + 8.f * kSqrt2_2, 20.f - 8.f * kSqrt2_2)));
  EXPECT_TRUE(rounded_rectangle->ContainsPoint(vec2(0.f, 20.f)));
  EXPECT_TRUE(rounded_rectangle->ContainsPoint(vec2(15.f - 6.f * kSqrt2_2, 20.f - 6.f * kSqrt2_2)));

  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(15.1f, 0.f)));
  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(15.f, -20.f)));
  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(0.f, -20.1f)));
  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(-15.f, -20.f)));
  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(-15.1f, 0.f)));
  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(-15.f, 20.f)));
  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(0.f, 20.1f)));
  EXPECT_FALSE(rounded_rectangle->ContainsPoint(vec2(15.f, 20.f)));

  float distance = -1.f;
  EXPECT_TRUE(
      rounded_rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(0.f, distance);
  EXPECT_TRUE(
      rounded_rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 5.f, 1.f), kDownVector}, &distance));
  EXPECT_EQ(5.f, distance);
  EXPECT_TRUE(rounded_rectangle->GetIntersection(
      ray4{vec4(15.f - 4.f * kSqrt2_2, -20.f + 4.f * kSqrt2_2, 10.f, 1.f), kDownVector},
      &distance));
  EXPECT_EQ(10.f, distance);
  EXPECT_TRUE(rounded_rectangle->GetIntersection(
      ray4{vec4(15.f - 4.f * kSqrt2_2, -20.f + 4.f * kSqrt2_2, 0.f, 1.f) - 40.f * kAngledVector,
           kAngledVector},
      &distance));
  EXPECT_EQ(40.f, distance);
  EXPECT_TRUE(rounded_rectangle->GetIntersection(
      ray4{vec4((15.f - 4.f * kSqrt2_2) * 3.f, (-20.f + 4.f * kSqrt2_2) * 3.f, 0.f, 3.f) -
               40.f * kAngledVector,
           kAngledVector},
      &distance));
  EXPECT_EQ(40.f, distance);

  EXPECT_FALSE(
      rounded_rectangle->GetIntersection(ray4{vec4(0.f, 0.f, -1.f, 1.f), kDownVector}, &distance));
  EXPECT_FALSE(
      rounded_rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kUpVector}, &distance));
  EXPECT_FALSE(
      rounded_rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kSideVector}, &distance));
  EXPECT_FALSE(
      rounded_rectangle->GetIntersection(ray4{vec4(0.f, 0.f, 0.f, 1.f), kZeroVector}, &distance));
  EXPECT_FALSE(rounded_rectangle->GetIntersection(
      ray4{vec4(15.1f - 4.f * kSqrt2_2, -20.1f + 4.f * kSqrt2_2, 0.f, 1.f) - 40.f * kAngledVector,
           kAngledVector},
      &distance));
}

}  // namespace test
}  // namespace gfx
}  // namespace scenic_impl
