diff --git a/UnitTests~/EasySetupOutfit/PreferFirstHipsMatch.cs b/UnitTests~/EasySetupOutfit/HipsMatchTest.cs similarity index 54% rename from UnitTests~/EasySetupOutfit/PreferFirstHipsMatch.cs rename to UnitTests~/EasySetupOutfit/HipsMatchTest.cs index 717e5332..46195fcf 100644 --- a/UnitTests~/EasySetupOutfit/PreferFirstHipsMatch.cs +++ b/UnitTests~/EasySetupOutfit/HipsMatchTest.cs @@ -4,7 +4,7 @@ using nadena.dev.modular_avatar.core.editor; using NUnit.Framework; using UnityEngine; -public class PreferFirstHipsMatch : TestBase +public class HipsMatchTest : TestBase { [Test] public void SetupHeuristicPrefersFirstHipsMatch() @@ -21,7 +21,28 @@ public class PreferFirstHipsMatch : TestBase var outfit = CreateChild(root, "Outfit"); var outfit_armature = CreateChild(outfit, "Armature"); var outfit_hips = CreateChild(outfit_armature, "Hips"); - + + Assert.IsTrue(SetupOutfit.FindBones(outfit, out var det_av_root, out var det_av_hips, out var det_outfit_hips)); + Assert.AreSame(root, det_av_root); + Assert.AreSame(root_hips, det_av_hips); + Assert.AreSame(outfit_hips, det_outfit_hips); + } + + [Test] + public void TestOutfitDeepHipsMatch() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_hips = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips).gameObject; + root_hips.name = "hip"; + + var outfit = CreateChild(root, "Outfit"); + var outfit_armature = CreateChild(outfit, "armature"); + var outfit_armature2 = CreateChild(outfit_armature, "armature2"); + var outfit_hips = CreateChild(outfit_armature2, "hips"); + Assert.IsTrue(SetupOutfit.FindBones(outfit, out var det_av_root, out var det_av_hips, out var det_outfit_hips)); Assert.AreSame(root, det_av_root); Assert.AreSame(root_hips, det_av_hips); diff --git a/UnitTests~/EasySetupOutfit/PreferFirstHipsMatch.cs.meta b/UnitTests~/EasySetupOutfit/HipsMatchTest.cs.meta similarity index 100% rename from UnitTests~/EasySetupOutfit/PreferFirstHipsMatch.cs.meta rename to UnitTests~/EasySetupOutfit/HipsMatchTest.cs.meta diff --git a/UnitTests~/EasySetupOutfit/InferPrefixSuffixTest.cs b/UnitTests~/EasySetupOutfit/InferPrefixSuffixTest.cs new file mode 100644 index 00000000..24c96a52 --- /dev/null +++ b/UnitTests~/EasySetupOutfit/InferPrefixSuffixTest.cs @@ -0,0 +1,108 @@ +using modular_avatar_tests; +using nadena.dev.modular_avatar.core; +using NUnit.Framework; +using UnityEngine; + +public class InferPrefixSuffixTest : TestBase +{ + [Test] + public void TestNoPrefixSuffix() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_hips = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips); + root_hips.name = "hip"; + + var outfit = CreateChild(root, "Outfit"); + var outfit_armature = CreateChild(outfit, "armature"); + var outfit_hips = CreateChild(outfit_armature, "hips"); + + var outfit_mama = outfit_armature.AddComponent(); + outfit_mama.mergeTarget = new AvatarObjectReference(); + outfit_mama.mergeTarget.referencePath = RuntimeUtil.RelativePath(root, root_hips.parent.gameObject); + outfit_mama.LockMode = ArmatureLockMode.BaseToMerge; + + outfit_mama.InferPrefixSuffix(); + + Assert.AreEqual("", outfit_mama.prefix); + Assert.AreEqual("", outfit_mama.suffix); + } + + [Test] + public void TestDifferentHipsName() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_hips = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips); + root_hips.name = "hip"; + + var outfit = CreateChild(root, "Outfit"); + var outfit_armature = CreateChild(outfit, "armature"); + var outfit_hips = CreateChild(outfit_armature, "pre_Hips.suf"); + + var outfit_mama = outfit_armature.AddComponent(); + outfit_mama.mergeTarget = new AvatarObjectReference(); + outfit_mama.mergeTarget.referencePath = RuntimeUtil.RelativePath(root, root_hips.parent.gameObject); + outfit_mama.LockMode = ArmatureLockMode.BaseToMerge; + + outfit_mama.InferPrefixSuffix(); + + Assert.AreEqual("pre_", outfit_mama.prefix); + Assert.AreEqual(".suf", outfit_mama.suffix); + } + + [Test] + public void TestSameHipsName_Success() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_hips = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips); + root_hips.name = "TEST_HI"; + + var outfit = CreateChild(root, "Outfit"); + var outfit_armature = CreateChild(outfit, "armature"); + var outfit_hips = CreateChild(outfit_armature, "pre_TEST_HI2.suf"); // Make it a little bit different name to confirm it matches the current implementation + + var outfit_mama = outfit_armature.AddComponent(); + outfit_mama.mergeTarget = new AvatarObjectReference(); + outfit_mama.mergeTarget.referencePath = RuntimeUtil.RelativePath(root, root_hips.parent.gameObject); + outfit_mama.LockMode = ArmatureLockMode.BaseToMerge; + + outfit_mama.InferPrefixSuffix(); + + Assert.AreEqual("pre_", outfit_mama.prefix); + Assert.AreEqual("2.suf", outfit_mama.suffix); + } + + [Test] + public void TestSameHipsName_Fail() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_hips = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips); + root_hips.name = "TE_HIPS_ST"; + + var outfit = CreateChild(root, "Outfit"); + var outfit_armature = CreateChild(outfit, "armature"); + var outfit_hips = CreateChild(outfit_armature, "pre_TE_HIPS_ST.suf"); + + var outfit_mama = outfit_armature.AddComponent(); + outfit_mama.mergeTarget = new AvatarObjectReference(); + outfit_mama.mergeTarget.referencePath = RuntimeUtil.RelativePath(root, root_hips.parent.gameObject); + outfit_mama.LockMode = ArmatureLockMode.BaseToMerge; + + outfit_mama.InferPrefixSuffix(); + + // Current(v1.10.x) InferPrefixSuffix fail to infer prefix/suffix when avatar has unique prefix/suffix and outfit has their name + Assert.AreNotEqual("pre_", outfit_mama.prefix); + Assert.AreNotEqual(".suf", outfit_mama.suffix); + } +} diff --git a/UnitTests~/EasySetupOutfit/InferPrefixSuffixTest.cs.meta b/UnitTests~/EasySetupOutfit/InferPrefixSuffixTest.cs.meta new file mode 100644 index 00000000..8fd3b1c4 --- /dev/null +++ b/UnitTests~/EasySetupOutfit/InferPrefixSuffixTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 426df05704d87424baeb85496181868d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnitTests~/EasySetupOutfit/SetupOutfitRenameTest.cs b/UnitTests~/EasySetupOutfit/SetupOutfitRenameTest.cs new file mode 100644 index 00000000..36d85f34 --- /dev/null +++ b/UnitTests~/EasySetupOutfit/SetupOutfitRenameTest.cs @@ -0,0 +1,71 @@ +using modular_avatar_tests; +using nadena.dev.modular_avatar.core; +using nadena.dev.modular_avatar.core.editor; +using NUnit.Framework; +using UnityEngine; + +public class SetupOutfitRenameTest : TestBase +{ + [Test] + public void TestSetupHumanoidOutfit() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_chest = root.GetComponent().GetBoneTransform(HumanBodyBones.Chest); + + var outfit = CreateCommonPrefab("shapell.fbx"); + outfit.transform.SetParent(root.transform); + var outfit_chest = outfit.GetComponent().GetBoneTransform(HumanBodyBones.Chest); + outfit_chest.name = "c"; + + SetupOutfit.SetupOutfitUI(outfit); + + Assert.AreEqual(root_chest.name, outfit_chest.name); + } + + [Test] + public void TestSetupUpperChestOutfit() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_armature = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips).parent.gameObject; + var root_chest = root.GetComponent().GetBoneTransform(HumanBodyBones.Chest).gameObject; + + var outfit = CreateChild(root, "Outfit"); + var outfit_armature = CreateChild(outfit, "armature"); + var outfit_hips = CreateChild(outfit_armature, "hips"); + var outfit_spine = CreateChild(outfit_hips, "spine"); + var outfit_chest = CreateChild(outfit_spine, "chest"); + var outfit_upperchest = CreateChild(outfit_chest, "upperchest"); + + SetupOutfit.SetupOutfitUI(outfit); + + Assert.AreSame(root_armature, outfit_armature.GetComponent().mergeTargetObject); + Assert.AreSame(root_chest, outfit_upperchest.GetComponent().mergeTargetObject); + } + + [Test] + public void TestSetupSetupedOutfit() + { + var root = CreateCommonPrefab("shapell.fbx"); +#if MA_VRCSDK3_AVATARS + root.AddComponent(); +#endif + var root_hips = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips); + var root_armature = root.GetComponent().GetBoneTransform(HumanBodyBones.Hips).parent.gameObject; + + var outfit = CreateChild(root, "Outfit"); + var outfit_armature = CreateChild(outfit, "armature"); + var outfit_hips = CreateChild(outfit_armature, "HIP"); + outfit_armature.AddComponent(); + + SetupOutfit.SetupOutfitUI(outfit); + + Assert.AreEqual(root_armature, outfit_armature.GetComponent().mergeTargetObject); + Assert.AreEqual(root_hips.name, outfit_hips.name); + } +} diff --git a/UnitTests~/EasySetupOutfit/SetupOutfitRenameTest.cs.meta b/UnitTests~/EasySetupOutfit/SetupOutfitRenameTest.cs.meta new file mode 100644 index 00000000..38a7ce2f --- /dev/null +++ b/UnitTests~/EasySetupOutfit/SetupOutfitRenameTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89b8a54f81c4e7244a858b30825de67c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: