public void InitCtx()
        {
            var dir  = AppDomain.CurrentDomain.BaseDirectory;
            var file = Path.Combine(dir, "dmn/test.dmn");

            ctx = DmnExecutionContextFactory.CreateExecutionContext(DmnParser.Parse(file));
        }
Esempio n. 2
0
        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");
        }
Esempio n. 9
0
        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*");
        }
Esempio n. 10
0
        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));
            }
        }
Esempio n. 15
0
        // 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));
            }
        }
Esempio n. 18
0
        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 #");
        }
Esempio n. 20
0
        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");
        }
Esempio n. 25
0
        [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));
            }
        }
Esempio n. 26
0
        public void ParseNullOrEmptyDefStringTest(string xmlStr)
        {
            Action act = () => DmnParser.ParseString(xmlStr);

            act.Should().Throw <DmnParserException>().WithMessage("Missing Dmn Model definition");
        }
Esempio n. 27
0
        [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++;
            }
        }
Esempio n. 28
0
        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));
            }
        }
Esempio n. 29
0
        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));
            }
        }
Esempio n. 30
0
        [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));
            }
        }