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