| | 1 | | using System.Collections; |
| | 2 | | using System.Collections.Generic; |
| | 3 | | using DCL; |
| | 4 | | using DCL.Components; |
| | 5 | | using NUnit.Framework; |
| | 6 | | using UnityEngine; |
| | 7 | | using UnityEngine.TestTools; |
| | 8 | | using WaitUntil = DCL.WaitUntil; |
| | 9 | |
|
| | 10 | | namespace AvatarShape_Tests |
| | 11 | | { |
| | 12 | | public class WearableControllerShould : IntegrationTestSuite_Legacy |
| | 13 | | { |
| | 14 | | private const string SUNGLASSES_ID = "urn:decentraland:off-chain:base-avatars:black_sun_glasses"; |
| | 15 | |
|
| | 16 | | private BaseDictionary<string, WearableItem> catalog; |
| | 17 | | private Transform wearableHolder; |
| 1 | 18 | | private List<WearableController> toCleanUp = new List<WearableController>(); |
| | 19 | |
|
| | 20 | | [UnitySetUp] |
| | 21 | | protected override IEnumerator SetUp() |
| | 22 | | { |
| 5 | 23 | | yield return base.SetUp(); |
| 5 | 24 | | catalog = AvatarAssetsTestHelpers.CreateTestCatalogLocal(); |
| | 25 | |
|
| 5 | 26 | | toCleanUp.Clear(); |
| 5 | 27 | | wearableHolder = CreateTestGameObject("_Holder").transform; |
| 5 | 28 | | } |
| | 29 | |
|
| | 30 | | [UnityTest] |
| | 31 | | public IEnumerator LoadSuccessfully() |
| | 32 | | { |
| | 33 | | //Arrange |
| 1 | 34 | | catalog.TryGetValue(SUNGLASSES_ID, out WearableItem wearableItem); |
| 1 | 35 | | WearableController wearable = new WearableController(wearableItem); |
| 1 | 36 | | toCleanUp.Add(wearable); |
| | 37 | |
|
| | 38 | | //Act |
| 1 | 39 | | bool succeeded = false; |
| 1 | 40 | | bool failed = false; |
| 2 | 41 | | wearable.Load(WearableLiterals.BodyShapes.FEMALE, wearableHolder, x => succeeded = true, x => failed = true) |
| 7 | 42 | | yield return new WaitUntil(() => succeeded || failed); |
| | 43 | |
|
| | 44 | | //Assert |
| 1 | 45 | | Assert.IsTrue(succeeded); |
| 1 | 46 | | Assert.IsFalse(failed); |
| 1 | 47 | | } |
| | 48 | |
|
| | 49 | | [UnityTest] |
| | 50 | | public IEnumerator FailsGracefully() |
| | 51 | | { |
| | 52 | | //Arrange |
| 1 | 53 | | WearableItem unexistentWearableItem = new WearableItem |
| | 54 | | { |
| | 55 | | data = new WearableItem.Data() |
| | 56 | | { |
| | 57 | | representations = new [] |
| | 58 | | { |
| | 59 | | new WearableItem.Representation |
| | 60 | | { |
| | 61 | | mainFile = "NothingHere", |
| | 62 | | contents = new [] { new WearableItem.MappingPair { key = "NothingHere", hash = "NothingHere" |
| | 63 | | bodyShapes = new [] { WearableLiterals.BodyShapes.FEMALE, WearableLiterals.BodyShapes.MALE } |
| | 64 | | } |
| | 65 | | } |
| | 66 | | } |
| | 67 | | }; |
| 1 | 68 | | WearableController wearable = new WearableController(unexistentWearableItem); |
| 1 | 69 | | toCleanUp.Add(wearable); |
| | 70 | |
|
| | 71 | | //Act |
| 1 | 72 | | bool succeeded = false; |
| 1 | 73 | | bool failed = false; |
| 1 | 74 | | RendereableAssetLoadHelper.LoadingType cacheLoadingType = RendereableAssetLoadHelper.loadingType; |
| 1 | 75 | | RendereableAssetLoadHelper.loadingType = RendereableAssetLoadHelper.LoadingType.ASSET_BUNDLE_ONLY; |
| 2 | 76 | | wearable.Load(WearableLiterals.BodyShapes.FEMALE, wearableHolder, x => succeeded = true, x => failed = true) |
| 2 | 77 | | yield return new WaitUntil(() => succeeded || failed); |
| 1 | 78 | | RendereableAssetLoadHelper.loadingType = cacheLoadingType; |
| | 79 | |
|
| | 80 | | //Assert |
| 1 | 81 | | Assert.IsFalse(succeeded); |
| 1 | 82 | | Assert.IsTrue(failed); |
| 1 | 83 | | } |
| | 84 | |
|
| | 85 | | [UnityTest] |
| | 86 | | public IEnumerator SetAnimatorBonesProperly() |
| | 87 | | { |
| | 88 | | //Arrange |
| 1 | 89 | | SkinnedMeshRenderer skinnedMeshRenderer = CreateTestGameObject("_SMR_Holder").AddComponent<SkinnedMeshRender |
| 1 | 90 | | skinnedMeshRenderer.rootBone = CreateTestGameObject("_rootBone").transform; |
| 1 | 91 | | skinnedMeshRenderer.bones = new Transform[5]; |
| 12 | 92 | | for (var i = 0; i < skinnedMeshRenderer.bones.Length; i++) |
| | 93 | | { |
| 5 | 94 | | skinnedMeshRenderer.bones[i] = CreateTestGameObject($"_rootBone_{i}").transform; |
| | 95 | | } |
| | 96 | |
|
| 1 | 97 | | catalog.TryGetValue(SUNGLASSES_ID, out WearableItem wereableItem); |
| 1 | 98 | | WearableController wearable = new WearableController(wereableItem); |
| 1 | 99 | | toCleanUp.Add(wearable); |
| 1 | 100 | | wearable.Load(WearableLiterals.BodyShapes.FEMALE, wearableHolder, null, null); |
| 7 | 101 | | yield return new WaitUntil(() => wearable.isReady); |
| | 102 | |
|
| | 103 | | //Act |
| 1 | 104 | | wearable.SetAnimatorBones(skinnedMeshRenderer); |
| | 105 | |
|
| | 106 | | //Assert |
| 1 | 107 | | SkinnedMeshRenderer wearableSMR = wearable.assetContainer.GetComponentInChildren<SkinnedMeshRenderer>(); |
| 1 | 108 | | Assert.AreEqual(skinnedMeshRenderer.rootBone, wearableSMR.rootBone); |
| 12 | 109 | | for (int index = 0; index < wearableSMR.bones.Length; index++) |
| | 110 | | { |
| 5 | 111 | | Assert.AreEqual(skinnedMeshRenderer.bones[index], wearableSMR.bones[index]); |
| | 112 | | } |
| 1 | 113 | | } |
| | 114 | |
|
| | 115 | | [UnityTest] |
| | 116 | | public IEnumerator UpdateVisibilityProperly_True() |
| | 117 | | { |
| | 118 | | //Arrange |
| 1 | 119 | | catalog.TryGetValue(SUNGLASSES_ID, out WearableItem wereableItem); |
| 1 | 120 | | WearableController wearable = new WearableController(wereableItem); |
| 1 | 121 | | toCleanUp.Add(wearable); |
| 1 | 122 | | wearable.Load(WearableLiterals.BodyShapes.FEMALE, wearableHolder, null, null); |
| 7 | 123 | | yield return new WaitUntil(() => wearable.isReady); |
| 1 | 124 | | SkinnedMeshRenderer skinnedMeshRenderer = wearable.assetContainer.GetComponentInChildren<SkinnedMeshRenderer |
| 1 | 125 | | skinnedMeshRenderer.enabled = false; |
| | 126 | |
|
| | 127 | | //Act |
| 1 | 128 | | wearable.UpdateVisibility(new HashSet<string>()); |
| | 129 | |
|
| | 130 | | //Assert |
| 1 | 131 | | Assert.IsTrue(skinnedMeshRenderer.enabled); |
| 1 | 132 | | } |
| | 133 | |
|
| | 134 | | [UnityTest] |
| | 135 | | public IEnumerator UpdateVisibilityProperly_False() |
| | 136 | | { |
| | 137 | | //Arrange |
| 1 | 138 | | catalog.TryGetValue(SUNGLASSES_ID, out WearableItem wereableItem); |
| 1 | 139 | | WearableController wearable = new WearableController(wereableItem); |
| 1 | 140 | | toCleanUp.Add(wearable); |
| 1 | 141 | | wearable.Load(WearableLiterals.BodyShapes.FEMALE, wearableHolder, null, null); |
| 7 | 142 | | yield return new WaitUntil(() => wearable.isReady); |
| 1 | 143 | | SkinnedMeshRenderer skinnedMeshRenderer = wearable.assetContainer.GetComponentInChildren<SkinnedMeshRenderer |
| 1 | 144 | | skinnedMeshRenderer.enabled = true; |
| | 145 | |
|
| | 146 | | //Act |
| 1 | 147 | | wearable.UpdateVisibility(new HashSet<string> { wearable.wearable.data.category }); |
| | 148 | |
|
| | 149 | | //Assert |
| 1 | 150 | | Assert.IsFalse(skinnedMeshRenderer.enabled); |
| 1 | 151 | | } |
| | 152 | |
|
| | 153 | | protected override IEnumerator TearDown() |
| | 154 | | { |
| 20 | 155 | | for (int index = toCleanUp.Count - 1; index >= 0; index--) |
| | 156 | | { |
| 5 | 157 | | toCleanUp[index].CleanUp(); |
| | 158 | | } |
| | 159 | |
|
| 5 | 160 | | toCleanUp.Clear(); |
| 5 | 161 | | return base.TearDown(); |
| | 162 | | } |
| | 163 | | } |
| | 164 | | } |