WuhuIslandTesting/Library/PackageCache/com.unity.addressables@1.21.12/Tests/Editor/AssetGroupTests.cs
2025-01-07 02:06:59 +01:00

225 lines
9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using NUnit.Framework;
using UnityEditor.AddressableAssets.GUI;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using UnityEngine.TestTools;
namespace UnityEditor.AddressableAssets.Tests
{
public class AssetGroupTests : AddressableAssetTestBase
{
[Test]
public void AddRemoveEntry()
{
var group = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName);
Assert.IsNotNull(group);
var entry = new AddressableAssetEntry(m_AssetGUID, "test", group, false);
group.AddAssetEntry(entry);
Assert.IsNotNull(group.GetAssetEntry(m_AssetGUID));
group.RemoveAssetEntry(entry);
Assert.IsNull(group.GetAssetEntry(m_AssetGUID));
}
[Test]
public void RenameSlashesBecomeDashes()
{
var group = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName);
var oldName = group.Name;
group.Name = "folder/name";
Assert.AreEqual("folder-name", group.Name);
group.Name = oldName;
}
[Test]
public void RenameInvalidCharactersFails()
{
var group = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName);
var oldName = group.Name;
string badName = "*#?@>!@*@(#";
LogAssert.Expect(LogType.Error, "Rename of Group failed. Invalid file name: '" + badName + ".asset'");
group.Name = badName;
Assert.AreEqual(oldName, group.Name);
}
[Test]
public void RenameAlwaysSetsObjectName()
{
var group = Settings.FindGroup(AddressableAssetSettings.DefaultLocalGroupName);
var oldName = group.Name;
group.name = "mismatchName";
Assert.AreNotEqual(oldName, group.name);
group.Name = oldName;
Assert.AreEqual(oldName, group.name);
Assert.AreEqual(oldName, group.Name);
}
[Test]
public void DedupeEntries_WhenGroupsHaveOverlappingAssetEntries_RemovesEntries()
{
const string guid = "0000";
const string address = "not/a/real/address";
AddressableAssetGroup group1 = Settings.CreateGroup("group1", false, false, true, null, new Type[] { });
AddressableAssetGroup group2 = Settings.CreateGroup("group2", false, false, true, null, new Type[] { });
//We're making 2 identical enteries. This is to simulate each group having it's own copy of an AA Entry that references the same object.
//If we use the same object the call to AddAssetEntry won't give us the state we're looking for.
AddressableAssetEntry entry = new AddressableAssetEntry(guid, address, group1, false);
AddressableAssetEntry entry2 = new AddressableAssetEntry(guid, address, group2, false);
group1.AddAssetEntry(entry);
group2.AddAssetEntry(entry2);
//Ensuring our setup is correct
Assert.IsNotNull(group1.GetAssetEntry(guid));
Assert.IsNotNull(group2.GetAssetEntry(guid));
group1.DedupeEnteries(); //We setup our entry with group1 so it should retain its reference
group2.DedupeEnteries(); //The entry was added to group2 afterwards and should lose its reference
Assert.IsNotNull(group1.GetAssetEntry(guid));
Assert.IsNull(group2.GetAssetEntry(guid));
//Cleanup
Settings.RemoveGroup(group1);
Settings.RemoveGroup(group2);
}
[Test]
public void RemoveEntries_InvokesModificationNotification()
{
AddressableAssetGroup group1 = Settings.CreateGroup("group1", false, false, true, null, new Type[] { });
List<AddressableAssetEntry> entries = new List<AddressableAssetEntry>();
for (int i = 0; i < 10; i++)
group1.AddAssetEntry(new AddressableAssetEntry("000" + i.ToString(), "unknown" + i.ToString(), group1, false));
List<AddressableAssetEntry> callbackEntries = new List<AddressableAssetEntry>();
Action<AddressableAssetSettings, AddressableAssetSettings.ModificationEvent, object> callback = (x, y, z) => callbackEntries.AddRange((AddressableAssetEntry[])z);
AddressableAssetSettings.OnModificationGlobal += callback;
group1.RemoveAssetEntries(entries.ToArray());
for (int i = 0; i < entries.Count; i++)
Assert.AreEqual(entries[i], callbackEntries[i]);
//Cleanup
AddressableAssetSettings.OnModificationGlobal -= callback;
Settings.RemoveGroup(group1);
}
[Test]
public void SupportsPeriodInName()
{
//Setup
var group = Settings.CreateGroup("name1", false, false, false, new List<AddressableAssetGroupSchema>());
//Test
string testName = group.Name = "test1.test";
//Assert
Assert.AreEqual(group.name, group.Name);
Assert.AreEqual(testName, group.Name);
//Cleanup
Settings.RemoveGroup(group);
}
[Test]
public void CannotSetInvalidGroupAsDefault()
{
AddressableAssetGroup group1 = Settings.CreateGroup("group1", false, true, true, null, new Type[] { });
LogAssert.Expect(LogType.Error, "Unable to set " + group1.Name + " as the Default Group. Default Groups must not be ReadOnly.");
Settings.DefaultGroup = group1;
Assert.AreNotEqual(Settings.DefaultGroup, group1);
//Cleanup
Settings.RemoveGroup(group1);
}
[Test]
public void DefaultGroupContainsCorrectProperties()
{
Assert.IsFalse(Settings.DefaultGroup.ReadOnly);
}
[Test]
public void DefaultGroupChangesToValidDefaultGroup()
{
LogAssert.ignoreFailingMessages = true;
AddressableAssetGroup oldDefault = Settings.DefaultGroup;
oldDefault.m_ReadOnly = true;
AddressableAssetGroup newDefault = Settings.DefaultGroup;
Assert.AreNotEqual(oldDefault, newDefault);
Assert.IsFalse(Settings.DefaultGroup.ReadOnly);
//Cleanup
oldDefault.AddSchema<BundledAssetGroupSchema>();
Settings.DefaultGroup = oldDefault;
}
[Test]
public void PreventNullDefaultGroup()
{
LogAssert.Expect(LogType.Error, "Unable to set null as the Default Group. Default Groups must not be ReadOnly.");
Settings.DefaultGroup = null;
Assert.IsNotNull(Settings.DefaultGroup);
}
[Test]
public void ValidGroupsCanBeSetAsDefault()
{
AddressableAssetGroup oldDefault = Settings.DefaultGroup;
AddressableAssetGroup group1 = Settings.CreateGroup("group1", false, false, true, null, new Type[] {typeof(BundledAssetGroupSchema)});
Settings.DefaultGroup = group1;
Assert.AreEqual(group1, Settings.DefaultGroup);
//Cleanup
Settings.DefaultGroup = oldDefault;
Settings.RemoveGroup(group1);
}
[Test]
public void ResourcesEntry_AddsCorrectTreeViewItem_ForSubobjects()
{
using (new HideResourceFoldersScope())
{
//Setup
string assetPath = "SubFolder/Cube.prefab";
int builtInPackagesResourcesCount = ResourcesTestUtility.GetResourcesEntryCount(Settings, true);
CreatePrefabInResourcesSubFolder(assetPath);
AddressableAssetEntryTreeView treeView = new AddressableAssetEntryTreeView(
new TreeViewState(),
new MultiColumnHeaderState(new MultiColumnHeaderState.Column[2]),
new AddressableAssetsSettingsGroupEditor(new AddressableAssetsWindow()));
//Test
AddressableAssetEntry entry = Settings.FindAssetEntry("Resources");
AssetEntryTreeViewItem treeViewItem = new AssetEntryTreeViewItem(entry, 0);
treeView.RecurseEntryChildren(entry, treeViewItem, 0);
//Assert
Assert.AreEqual(1 + builtInPackagesResourcesCount, treeViewItem.children.Count);
Assert.AreEqual(assetPath.Replace(".prefab", ""), treeViewItem.children[0].displayName);
//Cleanup
AssetDatabase.DeleteAsset("Assets/Resources/");
}
}
void CreatePrefabInResourcesSubFolder(string subFolderAssetPath)
{
string path = $"Assets/Resources/{subFolderAssetPath}";
Directory.CreateDirectory(Path.GetDirectoryName(path));
GameObject go = new GameObject();
PrefabUtility.SaveAsPrefabAsset(go, path);
}
}
}