using GFramework.Core.Abstractions.pool;
using GFramework.Core.pool;
using NUnit.Framework;
namespace GFramework.Core.Tests.pool;
///
/// 对象池功能测试类,用于验证对象池的基本操作和行为
///
[TestFixture]
public class ObjectPoolTests
{
///
/// 测试初始化方法,在每个测试方法执行前设置测试环境
///
[SetUp]
public void SetUp()
{
_pool = new TestObjectPool();
}
///
/// 测试用的对象池实例
///
private TestObjectPool _pool = null!;
///
/// 验证当对象池为空时,Acquire方法应该创建新对象
///
[Test]
public void Acquire_Should_Create_New_Object_When_Pool_Empty()
{
var obj = _pool.Acquire("test");
Assert.That(obj, Is.Not.Null);
Assert.That(obj.PoolKey, Is.EqualTo("test"));
Assert.That(obj.OnAcquireCalled, Is.True);
}
///
/// 验证Acquire方法应该返回池中的可用对象
///
[Test]
public void Acquire_Should_Return_Pooled_Object()
{
var obj1 = _pool.Acquire("test");
obj1.TestValue = 100;
_pool.Release("test", obj1);
var obj2 = _pool.Acquire("test");
Assert.That(obj2, Is.SameAs(obj1));
Assert.That(obj2.TestValue, Is.EqualTo(100));
Assert.That(obj2.OnAcquireCalled, Is.True);
}
///
/// 验证Release方法应该调用对象的OnRelease回调
///
[Test]
public void Release_Should_Call_OnRelease()
{
var obj = _pool.Acquire("test");
_pool.Release("test", obj);
Assert.That(obj.OnReleaseCalled, Is.True);
}
///
/// 验证Clear方法应该销毁所有对象
///
[Test]
public void Clear_Should_Destroy_All_Objects()
{
var obj1 = _pool.Acquire("key1");
var obj2 = _pool.Acquire("key2");
_pool.Release("key1", obj1);
_pool.Release("key2", obj2);
_pool.Clear();
Assert.That(obj1.OnPoolDestroyCalled, Is.True);
Assert.That(obj2.OnPoolDestroyCalled, Is.True);
}
///
/// 验证多个池键应该相互独立
///
[Test]
public void Multiple_Pools_Should_Be_Independent()
{
var obj1 = _pool.Acquire("key1");
var obj2 = _pool.Acquire("key2");
_pool.Release("key1", obj1);
var obj3 = _pool.Acquire("key1");
var obj4 = _pool.Acquire("key2");
Assert.That(obj3, Is.SameAs(obj1));
Assert.That(obj4, Is.Not.SameAs(obj2));
}
///
/// 验证OnAcquire回调应该在新对象和池中对象上都被调用
///
[Test]
public void OnAcquire_Should_Be_Called_On_New_And_Pooled_Objects()
{
var obj1 = _pool.Acquire("test");
Assert.That(obj1.OnAcquireCalled, Is.True);
_pool.Release("test", obj1);
obj1.OnAcquireCalled = false;
var obj2 = _pool.Acquire("test");
Assert.That(obj2.OnAcquireCalled, Is.True);
}
///
/// 验证GetPoolSize应该返回正确的池大小
///
[Test]
public void GetPoolSize_Should_Return_Correct_Size()
{
// Arrange
var obj1 = _pool.Acquire("test");
var obj2 = _pool.Acquire("test");
// Act & Assert
Assert.That(_pool.GetPoolSize("test"), Is.EqualTo(0));
_pool.Release("test", obj1);
Assert.That(_pool.GetPoolSize("test"), Is.EqualTo(1));
_pool.Release("test", obj2);
Assert.That(_pool.GetPoolSize("test"), Is.EqualTo(2));
}
///
/// 验证GetActiveCount应该返回正确的活跃对象数量
///
[Test]
public void GetActiveCount_Should_Return_Correct_Count()
{
// Arrange & Act & Assert
Assert.That(_pool.GetActiveCount("test"), Is.EqualTo(0));
var obj1 = _pool.Acquire("test");
Assert.That(_pool.GetActiveCount("test"), Is.EqualTo(1));
var obj2 = _pool.Acquire("test");
Assert.That(_pool.GetActiveCount("test"), Is.EqualTo(2));
_pool.Release("test", obj1);
Assert.That(_pool.GetActiveCount("test"), Is.EqualTo(1));
_pool.Release("test", obj2);
Assert.That(_pool.GetActiveCount("test"), Is.EqualTo(0));
}
///
/// 验证SetMaxCapacity应该限制池的最大容量
///
[Test]
public void SetMaxCapacity_Should_Limit_Pool_Size()
{
// Arrange
_pool.SetMaxCapacity("test", 2);
var obj1 = _pool.Acquire("test");
var obj2 = _pool.Acquire("test");
var obj3 = _pool.Acquire("test");
// Act
_pool.Release("test", obj1);
_pool.Release("test", obj2);
_pool.Release("test", obj3);
// Assert
Assert.That(_pool.GetPoolSize("test"), Is.EqualTo(2));
Assert.That(obj3.OnPoolDestroyCalled, Is.True);
}
///
/// 验证Prewarm应该预创建指定数量的对象
///
[Test]
public void Prewarm_Should_Create_Objects_In_Advance()
{
// Act
_pool.Prewarm("test", 5);
// Assert
Assert.That(_pool.GetPoolSize("test"), Is.EqualTo(5));
var obj = _pool.Acquire("test");
Assert.That(_pool.GetPoolSize("test"), Is.EqualTo(4));
Assert.That(obj.OnReleaseCalled, Is.True); // 预热时调用了OnRelease
}
///
/// 验证GetStatistics应该返回正确的统计信息
///
[Test]
public void GetStatistics_Should_Return_Correct_Statistics()
{
// Arrange
_pool.SetMaxCapacity("test", 2);
_pool.Prewarm("test", 2);
var obj1 = _pool.Acquire("test");
var obj2 = _pool.Acquire("test");
var obj3 = _pool.Acquire("test"); // 这个会创建新对象
_pool.Release("test", obj1);
_pool.Release("test", obj2);
_pool.Release("test", obj3); // 这个会被销毁
// Act
var stats = _pool.GetStatistics("test");
// Assert
Assert.That(stats.AvailableCount, Is.EqualTo(2));
Assert.That(stats.ActiveCount, Is.EqualTo(0));
Assert.That(stats.MaxCapacity, Is.EqualTo(2));
Assert.That(stats.TotalCreated, Is.EqualTo(3)); // 2个预热 + 1个新创建
Assert.That(stats.TotalAcquired, Is.EqualTo(3));
Assert.That(stats.TotalReleased, Is.EqualTo(3));
Assert.That(stats.TotalDestroyed, Is.EqualTo(1));
}
///
/// 验证不存在的池应该返回空统计信息
///
[Test]
public void GetStatistics_Should_Return_Empty_For_Nonexistent_Pool()
{
// Act
var stats = _pool.GetStatistics("nonexistent");
// Assert
Assert.That(stats.AvailableCount, Is.EqualTo(0));
Assert.That(stats.ActiveCount, Is.EqualTo(0));
Assert.That(stats.MaxCapacity, Is.EqualTo(0));
Assert.That(stats.TotalCreated, Is.EqualTo(0));
Assert.That(stats.TotalAcquired, Is.EqualTo(0));
Assert.That(stats.TotalReleased, Is.EqualTo(0));
Assert.That(stats.TotalDestroyed, Is.EqualTo(0));
}
}
///
/// 测试用对象池实现类,继承自AbstractObjectPoolSystem
///
public class TestObjectPool : AbstractObjectPoolSystem
{
///
/// 创建新的池化对象
///
/// 用于标识对象的键
/// 新创建的TestPoolableObject实例
protected override TestPoolableObject Create(string key)
{
return new TestPoolableObject { PoolKey = key };
}
///
/// 初始化方法,用于对象池初始化时的操作
///
protected override void OnInit()
{
}
}
///
/// 测试用池化对象类,实现了IPoolableObject接口
///
public class TestPoolableObject : IPoolableObject
{
///
/// 获取或设置对象的池键
///
public string PoolKey { get; set; } = string.Empty;
///
/// 获取或设置测试用的整数值
///
public int TestValue { get; set; }
///
/// 获取或设置OnAcquire方法是否被调用的标志
///
public bool OnAcquireCalled { get; set; }
///
/// 获取或设置OnRelease方法是否被调用的标志
///
public bool OnReleaseCalled { get; set; }
///
/// 获取或设置OnPoolDestroy方法是否被调用的标志
///
public bool OnPoolDestroyCalled { get; set; }
///
/// 对象被获取时的回调方法
///
public void OnAcquire()
{
OnAcquireCalled = true;
}
///
/// 对象被释放时的回调方法
///
public void OnRelease()
{
OnReleaseCalled = true;
}
///
/// 对象被销毁时的回调方法
///
public void OnPoolDestroy()
{
OnPoolDestroyCalled = true;
}
}