using GFramework.Game.Abstractions.Config; using GFramework.Game.Config; namespace GFramework.Game.Tests.Config; /// /// 验证配置注册表的注册、覆盖和类型检查行为。 /// [TestFixture] public class ConfigRegistryTests { /// /// 验证注册后的配置表可以按名称和类型成功解析。 /// [Test] public void RegisterTable_Then_GetTable_Should_Return_Registered_Instance() { var registry = new ConfigRegistry(); var table = CreateMonsterTable(); registry.RegisterTable("monster", table); var resolved = registry.GetTable("monster"); Assert.That(resolved, Is.SameAs(table)); } /// /// 验证同名注册会覆盖旧表,用于后续热重载场景。 /// [Test] public void RegisterTable_Should_Replace_Previous_Table_With_Same_Name() { var registry = new ConfigRegistry(); var oldTable = CreateMonsterTable(); var newTable = new InMemoryConfigTable( new[] { new MonsterConfigStub(3, "Orc") }, static config => config.Id); registry.RegisterTable("monster", oldTable); registry.RegisterTable("monster", newTable); var resolved = registry.GetTable("monster"); Assert.That(resolved, Is.SameAs(newTable)); Assert.That(resolved.Count, Is.EqualTo(1)); } /// /// 验证请求类型与实际注册类型不匹配时会抛出异常,避免消费端默默读取错误表。 /// [Test] public void GetTable_Should_Throw_When_Requested_Type_Does_Not_Match_Registered_Table() { var registry = new ConfigRegistry(); registry.RegisterTable("monster", CreateMonsterTable()); Assert.Throws(() => registry.GetTable("monster")); } /// /// 验证移除和清空操作会更新注册表状态。 /// [Test] public void RemoveTable_And_Clear_Should_Update_Registry_State() { var registry = new ConfigRegistry(); registry.RegisterTable("monster", CreateMonsterTable()); registry.RegisterTable("npc", CreateNpcTable()); var removed = registry.RemoveTable("monster"); Assert.Multiple(() => { Assert.That(removed, Is.True); Assert.That(registry.HasTable("monster"), Is.False); Assert.That(registry.Count, Is.EqualTo(1)); }); registry.Clear(); Assert.That(registry.Count, Is.EqualTo(0)); } /// /// 创建怪物配置表测试实例。 /// /// 怪物配置表。 private static IConfigTable CreateMonsterTable() { return new InMemoryConfigTable( new[] { new MonsterConfigStub(1, "Slime"), new MonsterConfigStub(2, "Goblin") }, static config => config.Id); } /// /// 创建 NPC 配置表测试实例。 /// /// NPC 配置表。 private static IConfigTable CreateNpcTable() { return new InMemoryConfigTable( new[] { new NpcConfigStub(Guid.NewGuid(), "Guide") }, static config => config.Id); } /// /// 用于怪物配置表测试的最小配置类型。 /// /// 配置主键。 /// 配置名称。 private sealed record MonsterConfigStub(int Id, string Name); /// /// 用于 NPC 配置表测试的最小配置类型。 /// /// 配置主键。 /// 配置名称。 private sealed record NpcConfigStub(Guid Id, string Name); }