fernandotonon/QtMeshEditor

View on GitHub
src/Assimp/BoneProcessor_test.cpp

Summary

Maintainability
Test Coverage
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "BoneProcessor.h"
 
class BoneProcessorTest : public ::testing::Test {
protected:
std::unique_ptr<Ogre::Root> ogreRoot;
Ogre::SkeletonPtr mockSkeleton;
BoneProcessor processor;
 
aiScene mockScene;
 
The function `SetUp` is never used.
void SetUp() override {
ogreRoot = std::make_unique<Ogre::Root>();
mockSkeleton = Ogre::SkeletonManager::getSingleton().create("MockSkeleton", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, true);
processor = BoneProcessor();
// Set up mockScene and mockMesh here if necessary
}
 
The function `TearDown` is never used.
void TearDown() override {
// Cleanup code if needed
}
};
 
TEST_F(BoneProcessorTest, CreateBones) {
mockScene.mNumMeshes = 1;
mockScene.mMeshes = new aiMesh*[1];
mockScene.mMeshes[0] = new aiMesh();
mockScene.mMeshes[0]->mNumBones = 2;
mockScene.mMeshes[0]->mBones = new aiBone*[2];
mockScene.mMeshes[0]->mBones[0] = new aiBone();
mockScene.mMeshes[0]->mBones[1] = new aiBone();
mockScene.mMeshes[0]->mBones[0]->mName = aiString("Bone1");
mockScene.mMeshes[0]->mBones[1]->mName = aiString("Bone2");
mockScene.mMeshes[0]->mBones[0]->mOffsetMatrix = aiMatrix4x4();
mockScene.mMeshes[0]->mBones[1]->mOffsetMatrix = aiMatrix4x4();
mockScene.mRootNode = new aiNode();
mockScene.mRootNode->mName = aiString("Root");
mockScene.mRootNode->mTransformation = aiMatrix4x4();
mockScene.mRootNode->mNumChildren = 2;
mockScene.mRootNode->mChildren = new aiNode*[2];
mockScene.mRootNode->mChildren[0] = new aiNode();
mockScene.mRootNode->mChildren[1] = new aiNode();
mockScene.mRootNode->mChildren[0]->mName = aiString("Bone1");
mockScene.mRootNode->mChildren[1]->mName = aiString("Bone2");
mockScene.mRootNode->mChildren[0]->mTransformation = aiMatrix4x4();
mockScene.mRootNode->mChildren[1]->mTransformation = aiMatrix4x4();
mockScene.mMeshes[0]->mBones[0]->mNode = mockScene.mRootNode->mChildren[0];
mockScene.mMeshes[0]->mBones[1]->mNode = mockScene.mRootNode->mChildren[1];
 
processor.processBones(mockSkeleton, &mockScene);
 
EXPECT_TRUE(mockSkeleton->hasBone("Bone1"));
EXPECT_TRUE(mockSkeleton->hasBone("Bone2"));
EXPECT_FALSE(mockSkeleton->hasBone("Bone3"));
 
// Running processBones again
processor.processBones(mockSkeleton, &mockScene);
 
// Assuming 2 bones were already present in the skeleton
const size_t expectedBoneCount = 2;
EXPECT_EQ(mockSkeleton->getNumBones(), expectedBoneCount);
}
 
TEST_F(BoneProcessorTest, BoneHierarchy) {
mockScene.mNumMeshes = 1;
mockScene.mMeshes = new aiMesh*[1];
mockScene.mMeshes[0] = new aiMesh();
mockScene.mMeshes[0]->mNumBones = 1;
mockScene.mMeshes[0]->mBones = new aiBone*[1];
 
auto parentBone = std::make_unique<aiBone>();
aiBone* childBone = new aiBone();
parentBone->mOffsetMatrix = aiMatrix4x4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
childBone->mOffsetMatrix = aiMatrix4x4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
parentBone->mName = aiString("RootBone");
childBone->mName = aiString("ChildBone");
 
aiNode* parentNode = new aiNode();
aiNode* childNode = new aiNode();
 
parentNode->mName = aiString("RootBone");
parentNode->mNumChildren = 1;
parentNode->mChildren = new aiNode*[1];
parentNode->mChildren[0] = childNode;
parentBone->mNode = parentNode;
 
childNode->mName = aiString("ChildBone");
childNode->mParent = parentNode;
childBone->mNode = childNode;
 
mockScene.mMeshes[0]->mBones[0] = childBone;
 
mockScene.mRootNode = parentNode;
mockScene.mRootNode->mTransformation = aiMatrix4x4();
 
processor.processBones(mockSkeleton, &mockScene);
 
EXPECT_EQ(mockSkeleton->getBone("ChildBone")->getParent(), mockSkeleton->getBone("RootBone"));
}
 
 
TEST_F(BoneProcessorTest, BoneTransformation) {
aiNode* rootNode = new aiNode();
rootNode->mName = aiString("RootBone");
aiBone* mockBone = new aiBone();
mockBone->mName = aiString("TestBone");
aiNode* mockNode = new aiNode();
 
mockNode->mName = aiString("TestBone");
mockBone->mNode = mockNode;
mockNode->mParent = rootNode;
 
aiMatrix4x4 mockOffsetMatrix(
1, 0, 0, -2,
0, 2, 0, -6,
0, 0, 1, -4,
0, 0, 0, 1
);
 
mockBone->mOffsetMatrix = mockOffsetMatrix;
 
mockScene.mNumMeshes = 1;
mockScene.mMeshes = new aiMesh*[1];
mockScene.mMeshes[0] = new aiMesh();
mockScene.mMeshes[0]->mNumBones = 1;
mockScene.mMeshes[0]->mBones = new aiBone*[1];
mockScene.mMeshes[0]->mBones[0] = mockBone;
 
mockScene.mRootNode = rootNode;
mockScene.mRootNode->mTransformation = aiMatrix4x4();
mockScene.mRootNode->mNumChildren = 1;
mockScene.mRootNode->mChildren = new aiNode*[1];
mockScene.mRootNode->mChildren[0] = mockNode;
 
processor.processBones(mockSkeleton, &mockScene);
 
Ogre::Bone* testBone = mockSkeleton->getBone("TestBone");
 
Ogre::Vector3 expectedPosition(2, 3, 4);
Ogre::Quaternion expectedOrientation(1, 0, 0, 0); // No rotation, so it's an identity quaternion
Ogre::Vector3 expectedScale(1, 0.5, 1);
 
EXPECT_EQ(testBone->getPosition(), expectedPosition);
EXPECT_EQ(testBone->getOrientation(), expectedOrientation);
EXPECT_EQ(testBone->getScale(), expectedScale);
}