#include #include #include using namespace psemek; using namespace psemek::ui::impl; namespace { template std::set as_set(std::vector const & v) { std::set result; for (auto const & x : v) result.insert(x); return result; } void check_polygon_min(size_polygon & polygon, size_polygon const & min_x, size_polygon const & min_y) { for (int i = 0; i < polygon.size(); ++i) { expect_equal(as_set(min(polygon, 0)), as_set(min_x)); expect_equal(as_set(min(polygon, 1)), as_set(min_y)); std::rotate(polygon.begin(), polygon.end() - 1, polygon.end()); } } } test_case(ui_impl_size__polygon_min_empty) { size_polygon polygon; expect_equal(min(polygon, 0), size_polygon{}); expect_equal(min(polygon, 1), size_polygon{}); } test_case(ui_impl_size__polygon_min_edge__X) { size_polygon polygon{{0.f, 0.f}, {10.f, 0.f}}; size_polygon min_x{{0.f, 0.f}}; size_polygon min_y{{0.f, 0.f}, {10.f, 0.f}}; check_polygon_min(polygon, min_x, min_y); } test_case(ui_impl_size__polygon_min_edge__Y) { size_polygon polygon{{0.f, 0.f}, {0.f, 10.f}}; size_polygon min_x{{0.f, 0.f}, {0.f, 10.f}}; size_polygon min_y{{0.f, 0.f}}; check_polygon_min(polygon, min_x, min_y); } test_case(ui_impl_size__polygon_min_edge__XY) { size_polygon polygon{{0.f, 0.f}, {10.f, 10.f}}; size_polygon min_x{{0.f, 0.f}}; size_polygon min_y{{0.f, 0.f}}; check_polygon_min(polygon, min_x, min_y); } test_case(ui_impl_size__polygon_min_square) { size_polygon polygon{{0.f, 0.f}, {10.f, 0.f}, {10.f, 10.f}, {0.f, 10.f}}; size_polygon min_x{{0.f, 0.f}, {0.f, 10.f}}; size_polygon min_y{{0.f, 0.f}, {10.f, 0.f}}; check_polygon_min(polygon, min_x, min_y); } test_case(ui_impl_size__polygon_min_diamond) { size_polygon polygon{{0.f, 10.f}, {10.f, 0.f}, {20.f, 10.f}, {10.f, 20.f}}; size_polygon min_x{{0.f, 10.f}}; size_polygon min_y{{10.f, 0.f}}; check_polygon_min(polygon, min_x, min_y); } test_case(ui_impl_size__polygon_min_octahedron) { size_polygon polygon{{10.f, 0.f}, {20.f, 0.f}, {30.f, 10.f}, {30.f, 20.f}, {20.f, 30.f}, {10.f, 30.f}, {0.f, 20.f}, {0.f, 10.f}}; size_polygon min_x{{0.f, 10.f}, {0.f, 20.f}}; size_polygon min_y{{10.f, 0.f}, {20.f, 0.f}}; check_polygon_min(polygon, min_x, min_y); }