| #include "rive/math/transform_components.hpp" |
| #include "rive/shapes/rectangle.hpp" |
| #include "rive/text/text.hpp" |
| #include "utils/no_op_factory.hpp" |
| #include "rive_file_reader.hpp" |
| #include "rive_testing.hpp" |
| #include <catch.hpp> |
| #include <cstdio> |
| |
| TEST_CASE("LayoutComponent FlexDirection row", "[layout]") |
| { |
| auto file = ReadRiveFile("../../test/assets/layout/layout_horizontal.riv"); |
| |
| auto artboard = file->artboard(); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent1") != nullptr); |
| auto target1 = artboard->find<rive::LayoutComponent>("LayoutComponent1"); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent2") != nullptr); |
| auto target2 = artboard->find<rive::LayoutComponent>("LayoutComponent2"); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent3") != nullptr); |
| auto target3 = artboard->find<rive::LayoutComponent>("LayoutComponent3"); |
| |
| artboard->advance(0.0f); |
| auto target1Components = target1->worldTransform().decompose(); |
| auto target2Components = target2->worldTransform().decompose(); |
| auto target3Components = target3->worldTransform().decompose(); |
| |
| REQUIRE(target1Components.x() == 0); |
| REQUIRE(target2Components.x() == 100); |
| REQUIRE(target3Components.x() == 200); |
| REQUIRE(target1Components.y() == 0); |
| REQUIRE(target2Components.y() == 0); |
| REQUIRE(target3Components.y() == 0); |
| } |
| |
| TEST_CASE("LayoutComponent FlexDirection column", "[layout]") |
| { |
| auto file = ReadRiveFile("../../test/assets/layout/layout_vertical.riv"); |
| |
| auto artboard = file->artboard(); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent1") != nullptr); |
| auto target1 = artboard->find<rive::LayoutComponent>("LayoutComponent1"); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent2") != nullptr); |
| auto target2 = artboard->find<rive::LayoutComponent>("LayoutComponent2"); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent3") != nullptr); |
| auto target3 = artboard->find<rive::LayoutComponent>("LayoutComponent3"); |
| |
| artboard->advance(0.0f); |
| auto target1Components = target1->worldTransform().decompose(); |
| auto target2Components = target2->worldTransform().decompose(); |
| auto target3Components = target3->worldTransform().decompose(); |
| |
| REQUIRE(target1Components.x() == 0); |
| REQUIRE(target2Components.x() == 0); |
| REQUIRE(target3Components.x() == 0); |
| REQUIRE(target1Components.y() == 0); |
| REQUIRE(target2Components.y() == 100); |
| REQUIRE(target3Components.y() == 200); |
| } |
| |
| TEST_CASE("LayoutComponent FlexDirection row with gap", "[layout]") |
| { |
| auto file = ReadRiveFile("../../test/assets/layout/layout_horizontal_gaps.riv"); |
| |
| auto artboard = file->artboard(); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent1") != nullptr); |
| auto target1 = artboard->find<rive::LayoutComponent>("LayoutComponent1"); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent2") != nullptr); |
| auto target2 = artboard->find<rive::LayoutComponent>("LayoutComponent2"); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent3") != nullptr); |
| auto target3 = artboard->find<rive::LayoutComponent>("LayoutComponent3"); |
| |
| artboard->advance(0.0f); |
| auto target1Components = target1->worldTransform().decompose(); |
| auto target2Components = target2->worldTransform().decompose(); |
| auto target3Components = target3->worldTransform().decompose(); |
| |
| REQUIRE(target1Components.x() == 0); |
| REQUIRE(target2Components.x() == 110); |
| REQUIRE(target3Components.x() == 220); |
| REQUIRE(target1Components.y() == 0); |
| REQUIRE(target2Components.y() == 0); |
| REQUIRE(target3Components.y() == 0); |
| } |
| |
| TEST_CASE("LayoutComponent FlexDirection row with wrap", "[layout]") |
| { |
| auto file = ReadRiveFile("../../test/assets/layout/layout_horizontal_wrap.riv"); |
| |
| auto artboard = file->artboard(); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent6") != nullptr); |
| auto target = artboard->find<rive::LayoutComponent>("LayoutComponent6"); |
| |
| artboard->advance(0.0f); |
| auto targetComponents = target->worldTransform().decompose(); |
| |
| REQUIRE(targetComponents.x() == 0); |
| REQUIRE(targetComponents.y() == 100); |
| } |
| |
| TEST_CASE("LayoutComponent Center using alignItems and justifyContent", "[layout]") |
| { |
| auto file = ReadRiveFile("../../test/assets/layout/layout_center.riv"); |
| |
| auto artboard = file->artboard(); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("LayoutComponent1") != nullptr); |
| auto target = artboard->find<rive::LayoutComponent>("LayoutComponent1"); |
| |
| artboard->advance(0.0f); |
| auto targetComponents = target->worldTransform().decompose(); |
| |
| REQUIRE(targetComponents.x() == 200); |
| REQUIRE(targetComponents.y() == 200); |
| } |
| |
| TEST_CASE("LayoutComponent with intrinsic size gets measured correctly", "[layout]") |
| { |
| auto file = ReadRiveFile("../../test/assets/layout/measure_tests.riv"); |
| |
| auto artboard = file->artboard("hi"); |
| |
| REQUIRE(artboard->find<rive::LayoutComponent>("TextLayout") != nullptr); |
| REQUIRE(artboard->find<rive::Text>("HiText") != nullptr); |
| |
| artboard->advance(0.0f); |
| |
| auto text = artboard->find<rive::Text>("HiText"); |
| auto bounds = text->localBounds(); |
| REQUIRE(bounds.left() == 0); |
| REQUIRE(bounds.top() == 0); |
| REQUIRE(bounds.width() == 62.48047f); |
| REQUIRE(bounds.height() == 72.62695f); |
| } |