using GFramework.Core.events; namespace GFramework.Core.Tests.events; /// /// 事件统计功能测试 /// 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(_ => handledCount++); eventBus.RegisterFilterable(_ => 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(_ => throw new InvalidOperationException("Test exception")); // Act & Assert Assert.Throws(() => 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(_ => { }); eventBus.RegisterFilterable(_ => { }); // 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(_ => { }); 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(_ => { }); 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(_ => { }); // Act - 并发发送事件 var tasks = new List(); 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; } }