diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-05-24 11:59:48 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-05-25 22:59:05 +0200 |
commit | 83f60aa9a5a2452158b7774044dcc51c82c43ae4 (patch) | |
tree | e7354aa1b76ecb2c8f6ca34bcd40e8059b937b08 /test | |
parent | 36972e30f7f2c47e3a5e45b94cda5e0072839484 (diff) |
w
Diffstat (limited to 'test')
-rw-r--r-- | test/app.cpp | 1 | ||||
-rw-r--r-- | test/app.hpp | 1 | ||||
-rw-r--r-- | test/hole.cpp | 216 |
3 files changed, 218 insertions, 0 deletions
diff --git a/test/app.cpp b/test/app.cpp index b6b032eb..4082211e 100644 --- a/test/app.cpp +++ b/test/app.cpp @@ -61,6 +61,7 @@ int App::exec() FM_TEST(test_math), FM_TEST(test_astar_pool), FM_TEST(test_coords), + FM_TEST(test_hole), FM_TEST(test_bptr), FM_TEST(test_iptr), FM_TEST(test_entity), diff --git a/test/app.hpp b/test/app.hpp index fff5a5fa..989b72be 100644 --- a/test/app.hpp +++ b/test/app.hpp @@ -24,6 +24,7 @@ void test_critter(); void test_dijkstra(); void test_entity(); void test_hash(); +void test_hole(); void test_iptr(); void test_json(); void test_json2(); diff --git a/test/hole.cpp b/test/hole.cpp new file mode 100644 index 00000000..fd947137 --- /dev/null +++ b/test/hole.cpp @@ -0,0 +1,216 @@ +#include "app.hpp" +#include "src/hole.hpp" +#include "compat/array-size.hpp" +#include "compat/map.hpp" +#include "compat/iota.hpp" + +#ifdef __GNUG__ +#pragma GCC diagnostic ignored "-Wswitch-default" +//#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif + +namespace floormat::Hole { +//namespace { + +using bbox = cut_rectangle_result::bbox; + +enum class type : uint8_t +{ + // see `doc/cut-rectangle-hole' + _9 , // all + _10, // side-part + _11, // corner + _12, // full-side + _13, // middle + _14, // center +}; + +enum shift : uint8_t { __ = 0, x0 = 1 << 0, x1 = 1 << 1, y0 = 1 << 2, y1 = 1 << 3, }; +enum class location : uint8_t { R0, R1, H0, H1, }; + +struct coords +{ + location x0 : 2; + location x1 : 2; + location y0 : 2; + location y1 : 2; +}; + +struct element +{ + uint8_t count; + std::array<coords, 8> array; +}; + +constexpr element make_element(uint8_t s) +{ + switch (s) + { + using enum type; + using enum location; + case x0|x1|y0|y1: return element{1, {{ // 9.1 + {R0, R1, R0, R1}, + }}}; + case __|__|__|__: return element{8, {{ // 14.1 + {R0, H0, R0, H0}, + {H0, H1, R0, H0}, + {H1, R1, R0, H0}, + {R0, H0, H0, H1}, + {H1, R1, H0, H1}, + {R0, H0, H1, R1}, + {H0, H1, H0, R1}, + {H1, R1, H1, R1}, + }}}; + + case x0|x1|__|__: return element{2, {{ // 13.1 + {R0, R1, R0, H0}, + {R0, R1, H1, R1}, + }}}; + case __|__|y0|y1: return element{2, {{ // 13.2 + {R0, H0, H1, R1}, + {R0, H0, H0, R1}, + }}}; + + case x0|x1|y0|__: return element{1, {{ // 12.1 + {R0, R1, H1, R1}, + }}}; + case x0|x1|__|y1: return element{1, {{ // 12.2 + {R0, R1, R0, H0}, + }}}; + case x0|__|y0|y1: return element{1, {{ // 12.3 + {H1, R1, R0, R1}, + }}}; + case __|x1|y0|y1: return element{1, {{ // 12.4 + {R0, H0, R0, R1}, + }}}; + + case x0|__|__|__: return element{3, {{ // 10.1 + {R0, R1, R0, H0}, + {H1, R1, H0, H1}, + {R0, R1, H1, R1}, + }}}; + case __|x1|__|__: return element{3, {{ // 10.2 + {R0, R1, R0, H0}, + {R0, H0, H0, H1}, + {R0, R1, H1, R1}, + }}}; + case __|__|y0|__: return element{3, {{ // 10.3 + {R0, H0, R0, R1}, + {H0, H1, H0, R1}, + {H1, R1, R0, R1}, + }}}; + case __|__|__|y1: return element{3, {{ // 10.4 + {R0, H0, R0, R1}, + {H0, H1, R0, H0}, + {H1, R1, R0, R1}, + }}}; + + case x0|__|y0|__: return element{2, {{ // 11.1 + + }}}; + case __|x1|y0|__: return element{2, {{ // 11.1 + + }}}; + case x0|__|__|y1: return element{2, {{ // 11.1 + + }}}; + case __|x1|__|y1: return element{2, {{ // 11.1 + + }}}; + } + fm_assert(false); +} +constexpr auto elements = map(make_element, iota_array<uint8_t, 16>); +static_assert(sizeof(elements) == 9 * 16); + +constexpr cut_rectangle_result cut(bbox input, bbox hole) +{ + auto ihalf = Vector2i{input.bbox_size/2}; + auto r0 = input.position - ihalf; + auto r1 = input.position + Vector2i{input.bbox_size} - ihalf; + + auto hhalf = Vector2i{hole.bbox_size/2}; + auto h0 = hole.position - hhalf; + auto h1 = hole.position + Vector2i{hole.bbox_size} - hhalf; + + { + bool iempty = Vector2ui{input.bbox_size}.product() == 0; + bool hempty = Vector2ui{hole.bbox_size}.product() == 0; + bool empty_before_x = h1.x() <= r0.x(); + bool empty_after_x = h0.x() >= r1.x(); + bool empty_before_y = h1.y() <= r0.y(); + bool empty_after_y = h0.y() >= r1.y(); + + if (iempty | hempty | empty_before_x | empty_after_x | empty_before_y | empty_after_y) [[unlikely]] + return { 0, 0, {} }; + } + + const bool sx = h0.x() <= r0.x(); + const bool ex = h1.x() >= r1.x(); + const bool sy = h0.y() <= r0.y(); + const bool ey = h1.y() >= r1.y(); + + auto val = uint8_t(sx << 0 | ex << 1 | sy << 2 | ey << 3); + CORRADE_ASSUME(val < 16); + + //static_assert(array_size(starts) == 16); + fm_assert(false); + std::unreachable(); + + //return -1; +} + +template<Int x, Int y> +void test1() +{ + static constexpr auto vec = Vector2i{x, y}; + constexpr auto rect = bbox{{}, {50, 50}}; + constexpr auto cutʹ = [](bbox rect, bbox hole) { + auto rectʹ = bbox { rect.position + vec, rect.bbox_size }; + auto holeʹ = bbox { hole.position + vec, hole.bbox_size }; + return cut(rectʹ, holeʹ).code; + }; +#if 1 + fm_assert_not_equal(0, cutʹ(rect, {{ 49, 0}, {50, 50}})); + fm_assert_not_equal(0, cutʹ(rect, {{ 0, 49}, {50, 50}})); + fm_assert_not_equal(0, cutʹ(rect, {{ 49, 49}, {50, 50}})); +#endif +#if 1 + fm_assert_not_equal(0, cutʹ(rect, {{-49, 0}, {50, 50}})); + fm_assert_not_equal(0, cutʹ(rect, {{ 0, -49}, {50, 50}})); + fm_assert_not_equal(0, cutʹ(rect, {{ 49, -49}, {50, 50}})); +#endif +#if 1 + fm_assert_equal(0, cutʹ(rect, {{50, 0}, {50, 50}})); + fm_assert_equal(0, cutʹ(rect, {{ 0, 50}, {50, 50}})); + fm_assert_equal(0, cutʹ(rect, {{50, 50}, {50, 50}})); +#endif +#if 1 + fm_assert_equal(9, cutʹ(rect, {{ 9, 9}, {70, 70}})); + fm_assert_equal(9, cutʹ(rect, {{10, 10}, {70, 70}})); +#endif +#if 1 + fm_assert_equal(12, cutʹ(rect, {{1, 0}, {50, 50}})); + fm_assert_equal(12, cutʹ(rect, {{0, 1}, {50, 50}})); + fm_assert_equal(11, cutʹ(rect, {{1, 1}, {50, 50}})); +#endif +#if 1 + // todo! coverage +#endif +} + +//} // namespace +} // namespace floormat::Hole + +namespace floormat { + +void Test::test_hole() +{ + Hole::test1< 0, 0 >(); + Hole::test1< 110, 105 >(); + Hole::test1< 15, 110 >(); + Hole::test1< - 15, -110 >(); + Hole::test1< -110, -15 >(); +} + +} // namespace floormat |