using AutoFixture; using Moq; using RulesEngine.Actions; using RulesEngine.Models; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Xunit; namespace RulesEngine.UnitTest { [ExcludeFromCodeCoverage] public class ActionContextTests { [Fact] public void GetParentRuleResult_ReturnsParentRule() { // Arrange var fixture = new Fixture(); var contextInput = fixture.Create(); var context = new Dictionary { { nameof(contextInput), contextInput } }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); // Act var result = actionContext.GetParentRuleResult(); // Assert Assert.NotNull(result); Assert.Equal(parentRuleResult, result); } [Fact] public void GetContext_ValidName_ReturnsContext() { // Arrange var fixture = new Fixture(); var contextInput = fixture.Create(); var context = new Dictionary { { nameof(contextInput), contextInput } }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); string name = nameof(contextInput); // Act var result = actionContext.GetContext(name); // Assert Assert.Equal(contextInput, result); } [Fact] public void GetContext_ObjectContext_ReturnsTypedContext() { // Arrange var fixture = new Fixture(); var contextInput = fixture.CreateMany(); var context = new Dictionary { { nameof(contextInput), contextInput } }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); string name = nameof(contextInput); // Act var result = actionContext.GetContext>(name); // Assert Assert.Equal(contextInput, result); } [Fact] public void GetContext_ValidNameWithStringCaseDiffernce_ReturnsContext() { // Arrange var fixture = new Fixture(); var contextInput = fixture.Create(); var context = new Dictionary { { nameof(contextInput), contextInput } }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); string name = nameof(contextInput).ToUpper(); // Act var result = actionContext.GetContext(name); // Assert Assert.Equal(contextInput, result); } [Fact] public void GetContext_InvalidName_ThrowsArgumentException() { // Arrange var fixture = new Fixture(); var contextInput = fixture.Create(); var context = new Dictionary { { nameof(contextInput), contextInput } }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); string name = fixture.Create(); // Act Assert.Throws(() => actionContext.GetContext(name)); } [Fact] public void GetContext_PrimitiveInputs_ReturnsResult() { // Arrange var fixture = new Fixture(); var intInput = fixture.Create(); var strInput = fixture.Create(); var floatInput = fixture.Create(); var context = new Dictionary { { nameof(intInput), intInput }, { nameof(strInput), strInput }, { nameof(floatInput), floatInput }, }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); // Act var intResult = actionContext.GetContext(nameof(intInput)); var strResult = actionContext.GetContext(nameof(strInput)); var floatResult = actionContext.GetContext(nameof(floatInput)); // Assert Assert.Equal(intInput, intResult); Assert.Equal(strInput, strResult); Assert.Equal(floatInput, floatResult); } [Fact] public void GetContext_InvalidNameListContext_ThrowsArgumentException() { // Arrange var fixture = new Fixture(); var contextInput = fixture.CreateMany(); var context = new Dictionary { { nameof(contextInput), contextInput } }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); string name = fixture.Create(); // Act Assert.Throws(() => actionContext.GetContext>(name)); } [Fact] public void GetContext_InvalidTypeConversion_ThrowsArgumentException() { // Arrange var fixture = new Fixture(); var contextInput = fixture.CreateMany(); var context = new Dictionary { { nameof(contextInput), contextInput } }; var parentRuleResult = new RuleResultTree(); var actionContext = new ActionContext(context, parentRuleResult); string name = nameof(contextInput); // Act Assert.Throws(() => actionContext.GetContext(name)); } } }