mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
- 引入 PoolInfo 类来管理对象池的核心数据结构和统计信息 - 添加对象池容量限制功能,超过容量时自动销毁多余对象 - 实现对象池统计功能,跟踪创建、获取、释放、销毁等操作计数 - 新增 GetPoolSize 和 GetActiveCount 方法获取池状态信息 - 添加 SetMaxCapacity 方法设置池的最大容量限制 - 实现 Prewarm 功能用于预创建对象提高性能 - 提供 GetStatistics 方法获取详细的池统计信息 - 添加 IsExternalInit 支持旧版 .NET 框架的 init-only 属性 - 扩展 ArrayPool 添加便捷的扩展方法和自动释放功能 - 新增 StringBuilderPool 提供高性能的字符串构建器复用 - 完善单元测试覆盖新增的所有功能特性
117 lines
2.6 KiB
C#
117 lines
2.6 KiB
C#
using GFramework.Core.pool;
|
|
using NUnit.Framework;
|
|
|
|
namespace GFramework.Core.Tests.pool;
|
|
|
|
/// <summary>
|
|
/// 测试 StringBuilderPool 的功能
|
|
/// </summary>
|
|
[TestFixture]
|
|
public class StringBuilderPoolTests
|
|
{
|
|
[Test]
|
|
public void Rent_Should_Return_StringBuilder()
|
|
{
|
|
// Act
|
|
var sb = StringBuilderPool.Rent();
|
|
|
|
// Assert
|
|
Assert.That(sb, Is.Not.Null);
|
|
Assert.That(sb.Length, Is.EqualTo(0));
|
|
}
|
|
|
|
[Test]
|
|
public void Rent_Should_Respect_Capacity()
|
|
{
|
|
// Act
|
|
var sb = StringBuilderPool.Rent(512);
|
|
|
|
// Assert
|
|
Assert.That(sb.Capacity, Is.GreaterThanOrEqualTo(512));
|
|
}
|
|
|
|
[Test]
|
|
public void Return_Should_Clear_StringBuilder()
|
|
{
|
|
// Arrange
|
|
var sb = StringBuilderPool.Rent();
|
|
sb.Append("Hello World");
|
|
|
|
// Act
|
|
StringBuilderPool.Return(sb);
|
|
|
|
// Assert
|
|
Assert.That(sb.Length, Is.EqualTo(0));
|
|
}
|
|
|
|
[Test]
|
|
public void Return_Should_Not_Throw_For_Large_Capacity()
|
|
{
|
|
// Arrange
|
|
var sb = StringBuilderPool.Rent(10000);
|
|
|
|
// Act & Assert
|
|
Assert.DoesNotThrow(() => StringBuilderPool.Return(sb));
|
|
}
|
|
|
|
[Test]
|
|
public void GetScoped_Should_Return_Disposable_Wrapper()
|
|
{
|
|
// Act
|
|
using var scoped = StringBuilderPool.GetScoped();
|
|
|
|
// Assert
|
|
Assert.That(scoped.Value, Is.Not.Null);
|
|
Assert.That(scoped.Value.Length, Is.EqualTo(0));
|
|
}
|
|
|
|
[Test]
|
|
public void GetScoped_Should_Auto_Return_On_Dispose()
|
|
{
|
|
// Arrange
|
|
var sb = StringBuilderPool.GetScoped().Value;
|
|
sb.Append("Test");
|
|
|
|
// Act
|
|
using (var scoped = StringBuilderPool.GetScoped())
|
|
{
|
|
scoped.Value.Append("Hello");
|
|
}
|
|
|
|
// Assert - 如果没有异常就说明正常归还了
|
|
Assert.Pass();
|
|
}
|
|
|
|
[Test]
|
|
public void StringBuilder_Should_Be_Reusable()
|
|
{
|
|
// Arrange
|
|
var sb = StringBuilderPool.Rent();
|
|
sb.Append("First use");
|
|
StringBuilderPool.Return(sb);
|
|
|
|
// Act
|
|
sb.Append("Second use");
|
|
|
|
// Assert
|
|
Assert.That(sb.ToString(), Is.EqualTo("Second use"));
|
|
}
|
|
|
|
[Test]
|
|
public void GetScoped_With_Using_Should_Work()
|
|
{
|
|
// Act
|
|
string result;
|
|
using (var scoped = StringBuilderPool.GetScoped())
|
|
{
|
|
scoped.Value.Append("Hello");
|
|
scoped.Value.Append(" ");
|
|
scoped.Value.Append("World");
|
|
result = scoped.Value.ToString();
|
|
}
|
|
|
|
// Assert
|
|
Assert.That(result, Is.EqualTo("Hello World"));
|
|
}
|
|
}
|