WuhuIslandTesting/Library/PackageCache/com.unity.addressables@1.21.12/Tests/Runtime/ResourceManager/Operations/AsyncOperationHandleTests.cs

210 lines
7.5 KiB
C#
Raw Normal View History

2025-01-07 02:06:59 +01:00
using System;
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceLocations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.ResourceManagement.Util;
using UnityEngine.TestTools;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine.Networking;
using UnityEngine.TestTools.Constraints;
namespace UnityEngine.ResourceManagement.Tests
{
public class AsyncOperationHandleTests
{
class FakeTypedOperation : AsyncOperationBase<GameObject>
{
public FakeTypedOperation()
{
m_RM = new ResourceManager();
m_RM.postProfilerEvents = true;
}
public object GetResultAsObject()
{
return null;
}
protected override void Execute()
{
}
}
void IncreaseRefCount(AsyncOperationHandle handle, int count)
{
for (int i = 0; i < count; i++)
handle.Acquire();
}
void IncreaseRefCount<TObject>(AsyncOperationHandle<TObject> handle, int count)
{
for (int i = 0; i < count; i++)
handle.Acquire();
}
int DestructiveGetRefCount(AsyncOperationHandle handle)
{
int count = 0;
while (handle.IsValid())
{
count++;
var copy = handle;
copy.Release();
}
return count;
}
int DestructiveGetRefCount<TObject>(AsyncOperationHandle<TObject> handle)
{
int count = 0;
while (handle.IsValid())
{
count++;
var copy = handle;
copy.Release();
}
return count;
}
[Test]
public void AsyncOperationHandle_ConvertToTyped_WithInvalidOpThrows()
{
var op = new FakeTypedOperation();
AsyncOperationHandle handle = new AsyncOperationHandle(op);
AsyncOperationHandle handle2 = new AsyncOperationHandle(op);
handle2.Release();
Assert.Throws<Exception>(() => { handle.Convert<GameObject>(); });
}
[Test]
public void AsyncOperationHandle_ConvertToTyped_WithValidOpSucceeds()
{
var op = new FakeTypedOperation();
AsyncOperationHandle handle = new AsyncOperationHandle(op);
AsyncOperationHandle<GameObject> typedHandle = handle.Convert<GameObject>();
Assert.True(handle.IsValid());
Assert.True(typedHandle.IsValid());
}
[Test]
public void AsyncOperationHandle_ConvertToTypeless_MaintainsValidity()
{
var op = new FakeTypedOperation();
AsyncOperationHandle<GameObject> typedHandle = new AsyncOperationHandle<GameObject>(op);
//implicit conversion of valid op
AsyncOperationHandle typelessHandle = (AsyncOperationHandle)typedHandle;
Assert.IsNotNull(typelessHandle);
Assert.IsTrue(typedHandle.IsValid());
Assert.IsTrue(typelessHandle.IsValid());
//make handle invalid
AsyncOperationHandle<GameObject> typedHandle2 = new AsyncOperationHandle<GameObject>(op);
typedHandle2.Release();
//implicit conversion of invalid op
AsyncOperationHandle invalidHandle = (AsyncOperationHandle)typedHandle;
Assert.IsNotNull(invalidHandle);
Assert.IsFalse(invalidHandle.IsValid());
Assert.IsFalse(typedHandle.IsValid());
}
[Test]
public void AsyncOperationHandle_Release_DecrementsRefCount()
{
int expectedCount = 10;
var op = new FakeTypedOperation();
AsyncOperationHandle<GameObject> typedHandle = new AsyncOperationHandle<GameObject>(op);
AsyncOperationHandle<GameObject> validationHandle = new AsyncOperationHandle<GameObject>(op);
IncreaseRefCount(typedHandle, expectedCount - 1);
typedHandle.Release();
expectedCount--;
var actualRefCount = DestructiveGetRefCount(validationHandle);
Assert.AreEqual(expectedCount, actualRefCount);
op = new FakeTypedOperation();
AsyncOperationHandle typelessHandle = new AsyncOperationHandle(op);
AsyncOperationHandle typelessValidation = new AsyncOperationHandle(op);
IncreaseRefCount(typelessHandle, expectedCount - 1);
typelessHandle.Release();
expectedCount--;
actualRefCount = DestructiveGetRefCount(typelessValidation);
Assert.AreEqual(expectedCount, actualRefCount);
}
[Test]
public void AsyncOperationHandle_ReleaseToZero_InvalidatesAllHandles()
{
var op = new FakeTypedOperation();
AsyncOperationHandle<GameObject> typedHandle = new AsyncOperationHandle<GameObject>(op);
AsyncOperationHandle<GameObject> typedHandle2 = new AsyncOperationHandle<GameObject>(op);
typedHandle.Release();
Assert.IsFalse(typedHandle.IsValid());
Assert.IsFalse(typedHandle2.IsValid());
op = new FakeTypedOperation();
AsyncOperationHandle typelessHandle = new AsyncOperationHandle(op);
AsyncOperationHandle typelessHandle2 = new AsyncOperationHandle(op);
typelessHandle.Release();
Assert.IsFalse(typelessHandle.IsValid());
Assert.IsFalse(typelessHandle2.IsValid());
}
[Test]
public void AsyncOperationHandle_ReleaseToNonZero_InvalidatesOnlyCurrentHandle()
{
var op = new FakeTypedOperation();
AsyncOperationHandle<GameObject> typedHandle = new AsyncOperationHandle<GameObject>(op);
IncreaseRefCount(typedHandle, 1);
AsyncOperationHandle<GameObject> typedHandle2 = new AsyncOperationHandle<GameObject>(op);
typedHandle.Release();
Assert.IsFalse(typedHandle.IsValid());
Assert.IsTrue(typedHandle2.IsValid());
op = new FakeTypedOperation();
AsyncOperationHandle typelessHandle = new AsyncOperationHandle(op);
IncreaseRefCount(typelessHandle, 1);
AsyncOperationHandle typelessHandle2 = new AsyncOperationHandle(op);
typelessHandle.Release();
Assert.IsFalse(typelessHandle.IsValid());
Assert.IsTrue(typelessHandle2.IsValid());
}
[Test]
public void AsyncOperationHandle_Acquire_IncrementsRefCount()
{
int expectedCount = 2;
var op = new FakeTypedOperation();
AsyncOperationHandle<GameObject> typedHandle = new AsyncOperationHandle<GameObject>(op);
var copyTyped = typedHandle.Acquire();
Assert.True(copyTyped.IsValid());
Assert.True(typedHandle.IsValid());
int actualCount = DestructiveGetRefCount(typedHandle);
Assert.AreEqual(expectedCount, actualCount);
op = new FakeTypedOperation();
AsyncOperationHandle typelessHandle = new AsyncOperationHandle(op);
var copyTypeless = typelessHandle.Acquire();
Assert.True(copyTypeless.IsValid());
Assert.True(typelessHandle.IsValid());
actualCount = DestructiveGetRefCount(typelessHandle);
Assert.AreEqual(expectedCount, actualCount);
}
}
}