xref: /aosp_15_r20/external/libchrome/ui/gfx/geometry/point_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <stddef.h>
6 
7 #include "base/macros.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/gfx/geometry/point.h"
10 #include "ui/gfx/geometry/point_conversions.h"
11 #include "ui/gfx/geometry/point_f.h"
12 
13 namespace gfx {
14 
TEST(PointTest,ToPointF)15 TEST(PointTest, ToPointF) {
16   // Check that explicit conversion from integer to float compiles.
17   Point a(10, 20);
18   PointF b = PointF(a);
19 
20   EXPECT_EQ(static_cast<float>(a.x()), b.x());
21   EXPECT_EQ(static_cast<float>(a.y()), b.y());
22 }
23 
TEST(PointTest,IsOrigin)24 TEST(PointTest, IsOrigin) {
25   EXPECT_FALSE(Point(1, 0).IsOrigin());
26   EXPECT_FALSE(Point(0, 1).IsOrigin());
27   EXPECT_FALSE(Point(1, 2).IsOrigin());
28   EXPECT_FALSE(Point(-1, 0).IsOrigin());
29   EXPECT_FALSE(Point(0, -1).IsOrigin());
30   EXPECT_FALSE(Point(-1, -2).IsOrigin());
31   EXPECT_TRUE(Point(0, 0).IsOrigin());
32 
33   EXPECT_FALSE(PointF(0.1f, 0).IsOrigin());
34   EXPECT_FALSE(PointF(0, 0.1f).IsOrigin());
35   EXPECT_FALSE(PointF(0.1f, 2).IsOrigin());
36   EXPECT_FALSE(PointF(-0.1f, 0).IsOrigin());
37   EXPECT_FALSE(PointF(0, -0.1f).IsOrigin());
38   EXPECT_FALSE(PointF(-0.1f, -2).IsOrigin());
39   EXPECT_TRUE(PointF(0, 0).IsOrigin());
40 }
41 
TEST(PointTest,VectorArithmetic)42 TEST(PointTest, VectorArithmetic) {
43   Point a(1, 5);
44   Vector2d v1(3, -3);
45   Vector2d v2(-8, 1);
46 
47   static const struct {
48     Point expected;
49     Point actual;
50   } tests[] = {
51     { Point(4, 2), a + v1 },
52     { Point(-2, 8), a - v1 },
53     { a, a - v1 + v1 },
54     { a, a + v1 - v1 },
55     { a, a + Vector2d() },
56     { Point(12, 1), a + v1 - v2 },
57     { Point(-10, 9), a - v1 + v2 }
58   };
59 
60   for (size_t i = 0; i < arraysize(tests); ++i)
61     EXPECT_EQ(tests[i].expected.ToString(), tests[i].actual.ToString());
62 }
63 
TEST(PointTest,OffsetFromPoint)64 TEST(PointTest, OffsetFromPoint) {
65   Point a(1, 5);
66   Point b(-20, 8);
67   EXPECT_EQ(Vector2d(-20 - 1, 8 - 5).ToString(), (b - a).ToString());
68 }
69 
TEST(PointTest,ToRoundedPoint)70 TEST(PointTest, ToRoundedPoint) {
71   EXPECT_EQ(Point(0, 0), ToRoundedPoint(PointF(0, 0)));
72   EXPECT_EQ(Point(0, 0), ToRoundedPoint(PointF(0.0001f, 0.0001f)));
73   EXPECT_EQ(Point(0, 0), ToRoundedPoint(PointF(0.4999f, 0.4999f)));
74   EXPECT_EQ(Point(1, 1), ToRoundedPoint(PointF(0.5f, 0.5f)));
75   EXPECT_EQ(Point(1, 1), ToRoundedPoint(PointF(0.9999f, 0.9999f)));
76 
77   EXPECT_EQ(Point(10, 10), ToRoundedPoint(PointF(10, 10)));
78   EXPECT_EQ(Point(10, 10), ToRoundedPoint(PointF(10.0001f, 10.0001f)));
79   EXPECT_EQ(Point(10, 10), ToRoundedPoint(PointF(10.4999f, 10.4999f)));
80   EXPECT_EQ(Point(11, 11), ToRoundedPoint(PointF(10.5f, 10.5f)));
81   EXPECT_EQ(Point(11, 11), ToRoundedPoint(PointF(10.9999f, 10.9999f)));
82 
83   EXPECT_EQ(Point(-10, -10), ToRoundedPoint(PointF(-10, -10)));
84   EXPECT_EQ(Point(-10, -10), ToRoundedPoint(PointF(-10.0001f, -10.0001f)));
85   EXPECT_EQ(Point(-10, -10), ToRoundedPoint(PointF(-10.4999f, -10.4999f)));
86   EXPECT_EQ(Point(-11, -11), ToRoundedPoint(PointF(-10.5f, -10.5f)));
87   EXPECT_EQ(Point(-11, -11), ToRoundedPoint(PointF(-10.9999f, -10.9999f)));
88 }
89 
TEST(PointTest,Scale)90 TEST(PointTest, Scale) {
91   EXPECT_EQ(PointF().ToString(), ScalePoint(PointF(), 2).ToString());
92   EXPECT_EQ(PointF().ToString(), ScalePoint(PointF(), 2, 2).ToString());
93 
94   EXPECT_EQ(PointF(2, -2).ToString(), ScalePoint(PointF(1, -1), 2).ToString());
95   EXPECT_EQ(PointF(2, -2).ToString(),
96             ScalePoint(PointF(1, -1), 2, 2).ToString());
97 
98   PointF zero;
99   PointF one(1, -1);
100 
101   zero.Scale(2);
102   zero.Scale(3, 1.5);
103 
104   one.Scale(2);
105   one.Scale(3, 1.5);
106 
107   EXPECT_EQ(PointF().ToString(), zero.ToString());
108   EXPECT_EQ(PointF(6, -3).ToString(), one.ToString());
109 }
110 
TEST(PointTest,ClampPoint)111 TEST(PointTest, ClampPoint) {
112   Point a;
113 
114   a = Point(3, 5);
115   EXPECT_EQ(Point(3, 5).ToString(), a.ToString());
116   a.SetToMax(Point(2, 4));
117   EXPECT_EQ(Point(3, 5).ToString(), a.ToString());
118   a.SetToMax(Point(3, 5));
119   EXPECT_EQ(Point(3, 5).ToString(), a.ToString());
120   a.SetToMax(Point(4, 2));
121   EXPECT_EQ(Point(4, 5).ToString(), a.ToString());
122   a.SetToMax(Point(8, 10));
123   EXPECT_EQ(Point(8, 10).ToString(), a.ToString());
124 
125   a.SetToMin(Point(9, 11));
126   EXPECT_EQ(Point(8, 10).ToString(), a.ToString());
127   a.SetToMin(Point(8, 10));
128   EXPECT_EQ(Point(8, 10).ToString(), a.ToString());
129   a.SetToMin(Point(11, 9));
130   EXPECT_EQ(Point(8, 9).ToString(), a.ToString());
131   a.SetToMin(Point(7, 11));
132   EXPECT_EQ(Point(7, 9).ToString(), a.ToString());
133   a.SetToMin(Point(3, 5));
134   EXPECT_EQ(Point(3, 5).ToString(), a.ToString());
135 }
136 
TEST(PointTest,ClampPointF)137 TEST(PointTest, ClampPointF) {
138   PointF a;
139 
140   a = PointF(3.5f, 5.5f);
141   EXPECT_EQ(PointF(3.5f, 5.5f).ToString(), a.ToString());
142   a.SetToMax(PointF(2.5f, 4.5f));
143   EXPECT_EQ(PointF(3.5f, 5.5f).ToString(), a.ToString());
144   a.SetToMax(PointF(3.5f, 5.5f));
145   EXPECT_EQ(PointF(3.5f, 5.5f).ToString(), a.ToString());
146   a.SetToMax(PointF(4.5f, 2.5f));
147   EXPECT_EQ(PointF(4.5f, 5.5f).ToString(), a.ToString());
148   a.SetToMax(PointF(8.5f, 10.5f));
149   EXPECT_EQ(PointF(8.5f, 10.5f).ToString(), a.ToString());
150 
151   a.SetToMin(PointF(9.5f, 11.5f));
152   EXPECT_EQ(PointF(8.5f, 10.5f).ToString(), a.ToString());
153   a.SetToMin(PointF(8.5f, 10.5f));
154   EXPECT_EQ(PointF(8.5f, 10.5f).ToString(), a.ToString());
155   a.SetToMin(PointF(11.5f, 9.5f));
156   EXPECT_EQ(PointF(8.5f, 9.5f).ToString(), a.ToString());
157   a.SetToMin(PointF(7.5f, 11.5f));
158   EXPECT_EQ(PointF(7.5f, 9.5f).ToString(), a.ToString());
159   a.SetToMin(PointF(3.5f, 5.5f));
160   EXPECT_EQ(PointF(3.5f, 5.5f).ToString(), a.ToString());
161 }
162 
TEST(PointTest,Offset)163 TEST(PointTest, Offset) {
164   Point test(3, 4);
165   test.Offset(5, -8);
166   EXPECT_EQ(test, Point(8, -4));
167 }
168 
TEST(PointTest,VectorMath)169 TEST(PointTest, VectorMath) {
170   Point test = Point(3, 4);
171   test += Vector2d(5, -8);
172   EXPECT_EQ(test, Point(8, -4));
173 
174   Point test2 = Point(3, 4);
175   test2 -= Vector2d(5, -8);
176   EXPECT_EQ(test2, Point(-2, 12));
177 }
178 
TEST(PointTest,IntegerOverflow)179 TEST(PointTest, IntegerOverflow) {
180   int int_max = std::numeric_limits<int>::max();
181   int int_min = std::numeric_limits<int>::min();
182 
183   Point max_point(int_max, int_max);
184   Point min_point(int_min, int_min);
185   Point test;
186 
187   test = Point();
188   test.Offset(int_max, int_max);
189   EXPECT_EQ(test, max_point);
190 
191   test = Point();
192   test.Offset(int_min, int_min);
193   EXPECT_EQ(test, min_point);
194 
195   test = Point(10, 20);
196   test.Offset(int_max, int_max);
197   EXPECT_EQ(test, max_point);
198 
199   test = Point(-10, -20);
200   test.Offset(int_min, int_min);
201   EXPECT_EQ(test, min_point);
202 
203   test = Point();
204   test += Vector2d(int_max, int_max);
205   EXPECT_EQ(test, max_point);
206 
207   test = Point();
208   test += Vector2d(int_min, int_min);
209   EXPECT_EQ(test, min_point);
210 
211   test = Point(10, 20);
212   test += Vector2d(int_max, int_max);
213   EXPECT_EQ(test, max_point);
214 
215   test = Point(-10, -20);
216   test += Vector2d(int_min, int_min);
217   EXPECT_EQ(test, min_point);
218 
219   test = Point();
220   test -= Vector2d(int_max, int_max);
221   EXPECT_EQ(test, Point(-int_max, -int_max));
222 
223   test = Point();
224   test -= Vector2d(int_min, int_min);
225   EXPECT_EQ(test, max_point);
226 
227   test = Point(10, 20);
228   test -= Vector2d(int_min, int_min);
229   EXPECT_EQ(test, max_point);
230 
231   test = Point(-10, -20);
232   test -= Vector2d(int_max, int_max);
233   EXPECT_EQ(test, min_point);
234 }
235 
236 }  // namespace gfx
237