Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/armature_test.cc')
-rw-r--r--source/blender/blenkernel/intern/armature_test.cc81
1 files changed, 80 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/armature_test.cc b/source/blender/blenkernel/intern/armature_test.cc
index 589337d9d01..47853deec3e 100644
--- a/source/blender/blenkernel/intern/armature_test.cc
+++ b/source/blender/blenkernel/intern/armature_test.cc
@@ -17,10 +17,13 @@
* All rights reserved.
*/
-#include "BKE_armature.h"
+#include "BKE_armature.hh"
+#include "BLI_listbase.h"
#include "BLI_math.h"
+#include "DNA_armature_types.h"
+
#include "testing/testing.h"
namespace blender::bke::tests {
@@ -157,4 +160,80 @@ TEST(vec_roll_to_mat3_normalized, Rotationmatrix)
}
}
+class BKE_armature_find_selected_bones_test : public testing::Test {
+ protected:
+ bArmature arm;
+ Bone bone1, bone2, bone3;
+
+ void SetUp() override
+ {
+ strcpy(bone1.name, "bone1");
+ strcpy(bone2.name, "bone2");
+ strcpy(bone3.name, "bone3");
+
+ arm.bonebase = {nullptr, nullptr};
+ bone1.childbase = {nullptr, nullptr};
+ bone2.childbase = {nullptr, nullptr};
+ bone3.childbase = {nullptr, nullptr};
+
+ BLI_addtail(&arm.bonebase, &bone1); // bone1 is root bone
+ BLI_addtail(&arm.bonebase, &bone2); // bone2 is root bone
+ BLI_addtail(&bone2.childbase, &bone3); // bone3 has bone2 as parent
+
+ // Make sure the armature & its bones are visible, to make them selectable.
+ arm.layer = bone1.layer = bone2.layer = bone3.layer = 1;
+ }
+};
+
+TEST_F(BKE_armature_find_selected_bones_test, some_bones_selected)
+{
+ bone1.flag = BONE_SELECTED;
+ bone2.flag = 0;
+ bone3.flag = BONE_SELECTED;
+
+ std::vector<Bone *> seen_bones;
+ auto callback = [&](Bone *bone) { seen_bones.push_back(bone); };
+
+ SelectedBonesResult result = BKE_armature_find_selected_bones(&arm, callback);
+
+ ASSERT_EQ(seen_bones.size(), 2) << "Expected 2 selected bones, got " << seen_bones.size();
+ EXPECT_EQ(seen_bones[0], &bone1);
+ EXPECT_EQ(seen_bones[1], &bone3);
+
+ EXPECT_FALSE(result.all_bones_selected); // Bone 2 was not selected.
+ EXPECT_FALSE(result.no_bones_selected); // Bones 1 and 3 were selected.
+}
+
+TEST_F(BKE_armature_find_selected_bones_test, no_bones_selected)
+{
+ bone1.flag = bone2.flag = bone3.flag = 0;
+
+ std::vector<Bone *> seen_bones;
+ auto callback = [&](Bone *bone) { seen_bones.push_back(bone); };
+
+ SelectedBonesResult result = BKE_armature_find_selected_bones(&arm, callback);
+
+ EXPECT_TRUE(seen_bones.empty()) << "Expected no selected bones, got " << seen_bones.size();
+ EXPECT_FALSE(result.all_bones_selected);
+ EXPECT_TRUE(result.no_bones_selected);
+}
+
+TEST_F(BKE_armature_find_selected_bones_test, all_bones_selected)
+{
+ bone1.flag = bone2.flag = bone3.flag = BONE_SELECTED;
+
+ std::vector<Bone *> seen_bones;
+ auto callback = [&](Bone *bone) { seen_bones.push_back(bone); };
+
+ SelectedBonesResult result = BKE_armature_find_selected_bones(&arm, callback);
+
+ ASSERT_EQ(seen_bones.size(), 3) << "Expected 3 selected bones, got " << seen_bones.size();
+ EXPECT_EQ(seen_bones[0], &bone1);
+ EXPECT_EQ(seen_bones[1], &bone2);
+ EXPECT_EQ(seen_bones[2], &bone3);
+
+ EXPECT_TRUE(result.all_bones_selected);
+ EXPECT_FALSE(result.no_bones_selected);
+}
+
} // namespace blender::bke::tests