using System.Reflection; using GFramework.Core.Abstractions.enums; using GFramework.Core.architecture; using GFramework.Core.Tests.architecture; using GFramework.Core.Tests.model; using GFramework.Core.Tests.system; using NUnit.Framework; using NUnit.Framework.Legacy; namespace GFramework.Core.Tests.tests; /// /// 架构测试基类,封装同步/异步共通测试逻辑 /// /// 架构类型,必须继承自Architecture public abstract class ArchitectureTestsBase where TArchitecture : Architecture { protected TArchitecture? Architecture; /// /// 子类必须实现创建具体架构实例 /// /// 创建的架构实例 protected abstract TArchitecture CreateArchitecture(); /// /// 子类必须实现初始化架构(同步或异步) /// /// 异步初始化任务 protected abstract Task InitializeArchitecture(); /// /// 测试设置方法,在每个测试开始前执行 /// 清理游戏上下文并创建架构实例 /// [SetUp] public void SetUp() { GameContext.Clear(); Architecture = CreateArchitecture(); } /// /// 测试清理方法,在每个测试结束后执行 /// 销毁架构实例并清理游戏上下文 /// [TearDown] public void TearDown() { try { Architecture?.Destroy(); } finally { GameContext.Clear(); Architecture = null; } } /// /// 验证架构阶段顺序 /// /// 异步测试任务 [Test] public async Task Architecture_Should_Enter_Phases_In_Correct_Order() { await InitializeArchitecture(); // 通过反射获取架构的阶段历史记录 var phasesProperty = typeof(TArchitecture) .GetProperty("PhaseHistory", BindingFlags.Instance | BindingFlags.Public); var phases = (List)phasesProperty!.GetValue(Architecture)!; CollectionAssert.AreEqual( new[] { ArchitecturePhase.BeforeModelInit, ArchitecturePhase.AfterModelInit, ArchitecturePhase.BeforeSystemInit, ArchitecturePhase.AfterSystemInit, ArchitecturePhase.Ready }, phases ); } /// /// 验证 Ready 后不能注册组件 /// /// 异步测试任务 [Test] public async Task Registering_Components_AfterReady_Should_Throw() { await InitializeArchitecture(); // 根据架构类型验证注册组件时抛出异常 if (Architecture is SyncTestArchitecture syncArch) { Assert.Throws(() => syncArch.RegisterModel(new TestModel())); Assert.Throws(() => syncArch.RegisterSystem(new TestSystem())); } else if (Architecture is AsyncTestArchitecture asyncArch) { Assert.Throws(() => asyncArch.RegisterModel(new AsyncTestModel())); Assert.Throws(() => asyncArch.RegisterSystem(new AsyncTestSystem())); } } /// /// 验证销毁功能 /// /// 异步测试任务 [Test] public async Task Architecture_Destroy_Should_Destroy_All_Systems_And_Enter_Destroyed() { await InitializeArchitecture(); Architecture!.Destroy(); // 验证系统是否被正确销毁 if (Architecture is SyncTestArchitecture syncArch) { var system = syncArch.Context.GetSystem(); Assert.That(system!.DestroyCalled, Is.True); } else if (Architecture is AsyncTestArchitecture asyncArch) { var system = asyncArch.Context.GetSystem(); Assert.That(system!.DestroyCalled, Is.True); } // 通过反射验证当前阶段为销毁状态 var phaseProperty = typeof(TArchitecture) .GetProperty("CurrentPhase", BindingFlags.Instance | BindingFlags.NonPublic); var phase = (ArchitecturePhase)phaseProperty!.GetValue(Architecture)!; Assert.That(phase, Is.EqualTo(ArchitecturePhase.Destroyed)); } }