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