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);
}