blob: c0a09f59502e390a28094de2e5ecc581836a8422 [file] [log] [blame]
// 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 "garnet/lib/ui/gfx/resources/shapes/circle_shape.h"
#include "garnet/lib/ui/gfx/resources/shapes/rectangle_shape.h"
#include "garnet/lib/ui/gfx/resources/shapes/rounded_rectangle_shape.h"
#include "garnet/lib/ui/gfx/tests/session_test.h"
#include "lib/ui/scenic/cpp/commands.h"
#include "gtest/gtest.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;
constexpr vec4 kDownVector{0.f, 0.f, -1.f, 0.f};
constexpr vec4 kUpVector{0.f, 0.f, 1.f, 0.f};
constexpr vec4 kSideVector{1.f, 0.f, 0.f, 0.f};
constexpr vec4 kZeroVector{0.f, 0.f, 0.f, 0.f};
constexpr 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(MZ-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