using System.Reflection;
using GFramework.Core.Abstractions.Bases;
using GFramework.Core.Abstractions.Model;
using GFramework.Core.Abstractions.System;
using GFramework.Core.Abstractions.Utility;
using GFramework.Core.IoC;
using GFramework.Core.Logging;
using GFramework.Core.Model;
using GFramework.Core.System;
using NUnit.Framework;
namespace GFramework.Core.Tests.Architecture;
///
/// 优先级服务排序的集成测试
/// 测试完整的架构集成场景
///
[TestFixture]
public class PriorityServiceTests
{
[SetUp]
public void SetUp()
{
LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider();
_container = new MicrosoftDiContainer();
// 初始化 logger 字段
var loggerField = typeof(MicrosoftDiContainer).GetField("_logger",
BindingFlags.NonPublic | BindingFlags.Instance);
loggerField?.SetValue(_container,
LoggerFactoryResolver.Provider.CreateLogger(nameof(MicrosoftDiContainer)));
}
private MicrosoftDiContainer _container = null!;
///
/// 测试系统按优先级排序
///
[Test]
public void Systems_Should_Be_Sorted_By_Priority()
{
// Arrange
_container.Register(new PriorityTestSystemC());
_container.Register(new PriorityTestSystemA());
_container.Register(new PriorityTestSystemB());
_container.Freeze();
// Act
var systems = _container.GetAllByPriority();
// Assert
Assert.That(systems, Has.Count.EqualTo(3));
Assert.That(systems[0], Is.InstanceOf()); // Priority = 10
Assert.That(systems[1], Is.InstanceOf()); // Priority = 20
Assert.That(systems[2], Is.InstanceOf()); // Priority = 30
}
///
/// 测试模型按优先级排序
///
[Test]
public void Models_Should_Be_Sorted_By_Priority()
{
// Arrange
_container.Register(new PriorityTestModelC());
_container.Register(new PriorityTestModelA());
_container.Register(new PriorityTestModelB());
_container.Freeze();
// Act
var models = _container.GetAllByPriority();
// Assert
Assert.That(models, Has.Count.EqualTo(3));
Assert.That(models[0], Is.InstanceOf()); // Priority = 10
Assert.That(models[1], Is.InstanceOf()); // Priority = 20
Assert.That(models[2], Is.InstanceOf()); // Priority = 30
}
///
/// 测试工具按优先级排序
///
[Test]
public void Utilities_Should_Be_Sorted_By_Priority()
{
// Arrange
_container.Register(new PriorityTestUtilityC());
_container.Register(new PriorityTestUtilityA());
_container.Register(new PriorityTestUtilityB());
_container.Freeze();
// Act
var utilities = _container.GetAllByPriority();
// Assert
Assert.That(utilities, Has.Count.EqualTo(3));
Assert.That(utilities[0], Is.InstanceOf()); // Priority = 10
Assert.That(utilities[1], Is.InstanceOf()); // Priority = 20
Assert.That(utilities[2], Is.InstanceOf()); // Priority = 30
}
///
/// 测试混合优先级和非优先级服务
///
[Test]
public void Mixed_Prioritized_And_Non_Prioritized_Should_Work()
{
// Arrange
_container.Register(new MixedTestSystemWithPriority());
_container.Register(new MixedTestSystemWithoutPriority());
_container.Register(new MixedTestSystemNegativePriority());
_container.Freeze();
// Act
var systems = _container.GetAllByPriority();
// Assert
Assert.That(systems, Has.Count.EqualTo(3));
Assert.That(systems[0], Is.InstanceOf()); // -10
Assert.That(systems[1], Is.InstanceOf()); // 0 (默认)
Assert.That(systems[2], Is.InstanceOf()); // 10
}
}
#region Test Interfaces
public interface IPriorityTestSystem : ISystem
{
}
public interface IPriorityTestModel : IModel
{
}
public interface IPriorityTestUtility : IUtility
{
}
public interface IMixedTestSystem : ISystem
{
}
#endregion
#region Test Systems
public class PriorityTestSystemA : AbstractSystem, IPriorityTestSystem, IPrioritized
{
public int Priority => 10;
protected override void OnInit()
{
}
}
public class PriorityTestSystemB : AbstractSystem, IPriorityTestSystem, IPrioritized
{
public int Priority => 20;
protected override void OnInit()
{
}
}
public class PriorityTestSystemC : AbstractSystem, IPriorityTestSystem, IPrioritized
{
public int Priority => 30;
protected override void OnInit()
{
}
}
public class MixedTestSystemWithPriority : AbstractSystem, IMixedTestSystem, IPrioritized
{
public int Priority => 10;
protected override void OnInit()
{
}
}
public class MixedTestSystemWithoutPriority : AbstractSystem, IMixedTestSystem
{
protected override void OnInit()
{
}
}
public class MixedTestSystemNegativePriority : AbstractSystem, IMixedTestSystem, IPrioritized
{
public int Priority => -10;
protected override void OnInit()
{
}
}
#endregion
#region Test Models
public class PriorityTestModelA : AbstractModel, IPriorityTestModel, IPrioritized
{
public int Priority => 10;
protected override void OnInit()
{
}
}
public class PriorityTestModelB : AbstractModel, IPriorityTestModel, IPrioritized
{
public int Priority => 20;
protected override void OnInit()
{
}
}
public class PriorityTestModelC : AbstractModel, IPriorityTestModel, IPrioritized
{
public int Priority => 30;
protected override void OnInit()
{
}
}
#endregion
#region Test Utilities
public class PriorityTestUtilityA : IPriorityTestUtility, IPrioritized
{
public int Priority => 10;
}
public class PriorityTestUtilityB : IPriorityTestUtility, IPrioritized
{
public int Priority => 20;
}
public class PriorityTestUtilityC : IPriorityTestUtility, IPrioritized
{
public int Priority => 30;
}
#endregion