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

137 lines
5 KiB
C#

using System;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceLocations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.ResourceManagement.Util;
namespace UnityEngine.ResourceManagement.Tests
{
public class OperationsCacheTests
{
ResourceManager m_ResourceManager;
[SetUp]
public void Setup()
{
m_ResourceManager = new ResourceManager();
m_ResourceManager.CallbackHooksEnabled = false; // default for tests. disabled callback hooks. we will call update manually
}
[TearDown]
public void TearDown()
{
Assert.Zero(m_ResourceManager.OperationCacheCount);
m_ResourceManager.Dispose();
}
[Test]
public void OperationCache_CollisionsAreProperlyHandled()
{
#if ENABLE_CACHING
Assert.Zero(m_ResourceManager.OperationCacheCount);
var provType = typeof(InstanceProvider);
var loc1 = new TestResourceLocation("asset1", "asset1", provType.FullName, typeof(GameObject));
var key1 = new LocationCacheKey(loc1, typeof(GameObject));
var opType = typeof(TestOperation);
m_ResourceManager.CreateOperation<TestOperation>(opType, opType.GetHashCode(), key1, null);
Assert.AreEqual(1, m_ResourceManager.CachedOperationCount());
Assert.IsTrue(m_ResourceManager.IsOperationCached(key1));
var loc2 = new TestResourceLocation("asset2", "asset2", provType.FullName, typeof(GameObject));
var key2 = new LocationCacheKey(loc2, typeof(GameObject));
Assert.IsFalse(m_ResourceManager.IsOperationCached(key2));
Assert.IsTrue(m_ResourceManager.RemoveOperationFromCache(key1));
#else
Assert.Ignore("Caching not enabled.");
#endif
}
class TestOperation : AsyncOperationBase<GameObject>, ICachable
{
protected override void Execute()
{
}
public IOperationCacheKey Key { get; set; }
}
class TestResourceLocation : IResourceLocation
{
public TestResourceLocation(string name, string id, string providerId, Type t, params IResourceLocation[] dependencies)
{
PrimaryKey = name;
InternalId = id;
ProviderId = providerId;
Dependencies = new List<IResourceLocation>(dependencies);
ResourceType = t == null ? typeof(object) : t;
}
public string InternalId { get; }
public string ProviderId { get; }
public IList<IResourceLocation> Dependencies { get; }
public int Hash(Type type)
{
// Returning a constant hashcode to force collisions.
return 1337;
}
public int DependencyHashCode => 0;
public bool HasDependencies => Dependencies.Count > 0;
public object Data { get; }
public string PrimaryKey { get; }
public Type ResourceType { get; }
}
[Test]
public void Locations_WithDiffNames_LocationEquals_Returns_True()
{
var l1 = new ResourceLocationBase("a", "b", "c", typeof(Mesh));
var l2 = new ResourceLocationBase("x", "b", "c", typeof(Mesh));
Assert.IsTrue(LocationUtils.LocationEquals(l1, l2));
}
[Test]
public void Locations_WithDiffIds_LocationEquals_Returns_False()
{
var l1 = new ResourceLocationBase("a", "b", "c", typeof(Mesh));
var l2 = new ResourceLocationBase("a", "x", "c", typeof(Mesh));
Assert.IsFalse(LocationUtils.LocationEquals(l1, l2));
}
[Test]
public void Locations_WithDiffProvider_LocationEquals_Returns_False()
{
var l1 = new ResourceLocationBase("a", "b", "c", typeof(Mesh));
var l2 = new ResourceLocationBase("a", "b", "x", typeof(Mesh));
Assert.IsFalse(LocationUtils.LocationEquals(l1, l2));
}
[Test]
public void Locations_WithDiffResourceTypes_LocationEquals_Returns_True()
{
var l1 = new ResourceLocationBase("a", "b", "c", typeof(Mesh));
var l2 = new ResourceLocationBase("a", "b", "c", typeof(Material));
Assert.IsFalse(LocationUtils.LocationEquals(l1, l2));
}
class ResourceLocatonTestSub : ResourceLocationBase
{
public ResourceLocatonTestSub(string n, string id, string pr, Type t) : base(n, id, pr, t)
{
}
}
[Test]
public void Locations_WithDiffTypes_LocationEquals_Returns_True()
{
var l1 = new ResourceLocationBase("a", "b", "c", typeof(Mesh));
var l2 = new ResourceLocatonTestSub("a", "b", "c", typeof(Mesh));
Assert.IsTrue(LocationUtils.LocationEquals(l1, l2));
}
}
}