using GFramework.Core.Abstractions.State; namespace GFramework.Core.Tests.State; /// /// 异步具体状态实现类V2版本,用于测试异步状态的基本功能。 /// public sealed class ConcreteAsyncStateV2 : 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 Action? CanTransitionToAsyncAction { get; 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); CanTransitionToAsyncAction?.Invoke(target); 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"); } }