GFramework/GFramework.Core.Tests/events/EventStatisticsTests.cs
GeWuYou e738e59a58 feat(events): 添加增强事件总线支持过滤器和统计功能
- 实现 EnhancedEventBus 支持过滤器、弱引用事件和统计功能
- 添加 FilterableEvent 和 WeakEvent 支持事件过滤和弱引用订阅
- 实现 PredicateEventFilter 和 SamplingEventFilter 事件过滤器
- 添加 EventStatistics 统计事件发布、处理和失败次数
- 实现完整的单元测试验证过滤器和统计功能
2026-03-06 16:09:40 +08:00

176 lines
5.1 KiB
C#

using GFramework.Core.events;
namespace GFramework.Core.Tests.events;
/// <summary>
/// 事件统计功能测试
/// </summary>
public sealed class EventStatisticsTests
{
[Test]
public void Statistics_WhenDisabled_ShouldBeNull()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: false);
// Act & Assert
Assert.That(eventBus.Statistics, Is.Null);
}
[Test]
public void Statistics_WhenEnabled_ShouldNotBeNull()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
// Act & Assert
Assert.That(eventBus.Statistics, Is.Not.Null);
}
[Test]
public void TotalPublished_ShouldTrackPublishedEvents()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
// Act
eventBus.SendFilterable(new TestEvent { Message = "Test1" });
eventBus.SendFilterable(new TestEvent { Message = "Test2" });
eventBus.SendFilterable(new TestEvent { Message = "Test3" });
// Assert
Assert.That(eventBus.Statistics!.TotalPublished, Is.EqualTo(3));
}
[Test]
public void TotalHandled_ShouldTrackHandledEvents()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
var handledCount = 0;
eventBus.RegisterFilterable<TestEvent>(_ => handledCount++);
eventBus.RegisterFilterable<TestEvent>(_ => handledCount++);
// Act
eventBus.SendFilterable(new TestEvent { Message = "Test" });
// Assert
Assert.That(eventBus.Statistics!.TotalHandled, Is.EqualTo(2));
Assert.That(handledCount, Is.EqualTo(2));
}
[Test]
public void TotalFailed_ShouldTrackFailedEvents()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
eventBus.RegisterFilterable<TestEvent>(_ => throw new InvalidOperationException("Test exception"));
// Act & Assert
Assert.Throws<InvalidOperationException>(() =>
eventBus.SendFilterable(new TestEvent { Message = "Test" }));
Assert.That(eventBus.Statistics!.TotalFailed, Is.EqualTo(1));
}
[Test]
public void GetPublishCount_ShouldReturnCorrectCount()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
// Act
eventBus.SendFilterable(new TestEvent { Message = "Test1" });
eventBus.SendFilterable(new TestEvent { Message = "Test2" });
// Assert
Assert.That(eventBus.Statistics!.GetPublishCount(nameof(TestEvent)), Is.EqualTo(2));
}
[Test]
public void GetListenerCount_ShouldReturnCorrectCount()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
// Act
eventBus.RegisterFilterable<TestEvent>(_ => { });
eventBus.RegisterFilterable<TestEvent>(_ => { });
// Assert
Assert.That(eventBus.Statistics!.GetListenerCount(nameof(TestEvent)), Is.EqualTo(2));
}
[Test]
public void Reset_ShouldClearAllStatistics()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
eventBus.RegisterFilterable<TestEvent>(_ => { });
eventBus.SendFilterable(new TestEvent { Message = "Test" });
// Act
eventBus.Statistics!.Reset();
// Assert
Assert.That(eventBus.Statistics.TotalPublished, Is.EqualTo(0));
Assert.That(eventBus.Statistics.TotalHandled, Is.EqualTo(0));
Assert.That(eventBus.Statistics.TotalFailed, Is.EqualTo(0));
Assert.That(eventBus.Statistics.GetPublishCount(nameof(TestEvent)), Is.EqualTo(0));
}
[Test]
public void GenerateReport_ShouldReturnFormattedString()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
eventBus.RegisterFilterable<TestEvent>(_ => { });
eventBus.SendFilterable(new TestEvent { Message = "Test" });
// Act
var report = eventBus.Statistics!.GenerateReport();
// Assert
Assert.That(report, Is.Not.Null);
Assert.That(report, Does.Contain("事件统计报告"));
Assert.That(report, Does.Contain("总发布数"));
Assert.That(report, Does.Contain("总处理数"));
}
[Test]
public void Statistics_ShouldBeThreadSafe()
{
// Arrange
var eventBus = new EnhancedEventBus(enableStatistics: true);
eventBus.RegisterFilterable<TestEvent>(_ => { });
// Act - 并发发送事件
var tasks = new List<Task>();
for (var i = 0; i < 10; i++)
{
tasks.Add(Task.Run(() =>
{
for (var j = 0; j < 100; j++)
{
eventBus.SendFilterable(new TestEvent { Message = $"Test-{j}" });
}
}));
}
Task.WaitAll(tasks.ToArray());
// Assert
Assert.That(eventBus.Statistics!.TotalPublished, Is.EqualTo(1000));
Assert.That(eventBus.Statistics.TotalHandled, Is.EqualTo(1000));
}
private sealed class TestEvent
{
public string Message { get; init; } = string.Empty;
}
}