using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using NUnit.Framework; using UnityEngine; using UnityEditor.AddressableAssets.GUI; using UnityEditor.AddressableAssets.Settings; using UnityEditor.IMGUI.Controls; using UnityEditor.U2D; using UnityEditor.VersionControl; using UnityEngine.AddressableAssets; using UnityEngine.U2D; using Object = UnityEngine.Object; namespace UnityEditor.AddressableAssets.Tests { [TestFixture] public class AssetReferenceDrawerTestsFixture : AddressableAssetTestBase { protected string m_fbxAssetPath; [OneTimeTearDown] public void OneTimeTearDown() { if (File.Exists(m_fbxAssetPath)) { AssetDatabase.DeleteAsset(m_fbxAssetPath); AssetDatabase.Refresh(); } } internal AssetReferenceDrawer m_AssetReferenceDrawer { get; set; } internal List _subAssets; internal SerializedProperty _property; internal SpriteAtlas _atlas; internal class TestObjectWithRef : TestObject { [SerializeField] public AssetReference Reference = new AssetReference(); } internal class TestObjectWithRestrictedRef : TestObject { [SerializeField] [AssetReferenceUILabelRestriction(new[] {"HD"})] private AssetReference Reference = new AssetReference(); } internal class TestObjectWithRestrictedRefByMultipleLabels : TestObject { [SerializeField] [AssetReferenceUILabelRestriction(new[] {"HDR", "test", "default"})] private AssetReference ReferenceMultiple = new AssetReference(); } internal class TestObjectWithRestrictedRefInNestedClass : TestObject { [SerializeField] NestedClass OneLevelNested = new NestedClass(); [SerializeField] TwoLevelNestedClass TwoLevelNested = new TwoLevelNestedClass(); [Serializable] class TwoLevelNestedClass { [SerializeField] NestedClass Nested = new NestedClass(); } [Serializable] class NestedClass { [SerializeField] [AssetReferenceUILabelRestriction(new[] {"HD"})] AssetReference ReferenceInNestedClass = new AssetReference(); } } internal class TestSubObjectsSpriteAtlas : TestObject { [SerializeField] public AssetReferenceSprite testSpriteReference; } internal class TestSubObjectsSpriteAtlasList : TestObject { [SerializeField] public AssetReferenceSprite[] testSpriteReference; } internal class TestAssetReferenceDrawer : AssetReferenceDrawer { TestAssetReferencePopup _popup; internal void SetAssetReference(AssetReference ar) { m_AssetRefObject = ar; } internal void TreeSetup(TreeViewState treeState) { _popup = ScriptableObject.CreateInstance(); _popup.Initialize(this, "testpopup", "", false, Vector2.zero); _popup.TreeSetup(treeState, this, _popup); } internal void TreeSelectionChangedHelper(IList selectedIds) { _popup.TreeSelectionChangedHelper(selectedIds); } class TestAssetReferencePopup : AssetReferencePopup { TestSelectionTree _testTree; internal void TreeSetup(TreeViewState treeState, AssetReferenceDrawer testARD, AssetReferencePopup popup) { _testTree = new TestSelectionTree(treeState, testARD, popup, "testtree", ""); _testTree.Reload(); } internal void TreeSelectionChangedHelper(IList selectedIds) { _testTree.SelectionChangedHelper(selectedIds); } class TestSelectionTree : AssetReferencePopup.AssetReferenceTreeView { internal TestSelectionTree(TreeViewState state, AssetReferenceDrawer drawer, AssetReferencePopup popup, string guid, string nonAddressedAsset) : base(state, drawer, popup, guid, nonAddressedAsset) { } internal void SelectionChangedHelper(IList selectedIds) { SelectionChanged(selectedIds); } } } } internal class TestAssetReference : AssetReference { internal TestAssetReference(string guid) : base(guid) { } internal Object CachedAssetProperty { get { return CachedAsset; } set { CachedAsset = value; } } } internal void SetupDefaultSettings() { if (!Directory.Exists("Assets/AddressableAssetsData")) Directory.CreateDirectory("Assets/AddressableAssetsData"); AddressableAssetSettingsDefaultObject.Settings = Settings; } internal void TearDownTestDir() { if (Directory.Exists(ConfigFolder + "/test")) AssetDatabase.DeleteAsset(ConfigFolder + "/test"); } internal Object SetupAssetReference(out string assetPath) { m_AssetReferenceDrawer = new AssetReferenceDrawer(); AssetReference ar = new AssetReference(); assetPath = AssetDatabase.GUIDToAssetPath(m_AssetGUID); m_AssetReferenceDrawer.m_AssetRefObject = ar; m_AssetReferenceDrawer.m_AssetRefObject.SubObjectName = "test"; var testObject = AssetDatabase.LoadMainAssetAtPath(assetPath); return testObject; } internal SerializedProperty SetupForSetObjectNullTests(out string newEntryGuid) { // Setup Original AssetReference to not be null m_AssetReferenceDrawer = new AssetReferenceDrawer(); var assetPath = ConfigFolder + "/test" + "/test.prefab"; CreateTestPrefabAddressable(assetPath); newEntryGuid = AssetDatabase.AssetPathToGUID(assetPath); AssetReference ar = new AssetReference(newEntryGuid); SetupDefaultSettings(); // Setup property TestObjectWithRef obj = ScriptableObject.CreateInstance(); Settings.CreateOrMoveEntry(newEntryGuid, Settings.groups[0]); obj.Reference = ar; var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); m_AssetReferenceDrawer.m_AssetRefObject = ar; AssetReferenceDrawerUtilities.GatherFilters(property); string sprGuid; FieldInfo propertyFieldInfo = typeof(TestObjectWithRef).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, obj, propertyFieldInfo, "", out sprGuid); return property; } internal SerializedProperty SetupForSetSubAssets(SpriteAtlas spriteAtlas, int numReferences, bool setReferences = true, int numToSet = -1) { // Setup AssetReference selected m_AssetReferenceDrawer = new AssetReferenceDrawer(); var assetPath = AssetDatabase.GetAssetOrScenePath(spriteAtlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); AssetReferenceSprite ar = new AssetReferenceSprite(atlasGuid); // Setup property if (numToSet == -1) numToSet = numReferences - 1; var targetObjects = new Object[numReferences]; for (int i = 0; i < numReferences; i++) { var testScriptable = TestSubObjectsSpriteAtlas.CreateInstance(); // Preset references for certain tests if (setReferences && i <= numToSet) testScriptable.testSpriteReference = ar; targetObjects[i] = testScriptable; } var so = new SerializedObject(targetObjects); var property = so.FindProperty("testSpriteReference"); m_AssetReferenceDrawer.m_AssetRefObject = ar; AssetReferenceDrawerUtilities.GatherFilters(property); SetupDefaultSettings(); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); return property; } internal SerializedProperty SetupForSetSubAssetsList(SpriteAtlas spriteAtlas, int numReferences, int selectedElement, int numElements = 1, bool setReferences = true, int numToSet = -1) { // Setup AssetReference selected m_AssetReferenceDrawer = new AssetReferenceDrawer(); var assetPath = AssetDatabase.GetAssetOrScenePath(spriteAtlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); AssetReferenceSprite sar = new AssetReferenceSprite(atlasGuid); // Default to preset all references if (setReferences && numToSet == -1) numToSet = numReferences - 1; // Select one element per reference array as a targetObject var targetObjects = new Object[numElements]; for (int refIdx = 0; refIdx < numReferences; refIdx++) { var testScriptable = TestSubObjectsSpriteAtlasList.CreateInstance(); testScriptable.testSpriteReference = new AssetReferenceSprite[numElements]; // Preset reference array elements for certain tests if (setReferences && refIdx <= numToSet) { for (int i = 0; i < numElements; i++) { AssetReferenceSprite ar = new AssetReferenceSprite(atlasGuid); testScriptable.testSpriteReference[i] = ar; testScriptable.testSpriteReference[i].SubObjectName = "test"; } } var serialObj = new SerializedObject(testScriptable); var serProp = serialObj.FindProperty("testSpriteReference.Array.data[" + selectedElement + "]"); targetObjects[refIdx] = serProp.serializedObject.targetObject; } // Get main property to pass to AssetReferenceDrawer var property = SetupPropertyDrawerSetListTests(targetObjects, sar, selectedElement); return property; } internal SerializedProperty SetupPropertyDrawerSetListTests(Object[] targetObjects, AssetReference ar, int selectedElement) { var so = new SerializedObject(targetObjects); var property = so.FindProperty("testSpriteReference.Array.data[" + selectedElement + "]"); m_AssetReferenceDrawer.m_AssetRefObject = ar; AssetReferenceDrawerUtilities.GatherFilters(property); SetupDefaultSettings(); return property; } internal string CreateTestPrefabAddressable(string newEntryPath, bool createEntry = true) { GameObject testObject = new GameObject("TestObject"); Directory.CreateDirectory(ConfigFolder + "/test"); PrefabUtility.SaveAsPrefabAsset(testObject, newEntryPath); var folderGuid = AssetDatabase.AssetPathToGUID(ConfigFolder + "/test"); if (createEntry) { Settings.CreateOrMoveEntry(folderGuid, Settings.groups[0]); } return folderGuid; } internal Object SetUpSingleSprite(out string atlasGuid) { // Setup Sprite data var texture = new Texture2D(32, 32); var data = ImageConversion.EncodeToPNG(texture); UnityEngine.Object.DestroyImmediate(texture); // Setup Sprite Directory.CreateDirectory(ConfigFolder + "/test"); var spritePath = ConfigFolder + "/test" + "/testSprite.png"; var atlasPath = ConfigFolder + "/test" + "/testAtlas.spriteatlas"; var newAtlas = new SpriteAtlas(); AssetDatabase.GenerateUniqueAssetPath(ConfigFolder); File.WriteAllBytes(spritePath, data); AssetDatabase.ImportAsset(spritePath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); var importer = (TextureImporter)AssetImporter.GetAtPath(spritePath); importer.textureType = TextureImporterType.Sprite; importer.spriteImportMode = SpriteImportMode.Multiple; #pragma warning disable 618 importer.spritesheet = new SpriteMetaData[] { new SpriteMetaData() {name = "topleft", pivot = Vector2.zero, rect = new Rect(0, 0, 16, 16)}, new SpriteMetaData() {name = "testSprite", pivot = Vector2.zero, rect = new Rect(16, 16, 16, 16)} }; #pragma warning restore 618 importer.SaveAndReimport(); // Add sprite to subassets Object spr = AssetDatabase.LoadAssetAtPath(spritePath, typeof(Sprite)); spr.name = "testSprite"; // Setup Atlas var spriteList = new[] {spr}; newAtlas.Add(spriteList); AssetDatabase.CreateAsset(newAtlas, atlasPath); AssetDatabase.Refresh(); SpriteAtlasExtensions.Add(newAtlas, spriteList); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] {newAtlas}, EditorUserBuildSettings.activeBuildTarget, false); var spriteGuid = AssetDatabase.AssetPathToGUID(spritePath); Settings.CreateOrMoveEntry(spriteGuid, Settings.groups[0]); atlasGuid = AssetDatabase.AssetPathToGUID(atlasPath); Settings.CreateOrMoveEntry(atlasGuid, Settings.groups[0]); return spr; } internal SpriteAtlas SetUpSpriteAtlas(int numAtlasObjects, out List subAssets) { // Setup Sprite data var texture = new Texture2D(32, 32); var data = ImageConversion.EncodeToPNG(texture); UnityEngine.Object.DestroyImmediate(texture); // Setup Sprites subAssets = new List(); Directory.CreateDirectory(ConfigFolder + "/test"); var atlasPath = ConfigFolder + "/test" + "/testAtlas.spriteatlas"; var newAtlas = new SpriteAtlas(); var sprites = new Object[numAtlasObjects]; for (int i = 0; i < numAtlasObjects; i++) { // Create Sprite asset AssetDatabase.GenerateUniqueAssetPath(ConfigFolder); var newSpritePath = ConfigFolder + "/test" + "/testSprite" + i + ".png"; File.WriteAllBytes(newSpritePath, data); AssetDatabase.ImportAsset(newSpritePath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); var importer = (TextureImporter)AssetImporter.GetAtPath(newSpritePath); importer.textureType = TextureImporterType.Sprite; importer.spriteImportMode = SpriteImportMode.Multiple; #pragma warning disable 618 importer.spritesheet = new SpriteMetaData[] { new SpriteMetaData() {name = "topleft", pivot = Vector2.zero, rect = new Rect(0, 0, 16, 16)}, new SpriteMetaData() {name = "testSprite" + i, pivot = Vector2.zero, rect = new Rect(16, 16, 16, 16)} }; #pragma warning restore 618 importer.SaveAndReimport(); // Add sprite to subassets Object spr = AssetDatabase.LoadAssetAtPath(newSpritePath, typeof(Sprite)); spr.name = "testSprite" + i; sprites[i] = spr; subAssets.Add(spr); } // Setup Atlas newAtlas.Add(sprites); AssetDatabase.CreateAsset(newAtlas, atlasPath); AssetDatabase.Refresh(); SpriteAtlasExtensions.Add(newAtlas, sprites); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] {newAtlas}, EditorUserBuildSettings.activeBuildTarget, false); var atlasGuid = AssetDatabase.AssetPathToGUID(atlasPath); Settings.CreateOrMoveEntry(atlasGuid, Settings.groups[0]); return newAtlas; } public void SetUpForSubassetPerformanceTests(int numAtlasObjects, int numReferences, int selectedId) { // Drawer Setup m_AssetReferenceDrawer = new AssetReferenceDrawer(); _subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out _subAssets); _property = SetupForSetSubAssets(atlas, numReferences, true); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.SetSubAssets(_property, _subAssets[selectedId], propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); AssetReferenceDrawerUtilities.GatherFilters(_property); } public void SetupForSetAssetsPerformanceTests(int numReferences) { _subAssets = new List(); _atlas = SetUpSpriteAtlas(numReferences, out _subAssets); _property = SetupForSetSubAssets(_atlas, numReferences); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); } public void SetObjectForPerformanceTests() { FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, _property, _atlas, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text, out string guid); } public void SetMainAssetsForPerformanceTests() { _subAssets = new List(); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.SetMainAssets(ref m_AssetReferenceDrawer.m_ReferencesSame, _property, _atlas, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); } public void GetNameForAssetForPerformanceTests() { FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.GetNameForAsset(ref m_AssetReferenceDrawer.m_ReferencesSame, _property, false, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); } public void GetSubAssetsListForPerformanceTests() { AssetReferenceDrawerUtilities.GetSubAssetsList(m_AssetReferenceDrawer.m_AssetRefObject); } public void GetSelectedSubassetIndexForPerformanceTests() { m_AssetReferenceDrawer.GetSelectedSubassetIndex(_subAssets, out var selIndex, out var objNames); } public void CheckTargetObjectsSubassetsAreDifferentForPerformanceTests() { FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.CheckTargetObjectsSubassetsAreDifferent(_property, m_AssetReferenceDrawer.m_AssetRefObject.SubObjectName, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); } } public class AssetReferenceDrawerTests : AssetReferenceDrawerTestsFixture { [Test] public void CanRestrictLabel() { m_AssetReferenceDrawer = new AssetReferenceDrawer(); TestObjectWithRestrictedRef obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); List restrictions = AssetReferenceDrawerUtilities.GatherFilters(property); Assert.AreEqual(restrictions.Count, 1); Assert.True(restrictions.First().ToString().Contains("HD")); m_AssetReferenceDrawer = null; TearDownTestDir(); } [Test] public void CanRestrictMultipleLabels() { m_AssetReferenceDrawer = new AssetReferenceDrawer(); TestObjectWithRestrictedRefByMultipleLabels obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var property = so.FindProperty("ReferenceMultiple"); AssetReferenceDrawerUtilities.GatherFilters(property); List restrictions = AssetReferenceDrawerUtilities.GatherFilters(property); string restriction = restrictions.First().ToString(); Assert.True(restriction.Contains("HDR")); Assert.True(restriction.Contains("test")); Assert.True(restriction.Contains("default")); m_AssetReferenceDrawer = null; TearDownTestDir(); } [Test] public void AssetReferenceDrawer_GatherFilters_CanRestrictInSingleNestedClass() { m_AssetReferenceDrawer = new AssetReferenceDrawer(); TestObjectWithRestrictedRefInNestedClass obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var oneLevelProp = so.FindProperty("OneLevelNested.ReferenceInNestedClass"); var restrictions = AssetReferenceDrawerUtilities.GatherFilters(oneLevelProp); Assert.True(restrictions.First().ToString().Contains("HD")); m_AssetReferenceDrawer = null; TearDownTestDir(); } [Test] public void AssetReferenceDrawer_GatherFilters_CanRestrictInDoubleNestedClass() { m_AssetReferenceDrawer = new AssetReferenceDrawer(); TestObjectWithRestrictedRefInNestedClass obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var twoLevelProp = so.FindProperty("TwoLevelNested.Nested.ReferenceInNestedClass"); var restrictions = AssetReferenceDrawerUtilities.GatherFilters(twoLevelProp); Assert.True(restrictions.First().ToString().Contains("HD")); m_AssetReferenceDrawer = null; TearDownTestDir(); } [Test] public void AssetReferenceDrawer_ValidateAsset_CanValidateAssetWithRestrictionsFromPath() { // Setup AssetReference string assetPath = ""; var testObject = SetupAssetReference(out assetPath); // Setup property TestObjectWithRestrictedRef obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); var restrictions = AssetReferenceDrawerUtilities.GatherFilters(property); // Test string guid; FieldInfo propertyFieldInfo = typeof(TestObjectWithRestrictedRef).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); Assert.IsTrue(AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, testObject, propertyFieldInfo, "", out guid)); Assert.False(AssetReferenceDrawerUtilities.ValidateAsset(m_AssetReferenceDrawer.m_AssetRefObject, restrictions, assetPath)); TearDownTestDir(); m_AssetReferenceDrawer = null; } [Test] public void AssetReferenceDrawer_ValidateAsset_CanValidateAssetWithoutRestrictionsFromPath() { // Setup AssetReference string assetPath = ""; var testObject = SetupAssetReference(out assetPath); // Setup property TestObjectWithRef obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); var restrictions = AssetReferenceDrawerUtilities.GatherFilters(property); // Test string guid; FieldInfo propertyFieldInfo = typeof(TestObjectWithRestrictedRef).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); Assert.IsTrue(AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, testObject, propertyFieldInfo, "", out guid)); Assert.IsTrue(AssetReferenceDrawerUtilities.ValidateAsset(m_AssetReferenceDrawer.m_AssetRefObject, restrictions, assetPath)); TearDownTestDir(); m_AssetReferenceDrawer = null; } [Test] public void AssetReferenceDrawer_IsAssetPathInAddressableDirectory_PathInAddressableFolder() { // Asset setup m_AssetReferenceDrawer = new AssetReferenceDrawer(); string assetName = ""; var newEntryPath = ConfigFolder + "/test" + "/test.prefab"; var folderGuid = CreateTestPrefabAddressable(newEntryPath); // Test Assert.IsTrue(Settings.IsAssetPathInAddressableDirectory(newEntryPath, out assetName)); Assert.AreEqual(assetName, folderGuid + "/test.prefab"); // Cleanup Settings.RemoveAssetEntry(AssetDatabase.AssetPathToGUID(newEntryPath)); Settings.RemoveAssetEntry(folderGuid); TearDownTestDir(); m_AssetReferenceDrawer = null; } [Test] public void AssetReferenceDrawer_IsAssetPathInAddressableDirectory_PathNotInAddressableFolder() { // Asset setup m_AssetReferenceDrawer = new AssetReferenceDrawer(); string assetName = ""; var newEntryPath = ConfigFolder + "/test" + "/test.prefab"; var folderGuid = CreateTestPrefabAddressable(newEntryPath, false); // Test Assert.IsFalse(Settings.IsAssetPathInAddressableDirectory(newEntryPath, out assetName)); Assert.AreEqual(assetName, ""); // Cleanup Settings.RemoveAssetEntry(AssetDatabase.AssetPathToGUID(newEntryPath)); Settings.RemoveAssetEntry(folderGuid); TearDownTestDir(); m_AssetReferenceDrawer = null; } [Test] public void AssetReferenceDrawer_IsAssetPathInAddressableDirectory_PathEmptyString() { m_AssetReferenceDrawer = new AssetReferenceDrawer(); string assetName = ""; Assert.IsFalse(Settings.IsAssetPathInAddressableDirectory("", out assetName)); Assert.AreEqual(assetName, ""); TearDownTestDir(); m_AssetReferenceDrawer = null; } [Test] public void AssetReferenceDrawer_IsAssetPathInAddressableDirectory_PathPointToNonexistentAsset() { m_AssetReferenceDrawer = new AssetReferenceDrawer(); string assetName = ""; Assert.IsFalse(Settings.IsAssetPathInAddressableDirectory(ConfigFolder + "/test.prefab", out assetName)); Assert.AreEqual(assetName, ""); TearDownTestDir(); m_AssetReferenceDrawer = null; } [Test] public void AssetReferenceDrawer_SelectionChanged_CanSelectSameNameAssetsInDifferentGroups() { // Drawer Setup var testAssetReferenceDrawer = new TestAssetReferenceDrawer(); testAssetReferenceDrawer.SetAssetReference(new AssetReference()); TestObjectWithRef obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); testAssetReferenceDrawer.m_Restrictions = AssetReferenceDrawerUtilities.GatherFilters(property); // Entries setup var newEntryPath = ConfigFolder + "/test" + "/test.prefab"; var testEntry = Settings.CreateOrMoveEntry(m_AssetGUID, Settings.groups[0]); GameObject testObject = new GameObject("TestObject"); Directory.CreateDirectory(ConfigFolder + "/test"); PrefabUtility.SaveAsPrefabAsset(testObject, newEntryPath); var newEntryGuid = AssetDatabase.AssetPathToGUID(newEntryPath); var secondTestEntry = Settings.CreateOrMoveEntry(newEntryGuid, Settings.groups[1]); // Tree setup var testId = testEntry.AssetPath.GetHashCode(); List selectedIds = new List() {testId}; var treeState = new TreeViewState(); treeState.selectedIDs = selectedIds; Directory.CreateDirectory("Assets/AddressableAssetsData"); AddressableAssetSettingsDefaultObject.Settings = Settings; testAssetReferenceDrawer.TreeSetup(treeState); // Test testAssetReferenceDrawer.TreeSelectionChangedHelper(selectedIds); Assert.AreEqual(m_AssetGUID, testAssetReferenceDrawer.newGuid); selectedIds[0] = secondTestEntry.AssetPath.GetHashCode(); testAssetReferenceDrawer.TreeSelectionChangedHelper(selectedIds); Assert.AreEqual(AssetDatabase.AssetPathToGUID(newEntryPath), testAssetReferenceDrawer.newGuid); // Cleanup if (Directory.Exists("Assets/AddressableAssetsData")) AssetDatabase.DeleteAsset("Assets/AddressableAssetsData"); EditorBuildSettings.RemoveConfigObject("Assets/AddressableAssetsData"); Settings.RemoveAssetEntry(AssetDatabase.AssetPathToGUID(newEntryPath)); Settings.RemoveAssetEntry(m_AssetGUID); m_AssetReferenceDrawer = null; TearDownTestDir(); } [Test] [Ignore("This test checks for a specific path, these paths aren't proper test paths.")] public void AssetReferenceDrawer_HandleDragAndDrop_CanRecognizeNonAddressableInAddressableFolder() { // ScriptableObject property and Drawer setup m_AssetReferenceDrawer = new AssetReferenceDrawer(); m_AssetReferenceDrawer.m_AssetRefObject = new AssetReference(); TestObjectWithRestrictedRef obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var propertyName = "Reference"; var property = so.FindProperty(propertyName); m_AssetReferenceDrawer.m_label = new GUIContent(propertyName); // Group setup string groupName = "TestGroup"; var newGroup = Settings.CreateGroup(groupName, false, false, false, null); // Asset setup var newEntryPath = ConfigFolder + "/test" + "/test.prefab"; var folderGuid = CreateTestPrefabAddressable(newEntryPath); AssetDatabase.Refresh(); var newAssetGuid = AssetDatabase.AssetPathToGUID(newEntryPath); Settings.CreateOrMoveEntry(folderGuid, Settings.groups[2]); SetupDefaultSettings(); // Test m_AssetReferenceDrawer.DragAndDropNotFromAddressableGroupWindow(new string[] {newEntryPath}, newAssetGuid, property, Settings); var newentry = Settings.FindAssetEntry(newAssetGuid); Assert.IsNull(newentry); Assert.AreEqual(m_AssetReferenceDrawer.m_AssetRefObject.Asset.name, newAssetGuid); // Cleanup Settings.RemoveAssetEntry(AssetDatabase.AssetPathToGUID(newEntryPath)); Settings.RemoveAssetEntry(folderGuid); Settings.RemoveGroup(newGroup); TearDownTestDir(); } [Test] public void AssetReferenceDrawer_SetObject_CanSetObject() { // Setup AssetReference string assetPath = ""; var testObject = SetupAssetReference(out assetPath); // Setup property TestObjectWithRef obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); AssetReferenceDrawerUtilities.GatherFilters(property); // Test string guid; FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); Assert.IsTrue(AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, testObject, propertyFieldInfo, "", out guid)); Assert.AreEqual(m_AssetGUID, m_AssetReferenceDrawer.m_AssetRefObject.AssetGUID); Assert.AreEqual(m_AssetGUID, guid); Assert.AreEqual(testObject.name, m_AssetReferenceDrawer.m_AssetRefObject.editorAsset.name); m_AssetReferenceDrawer = null; TearDownTestDir(); } [Test] public void AssetReferenceDrawer_SetObject_CanSetSpriteObject() { // Setup string assetPath = ""; SetupAssetReference(out assetPath); var assetGuid = ""; var testObject = SetUpSingleSprite(out assetGuid); // Setup property TestObjectWithRef obj = ScriptableObject.CreateInstance(); var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); AssetReferenceDrawerUtilities.GatherFilters(property); // Test string guid; FieldInfo propertyFieldInfo = typeof(TestObjectWithRef).GetField("Reference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); SetupDefaultSettings(); Assert.IsTrue(AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, testObject, propertyFieldInfo, "", out guid)); Assert.AreEqual(assetGuid, m_AssetReferenceDrawer.m_AssetRefObject.AssetGUID); Assert.AreEqual("testAtlas", m_AssetReferenceDrawer.m_AssetRefObject.editorAsset.name); Assert.AreEqual("testSprite", m_AssetReferenceDrawer.m_AssetRefObject.SubObjectName); // Cleanup TearDownTestDir(); } [Test] public void SetObject_WhenTargetIsSubAsset_IsSetAsSubObject() { // Prepare test fbx m_fbxAssetPath = GetAssetPath("testFBX.fbx"); if (!File.Exists(m_fbxAssetPath)) { string fbxResourcePath = null; var repoRoot = Directory.GetParent(Application.dataPath).Parent?.FullName; if (!string.IsNullOrEmpty(repoRoot)) fbxResourcePath = Path.Combine(repoRoot, "Projects", "TestsResources", "testFBX.fbx"); if (string.IsNullOrEmpty(fbxResourcePath) || !File.Exists(fbxResourcePath)) Assert.Ignore($"Unable to find required FBX file to run this test. Ignoring."); File.Copy(fbxResourcePath, m_fbxAssetPath, true); AssetDatabase.Refresh(); } Assert.IsTrue(File.Exists(m_fbxAssetPath)); var fbxAsset = AssetDatabase.LoadAssetAtPath(m_fbxAssetPath); var meshSubAsset = AssetDatabase.LoadAllAssetRepresentationsAtPath(m_fbxAssetPath).First(o => o is Mesh); AssetDatabase.TryGetGUIDAndLocalFileIdentifier(fbxAsset, out string fbxAssetGuid, out long _); Assert.IsFalse(string.IsNullOrEmpty(fbxAssetGuid)); // Setup property var ar = new AssetReferenceT(""); var obj = ScriptableObject.CreateInstance(); obj.Reference = ar; var so = new SerializedObject(obj); var property = so.FindProperty("Reference"); // Test string guid; m_AssetReferenceDrawer = new AssetReferenceDrawer(); m_AssetReferenceDrawer.m_AssetRefObject = ar; AssetReferenceDrawerUtilities.GatherFilters(property); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var success = AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, meshSubAsset, propertyFieldInfo, "", out guid); // Assert Assert.IsTrue(success); Assert.AreEqual(fbxAssetGuid, guid); Assert.AreEqual(meshSubAsset.name, m_AssetReferenceDrawer.m_AssetRefObject.SubObjectName); Assert.AreEqual(meshSubAsset.GetType(), m_AssetReferenceDrawer.m_AssetRefObject.SubOjbectType); } [Test] public void AssetReferenceDrawer_SetObject_CanSetToNull() { // Setup Original AssetReference to not be null and property var property = SetupForSetObjectNullTests(out var newAssetGuid); // Test string guid; FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, null, propertyFieldInfo, "", out guid); Assert.AreEqual(null, m_AssetReferenceDrawer.m_AssetRefObject.SubObjectName); Assert.AreEqual(string.Empty, m_AssetReferenceDrawer.m_AssetRefObject.AssetGUID); // Cleanup Settings.RemoveAssetEntry(newAssetGuid); TearDownTestDir(); } [Test] public void AssetReference_WhenCachedGUIDIsNotEqualToAssetGUID_CachedAssetIsNull() { // Setup string guid = "8888888888888888888"; var assetRef = new TestAssetReference(guid) { CachedAssetProperty = new Object() }; // Test Assert.IsTrue(assetRef.CachedAssetProperty == null); assetRef.ReleaseAsset(); Settings.RemoveAssetEntry(assetRef.AssetGUID); TearDownTestDir(); } #if UNITY_2019_2_OR_NEWER [Test] public void AssetReferenceDrawer_SetObject_SetToNullDirtiesObject() { // Setup Original AssetReference to not be null and property var newAssetGuid = ""; var property = SetupForSetObjectNullTests(out newAssetGuid); // Test string guid; EditorUtility.ClearDirty(property.serializedObject.targetObject); var prevDirty = EditorUtility.IsDirty(property.serializedObject.targetObject); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); AssetReferenceDrawerUtilities.SetObject(ref m_AssetReferenceDrawer.m_AssetRefObject, ref m_AssetReferenceDrawer.m_ReferencesSame, property, null, propertyFieldInfo, "", out guid); Assert.IsFalse(prevDirty); Assert.IsTrue(EditorUtility.IsDirty(property.serializedObject.targetObject)); // Cleanup Settings.RemoveAssetEntry(newAssetGuid); TearDownTestDir(); } [TestCase(1, 0, 1)] [TestCase(20, 10, 8)] [Ignore("The sub asset is returning the default name of null instead of the proper name for the selected element.")] public void AssetReferenceDrawer_SetSubAssets_CanSetSubAssets(int numAtlasObjects, int selectedId, int numReferences) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssets(atlas, numReferences, true); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); // Test AssetReferenceDrawerUtilities.SetSubAssets(property, subAssets[selectedId], propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); foreach (var obj in property.serializedObject.targetObjects) { Assert.AreEqual(((TestSubObjectsSpriteAtlas)obj).testSpriteReference.SubObjectName, subAssets[selectedId].name); } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(1, 1, 1, 0, 0)] [TestCase(4, 3, 3, 1, 1)] [Ignore("The sub asset is returning the default name of 'test' instead of the proper name for the selected element.")] public void AssetReferenceDrawer_SetSubAssets_CanSetInList(int numAtlasObjects, int numReferences, int numElements, int selectedElement, int selectedSubAsset) { // Setup var atlas = SetUpSpriteAtlas(numAtlasObjects, out var subAssets); var property = SetupForSetSubAssetsList(atlas, numReferences, selectedElement, numElements, true, numReferences); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlasList).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); m_AssetReferenceDrawer.m_label = new GUIContent("Element " + selectedElement); // Test AssetReferenceDrawerUtilities.SetSubAssets(property, subAssets[selectedSubAsset], propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); // Check that only the selected element of each object's reference list was set to null foreach (var obj in property.serializedObject.targetObjects) { var checkList = ((TestSubObjectsSpriteAtlasList)obj).testSpriteReference; for (int currElement = checkList.Length - 1; currElement >= 0; currElement--) { if (currElement == selectedElement) Assert.AreEqual(subAssets[selectedSubAsset].name, checkList[selectedElement].SubObjectName); else Assert.AreEqual("test", checkList[currElement].SubObjectName); } } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(1, 0, 1)] [TestCase(20, 10, 8)] public void AssetReferenceDrawer_SetSubAssets_CanSetSubAssetsToNull(int numAtlasObjects, int selectedId, int numReferences) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssets(atlas, numReferences, true); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); // Test AssetReferenceDrawerUtilities.SetSubAssets(property, subAssets[selectedId], propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); AssetReferenceDrawerUtilities.SetSubAssets(property, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); foreach (var obj in property.serializedObject.targetObjects) { Assert.AreEqual(null, ((TestSubObjectsSpriteAtlas)obj).testSpriteReference.SubObjectName); } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(1, 1, 1, 0)] [TestCase(2, 3, 3, 1)] public void AssetReferenceDrawer_SetSubAssets_CanSetToNullInList(int numAtlasObjects, int numReferences, int numElements, int selectedElement) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssetsList(atlas, numReferences, selectedElement, numElements, true, numReferences); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlasList).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); m_AssetReferenceDrawer.m_label = new GUIContent("Element " + selectedElement); // Test AssetReferenceDrawerUtilities.SetSubAssets(property, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); // Check that only the selected element of each object's reference list was set to null foreach (var obj in property.serializedObject.targetObjects) { var checkList = ((TestSubObjectsSpriteAtlasList)obj).testSpriteReference; for (int currElement = 0; currElement < checkList.Length; currElement++) { if (currElement == selectedElement) Assert.AreEqual(null, checkList[selectedElement].SubObjectName); else Assert.AreEqual("test", checkList[currElement].SubObjectName); } } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(1, 0, 1)] [TestCase(20, 10, 8)] public void AssetReferenceDrawer_GetSubAssetsList_CanGetSubAssetsList(int numAtlasObjects, int selectedId, int numReferences) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssets(atlas, numReferences, true); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); // Test AssetReferenceDrawerUtilities.SetSubAssets(property, subAssets[selectedId], propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); var subassetsList = AssetReferenceDrawerUtilities.GetSubAssetsList(m_AssetReferenceDrawer.m_AssetRefObject); Assert.AreEqual(subassetsList.Count, subAssets.Count + 1); foreach (var obj in subassetsList) { if (obj != null) { Assert.IsTrue(FindSubassetNameInList(obj.name, subAssets)); } } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } bool FindSubassetNameInList(string objName, List objects) { foreach (var obj in objects) { if (objName.Contains(obj.name)) return true; } return false; } [TestCase(1, 1)] [TestCase(20, 8)] public void AssetReferenceDrawer_SetMainAssets_CanSetMultipleAssets(int numAtlasObjects, int numReferences) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssets(atlas, numReferences); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); // Test AssetReferenceDrawerUtilities.SetMainAssets(ref m_AssetReferenceDrawer.m_ReferencesSame, property, atlas, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); foreach (var obj in property.serializedObject.targetObjects) { Assert.AreEqual(((TestSubObjectsSpriteAtlas)obj).testSpriteReference.AssetGUID, atlasGuid); } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(1, 1, 1, 0)] [TestCase(2, 3, 3, 1)] public void AssetReferenceDrawer_SetMainAssets_CanSetMultipleAssetReferencesInList(int numAtlasObjects, int numReferences, int numElements, int selectedElement) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssetsList(atlas, numReferences, selectedElement, numElements, false); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlasList).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("Element " + selectedElement); // Test AssetReferenceDrawerUtilities.SetMainAssets(ref m_AssetReferenceDrawer.m_ReferencesSame, property, atlas, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); // Check that only the selected element of each object's reference list was set foreach (var obj in property.serializedObject.targetObjects) { var checkList = ((TestSubObjectsSpriteAtlasList)obj).testSpriteReference; for (int currElement = 0; currElement < checkList.Length; currElement++) { if (currElement == selectedElement) Assert.AreEqual(atlasGuid, checkList[selectedElement].AssetGUID); else Assert.AreEqual(null, checkList[currElement].AssetGUID); } } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [Test] public void AssetReferenceDrawer_SetMainAssets_CanSetToNull() { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(1, out subAssets); var property = SetupForSetSubAssets(atlas, 1); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); // Test AssetReferenceDrawerUtilities.SetMainAssets(ref m_AssetReferenceDrawer.m_ReferencesSame, property, null, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); Assert.AreEqual(((TestSubObjectsSpriteAtlas)property.serializedObject.targetObject).testSpriteReference.Asset, null); // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(1, 1, 1, 0)] [TestCase(2, 3, 3, 1)] public void AssetReferenceDrawer_SetMainAssets_CanSetToNullInList(int numAtlasObjects, int numReferences, int numElements, int selectedElement) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssetsList(atlas, numReferences, selectedElement, numElements, true, numReferences); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlasList).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("Element " + selectedElement); // Test AssetReferenceDrawerUtilities.SetMainAssets(ref m_AssetReferenceDrawer.m_ReferencesSame, property, null, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); // Check that only the selected element of each object's reference list was set to null foreach (var obj in property.serializedObject.targetObjects) { var checkList = ((TestSubObjectsSpriteAtlasList)obj).testSpriteReference; for (int currElement = 0; currElement < checkList.Length; currElement++) { if (currElement == selectedElement) Assert.AreEqual(String.Empty, checkList[selectedElement].AssetGUID); else Assert.AreEqual(atlasGuid, checkList[currElement].AssetGUID); } } // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [Test] public void AssetReferenceDrawer_SetMainAssets_SetToNullDirtiesObject() { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(1, out subAssets); var property = SetupForSetSubAssets(atlas, 1); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); // Test EditorUtility.ClearDirty(property.serializedObject.targetObject); var prevDirty = EditorUtility.IsDirty(property.serializedObject.targetObject); AssetReferenceDrawerUtilities.SetMainAssets(ref m_AssetReferenceDrawer.m_ReferencesSame, property, null, null, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); Assert.IsFalse(prevDirty); Assert.IsTrue(EditorUtility.IsDirty(property.serializedObject.targetObject)); // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(1, 1)] [TestCase(20, 8)] [Ignore("The get name for asset is returning only the type of asset, not the asset subname.")] public void AssetReferenceDrawer_GetNameForAsset_CanGetAssetNameWhenAllSame(int numAtlasObjects, int numReferences) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssets(atlas, numReferences, true); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); m_AssetReferenceDrawer.m_AssetName = atlas.name; // Test var nameforAsset = AssetReferenceDrawerUtilities.GetNameForAsset(ref m_AssetReferenceDrawer.m_ReferencesSame, property, false, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); Assert.AreEqual(atlas.name, nameforAsset); // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [TestCase(10, 4, 8)] public void AssetReferenceDrawer_GetNameForAsset_CanGetAssetNameWhenDifferent(int numAtlasObjects, int numToSet, int numReferences) { // Setup var subAssets = new List(); var atlas = SetUpSpriteAtlas(numAtlasObjects, out subAssets); var property = SetupForSetSubAssets(atlas, numReferences, true, numToSet); var assetPath = AssetDatabase.GetAssetOrScenePath(atlas); var atlasGuid = AssetDatabase.AssetPathToGUID(assetPath); m_AssetReferenceDrawer.m_label = new GUIContent("testSpriteReference"); FieldInfo propertyFieldInfo = typeof(TestSubObjectsSpriteAtlas).GetField("testSpriteReference", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); m_AssetReferenceDrawer.m_AssetName = atlas.name; // Test var nameforAsset = AssetReferenceDrawerUtilities.GetNameForAsset(ref m_AssetReferenceDrawer.m_ReferencesSame, property, false, propertyFieldInfo, m_AssetReferenceDrawer.m_label.text); Assert.AreEqual("--", nameforAsset); // Cleanup TearDownTestDir(); Settings.RemoveAssetEntry(atlasGuid); } [Test] public void SerializedPropertyExtensions_GetPropertyPathArrayName() { string arrayPath = SerializedPropertyExtensions.GetPropertyPathArrayName("MainList.Array.data[111].SubList.Array.data[222]"); Assert.AreEqual("MainList.Array.data[111].SubList.Array", arrayPath); } #endif } }