blob: 5f6902f8826b0f0109a9e57ed0ce88fd7c6a4b57 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/geometry/vector2d_f.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/test/geometry_util.h"
#include "ui/gfx/geometry/vector2d.h"
namespace gfx {
TEST(Vector2dTest, Vector2dToVector2dF) {
Vector2d i(3, 4);
Vector2dF f = i;
EXPECT_EQ(i, f);
}
TEST(Vector2dFTest, IsZero) {
EXPECT_TRUE(Vector2dF().IsZero());
EXPECT_TRUE(Vector2dF(0, 0).IsZero());
EXPECT_FALSE(Vector2dF(0.1f, 0).IsZero());
EXPECT_FALSE(Vector2dF(0, -0.1f).IsZero());
EXPECT_FALSE(Vector2dF(0.1f, -0.1f).IsZero());
}
TEST(Vector2dFTest, Add) {
Vector2dF f1(3.1f, 5.1f);
Vector2dF f2(4.3f, -1.3f);
EXPECT_VECTOR2DF_EQ(Vector2dF(3.1f, 5.1f), f1 + Vector2dF());
EXPECT_VECTOR2DF_EQ(Vector2dF(3.1f + 4.3f, 5.1f - 1.3f), f1 + f2);
EXPECT_VECTOR2DF_EQ(Vector2dF(3.1f - 4.3f, 5.1f + 1.3f), f1 - f2);
}
TEST(Vector2dFTest, Negative) {
EXPECT_VECTOR2DF_EQ(Vector2dF(), -Vector2dF());
EXPECT_VECTOR2DF_EQ(Vector2dF(-0.3f, -0.3f), -Vector2dF(0.3f, 0.3f));
EXPECT_VECTOR2DF_EQ(Vector2dF(0.3f, 0.3f), -Vector2dF(-0.3f, -0.3f));
EXPECT_VECTOR2DF_EQ(Vector2dF(-0.3f, 0.3f), -Vector2dF(0.3f, -0.3f));
EXPECT_VECTOR2DF_EQ(Vector2dF(0.3f, -0.3f), -Vector2dF(-0.3f, 0.3f));
}
TEST(Vector2dFTest, Scale) {
float double_values[][4] = {
{4.5f, 1.2f, 3.3f, 5.6f}, {4.5f, -1.2f, 3.3f, 5.6f},
{4.5f, 1.2f, 3.3f, -5.6f}, {4.5f, 1.2f, -3.3f, -5.6f},
{-4.5f, 1.2f, 3.3f, 5.6f}, {-4.5f, 1.2f, 0, 5.6f},
{-4.5f, 1.2f, 3.3f, 0}, {4.5f, 0, 3.3f, 5.6f},
{0, 1.2f, 3.3f, 5.6f}};
for (auto& values : double_values) {
Vector2dF v(values[0], values[1]);
v.Scale(values[2], values[3]);
EXPECT_EQ(v.x(), values[0] * values[2]);
EXPECT_EQ(v.y(), values[1] * values[3]);
Vector2dF v2 = ScaleVector2d(gfx::Vector2dF(values[0], values[1]),
values[2], values[3]);
EXPECT_EQ(values[0] * values[2], v2.x());
EXPECT_EQ(values[1] * values[3], v2.y());
}
float single_values[][3] = {
{4.5f, 1.2f, 3.3f}, {4.5f, -1.2f, 3.3f}, {4.5f, 1.2f, 3.3f},
{4.5f, 1.2f, -3.3f}, {-4.5f, 1.2f, 3.3f}, {-4.5f, 1.2f, 0},
{-4.5f, 1.2f, 3.3f}, {4.5f, 0, 3.3f}, {0, 1.2f, 3.3f}};
for (auto& values : single_values) {
Vector2dF v(values[0], values[1]);
v.Scale(values[2]);
EXPECT_EQ(v.x(), values[0] * values[2]);
EXPECT_EQ(v.y(), values[1] * values[2]);
Vector2dF v2 =
ScaleVector2d(gfx::Vector2dF(values[0], values[1]), values[2]);
EXPECT_EQ(values[0] * values[2], v2.x());
EXPECT_EQ(values[1] * values[2], v2.y());
}
}
TEST(Vector2dFTest, SetToMinMax) {
Vector2dF a;
a = Vector2dF(3.5f, 5.5f);
EXPECT_EQ(Vector2dF(3.5f, 5.5f), a);
a.SetToMax(Vector2dF(2.5f, 4.5f));
EXPECT_EQ(Vector2dF(3.5f, 5.5f), a);
a.SetToMax(Vector2dF(3.5f, 5.5f));
EXPECT_EQ(Vector2dF(3.5f, 5.5f), a);
a.SetToMax(Vector2dF(4.5f, 2.5f));
EXPECT_EQ(Vector2dF(4.5f, 5.5f), a);
a.SetToMax(Vector2dF(8.5f, 10.5f));
EXPECT_EQ(Vector2dF(8.5f, 10.5f), a);
a.SetToMin(Vector2dF(9.5f, 11.5f));
EXPECT_EQ(Vector2dF(8.5f, 10.5f), a);
a.SetToMin(Vector2dF(8.5f, 10.5f));
EXPECT_EQ(Vector2dF(8.5f, 10.5f), a);
a.SetToMin(Vector2dF(11.5f, 9.5f));
EXPECT_EQ(Vector2dF(8.5f, 9.5f), a);
a.SetToMin(Vector2dF(7.5f, 11.5f));
EXPECT_EQ(Vector2dF(7.5f, 9.5f), a);
a.SetToMin(Vector2dF(3.5f, 5.5f));
EXPECT_EQ(Vector2dF(3.5f, 5.5f), a);
}
TEST(Vector2dFTest, Length) {
constexpr float kFloatMax = std::numeric_limits<float>::max();
EXPECT_FLOAT_EQ(0.f, Vector2dF(0, 0).Length());
EXPECT_FLOAT_EQ(1.f, Vector2dF(1, 0).Length());
EXPECT_FLOAT_EQ(1.414214f, Vector2dF(1, 1).Length());
EXPECT_FLOAT_EQ(2.236068f, Vector2dF(-1, -2).Length());
// The Pythagorean triples 3-4-5 and 5-12-13.
EXPECT_FLOAT_EQ(5.f, Vector2dF(3.f, 4.f).Length());
EXPECT_FLOAT_EQ(13.f, Vector2dF(5.f, 12.f).Length());
// Very small numbers.
EXPECT_FLOAT_EQ(.7071068e-20f, Vector2dF(.5e-20f, .5e-20f).Length());
// Very large numbers.
EXPECT_FLOAT_EQ(.7071068e20f, Vector2dF(.5e20f, .5e20f).Length());
EXPECT_FLOAT_EQ(kFloatMax, Vector2dF(kFloatMax, 0).Length());
EXPECT_FLOAT_EQ(kFloatMax, Vector2dF(kFloatMax, kFloatMax).Length());
}
TEST(Vector2dFTest, SlopeAngleRadians) {
// The function is required to be very accurate, so we use a smaller
// tolerance than EXPECT_FLOAT_EQ().
constexpr float kTolerance = 1e-7f;
constexpr float kPi = 3.1415927f;
EXPECT_NEAR(0, Vector2dF(0, 0).SlopeAngleRadians(), kTolerance);
EXPECT_NEAR(0, Vector2dF(1, 0).SlopeAngleRadians(), kTolerance);
EXPECT_NEAR(kPi / 4, Vector2dF(1, 1).SlopeAngleRadians(), kTolerance);
EXPECT_NEAR(kPi / 2, Vector2dF(0, 1).SlopeAngleRadians(), kTolerance);
EXPECT_NEAR(kPi, Vector2dF(-50, 0).SlopeAngleRadians(), kTolerance);
EXPECT_NEAR(-kPi * 3 / 4, Vector2dF(-50, -50).SlopeAngleRadians(),
kTolerance);
EXPECT_NEAR(-kPi / 4, Vector2dF(1, -1).SlopeAngleRadians(), kTolerance);
}
TEST(Vector2dFTest, Transpose) {
gfx::Vector2dF v(-1.5f, 2.5f);
EXPECT_EQ(gfx::Vector2dF(2.5f, -1.5f), TransposeVector2d(v));
v.Transpose();
EXPECT_EQ(gfx::Vector2dF(2.5f, -1.5f), v);
}
TEST(Vector2dFTest, ToString) {
EXPECT_EQ("[1 2]", Vector2dF(1, 2).ToString());
EXPECT_EQ("[1.03125 2.5]", Vector2dF(1.03125, 2.5).ToString());
}
} // namespace gfx