using GFramework.Core.Abstractions.Architectures;
using GFramework.Core.Abstractions.Command;
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.Systems;
using GFramework.Core.Abstractions.Utility;
using GFramework.Core.Architectures;
using GFramework.Core.Command;
using GFramework.Core.Environment;
using GFramework.Core.Events;
using GFramework.Core.Ioc;
using GFramework.Core.Query;
using Mediator;
using ICommand = GFramework.Core.Abstractions.Command.ICommand;
namespace GFramework.Core.Tests.Architectures;
///
/// 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;
private void RegisterBuiltInServices()
{
_services!.ModuleManager.RegisterBuiltInModules(_services.Container);
}
///
/// 测试构造函数初始化容器
///
[Test]
public void Constructor_Should_Initialize_Container()
{
Assert.That(_services!.Container, 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可用
///
[Test]
public void After_RegisterBuiltInModules_EventBus_Should_Be_Available()
{
RegisterBuiltInServices();
Assert.That(_services!.EventBus, Is.InstanceOf());
Assert.That(_services.EventBus, Is.InstanceOf());
}
///
/// 测试注册内置服务后CommandExecutor可用
///
[Test]
public void After_RegisterBuiltInModules_CommandExecutor_Should_Be_Available()
{
RegisterBuiltInServices();
Assert.That(_services!.CommandExecutor, Is.InstanceOf());
Assert.That(_services.CommandExecutor, Is.InstanceOf());
}
///
/// 测试注册内置服务后QueryExecutor可用
///
[Test]
public void After_RegisterBuiltInModules_QueryExecutor_Should_Be_Available()
{
RegisterBuiltInServices();
Assert.That(_services!.QueryExecutor, Is.InstanceOf());
Assert.That(_services.QueryExecutor, Is.InstanceOf());
}
///
/// 测试注册内置服务后AsyncQueryExecutor可用
///
[Test]
public void After_RegisterBuiltInModules_AsyncQueryExecutor_Should_Be_Available()
{
RegisterBuiltInServices();
Assert.That(_services!.AsyncQueryExecutor, Is.InstanceOf());
Assert.That(_services.AsyncQueryExecutor, Is.InstanceOf());
}
///
/// 测试未注册服务时EventBus为null
///
[Test]
public void Without_RegisterBuiltInModules_EventBus_Should_Be_Null()
{
Assert.That(_services!.EventBus, Is.Null);
}
///
/// 测试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();
services1.ModuleManager.RegisterBuiltInModules(services1.Container);
var services2 = new ArchitectureServices();
services2.ModuleManager.RegisterBuiltInModules(services2.Container);
Assert.That(services1.EventBus, Is.Not.SameAs(services2.EventBus));
}
///
/// 测试多个实例有独立的CommandBus
///
[Test]
public void Multiple_Instances_Should_Have_Independent_CommandBus()
{
var services1 = new ArchitectureServices();
services1.ModuleManager.RegisterBuiltInModules(services1.Container);
var services2 = new ArchitectureServices();
services2.ModuleManager.RegisterBuiltInModules(services2.Container);
Assert.That(services1.CommandExecutor, Is.Not.SameAs(services2.CommandExecutor));
}
///
/// 测试多个实例有独立的QueryBus
///
[Test]
public void Multiple_Instances_Should_Have_Independent_QueryBus()
{
var services1 = new ArchitectureServices();
services1.ModuleManager.RegisterBuiltInModules(services1.Container);
var services2 = new ArchitectureServices();
services2.ModuleManager.RegisterBuiltInModules(services2.Container);
Assert.That(services1.QueryExecutor, Is.Not.SameAs(services2.QueryExecutor));
}
///
/// 测试ModuleManager属性不为空
///
[Test]
public void ModuleManager_Should_Not_Be_Null()
{
Assert.That(_services!.ModuleManager, Is.Not.Null);
}
}
#region Test Classes
public class TestArchitectureContextV3 : IArchitectureContext
{
private readonly MicrosoftDiContainer _container = new();
private readonly DefaultEnvironment _environment = new();
public int Id { get; init; }
public TService? GetService() where TService : class
{
return _container.Get();
}
public IReadOnlyList GetServices() where TService : class
{
return _container.GetAll();
}
public TModel? GetModel() where TModel : class, IModel
{
return _container.Get();
}
public IReadOnlyList GetModels() where TModel : class, IModel
{
return _container.GetAll();
}
public TSystem? GetSystem() where TSystem : class, ISystem
{
return _container.Get();
}
public IReadOnlyList GetSystems() where TSystem : class, ISystem
{
return _container.GetAll();
}
public TUtility? GetUtility() where TUtility : class, IUtility
{
return _container.Get();
}
public IReadOnlyList GetUtilities() where TUtility : class, IUtility
{
return _container.GetAll();
}
public IReadOnlyList GetServicesByPriority() where TService : class
{
return _container.GetAllByPriority();
}
public IReadOnlyList GetSystemsByPriority() where TSystem : class, ISystem
{
return _container.GetAllByPriority();
}
public IReadOnlyList GetModelsByPriority() where TModel : class, IModel
{
return _container.GetAllByPriority();
}
public IReadOnlyList GetUtilitiesByPriority() where TUtility : class, IUtility
{
return _container.GetAllByPriority();
}
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(global::Mediator.ICommand command,
CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
public TResponse SendCommand(global::Mediator.ICommand command)
{
throw new NotImplementedException();
}
public ValueTask SendQueryAsync(global::Mediator.IQuery query,
CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
public TResponse SendQuery(global::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;
}
}
#endregion