#include #include #include #include #include #include #include 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(); register_type(); register_type>([]{ return std::make_unique>(layout_margin); }); register_type>([]{ return std::make_unique>(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(0.f, infinity)); expect_equal(ui_root->size_constraints(1, 100.f), geom::interval(0.f, infinity)); square.set(true); expect_equal(ui_root->size_constraints(0, 100.f), geom::interval(100.f, 100.f)); expect_equal(ui_root->size_constraints(1, 100.f), geom::interval(100.f, 100.f)); ui_root->reshape({{{0.f, 10.f}, {0.f, 10.f}}}); expect_equal(ui_root->shape(), (geom::box{{{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::minimized{}); auto policy1 = react::source(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(layout_margin, infinity)); expect_equal(ui_root->size_constraints(1, 100.f), geom::interval(0.f, infinity)); square0.set(true); expect_equal(ui_root->size_constraints(0, 100.f), geom::interval(100.f + layout_margin, infinity)); expect_equal(ui_root->size_constraints(1, 100.f), geom::interval(100.f, 100.f)); ui_root->reshape({{{0.f, 10.f}, {0.f, 10.f}}}); expect_equal(ui_root->shape(), (geom::box{{{0.f, 10.f}, {0.f, 10.f}}})); }