123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- // Copyright 2021 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 "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
|