blob: 8757162e512e26a97268418c534674fcc42587ed [file] [log] [blame]
#include <rive/solo.hpp>
#include <rive/shapes/shape.hpp>
#include <rive/animation/state_machine_instance.hpp>
#include "rive_file_reader.hpp"
#include <catch.hpp>
#include <cstdio>
TEST_CASE("file with skins in solos loads correctly", "[solo]")
{
auto file = ReadRiveFile("../../test/assets/death_knight.riv");
auto artboard = file->artboard()->instance();
artboard->advance(0.0f);
auto solos = artboard->find<rive::Solo>();
REQUIRE(solos.size() == 2);
}
TEST_CASE("children load correctly", "[solo]")
{
auto file = ReadRiveFile("../../test/assets/solo_test.riv");
auto artboard = file->artboard()->instance();
artboard->advance(0.0f);
auto solos = artboard->find<rive::Solo>();
REQUIRE(solos.size() == 1);
auto solo = solos[0];
REQUIRE(solo != nullptr);
REQUIRE(solo->children().size() == 3);
REQUIRE(solo->children()[0]->is<rive::Shape>());
REQUIRE(solo->children()[0]->name() == "Blue");
REQUIRE(solo->children()[1]->is<rive::Shape>());
REQUIRE(solo->children()[1]->name() == "Green");
REQUIRE(solo->children()[2]->is<rive::Shape>());
REQUIRE(solo->children()[2]->name() == "Red");
auto blue = solo->children()[0]->as<rive::Shape>();
auto green = solo->children()[1]->as<rive::Shape>();
auto red = solo->children()[2]->as<rive::Shape>();
REQUIRE(!blue->isHidden());
REQUIRE(green->isHidden());
REQUIRE(red->isHidden());
REQUIRE(green->children().size() == 2);
REQUIRE(green->children()[0]->isCollapsed());
REQUIRE(green->children()[1]->isCollapsed());
REQUIRE(red->children().size() == 2);
REQUIRE(red->children()[0]->isCollapsed());
REQUIRE(red->children()[1]->isCollapsed());
auto machine = artboard->defaultStateMachine();
machine->advanceAndApply(0.0);
// Red visible at start
REQUIRE(blue->isHidden());
REQUIRE(green->isHidden());
REQUIRE(!red->isHidden());
machine->advanceAndApply(0.5);
// Green visible after 0.5 seconds.
REQUIRE(blue->isHidden());
REQUIRE(!green->isHidden());
REQUIRE(red->isHidden());
machine->advanceAndApply(0.5);
// Blue visible at end
REQUIRE(!blue->isHidden());
REQUIRE(green->isHidden());
REQUIRE(red->isHidden());
}
TEST_CASE("nested solos work", "[solo]")
{
auto file = ReadRiveFile("../../test/assets/nested_solo.riv");
auto artboard = file->artboard()->instance();
artboard->advance(0.0f);
auto s1 = artboard->find<rive::Solo>("Solo 1");
REQUIRE(s1 != nullptr);
auto s2 = artboard->find<rive::Solo>("Solo 2");
REQUIRE(s2 != nullptr);
auto s3 = artboard->find<rive::Solo>("Solo 3");
REQUIRE(s3 != nullptr);
auto a = artboard->find<rive::Shape>("A");
REQUIRE(a != nullptr);
auto b = artboard->find<rive::Shape>("B");
REQUIRE(b != nullptr);
auto c = artboard->find<rive::Shape>("C");
REQUIRE(c != nullptr);
auto d = artboard->find<rive::Shape>("D");
REQUIRE(d != nullptr);
auto e = artboard->find<rive::Shape>("E");
REQUIRE(e != nullptr);
auto f = artboard->find<rive::Shape>("F");
REQUIRE(f != nullptr);
auto g = artboard->find<rive::Shape>("G");
REQUIRE(g != nullptr);
auto h = artboard->find<rive::Shape>("H");
REQUIRE(h != nullptr);
auto i = artboard->find<rive::Shape>("I");
REQUIRE(i != nullptr);
s1->activeComponentId(artboard->idOf(a));
s2->activeComponentId(artboard->idOf(d));
s3->activeComponentId(artboard->idOf(h));
artboard->advance(0.0f);
REQUIRE(a->isCollapsed() == false);
REQUIRE(b->isCollapsed() == true);
REQUIRE(c->isCollapsed() == true);
REQUIRE(d->isCollapsed() == true);
REQUIRE(e->isCollapsed() == true);
REQUIRE(f->isCollapsed() == true);
REQUIRE(g->isCollapsed() == true);
REQUIRE(h->isCollapsed() == true);
REQUIRE(i->isCollapsed() == true);
// Changing active in a collapsed solo doesn't affect anything.
s3->activeComponentId(artboard->idOf(g));
artboard->advance(0.0f);
REQUIRE(a->isCollapsed() == false);
REQUIRE(b->isCollapsed() == true);
REQUIRE(c->isCollapsed() == true);
REQUIRE(d->isCollapsed() == true);
REQUIRE(e->isCollapsed() == true);
REQUIRE(f->isCollapsed() == true);
REQUIRE(g->isCollapsed() == true);
REQUIRE(h->isCollapsed() == true);
REQUIRE(i->isCollapsed() == true);
s1->activeComponentId(artboard->idOf(c));
artboard->advance(0.0);
// Now the rest of the nested solo items should be visible.
REQUIRE(a->isCollapsed() == true);
REQUIRE(b->isCollapsed() == true);
REQUIRE(c->isCollapsed() == false);
REQUIRE(d->isCollapsed() == false);
REQUIRE(e->isCollapsed() == true);
REQUIRE(f->isCollapsed() == true);
REQUIRE(g->isCollapsed() == false);
REQUIRE(h->isCollapsed() == true);
REQUIRE(i->isCollapsed() == true);
}