using GFramework.Core.Events; namespace GFramework.Core.Tests.Events; /// /// 弱引用事件功能测试 /// public sealed class WeakEventTests { [Test] public void WeakEvent_ShouldReceiveEvents() { // Arrange var eventBus = new EnhancedEventBus(); var listener = new EventListener(); eventBus.RegisterWeak(listener.OnEvent); // Act eventBus.SendWeak(new TestEvent { Message = "Test1" }); eventBus.SendWeak(new TestEvent { Message = "Test2" }); // Assert Assert.That(listener.ReceivedCount, Is.EqualTo(2)); } [Test] public void WeakEvent_WhenListenerCollected_ShouldNotReceiveEvents() { // Arrange var eventBus = new EnhancedEventBus(); var receivedCount = 0; void RegisterAndCollect() { var listener = new EventListener(); eventBus.RegisterWeak(listener.OnEvent); // 发送事件,监听器应该接收到 eventBus.SendWeak(new TestEvent { Message = "Test1" }); receivedCount = listener.ReceivedCount; } RegisterAndCollect(); // 强制垃圾回收 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); // Act - 再次发送事件 eventBus.SendWeak(new TestEvent { Message = "Test2" }); // Assert - 第一次应该接收到,第二次不应该接收到(因为监听器已被回收) Assert.That(receivedCount, Is.EqualTo(1)); } [Test] public void WeakEvent_Cleanup_ShouldRemoveCollectedReferences() { // Arrange var eventBus = new EnhancedEventBus(enableStatistics: true); void RegisterAndCollect() { var listener = new EventListener(); eventBus.RegisterWeak(listener.OnEvent); } RegisterAndCollect(); // 强制垃圾回收 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); // Act eventBus.CleanupWeak(); // Assert - 监听器数量应该为 0 Assert.That(eventBus.Statistics!.GetListenerCount(nameof(TestEvent)), Is.EqualTo(0)); } [Test] public void WeakEvent_UnRegister_ShouldRemoveListener() { // Arrange var eventBus = new EnhancedEventBus(); var listener = new EventListener(); var unregister = eventBus.RegisterWeak(listener.OnEvent); // Act - 发送事件 eventBus.SendWeak(new TestEvent { Message = "Test1" }); Assert.That(listener.ReceivedCount, Is.EqualTo(1)); // 注销监听器 unregister.UnRegister(); // 再次发送事件 eventBus.SendWeak(new TestEvent { Message = "Test2" }); // Assert - 注销后不应该接收到事件 Assert.That(listener.ReceivedCount, Is.EqualTo(1)); } [Test] public void WeakEvent_MultipleListeners_ShouldAllReceiveEvents() { // Arrange var eventBus = new EnhancedEventBus(); var listener1 = new EventListener(); var listener2 = new EventListener(); var listener3 = new EventListener(); eventBus.RegisterWeak(listener1.OnEvent); eventBus.RegisterWeak(listener2.OnEvent); eventBus.RegisterWeak(listener3.OnEvent); // Act eventBus.SendWeak(new TestEvent { Message = "Test" }); // Assert Assert.That(listener1.ReceivedCount, Is.EqualTo(1)); Assert.That(listener2.ReceivedCount, Is.EqualTo(1)); Assert.That(listener3.ReceivedCount, Is.EqualTo(1)); } [Test] public void WeakEvent_WithStatistics_ShouldTrackCorrectly() { // Arrange var eventBus = new EnhancedEventBus(enableStatistics: true); var listener = new EventListener(); eventBus.RegisterWeak(listener.OnEvent); // Act eventBus.SendWeak(new TestEvent { Message = "Test1" }); eventBus.SendWeak(new TestEvent { Message = "Test2" }); // Assert Assert.That(eventBus.Statistics!.TotalPublished, Is.EqualTo(2)); Assert.That(eventBus.Statistics.TotalHandled, Is.EqualTo(2)); Assert.That(eventBus.Statistics.GetListenerCount(nameof(TestEvent)), Is.EqualTo(1)); } [Test] public void WeakEvent_ExceptionInHandler_ShouldTrackFailure() { // Arrange var eventBus = new EnhancedEventBus(enableStatistics: true); eventBus.RegisterWeak(_ => throw new InvalidOperationException("Test exception")); // Act & Assert Assert.Throws(() => eventBus.SendWeak(new TestEvent { Message = "Test" })); Assert.That(eventBus.Statistics!.TotalFailed, Is.EqualTo(1)); } [Test] public void WeakEvent_AutoCleanupDuringTrigger_ShouldWork() { // Arrange var eventBus = new EnhancedEventBus(enableStatistics: true); var aliveListener = new EventListener(); void RegisterAndCollect() { var deadListener = new EventListener(); eventBus.RegisterWeak(deadListener.OnEvent); } RegisterAndCollect(); eventBus.RegisterWeak(aliveListener.OnEvent); // 强制垃圾回收 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); // Act - 触发事件会自动清理已回收的监听器 eventBus.SendWeak(new TestEvent { Message = "Test" }); // Assert - 只有存活的监听器接收到事件 Assert.That(aliveListener.ReceivedCount, Is.EqualTo(1)); Assert.That(eventBus.Statistics!.GetListenerCount(nameof(TestEvent)), Is.EqualTo(1)); } private sealed class TestEvent { public string Message { get; init; } = string.Empty; } private sealed class EventListener { public int ReceivedCount { get; private set; } public void OnEvent(TestEvent e) { ReceivedCount++; } } }