using GFramework.Core.Abstractions.architecture; using GFramework.Core.Abstractions.command; using GFramework.Core.Abstractions.ecs; using GFramework.Core.Abstractions.environment; using GFramework.Core.Abstractions.events; using GFramework.Core.Abstractions.ioc; using GFramework.Core.Abstractions.model; using GFramework.Core.Abstractions.query; using GFramework.Core.Abstractions.system; using GFramework.Core.Abstractions.utility; using GFramework.Core.architecture; using GFramework.Core.command; using GFramework.Core.environment; using GFramework.Core.events; using GFramework.Core.ioc; using GFramework.Core.query; using Mediator; using NUnit.Framework; using ICommand = GFramework.Core.Abstractions.command.ICommand; namespace GFramework.Core.Tests.architecture; /// /// ArchitectureServices类的单元测试 /// 测试内容包括: /// - 服务容器初始化 /// - 所有服务实例创建(Container, EventBus, CommandExecutor, QueryExecutor) /// - SetContext方法 - 设置上下文 /// - SetContext方法 - 重复设置上下文 /// - GetContext方法 - 获取已设置上下文 /// - GetContext方法 - 未设置上下文时返回null /// - 上下文传播到容器 /// - IArchitectureServices接口实现验证 /// - 服务独立性验证(多个实例) /// [TestFixture] public class ArchitectureServicesTests { [SetUp] public void SetUp() { _services = new ArchitectureServices(); _context = new TestArchitectureContextV3(); } private ArchitectureServices? _services; private TestArchitectureContextV3? _context; /// /// 测试构造函数初始化所有服务 /// [Test] public void Constructor_Should_Initialize_AllServices() { Assert.That(_services!.Container, Is.Not.Null); Assert.That(_services.EventBus, Is.Not.Null); Assert.That(_services.CommandExecutor, Is.Not.Null); Assert.That(_services.QueryExecutor, Is.Not.Null); } [Test] public void Container_Should_Be_Instance_Of_IocContainer() { Assert.That(_services!.Container, Is.InstanceOf()); Assert.That(_services.Container, Is.InstanceOf()); } /// /// 测试EventBus是EventBus的实例 /// [Test] public void EventBus_Should_Be_Instance_Of_EventBus() { Assert.That(_services!.EventBus, Is.InstanceOf()); Assert.That(_services.EventBus, Is.InstanceOf()); } /// /// 测试CommandBus是CommandBus的实例 /// [Test] public void CommandBus_Should_Be_Instance_Of_CommandBus() { Assert.That(_services!.CommandExecutor, Is.InstanceOf()); Assert.That(_services.CommandExecutor, Is.InstanceOf()); } /// /// 测试QueryBus是QueryBus的实例 /// [Test] public void QueryBus_Should_Be_Instance_Of_QueryBus() { Assert.That(_services!.QueryExecutor, Is.InstanceOf()); Assert.That(_services.QueryExecutor, Is.InstanceOf()); } /// /// 测试SetContext设置内部Context字段 /// [Test] public void SetContext_Should_Set_Context_Internal_Field() { _services!.SetContext(_context!); var context = _services.GetContext(); Assert.That(context, Is.SameAs(_context)); } /// /// 测试SetContext将上下文传播到Container /// [Test] public void SetContext_Should_Propagate_Context_To_Container() { _services!.SetContext(_context!); var containerContext = _services.Container.GetContext(); Assert.That(containerContext, Is.SameAs(_context)); } /// /// 测试GetContext在SetContext后返回上下文 /// [Test] public void GetContext_Should_Return_Context_After_SetContext() { _services!.SetContext(_context!); var context = _services.GetContext(); Assert.That(context, Is.Not.Null); Assert.That(context, Is.SameAs(_context)); } /// /// 测试GetContext在未设置上下文时返回null /// [Test] public void GetContext_Should_ReturnNull_When_Context_Not_Set() { var context = _services!.GetContext(); Assert.That(context, Is.Null); } /// /// 测试SetContext替换已存在的上下文 /// [Test] public void SetContext_Should_Replace_Existing_Context() { var context1 = new TestArchitectureContextV3 { Id = 1 }; var context2 = new TestArchitectureContextV3 { Id = 2 }; _services!.SetContext(context1); _services.SetContext(context2); var context = _services.GetContext(); Assert.That(context, Is.SameAs(context2)); } /// /// 测试ArchitectureServices实现IArchitectureServices接口 /// [Test] public void ArchitectureServices_Should_Implement_IArchitectureServices_Interface() { Assert.That(_services, Is.InstanceOf()); } /// /// 测试多个实例有独立的Container /// [Test] public void Multiple_Instances_Should_Have_Independent_Container() { var services1 = new ArchitectureServices(); var services2 = new ArchitectureServices(); Assert.That(services1.Container, Is.Not.SameAs(services2.Container)); } /// /// 测试多个实例有独立的EventBus /// [Test] public void Multiple_Instances_Should_Have_Independent_EventBus() { var services1 = new ArchitectureServices(); var services2 = new ArchitectureServices(); Assert.That(services1.EventBus, Is.Not.SameAs(services2.EventBus)); } /// /// 测试多个实例有独立的CommandBus /// [Test] public void Multiple_Instances_Should_Have_Independent_CommandBus() { var services1 = new ArchitectureServices(); var services2 = new ArchitectureServices(); Assert.That(services1.CommandExecutor, Is.Not.SameAs(services2.CommandExecutor)); } /// /// 测试多个实例有独立的QueryBus /// [Test] public void Multiple_Instances_Should_Have_Independent_QueryBus() { var services1 = new ArchitectureServices(); var services2 = new ArchitectureServices(); Assert.That(services1.QueryExecutor, Is.Not.SameAs(services2.QueryExecutor)); } } #region Test Classes public class TestArchitectureContextV3 : IArchitectureContext { private readonly MicrosoftDiContainer _container = new(); private readonly DefaultEnvironment _environment = new(); public int Id { get; init; } public IIocContainer Container => _container; public IEventBus EventBus => new EventBus(); public ICommandExecutor CommandExecutor => new CommandExecutor(); public IQueryExecutor QueryExecutor => new QueryExecutor(); public TService? GetService() where TService : class { return _container.Get(); } public TModel? GetModel() where TModel : class, IModel { return _container.Get(); } public TSystem? GetSystem() where TSystem : class, ISystem { return _container.Get(); } public TUtility? GetUtility() where TUtility : class, IUtility { return _container.Get(); } public void SendEvent() where TEvent : new() { } public void SendEvent(TEvent e) where TEvent : class { } public IUnRegister RegisterEvent(Action handler) { return new DefaultUnRegister(() => { }); } public void UnRegisterEvent(Action onEvent) { } public ValueTask SendRequestAsync(IRequest request, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } public TResponse SendRequest(IRequest request) { throw new NotImplementedException(); } public ValueTask SendCommandAsync(Mediator.ICommand command, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } public TResponse SendCommand(Mediator.ICommand command) { throw new NotImplementedException(); } public ValueTask SendQueryAsync(Mediator.IQuery query, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } public TResponse SendQuery(Mediator.IQuery query) { throw new NotImplementedException(); } public ValueTask PublishAsync(TNotification notification, CancellationToken cancellationToken = default) where TNotification : INotification { throw new NotImplementedException(); } public IAsyncEnumerable CreateStream(IStreamRequest request, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } public ValueTask SendAsync(TCommand command, CancellationToken cancellationToken = default) where TCommand : IRequest { throw new NotImplementedException(); } public ValueTask SendAsync(IRequest command, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } public void SendCommand(ICommand command) { } public TResult SendCommand(Abstractions.command.ICommand command) { return default!; } public Task SendCommandAsync(IAsyncCommand command) { return Task.CompletedTask; } public Task SendCommandAsync(IAsyncCommand command) { return (Task)Task.CompletedTask; } public TResult SendQuery(Abstractions.query.IQuery query) { return default!; } public Task SendQueryAsync(IAsyncQuery query) { return (Task)Task.CompletedTask; } public IEnvironment GetEnvironment() { return _environment; } public IEcsWorld GetEcsWorld() { throw new NotImplementedException("ECS not implemented in test context"); } public void RegisterEcsSystem() where T : class, IEcsSystem { throw new NotImplementedException("ECS not implemented in test context"); } } #endregion