diff --git a/GFramework.Core.Tests/Rule/ContextAwareServiceExtensionsTests.cs b/GFramework.Core.Tests/Rule/ContextAwareServiceExtensionsTests.cs index 0a95d13..b0f066f 100644 --- a/GFramework.Core.Tests/Rule/ContextAwareServiceExtensionsTests.cs +++ b/GFramework.Core.Tests/Rule/ContextAwareServiceExtensionsTests.cs @@ -5,9 +5,9 @@ using GFramework.Core.Abstractions.Rule; using GFramework.Core.Abstractions.Systems; using GFramework.Core.Abstractions.Utility; using GFramework.Core.Architectures; -using GFramework.Core.Extensions; using GFramework.Core.Ioc; using GFramework.Core.Rule; +using GFramework.Core.Tests.Architectures; namespace GFramework.Core.Tests.Rule; @@ -18,6 +18,11 @@ namespace GFramework.Core.Tests.Rule; [TestFixture] public class ContextAwareServiceExtensionsTests { + private MicrosoftDiContainer _container = null!; + private ArchitectureContext _context = null!; + + private TestContextAware _contextAware = null!; + [SetUp] public void SetUp() { @@ -34,10 +39,6 @@ public class ContextAwareServiceExtensionsTests _container.Clear(); } - private TestContextAware _contextAware = null!; - private ArchitectureContext _context = null!; - private MicrosoftDiContainer _container = null!; - [Test] public void GetService_Should_Return_Registered_Service() { @@ -53,6 +54,18 @@ public class ContextAwareServiceExtensionsTests Assert.That(result, Is.SameAs(service)); } + [Test] + public void GetService_Should_Throw_When_Context_Returns_Null_Service() + { + // Arrange + var contextAware = new TestContextAware(); + ((IContextAware)contextAware).SetContext(new TestArchitectureContextV3()); + + // Act / Assert + Assert.That(() => contextAware.GetService(), + Throws.InvalidOperationException.With.Message.Contains("Service")); + } + [Test] public void GetSystem_Should_Return_Registered_System() { @@ -68,6 +81,18 @@ public class ContextAwareServiceExtensionsTests Assert.That(result, Is.SameAs(system)); } + [Test] + public void GetSystem_Should_Throw_When_Context_Returns_Null_System() + { + // Arrange + var contextAware = new TestContextAware(); + ((IContextAware)contextAware).SetContext(new TestArchitectureContextV3()); + + // Act / Assert + Assert.That(() => contextAware.GetSystem(), + Throws.InvalidOperationException.With.Message.Contains("System")); + } + [Test] public void GetModel_Should_Return_Registered_Model() { @@ -83,6 +108,18 @@ public class ContextAwareServiceExtensionsTests Assert.That(result, Is.SameAs(model)); } + [Test] + public void GetModel_Should_Throw_When_Context_Returns_Null_Model() + { + // Arrange + var contextAware = new TestContextAware(); + ((IContextAware)contextAware).SetContext(new TestArchitectureContextV3()); + + // Act / Assert + Assert.That(() => contextAware.GetModel(), + Throws.InvalidOperationException.With.Message.Contains("Model")); + } + [Test] public void GetUtility_Should_Return_Registered_Utility() { @@ -98,6 +135,18 @@ public class ContextAwareServiceExtensionsTests Assert.That(result, Is.SameAs(utility)); } + [Test] + public void GetUtility_Should_Throw_When_Context_Returns_Null_Utility() + { + // Arrange + var contextAware = new TestContextAware(); + ((IContextAware)contextAware).SetContext(new TestArchitectureContextV3()); + + // Act / Assert + Assert.That(() => contextAware.GetUtility(), + Throws.InvalidOperationException.With.Message.Contains("Utility")); + } + [Test] public void GetServices_Should_Return_All_Registered_Services() { diff --git a/GFramework.Core/Extensions/ContextAwareServiceExtensions.cs b/GFramework.Core/Extensions/ContextAwareServiceExtensions.cs index 27e16e7..cb82199 100644 --- a/GFramework.Core/Extensions/ContextAwareServiceExtensions.cs +++ b/GFramework.Core/Extensions/ContextAwareServiceExtensions.cs @@ -1,3 +1,4 @@ +using GFramework.Core.Abstractions.Architectures; using GFramework.Core.Abstractions.Model; using GFramework.Core.Abstractions.Rule; using GFramework.Core.Abstractions.Systems; @@ -25,7 +26,8 @@ public static class ContextAwareServiceExtensions { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); - return context.GetService(); + return GetRequiredComponent(context, static architectureContext => architectureContext.GetService(), + "Service"); } /// @@ -39,7 +41,8 @@ public static class ContextAwareServiceExtensions { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); - return context.GetSystem(); + return GetRequiredComponent(context, static architectureContext => architectureContext.GetSystem(), + "System"); } /// @@ -53,7 +56,8 @@ public static class ContextAwareServiceExtensions { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); - return context.GetModel(); + return GetRequiredComponent(context, static architectureContext => architectureContext.GetModel(), + "Model"); } /// @@ -67,7 +71,8 @@ public static class ContextAwareServiceExtensions { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); - return context.GetUtility(); + return GetRequiredComponent(context, static architectureContext => architectureContext.GetUtility(), + "Utility"); } #endregion @@ -194,5 +199,15 @@ public static class ContextAwareServiceExtensions return context.GetUtilitiesByPriority(); } + private static TComponent GetRequiredComponent(IArchitectureContext context, + Func resolver, string componentKind) + where TComponent : class + { + ArgumentNullException.ThrowIfNull(context); + + var component = resolver(context); + return component ?? throw new InvalidOperationException($"{componentKind} {typeof(TComponent)} not registered"); + } + #endregion } \ No newline at end of file