using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection.Emit; using NUnit.Framework; using UnityEditor.AddressableAssets.Build; using UnityEditor.AddressableAssets.Build.DataBuilders; using UnityEditor.AddressableAssets.Build.Layout; using UnityEditor.AddressableAssets.Settings; using UnityEditor.AddressableAssets.Settings.GroupSchemas; using UnityEditor.Build.Pipeline.Utilities; using UnityEditor.VersionControl; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.Util; using UnityEngine.TestTools; using static UnityEditor.AddressableAssets.Settings.AddressableAssetSettings; namespace UnityEditor.AddressableAssets.Tests { public class AddressableAssetSettingsTests : AddressableAssetTestBase { internal class InitializeScriptable : ScriptableObject, IObjectInitializationDataProvider { public string Name { get; } public ObjectInitializationData CreateObjectInitializationData() { return new ObjectInitializationData(); } } internal class GroupTemplateTestObj : IGroupTemplate { public string Name { get; } public string Description { get; } } internal class InitializationObejctTest : IObjectInitializationDataProvider { public string Name { get; } public ObjectInitializationData CreateObjectInitializationData() { return new ObjectInitializationData(); } } internal class DataBuilderTest : IDataBuilder { public string Name { get; set; } public bool CacheCleared = false; public bool CanBuildData() where T : IDataBuilderResult { return true; } public TResult BuildData(AddressablesDataBuilderInput builderInput) where TResult : IDataBuilderResult { return default(TResult); } public void ClearCachedData() { CacheCleared = true; } public string Description { get; } } public void SetupEntries(ref List entries, int numEntries) { var testObject = new GameObject("TestObjectSetLabel"); PrefabUtility.SaveAsPrefabAsset(testObject, ConfigFolder + "/testasset.prefab"); var testAssetGUID = AssetDatabase.AssetPathToGUID(ConfigFolder + "/testasset.prefab"); entries.Add(Settings.CreateOrMoveEntry(m_AssetGUID, Settings.FindGroup(AddressableAssetSettings.PlayerDataGroupName))); for (int i = 0; i <= numEntries; i++) entries.Add(Settings.CreateOrMoveEntry(testAssetGUID, Settings.FindGroup(AddressableAssetSettings.PlayerDataGroupName))); } [Test] public void SettingsCache_FindsEntry() { AddressableAssetSettings.Cache cache = new AddressableAssetSettings.Cache(Settings); int result = 10; string key = "testKey"; Assert.IsFalse(cache.TryGetCached(key, out result)); cache.Add(key, 20); Assert.IsTrue(cache.TryGetCached(key, out result)); Assert.AreEqual(result, 20); } #if !UNITY_2020_3_OR_NEWER [Test] public void Hash128AppendExtensionTests() { var h1 = new Hash128(2351235, 3457345734, 457845683, 213451235); var h2 = h1; h2.Append("string"); Assert.AreNotEqual(h1, h2); h2 = h1; h2.Append(462346); Assert.AreNotEqual(h1, h2); h2 = h1; Hash128 v = new Hash128(45346,4568234,213,35454); h2.Append(ref v); Assert.AreNotEqual(h1, h2); } #endif [Test] public void SettingsCache_CacheClearedOnSettingsChanged() { AddressableAssetSettings.Cache cache = new AddressableAssetSettings.Cache(Settings); int result; string key = "testKey"; cache.Add(key, 20); Assert.IsTrue(cache.TryGetCached(key, out result)); Assert.AreEqual(result, 20); Settings.AddLabel("SettingsCache_CacheClearedOnSettingsChanged.testLabel", false); try { Assert.IsFalse(cache.TryGetCached(key, out result)); } finally { Settings.RemoveLabel("SettingsCache_CacheClearedOnSettingsChanged.testLabel", false); } } [Test] public void GetDefaultGroupDoesNotThrowNullExceptionWhenGroupsNull() { Settings.groups.Insert(0, null); Assert.IsNotNull(Settings.DefaultGroup); Settings.groups.RemoveAt(0); } [Test] public void HasDefaultInitialGroups() { Assert.IsNotNull(Settings.FindGroup(AddressableAssetSettings.PlayerDataGroupName)); Assert.IsNotNull(Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName)); } [Test] public void HasDefaultVersionOverride() { Assert.AreEqual(kDefaultPlayerVersion, Settings.OverridePlayerVersion); } [Test] public void AddRemovelabel() { var initialValue = Settings.currentHash; const string labelName = "Newlabel"; Settings.AddLabel(labelName); Assert.Contains(labelName, Settings.labelTable.labelNames); Assert.AreNotEqual(initialValue, Settings.currentHash); Settings.RemoveLabel(labelName); Assert.False(Settings.labelTable.labelNames.Contains(labelName)); Assert.AreEqual(initialValue, Settings.currentHash); } [Test] public void RenameLabel_KeepsIndexTheSame_ForNewTableEntry() { string dummyLabel1, dummyLabel2, dummyLabel3; dummyLabel3 = dummyLabel2 = dummyLabel1 = "dummylabel"; string replaceMe = "replaceme"; string useMeToReplace = "usemetoreplace"; Settings.AddLabel(dummyLabel1); Settings.AddLabel(dummyLabel2); Settings.AddLabel(replaceMe); Settings.AddLabel(dummyLabel3); int startIndex = Settings.labelTable.GetIndexOfLabel(replaceMe); Settings.RenameLabel(replaceMe, useMeToReplace); int endIndex = Settings.labelTable.GetIndexOfLabel(useMeToReplace); Assert.AreEqual(startIndex, endIndex); Settings.RemoveLabel(dummyLabel1); Settings.RemoveLabel(dummyLabel2); Settings.RemoveLabel(dummyLabel3); Settings.RemoveLabel(useMeToReplace); } [Test] public void RenameLabel_UpdatesLabelList_WithCorrectLabels() { string replaceMe = "replaceme"; string useMeToReplace = "usemetoreplace"; Settings.AddLabel(replaceMe); Settings.RenameLabel(replaceMe, useMeToReplace); Assert.IsFalse(Settings.GetLabels().Contains(replaceMe)); Assert.IsTrue(Settings.GetLabels().Contains(useMeToReplace)); Settings.RemoveLabel(useMeToReplace); } [Test] public void RenameLabel_UpdatesAssetEntries_ThatContainUsesOfTheOldLabels() { string replaceMe = "replaceme"; string useMeToReplace = "usemetoreplace"; Settings.AddLabel(replaceMe); var assetEntry = Settings.CreateOrMoveEntry(m_AssetGUID, Settings.DefaultGroup); assetEntry.SetLabel(replaceMe, true); Settings.RenameLabel(replaceMe, useMeToReplace); Assert.IsTrue(assetEntry.labels.Contains(useMeToReplace)); Assert.IsFalse(assetEntry.labels.Contains(replaceMe)); Settings.RemoveAssetEntry(assetEntry); Settings.RemoveLabel(useMeToReplace); } [Test] public void GetLabels_ShouldReturnCopy() { const string labelName = "Newlabel"; Settings.AddLabel("label_1"); Settings.AddLabel("label_2"); var labels = Settings.GetLabels(); labels.Add(labelName); Assert.AreEqual(3, labels.Count); Assert.AreEqual(2, Settings.labelTable.labelNames.Count); Assert.IsFalse(Settings.labelTable.labelNames.Contains(labelName)); } [Test] public void WhenLabelNameHasSquareBrackets_AddingNewLabel_ThrowsError() { string name = "[label]"; Settings.AddLabel(name); LogAssert.Expect(LogType.Error, $"Label name '{name}' cannot contain '[ ]'."); } [Test] public void AddRemoveUnusedLabels() { var group = Settings.CreateGroup("NewGroupForUnusedLabelsTest", false, false, false, null); Assert.IsNotNull(group); var entry = Settings.CreateOrMoveEntry(m_AssetGUID, group); Assert.IsNotNull(entry); const string labelName = "LabelInUse"; const string labelName2 = "LabelNotInUse"; try { Settings.AddLabel(labelName); entry.SetLabel(labelName, true, false, false); Settings.AddLabel(labelName2); Assert.Contains(labelName, Settings.labelTable.labelNames); Assert.Contains(labelName2, Settings.labelTable.labelNames); Settings.RemoveUnusedLabels(); Assert.Contains(labelName, Settings.labelTable.labelNames); Assert.False(Settings.labelTable.labelNames.Contains(labelName2)); } finally { Settings.RemoveAssetEntry(entry); Settings.RemoveGroup(group); Settings.RemoveLabel(labelName, false); } } [Test] public void AddRemoveGroup() { const string groupName = "NewGroup"; var group = Settings.CreateGroup(groupName, false, false, false, null); Assert.IsNotNull(group); Settings.RemoveGroup(group); Assert.IsNull(Settings.FindGroup(groupName)); } [Test] public void RemoveMissingGroupsReferences_CheckGroupCount() { var size = Settings.groups.Count; var x = Settings.groups[size - 1]; Settings.groups[size - 1] = null; bool b = Settings.RemoveMissingGroupReferences(); Assert.AreEqual(Settings.groups.Count + 1, size); Settings.groups.Add(x); LogAssert.Expect(LogType.Log, "Addressable settings contains 1 group reference(s) that are no longer there. Removing reference(s)."); } [Test] public void CanCreateAssetReference() { AssetReference testReference = Settings.CreateAssetReference(m_AssetGUID); Assert.NotNull(testReference); var entry = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName).GetAssetEntry(m_AssetGUID); Assert.AreSame(testReference.AssetGUID, entry.guid); } [Test] public void CreateUpdateNewEntry() { var group = Settings.CreateGroup("NewGroupForCreateOrMoveEntryTest", false, false, false, null); Assert.IsNotNull(group); var entry = Settings.CreateOrMoveEntry(m_AssetGUID, group); Assert.IsNotNull(entry); Assert.AreSame(group, entry.parentGroup); var localDataGroup = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName); Assert.IsNotNull(localDataGroup); entry = Settings.CreateOrMoveEntry(m_AssetGUID, localDataGroup); Assert.IsNotNull(entry); Assert.AreNotSame(group, entry.parentGroup); Assert.AreSame(localDataGroup, entry.parentGroup); Settings.RemoveGroup(group); localDataGroup.RemoveAssetEntry(entry); var tmp = Settings.FindAssetEntry(entry.guid); Assert.IsNull(Settings.FindAssetEntry(entry.guid)); } [Test] public void CreateOrMoveEntries_CreatesNewEntries() { string guid1 = "guid1"; string guid2 = "guid2"; string guid3 = "guid3"; Settings.CreateOrMoveEntries(new List() {guid1, guid2, guid3}, Settings.DefaultGroup, new List(), new List()); Assert.IsNotNull(Settings.FindAssetEntry(guid1)); Assert.IsNotNull(Settings.FindAssetEntry(guid2)); Assert.IsNotNull(Settings.FindAssetEntry(guid3)); Settings.RemoveAssetEntry(guid1); Settings.RemoveAssetEntry(guid2); Settings.RemoveAssetEntry(guid3); } [Test] public void CreateOrMoveEntries_MovesEntriesThatAlreadyExist() { string guid1 = "guid1"; string guid2 = "guid2"; string guid3 = "guid3"; var group = Settings.CreateGroup("SeparateGroup", false, false, true, new List()); group.AddAssetEntry(Settings.CreateEntry(guid1, "addr1", group, false)); group.AddAssetEntry(Settings.CreateEntry(guid2, "addr2", group, false)); group.AddAssetEntry(Settings.CreateEntry(guid3, "addr3", group, false)); Settings.CreateOrMoveEntries(new List() {guid1, guid2, guid3}, Settings.DefaultGroup, new List(), new List()); Assert.IsNull(group.GetAssetEntry(guid1)); Assert.IsNull(group.GetAssetEntry(guid2)); Assert.IsNull(group.GetAssetEntry(guid3)); Assert.IsNotNull(Settings.DefaultGroup.GetAssetEntry(guid1)); Assert.IsNotNull(Settings.DefaultGroup.GetAssetEntry(guid2)); Assert.IsNotNull(Settings.DefaultGroup.GetAssetEntry(guid3)); Settings.RemoveGroup(group); } [Test] public void CreateOrMoveEntries_Creates_AndMovesExistingEntries_InMixedLists() { string guid1 = "guid1"; string guid2 = "guid2"; string guid3 = "guid3"; var group = Settings.CreateGroup("SeparateGroup", false, false, true, new List()); group.AddAssetEntry(Settings.CreateEntry(guid1, "addr1", group, false)); group.AddAssetEntry(Settings.CreateEntry(guid3, "addr3", group, false)); Settings.CreateOrMoveEntries(new List() {guid1, guid2, guid3}, Settings.DefaultGroup, new List(), new List()); Assert.IsNull(group.GetAssetEntry(guid1)); Assert.IsNull(group.GetAssetEntry(guid3)); Assert.IsNotNull(Settings.DefaultGroup.GetAssetEntry(guid1)); Assert.IsNotNull(Settings.DefaultGroup.GetAssetEntry(guid2)); Assert.IsNotNull(Settings.DefaultGroup.GetAssetEntry(guid3)); Settings.RemoveGroup(group); } [Test] public void CannotCreateOrMoveWithoutGuid() { Assert.IsNull(Settings.CreateOrMoveEntry(null, Settings.DefaultGroup)); Assert.IsNull(Settings.CreateSubEntryIfUnique(null, "", null)); } [Test] public void FindAssetEntry() { var localDataGroup = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName); Assert.IsNotNull(localDataGroup); var entry = Settings.CreateOrMoveEntry(m_AssetGUID, localDataGroup); var foundEntry = Settings.FindAssetEntry(m_AssetGUID); Assert.AreSame(entry, foundEntry); } [Test] public void FindAssetEntry_IncludeImplicitIsTrue_ReturnsImplicitEntries() { var folderPath = GetAssetPath("aaFolder"); Directory.CreateDirectory(folderPath); AssetDatabase.Refresh(); var folderGuid = AssetDatabase.AssetPathToGUID(folderPath); Assert.IsFalse(string.IsNullOrEmpty(folderGuid)); var asset1GUID = CreateAsset(Path.Combine(folderPath, "asset1.prefab").Replace('\\', '/')); var folderEntry = Settings.CreateOrMoveEntry(folderGuid, Settings.DefaultGroup); Assert.IsNotNull(folderEntry); var foundEntry = Settings.FindAssetEntry(asset1GUID, false); Assert.IsNull(foundEntry); foundEntry = Settings.FindAssetEntry(asset1GUID, true); Assert.AreEqual(AssetDatabase.GUIDToAssetPath(asset1GUID), foundEntry.AssetPath); Directory.Delete(folderPath, true); Settings.RemoveAssetEntry(folderEntry, false); } [Test] public void AddressablesClearCachedData_DoesNotThrowError() { //individual clean paths foreach (ScriptableObject so in Settings.DataBuilders) { BuildScriptBase db = so as BuildScriptBase; Assert.DoesNotThrow(() => Settings.CleanPlayerContentImpl(db)); } //Clean all path Assert.DoesNotThrow(() => Settings.CleanPlayerContentImpl()); //Cleanup Settings.BuildPlayerContentImpl(); } [Test] public void AddressablesCleanCachedData_ClearsData() { //Setup Settings.BuildPlayerContentImpl(); //Check after each clean that the data is not built foreach (ScriptableObject so in Settings.DataBuilders) { BuildScriptBase db = so as BuildScriptBase; Settings.CleanPlayerContentImpl(db); Assert.IsFalse(db.IsDataBuilt()); } } [Test] public void AddressablesCleanAllCachedData_ClearsAllData() { //Setup Settings.BuildPlayerContentImpl(); //Clean ALL data builders Settings.CleanPlayerContentImpl(); //Check none have data built foreach (ScriptableObject so in Settings.DataBuilders) { BuildScriptBase db = so as BuildScriptBase; Assert.IsFalse(db.IsDataBuilt()); } } [Test] public void DeletingAsset_DoesNotDeleteGroupWithSimilarName() { //Setup const string groupName = "NewAsset.mat"; string assetPath = GetAssetPath(groupName); var mat = new Material(Shader.Find("Unlit/Color")); AssetDatabase.CreateAsset(mat, assetPath); var group = Settings.CreateGroup(groupName, false, false, false, null); Assert.IsNotNull(group); //Test AssetDatabase.DeleteAsset(assetPath); //Assert Settings.CheckForGroupDataDeletion(groupName); Assert.IsNotNull(Settings.FindGroup(groupName)); //Clean up Settings.RemoveGroup(group); Assert.IsNull(Settings.FindGroup(groupName)); } [Test] public void Settings_WhenActivePlayerDataBuilderIndexSetWithSameValue_DoesNotDirtyAsset() { var prevDC = EditorUtility.GetDirtyCount(Settings); Settings.ActivePlayerDataBuilderIndex = Settings.ActivePlayerDataBuilderIndex; var dc = EditorUtility.GetDirtyCount(Settings); Assert.AreEqual(prevDC, dc); } [Test] public void Settings_WhenActivePlayerDataBuilderIndexSetWithDifferentValue_DoesDirtyAsset() { var prevDC = EditorUtility.GetDirtyCount(Settings); Settings.ActivePlayerDataBuilderIndex = Settings.ActivePlayerDataBuilderIndex + 1; var dc = EditorUtility.GetDirtyCount(Settings); Assert.AreEqual(prevDC + 1, dc); } [Test] public void AddressableAssetSettings_OnPostprocessAllAssets_AddDeleteGroupTriggersSettingsSave() { // Setup var importedAssets = new string[1]; var deletedAssets = new string[0]; var movedAssets = new string[0]; var movedFromAssetPaths = new string[0]; var newGroup = ScriptableObject.CreateInstance(); newGroup.Name = "testGroup"; var groupPath = ConfigFolder + "/AssetGroups/" + newGroup.Name + ".asset"; AssetDatabase.CreateAsset(newGroup, groupPath); newGroup.Initialize(ScriptableObject.CreateInstance(), "testGroup", AssetDatabase.AssetPathToGUID(groupPath), false); importedAssets[0] = groupPath; EditorUtility.ClearDirty(Settings); var prevDC = EditorUtility.GetDirtyCount(Settings); // Test Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Assert.AreEqual(prevDC + 1, EditorUtility.GetDirtyCount(Settings)); Assert.IsTrue(EditorUtility.IsDirty(Settings)); deletedAssets = new string[1]; importedAssets = new string[0]; deletedAssets[0] = groupPath; EditorUtility.ClearDirty(Settings); prevDC = EditorUtility.GetDirtyCount(Settings); Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Assert.AreEqual(prevDC + 2, EditorUtility.GetDirtyCount(Settings)); Assert.IsTrue(EditorUtility.IsDirty(Settings)); } [Test] public void AddressableAssetSettings_OnPostprocessAllAssets_DeleteAssetToNullNotTriggerSettingsSave() { // Setup var importedAssets = new string[0]; var deletedAssets = new string[1]; var movedAssets = new string[0]; var movedFromAssetPaths = new string[0]; Settings.groups.Add(null); Settings.DataBuilders.Add(null); Settings.GroupTemplateObjects.Add(null); Settings.InitializationObjects.Add(null); deletedAssets[0] = ""; EditorUtility.ClearDirty(Settings); var prevDC = EditorUtility.GetDirtyCount(Settings); // Test Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Assert.AreEqual(prevDC, EditorUtility.GetDirtyCount(Settings)); Assert.IsFalse(EditorUtility.IsDirty(Settings)); } [Test] public void AddressableAssetSettings_OnPostprocessAllAssets_ChangeImportedAssetsDoesNotTriggerSettingsSave() { var importedAssets = new string[1]; var deletedAssets = new string[0]; var movedAssets = new string[0]; var movedFromAssetPaths = new string[0]; var entry = Settings.CreateOrMoveEntry(m_AssetGUID, Settings.groups[0]); var prevTestObjName = entry.MainAsset.name; entry.MainAsset.name = "test"; importedAssets[0] = TestFolder + "/test.prefab"; EditorUtility.ClearDirty(Settings); var prevDC = EditorUtility.GetDirtyCount(Settings); Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Assert.AreEqual(prevDC, EditorUtility.GetDirtyCount(Settings)); Assert.IsFalse(EditorUtility.IsDirty(Settings)); entry.MainAsset.name = prevTestObjName; } [Test] public void AddressableAssetSettings_OnPostprocessAllAssets_MovedGroupNotTriggerSettingsSave() { // Setup var importedAssets = new string[0]; var deletedAssets = new string[0]; var movedAssets = new string[1]; var movedFromAssetPaths = new string[1]; var newGroup = ScriptableObject.CreateInstance(); newGroup.Name = "testGroup"; var groupPath = ConfigFolder + "/AssetGroups/" + newGroup.Name + ".asset"; AssetDatabase.CreateAsset(newGroup, groupPath); newGroup.Initialize(ScriptableObject.CreateInstance(), "testGroup", AssetDatabase.AssetPathToGUID(groupPath), false); EditorUtility.ClearDirty(Settings); var prevDC = EditorUtility.GetDirtyCount(Settings); Settings.groups.Add(newGroup); string newGroupPath = ConfigFolder + "/AssetGroups/changeGroup.asset"; AssetDatabase.MoveAsset(groupPath, newGroupPath); movedAssets[0] = newGroupPath; movedFromAssetPaths[0] = groupPath; // Test Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Assert.AreEqual(prevDC, EditorUtility.GetDirtyCount(Settings)); Assert.IsFalse(EditorUtility.IsDirty(Settings)); //Cleanup Settings.RemoveGroup(newGroup); } [Test] public void AddressableAssetSettings_OnPostprocessAllAssets_MovedAssetToResourcesNotTriggerSettingsSave() { // Setup var importedAssets = new string[0]; var deletedAssets = new string[0]; var movedAssets = new string[1]; var movedFromAssetPaths = new string[1]; var assetPath = TestFolder + "/test.prefab"; var newAssetPath = TestFolder + "/resources/test.prefab"; if (!Directory.Exists(TestFolder + "/resources")) { Directory.CreateDirectory(TestFolder + "/resources"); AssetDatabase.Refresh(); } Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(newAssetPath), Settings.groups[0]); movedAssets[0] = newAssetPath; movedFromAssetPaths[0] = assetPath; EditorUtility.ClearDirty(Settings); var prevDC = EditorUtility.GetDirtyCount(Settings); Settings.OnPostprocessAllAssets(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths); Assert.AreEqual(prevDC, EditorUtility.GetDirtyCount(Settings)); Assert.IsFalse(EditorUtility.IsDirty(Settings)); // Cleanup AssetDatabase.MoveAsset(newAssetPath, assetPath); Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(assetPath), Settings.groups[0]); Directory.Delete(TestFolder + "/resources"); } [Test] public void AddressableAssetSettings_ActivePlayerDataBuilderIndex_CanGetActivePlayModeDataBuilderIndex() { Assert.NotNull(Settings.ActivePlayerDataBuilderIndex); } [Test] public void AddressableAssetSettings_ActivePlayerDataBuilderIndex_CanSetActivePlayModeDataBuilderIndex() { var prevActivePlayModeDataBuilderIndex = Settings.ActivePlayerDataBuilderIndex; Settings.ActivePlayerDataBuilderIndex = 1; Assert.AreNotEqual(prevActivePlayModeDataBuilderIndex, Settings.ActivePlayerDataBuilderIndex); Settings.ActivePlayerDataBuilderIndex = prevActivePlayModeDataBuilderIndex; } #pragma warning disable 618 [Test] public void AddressableAssetSettings_RemoveSchemaTemplate_CannotRemoveGroupSchemaTemplate() { LogAssert.Expect(LogType.Error, "GroupSchemaTemplates are deprecated, use GroupTemplateObjects"); Settings.RemoveSchemaTemplate(0); } #pragma warning restore 618 [Test] public void AddressableAssetSettings_GetGroupTemplateObject_CanGetGroupTemplateObject() { var groupTemplate = Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1); Assert.NotNull(groupTemplate); } [Test] public void AddressableAssetSettings_AddGroupTemplateObject_CanAddGroupTemplateObject() { var template = ScriptableObject.CreateInstance(); template.name = "testGroup"; Settings.AddGroupTemplateObject(template); var groupTemplate = Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1); Assert.NotNull(groupTemplate); Assert.Greater(Settings.GroupTemplateObjects.Count, 1); Assert.AreEqual(groupTemplate.Name, template.name); Assert.AreSame(groupTemplate, template); Assert.IsTrue(Settings.CreateAndAddGroupTemplate("testCreatAndAdd", "test template function", typeof(BundledAssetGroupSchema))); } [Test] public void AddressableAssetSettings_SetGroupTemplateObjectAtIndex_CanSetGroupTemplateObject() { // Setup var testTemplate1 = ScriptableObject.CreateInstance(); var testTemplate2 = ScriptableObject.CreateInstance(); var template = ScriptableObject.CreateInstance(); testTemplate1.name = "test1"; testTemplate2.name = "test2"; template.name = "testGroupIndex"; var restoredObjects = new List(Settings.GroupTemplateObjects); Settings.AddGroupTemplateObject(testTemplate1); Settings.AddGroupTemplateObject(testTemplate2); var saveTemplate = Settings.GetGroupTemplateObject(0); var checkUnchangedTemplate = Settings.GetGroupTemplateObject(1); // Test Settings.SetGroupTemplateObjectAtIndex((Settings.GroupTemplateObjects.Count - 1), template, true); Settings.SetGroupTemplateObjectAtIndex(0, template, true); var groupTemplate = Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1); Assert.NotNull(groupTemplate); Assert.AreSame(template, groupTemplate); groupTemplate = Settings.GetGroupTemplateObject(0); Assert.NotNull(groupTemplate); Assert.AreSame(template, groupTemplate); groupTemplate = Settings.GetGroupTemplateObject(1); Assert.NotNull(groupTemplate); Assert.AreSame(checkUnchangedTemplate, groupTemplate); /* Cleanup * Restore GroupTemplateObjects */ Settings.RemoveGroupTemplateObject(2, true); Settings.RemoveGroupTemplateObject(1, true); Settings.SetGroupTemplateObjectAtIndex(0, saveTemplate, true); Assert.AreEqual(restoredObjects.Count, Settings.GroupTemplateObjects.Count); Assert.AreSame(restoredObjects[0], Settings.GroupTemplateObjects[0]); } [Test] public void AddressableAssetSettings_AddGroupTemplateObject_CannotAddInvalidGroupTemplateObject() { int currentGroupTemplateCount = Settings.GroupTemplateObjects.Count; var unchangedGroupTemplate = Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1); ScriptableObject groupTemplate = null; Assert.IsFalse(Settings.AddGroupTemplateObject(groupTemplate as IGroupTemplate)); Assert.AreSame(unchangedGroupTemplate, Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1)); var groupTemplateTest = new GroupTemplateTestObj(); Assert.IsFalse(Settings.AddGroupTemplateObject(groupTemplateTest as IGroupTemplate)); Assert.AreEqual(currentGroupTemplateCount, Settings.GroupTemplateObjects.Count); Assert.AreSame(unchangedGroupTemplate, Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1)); } [Test] public void AddressableAssetSettings_CreateAndAddGroupTemplate_CannotAddInvalidGroupTemplateObject() { Assert.IsFalse(Settings.CreateAndAddGroupTemplate(null, "test template function", null)); Assert.IsFalse(Settings.CreateAndAddGroupTemplate("testCreatAndAdd", "test template function", new Type[0])); var testParams = new Type[1]; testParams[0] = null; Assert.IsFalse(Settings.CreateAndAddGroupTemplate("testCreatAndAdd", "test template function", testParams)); testParams[0] = typeof(ScriptableObject); Assert.IsFalse(Settings.CreateAndAddGroupTemplate("testCreatAndAdd", "test template function", testParams)); } [Test] public void AddressableAssetSettings_SetGroupTemplateObjectAtIndex_CannotSetInvalidGroupTemplateObject() { int currentGroupTemplateCount = Settings.GroupTemplateObjects.Count; var unchangedGroupTemplate = Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1); ScriptableObject groupTemplate = null; Assert.IsFalse(Settings.SetGroupTemplateObjectAtIndex(Settings.GroupTemplateObjects.Count - 1, groupTemplate as IGroupTemplate)); Assert.AreSame(unchangedGroupTemplate, Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1)); var groupTemplateTest = new GroupTemplateTestObj(); Assert.IsFalse(Settings.SetGroupTemplateObjectAtIndex(Settings.GroupTemplateObjects.Count - 1, groupTemplateTest as IGroupTemplate)); Assert.AreEqual(currentGroupTemplateCount, Settings.GroupTemplateObjects.Count); Assert.AreSame(unchangedGroupTemplate, Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count - 1)); } [Test] public void AddressableAssetSettings_RemoveGroupTemplateObject_CannotRemoveNonExistentGroupTemplateObject() { Assert.IsFalse(Settings.RemoveGroupTemplateObject(Settings.GroupTemplateObjects.Count)); } [Test] public void AddressableAssetSettings_GetGroupTemplateObject_CannotGetNonExistentGroupTemplateObject() { Assert.IsNull(Settings.GetGroupTemplateObject(Settings.GroupTemplateObjects.Count)); } internal static bool IsNullOrEmpty(ICollection collection) { return collection == null || collection.Count == 0; } [Test] public void AddressableAssetSettings_GetGroupTemplateObject_CannotGetFromEmptyGroupTemplateObjectList() { var testSettings = new AddressableAssetSettings(); while (!IsNullOrEmpty(testSettings.GroupTemplateObjects)) { testSettings.RemoveGroupTemplateObject(0); } Assert.AreEqual(0, testSettings.GroupTemplateObjects.Count); Assert.IsNull(testSettings.GetGroupTemplateObject(1)); } [Test] public void AddressableAssetSettings_AddDataBuilder_CanAddDataBuilder() { var testBuilder = Settings.GetDataBuilder(0); var testBuilderTwo = Settings.GetDataBuilder(1); var lastBuilder = Settings.GetDataBuilder(Settings.DataBuilders.Count - 1); int buildersCount = Settings.DataBuilders.Count; // Test Assert.IsTrue(Settings.AddDataBuilder(testBuilder as IDataBuilder)); Assert.AreEqual(buildersCount + 1, Settings.DataBuilders.Count); Assert.AreEqual(Settings.DataBuilders[Settings.DataBuilders.Count - 1], testBuilder); } [Test] public void AddressableAssetSettings_RemoveDataBuilder_CanRemoveDataBuilder() { var testBuilder = Settings.GetDataBuilder(0); var testBuilderTwo = Settings.GetDataBuilder(1); var lastBuilder = Settings.GetDataBuilder(Settings.DataBuilders.Count - 1); int buildersCount = Settings.DataBuilders.Count; Settings.AddDataBuilder(testBuilder as IDataBuilder); // Test Assert.IsTrue(Settings.RemoveDataBuilder(Settings.DataBuilders.Count - 1)); Assert.AreEqual(buildersCount, Settings.DataBuilders.Count); Assert.AreEqual(lastBuilder, Settings.GetDataBuilder(Settings.DataBuilders.Count - 1)); } [Test] public void AddressableAssetSettings_SetDataBuilder_CanSetDataBuilder() { var testBuilder = Settings.GetDataBuilder(0); var testBuilderTwo = Settings.GetDataBuilder(1); var lastBuilder = Settings.GetDataBuilder(Settings.DataBuilders.Count - 1); int buildersCount = Settings.DataBuilders.Count; Settings.AddDataBuilder(testBuilder as IDataBuilder); // Test Assert.IsTrue(Settings.SetDataBuilderAtIndex(Settings.DataBuilders.Count - 1, testBuilderTwo)); Assert.AreEqual(Settings.GetDataBuilder(Settings.DataBuilders.Count - 1), testBuilderTwo); //Cleanup Assert.IsTrue(Settings.RemoveDataBuilder(Settings.DataBuilders.Count - 1)); Assert.AreEqual(buildersCount, Settings.DataBuilders.Count); Assert.AreEqual(lastBuilder, Settings.GetDataBuilder(Settings.DataBuilders.Count - 1)); } [Test] public void AddressableAssetSettings_AddDataBuilder_CannotAddInvalidDataBuilders() { int currentDataBuildersCount = Settings.DataBuilders.Count; var unchangedDataBuilder = Settings.GetDataBuilder(Settings.DataBuilders.Count - 1); ScriptableObject testBuilder = null; Assert.IsFalse(Settings.AddDataBuilder(testBuilder as IDataBuilder)); Assert.AreSame(unchangedDataBuilder, Settings.GetDataBuilder(Settings.DataBuilders.Count - 1)); var testDataBuilder = new DataBuilderTest(); Assert.IsFalse(Settings.AddDataBuilder(testDataBuilder as IDataBuilder)); Assert.AreEqual(currentDataBuildersCount, Settings.DataBuilders.Count); Assert.AreSame(unchangedDataBuilder, Settings.GetDataBuilder(Settings.DataBuilders.Count - 1)); } [Test] public void AddressableAssetSettings_SetDataBuilderAtIndex_CannotSetInvalidDataBuilders() { int currentDataBuildersCount = Settings.DataBuilders.Count; var unchangedDataBuilder = Settings.GetDataBuilder(Settings.DataBuilders.Count - 1); ScriptableObject testBuilder = null; Assert.IsFalse(Settings.SetDataBuilderAtIndex(Settings.DataBuilders.Count - 1, testBuilder as IDataBuilder)); Assert.AreSame(unchangedDataBuilder, Settings.GetDataBuilder(Settings.DataBuilders.Count - 1)); var testDataBuilder = new DataBuilderTest(); Assert.IsFalse(Settings.SetDataBuilderAtIndex(Settings.DataBuilders.Count - 1, testDataBuilder as IDataBuilder)); Assert.AreEqual(currentDataBuildersCount, Settings.DataBuilders.Count); Assert.AreSame(unchangedDataBuilder, Settings.GetDataBuilder(Settings.DataBuilders.Count - 1)); Assert.IsFalse(Settings.SetDataBuilderAtIndex(5, testDataBuilder)); } [Test] public void AddressableAssetSettings_GetDataBuilder_CannotGetNonExistentDataBuilder() { Assert.IsNull(Settings.GetDataBuilder(Settings.DataBuilders.Count)); } [Test] public void AddressableAssetSettings_RemoveDataBuilder_CannotRemoveNonExistentDataBuilder() { Assert.IsFalse(Settings.RemoveDataBuilder(Settings.DataBuilders.Count)); } [Test] public void AddressableAssetSettings_GetDataBuilder_CannotGetDataBuilderFromEmpty() { var testSettings = new AddressableAssetSettings(); while (!IsNullOrEmpty(testSettings.DataBuilders)) { testSettings.RemoveDataBuilder(0); } Assert.AreEqual(0, testSettings.DataBuilders.Count); Assert.IsNull(testSettings.GetDataBuilder(1)); } [Test] public void AddressableAssetSettings_AddInitializationObject_CanAddInitializationObject() { var testInitObject = ScriptableObject.CreateInstance(); testInitObject.name = "testObj"; var testInitObjectTwo = ScriptableObject.CreateInstance(); testInitObjectTwo.name = "testObjTwo"; var lastInitObject = Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1); int initObjectsCount = Settings.InitializationObjects.Count; // Test Assert.IsTrue(Settings.AddInitializationObject(testInitObject as IObjectInitializationDataProvider)); Assert.AreEqual(initObjectsCount + 1, Settings.InitializationObjects.Count); Assert.AreEqual(Settings.InitializationObjects[Settings.InitializationObjects.Count - 1], testInitObject); // Cleanup Settings.RemoveInitializationObject(Settings.InitializationObjects.Count - 1); } [Test] public void AddressableAssetSettings_SetInitializationObject_CanSetInitializationObject() { var testInitObject = ScriptableObject.CreateInstance(); testInitObject.name = "testObj"; var testInitObjectTwo = ScriptableObject.CreateInstance(); testInitObjectTwo.name = "testObjTwo"; var lastInitObject = Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1); int initObjectsCount = Settings.InitializationObjects.Count; Settings.AddInitializationObject(testInitObject as IObjectInitializationDataProvider); // Test Assert.IsTrue(Settings.SetInitializationObjectAtIndex(Settings.InitializationObjects.Count - 1, testInitObjectTwo as IObjectInitializationDataProvider)); Assert.AreEqual(Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1), testInitObjectTwo); // Cleanup Settings.RemoveInitializationObject(Settings.InitializationObjects.Count - 1); } [Test] public void AddressableAssetSettings_RemoveInitializationObject_CanRemoveInitializationObject() { var testInitObject = ScriptableObject.CreateInstance(); testInitObject.name = "testObj"; var testInitObjectTwo = ScriptableObject.CreateInstance(); testInitObjectTwo.name = "testObjTwo"; var lastInitObject = Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1); int initObjectsCount = Settings.InitializationObjects.Count; Settings.AddInitializationObject(testInitObject as IObjectInitializationDataProvider); /* Cleanup */ Assert.IsTrue(Settings.RemoveInitializationObject(Settings.InitializationObjects.Count - 1)); Assert.AreEqual(initObjectsCount, Settings.InitializationObjects.Count); Assert.AreEqual(lastInitObject, Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1)); } [Test] public void AddressableAssetSettings_AddInitializationObject_CannotAddInvalidInitializationObject() { int currentInitObjectsCount = Settings.InitializationObjects.Count; ScriptableObject initObject = null; Assert.IsFalse(Settings.AddInitializationObject(initObject as IObjectInitializationDataProvider)); Assert.IsNull(Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1)); var initTestObject = new InitializationObejctTest(); Assert.IsFalse(Settings.AddInitializationObject(initTestObject as IObjectInitializationDataProvider)); Assert.AreEqual(currentInitObjectsCount, Settings.InitializationObjects.Count); Assert.IsNull(Settings.GetDataBuilder(Settings.InitializationObjects.Count - 1)); } [Test] public void AddressableAssetSettings_SetInitializationObjectAtIndex_CannotSetInvalidInitializationObject() { int currentInitObjectsCount = Settings.InitializationObjects.Count; ScriptableObject initObject = null; Assert.IsFalse(Settings.SetInitializationObjectAtIndex(Settings.InitializationObjects.Count - 1, initObject as IObjectInitializationDataProvider)); Assert.IsNull(Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1)); var initTestObject = new InitializationObejctTest(); Assert.IsFalse(Settings.SetInitializationObjectAtIndex(Settings.InitializationObjects.Count - 1, initTestObject as IObjectInitializationDataProvider)); var testInitObject = ScriptableObject.CreateInstance(); testInitObject.name = "testObj"; Settings.AddInitializationObject(testInitObject as IObjectInitializationDataProvider); Assert.IsFalse(Settings.SetInitializationObjectAtIndex(2, testInitObject)); } [Test] public void AddressableAssetSettings_GetInitializationObject_CannotGetInvalidInitializationObject() { int currentInitObjectsCount = Settings.InitializationObjects.Count; Assert.IsNull(Settings.GetInitializationObject(Settings.InitializationObjects.Count - 1)); Assert.IsNull(Settings.GetInitializationObject(-1)); } [Test] public void AddressableAssetSettings_RemoveInitializationObject_CannotRemoveNonExistentInitializationObject() { Assert.IsFalse(Settings.RemoveInitializationObject(Settings.InitializationObjects.Count)); } [Test] public void AddressableAssetSettings_GetInitializationObject_CannotGetNonExistentInitializationObject() { Assert.IsNull(Settings.GetInitializationObject(Settings.InitializationObjects.Count)); } [Test] public void AddressableAssetSettings_GetInitializationObject_CannotGetInitializationObjectFromEmptyList() { var testSettings = new AddressableAssetSettings(); while (!IsNullOrEmpty(testSettings.InitializationObjects)) { testSettings.RemoveInitializationObject(0); } Assert.AreEqual(0, testSettings.InitializationObjects.Count); Assert.IsNull(testSettings.GetInitializationObject(1)); } [Test] public void AddressableAssetSettings_MoveAssetsFromResources_CanMoveAssetsFromResources() { // Setup var testGuidsToPaths = new Dictionary(); var testObject = new GameObject("TestObjectMoveAssets"); PrefabUtility.SaveAsPrefabAsset(testObject, ConfigFolder + "/testasset.prefab"); var testAssetGUID = AssetDatabase.AssetPathToGUID(ConfigFolder + "/testasset.prefab"); Settings.CreateOrMoveEntry(testAssetGUID, Settings.FindGroup(AddressableAssetSettings.PlayerDataGroupName)); var originalAssetEntry = Settings.CreateOrMoveEntry(m_AssetGUID, Settings.FindGroup(AddressableAssetSettings.PlayerDataGroupName)); var prevAddress = originalAssetEntry.address; var prevDC = EditorUtility.GetDirtyCount(Settings); var prevGroup = originalAssetEntry.parentGroup; var prevPath = AssetDatabase.GUIDToAssetPath(m_AssetGUID); var prevPathTwo = AssetDatabase.GUIDToAssetPath(testAssetGUID); var testGroup = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName); var testAssetPath = TestFolder + "/testMoveAssets"; testGuidsToPaths[m_AssetGUID] = testAssetPath + "/resources/test.prefab"; testGuidsToPaths[testAssetGUID] = testAssetPath + "/resources/testasset.prefab"; // Test Settings.MoveAssetsFromResources(testGuidsToPaths, testGroup); var dc = EditorUtility.GetDirtyCount(Settings); Assert.AreNotEqual(prevPath, AssetDatabase.GUIDToAssetPath(m_AssetGUID)); Assert.AreNotEqual(prevPathTwo, AssetDatabase.GUIDToAssetPath(testAssetGUID)); Assert.AreNotEqual(prevGroup, Settings.FindAssetEntry(m_AssetGUID).parentGroup); Assert.AreNotEqual(prevGroup, Settings.FindAssetEntry(testAssetGUID).parentGroup); Assert.AreEqual(prevDC + 1, dc); testGuidsToPaths[m_AssetGUID] = TestFolder + "/test.prefab"; testGuidsToPaths[testAssetGUID] = TestFolder + "/testasset.prefab"; Settings.MoveAssetsFromResources(testGuidsToPaths, prevGroup); originalAssetEntry = Settings.FindAssetEntry(m_AssetGUID); Assert.AreEqual(originalAssetEntry.address, "test"); //Cleanup originalAssetEntry.address = prevAddress; if (Directory.Exists(testAssetPath)) AssetDatabase.DeleteAsset(testAssetPath); EditorBuildSettings.RemoveConfigObject(testAssetPath); } [Test] public void AddressableAssetSettings_MoveAssetsFromResources_AddressRespectFolderHierarchy() { // Setup var guidsToPaths = new Dictionary(); var obj = new GameObject("TestObjectMoveAssets"); var objFolder = TestFolder + "/Resources/subfolder/subsubfolder"; if (!Directory.Exists(objFolder)) { Directory.CreateDirectory(objFolder); } var objPath = objFolder + "/testasset.prefab"; PrefabUtility.SaveAsPrefabAsset(obj, objPath); var guid = AssetDatabase.AssetPathToGUID(objPath); var playerDataGroup = Settings.FindGroup(AddressableAssetSettings.PlayerDataGroupName); Settings.CreateOrMoveEntry(guid, playerDataGroup); var destinationFolder = TestFolder + "/testMoveAssets"; guidsToPaths[guid] = destinationFolder + "/testasset.prefab"; // Test var defaultLocalGroup = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName); Settings.MoveAssetsFromResources(guidsToPaths, defaultLocalGroup); var idx = objPath.ToLower().LastIndexOf("resources/"); var expectedAddress = objPath.Substring(idx + 10).Replace(Path.GetExtension(objPath), ""); var entry = Settings.FindAssetEntry(guid); Assert.AreEqual(expectedAddress, entry.address); Assert.AreEqual(guidsToPaths[guid], AssetDatabase.GUIDToAssetPath(guid)); Assert.AreEqual(defaultLocalGroup, entry.parentGroup); //Cleanup if (Directory.Exists(TestFolder + "/Resources")) AssetDatabase.DeleteAsset(TestFolder + "/Resources"); EditorBuildSettings.RemoveConfigObject(TestFolder + "/Resources"); Settings.RemoveAssetEntry(guid); AssetDatabase.DeleteAsset(guidsToPaths[guid]); if (Directory.Exists(destinationFolder)) AssetDatabase.DeleteAsset(destinationFolder); EditorBuildSettings.RemoveConfigObject(destinationFolder); } [Test] public void AddressableAssetSettings_MoveAssetsFromResources_CannotMoveNullOrInvalidAsset() { Settings.MoveAssetsFromResources(null, null); var testAssetEntry = Settings.CreateOrMoveEntry(m_AssetGUID, Settings.FindGroup(AddressableAssetSettings.PlayerDataGroupName)); var currentGroup = testAssetEntry.parentGroup; var testGuidsToPaths = new Dictionary(); var currentPath = AssetDatabase.GUIDToAssetPath(m_AssetGUID); var newAssetPath = TestFolder + "/testMoveAssets"; testGuidsToPaths[m_AssetGUID] = newAssetPath + "/test.prefab"; Settings.MoveAssetsFromResources(testGuidsToPaths, null); Settings.MoveEntry(testAssetEntry, null); Assert.AreEqual(currentPath, AssetDatabase.GUIDToAssetPath(m_AssetGUID)); Assert.AreEqual(currentGroup, Settings.FindAssetEntry(m_AssetGUID).parentGroup); } [Test] public void AddressableAssetSettings_SetMaxConcurrentWebRequests_CanSet() { Settings.MaxConcurrentWebRequests = 100; Assert.AreEqual(100, Settings.MaxConcurrentWebRequests); } [Test] public void AddressableAssetSettings_SetMaxConcurrentWebRequestsWithValueOutsideOfBounds_IsClamped() { Settings.MaxConcurrentWebRequests = 0; Assert.AreEqual(1, Settings.MaxConcurrentWebRequests); Settings.MaxConcurrentWebRequests = 2000; Assert.AreEqual(1024, Settings.MaxConcurrentWebRequests); } [TestCase(1)] [TestCase(5)] public void AddressableAssetSettings_SetLabelValueForEntries_CanSet(int numEntries) { // Setup List entries = new List(); var newLabel = "testSetLabelValueForEntries"; SetupEntries(ref entries, numEntries); var prevDC = EditorUtility.GetDirtyCount(Settings); // Test Settings.SetLabelValueForEntries(entries, newLabel, true, true); foreach (var e in entries) Assert.IsTrue(e.labels.Contains(newLabel)); Assert.AreEqual(prevDC + 1, EditorUtility.GetDirtyCount(Settings)); // Cleanup Settings.RemoveLabel(newLabel); } [TestCase(1, 2)] [TestCase(5, 8)] public void AddressableAssetSettings_RemoveLabel_RemoveLabelShouldRemoveDeletedLabelFromEntries(int numEntries, int numLabels) { // Setup List entries = new List(); SetupEntries(ref entries, numEntries); List testLabels = new List(); for (int i = 1; i <= numLabels; i++) { var newLabel = "testSetLabelValueForEntries" + i; testLabels.Add(newLabel); Settings.SetLabelValueForEntries(entries, newLabel, true, true); } // Test // Remove half the labels for (int i = 0; i < numLabels / 2; i++) Settings.RemoveLabel(testLabels[i]); foreach (var e in entries) foreach (var l in testLabels) Assert.IsTrue(e.labels.Contains(l)); // Check that each of the first half of labels were removed foreach (var e in entries) { e.CreateKeyList(); for (int i = 0; i < numLabels; i++) { if (i < numLabels / 2) Assert.IsFalse(e.labels.Contains(testLabels[i])); else Assert.IsTrue(e.labels.Contains(testLabels[i])); } } // Cleanup for (int i = numLabels / 2; i < numLabels; i++) { Settings.RemoveLabel(testLabels[i]); } } [Test] public void AddressableAssetSettings_HashChanges_WhenGroupIsAdded() { var prevHash = Settings.currentHash; var newGroup = Settings.CreateGroup("doesnt matter", true, false, false, null, typeof(ContentUpdateGroupSchema), typeof(BundledAssetGroupSchema)); Assert.AreNotEqual(Settings.currentHash, prevHash); Settings.RemoveGroup(newGroup); Assert.AreEqual(Settings.currentHash, prevHash); } [Test] public void AddressableAssetSettings_HashChanges_WhenBuildSettingsChange() { var initialSetting = Settings.buildSettings.LogResourceManagerExceptions; var initialHash = Settings.currentHash; Settings.buildSettings.LogResourceManagerExceptions = !initialSetting; Assert.AreNotEqual(Settings.currentHash, initialHash); Settings.buildSettings.LogResourceManagerExceptions = initialSetting; Assert.AreEqual(Settings.currentHash, initialHash); } [Test] public void AddressableAssetSettings_HashChanges_HandleNullGroups() { var prevHash = Settings.currentHash; var newGroup = Settings.CreateGroup("doesnt matter", true, false, false, null, typeof(ContentUpdateGroupSchema), typeof(BundledAssetGroupSchema)); Assert.AreNotEqual(Settings.currentHash, prevHash); var groupAddedHash = Settings.currentHash; // so delete the file, then we should be able to iterate through groups and ensure we find a null reference var groupFile = Settings.ConfigFolder + "/AssetGroups/doesnt matter.asset"; Assert.True(File.Exists(groupFile)); AssetDatabase.DeleteAsset(groupFile); // SetDirty hasn't been called so the hash stays the same Assert.AreEqual(Settings.currentHash, groupAddedHash); // add a real null group, does not call SetDirty Settings.groups.Add(null); Assert.AreEqual(Settings.currentHash, groupAddedHash); // calling SetDirty manually ignores both the deleted and null groups and we return to the initial hash Settings.SetDirty(ModificationEvent.GroupAdded, null, true); Assert.AreEqual(Settings.currentHash, prevHash); // count does not count null groups so equal, SetDirty is called and reverts to original Settings.RemoveGroup(newGroup); Assert.AreEqual(Settings.currentHash, prevHash); // count is the same, should be equal Settings.RemoveGroup(null); Assert.AreEqual(Settings.currentHash, prevHash); } [Test] public void CustomEntryCommand_WhenRegistered_InvokeIsCalled() { string notSet = null; AddressableAssetSettings.RegisterCustomAssetEntryCommand("cmd1", s => notSet = "set"); Assert.IsTrue(AddressableAssetSettings.InvokeAssetEntryCommand("cmd1", new AddressableAssetEntry[] { })); Assert.AreEqual("set", notSet); AddressableAssetSettings.UnregisterCustomAssetEntryCommand("cmd1"); } [Test] public void CustomEntryCommand_WhenCommandThrows_InvokeDoesNotThrow() { AddressableAssetSettings.RegisterCustomAssetEntryCommand("cmd1", s => throw new Exception()); Assert.DoesNotThrow(() => { LogAssert.Expect(LogType.Error, $"Encountered exception when running Asset Entry Command 'cmd1': Exception of type 'System.Exception' was thrown."); Assert.IsFalse(AddressableAssetSettings.InvokeAssetEntryCommand("cmd1", new AddressableAssetEntry[] { })); }); AddressableAssetSettings.UnregisterCustomAssetEntryCommand("cmd1"); } [Test] public void CustomEntryCommand_WhenCommandHasNullEntries_ReturnsFalseAndLogsError() { AddressableAssetSettings.RegisterCustomAssetEntryCommand("cmd1", s => { }); Assert.DoesNotThrow(() => { LogAssert.Expect(LogType.Error, $"Asset Entry Command 'cmd1' called with null entry collection."); Assert.IsFalse(AddressableAssetSettings.InvokeAssetEntryCommand("cmd1", null)); }); AddressableAssetSettings.UnregisterCustomAssetEntryCommand("cmd1"); } [Test] public void CustomEntryCommand_WhenCommandDoesNotExist_ReturnsFalseAndLogsError() { Assert.DoesNotThrow(() => { LogAssert.Expect(LogType.Error, $"Asset Entry Command 'cmd' not found. Ensure that it is registered by calling RegisterCustomAssetEntryCommand."); Assert.IsFalse(AddressableAssetSettings.InvokeAssetEntryCommand("cmd", new AddressableAssetEntry[] { })); }); } [Test] public void CustomEntryCommand_RegisterWithValidIdAndFunc_Succeeds() { AddressableAssetSettings.RegisterCustomAssetEntryCommand("cmd1", s => { }); CollectionAssert.Contains(AddressableAssetSettings.CustomAssetEntryCommands, "cmd1"); AddressableAssetSettings.UnregisterCustomAssetEntryCommand("cmd1"); } [Test] public void CustomEntryCommand_UnregisterWithInvalidIdParameters_Fails() { LogAssert.Expect(LogType.Error, "UnregisterCustomAssetEntryCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.UnregisterCustomAssetEntryCommand("")); LogAssert.Expect(LogType.Error, "UnregisterCustomAssetEntryCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.UnregisterCustomAssetEntryCommand(null)); LogAssert.Expect(LogType.Error, $"UnregisterCustomAssetEntryCommand - command id 'doesntexist' is not registered."); Assert.IsFalse(AddressableAssetSettings.UnregisterCustomAssetEntryCommand("doesntexist")); CollectionAssert.IsEmpty(AddressableAssetSettings.CustomAssetEntryCommands); } [Test] public void CustomEntryCommand_RegisterWithInvalidParameters_Fails() { LogAssert.Expect(LogType.Error, "RegisterCustomAssetEntryCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.RegisterCustomAssetEntryCommand("", s => { })); LogAssert.Expect(LogType.Error, "RegisterCustomAssetEntryCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.RegisterCustomAssetEntryCommand(null, s => { })); LogAssert.Expect(LogType.Error, $"RegisterCustomAssetEntryCommand - command functor for id 'valid'."); Assert.IsFalse(AddressableAssetSettings.RegisterCustomAssetEntryCommand("valid", null)); CollectionAssert.IsEmpty(AddressableAssetSettings.CustomAssetEntryCommands); } [Test] public void CustomGroupCommand_WhenRegistered_InvokeIsCalled() { string notSet = null; AddressableAssetSettings.RegisterCustomAssetGroupCommand("cmd1", s => notSet = "set"); AddressableAssetSettings.InvokeAssetGroupCommand("cmd1", new AddressableAssetGroup[] { }); Assert.AreEqual("set", notSet); AddressableAssetSettings.UnregisterCustomAssetGroupCommand("cmd1"); } [Test] public void CustomGroupCommand_RegisterWithValidIdAndFunc_Succeeds() { AddressableAssetSettings.RegisterCustomAssetGroupCommand("cmd1", s => { }); CollectionAssert.Contains(AddressableAssetSettings.CustomAssetGroupCommands, "cmd1"); AddressableAssetSettings.UnregisterCustomAssetGroupCommand("cmd1"); } [Test] public void CustomGroupCommand_UnregisterWithInvalidIdParameters_Fails() { LogAssert.Expect(LogType.Error, "UnregisterCustomAssetGroupCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.UnregisterCustomAssetGroupCommand("")); LogAssert.Expect(LogType.Error, "UnregisterCustomAssetGroupCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.UnregisterCustomAssetGroupCommand(null)); LogAssert.Expect(LogType.Error, $"UnregisterCustomAssetGroupCommand - command id 'doesntexist' is not registered."); Assert.IsFalse(AddressableAssetSettings.UnregisterCustomAssetGroupCommand("doesntexist")); CollectionAssert.IsEmpty(AddressableAssetSettings.CustomAssetGroupCommands); } [Test] public void CustomGroupCommand_RegisterWithInvalidParameters_Fails() { LogAssert.Expect(LogType.Error, "RegisterCustomAssetGroupCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.RegisterCustomAssetGroupCommand("", s => { })); LogAssert.Expect(LogType.Error, "RegisterCustomAssetGroupCommand - invalid command id."); Assert.IsFalse(AddressableAssetSettings.RegisterCustomAssetGroupCommand(null, s => { })); LogAssert.Expect(LogType.Error, $"RegisterCustomAssetGroupCommand - command functor for id 'valid'."); Assert.IsFalse(AddressableAssetSettings.RegisterCustomAssetGroupCommand("valid", null)); CollectionAssert.IsEmpty(AddressableAssetSettings.CustomAssetGroupCommands); } [Test] public void CustomGroupCommand_WhenCommandThrows_InvokeDoesNotThrow() { AddressableAssetSettings.RegisterCustomAssetGroupCommand("cmd1", s => throw new Exception()); Assert.DoesNotThrow(() => { LogAssert.Expect(LogType.Error, $"Encountered exception when running Asset Group Command 'cmd1': Exception of type 'System.Exception' was thrown."); Assert.IsFalse(AddressableAssetSettings.InvokeAssetGroupCommand("cmd1", new AddressableAssetGroup[] { })); }); AddressableAssetSettings.UnregisterCustomAssetGroupCommand("cmd1"); } [Test] public void CustomGroupCommand_WhenCommandHasNullGroups_ReturnsFalseAndLogsError() { AddressableAssetSettings.RegisterCustomAssetGroupCommand("cmd1", s => { }); Assert.DoesNotThrow(() => { LogAssert.Expect(LogType.Error, $"Asset Group Command 'cmd1' called with null group collection."); Assert.IsFalse(AddressableAssetSettings.InvokeAssetGroupCommand("cmd1", null)); }); AddressableAssetSettings.UnregisterCustomAssetGroupCommand("cmd1"); } [Test] public void CustomGroupCommand_WhenCommandDoesNotExist_ReturnsFalseAndLogsError() { Assert.DoesNotThrow(() => { LogAssert.Expect(LogType.Error, $"Asset Group Command 'cmd' not found. Ensure that it is registered by calling RegisterCustomAssetGroupCommand."); Assert.IsFalse(AddressableAssetSettings.InvokeAssetGroupCommand("cmd", new AddressableAssetGroup[] { })); }); } [Test] public void AssetGroupSchemaTemplate_CreateTemplate() { string description = "This is a Test Schema"; string groupName = "testGroup"; var testSchemaTemplate = AddressableAssetGroupSchemaTemplate.Create( groupName, description, typeof(CustomTestSchema)); Assert.AreEqual(testSchemaTemplate.Description, description); Assert.AreEqual(testSchemaTemplate.DisplayName, groupName); Assert.IsNotNull(testSchemaTemplate.GetTypes()); } [Test] public void NullifyBundleFileIds_SetsBundleFileIdsToNull() { AddressableAssetSettings.NullifyBundleFileIds(Settings); foreach (var group in Settings.groups) { foreach (var entry in group.entries) { Assert.IsNull(entry.BundleFileId); } } } [Test] public void ReloadSettings_ClearVersionOverride() { Settings.OverridePlayerVersion = ""; ReloadSettings(); Assert.AreEqual("", Settings.OverridePlayerVersion); } } }