using GFramework.Core.Abstractions.State; namespace GFramework.Core.Tests.State; /// /// 为 提供异步生命周期路径的测试状态。 /// public sealed class TestAsyncState : IState, IAsyncState { /// /// 获取或设置是否允许向目标状态转移。 /// public bool AllowTransitions { get; set; } = true; /// /// 获取异步进入状态是否已被调用。 /// public bool EnterCalled { get; private set; } /// /// 获取异步离开状态是否已被调用。 /// public bool ExitCalled { get; private set; } /// /// 获取异步进入回调被调用的次数。 /// public int EnterCallCount { get; private set; } /// /// 获取异步离开回调被调用的次数。 /// public int ExitCallCount { get; private set; } /// /// 获取最近一次异步进入时的来源状态。 /// public IState? EnterFrom { get; private set; } /// /// 获取最近一次异步离开时的目标状态。 /// public IState? ExitTo { get; private set; } /// /// 获取异步转移检查被调用的次数。 /// public int CanTransitionToCallCount { get; private set; } /// /// 异步记录进入状态的来源状态与调用次数。 /// /// 触发进入的来源状态。 public async Task OnEnterAsync(IState? from) { await Task.Delay(1).ConfigureAwait(false); EnterCalled = true; EnterCallCount++; EnterFrom = from; } /// /// 异步记录离开状态的目标状态与调用次数。 /// /// 即将切换到的目标状态。 public async Task OnExitAsync(IState? to) { await Task.Delay(1).ConfigureAwait(false); ExitCalled = true; ExitCallCount++; ExitTo = to; } /// /// 异步记录转移检查并返回当前是否允许切换。 /// /// 目标状态。 /// 允许切换时返回 ,否则返回 public async Task CanTransitionToAsync(IState target) { await Task.Delay(1).ConfigureAwait(false); CanTransitionToCallCount++; return AllowTransitions; } /// /// 同步进入入口不应被异步状态机路径调用。 /// /// 触发进入的来源状态。 /// 总是抛出,表示当前测试状态只允许异步入口。 public void OnEnter(IState? from) { throw new InvalidOperationException("Sync OnEnter should not be called for async state"); } /// /// 同步离开入口不应被异步状态机路径调用。 /// /// 即将切换到的目标状态。 /// 总是抛出,表示当前测试状态只允许异步入口。 public void OnExit(IState? to) { throw new InvalidOperationException("Sync OnExit should not be called for async state"); } /// /// 同步转移检查入口不应被异步状态机路径调用。 /// /// 目标状态。 /// 此方法不会正常返回。 /// 总是抛出,表示当前测试状态只允许异步入口。 public bool CanTransitionTo(IState target) { throw new InvalidOperationException("Sync CanTransitionTo should not be called for async state"); } }