diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-12-14 20:20:17 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-12-14 20:20:17 +0800 |
| commit | abc02cfae45c86519a795da6d14d8c85d57ae6f5 (patch) | |
| tree | 5552ada0bb3e4b2931d3b978f813b7c4a1bfa029 | |
| parent | c0c0106cf47fdff397756913b8646541f3bb9928 (diff) | |
| download | cru-abc02cfae45c86519a795da6d14d8c85d57ae6f5.tar.gz cru-abc02cfae45c86519a795da6d14d8c85d57ae6f5.tar.bz2 cru-abc02cfae45c86519a795da6d14d8c85d57ae6f5.zip | |
Add some rect unit tests.
| -rw-r--r-- | include/cru/platform/GraphicsBase.h | 18 | ||||
| -rw-r--r-- | src/ui/render/BorderRenderObject.cpp | 6 | ||||
| -rw-r--r-- | test/platform/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | test/platform/GraphicsBaseTest.cpp | 48 |
4 files changed, 64 insertions, 9 deletions
diff --git a/include/cru/platform/GraphicsBase.h b/include/cru/platform/GraphicsBase.h index 14c5d926..78a1c1a6 100644 --- a/include/cru/platform/GraphicsBase.h +++ b/include/cru/platform/GraphicsBase.h @@ -113,10 +113,6 @@ struct Thickness final { void SetAll(const float value) { left = top = right = bottom = value; } - constexpr float Validate() const { - return left >= 0.0 && top >= 0.0 && right >= 0.0 && bottom >= 0.0; - } - constexpr bool operator==(const Thickness& other) const = default; float left; @@ -139,6 +135,20 @@ constexpr Thickness operator+(const Thickness& left, const Thickness& right) { left.right + right.right, left.bottom + right.bottom}; } +constexpr Thickness operator*(const Thickness& thickness, float scale) { + return {thickness.left * scale, thickness.top * scale, + thickness.right * scale, thickness.bottom * scale}; +} + +constexpr Thickness operator*(float scale, const Thickness& thickness) { + return operator*(thickness, scale); +} + +constexpr Thickness operator/(const Thickness& thickness, float scale) { + return {thickness.left / scale, thickness.top / scale, + thickness.right / scale, thickness.bottom / scale}; +} + struct Rect final { constexpr Rect() = default; constexpr Rect(const float left, const float top, const float width, diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp index 1fc120f1..144ad787 100644 --- a/src/ui/render/BorderRenderObject.cpp +++ b/src/ui/render/BorderRenderObject.cpp @@ -162,11 +162,7 @@ void BorderRenderObject::RecreateGeometry() { geometry_.reset(); border_outer_geometry_.reset(); - Thickness t = border_thickness_; - t.left /= 2.0; - t.top /= 2.0; - t.right /= 2.0; - t.bottom /= 2.0; + auto t = border_thickness_ / 2.f; const CornerRadius& r = border_radius_; CornerRadius outer_radius(r.left_top + Point{t.left, t.top}, diff --git a/test/platform/CMakeLists.txt b/test/platform/CMakeLists.txt index ea6493c4..187068b8 100644 --- a/test/platform/CMakeLists.txt +++ b/test/platform/CMakeLists.txt @@ -1,6 +1,7 @@ add_executable(CruPlatformBaseTest ColorTest.cpp DeleteLaterTest.cpp + GraphicsBaseTest.cpp MatrixTest.cpp ) target_link_libraries(CruPlatformBaseTest PRIVATE CruPlatformBase CruTestBase) diff --git a/test/platform/GraphicsBaseTest.cpp b/test/platform/GraphicsBaseTest.cpp new file mode 100644 index 00000000..9e6007cf --- /dev/null +++ b/test/platform/GraphicsBaseTest.cpp @@ -0,0 +1,48 @@ +#include "cru/platform/GraphicsBase.h" + +#include <catch2/catch_test_macros.hpp> + +using cru::platform::Rect; + +TEST_CASE("Rect IsIntersect", "[graphics][rect]") { + auto test = [](const Rect& left, const Rect& right, bool intersect) { + REQUIRE(left.IsIntersect(right) == intersect); + REQUIRE(right.IsIntersect(left) == intersect); + }; + + test({}, {}, false); + test({0.f, 0.f, 1.f, 1.f}, {}, false); + + test({0.f, 0.f, 1.f, 1.f}, {-2.f, 0.f, 1.f, 1.f}, false); + test({0.f, 0.f, 1.f, 1.f}, {2.f, 0.25f, 1.f, 0.5f}, false); + test({0.f, 0.f, 1.f, 1.f}, {0.f, -2.f, 0.5f, 1.f}, false); + test({0.f, 0.f, 1.f, 1.f}, {0.f, 2.f, 0.5f, 1.f}, false); + + test({0.f, 0.f, 1.f, 1.f}, {-1.f, -1.f, 3.f, 0.5f}, false); + test({0.f, 0.f, 1.f, 1.f}, {-1.f, -1.f, 3.f, 0.5f}, false); + test({0.f, 0.f, 1.f, 1.f}, {-1.f, -1.f, 0.5f, 3.f}, false); + test({0.f, 0.f, 1.f, 1.f}, {1.5f, -1.f, 0.5f, 3.f}, false); + + test({0.f, 0.f, 1.f, 1.f}, {-0.5f, 0.25f, 1.f, 0.5f}, true); + test({0.f, 0.f, 1.f, 1.f}, {0.5f, 0.25f, 1.f, 0.5f}, true); + test({0.f, 0.f, 1.f, 1.f}, {0.25f, -0.5f, 0.5f, 1.f}, true); + test({0.f, 0.f, 1.f, 1.f}, {0.25f, 0.5f, 0.5f, 1.f}, true); + + test({0.f, 0.f, 1.f, 1.f}, {-0.5f, -0.5f, 1.f, 1.f}, true); + test({0.f, 0.f, 1.f, 1.f}, {0.5f, -0.5f, 1.f, 1.f}, true); + test({0.f, 0.f, 1.f, 1.f}, {0.5f, 0.5f, 1.f, 1.f}, true); + test({0.f, 0.f, 1.f, 1.f}, {-0.5f, 0.5f, 1.f, 1.f}, true); +} + +TEST_CASE("Rect Union", "[graphics][rect]") { + auto test = [](const Rect& left, const Rect& right, const Rect& result) { + REQUIRE(left.Union(right) == result); + REQUIRE(right.Union(left) == result); + }; + + test({}, {0.f, 0.f, 1.f, 1.f}, {0.f, 0.f, 1.f, 1.f}); + test({0.f, 0.f, 1.f, 1.f}, {2.f, 2.f, 1.f, 1.f}, {0.f, 0.f, 3.f, 3.f}); + test({2.f, 0.f, 1.f, 1.f}, {0.f, 2.f, 1.f, 1.f}, {0.f, 0.f, 3.f, 3.f}); + test({0.f, 0.f, 1.f, 1.f}, {0.5f, 0.5f, 1.f, 1.f}, {0.f, 0.f, 1.5f, 1.5f}); + test({0.5f, 0.f, 1.f, 1.f}, {0.f, 0.5f, 1.f, 1.f}, {0.f, 0.f, 1.5f, 1.5f}); +} |
