92 lines
2.8 KiB
C++
92 lines
2.8 KiB
C++
#include <psemek/test/test.hpp>
|
|
|
|
#include <psemek/ui/impl/component_factory_base.hpp>
|
|
#include <psemek/ui/impl/rectangle_base.hpp>
|
|
#include <psemek/ui/impl/single_container_base.hpp>
|
|
#include <psemek/ui/impl/stack_layout_base.hpp>
|
|
#include <psemek/ui/impl/box_layout_base.hpp>
|
|
|
|
#include <psemek/react/source.hpp>
|
|
|
|
using namespace psemek;
|
|
using namespace psemek::ui;
|
|
|
|
namespace
|
|
{
|
|
|
|
constexpr float layout_margin = 5.f;
|
|
constexpr float infinity = impl::component::infinity;
|
|
|
|
struct test_component_factory
|
|
: impl::component_factory_base
|
|
{
|
|
test_component_factory()
|
|
{
|
|
register_type<rectangle, impl::rectangle_base>();
|
|
register_type<stack_layout, impl::stack_layout_base>();
|
|
register_type<box_layout::horizontal, impl::box_layout_base<0>>([]{ return std::make_unique<impl::box_layout_base<0>>(layout_margin); });
|
|
register_type<box_layout::vertical, impl::box_layout_base<1>>([]{ return std::make_unique<impl::box_layout_base<1>>(layout_margin); });
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
test_case(ui_layout_rectangle)
|
|
{
|
|
test_component_factory factory;
|
|
|
|
auto square = react::source(false);
|
|
|
|
auto test_ui = rectangle{.square = square};
|
|
|
|
auto ui_root = factory.reconciliate(nullptr, test_ui);
|
|
|
|
expect_equal(ui_root->size_constraints(0, 100.f), geom::interval<float>(0.f, infinity));
|
|
expect_equal(ui_root->size_constraints(1, 100.f), geom::interval<float>(0.f, infinity));
|
|
|
|
square.set(true);
|
|
|
|
expect_equal(ui_root->size_constraints(0, 100.f), geom::interval<float>(100.f, 100.f));
|
|
expect_equal(ui_root->size_constraints(1, 100.f), geom::interval<float>(100.f, 100.f));
|
|
|
|
ui_root->reshape({{{0.f, 10.f}, {0.f, 10.f}}});
|
|
|
|
expect_equal(ui_root->shape(), (geom::box<float, 2>{{{0.f, 10.f}, {0.f, 10.f}}}));
|
|
}
|
|
|
|
|
|
test_case(ui_layout_hbox__2__rectangles)
|
|
{
|
|
test_component_factory factory;
|
|
|
|
auto square0 = react::source(false);
|
|
auto square1 = react::source(false);
|
|
|
|
auto policy0 = react::source<box_layout::size_policy>(box_layout::minimized{});
|
|
auto policy1 = react::source<box_layout::size_policy>(box_layout::minimized{});
|
|
|
|
auto test_ui = box_layout::horizontal{{
|
|
{
|
|
.element = rectangle{.square = square0},
|
|
.policy = policy0,
|
|
},
|
|
{
|
|
.element = rectangle{.square = square1},
|
|
.policy = policy1,
|
|
}
|
|
}};
|
|
|
|
auto ui_root = factory.reconciliate(nullptr, test_ui);
|
|
|
|
expect_equal(ui_root->size_constraints(0, 100.f), geom::interval<float>(layout_margin, infinity));
|
|
expect_equal(ui_root->size_constraints(1, 100.f), geom::interval<float>(0.f, infinity));
|
|
|
|
square0.set(true);
|
|
|
|
expect_equal(ui_root->size_constraints(0, 100.f), geom::interval<float>(100.f + layout_margin, infinity));
|
|
expect_equal(ui_root->size_constraints(1, 100.f), geom::interval<float>(100.f, 100.f));
|
|
|
|
ui_root->reshape({{{0.f, 10.f}, {0.f, 10.f}}});
|
|
|
|
expect_equal(ui_root->shape(), (geom::box<float, 2>{{{0.f, 10.f}, {0.f, 10.f}}}));
|
|
}
|