5 #include "gtest/gtest.h"
14 TEST(RoundRectTest, EmptyDeclaration) {
17 EXPECT_TRUE(round_rect.
IsEmpty());
18 EXPECT_FALSE(round_rect.
IsRect());
19 EXPECT_FALSE(round_rect.
IsOval());
41 TEST(RoundRectTest, DefaultConstructor) {
44 EXPECT_TRUE(round_rect.
IsEmpty());
45 EXPECT_FALSE(round_rect.
IsRect());
46 EXPECT_FALSE(round_rect.
IsOval());
56 TEST(RoundRectTest, EmptyRectConstruction) {
60 EXPECT_TRUE(round_rect.
IsEmpty());
61 EXPECT_FALSE(round_rect.
IsRect());
62 EXPECT_FALSE(round_rect.
IsOval());
72 TEST(RoundRectTest, RectConstructor) {
76 EXPECT_FALSE(round_rect.
IsEmpty());
77 EXPECT_TRUE(round_rect.
IsRect());
78 EXPECT_FALSE(round_rect.
IsOval());
88 TEST(RoundRectTest, InvertedRectConstruction) {
92 EXPECT_FALSE(round_rect.
IsEmpty());
93 EXPECT_TRUE(round_rect.
IsRect());
94 EXPECT_FALSE(round_rect.
IsOval());
104 TEST(RoundRectTest, EmptyOvalConstruction) {
108 EXPECT_TRUE(round_rect.
IsEmpty());
109 EXPECT_FALSE(round_rect.
IsRect());
110 EXPECT_FALSE(round_rect.
IsOval());
120 TEST(RoundRectTest, OvalConstructor) {
124 EXPECT_FALSE(round_rect.
IsEmpty());
125 EXPECT_FALSE(round_rect.
IsRect());
126 EXPECT_TRUE(round_rect.
IsOval());
136 TEST(RoundRectTest, InvertedOvalConstruction) {
140 EXPECT_FALSE(round_rect.
IsEmpty());
141 EXPECT_FALSE(round_rect.
IsRect());
142 EXPECT_TRUE(round_rect.
IsOval());
152 TEST(RoundRectTest, RectRadiusConstructor) {
156 EXPECT_FALSE(round_rect.
IsEmpty());
157 EXPECT_FALSE(round_rect.
IsRect());
158 EXPECT_FALSE(round_rect.
IsOval());
168 TEST(RoundRectTest, RectXYConstructor) {
172 EXPECT_FALSE(round_rect.
IsEmpty());
173 EXPECT_FALSE(round_rect.
IsRect());
174 EXPECT_FALSE(round_rect.
IsOval());
184 TEST(RoundRectTest, RectSizeConstructor) {
188 EXPECT_FALSE(round_rect.
IsEmpty());
189 EXPECT_FALSE(round_rect.
IsRect());
190 EXPECT_FALSE(round_rect.
IsOval());
200 TEST(RoundRectTest, RectRadiiConstructor) {
204 .top_left =
Size(1.0, 1.5),
205 .top_right =
Size(2.0, 2.5f),
206 .bottom_left =
Size(3.0, 3.5f),
207 .bottom_right =
Size(4.0, 4.5f),
210 EXPECT_FALSE(round_rect.
IsEmpty());
211 EXPECT_FALSE(round_rect.
IsRect());
212 EXPECT_FALSE(round_rect.
IsOval());
222 TEST(RoundRectTest, RectRadiiOverflowWidthConstructor) {
226 .top_left =
Size(1.0f, 2.0f),
227 .top_right =
Size(3.0f, 4.0f),
228 .bottom_left =
Size(5.0f, 6.0f),
229 .bottom_right =
Size(7.0f, 8.0f),
235 EXPECT_FALSE(round_rect.
IsEmpty());
236 EXPECT_FALSE(round_rect.
IsRect());
237 EXPECT_FALSE(round_rect.
IsOval());
247 TEST(RoundRectTest, RectRadiiOverflowHeightConstructor) {
251 .top_left =
Size(1.0f, 2.0f),
252 .top_right =
Size(3.0f, 4.0f),
253 .bottom_left =
Size(5.0f, 6.0f),
254 .bottom_right =
Size(7.0f, 8.0f),
260 EXPECT_FALSE(round_rect.
IsEmpty());
261 EXPECT_FALSE(round_rect.
IsRect());
262 EXPECT_FALSE(round_rect.
IsOval());
276 .top_left =
Size(1.0f, 2.0f),
277 .top_right =
Size(3.0f, 4.0f),
278 .bottom_left =
Size(5.0f, 6.0f),
279 .bottom_right =
Size(7.0f, 8.0f),
283 EXPECT_FALSE(shifted.IsEmpty());
284 EXPECT_FALSE(shifted.IsRect());
285 EXPECT_FALSE(shifted.IsOval());
286 EXPECT_TRUE(shifted.IsFinite());
287 EXPECT_FALSE(shifted.GetBounds().IsEmpty());
288 EXPECT_EQ(shifted.GetBounds(),
Rect::MakeLTRB(15.0f, 16.0f, 45.0f, 46.0f));
289 EXPECT_EQ(shifted.GetRadii().top_left,
Size(1.0f, 2.0f));
290 EXPECT_EQ(shifted.GetRadii().top_right,
Size(3.0f, 4.0f));
291 EXPECT_EQ(shifted.GetRadii().bottom_left,
Size(5.0f, 6.0f));
292 EXPECT_EQ(shifted.GetRadii().bottom_right,
Size(7.0f, 8.0f));
297 .top_left =
Size(1.0f, 2.0f),
298 .top_right =
Size(3.0f, 4.0f),
299 .bottom_left =
Size(5.0f, 6.0f),
300 .bottom_right =
Size(7.0f, 8.0f),
304 TEST(RoundRectTest, ExpandScalar) {
308 .top_left =
Size(1.0f, 2.0f),
309 .top_right =
Size(3.0f, 4.0f),
310 .bottom_left =
Size(5.0f, 6.0f),
311 .bottom_right =
Size(7.0f, 8.0f),
315 EXPECT_FALSE(expanded.IsEmpty());
316 EXPECT_FALSE(expanded.IsRect());
317 EXPECT_FALSE(expanded.IsOval());
318 EXPECT_TRUE(expanded.IsFinite());
319 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
320 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 5.0f, 45.0f, 45.0f));
321 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
322 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
323 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
324 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
329 .top_left =
Size(1.0f, 2.0f),
330 .top_right =
Size(3.0f, 4.0f),
331 .bottom_left =
Size(5.0f, 6.0f),
332 .bottom_right =
Size(7.0f, 8.0f),
336 TEST(RoundRectTest, ExpandTwoScalars) {
340 .top_left =
Size(1.0f, 2.0f),
341 .top_right =
Size(3.0f, 4.0f),
342 .bottom_left =
Size(5.0f, 6.0f),
343 .bottom_right =
Size(7.0f, 8.0f),
347 EXPECT_FALSE(expanded.IsEmpty());
348 EXPECT_FALSE(expanded.IsRect());
349 EXPECT_FALSE(expanded.IsOval());
350 EXPECT_TRUE(expanded.IsFinite());
351 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
352 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 45.0f, 46.0f));
353 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
354 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
355 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
356 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
361 .top_left =
Size(1.0f, 2.0f),
362 .top_right =
Size(3.0f, 4.0f),
363 .bottom_left =
Size(5.0f, 6.0f),
364 .bottom_right =
Size(7.0f, 8.0f),
368 TEST(RoundRectTest, ExpandFourScalars) {
372 .top_left =
Size(1.0f, 2.0f),
373 .top_right =
Size(3.0f, 4.0f),
374 .bottom_left =
Size(5.0f, 6.0f),
375 .bottom_right =
Size(7.0f, 8.0f),
379 EXPECT_FALSE(expanded.IsEmpty());
380 EXPECT_FALSE(expanded.IsRect());
381 EXPECT_FALSE(expanded.IsOval());
382 EXPECT_TRUE(expanded.IsFinite());
383 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
384 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 47.0f, 48.0f));
385 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
386 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
387 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
388 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
393 .top_left =
Size(1.0f, 2.0f),
394 .top_right =
Size(3.0f, 4.0f),
395 .bottom_left =
Size(5.0f, 6.0f),
396 .bottom_right =
Size(7.0f, 8.0f),
400 TEST(RoundRectTest, ContractScalar) {
404 .top_left =
Size(1.0f, 2.0f),
405 .top_right =
Size(3.0f, 4.0f),
406 .bottom_left =
Size(5.0f, 6.0f),
407 .bottom_right =
Size(7.0f, 8.0f),
411 EXPECT_FALSE(expanded.IsEmpty());
412 EXPECT_FALSE(expanded.IsRect());
413 EXPECT_FALSE(expanded.IsOval());
414 EXPECT_TRUE(expanded.IsFinite());
415 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
416 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(12.0f, 12.0f, 38.0f, 38.0f));
417 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
418 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
419 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
420 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
425 .top_left =
Size(1.0f, 2.0f),
426 .top_right =
Size(3.0f, 4.0f),
427 .bottom_left =
Size(5.0f, 6.0f),
428 .bottom_right =
Size(7.0f, 8.0f),
432 TEST(RoundRectTest, ContractTwoScalars) {
436 .top_left =
Size(1.0f, 2.0f),
437 .top_right =
Size(3.0f, 4.0f),
438 .bottom_left =
Size(5.0f, 6.0f),
439 .bottom_right =
Size(7.0f, 8.0f),
443 EXPECT_FALSE(expanded.IsEmpty());
444 EXPECT_FALSE(expanded.IsRect());
445 EXPECT_FALSE(expanded.IsOval());
446 EXPECT_TRUE(expanded.IsFinite());
447 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
448 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 12.0f, 39.0f, 38.0f));
449 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
450 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
451 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
452 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
457 .top_left =
Size(1.0f, 2.0f),
458 .top_right =
Size(3.0f, 4.0f),
459 .bottom_left =
Size(5.0f, 6.0f),
460 .bottom_right =
Size(7.0f, 8.0f),
464 TEST(RoundRectTest, ContractFourScalars) {
468 .top_left =
Size(1.0f, 2.0f),
469 .top_right =
Size(3.0f, 4.0f),
470 .bottom_left =
Size(5.0f, 6.0f),
471 .bottom_right =
Size(7.0f, 8.0f),
475 EXPECT_FALSE(expanded.IsEmpty());
476 EXPECT_FALSE(expanded.IsRect());
477 EXPECT_FALSE(expanded.IsOval());
478 EXPECT_TRUE(expanded.IsFinite());
479 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
480 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 11.5f, 38.0f, 37.5f));
481 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
482 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
483 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
484 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
489 .top_left =
Size(1.0f, 2.0f),
490 .top_right =
Size(3.0f, 4.0f),
491 .bottom_left =
Size(5.0f, 6.0f),
492 .bottom_right =
Size(7.0f, 8.0f),
496 TEST(RoundRectTest, ContractAndRequireRadiiAdjustment) {
500 .top_left =
Size(1.0f, 2.0f),
501 .top_right =
Size(3.0f, 4.0f),
502 .bottom_left =
Size(5.0f, 6.0f),
503 .bottom_right =
Size(7.0f, 8.0f),
511 EXPECT_FALSE(expanded.IsEmpty());
512 EXPECT_FALSE(expanded.IsRect());
513 EXPECT_FALSE(expanded.IsOval());
514 EXPECT_TRUE(expanded.IsFinite());
515 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
516 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(22.0f, 22.0f, 28.0f, 28.0f));
517 EXPECT_EQ(expanded.GetRadii().top_left,
Size(0.5f, 1.0f));
518 EXPECT_EQ(expanded.GetRadii().top_right,
Size(1.5f, 2.0f));
519 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(2.5f, 3.0f));
520 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(3.5f, 4.0f));
527 .top_left =
Size(1.0f, 2.0f),
528 .top_right =
Size(3.0f, 4.0f),
529 .bottom_left =
Size(5.0f, 6.0f),
530 .bottom_right =
Size(7.0f, 8.0f),
539 .top_left =
Size(0.5f, 1.0f),
540 .top_right =
Size(1.5f, 2.0f),
541 .bottom_left =
Size(2.5f, 3.0f),
542 .bottom_right =
Size(3.5f, 4.0f),
546 TEST(RoundRectTest, NoCornerRoundRectContains) {
551 EXPECT_TRUE(no_corners.Contains({-50, -50}));
554 EXPECT_TRUE(no_corners.Contains({-50, 49.99}));
555 EXPECT_TRUE(no_corners.Contains({49.99, -50}));
556 EXPECT_TRUE(no_corners.Contains({49.99, 49.99}));
557 EXPECT_FALSE(no_corners.Contains({-50.01, -50}));
558 EXPECT_FALSE(no_corners.Contains({-50, -50.01}));
559 EXPECT_FALSE(no_corners.Contains({-50.01, 50}));
560 EXPECT_FALSE(no_corners.Contains({-50, 50.01}));
561 EXPECT_FALSE(no_corners.Contains({50.01, -50}));
562 EXPECT_FALSE(no_corners.Contains({50, -50.01}));
563 EXPECT_FALSE(no_corners.Contains({50.01, 50}));
564 EXPECT_FALSE(no_corners.Contains({50, 50.01}));
567 TEST(RoundRectTest, TinyCornerRoundRectContains) {
572 EXPECT_FALSE(tiny_corners.Contains({-50, -50}));
573 EXPECT_FALSE(tiny_corners.Contains({-50, 50}));
574 EXPECT_FALSE(tiny_corners.Contains({50, -50}));
575 EXPECT_FALSE(tiny_corners.Contains({50, 50}));
578 TEST(RoundRectTest, UniformCircularRoundRectContains) {
584 EXPECT_TRUE(expanded_2_r_2.Contains({-50, -50}));
585 EXPECT_TRUE(expanded_2_r_2.Contains({-50, 50}));
586 EXPECT_TRUE(expanded_2_r_2.Contains({50, -50}));
587 EXPECT_TRUE(expanded_2_r_2.Contains({50, 50}));
600 EXPECT_TRUE(expanded_2_r_2.Contains({-coord_in, -coord_in}));
601 EXPECT_FALSE(expanded_2_r_2.Contains({-coord_out, -coord_out}));
603 EXPECT_TRUE(expanded_2_r_2.Contains({coord_in, -coord_in}));
604 EXPECT_FALSE(expanded_2_r_2.Contains({coord_out, -coord_out}));
606 EXPECT_TRUE(expanded_2_r_2.Contains({-coord_in, coord_in}));
607 EXPECT_FALSE(expanded_2_r_2.Contains({-coord_out, coord_out}));
609 EXPECT_TRUE(expanded_2_r_2.Contains({coord_in, coord_in}));
610 EXPECT_FALSE(expanded_2_r_2.Contains({coord_out, coord_out}));
613 TEST(RoundRectTest, UniformEllipticalRoundRectContains) {
619 EXPECT_TRUE(expanded_2_r_2.Contains({-50, -50}));
620 EXPECT_TRUE(expanded_2_r_2.Contains({-50, 50}));
621 EXPECT_TRUE(expanded_2_r_2.Contains({50, -50}));
622 EXPECT_TRUE(expanded_2_r_2.Contains({50, 50}));
639 EXPECT_TRUE(expanded_2_r_2.Contains({-x_coord_in, -y_coord_in}));
640 EXPECT_FALSE(expanded_2_r_2.Contains({-x_coord_out, -y_coord_out}));
642 EXPECT_TRUE(expanded_2_r_2.Contains({x_coord_in, -y_coord_in}));
643 EXPECT_FALSE(expanded_2_r_2.Contains({x_coord_out, -y_coord_out}));
645 EXPECT_TRUE(expanded_2_r_2.Contains({-x_coord_in, y_coord_in}));
646 EXPECT_FALSE(expanded_2_r_2.Contains({-x_coord_out, y_coord_out}));
648 EXPECT_TRUE(expanded_2_r_2.Contains({x_coord_in, y_coord_in}));
649 EXPECT_FALSE(expanded_2_r_2.Contains({x_coord_out, y_coord_out}));
652 TEST(RoundRectTest, DifferingCornersRoundRectContains) {
656 .top_left =
Size(2.0, 3.0),
657 .top_right =
Size(4.0, 5.0),
658 .bottom_left =
Size(6.0, 7.0),
659 .bottom_right =
Size(8.0, 9.0),
670 auto coord = [](
Scalar radius) {
673 auto coord_in = [&coord](
Scalar radius) {
676 auto coord_out = [&coord](
Scalar radius) {
682 EXPECT_TRUE(round_rect.Contains({-coord_in(2.0), -coord_in(3.0)}));
683 EXPECT_FALSE(round_rect.Contains({-coord_out(2.0), -coord_out(3.0)}));
685 EXPECT_TRUE(round_rect.Contains({coord_in(4.0), -coord_in(5.0)}));
686 EXPECT_FALSE(round_rect.Contains({coord_out(4.0), -coord_out(5.0)}));
688 EXPECT_TRUE(round_rect.Contains({-coord_in(6.0), coord_in(7.0)}));
689 EXPECT_FALSE(round_rect.Contains({-coord_out(6.0), coord_out(7.0)}));
691 EXPECT_TRUE(round_rect.Contains({coord_in(8.0), coord_in(9.0)}));
692 EXPECT_FALSE(round_rect.Contains({coord_out(8.0), coord_out(9.0)}));
TEST(AllocationSizeTest, CanCreateTypedAllocations)
constexpr float kEhCloseEnough
constexpr bool IsFinite() const
static RoundRect MakeRectRadius(const Rect &rect, Scalar radius)
constexpr const RoundingRadii & GetRadii() const
static RoundRect MakeRectRadii(const Rect &rect, const RoundingRadii &radii)
constexpr bool IsEmpty() const
static RoundRect MakeOval(const Rect &rect)
static RoundRect MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
constexpr bool IsRect() const
RoundRect Expand(Scalar left, Scalar top, Scalar right, Scalar bottom) const
Returns a round rectangle with expanded edges. Negative expansion results in shrinking.
constexpr const Rect & GetBounds() const
constexpr bool IsOval() const
static RoundRect MakeRect(const Rect &rect)
RoundRect Shift(Scalar dx, Scalar dy) const
Returns a new round rectangle translated by the given offset.
constexpr TRect< T > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.
constexpr auto GetBottom() const
constexpr auto GetTop() const
constexpr bool IsEmpty() const
Returns true if either of the width or height are 0, negative, or NaN.
constexpr auto GetLeft() const
constexpr auto GetRight() const
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)