public void InitCtx() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/test.dmn"); ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse(file)); }
public static void InitCtx(TestContext testContext) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/sfeel.dmn"); ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); }
public static void InitCtx(TestContext testContext) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/parallel.dmn"); def = DmnDefinitionFactory.CreateDmnDefinition(DmnParser.Parse13(file)); }
public void WrongHitPolicyAggregationTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_WrongAggregation.dmn"); Action act = () => DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); act.Should().Throw <DmnParserException>().WithMessage("Wrong hit policy aggregation *"); }
public void ParseTypesErrTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/datatypes_err.dmn"); Action act = () => DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); act.Should().Throw <DmnParserException>().WithMessage("Unsupported type name datetime"); }
public void ParseFileHappyTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/test.dmn"); var def = DmnParser.Parse13(file); def.Should().NotBeNull(); }
public void ParseWrongFileTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "nlog.config"); Action act = () => DmnParser.Parse13(file); act.Should().Throw <DmnParserException>().WithMessage("Can't parse file *"); }
//[TestMethod] - uncomment to see the StackOverflowException with circular dependency in model public void CircularReferenceTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/circular_err.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", 0); ctx.ExecuteDecision("Second"); }
public void ParseWrongStringTest() { var def = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; def += "<definitions xmlns = \"http://www.omg.org/spec/DMN/20151101/dmn.xsd\" >"; def += "</efinitions>"; Action act = () => DmnParser.ParseString(def); act.Should().Throw <DmnParserException>().WithMessage("Can't parse definition from given string*"); }
public void ParseStringMethodHappyTest() { var def = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; def += "<definitions xmlns = \"http://www.omg.org/spec/DMN/20151101/dmn.xsd\" >"; def += "</definitions>"; var parsedDef = DmnParser.ParseString(def); parsedDef.Should().NotBeNull(); }
[DataRow(9, 9, null, 0, 0)] //no hit public void UniqueHitPolicyTest(int?a, int?b, string c, int hitsCount, int outVariableCount) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_Unique.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); DmnDecisionResult result = null; Action act = () => { result = ctx.ExecuteDecision("Unique"); }; if (hitsCount < 0) { act.Should().Throw <DmnExecutorException>().WithMessage("UNIQUE hit policy violation*"); return; } act.Invoke(); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (hitsCount <= 0) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(hitsCount); result.HasResult.Should().Be(true); if (hitsCount == 1) { result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); result.SingleResult.Should().HaveCount(outVariableCount); } if (outVariableCount <= 0) { return; } var output = result.SingleResult[0]; output.Should().NotBeNull(); output.Name.Should().Be("o"); output.Value.Should().Be(c).And.BeOfType <string>(); output.Type.Should().Be(typeof(string)); }
public void CollectCountBoolHitPolicyTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_Collect_CountBool.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", 2); ctx.WithInputParameter("b", 1); Action act = () => { ctx.ExecuteDecision("Collect"); }; act.Should().Throw <DmnExecutorException>().WithMessage("COLLECT hit policy violation - type Boolean not allowed for aggregation Count"); }
public void OutputOrder_NoOutWithAllowedHitPolicyTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_OutputOrder_NoOutWithAllowed.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", 2); ctx.WithInputParameter("b", 1); Action act = () => { ctx.ExecuteDecision("OutputOrder"); }; act.Should().Throw <DmnExecutorException>().WithMessage("OUTPUT ORDER hit policy violation - no outputs with Allowed Values"); }
[DataRow(8, 8, null, 0, new[] { 0 })] //no hit public void OutputOrderHitPolicyTest(int?a, int?b, string[] c, int hitsCount, int[] outVariableCount) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_OutputOrder.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); DmnDecisionResult result = null; Action act = () => { result = ctx.ExecuteDecision("OutputOrder"); }; act.Invoke(); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (hitsCount <= 0) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(hitsCount); result.HasResult.Should().Be(true); if (hitsCount == 1) { result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); result.SingleResult.Should().HaveCount(outVariableCount[0]); } for (var i = 0; i < hitsCount; i++) { if (outVariableCount[i] <= 0) { result.Results[i].Variables.Should().HaveCount(0); continue; } result.Results[i].Variables.Should().HaveCount(1); var output = result.Results[i].Variables[0]; output.Should().NotBeNull(); output.Name.Should().Be("o"); output.Value.Should().Be(c[i]).And.BeOfType <string>(); output.Type.Should().Be(typeof(string)); } }
// ReSharper disable once InconsistentNaming protected static DmnModel MODEL(string dmnFile, SourceEnum source) { var file = FILE(dmnFile, source); if (source == SourceEnum.File) { return(DmnParser.Parse(file)); } if (source == SourceEnum.File13) { return(DmnParser.Parse13(file)); } throw new NotImplementedException(); }
public void ParseTypesTest() { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/datatypes.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.Should().NotBeNull(); ctx.Variables["string"].Type.Should().Be(typeof(string)); ctx.Variables["int"].Type.Should().Be(typeof(int)); ctx.Variables["bool"].Type.Should().Be(typeof(bool)); ctx.Variables["long"].Type.Should().Be(typeof(long)); ctx.Variables["double"].Type.Should().Be(typeof(double)); ctx.Variables["date"].Type.Should().Be(typeof(DateTime)); }
[DataRow(8, 8, false, 0)] //no hit public void CollectMaxBoolHitPolicyTest(int?a, int?b, bool?c, int hitsCount) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_Collect_MaxBool.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); DmnDecisionResult result = null; Action act = () => { result = ctx.ExecuteDecision("Collect"); }; act.Invoke(); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (hitsCount <= 0) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(hitsCount); result.HasResult.Should().Be(true); result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); result.SingleResult.Should().HaveCount(1); result.Results[0].Variables.Should().HaveCount(1); var output = result.Results[0].Variables[0]; output.Should().NotBeNull(); output.Name.Should().Be("o"); if (c != null) { output.Value.Should().Be(c).And.BeOfType <bool>(); output.Type.Should().Be(typeof(bool)); } else { output.Value.Should().BeNull(); output.Type.Should().Be(typeof(bool)); } }
public void NoInformationRequirementsSubElementsTest() { var def = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; def += "<definitions xmlns = \"https://www.omg.org/spec/DMN/20191111/MODEL/\" > "; def += "<decision id = \"test\" name=\"Test\">"; def += "<informationRequirement>"; def += "</informationRequirement>"; def += "</decision>"; def += "</definitions>"; Action act = () => DmnExecutionContextFactory.CreateExecutionContext(DmnParser.ParseString13(def)); act.Should().Throw <DmnParserException>().WithMessage( "informationRequirement element doesn't contain requiredDecision nor requiredInput elements or contains both"); }
public void MissingHashInInformationRequirementReferenceTest(string hrefAttr) { var def = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; def += "<definitions xmlns = \"http://www.omg.org/spec/DMN/20151101/dmn.xsd\" >"; def += "<decision id = \"test\" name=\"Test\">"; def += "<informationRequirement>"; def += $"<requiredInput {hrefAttr} />"; def += "</informationRequirement>"; def += "</decision>"; def += "</definitions>"; Action act = () => DmnExecutionContextFactory.CreateExecutionContext(DmnParser.ParseString(def)); act.Should().Throw <DmnParserException>().WithMessage( "Can't parse InformationRequirement - reference doesn't start with #"); }
public void TooShortInformationRequirementReferenceTest(string hrefAttr) { var def = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; def += "<definitions xmlns = \"https://www.omg.org/spec/DMN/20191111/MODEL/\" >"; def += "<decision id = \"test\" name=\"Test\">"; def += "<informationRequirement>"; def += $"<requiredInput {hrefAttr} />"; def += "</informationRequirement>"; def += "</decision>"; def += "</definitions>"; Action act = () => DmnExecutionContextFactory.CreateExecutionContext(DmnParser.ParseString13(def)); act.Should().Throw <DmnParserException>().WithMessage( "Can't parse InformationRequirement - reference too short/missing"); }
public void FirstHitPolicyTest(int?a, int?b, string c, int hitsCount, int outVariableCount) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_First.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); var result = ctx.ExecuteDecision("First"); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (hitsCount <= 0) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(hitsCount); result.HasResult.Should().Be(true); if (hitsCount == 1) { result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); result.SingleResult.Should().HaveCount(outVariableCount); } if (outVariableCount <= 0) { return; } var output = result.SingleResult[0]; output.Should().NotBeNull(); output.Name.Should().Be("o"); output.Value.Should().Be(c).And.BeOfType <string>(); output.Type.Should().Be(typeof(string)); }
public void AllowedValuesTest(string a, string b, string c, bool validIn, bool validOut) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/allowedValues.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse(file, DmnParser.DmnVersionEnum.V1_3)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); DmnDecisionResult result = null; Action act = () => { result = ctx.ExecuteDecision("Test"); }; if (!validIn && validOut) { act.Should().Throw <DmnExecutorException>().WithMessage("Decision table Test,* Input value * is not in allowed values list *"); return; } if (!validOut) { act.Should().Throw <DmnExecutorException>().WithMessage("Decision table Test,* Output value * is not in allowed values list *"); return; } act.Invoke(); result.Should().NotBeNull(); result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); result.SingleResult.Should().HaveCount(1); var output = result.SingleResult[0]; output.Should().NotBeNull(); output.Name.Should().Be("c"); output.Value.Should().Be(c).And.BeOfType <string>(); output.Type.Should().Be(typeof(string)); }
public void ParseFileNotExistTest() { Action act = () => DmnParser.Parse13("dsadas"); act.Should().Throw <DmnParserException>().WithMessage("File * doesn't exist"); }
public void ParseNullOrEmptyFileTest(string file) { Action act = () => DmnParser.Parse13(file); act.Should().Throw <DmnParserException>().WithMessage("filePath is null or empty"); }
[DataRow(8, 8, new int[] { }, 0, new[] { 0 })] //no hit public void CollectListHitPolicyTest(int?a, int?b, int[] cIn, int hitsCount, int[] outVariableCount) { var c = new int?[cIn.Length]; for (var i = 0; i < cIn.Length; i++) { if (cIn[i] >= 0) { c[i] = cIn[i]; } else { c[i] = null; } } var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/hitpolicy_Collect_List.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); DmnDecisionResult result = null; Action act = () => { result = ctx.ExecuteDecision("Collect"); }; act.Invoke(); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (hitsCount <= 0) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(hitsCount); result.HasResult.Should().Be(true); if (hitsCount == 1) { result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); result.SingleResult.Should().HaveCount(outVariableCount[0]); } for (var i = 0; i < hitsCount; i++) { if (outVariableCount[i] <= 0) { result.Results[i].Variables.Should().HaveCount(0); continue; } result.Results[i].Variables.Should().HaveCount(1); var output = result.Results[i].Variables[0]; output.Should().NotBeNull(); output.Name.Should().Be("o"); output.Value.Should().Be(c[i]).And.BeOfType <long>(); output.Type.Should().Be(typeof(long)); } }
public void ParseNullOrEmptyDefStringTest(string xmlStr) { Action act = () => DmnParser.ParseString(xmlStr); act.Should().Throw <DmnParserException>().WithMessage("Missing Dmn Model definition"); }
[DataRow(null, null, new[] { "" }, new[] { -1 }, new[] { "" }, false)] //null -> 0 public void RuleOrderHitPolicyMultiOutTest(int?a, int?b, string[] o1, int[] o2, string[] o3, bool hasHit) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_MultiOut_RuleOrder.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); DmnDecisionResult result = null; Action act = () => { result = ctx.ExecuteDecision("RuleOrder"); }; act.Invoke(); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (!hasHit) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } var hitsCount = o1.Length; result.Results.Should().HaveCount(hitsCount); result.HasResult.Should().Be(true); if (hitsCount == 1) { result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); } result.Results.Should().HaveCount(hitsCount); var idx = 0; foreach (var resultHit in result.Results) { var o1Result = resultHit.Variables?.FirstOrDefault(v => v.Name == "o1"); var o2Result = resultHit.Variables?.FirstOrDefault(v => v.Name == "o2"); var o3Result = resultHit.Variables?.FirstOrDefault(v => v.Name == "o3"); var o1Asserrt = o1[idx]; var o2Asserrt = o2[idx]; var o3Asserrt = o3[idx]; if (o1Result == null) { o1Asserrt.Should().BeNull(); } else { o1Result.Should().NotBeNull(); o1Result.Value.Should().NotBeNull(); o1Result.Value.Should().Be(o1Asserrt).And.BeOfType <string>(); o1Result.Type.Should().Be(typeof(string)); } if (o2Result == null) { o2Asserrt.Should().Be(-1); //-1 means null } else { o2Result.Should().NotBeNull(); o2Result.Value.Should().NotBeNull(); o2Result.Value.Should().Be(o2Asserrt).And.BeOfType <int>(); o2Result.Type.Should().Be(typeof(int)); } if (o3Result == null) { o3Asserrt.Should().BeNull(); } else { o3Result.Should().NotBeNull(); o3Result.Value.Should().NotBeNull(); o3Result.Value.Should().Be(o3Asserrt).And.BeOfType <string>(); o3Result.Type.Should().Be(typeof(string)); } idx++; } }
public void AnyHitPolicyMultiOutTest(int?a, int?b, string o1, int?o2, bool hasHit, bool isErr) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_MultiOut_Any.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); DmnDecisionResult result = null; Action act = () => { result = ctx.ExecuteDecision("Any"); }; if (isErr) { act.Should().Throw <DmnExecutorException>().WithMessage("ANY hit policy violation - the outputs don't match"); return; } act.Invoke(); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (!hasHit) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(1); result.HasResult.Should().Be(true); result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); var outCount = 2; var o1Index = 0; var o2Index = 1; if (o1 == null) { outCount--; o1Index = -1; o2Index--; } if (o2 == null) { outCount--; o2Index = -1; } result.SingleResult.Should().HaveCount(outCount); if (o1Index >= 0) { var output1 = result.SingleResult[o1Index]; output1.Should().NotBeNull(); output1.Name.Should().Be("o1"); output1.Value.Should().Be(o1).And.BeOfType <string>(); output1.Type.Should().Be(typeof(string)); } // ReSharper disable once InvertIf if (o2Index >= 0) { var output2 = result.SingleResult[o2Index]; output2.Should().NotBeNull(); output2.Name.Should().Be("o2"); output2.Value.Should().Be(o2).And.BeOfType <int>(); output2.Type.Should().Be(typeof(int)); } }
public void UniqueHitPolicyMultiOutTest(int?a, int?b, string o1, int?o2, bool hasHit) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_MultiOut_Unique.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); var result = ctx.ExecuteDecision("Unique"); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (!hasHit) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(1); result.HasResult.Should().Be(true); result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); var outCount = 0; if (o1 != null) { outCount++; } if (o2 != null) { outCount++; } result.SingleResult.Should().HaveCount(outCount); if (o1 != null) { var output1 = result.SingleResult[0]; output1.Should().NotBeNull(); output1.Name.Should().Be("o1"); output1.Value.Should().Be(o1).And.BeOfType <string>(); output1.Type.Should().Be(typeof(string)); if (o2 == null) { return; } var output2 = result.SingleResult[1]; output2.Should().NotBeNull(); output2.Name.Should().Be("o2"); output2.Value.Should().Be(o2).And.BeOfType <int>(); output2.Type.Should().Be(typeof(int)); } else { if (o2 == null) { return; } var output2 = result.SingleResult[0]; output2.Should().NotBeNull(); output2.Name.Should().Be("o2"); output2.Value.Should().Be(o2).And.BeOfType <int>(); output2.Type.Should().Be(typeof(int)); } }
[DataRow(null, null, null, null, null, false)] //null -> 0 public void PriorityHitPolicyMultiOutTest(int?a, int?b, string o1, int?o2, string o3, bool hasHit) { var dir = AppDomain.CurrentDomain.BaseDirectory; var file = Path.Combine(dir, "dmn/dmn1.3/hitpolicy_MultiOut_Priority.dmn"); var ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse13(file)); ctx.WithInputParameter("a", a); ctx.WithInputParameter("b", b); var result = ctx.ExecuteDecision("Priority"); result.Should().NotBeNull(); result.Results.Should().NotBeNull(); if (!hasHit) { result.Results.Should().HaveCount(0); result.HasResult.Should().Be(false); result.IsSingleResult.Should().Be(false); return; } result.Results.Should().HaveCount(1); result.HasResult.Should().Be(true); result.IsSingleResult.Should().Be(true); result.SingleResult.Should().NotBeNull(); var outCount = 3; var o1Index = 0; var o2Index = 1; var o3Index = 2; if (o1 == null) { outCount--; o1Index = -1; o2Index--; o3Index--; } if (o2 == null) { outCount--; o2Index = -1; o3Index--; } if (o3 == null) { o3Index = -1; outCount--; } result.SingleResult.Should().HaveCount(outCount); if (o1Index >= 0) { var output1 = result.SingleResult[o1Index]; output1.Should().NotBeNull(); output1.Name.Should().Be("o1"); output1.Value.Should().Be(o1).And.BeOfType <string>(); output1.Type.Should().Be(typeof(string)); } if (o2Index >= 0) { var output2 = result.SingleResult[o2Index]; output2.Should().NotBeNull(); output2.Name.Should().Be("o2"); output2.Value.Should().Be(o2).And.BeOfType <int>(); output2.Type.Should().Be(typeof(int)); } // ReSharper disable once InvertIf if (o3Index >= 0) { var output3 = result.SingleResult[o3Index]; output3.Should().NotBeNull(); output3.Name.Should().Be("o3"); output3.Value.Should().Be(o3).And.BeOfType <string>(); output3.Type.Should().Be(typeof(string)); } }