GeWuYou e2dca4f5a6 feat(events): 添加事件优先级和传播控制功能
- 实现了事件优先级机制,支持按优先级顺序执行事件处理器
- 新增EventPropagation枚举,支持All、UntilHandled和Highest三种传播模式
- 添加Register方法的重载版本,支持指定事件处理器优先级
- 实现Send方法的重载版本,支持指定事件传播模式
- 新增PriorityEvent类处理带优先级的事件逻辑
- 添加IocContainer的CreateScope方法支持服务作用域管理
- 实现RegisterTransient和RegisterScoped方法完善依赖注入生命周期
- 新增SpanExtensions扩展方法提供高性能的span操作功能
- 添加全面的单元测试覆盖事件优先级、IoC容器生命周期和span扩展功能
2026-02-25 21:39:53 +08:00

153 lines
3.5 KiB
C#

using GFramework.Core.extensions;
using NUnit.Framework;
namespace GFramework.Core.Tests.extensions;
/// <summary>
/// 测试 SpanExtensions 扩展方法的功能
/// </summary>
[TestFixture]
public class SpanExtensionsTests
{
[Test]
public void TryParseValue_Should_Parse_Valid_Integer()
{
// Arrange
ReadOnlySpan<char> span = "123";
// Act
var success = span.TryParseValue<int>(out var result);
// Assert
Assert.That(success, Is.True);
Assert.That(result, Is.EqualTo(123));
}
[Test]
public void TryParseValue_Should_Fail_For_Invalid_Integer()
{
// Arrange
ReadOnlySpan<char> span = "abc";
// Act
var success = span.TryParseValue<int>(out var result);
// Assert
Assert.That(success, Is.False);
Assert.That(result, Is.EqualTo(0));
}
[Test]
public void TryParseValue_Should_Parse_Valid_Double()
{
// Arrange
ReadOnlySpan<char> span = "123.45";
// Act
var success = span.TryParseValue<double>(out var result);
// Assert
Assert.That(success, Is.True);
Assert.That(result, Is.EqualTo(123.45).Within(0.001));
}
[Test]
public void TryParseValue_Should_Parse_Valid_Boolean()
{
// Arrange
ReadOnlySpan<char> span = "true";
// Act
var success = span.TryParseValue<bool>(out var result);
// Assert
Assert.That(success, Is.True);
Assert.That(result, Is.True);
}
[Test]
public void TryParseValue_Should_Parse_Valid_Guid()
{
// Arrange
var guid = Guid.NewGuid();
ReadOnlySpan<char> span = guid.ToString();
// Act
var success = span.TryParseValue<Guid>(out var result);
// Assert
Assert.That(success, Is.True);
Assert.That(result, Is.EqualTo(guid));
}
[Test]
public void CountOccurrences_Should_Return_Correct_Count()
{
// Arrange
ReadOnlySpan<int> span = stackalloc int[] { 1, 2, 3, 2, 1 };
// Act
var count = span.CountOccurrences(2);
// Assert
Assert.That(count, Is.EqualTo(2));
}
[Test]
public void CountOccurrences_Should_Return_Zero_When_Value_Not_Found()
{
// Arrange
ReadOnlySpan<int> span = stackalloc int[] { 1, 2, 3 };
// Act
var count = span.CountOccurrences(5);
// Assert
Assert.That(count, Is.EqualTo(0));
}
[Test]
public void CountOccurrences_Should_Return_Zero_For_Empty_Span()
{
// Arrange
ReadOnlySpan<int> span = ReadOnlySpan<int>.Empty;
// Act
var count = span.CountOccurrences(1);
// Assert
Assert.That(count, Is.EqualTo(0));
}
[Test]
public void CountOccurrences_With_Chars_Should_Work()
{
// Arrange
ReadOnlySpan<char> span = "hello";
// Act
var count = span.CountOccurrences('l');
// Assert
Assert.That(count, Is.EqualTo(2));
}
[Test]
public void CountOccurrences_Should_Work_With_Custom_Types()
{
// Arrange
var item1 = new TestItem(1);
var item2 = new TestItem(2);
var item3 = new TestItem(2);
ReadOnlySpan<TestItem> span = new[] { item1, item2, item3 };
// Act
var count = span.CountOccurrences(new TestItem(2));
// Assert
Assert.That(count, Is.EqualTo(2));
}
private record TestItem(int Value);
}