blob: a40b58c6ba3a6354b0290814337ea58422ad30de [file] [log] [blame]
#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);
}