using GFramework.Core.Events; namespace GFramework.Core.Tests.StateManagement; /// /// Store 到 EventBus 桥接扩展的单元测试。 /// 这些测试验证旧模块兼容桥接能够正确转发 dispatch 和状态变化事件,并支持运行时拆除。 /// [TestFixture] public class StoreEventBusExtensionsTests { /// /// 测试桥接会发布每次 dispatch 事件,并对批处理后的状态变化只发送一次最终状态事件。 /// [Test] public void BridgeToEventBus_Should_Publish_Dispatches_And_Collapsed_State_Changes() { var eventBus = new EventBus(); var store = CreateStore(); var dispatchedEvents = new List>(); var stateChangedEvents = new List>(); eventBus.Register>(dispatchedEvents.Add); eventBus.Register>(stateChangedEvents.Add); store.BridgeToEventBus(eventBus); store.Dispatch(new IncrementAction(1)); store.RunInBatch(() => { store.Dispatch(new IncrementAction(1)); store.Dispatch(new IncrementAction(1)); }); Assert.That(dispatchedEvents.Count, Is.EqualTo(3)); Assert.That(dispatchedEvents[0].DispatchRecord.NextState.Count, Is.EqualTo(1)); Assert.That(dispatchedEvents[2].DispatchRecord.NextState.Count, Is.EqualTo(3)); Assert.That(stateChangedEvents.Count, Is.EqualTo(2)); Assert.That(stateChangedEvents[0].State.Count, Is.EqualTo(1)); Assert.That(stateChangedEvents[1].State.Count, Is.EqualTo(3)); } /// /// 测试桥接句柄注销后不会再继续向 EventBus 发送事件。 /// [Test] public void BridgeToEventBus_UnRegister_Should_Stop_Future_Publications() { var eventBus = new EventBus(); var store = CreateStore(); var dispatchedEvents = new List>(); var stateChangedEvents = new List>(); eventBus.Register>(dispatchedEvents.Add); eventBus.Register>(stateChangedEvents.Add); var bridge = store.BridgeToEventBus(eventBus); store.Dispatch(new IncrementAction(1)); bridge.UnRegister(); store.Dispatch(new IncrementAction(1)); Assert.That(dispatchedEvents.Count, Is.EqualTo(1)); Assert.That(stateChangedEvents.Count, Is.EqualTo(1)); Assert.That(stateChangedEvents[0].State.Count, Is.EqualTo(1)); } /// /// 创建一个带基础 reducer 的测试 Store。 /// /// 测试用 Store 实例。 private static Store CreateStore() { var store = new Store(new CounterState(0, "Player")); store.RegisterReducer((state, action) => state with { Count = state.Count + action.Amount }); return store; } /// /// 用于桥接测试的状态类型。 /// /// 当前计数值。 /// 当前名称。 private sealed record CounterState(int Count, string Name); /// /// 用于桥接测试的计数 action。 /// /// 要增加的数量。 private sealed record IncrementAction(int Amount); }