using GFramework.Core.Abstractions.Architectures;
using GFramework.Core.Abstractions.Enums;
using GFramework.Core.Abstractions.Model;
using GFramework.Core.Abstractions.Systems;
using GFramework.Core.Abstractions.Utility;
using GFramework.Core.Architectures;
using GFramework.Core.Logging;
namespace GFramework.Core.Tests.Architectures;
///
/// 验证 Architecture 通过 ArchitectureComponentRegistry 暴露出的组件注册行为。
/// 这些测试覆盖实例注册、工厂注册、上下文注入、生命周期初始化和 Ready 后注册约束,
/// 用于保护组件注册器在继续重构后的既有契约。
///
[TestFixture]
public class ArchitectureComponentRegistryBehaviorTests
{
///
/// 初始化日志工厂和全局上下文状态。
///
[SetUp]
public void SetUp()
{
LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider();
GameContext.Clear();
}
///
/// 清理测试过程中绑定到全局表的架构上下文。
///
[TearDown]
public void TearDown()
{
GameContext.Clear();
}
///
/// 验证系统实例注册会注入上下文并参与生命周期初始化。
///
[Test]
public async Task RegisterSystem_Instance_Should_Set_Context_And_Initialize_System()
{
var system = new TrackingSystem();
var architecture = new RegistryTestArchitecture(target => target.RegisterSystem(system));
await architecture.InitializeAsync();
Assert.Multiple(() =>
{
Assert.That(system.GetContext(), Is.SameAs(architecture.Context));
Assert.That(system.InitializeCallCount, Is.EqualTo(1));
Assert.That(architecture.Context.GetSystem(), Is.SameAs(system));
});
await architecture.DestroyAsync();
}
///
/// 验证模型实例注册会注入上下文并参与生命周期初始化。
///
[Test]
public async Task RegisterModel_Instance_Should_Set_Context_And_Initialize_Model()
{
var model = new TrackingModel();
var architecture = new RegistryTestArchitecture(target => target.RegisterModel(model));
await architecture.InitializeAsync();
Assert.Multiple(() =>
{
Assert.That(model.GetContext(), Is.SameAs(architecture.Context));
Assert.That(model.InitializeCallCount, Is.EqualTo(1));
Assert.That(architecture.Context.GetModel(), Is.SameAs(model));
});
await architecture.DestroyAsync();
}
///
/// 验证上下文工具注册会注入上下文并参与生命周期初始化。
///
[Test]
public async Task RegisterUtility_Instance_Should_Set_Context_For_ContextUtility()
{
var utility = new TrackingContextUtility();
var architecture = new RegistryTestArchitecture(target => target.RegisterUtility(utility));
await architecture.InitializeAsync();
Assert.Multiple(() =>
{
Assert.That(utility.GetContext(), Is.SameAs(architecture.Context));
Assert.That(utility.InitializeCallCount, Is.EqualTo(1));
Assert.That(architecture.Context.GetUtility(), Is.SameAs(utility));
});
await architecture.DestroyAsync();
}
///
/// 验证普通工具的工厂注册会在首次解析时创建单例并执行创建回调。
///
[Test]
public async Task RegisterUtility_Type_Should_Create_Singleton_And_Invoke_Callback()
{
FactoryCreatedUtility? callbackInstance = null;
var architecture = new RegistryTestArchitecture(target =>
target.RegisterUtility(created => callbackInstance = created));
await architecture.InitializeAsync();
var first = architecture.Context.GetUtility();
var second = architecture.Context.GetUtility();
Assert.Multiple(() =>
{
Assert.That(callbackInstance, Is.SameAs(first));
Assert.That(second, Is.SameAs(first));
});
await architecture.DestroyAsync();
}
///
/// 验证 Ready 阶段后不允许继续注册 Utility,保持与系统和模型一致的约束。
///
[Test]
public async Task RegisterUtility_After_Ready_Should_Throw_InvalidOperationException()
{
var architecture = new RegistryTestArchitecture(_ => { });
await architecture.InitializeAsync();
Assert.That(
() => architecture.RegisterUtility(new TrackingContextUtility()),
Throws.InvalidOperationException.With.Message.EqualTo(
"Cannot register utility after Architecture is Ready"));
await architecture.DestroyAsync();
}
///
/// 用于测试组件注册行为的最小架构实现。
///
private sealed class RegistryTestArchitecture(Action registrationAction) : Architecture
{
///
/// 在初始化阶段执行测试注入的注册逻辑。
///
protected override void OnInitialize()
{
registrationAction(this);
}
}
///
/// 记录初始化与上下文注入情况的测试系统。
///
private sealed class TrackingSystem : ISystem
{
private IArchitectureContext _context = null!;
///
/// 获取系统初始化调用次数。
///
public int InitializeCallCount { get; private set; }
///
/// 记录初始化调用。
///
public void Initialize()
{
InitializeCallCount++;
}
///
/// 该测试系统不关心阶段变更。
///
/// 当前架构阶段。
public void OnArchitecturePhase(ArchitecturePhase phase)
{
}
///
/// 存储注入的架构上下文。
///
/// 架构上下文。
public void SetContext(IArchitectureContext context)
{
_context = context;
}
///
/// 返回当前持有的架构上下文。
///
public IArchitectureContext GetContext()
{
return _context;
}
///
/// 该测试系统没有额外销毁逻辑。
///
public void Destroy()
{
}
}
///
/// 记录初始化与上下文注入情况的测试模型。
///
private sealed class TrackingModel : IModel
{
private IArchitectureContext _context = null!;
///
/// 获取模型初始化调用次数。
///
public int InitializeCallCount { get; private set; }
///
/// 记录初始化调用。
///
public void Initialize()
{
InitializeCallCount++;
}
///
/// 该测试模型不关心阶段变更。
///
/// 当前架构阶段。
public void OnArchitecturePhase(ArchitecturePhase phase)
{
}
///
/// 存储注入的架构上下文。
///
/// 架构上下文。
public void SetContext(IArchitectureContext context)
{
_context = context;
}
///
/// 返回当前持有的架构上下文。
///
public IArchitectureContext GetContext()
{
return _context;
}
}
///
/// 记录初始化与上下文注入情况的测试上下文工具。
///
private sealed class TrackingContextUtility : IContextUtility
{
private IArchitectureContext _context = null!;
///
/// 获取工具初始化调用次数。
///
public int InitializeCallCount { get; private set; }
///
/// 记录初始化调用。
///
public void Initialize()
{
InitializeCallCount++;
}
///
/// 存储注入的架构上下文。
///
/// 架构上下文。
public void SetContext(IArchitectureContext context)
{
_context = context;
}
///
/// 返回当前持有的架构上下文。
///
public IArchitectureContext GetContext()
{
return _context;
}
///
/// 该测试工具没有额外销毁逻辑。
///
public void Destroy()
{
}
}
///
/// 用于验证普通工厂注册路径的简单工具。
///
private sealed class FactoryCreatedUtility : IUtility
{
}
}