Refactor: use references in channel group unit tests

@dr.sybren recommended this in the review of #127080, to be consistent with
the more modern C++ style Blender is trying to adhere to in new code.

No functional changes.

Pull Request: https://projects.blender.org/blender/blender/pulls/127343
This commit is contained in:
Nathan Vegdahl
2024-09-09 14:04:24 +02:00
committed by Nathan Vegdahl
parent 5c259a1bae
commit 0b5e878ae1

View File

@@ -907,129 +907,129 @@ class ChannelBagTest : public testing::Test {
TEST_F(ChannelBagTest, fcurve_move)
{
FCurve *fcu0 = &channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve *fcu1 = &channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
FCurve *fcu2 = &channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve *fcu3 = &channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group1"});
FCurve *fcu4 = &channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
FCurve &fcu0 = channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve &fcu1 = channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
FCurve &fcu2 = channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve &fcu3 = channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group1"});
FCurve &fcu4 = channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
ASSERT_EQ(5, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
bActionGroup *group0 = channel_bag->channel_group(0);
bActionGroup *group1 = channel_bag->channel_group(1);
bActionGroup &group0 = *channel_bag->channel_group(0);
bActionGroup &group1 = *channel_bag->channel_group(1);
/* Moving an fcurve to where it already is should be fine. */
channel_bag->fcurve_move(*fcu0, 0);
EXPECT_EQ(fcu0, channel_bag->fcurve(0));
EXPECT_EQ(fcu1, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(fcu3, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(group1, fcu3->grp);
EXPECT_EQ(nullptr, fcu4->grp);
channel_bag->fcurve_move(fcu0, 0);
EXPECT_EQ(&fcu0, channel_bag->fcurve(0));
EXPECT_EQ(&fcu1, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu3, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(&group1, fcu3.grp);
EXPECT_EQ(nullptr, fcu4.grp);
/* Move to first. */
channel_bag->fcurve_move(*fcu4, 0);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(fcu4, channel_bag->fcurve(0));
EXPECT_EQ(fcu0, channel_bag->fcurve(1));
EXPECT_EQ(fcu1, channel_bag->fcurve(2));
EXPECT_EQ(fcu2, channel_bag->fcurve(3));
EXPECT_EQ(fcu3, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu4->grp);
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group1, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu3->grp);
channel_bag->fcurve_move(fcu4, 0);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(&fcu4, channel_bag->fcurve(0));
EXPECT_EQ(&fcu0, channel_bag->fcurve(1));
EXPECT_EQ(&fcu1, channel_bag->fcurve(2));
EXPECT_EQ(&fcu2, channel_bag->fcurve(3));
EXPECT_EQ(&fcu3, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu4.grp);
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group1, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu3.grp);
/* Move to last. */
channel_bag->fcurve_move(*fcu1, 4);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(fcu4, channel_bag->fcurve(0));
EXPECT_EQ(fcu0, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(fcu3, channel_bag->fcurve(3));
EXPECT_EQ(fcu1, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu4->grp);
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(group1, fcu3->grp);
EXPECT_EQ(nullptr, fcu1->grp);
channel_bag->fcurve_move(fcu1, 4);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(&fcu4, channel_bag->fcurve(0));
EXPECT_EQ(&fcu0, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu3, channel_bag->fcurve(3));
EXPECT_EQ(&fcu1, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu4.grp);
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(&group1, fcu3.grp);
EXPECT_EQ(nullptr, fcu1.grp);
/* Move to middle. */
channel_bag->fcurve_move(*fcu4, 2);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(fcu0, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu4, channel_bag->fcurve(2));
EXPECT_EQ(fcu3, channel_bag->fcurve(3));
EXPECT_EQ(fcu1, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group0, fcu2->grp);
EXPECT_EQ(group1, fcu4->grp);
EXPECT_EQ(group1, fcu3->grp);
EXPECT_EQ(nullptr, fcu1->grp);
channel_bag->fcurve_move(fcu4, 2);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(&fcu0, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu4, channel_bag->fcurve(2));
EXPECT_EQ(&fcu3, channel_bag->fcurve(3));
EXPECT_EQ(&fcu1, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group0, fcu2.grp);
EXPECT_EQ(&group1, fcu4.grp);
EXPECT_EQ(&group1, fcu3.grp);
EXPECT_EQ(nullptr, fcu1.grp);
}
TEST_F(ChannelBagTest, channel_group_create)
{
ASSERT_TRUE(channel_bag->channel_groups().is_empty());
bActionGroup *group0 = &channel_bag->channel_group_create("Foo");
bActionGroup &group0 = channel_bag->channel_group_create("Foo");
ASSERT_EQ(channel_bag->channel_groups().size(), 1);
EXPECT_EQ(StringRef{group0->name}, StringRef{"Foo"});
EXPECT_EQ(group0->fcurve_range_start, 0);
EXPECT_EQ(group0->fcurve_range_length, 0);
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(StringRef{group0.name}, StringRef{"Foo"});
EXPECT_EQ(group0.fcurve_range_start, 0);
EXPECT_EQ(group0.fcurve_range_length, 0);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
/* Set for testing purposes. Does not reflect actual fcurves in this test. */
group0->fcurve_range_length = 2;
group0.fcurve_range_length = 2;
bActionGroup *group1 = &channel_bag->channel_group_create("Bar");
bActionGroup &group1 = channel_bag->channel_group_create("Bar");
ASSERT_EQ(channel_bag->channel_groups().size(), 2);
EXPECT_EQ(StringRef{group1->name}, StringRef{"Bar"});
EXPECT_EQ(group1->fcurve_range_start, 2);
EXPECT_EQ(group1->fcurve_range_length, 0);
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(StringRef{group1.name}, StringRef{"Bar"});
EXPECT_EQ(group1.fcurve_range_start, 2);
EXPECT_EQ(group1.fcurve_range_length, 0);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
/* Set for testing purposes. Does not reflect actual fcurves in this test. */
group1->fcurve_range_length = 1;
group1.fcurve_range_length = 1;
bActionGroup *group2 = &channel_bag->channel_group_create("Yar");
bActionGroup &group2 = channel_bag->channel_group_create("Yar");
ASSERT_EQ(channel_bag->channel_groups().size(), 3);
EXPECT_EQ(StringRef{group2->name}, StringRef{"Yar"});
EXPECT_EQ(group2->fcurve_range_start, 3);
EXPECT_EQ(group2->fcurve_range_length, 0);
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(group2, channel_bag->channel_group(2));
EXPECT_EQ(StringRef{group2.name}, StringRef{"Yar"});
EXPECT_EQ(group2.fcurve_range_start, 3);
EXPECT_EQ(group2.fcurve_range_length, 0);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(&group2, channel_bag->channel_group(2));
}
TEST_F(ChannelBagTest, channel_group_remove)
{
bActionGroup *group0 = &channel_bag->channel_group_create("Group0");
bActionGroup *group1 = &channel_bag->channel_group_create("Group1");
bActionGroup *group2 = &channel_bag->channel_group_create("Group2");
bActionGroup &group0 = channel_bag->channel_group_create("Group0");
bActionGroup &group1 = channel_bag->channel_group_create("Group1");
bActionGroup &group2 = channel_bag->channel_group_create("Group2");
FCurve *fcu0 = &channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "Group0"});
FCurve *fcu1 = &channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "Group0"});
FCurve *fcu2 = &channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "Group2"});
FCurve *fcu3 = &channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "Group2"});
FCurve *fcu4 = &channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
FCurve &fcu0 = channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "Group0"});
FCurve &fcu1 = channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "Group0"});
FCurve &fcu2 = channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "Group2"});
FCurve &fcu3 = channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "Group2"});
FCurve &fcu4 = channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
ASSERT_EQ(3, channel_bag->channel_groups().size());
ASSERT_EQ(5, channel_bag->fcurves().size());
@@ -1040,108 +1040,108 @@ TEST_F(ChannelBagTest, channel_group_remove)
EXPECT_EQ(false, channel_bag->channel_group_remove(bogus));
ASSERT_EQ(3, channel_bag->channel_groups().size());
ASSERT_EQ(5, channel_bag->fcurves().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(group2, channel_bag->channel_group(2));
EXPECT_EQ(fcu0, channel_bag->fcurve(0));
EXPECT_EQ(fcu1, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(fcu3, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group2, fcu2->grp);
EXPECT_EQ(group2, fcu3->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(&group2, channel_bag->channel_group(2));
EXPECT_EQ(&fcu0, channel_bag->fcurve(0));
EXPECT_EQ(&fcu1, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu3, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group2, fcu2.grp);
EXPECT_EQ(&group2, fcu3.grp);
EXPECT_EQ(nullptr, fcu4.grp);
/* Removing an empty group shouldn't affect the fcurves at all. */
EXPECT_EQ(true, channel_bag->channel_group_remove(*group1));
EXPECT_EQ(true, channel_bag->channel_group_remove(group1));
ASSERT_EQ(2, channel_bag->channel_groups().size());
ASSERT_EQ(5, channel_bag->fcurves().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group2, channel_bag->channel_group(1));
EXPECT_EQ(fcu0, channel_bag->fcurve(0));
EXPECT_EQ(fcu1, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(fcu3, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group2, fcu2->grp);
EXPECT_EQ(group2, fcu3->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group2, channel_bag->channel_group(1));
EXPECT_EQ(&fcu0, channel_bag->fcurve(0));
EXPECT_EQ(&fcu1, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu3, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group2, fcu2.grp);
EXPECT_EQ(&group2, fcu3.grp);
EXPECT_EQ(nullptr, fcu4.grp);
/* Removing a group that's not at the end of the group array should move its
* fcurves to be just after the grouped fcurves. */
EXPECT_EQ(true, channel_bag->channel_group_remove(*group0));
EXPECT_EQ(true, channel_bag->channel_group_remove(group0));
ASSERT_EQ(1, channel_bag->channel_groups().size());
ASSERT_EQ(5, channel_bag->fcurves().size());
EXPECT_EQ(group2, channel_bag->channel_group(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(0));
EXPECT_EQ(fcu3, channel_bag->fcurve(1));
EXPECT_EQ(fcu0, channel_bag->fcurve(2));
EXPECT_EQ(fcu1, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(nullptr, fcu1->grp);
EXPECT_EQ(group2, fcu2->grp);
EXPECT_EQ(group2, fcu3->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(&group2, channel_bag->channel_group(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(0));
EXPECT_EQ(&fcu3, channel_bag->fcurve(1));
EXPECT_EQ(&fcu0, channel_bag->fcurve(2));
EXPECT_EQ(&fcu1, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(nullptr, fcu1.grp);
EXPECT_EQ(&group2, fcu2.grp);
EXPECT_EQ(&group2, fcu3.grp);
EXPECT_EQ(nullptr, fcu4.grp);
/* Removing a group at the end of the group array shouldn't move its
* fcurves. */
EXPECT_EQ(true, channel_bag->channel_group_remove(*group2));
EXPECT_EQ(true, channel_bag->channel_group_remove(group2));
ASSERT_EQ(0, channel_bag->channel_groups().size());
ASSERT_EQ(5, channel_bag->fcurves().size());
EXPECT_EQ(fcu2, channel_bag->fcurve(0));
EXPECT_EQ(fcu3, channel_bag->fcurve(1));
EXPECT_EQ(fcu0, channel_bag->fcurve(2));
EXPECT_EQ(fcu1, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(nullptr, fcu1->grp);
EXPECT_EQ(nullptr, fcu2->grp);
EXPECT_EQ(nullptr, fcu3->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(&fcu2, channel_bag->fcurve(0));
EXPECT_EQ(&fcu3, channel_bag->fcurve(1));
EXPECT_EQ(&fcu0, channel_bag->fcurve(2));
EXPECT_EQ(&fcu1, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(nullptr, fcu1.grp);
EXPECT_EQ(nullptr, fcu2.grp);
EXPECT_EQ(nullptr, fcu3.grp);
EXPECT_EQ(nullptr, fcu4.grp);
}
TEST_F(ChannelBagTest, channel_group_find)
{
bActionGroup *group0a = &channel_bag->channel_group_create("Foo");
bActionGroup *group1a = &channel_bag->channel_group_create("Bar");
bActionGroup *group2a = &channel_bag->channel_group_create("Yar");
bActionGroup &group0a = channel_bag->channel_group_create("Foo");
bActionGroup &group1a = channel_bag->channel_group_create("Bar");
bActionGroup &group2a = channel_bag->channel_group_create("Yar");
bActionGroup *group0b = channel_bag->channel_group_find("Foo");
bActionGroup *group1b = channel_bag->channel_group_find("Bar");
bActionGroup *group2b = channel_bag->channel_group_find("Yar");
EXPECT_EQ(group0a, group0b);
EXPECT_EQ(group1a, group1b);
EXPECT_EQ(group2a, group2b);
EXPECT_EQ(&group0a, group0b);
EXPECT_EQ(&group1a, group1b);
EXPECT_EQ(&group2a, group2b);
EXPECT_EQ(nullptr, channel_bag->channel_group_find("Wat"));
}
TEST_F(ChannelBagTest, channel_group_ensure)
{
bActionGroup *group0 = &channel_bag->channel_group_create("Foo");
bActionGroup *group1 = &channel_bag->channel_group_create("Bar");
bActionGroup &group0 = channel_bag->channel_group_create("Foo");
bActionGroup &group1 = channel_bag->channel_group_create("Bar");
EXPECT_EQ(channel_bag->channel_groups().size(), 2);
EXPECT_EQ(group0, &channel_bag->channel_group_ensure("Foo"));
EXPECT_EQ(&group0, &channel_bag->channel_group_ensure("Foo"));
EXPECT_EQ(channel_bag->channel_groups().size(), 2);
EXPECT_EQ(group1, &channel_bag->channel_group_ensure("Bar"));
EXPECT_EQ(&group1, &channel_bag->channel_group_ensure("Bar"));
EXPECT_EQ(channel_bag->channel_groups().size(), 2);
bActionGroup *group2 = &channel_bag->channel_group_ensure("Yar");
bActionGroup &group2 = channel_bag->channel_group_ensure("Yar");
ASSERT_EQ(channel_bag->channel_groups().size(), 3);
EXPECT_EQ(group2, channel_bag->channel_group(2));
EXPECT_EQ(&group2, channel_bag->channel_group(2));
}
TEST_F(ChannelBagTest, channel_group_fcurve_creation)
{
FCurve *fcu0 = &channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, std::nullopt});
FCurve &fcu0 = channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, std::nullopt});
EXPECT_EQ(1, channel_bag->fcurves().size());
EXPECT_TRUE(channel_bag->channel_groups().is_empty());
@@ -1150,387 +1150,387 @@ TEST_F(ChannelBagTest, channel_group_fcurve_creation)
* created if it doesn't already exist. */
channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
EXPECT_EQ(1, channel_bag->fcurves().size());
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_TRUE(channel_bag->channel_groups().is_empty());
/* Creating a new fcurve with a channel group in the fcurve descriptor should
* create the group and put the fcurve in it. This also implies that the
* fcurve will be added before any non-grouped fcurves in the array. */
FCurve *fcu1 = &channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
FCurve &fcu1 = channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
ASSERT_EQ(2, channel_bag->fcurves().size());
ASSERT_EQ(1, channel_bag->channel_groups().size());
bActionGroup *group0 = channel_bag->channel_group(0);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu0, channel_bag->fcurve(1));
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
bActionGroup &group0 = *channel_bag->channel_group(0);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu0, channel_bag->fcurve(1));
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
/* Creating a new fcurve with a second channel group in the fcurve descriptor
* should create the group and put the fcurve in it. This also implies that
* the fcurve will be added before non-grouped fcurves, but after other
* grouped ones. */
FCurve *fcu2 = &channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve &fcu2 = channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
ASSERT_EQ(3, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
bActionGroup *group1 = channel_bag->channel_group(1);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu0, channel_bag->fcurve(2));
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
bActionGroup &group1 = *channel_bag->channel_group(1);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu0, channel_bag->fcurve(2));
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
/* Creating a new fcurve with the first channel group again should put it at
* the end of that group. */
FCurve *fcu3 = &channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group0"});
FCurve &fcu3 = channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group0"});
ASSERT_EQ(4, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu3, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(fcu0, channel_bag->fcurve(3));
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group0, fcu3->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu3, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu0, channel_bag->fcurve(3));
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group0, fcu3.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
/* Finally, creating a new fcurve with the second channel group again should
* also put it at the end of that group. */
FCurve *fcu4 = &channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, "group1"});
FCurve &fcu4 = channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, "group1"});
ASSERT_EQ(5, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu3, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(fcu4, channel_bag->fcurve(3));
EXPECT_EQ(fcu0, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group0, fcu3->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(group1, fcu4->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu3, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu4, channel_bag->fcurve(3));
EXPECT_EQ(&fcu0, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group0, fcu3.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(&group1, fcu4.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
}
TEST_F(ChannelBagTest, channel_group_fcurve_removal)
{
FCurve *fcu0 = &channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve *fcu1 = &channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
FCurve *fcu2 = &channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve *fcu3 = &channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group1"});
FCurve *fcu4 = &channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
FCurve &fcu0 = channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve &fcu1 = channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
FCurve &fcu2 = channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve &fcu3 = channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group1"});
FCurve &fcu4 = channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
ASSERT_EQ(5, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
bActionGroup *group0 = channel_bag->channel_group(0);
bActionGroup *group1 = channel_bag->channel_group(1);
bActionGroup &group0 = *channel_bag->channel_group(0);
bActionGroup &group1 = *channel_bag->channel_group(1);
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(group1, fcu3->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(&group1, fcu3.grp);
EXPECT_EQ(nullptr, fcu4.grp);
channel_bag->fcurve_remove(*fcu3);
channel_bag->fcurve_remove(fcu3);
ASSERT_EQ(4, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu4.grp);
channel_bag->fcurve_remove(*fcu0);
channel_bag->fcurve_remove(fcu0);
ASSERT_EQ(3, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu4.grp);
channel_bag->fcurve_remove(*fcu1);
channel_bag->fcurve_remove(fcu1);
ASSERT_EQ(2, channel_bag->fcurves().size());
ASSERT_EQ(1, channel_bag->channel_groups().size());
EXPECT_EQ(group1, channel_bag->channel_group(0));
EXPECT_EQ(0, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(&group1, channel_bag->channel_group(0));
EXPECT_EQ(0, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu4.grp);
channel_bag->fcurve_remove(*fcu4);
channel_bag->fcurve_remove(fcu4);
ASSERT_EQ(1, channel_bag->fcurves().size());
ASSERT_EQ(1, channel_bag->channel_groups().size());
EXPECT_EQ(group1, channel_bag->channel_group(0));
EXPECT_EQ(0, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(&group1, channel_bag->channel_group(0));
EXPECT_EQ(0, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
EXPECT_EQ(&group1, fcu2.grp);
channel_bag->fcurve_remove(*fcu2);
channel_bag->fcurve_remove(fcu2);
ASSERT_EQ(0, channel_bag->fcurves().size());
ASSERT_EQ(0, channel_bag->channel_groups().size());
}
TEST_F(ChannelBagTest, channel_group_move)
{
FCurve *fcu0 = &channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve *fcu1 = &channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group1"});
FCurve *fcu2 = &channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve *fcu3 = &channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group2"});
FCurve *fcu4 = &channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
FCurve &fcu0 = channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve &fcu1 = channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group1"});
FCurve &fcu2 = channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve &fcu3 = channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group2"});
FCurve &fcu4 = channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
ASSERT_EQ(5, channel_bag->fcurves().size());
ASSERT_EQ(3, channel_bag->channel_groups().size());
bActionGroup *group0 = channel_bag->channel_group(0);
bActionGroup *group1 = channel_bag->channel_group(1);
bActionGroup *group2 = channel_bag->channel_group(2);
bActionGroup &group0 = *channel_bag->channel_group(0);
bActionGroup &group1 = *channel_bag->channel_group(1);
bActionGroup &group2 = *channel_bag->channel_group(2);
channel_bag->channel_group_move(*group0, 2);
EXPECT_EQ(group1, channel_bag->channel_group(0));
EXPECT_EQ(group2, channel_bag->channel_group(1));
EXPECT_EQ(group0, channel_bag->channel_group(2));
EXPECT_EQ(0, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(2, group2->fcurve_range_start);
EXPECT_EQ(1, group2->fcurve_range_length);
EXPECT_EQ(3, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu3, channel_bag->fcurve(2));
EXPECT_EQ(fcu0, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(group1, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(group2, fcu3->grp);
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(nullptr, fcu4->grp);
channel_bag->channel_group_move(group0, 2);
EXPECT_EQ(&group1, channel_bag->channel_group(0));
EXPECT_EQ(&group2, channel_bag->channel_group(1));
EXPECT_EQ(&group0, channel_bag->channel_group(2));
EXPECT_EQ(0, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(2, group2.fcurve_range_start);
EXPECT_EQ(1, group2.fcurve_range_length);
EXPECT_EQ(3, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu3, channel_bag->fcurve(2));
EXPECT_EQ(&fcu0, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(&group1, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(&group2, fcu3.grp);
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(nullptr, fcu4.grp);
channel_bag->channel_group_move(*group1, 1);
EXPECT_EQ(group2, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(group0, channel_bag->channel_group(2));
EXPECT_EQ(0, group2->fcurve_range_start);
EXPECT_EQ(1, group2->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(3, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(fcu3, channel_bag->fcurve(0));
EXPECT_EQ(fcu1, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(fcu0, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(group2, fcu3->grp);
EXPECT_EQ(group1, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(nullptr, fcu4->grp);
channel_bag->channel_group_move(group1, 1);
EXPECT_EQ(&group2, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(&group0, channel_bag->channel_group(2));
EXPECT_EQ(0, group2.fcurve_range_start);
EXPECT_EQ(1, group2.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(3, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(&fcu3, channel_bag->fcurve(0));
EXPECT_EQ(&fcu1, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu0, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(&group2, fcu3.grp);
EXPECT_EQ(&group1, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(nullptr, fcu4.grp);
channel_bag->channel_group_move(*group0, 0);
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group2, channel_bag->channel_group(1));
EXPECT_EQ(group1, channel_bag->channel_group(2));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group2->fcurve_range_start);
EXPECT_EQ(1, group2->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(fcu0, channel_bag->fcurve(0));
EXPECT_EQ(fcu3, channel_bag->fcurve(1));
EXPECT_EQ(fcu1, channel_bag->fcurve(2));
EXPECT_EQ(fcu2, channel_bag->fcurve(3));
EXPECT_EQ(fcu4, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu0->grp);
EXPECT_EQ(group2, fcu3->grp);
EXPECT_EQ(group1, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu4->grp);
channel_bag->channel_group_move(group0, 0);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group2, channel_bag->channel_group(1));
EXPECT_EQ(&group1, channel_bag->channel_group(2));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group2.fcurve_range_start);
EXPECT_EQ(1, group2.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(&fcu0, channel_bag->fcurve(0));
EXPECT_EQ(&fcu3, channel_bag->fcurve(1));
EXPECT_EQ(&fcu1, channel_bag->fcurve(2));
EXPECT_EQ(&fcu2, channel_bag->fcurve(3));
EXPECT_EQ(&fcu4, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu0.grp);
EXPECT_EQ(&group2, fcu3.grp);
EXPECT_EQ(&group1, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu4.grp);
}
TEST_F(ChannelBagTest, channel_group_move_fcurve_into)
{
FCurve *fcu0 = &channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, std::nullopt});
FCurve *fcu1 = &channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, std::nullopt});
FCurve *fcu2 = &channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, std::nullopt});
bActionGroup *group0 = &channel_bag->channel_group_create("group0");
bActionGroup *group1 = &channel_bag->channel_group_create("group1");
FCurve &fcu0 = channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, std::nullopt});
FCurve &fcu1 = channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, std::nullopt});
FCurve &fcu2 = channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, std::nullopt});
bActionGroup &group0 = channel_bag->channel_group_create("group0");
bActionGroup &group1 = channel_bag->channel_group_create("group1");
ASSERT_EQ(3, channel_bag->fcurves().size());
EXPECT_EQ(fcu0, channel_bag->fcurve(0));
EXPECT_EQ(fcu1, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(&fcu0, channel_bag->fcurve(0));
EXPECT_EQ(&fcu1, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
ASSERT_EQ(2, channel_bag->channel_groups().size());
EXPECT_EQ(group0, channel_bag->channel_group(0));
EXPECT_EQ(group1, channel_bag->channel_group(1));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(0, group0->fcurve_range_length);
EXPECT_EQ(0, group1->fcurve_range_start);
EXPECT_EQ(0, group1->fcurve_range_length);
EXPECT_EQ(&group0, channel_bag->channel_group(0));
EXPECT_EQ(&group1, channel_bag->channel_group(1));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(0, group0.fcurve_range_length);
EXPECT_EQ(0, group1.fcurve_range_start);
EXPECT_EQ(0, group1.fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(*fcu2, *group1);
EXPECT_EQ(fcu2, channel_bag->fcurve(0));
EXPECT_EQ(fcu0, channel_bag->fcurve(1));
EXPECT_EQ(fcu1, channel_bag->fcurve(2));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(0, group0->fcurve_range_length);
EXPECT_EQ(0, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(fcu2, group1);
EXPECT_EQ(&fcu2, channel_bag->fcurve(0));
EXPECT_EQ(&fcu0, channel_bag->fcurve(1));
EXPECT_EQ(&fcu1, channel_bag->fcurve(2));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(0, group0.fcurve_range_length);
EXPECT_EQ(0, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(*fcu1, *group0);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu0, channel_bag->fcurve(2));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(fcu1, group0);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu0, channel_bag->fcurve(2));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(*fcu0, *group1);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu0, channel_bag->fcurve(2));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(fcu0, group1);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu0, channel_bag->fcurve(2));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(*fcu0, *group0);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu0, channel_bag->fcurve(1));
EXPECT_EQ(fcu2, channel_bag->fcurve(2));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(2, group0->fcurve_range_length);
EXPECT_EQ(2, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(fcu0, group0);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu0, channel_bag->fcurve(1));
EXPECT_EQ(&fcu2, channel_bag->fcurve(2));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(2, group0.fcurve_range_length);
EXPECT_EQ(2, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(*fcu1, *group1);
EXPECT_EQ(fcu0, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu1, channel_bag->fcurve(2));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
channel_bag->fcurve_assign_to_channel_group(fcu1, group1);
EXPECT_EQ(&fcu0, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu1, channel_bag->fcurve(2));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
}
TEST_F(ChannelBagTest, channel_group_fcurve_ungroup)
{
FCurve *fcu0 = &channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve *fcu1 = &channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
FCurve *fcu2 = &channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve *fcu3 = &channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group1"});
FCurve *fcu4 = &channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
FCurve &fcu0 = channel_bag->fcurve_ensure(nullptr, {"fcu0", 0, std::nullopt, "group0"});
FCurve &fcu1 = channel_bag->fcurve_ensure(nullptr, {"fcu1", 0, std::nullopt, "group0"});
FCurve &fcu2 = channel_bag->fcurve_ensure(nullptr, {"fcu2", 0, std::nullopt, "group1"});
FCurve &fcu3 = channel_bag->fcurve_ensure(nullptr, {"fcu3", 0, std::nullopt, "group1"});
FCurve &fcu4 = channel_bag->fcurve_ensure(nullptr, {"fcu4", 0, std::nullopt, std::nullopt});
ASSERT_EQ(5, channel_bag->fcurves().size());
ASSERT_EQ(2, channel_bag->channel_groups().size());
bActionGroup *group0 = channel_bag->channel_group(0);
bActionGroup *group1 = channel_bag->channel_group(1);
bActionGroup &group0 = *channel_bag->channel_group(0);
bActionGroup &group1 = *channel_bag->channel_group(1);
/* Attempting to ungroup an fcurve that's not in the channel bag should fail. */
FCurve bogus = {};
EXPECT_FALSE(channel_bag->fcurve_ungroup(bogus));
/* Attempting to ungroup an fcurve that's already ungrouped is fine. */
EXPECT_TRUE(channel_bag->fcurve_ungroup(*fcu4));
EXPECT_TRUE(channel_bag->fcurve_ungroup(fcu4));
/* Ungroup each fcurve until all are ungrouped. */
EXPECT_TRUE(channel_bag->fcurve_ungroup(*fcu0));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(2, group1->fcurve_range_length);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu3, channel_bag->fcurve(2));
EXPECT_EQ(fcu4, channel_bag->fcurve(3));
EXPECT_EQ(fcu0, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(group1, fcu3->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_TRUE(channel_bag->fcurve_ungroup(fcu0));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(2, group1.fcurve_range_length);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu3, channel_bag->fcurve(2));
EXPECT_EQ(&fcu4, channel_bag->fcurve(3));
EXPECT_EQ(&fcu0, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(&group1, fcu3.grp);
EXPECT_EQ(nullptr, fcu4.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_TRUE(channel_bag->fcurve_ungroup(*fcu3));
EXPECT_EQ(0, group0->fcurve_range_start);
EXPECT_EQ(1, group0->fcurve_range_length);
EXPECT_EQ(1, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(fcu1, channel_bag->fcurve(0));
EXPECT_EQ(fcu2, channel_bag->fcurve(1));
EXPECT_EQ(fcu4, channel_bag->fcurve(2));
EXPECT_EQ(fcu0, channel_bag->fcurve(3));
EXPECT_EQ(fcu3, channel_bag->fcurve(4));
EXPECT_EQ(group0, fcu1->grp);
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(nullptr, fcu3->grp);
EXPECT_TRUE(channel_bag->fcurve_ungroup(fcu3));
EXPECT_EQ(0, group0.fcurve_range_start);
EXPECT_EQ(1, group0.fcurve_range_length);
EXPECT_EQ(1, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
EXPECT_EQ(&fcu1, channel_bag->fcurve(0));
EXPECT_EQ(&fcu2, channel_bag->fcurve(1));
EXPECT_EQ(&fcu4, channel_bag->fcurve(2));
EXPECT_EQ(&fcu0, channel_bag->fcurve(3));
EXPECT_EQ(&fcu3, channel_bag->fcurve(4));
EXPECT_EQ(&group0, fcu1.grp);
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu4.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(nullptr, fcu3.grp);
EXPECT_TRUE(channel_bag->fcurve_ungroup(*fcu1));
EXPECT_TRUE(channel_bag->fcurve_ungroup(fcu1));
EXPECT_EQ(1, channel_bag->channel_groups().size());
EXPECT_EQ(group1, channel_bag->channel_group(0));
EXPECT_EQ(0, group1->fcurve_range_start);
EXPECT_EQ(1, group1->fcurve_range_length);
EXPECT_EQ(fcu2, channel_bag->fcurve(0));
EXPECT_EQ(fcu4, channel_bag->fcurve(1));
EXPECT_EQ(fcu0, channel_bag->fcurve(2));
EXPECT_EQ(fcu3, channel_bag->fcurve(3));
EXPECT_EQ(fcu1, channel_bag->fcurve(4));
EXPECT_EQ(group1, fcu2->grp);
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(nullptr, fcu3->grp);
EXPECT_EQ(nullptr, fcu1->grp);
EXPECT_EQ(&group1, channel_bag->channel_group(0));
EXPECT_EQ(0, group1.fcurve_range_start);
EXPECT_EQ(1, group1.fcurve_range_length);
EXPECT_EQ(&fcu2, channel_bag->fcurve(0));
EXPECT_EQ(&fcu4, channel_bag->fcurve(1));
EXPECT_EQ(&fcu0, channel_bag->fcurve(2));
EXPECT_EQ(&fcu3, channel_bag->fcurve(3));
EXPECT_EQ(&fcu1, channel_bag->fcurve(4));
EXPECT_EQ(&group1, fcu2.grp);
EXPECT_EQ(nullptr, fcu4.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(nullptr, fcu3.grp);
EXPECT_EQ(nullptr, fcu1.grp);
EXPECT_TRUE(channel_bag->fcurve_ungroup(*fcu2));
EXPECT_TRUE(channel_bag->fcurve_ungroup(fcu2));
EXPECT_EQ(0, channel_bag->channel_groups().size());
EXPECT_EQ(fcu4, channel_bag->fcurve(0));
EXPECT_EQ(fcu0, channel_bag->fcurve(1));
EXPECT_EQ(fcu3, channel_bag->fcurve(2));
EXPECT_EQ(fcu1, channel_bag->fcurve(3));
EXPECT_EQ(fcu2, channel_bag->fcurve(4));
EXPECT_EQ(nullptr, fcu4->grp);
EXPECT_EQ(nullptr, fcu0->grp);
EXPECT_EQ(nullptr, fcu3->grp);
EXPECT_EQ(nullptr, fcu1->grp);
EXPECT_EQ(nullptr, fcu2->grp);
EXPECT_EQ(&fcu4, channel_bag->fcurve(0));
EXPECT_EQ(&fcu0, channel_bag->fcurve(1));
EXPECT_EQ(&fcu3, channel_bag->fcurve(2));
EXPECT_EQ(&fcu1, channel_bag->fcurve(3));
EXPECT_EQ(&fcu2, channel_bag->fcurve(4));
EXPECT_EQ(nullptr, fcu4.grp);
EXPECT_EQ(nullptr, fcu0.grp);
EXPECT_EQ(nullptr, fcu3.grp);
EXPECT_EQ(nullptr, fcu1.grp);
EXPECT_EQ(nullptr, fcu2.grp);
}
} // namespace blender::animrig::tests