using GFramework.Core.Abstractions.Architectures; using GFramework.Core.Abstractions.Utility; using GFramework.Core.Architectures; using GFramework.Core.Logging; using Mediator; using Microsoft.Extensions.DependencyInjection; namespace GFramework.Core.Tests.Architectures; /// /// 验证 Architecture 通过 ArchitectureModules 暴露出的模块安装与 Mediator 行为注册能力。 /// 这些测试覆盖模块安装回调和中介管道行为接入,确保模块管理器仍然保持可观察行为不变。 /// [TestFixture] public class ArchitectureModulesBehaviorTests { /// /// 初始化日志工厂和全局上下文状态。 /// [SetUp] public void SetUp() { LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider(); GameContext.Clear(); TrackingPipelineBehavior.InvocationCount = 0; } /// /// 清理测试过程中写入的全局上下文状态。 /// [TearDown] public void TearDown() { GameContext.Clear(); TrackingPipelineBehavior.InvocationCount = 0; } /// /// 验证安装模块时会把当前架构实例传给模块,并允许模块在安装阶段注册组件。 /// [Test] public async Task InstallModule_Should_Invoke_Module_Install_With_Current_Architecture() { var module = new TrackingArchitectureModule(); var architecture = new ModuleTestArchitecture(target => target.InstallModule(module)); await architecture.InitializeAsync(); Assert.Multiple(() => { Assert.That(module.InstalledArchitecture, Is.SameAs(architecture)); Assert.That(module.InstallCallCount, Is.EqualTo(1)); Assert.That(architecture.Context.GetUtility(), Is.Not.Null); }); await architecture.DestroyAsync(); } /// /// 验证注册的 Mediator 行为会参与请求管道执行。 /// [Test] public async Task RegisterMediatorBehavior_Should_Apply_Pipeline_Behavior_To_Request() { var architecture = new ModuleTestArchitecture(target => target.RegisterMediatorBehavior>()); await architecture.InitializeAsync(); var response = await architecture.Context.SendRequestAsync(new ModuleBehaviorRequest()); Assert.Multiple(() => { Assert.That(response, Is.EqualTo("handled")); Assert.That(TrackingPipelineBehavior.InvocationCount, Is.EqualTo(1)); }); await architecture.DestroyAsync(); } /// /// 用于测试模块行为的最小架构实现。 /// private sealed class ModuleTestArchitecture(Action registrationAction) : Architecture { /// /// 打开 Mediator 服务注册,以便测试中介行为接入。 /// public override Action? Configurator => services => services.AddMediator(options => { options.ServiceLifetime = ServiceLifetime.Singleton; }); /// /// 在初始化阶段执行测试注入的模块注册逻辑。 /// protected override void OnInitialize() { registrationAction(this); } } /// /// 记录模块安装调用情况的测试模块。 /// private sealed class TrackingArchitectureModule : IArchitectureModule { /// /// 获取模块安装调用次数。 /// public int InstallCallCount { get; private set; } /// /// 获取最近一次接收到的架构实例。 /// public IArchitecture? InstalledArchitecture { get; private set; } /// /// 记录安装调用,并在安装阶段注册一个工具验证调用链可用。 /// /// 目标架构实例。 public void Install(IArchitecture architecture) { InstallCallCount++; InstalledArchitecture = architecture; architecture.RegisterUtility(new InstalledByModuleUtility()); } } /// /// 由测试模块安装时注册的简单工具。 /// private sealed class InstalledByModuleUtility : IUtility { } } /// /// 用于验证管道行为注册是否生效的测试请求。 /// public sealed class ModuleBehaviorRequest : IRequest { } /// /// 处理测试请求的处理器。 /// public sealed class ModuleBehaviorRequestHandler : IRequestHandler { /// /// 返回固定结果,便于聚焦验证管道行为是否执行。 /// /// 请求实例。 /// 取消令牌。 /// 固定响应内容。 public ValueTask Handle(ModuleBehaviorRequest request, CancellationToken cancellationToken) { return ValueTask.FromResult("handled"); } } /// /// 记录请求通过管道次数的测试行为。 /// /// 请求类型。 /// 响应类型。 public sealed class TrackingPipelineBehavior : IPipelineBehavior where TRequest : IRequest { /// /// 获取当前测试进程中该请求类型对应的行为触发次数。 /// public static int InvocationCount { get; set; } /// /// 记录一次行为执行,然后继续执行下一个处理器。 /// /// 当前请求消息。 /// 下一个处理委托。 /// 取消令牌。 /// 下游处理器的响应结果。 public async ValueTask Handle( TRequest message, MessageHandlerDelegate next, CancellationToken cancellationToken) { InvocationCount++; return await next(message, cancellationToken); } }