using GFramework.Core.Abstractions.Logging;
using GFramework.Core.Abstractions.Rule;
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 GFramework.Core.Utility;
namespace GFramework.Core.Tests.Utility;
///
/// AbstractContextUtility类的单元测试
/// 测试内容包括:
/// - 抽象工具类实现
/// - IContextUtility接口实现
/// - Init方法调用
/// - 日志初始化
/// - 上下文感知功能(SetContext, GetContext)
/// - 子类继承行为
/// - 工具初始化日志记录
/// - 工具生命周期完整性
///
[TestFixture]
public class AbstractContextUtilityTests
{
[SetUp]
public void SetUp()
{
_container = new MicrosoftDiContainer();
_container.RegisterPlurality(new EventBus());
_container.RegisterPlurality(new CommandExecutor());
_container.RegisterPlurality(new QueryExecutor());
_container.RegisterPlurality(new DefaultEnvironment());
_container.RegisterPlurality(new AsyncQueryExecutor());
_context = new ArchitectureContext(_container);
}
private ArchitectureContext _context = null!;
private MicrosoftDiContainer _container = null!;
///
/// 测试AbstractContextUtility实现IContextUtility接口
///
[Test]
public void AbstractContextUtility_Should_Implement_IContextUtility_Interface()
{
var utility = new TestContextUtilityV1();
Assert.That(utility, Is.InstanceOf());
}
///
/// 测试Init方法调用
///
[Test]
public void Init_Should_Call_OnInit_Method()
{
var utility = new TestContextUtilityV1();
Assert.That(utility.Initialized, Is.False, "Utility should not be initialized before OnInitialize");
utility.Initialize();
Assert.That(utility.Initialized, Is.True, "Utility should be initialized after OnInitialize");
}
///
/// 测试Init方法设置Logger属性
///
[Test]
public void Init_Should_Set_Logger_Property()
{
var utility = new TestContextUtilityV1();
Assert.That(utility.GetLogger(), Is.Null, "Logger should be null before OnInitialize");
utility.Initialize();
Assert.That(utility.GetLogger(), Is.Not.Null, "Logger should be set after OnInitialize");
}
///
/// 测试Init方法记录初始化日志
///
[Test]
public void Init_Should_Log_Initialization()
{
var utility = new TestContextUtilityV1();
Assert.That(utility.InitCalled, Is.False, "InitCalled should be false before OnInitialize");
utility.Initialize();
Assert.That(utility.InitCalled, Is.True, "InitCalled should be true after OnInitialize");
}
///
/// 测试Destroy方法调用
///
[Test]
public void Destroy_Should_Call_OnDestroy_Method()
{
var utility = new TestContextUtilityV1();
utility.Initialize();
Assert.That(utility.Destroyed, Is.False, "Utility should not be destroyed before Destroy");
utility.Destroy();
Assert.That(utility.Destroyed, Is.True, "Utility should be destroyed after Destroy");
}
///
/// 测试上下文感知功能 - SetContext方法
///
[Test]
public void SetContext_Should_Set_Context_Property()
{
var utility = new TestContextUtilityV1();
var contextAware = (IContextAware)utility;
contextAware.SetContext(_context);
var context = contextAware.GetContext();
Assert.That(context, Is.SameAs(_context));
}
///
/// 测试上下文感知功能 - GetContext方法
///
[Test]
public void GetContext_Should_Return_Context_Property()
{
var utility = new TestContextUtilityV1();
var contextAware = (IContextAware)utility;
contextAware.SetContext(_context);
var context = contextAware.GetContext();
Assert.That(context, Is.Not.Null);
Assert.That(context, Is.SameAs(_context));
}
///
/// 测试子类继承行为
///
[Test]
public void Child_Class_Should_Override_OnInit_Method()
{
var utility = new TestContextUtilityV2();
Assert.That(utility.Initialized, Is.False);
Assert.That(utility.CustomInitializationDone, Is.False);
utility.Initialize();
Assert.That(utility.Initialized, Is.True);
Assert.That(utility.CustomInitializationDone, Is.True);
}
///
/// 测试工具生命周期完整性
///
[Test]
public void ContextUtility_Should_Complete_Full_Lifecycle()
{
var utility = new TestContextUtilityV1();
// 初始状态
Assert.That(utility.Initialized, Is.False);
Assert.That(utility.Destroyed, Is.False);
// 初始化
utility.Initialize();
Assert.That(utility.Initialized, Is.True);
Assert.That(utility.Destroyed, Is.False);
// 销毁
utility.Destroy();
Assert.That(utility.Initialized, Is.True);
Assert.That(utility.Destroyed, Is.True);
}
///
/// 测试工具类可以多次初始化和销毁
///
[Test]
public void ContextUtility_Should_Be_Initializable_And_Destroyable_Multiple_Times()
{
var utility = new TestContextUtilityV1();
// 第一次初始化和销毁
utility.Initialize();
Assert.That(utility.Initialized, Is.True);
utility.Destroy();
Assert.That(utility.Destroyed, Is.True);
// 重置状态
utility.Destroyed = false;
// 第二次初始化和销毁
utility.Initialize();
Assert.That(utility.Initialized, Is.True);
utility.Destroy();
Assert.That(utility.Destroyed, Is.True);
}
}
///
/// 测试用上下文工具类V1
///
public sealed class TestContextUtilityV1 : AbstractContextUtility
{
///
/// 获取工具是否已初始化
///
public bool Initialized { get; private set; }
///
/// 获取工具是否已销毁
///
public bool Destroyed { get; set; }
///
/// 获取Init方法是否被调用
///
public bool InitCalled { get; private set; }
///
/// 获取Logger对象(用于测试)
///
public ILogger? GetLogger()
{
return Logger;
}
///
/// 初始化方法
///
protected override void OnInit()
{
Initialized = true;
InitCalled = true;
}
///
/// 销毁方法
///
protected override void OnDestroy()
{
Destroyed = true;
}
}
///
/// 测试用上下文工具类V2,自定义初始化逻辑
///
public sealed class TestContextUtilityV2 : AbstractContextUtility
{
///
/// 获取工具是否已初始化
///
public bool Initialized { get; private set; }
///
/// 获取工具是否已销毁
///
public bool Destroyed { get; set; }
///
/// 获取自定义初始化是否完成
///
public bool CustomInitializationDone { get; private set; }
///
/// 初始化方法(自定义逻辑)
///
protected override void OnInit()
{
Initialized = true;
CustomInitializationDone = true;
}
///
/// 销毁方法
///
protected override void OnDestroy()
{
Destroyed = true;
}
}