psemek/libs/ui/tests/size_polygon_min.cpp
2023-05-06 12:55:06 +03:00

95 lines
2.3 KiB
C++

#include <psemek/test/test.hpp>
#include <psemek/ui/impl/size_polygon_utils.hpp>
#include <algorithm>
using namespace psemek;
using namespace psemek::ui::impl;
namespace
{
template <typename T>
std::set<T> as_set(std::vector<T> const & v)
{
std::set<T> 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);
}