5 #include "gtest/gtest.h"
11 #define CHECK_POINT_WITH_OFFSET(rr, p, outward_offset) \
12 EXPECT_TRUE(rr.Contains(p)); \
13 EXPECT_FALSE(rr.Contains(p + outward_offset));
18 TEST(RoundSuperellipseTest, EmptyDeclaration) {
22 EXPECT_FALSE(rse.
IsRect());
23 EXPECT_FALSE(rse.
IsOval());
45 TEST(RoundSuperellipseTest, DefaultConstructor) {
49 EXPECT_FALSE(rse.
IsRect());
50 EXPECT_FALSE(rse.
IsOval());
60 TEST(RoundSuperellipseTest, EmptyRectConstruction) {
65 EXPECT_FALSE(rse.
IsRect());
66 EXPECT_FALSE(rse.
IsOval());
76 TEST(RoundSuperellipseTest, RectConstructor) {
82 EXPECT_FALSE(rse.
IsOval());
92 TEST(RoundSuperellipseTest, InvertedRectConstruction) {
98 EXPECT_FALSE(rse.
IsOval());
108 TEST(RoundSuperellipseTest, EmptyOvalConstruction) {
113 EXPECT_FALSE(rse.
IsRect());
114 EXPECT_FALSE(rse.
IsOval());
124 TEST(RoundSuperellipseTest, OvalConstructor) {
129 EXPECT_FALSE(rse.
IsRect());
130 EXPECT_TRUE(rse.
IsOval());
140 TEST(RoundSuperellipseTest, InvertedOvalConstruction) {
145 EXPECT_FALSE(rse.
IsRect());
146 EXPECT_TRUE(rse.
IsOval());
156 TEST(RoundSuperellipseTest, RectRadiusConstructor) {
161 EXPECT_FALSE(rse.
IsRect());
162 EXPECT_FALSE(rse.
IsOval());
172 TEST(RoundSuperellipseTest, RectXYConstructor) {
177 EXPECT_FALSE(rse.
IsRect());
178 EXPECT_FALSE(rse.
IsOval());
188 TEST(RoundSuperellipseTest, RectSizeConstructor) {
193 EXPECT_FALSE(rse.
IsRect());
194 EXPECT_FALSE(rse.
IsOval());
204 TEST(RoundSuperellipseTest, RectRadiiConstructor) {
208 .top_left =
Size(1.0, 1.5),
209 .top_right =
Size(2.0, 2.5f),
210 .bottom_left =
Size(3.0, 3.5f),
211 .bottom_right =
Size(4.0, 4.5f),
215 EXPECT_FALSE(rse.
IsRect());
216 EXPECT_FALSE(rse.
IsOval());
226 TEST(RoundSuperellipseTest, RectRadiiOverflowWidthConstructor) {
230 .top_left =
Size(1.0f, 2.0f),
231 .top_right =
Size(3.0f, 4.0f),
232 .bottom_left =
Size(5.0f, 6.0f),
233 .bottom_right =
Size(7.0f, 8.0f),
240 EXPECT_FALSE(rse.
IsRect());
241 EXPECT_FALSE(rse.
IsOval());
251 TEST(RoundSuperellipseTest, RectRadiiOverflowHeightConstructor) {
255 .top_left =
Size(1.0f, 2.0f),
256 .top_right =
Size(3.0f, 4.0f),
257 .bottom_left =
Size(5.0f, 6.0f),
258 .bottom_right =
Size(7.0f, 8.0f),
265 EXPECT_FALSE(rse.
IsRect());
266 EXPECT_FALSE(rse.
IsOval());
276 TEST(RoundSuperellipseTest, Shift) {
280 .top_left =
Size(1.0f, 2.0f),
281 .top_right =
Size(3.0f, 4.0f),
282 .bottom_left =
Size(5.0f, 6.0f),
283 .bottom_right =
Size(7.0f, 8.0f),
287 EXPECT_FALSE(shifted.IsEmpty());
288 EXPECT_FALSE(shifted.IsRect());
289 EXPECT_FALSE(shifted.IsOval());
290 EXPECT_TRUE(shifted.IsFinite());
291 EXPECT_FALSE(shifted.GetBounds().IsEmpty());
292 EXPECT_EQ(shifted.GetBounds(),
Rect::MakeLTRB(15.0f, 16.0f, 45.0f, 46.0f));
293 EXPECT_EQ(shifted.GetRadii().top_left,
Size(1.0f, 2.0f));
294 EXPECT_EQ(shifted.GetRadii().top_right,
Size(3.0f, 4.0f));
295 EXPECT_EQ(shifted.GetRadii().bottom_left,
Size(5.0f, 6.0f));
296 EXPECT_EQ(shifted.GetRadii().bottom_right,
Size(7.0f, 8.0f));
301 .top_left =
Size(1.0f, 2.0f),
302 .top_right =
Size(3.0f, 4.0f),
303 .bottom_left =
Size(5.0f, 6.0f),
304 .bottom_right =
Size(7.0f, 8.0f),
308 TEST(RoundSuperellipseTest, ExpandScalar) {
312 .top_left =
Size(1.0f, 2.0f),
313 .top_right =
Size(3.0f, 4.0f),
314 .bottom_left =
Size(5.0f, 6.0f),
315 .bottom_right =
Size(7.0f, 8.0f),
319 EXPECT_FALSE(expanded.IsEmpty());
320 EXPECT_FALSE(expanded.IsRect());
321 EXPECT_FALSE(expanded.IsOval());
322 EXPECT_TRUE(expanded.IsFinite());
323 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
324 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 5.0f, 45.0f, 45.0f));
325 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
326 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
327 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
328 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
333 .top_left =
Size(1.0f, 2.0f),
334 .top_right =
Size(3.0f, 4.0f),
335 .bottom_left =
Size(5.0f, 6.0f),
336 .bottom_right =
Size(7.0f, 8.0f),
340 TEST(RoundSuperellipseTest, ExpandTwoScalars) {
344 .top_left =
Size(1.0f, 2.0f),
345 .top_right =
Size(3.0f, 4.0f),
346 .bottom_left =
Size(5.0f, 6.0f),
347 .bottom_right =
Size(7.0f, 8.0f),
351 EXPECT_FALSE(expanded.IsEmpty());
352 EXPECT_FALSE(expanded.IsRect());
353 EXPECT_FALSE(expanded.IsOval());
354 EXPECT_TRUE(expanded.IsFinite());
355 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
356 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 45.0f, 46.0f));
357 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
358 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
359 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
360 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
365 .top_left =
Size(1.0f, 2.0f),
366 .top_right =
Size(3.0f, 4.0f),
367 .bottom_left =
Size(5.0f, 6.0f),
368 .bottom_right =
Size(7.0f, 8.0f),
372 TEST(RoundSuperellipseTest, ExpandFourScalars) {
376 .top_left =
Size(1.0f, 2.0f),
377 .top_right =
Size(3.0f, 4.0f),
378 .bottom_left =
Size(5.0f, 6.0f),
379 .bottom_right =
Size(7.0f, 8.0f),
383 EXPECT_FALSE(expanded.IsEmpty());
384 EXPECT_FALSE(expanded.IsRect());
385 EXPECT_FALSE(expanded.IsOval());
386 EXPECT_TRUE(expanded.IsFinite());
387 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
388 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 47.0f, 48.0f));
389 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
390 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
391 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
392 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
397 .top_left =
Size(1.0f, 2.0f),
398 .top_right =
Size(3.0f, 4.0f),
399 .bottom_left =
Size(5.0f, 6.0f),
400 .bottom_right =
Size(7.0f, 8.0f),
404 TEST(RoundSuperellipseTest, ContractScalar) {
408 .top_left =
Size(1.0f, 2.0f),
409 .top_right =
Size(3.0f, 4.0f),
410 .bottom_left =
Size(5.0f, 6.0f),
411 .bottom_right =
Size(7.0f, 8.0f),
415 EXPECT_FALSE(expanded.IsEmpty());
416 EXPECT_FALSE(expanded.IsRect());
417 EXPECT_FALSE(expanded.IsOval());
418 EXPECT_TRUE(expanded.IsFinite());
419 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
420 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(12.0f, 12.0f, 38.0f, 38.0f));
421 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
422 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
423 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
424 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
429 .top_left =
Size(1.0f, 2.0f),
430 .top_right =
Size(3.0f, 4.0f),
431 .bottom_left =
Size(5.0f, 6.0f),
432 .bottom_right =
Size(7.0f, 8.0f),
436 TEST(RoundSuperellipseTest, ContractTwoScalars) {
440 .top_left =
Size(1.0f, 2.0f),
441 .top_right =
Size(3.0f, 4.0f),
442 .bottom_left =
Size(5.0f, 6.0f),
443 .bottom_right =
Size(7.0f, 8.0f),
447 EXPECT_FALSE(expanded.IsEmpty());
448 EXPECT_FALSE(expanded.IsRect());
449 EXPECT_FALSE(expanded.IsOval());
450 EXPECT_TRUE(expanded.IsFinite());
451 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
452 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 12.0f, 39.0f, 38.0f));
453 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
454 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
455 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
456 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
461 .top_left =
Size(1.0f, 2.0f),
462 .top_right =
Size(3.0f, 4.0f),
463 .bottom_left =
Size(5.0f, 6.0f),
464 .bottom_right =
Size(7.0f, 8.0f),
468 TEST(RoundSuperellipseTest, ContractFourScalars) {
472 .top_left =
Size(1.0f, 2.0f),
473 .top_right =
Size(3.0f, 4.0f),
474 .bottom_left =
Size(5.0f, 6.0f),
475 .bottom_right =
Size(7.0f, 8.0f),
479 EXPECT_FALSE(expanded.IsEmpty());
480 EXPECT_FALSE(expanded.IsRect());
481 EXPECT_FALSE(expanded.IsOval());
482 EXPECT_TRUE(expanded.IsFinite());
483 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
484 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 11.5f, 38.0f, 37.5f));
485 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
486 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
487 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
488 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
493 .top_left =
Size(1.0f, 2.0f),
494 .top_right =
Size(3.0f, 4.0f),
495 .bottom_left =
Size(5.0f, 6.0f),
496 .bottom_right =
Size(7.0f, 8.0f),
500 TEST(RoundSuperellipseTest, ContractAndRequireRadiiAdjustment) {
504 .top_left =
Size(1.0f, 2.0f),
505 .top_right =
Size(3.0f, 4.0f),
506 .bottom_left =
Size(5.0f, 6.0f),
507 .bottom_right =
Size(7.0f, 8.0f),
515 EXPECT_FALSE(expanded.IsEmpty());
516 EXPECT_FALSE(expanded.IsRect());
517 EXPECT_FALSE(expanded.IsOval());
518 EXPECT_TRUE(expanded.IsFinite());
519 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
520 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(22.0f, 22.0f, 28.0f, 28.0f));
521 EXPECT_EQ(expanded.GetRadii().top_left,
Size(0.5f, 1.0f));
522 EXPECT_EQ(expanded.GetRadii().top_right,
Size(1.5f, 2.0f));
523 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(2.5f, 3.0f));
524 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(3.5f, 4.0f));
531 .top_left =
Size(1.0f, 2.0f),
532 .top_right =
Size(3.0f, 4.0f),
533 .bottom_left =
Size(5.0f, 6.0f),
534 .bottom_right =
Size(7.0f, 8.0f),
543 .top_left =
Size(0.5f, 1.0f),
544 .top_right =
Size(1.5f, 2.0f),
545 .bottom_left =
Size(2.5f, 3.0f),
546 .bottom_right =
Size(3.5f, 4.0f),
550 TEST(RoundSuperellipseTest, NoCornerRoundSuperellipseContains) {
557 EXPECT_TRUE(no_corners.Contains({-50, -50}));
560 EXPECT_TRUE(no_corners.Contains({-50, 49.99}));
561 EXPECT_TRUE(no_corners.Contains({49.99, -50}));
562 EXPECT_TRUE(no_corners.Contains({49.99, 49.99}));
563 EXPECT_FALSE(no_corners.Contains({-50.01, -50}));
564 EXPECT_FALSE(no_corners.Contains({-50, -50.01}));
565 EXPECT_FALSE(no_corners.Contains({-50.01, 50}));
566 EXPECT_FALSE(no_corners.Contains({-50, 50.01}));
567 EXPECT_FALSE(no_corners.Contains({50.01, -50}));
568 EXPECT_FALSE(no_corners.Contains({50, -50.01}));
569 EXPECT_FALSE(no_corners.Contains({50.01, 50}));
570 EXPECT_FALSE(no_corners.Contains({50, 50.01}));
573 TEST(RoundSuperellipseTest, TinyCornerContains) {
580 EXPECT_FALSE(tiny_corners.Contains({-50, -50}));
581 EXPECT_FALSE(tiny_corners.Contains({-50, 50}));
582 EXPECT_FALSE(tiny_corners.Contains({50, -50}));
583 EXPECT_FALSE(tiny_corners.Contains({50, 50}));
586 TEST(RoundSuperellipseTest, UniformSquareContains) {
591 #define CHECK_POINT_AND_MIRRORS(p) \
592 CHECK_POINT_WITH_OFFSET(rr, (p), Point(0.02, 0.02)); \
593 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(1, -1), Point(0.02, -0.02)); \
594 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, 1), Point(-0.02, 0.02)); \
595 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, -1), Point(-0.02, -0.02));
604 #undef CHECK_POINT_AND_MIRRORS
607 TEST(RoundSuperellipseTest, UniformEllipticalContains) {
612 #define CHECK_POINT_AND_MIRRORS(p) \
613 CHECK_POINT_WITH_OFFSET(rr, (p), Point(0.02, 0.02)); \
614 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(1, -1), Point(0.02, -0.02)); \
615 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, 1), Point(-0.02, 0.02)); \
616 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, -1), Point(-0.02, -0.02));
625 #undef CHECK_POINT_AND_MIRRORS
628 TEST(RoundSuperellipseTest, UniformRectangularContains) {
635 #define CHECK_POINT_AND_MIRRORS(p) \
636 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(1, 1) + center, \
637 Point(0.02, 0.02)); \
638 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(1, -1) + center, \
639 Point(0.02, -0.02)); \
640 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(-1, 1) + center, \
641 Point(-0.02, 0.02)); \
642 CHECK_POINT_WITH_OFFSET(rr, (p - center) * Point(-1, -1) + center, \
643 Point(-0.02, -0.02));
655 #undef CHECK_POINT_AND_MIRRORS
658 TEST(RoundSuperellipseTest, SlimDiagnalContains) {
664 .top_left =
Size(1.0, 1.0),
665 .top_right =
Size(99.0, 99.0),
666 .bottom_left =
Size(99.0, 99.0),
667 .bottom_right =
Size(1.0, 1.0),
670 EXPECT_TRUE(rr.Contains(
Point{0, 0}));
671 EXPECT_FALSE(rr.Contains(
Point{-49.999, -49.999}));
672 EXPECT_FALSE(rr.Contains(
Point{-49.999, 49.999}));
673 EXPECT_FALSE(rr.Contains(
Point{49.999, 49.999}));
674 EXPECT_FALSE(rr.Contains(
Point{49.999, -49.999}));
681 #define CHECK_DIAGNAL_POINTS(p) \
682 CHECK_POINT_WITH_OFFSET(rr, (p), Point(0.02, -0.02)); \
683 CHECK_POINT_WITH_OFFSET(rr, (p) * Point(-1, -1), Point(-0.02, 0.02));
692 #undef CHECK_POINT_AND_MIRRORS
TEST(AllocationSizeTest, CanCreateTypedAllocations)
#define CHECK_DIAGNAL_POINTS(p)
#define CHECK_POINT_WITH_OFFSET(rr, p, outward_offset)
#define CHECK_POINT_AND_MIRRORS(p)
constexpr RoundSuperellipse Expand(Scalar left, Scalar top, Scalar right, Scalar bottom) const
Returns a round rectangle with expanded edges. Negative expansion results in shrinking.
constexpr static RoundSuperellipse MakeOval(const Rect &rect)
constexpr const RoundingRadii & GetRadii() const
static RoundSuperellipse MakeRectRadii(const Rect &rect, const RoundingRadii &radii)
constexpr bool IsOval() const
constexpr static RoundSuperellipse MakeRect(const Rect &rect)
constexpr bool IsFinite() const
constexpr bool IsEmpty() const
constexpr bool IsRect() const
constexpr RoundSuperellipse Shift(Scalar dx, Scalar dy) const
Returns a new round rectangle translated by the given offset.
constexpr static RoundSuperellipse MakeRectRadius(const Rect &rect, Scalar radius)
constexpr const Rect & GetBounds() const
constexpr static RoundSuperellipse MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
constexpr static RoundingRadii MakeRadii(Size radii)
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 Point GetCenter() const
Get the center point as a |Point|.
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)