using GFramework.Core.Abstractions.architecture; using GFramework.Core.Abstractions.enums; using GFramework.Core.Abstractions.lifecycle; using GFramework.Core.Abstractions.model; using GFramework.Core.Abstractions.system; using GFramework.Core.Abstractions.utility; using GFramework.Core.architecture; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; namespace GFramework.Core.Tests.architecture; /// /// RegistryInitializationHookBase 抽象基类的单元测试 /// 测试内容包括: /// - 在目标阶段正确触发配置注册 /// - 在非目标阶段不触发配置注册 /// - 正确遍历所有配置项 /// - 注册表不存在时不抛出异常 /// - 支持自定义目标阶段 /// [TestFixture] public class RegistryInitializationHookBaseTests { /// /// 测试在目标阶段时是否正确触发配置注册 /// [Test] public void OnPhase_Should_Register_Configs_At_Target_Phase() { var registry = new TestRegistry(); var configs = new[] { "config1", "config2", "config3" }; var hook = new TestRegistryInitializationHook(configs); var architecture = new TestArchitectureWithRegistry(registry); hook.OnPhase(ArchitecturePhase.AfterSystemInit, architecture); Assert.That(registry.RegisteredConfigs.Count, Is.EqualTo(3)); Assert.That(registry.RegisteredConfigs, Is.EquivalentTo(configs)); } /// /// 测试在非目标阶段时不触发配置注册 /// [Test] public void OnPhase_Should_Not_Register_Configs_At_Wrong_Phase() { var registry = new TestRegistry(); var configs = new[] { "config1", "config2" }; var hook = new TestRegistryInitializationHook(configs); var architecture = new TestArchitectureWithRegistry(registry); hook.OnPhase(ArchitecturePhase.BeforeSystemInit, architecture); Assert.That(registry.RegisteredConfigs.Count, Is.EqualTo(0)); } /// /// 测试支持自定义目标阶段 /// [Test] public void OnPhase_Should_Support_Custom_Target_Phase() { var registry = new TestRegistry(); var configs = new[] { "config1" }; var hook = new TestRegistryInitializationHook(configs, ArchitecturePhase.AfterModelInit); var architecture = new TestArchitectureWithRegistry(registry); hook.OnPhase(ArchitecturePhase.AfterModelInit, architecture); Assert.That(registry.RegisteredConfigs.Count, Is.EqualTo(1)); } /// /// 测试当注册表不存在时不抛出异常 /// [Test] public void OnPhase_Should_Not_Throw_When_Registry_Not_Found() { var configs = new[] { "config1" }; var hook = new TestRegistryInitializationHook(configs); var architecture = new TestArchitectureWithoutRegistry(); Assert.DoesNotThrow(() => hook.OnPhase(ArchitecturePhase.AfterSystemInit, architecture)); } /// /// 测试空配置集合不会导致错误 /// [Test] public void OnPhase_Should_Handle_Empty_Configs() { var registry = new TestRegistry(); var configs = Array.Empty(); var hook = new TestRegistryInitializationHook(configs); var architecture = new TestArchitectureWithRegistry(registry); hook.OnPhase(ArchitecturePhase.AfterSystemInit, architecture); Assert.That(registry.RegisteredConfigs.Count, Is.EqualTo(0)); } /// /// 测试多次调用同一阶段会重复注册 /// [Test] public void OnPhase_Should_Register_Multiple_Times_If_Called_Multiple_Times() { var registry = new TestRegistry(); var configs = new[] { "config1" }; var hook = new TestRegistryInitializationHook(configs); var architecture = new TestArchitectureWithRegistry(registry); hook.OnPhase(ArchitecturePhase.AfterSystemInit, architecture); hook.OnPhase(ArchitecturePhase.AfterSystemInit, architecture); Assert.That(registry.RegisteredConfigs.Count, Is.EqualTo(2)); } } /// /// 测试用的注册表初始化钩子实现 /// public class TestRegistryInitializationHook : RegistryInitializationHookBase { public TestRegistryInitializationHook( IEnumerable configs, ArchitecturePhase targetPhase = ArchitecturePhase.AfterSystemInit) : base(configs, targetPhase) { } protected override void RegisterConfig(TestRegistry registry, string config) { registry.Register(config); } } /// /// 测试用的注册表类 /// public class TestRegistry : IUtility { public List RegisteredConfigs { get; } = new(); public void Register(string config) { RegisteredConfigs.Add(config); } } /// /// 测试用的架构类(包含注册表) /// public class TestArchitectureWithRegistry : IArchitecture { private readonly TestRegistry _registry; public TestArchitectureWithRegistry(TestRegistry registry) { _registry = registry; Context = new TestArchitectureContextWithRegistry(registry); } public Action? Configurator { get; } public IArchitectureContext Context { get; } Action? IArchitecture.Configurator => Configurator; T IArchitecture.RegisterSystem(T system) { throw new NotImplementedException(); } T IArchitecture.RegisterModel(T model) { throw new NotImplementedException(); } T IArchitecture.RegisterUtility(T utility) { throw new NotImplementedException(); } public void RegisterMediatorBehavior() where TBehavior : class { throw new NotImplementedException(); } public IArchitectureModule InstallModule(IArchitectureModule module) { throw new NotImplementedException(); } IArchitectureLifecycleHook IArchitecture.RegisterLifecycleHook(IArchitectureLifecycleHook hook) { throw new NotImplementedException(); } Task IArchitecture.WaitUntilReadyAsync() { return WaitUntilReadyAsync(); } public void RegisterUtility(Action? onCreated = default(Action?)) where T : class, IUtility { throw new NotImplementedException(); } public void RegisterModel(Action? onCreated = default(Action?)) where T : class, IModel { throw new NotImplementedException(); } public void RegisterSystem(Action? onCreated = default(Action?)) where T : class, ISystem { throw new NotImplementedException(); } public void Initialize() { } public void Destroy() { throw new NotImplementedException(); } Task IAsyncInitializable.InitializeAsync() { return InitializeAsync(); } ValueTask IAsyncDestroyable.DestroyAsync() { return DestroyAsync(); } public Task WaitUntilReadyAsync() { throw new NotImplementedException(); } public void RegisterLifecycleHook(IArchitectureLifecycleHook hook) { } public Task InitializeAsync() { throw new NotImplementedException(); } public ValueTask DestroyAsync() { throw new NotImplementedException(); } } /// /// 测试用的架构上下文类(包含注册表) /// public class TestArchitectureContextWithRegistry : TestArchitectureContext { private readonly TestRegistry _registry; public TestArchitectureContextWithRegistry(TestRegistry registry) { _registry = registry; } public override TUtility GetUtility() { if (typeof(TUtility) == typeof(TestRegistry)) { return _registry as TUtility; } return base.GetUtility(); } } /// /// 测试用的架构类(不包含注册表) /// public class TestArchitectureWithoutRegistry : IArchitecture { public TestArchitectureWithoutRegistry() { Context = new TestArchitectureContext(); } public IArchitectureContext Context { get; } public Action? Configurator { get; } T IArchitecture.RegisterSystem(T system) { throw new NotImplementedException(); } T IArchitecture.RegisterModel(T model) { throw new NotImplementedException(); } T IArchitecture.RegisterUtility(T utility) { throw new NotImplementedException(); } public void RegisterMediatorBehavior() where TBehavior : class { throw new NotImplementedException(); } public IArchitectureModule InstallModule(IArchitectureModule module) { throw new NotImplementedException(); } IArchitectureLifecycleHook IArchitecture.RegisterLifecycleHook(IArchitectureLifecycleHook hook) { throw new NotImplementedException(); } public Task WaitUntilReadyAsync() { throw new NotImplementedException(); } public void RegisterUtility(Action? onCreated = default(Action?)) where T : class, IUtility { throw new NotImplementedException(); } public void RegisterModel(Action? onCreated = default(Action?)) where T : class, IModel { throw new NotImplementedException(); } public void RegisterSystem(Action? onCreated = default(Action?)) where T : class, ISystem { throw new NotImplementedException(); } public void Initialize() { } public Task InitializeAsync() { throw new NotImplementedException(); } public ValueTask DestroyAsync() { throw new NotImplementedException(); } public void Destroy() { throw new NotImplementedException(); } public void RegisterLifecycleHook(IArchitectureLifecycleHook hook) { } }