| #include "rive/core/binary_reader.hpp" | |
| #include "rive/file.hpp" | |
| #include "rive/nested_artboard.hpp" | |
| #include "rive/animation/nested_bool.hpp" | |
| #include "rive/animation/nested_input.hpp" | |
| #include "rive/animation/nested_number.hpp" | |
| #include "rive/animation/nested_trigger.hpp" | |
| #include "rive/animation/state_machine_instance.hpp" | |
| #include "rive/animation/state_machine_input_instance.hpp" | |
| #include "catch.hpp" | |
| #include "rive_file_reader.hpp" | |
| #include <cstdio> | |
| TEST_CASE("validate nested boolean get/set", "[nestedInput]") | |
| { | |
| auto file = ReadRiveFile("../../test/assets/runtime_nested_inputs.riv"); | |
| auto artboard = file->artboard("MainArtboard")->instance(); | |
| REQUIRE(artboard != nullptr); | |
| REQUIRE(artboard->stateMachineCount() == 1); | |
| // Test getting/setting boolean SMIInput via nested artboard path | |
| auto boolInput = artboard->getBool("CircleOuterState", "CircleOuter"); | |
| auto smiInput = artboard->input("CircleOuterState", "CircleOuter"); | |
| auto smiBoolInput = static_cast<rive::SMIBool*>(smiInput); | |
| auto nestedArtboard = artboard->nestedArtboard("CircleOuter"); | |
| auto nestedInput = nestedArtboard->input("CircleOuterState")->as<rive::NestedBool>(); | |
| REQUIRE(boolInput->value() == false); | |
| REQUIRE(smiBoolInput->value() == false); | |
| REQUIRE(nestedInput->nestedValue() == false); | |
| boolInput->value(true); | |
| REQUIRE(boolInput->value() == true); | |
| REQUIRE(smiBoolInput->value() == true); | |
| REQUIRE(nestedInput->nestedValue() == true); | |
| smiBoolInput->value(false); | |
| REQUIRE(boolInput->value() == false); | |
| REQUIRE(smiBoolInput->value() == false); | |
| REQUIRE(nestedInput->nestedValue() == false); | |
| nestedInput->nestedValue(true); | |
| REQUIRE(boolInput->value() == true); | |
| REQUIRE(smiBoolInput->value() == true); | |
| REQUIRE(nestedInput->nestedValue() == true); | |
| } | |
| TEST_CASE("validate nested number get/set", "[nestedInput]") | |
| { | |
| auto file = ReadRiveFile("../../test/assets/runtime_nested_inputs.riv"); | |
| auto artboard = file->artboard("MainArtboard")->instance(); | |
| REQUIRE(artboard != nullptr); | |
| REQUIRE(artboard->stateMachineCount() == 1); | |
| // Test getting/setting number SMIInput via nested artboard path | |
| auto numInput = artboard->getNumber("CircleOuterNumber", "CircleOuter"); | |
| auto smiInput = artboard->input("CircleOuterNumber", "CircleOuter"); | |
| auto smiNumInput = static_cast<rive::SMINumber*>(smiInput); | |
| auto nestedArtboard = artboard->nestedArtboardAtPath("CircleOuter"); | |
| auto nestedInput = nestedArtboard->input("CircleOuterNumber")->as<rive::NestedNumber>(); | |
| REQUIRE(numInput->value() == 0); | |
| REQUIRE(smiNumInput->value() == 0); | |
| REQUIRE(nestedInput->nestedValue() == 0); | |
| numInput->value(10); | |
| REQUIRE(numInput->value() == 10); | |
| REQUIRE(smiNumInput->value() == 10); | |
| REQUIRE(nestedInput->nestedValue() == 10); | |
| smiNumInput->value(5); | |
| REQUIRE(numInput->value() == 5); | |
| REQUIRE(smiNumInput->value() == 5); | |
| REQUIRE(nestedInput->nestedValue() == 5); | |
| nestedInput->nestedValue(99); | |
| REQUIRE(numInput->value() == 99); | |
| REQUIRE(smiNumInput->value() == 99); | |
| REQUIRE(nestedInput->nestedValue() == 99); | |
| } | |
| TEST_CASE("validate nested trigger fire", "[nestedInput]") | |
| { | |
| auto file = ReadRiveFile("../../test/assets/runtime_nested_inputs.riv"); | |
| auto artboard = file->artboard("MainArtboard")->instance(); | |
| REQUIRE(artboard != nullptr); | |
| REQUIRE(artboard->stateMachineCount() == 1); | |
| // Test getting/setting number SMIInput via nested artboard path | |
| auto tInput = artboard->getTrigger("CircleOuterTrigger", "CircleOuter"); | |
| auto smiInput = artboard->input("CircleOuterTrigger", "CircleOuter"); | |
| auto smiTInput = static_cast<rive::SMITrigger*>(smiInput); | |
| auto nestedArtboard = artboard->nestedArtboardAtPath("CircleOuter"); | |
| auto nestedInput = nestedArtboard->input("CircleOuterTrigger")->as<rive::NestedTrigger>(); | |
| auto nestedSMI = static_cast<rive::SMITrigger*>(nestedInput->input()); | |
| REQUIRE(tInput->didFire() == false); | |
| REQUIRE(smiTInput->didFire() == false); | |
| REQUIRE(nestedSMI->didFire() == false); | |
| tInput->fire(); | |
| REQUIRE(tInput->didFire() == true); | |
| REQUIRE(smiTInput->didFire() == true); | |
| REQUIRE(nestedSMI->didFire() == true); | |
| } | |
| TEST_CASE("validate nested boolean get/set multiple nested artboards deep", "[nestedInput]") | |
| { | |
| auto file = ReadRiveFile("../../test/assets/runtime_nested_inputs.riv"); | |
| auto artboard = file->artboard("MainArtboard")->instance(); | |
| REQUIRE(artboard != nullptr); | |
| REQUIRE(artboard->stateMachineCount() == 1); | |
| // Test getting/setting boolean SMIInput via nested artboard path | |
| auto boolInput = artboard->getBool("CircleInnerState", "CircleOuter/CircleInner"); | |
| auto smiInput = artboard->input("CircleInnerState", "CircleOuter/CircleInner"); | |
| auto smiBoolInput = static_cast<rive::SMIBool*>(smiInput); | |
| auto nestedArtboard = artboard->nestedArtboardAtPath("CircleOuter/CircleInner"); | |
| auto nestedInput = nestedArtboard->input("CircleInnerState")->as<rive::NestedBool>(); | |
| REQUIRE(boolInput->value() == false); | |
| REQUIRE(smiBoolInput->value() == false); | |
| REQUIRE(nestedInput->nestedValue() == false); | |
| boolInput->value(true); | |
| REQUIRE(boolInput->value() == true); | |
| REQUIRE(smiBoolInput->value() == true); | |
| REQUIRE(nestedInput->nestedValue() == true); | |
| smiBoolInput->value(false); | |
| REQUIRE(boolInput->value() == false); | |
| REQUIRE(smiBoolInput->value() == false); | |
| REQUIRE(nestedInput->nestedValue() == false); | |
| nestedInput->nestedValue(true); | |
| REQUIRE(boolInput->value() == true); | |
| REQUIRE(smiBoolInput->value() == true); | |
| REQUIRE(nestedInput->nestedValue() == true); | |
| } |