using GFramework.Core.Abstractions.Enums;
using GFramework.Core.Abstractions.Events;
using GFramework.Core.Architectures;
using GFramework.Core.Environment;
using GFramework.Core.Logging;
using Microsoft.Extensions.DependencyInjection;
namespace GFramework.Core.Tests.Architectures;
///
/// 验证 初始化编排流程的单元测试。
/// 这些测试覆盖环境初始化、服务准备、上下文绑定和自定义服务配置的时序,
/// 以确保核心协调器在拆分后仍保持既有行为。
///
[TestFixture]
public class ArchitectureInitializationPipelineTests
{
///
/// 为每个测试准备独立的日志工厂和游戏上下文状态。
///
[SetUp]
public void SetUp()
{
LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider();
GameContext.Clear();
}
///
/// 清理测试期间注册的全局游戏上下文,避免跨测试污染。
///
[TearDown]
public void TearDown()
{
GameContext.Clear();
}
///
/// 验证异步初始化会在执行用户初始化逻辑之前准备环境、服务和上下文。
///
[Test]
public async Task InitializeAsync_Should_Prepare_Runtime_Before_OnInitialize()
{
var environment = new TrackingEnvironment();
var marker = new BootstrapMarker();
var architecture = new InitializationPipelineTestArchitecture(environment, marker);
await architecture.InitializeAsync();
AssertRuntimePrepared(architecture, environment, marker);
await architecture.DestroyAsync();
}
///
/// 验证同步初始化路径复用同一套基础设施准备流程。
///
[Test]
public async Task Initialize_Should_Prepare_Runtime_Before_OnInitialize()
{
var environment = new TrackingEnvironment();
var marker = new BootstrapMarker();
var architecture = new InitializationPipelineTestArchitecture(environment, marker);
architecture.Initialize();
AssertRuntimePrepared(architecture, environment, marker);
await architecture.DestroyAsync();
}
///
/// 断言初始化阶段所需的运行时准备工作都已经完成。
///
/// 待验证的测试架构实例。
/// 测试使用的环境对象。
/// 通过服务配置委托注册的标记服务。
private static void AssertRuntimePrepared(
InitializationPipelineTestArchitecture architecture,
TrackingEnvironment environment,
BootstrapMarker marker)
{
Assert.Multiple(() =>
{
Assert.That(architecture.ObservedEnvironmentInitialized, Is.True);
Assert.That(architecture.ObservedConfiguredServiceAvailable, Is.True);
Assert.That(architecture.ObservedEventBusAvailable, Is.True);
Assert.That(architecture.ObservedContextWasBound, Is.True);
Assert.That(architecture.ObservedEnvironmentRegistered, Is.True);
Assert.That(architecture.Context.GetEnvironment(), Is.SameAs(environment));
Assert.That(architecture.Context.GetService(), Is.SameAs(marker));
Assert.That(architecture.CurrentPhase, Is.EqualTo(ArchitecturePhase.Ready));
});
}
///
/// 跟踪初始化期间关键可观察状态的测试架构。
///
private sealed class InitializationPipelineTestArchitecture : Architecture
{
private readonly TrackingEnvironment _environment;
private readonly BootstrapMarker _marker;
///
/// 使用可观察环境和标记服务创建测试架构。
///
/// 用于验证初始化时序的环境对象。
/// 用于验证服务钩子执行结果的标记服务。
public InitializationPipelineTestArchitecture(
TrackingEnvironment environment,
BootstrapMarker marker)
: base(environment: environment)
{
_environment = environment;
_marker = marker;
}
///
/// 记录用户初始化逻辑执行时环境是否已经准备完成。
///
public bool ObservedEnvironmentInitialized { get; private set; }
///
/// 记录自定义服务是否已在用户初始化前注册到容器。
///
public bool ObservedConfiguredServiceAvailable { get; private set; }
///
/// 记录内置事件总线是否已在用户初始化前可用。
///
public bool ObservedEventBusAvailable { get; private set; }
///
/// 记录当前上下文是否已在用户初始化前绑定到全局游戏上下文表。
///
public bool ObservedContextWasBound { get; private set; }
///
/// 记录环境对象是否已在用户初始化前注册到架构上下文。
///
public bool ObservedEnvironmentRegistered { get; private set; }
///
/// 为容器注册测试标记服务,用于验证初始化前的服务钩子是否执行。
///
public override Action? Configurator => services => services.AddSingleton(_marker);
///
/// 在用户初始化逻辑中采集运行时准备状态。
///
protected override void OnInitialize()
{
ObservedEnvironmentInitialized = _environment.InitializeCallCount == 1;
ObservedConfiguredServiceAvailable = ReferenceEquals(Context.GetService(), _marker);
ObservedEventBusAvailable = Context.GetService() is not null;
ObservedContextWasBound = ReferenceEquals(GameContext.GetByType(GetType()), Context);
ObservedEnvironmentRegistered = ReferenceEquals(Context.GetEnvironment(), _environment);
}
}
///
/// 用于验证环境初始化是否发生的测试环境。
///
private sealed class TrackingEnvironment : EnvironmentBase
{
///
/// 获取测试环境名称。
///
public override string Name { get; } = "Tracking";
///
/// 获取环境初始化调用次数。
///
public int InitializeCallCount { get; private set; }
///
/// 记录环境初始化次数。
///
public override void Initialize()
{
InitializeCallCount++;
}
}
///
/// 通过服务配置委托注册到容器的测试标记对象。
///
private sealed class BootstrapMarker
{
}
}