diff --git a/GFramework.Core.Tests/events/TestEvent.cs b/GFramework.Core.Tests/events/TestEvent.cs new file mode 100644 index 0000000..d277fc7 --- /dev/null +++ b/GFramework.Core.Tests/events/TestEvent.cs @@ -0,0 +1,8 @@ +namespace GFramework.Core.Tests.events; + +public sealed class TestEvent +{ + public int ReceivedValue { get; init; } +} + +public sealed class EmptyEvent; \ No newline at end of file diff --git a/GFramework.Core.Tests/model/AsyncTestModel.cs b/GFramework.Core.Tests/model/AsyncTestModel.cs index 0994f7d..2d0e80d 100644 --- a/GFramework.Core.Tests/model/AsyncTestModel.cs +++ b/GFramework.Core.Tests/model/AsyncTestModel.cs @@ -1,16 +1,14 @@ using GFramework.Core.Abstractions.architecture; using GFramework.Core.Abstractions.enums; -using GFramework.Core.Abstractions.model; +using GFramework.Core.model; namespace GFramework.Core.Tests.model; /// /// 异步测试模型类,实现了IModel和IAsyncInitializable接口 /// -public sealed class AsyncTestModel : IModel, IAsyncInitializable +public sealed class AsyncTestModel : AbstractModel, IAsyncInitializable { - private IArchitectureContext _context = null!; - /// /// 获取模型是否已初始化的标志 /// @@ -36,24 +34,6 @@ public sealed class AsyncTestModel : IModel, IAsyncInitializable throw new InvalidOperationException("Sync Init should not be called"); } - /// - /// 设置架构上下文 - /// - /// 架构上下文对象 - public void SetContext(IArchitectureContext context) - { - _context = context; - } - - /// - /// 获取架构上下文 - /// - /// 架构上下文对象 - public IArchitectureContext GetContext() - { - return _context; - } - /// /// 处理架构阶段事件 /// @@ -61,4 +41,8 @@ public sealed class AsyncTestModel : IModel, IAsyncInitializable public void OnArchitecturePhase(ArchitecturePhase phase) { } + + protected override void OnInit() + { + } } \ No newline at end of file diff --git a/GFramework.Core.Tests/model/ITestModel.cs b/GFramework.Core.Tests/model/ITestModel.cs new file mode 100644 index 0000000..af86350 --- /dev/null +++ b/GFramework.Core.Tests/model/ITestModel.cs @@ -0,0 +1,8 @@ +using GFramework.Core.Abstractions.model; + +namespace GFramework.Core.Tests.model; + +public interface ITestModel : IModel +{ + int GetCurrentXp { get; } +} \ No newline at end of file diff --git a/GFramework.Core.Tests/model/TestModel.cs b/GFramework.Core.Tests/model/TestModel.cs index 5e8e83a..26da6fa 100644 --- a/GFramework.Core.Tests/model/TestModel.cs +++ b/GFramework.Core.Tests/model/TestModel.cs @@ -1,15 +1,14 @@ -using GFramework.Core.Abstractions.architecture; -using GFramework.Core.Abstractions.enums; -using GFramework.Core.Abstractions.model; +using GFramework.Core.Abstractions.enums; +using GFramework.Core.model; namespace GFramework.Core.Tests.model; /// /// 测试模型类,用于框架测试目的 /// -public sealed class TestModel : IModel +public sealed class TestModel : AbstractModel, ITestModel { - private IArchitectureContext _context = null!; + public const int DefaultXp = 5; /// /// 获取模型是否已初始化的状态 @@ -24,17 +23,14 @@ public sealed class TestModel : IModel Initialized = true; } - public void SetContext(IArchitectureContext context) - { - _context = context; - } - - public IArchitectureContext GetContext() - { - return _context; - } public void OnArchitecturePhase(ArchitecturePhase phase) { } + + public int GetCurrentXp { get; } = DefaultXp; + + protected override void OnInit() + { + } } \ No newline at end of file diff --git a/GFramework.Core.Tests/query/TestQuery.cs b/GFramework.Core.Tests/query/TestQuery.cs new file mode 100644 index 0000000..9dd62fc --- /dev/null +++ b/GFramework.Core.Tests/query/TestQuery.cs @@ -0,0 +1,28 @@ +using GFramework.Core.Abstractions.query; +using GFramework.Core.extensions; +using GFramework.Core.query; +using GFramework.Core.Tests.model; + +namespace GFramework.Core.Tests.query; + +/// +/// 测试查询类,用于执行测试查询操作 +/// +/// 测试查询输入参数 +public class TestQuery(TestQueryInput input) : AbstractQuery(input) +{ + /// + /// 执行查询操作的重写方法 + /// + /// 测试查询输入参数 + /// 返回固定的整数值42 + protected override int OnDo(TestQueryInput input) + { + return this.GetModel()!.GetCurrentXp; + } +} + +/// +/// 测试查询输入类,实现查询输入接口 +/// +public sealed class TestQueryInput : IQueryInput; \ No newline at end of file diff --git a/GFramework.Core.Tests/tests/SyncArchitectureTests.cs b/GFramework.Core.Tests/tests/SyncArchitectureTests.cs index 67686fe..8417126 100644 --- a/GFramework.Core.Tests/tests/SyncArchitectureTests.cs +++ b/GFramework.Core.Tests/tests/SyncArchitectureTests.cs @@ -1,6 +1,7 @@ using GFramework.Core.Abstractions.enums; using GFramework.Core.architecture; using GFramework.Core.Tests.architecture; +using GFramework.Core.Tests.events; using GFramework.Core.Tests.model; using GFramework.Core.Tests.system; using NUnit.Framework; @@ -137,4 +138,68 @@ public class SyncArchitectureTests : ArchitectureTestsBase AssertInitializationFailed(); } + + /// + /// 测试事件是否能够被正确接收和处理 + /// + /// + /// 该测试验证了事件系统的注册和发送功能,确保事件能够被正确传递给注册的处理器 + /// + [Test] + public void Event_Should_Be_Received() + { + Architecture!.Initialize(); + var context = Architecture.Context; + + var receivedValue = 0; + const int tagetValue = 100; + // 注册事件处理器,将接收到的值赋给receivedValue变量 + context.RegisterEvent(e => { receivedValue = e.ReceivedValue; }); + + // 发送测试事件 + context.SendEvent(new TestEvent + { + ReceivedValue = tagetValue + }); + + Assert.That(receivedValue, Is.EqualTo(tagetValue)); + } + + /// + /// 测试事件取消注册功能是否正常工作 + /// + /// + /// 该测试验证了事件处理器的取消注册功能,确保取消注册后事件处理器不再被调用 + /// + [Test] + public void Event_UnRegister_Should_Work() + { + Architecture!.Initialize(); + var context = Architecture.Context; + + var count = 0; + + // 注册事件处理器并获取取消注册对象 + var unRegister = context.RegisterEvent(Handler); + + // 发送第一个事件,此时处理器应该被调用 + context.SendEvent(new EmptyEvent()); + + // 验证事件处理器被调用了一次 + Assert.That(count, Is.EqualTo(1), "Handler should be called once before unregistration"); + + // 取消注册事件处理器 + unRegister.UnRegister(); + + // 发送第二个事件,此时处理器不应该被调用 + context.SendEvent(new EmptyEvent()); + + // 验证取消注册后,计数没有增加 + Assert.That(count, Is.EqualTo(1), "Handler should not be called after unregistration"); + + void Handler(EmptyEvent _) + { + count++; + } + } } \ No newline at end of file diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index 9330462..32f7156 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -18,7 +18,6 @@ namespace GFramework.Core.architecture; /// /// 架构基类,提供系统、模型、工具等组件的注册与管理功能。 /// 专注于生命周期管理、初始化流程控制和架构阶段转换。 -/// 不直接提供业务操作方法,业务操作通过 ArchitectureRuntime 提供。 /// public abstract class Architecture( IArchitectureConfiguration? configuration = null,