Exemple #1
0
        public void CanDetermineTableLookupValueFromQuestion()
        {
            var controller = new YamlScriptController();
            var result     = controller.Parse(YamlTestFileLoader.Load(@"TableTests.yaml"));

            Assert.False(result.IsError);
            var parameters = new ParametersCollection() as IParametersCollection;

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                Assert.True(args.Parameters[0].Name == "woonland");
                Assert.True(args.Parameters[0].Type == TypeInference.InferenceResult.TypeEnum.List);
                // This list can be used to do a selection of a valid woonland
                Assert.True(((List <object>)args.Parameters[0].Value).Count > 0);
                // Provide an anwser by selecting an item: Finland from the list
                parameters.Add(new ClientParameter(args.Parameters[0].Name,
                                                   ((List <object>)args.Parameters[0].Value)[1], TypeInference.InferenceResult.TypeEnum.List, "Dummy"));
            };
            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            try
            {
                var workflow = controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException)
            {
                // The server lookup needs to be evaluated again to get the resulting woonlandfactor.
                // In this case the client will not need to have to answer another question.
                // Maybe this can be put in core, in order to make the client logic simpler.
                var evaluateAgain = controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            Assert.True(parameters[0].Name == "woonland");
            Assert.True((string)parameters[0].Value == "Finland");
            Assert.True(parameters[1].Name == "woonlandfactor");
            Assert.True((double)parameters[1].Value == 0.7161);
            Assert.True(parameters[2].Name == "recht");
            Assert.True((bool)parameters[2].Value == true);

            // Quick Hack to see if recht is false by selecting woonland: Anders
            parameters.Clear();
            parameters.Add(new ClientParameter("woonland", "Anders", TypeInference.InferenceResult.TypeEnum.List, "Dummy"));
            var recalculate = controller.ExecuteWorkflow(ref parameters, ref executionResult);

            Assert.True(parameters[0].Name == "woonland");
            Assert.True((string)parameters[0].Value == "Anders");
            Assert.True(parameters[1].Name == "woonlandfactor");
            Assert.True((double)parameters[1].Value == 0);
            Assert.True(parameters[2].Name == "recht");
            Assert.True((bool)parameters[2].Value == false);
            Assert.NotNull(recalculate.Stacktrace.FindLast(p => p.IsStopExecution == true));
        }
Exemple #2
0
        public async Task <IActionResult> ExecuteRuleYaml([FromBody] ExecuteRuleYamlFromUriRequest request)
        {
            return(StatusCode(500, new ServerError500Response(new NotImplementedException())));

            var controller = new YamlScriptController();
            var response   = new ExecuteRuleYamlFromUriResponse();
            var parameters = request.ClientParameters.Adapt <IParametersCollection>();

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
            };

            var downloadResult = request.Endpoint.DownloadYaml();
            var result         = controller.Parse(downloadResult.Content);

            // map the parsing result.


            if (result.IsError)
            {
                return(StatusCode(400, response));
            }
            ;
            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            controller.ExecuteWorkflow(ref parameters, ref executionResult);

            return(StatusCode(200, new ExecuteRuleYamlFromUriResponse()));
        }
Exemple #3
0
        public void ShouldReturnBooleanAsFirstQuestionNewSituation()
        {
            var isException = false;

            //prepare the result
            var parameters      = new ParametersCollection() as IParametersCollection;
            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            //prepare yaml definition
            var controller = new YamlScriptController();

            controller.Parse(_testYaml2);
            //set the callback
            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                executionResult.Questions = args;
            };

            try
            {
                controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException)
            {
                isException = true;
            }

            Assert.True(isException);
            Assert.Empty(executionResult.Parameters);
            Assert.Equal(2, executionResult.Questions.Parameters.Count);
            Assert.Equal("A", executionResult.Questions.Parameters[0].Name);
            Assert.Equal("B", executionResult.Questions.Parameters[1].Name);
            Assert.Single(executionResult.Stacktrace);
            Assert.Equal("Test A of B", executionResult.Stacktrace.First().Step.Description);
        }
        public async Task <ExecutionResult> Execute(string yaml, IParametersCollection parameters)
        {
            await _parameters.ReadStateAsync();

            var state = _parameters.State as IParametersCollection;


            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            var controller = new YamlScriptController();

            controller.QuestionCallback = (sender, args) =>
            {
                executionResult.Questions = args;
            };
            var result = controller.Parse(yaml);

            executionResult = new ExecutionResult(ref parameters);
            try
            {
                controller.ExecuteWorkflow(ref state, ref executionResult);
            }
            catch (UnresolvedException) { }
            _parameters.State = executionResult.Parameters as ParametersCollection;
            await _parameters.WriteStateAsync();

            return(executionResult as ExecutionResult);
        }
        public void ExecutionResultHasCorrectSemanticKeyOnGeenRecht()
        {
            QuestionArgs argsret    = null;
            var          controller = new YamlScriptController();

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                argsret = args;
            };
            var result     = controller.Parse(YamlTestFileLoader.Load(@"Zorgtoeslag5.yaml"));
            var parameters = new ParametersCollection()
            {
                new ClientParameter("woonland", "Anders", TypeInference.InferenceResult.TypeEnum.List, "Dummy")
            } as IParametersCollection;
            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            try
            {
                controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException ex)
            {
            }
            Assert.Equal("stap.woonland", executionResult.Step.SemanticKey);
            Assert.Equal("stap.woonland.geen_recht", executionResult.Step.Break.SemanticKey);
            Assert.True(executionResult?.Parameters?.Any(p => p.Name == "recht" && !(bool)p.Value));
        }
        public void GetContentNodesFromExecutionResult()
        {
            QuestionArgs argsret    = null;
            var          controller = new YamlScriptController();

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                argsret = args;
            };
            var result     = controller.Parse(YamlTestFileLoader.Load(@"Zorgtoeslag5.yaml"));
            var parameters = new ParametersCollection()
            {
                new ClientParameter("woonland", "Nederland", TypeInference.InferenceResult.TypeEnum.List, "Dummy")
            } as IParametersCollection;
            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            try
            {
                controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException ex)
            {
            }
            Assert.Equal(35, executionResult.ContentNodes.Count());
            Assert.Equal("stap.woonsituatie.keuze.alleenstaande",
                         executionResult.ContentNodes.FirstOrDefault(c => c.Parameter.Name == argsret.Parameters.ToList()[0].Name).Parameter.SemanticKey);
            Assert.Equal("stap.woonsituatie.keuze.aanvrager_met_toeslagpartner",
                         executionResult.ContentNodes.FirstOrDefault(c => c.Parameter.Name == argsret.Parameters.ToList()[1].Name).Parameter.SemanticKey);
        }
        public async Task <IActionResult> ExecuteRuleYamlContents([FromBody] ExecuteRuleYamlFromContentRequest request)
        {
            if (String.IsNullOrEmpty(request.Yaml))
            {
                return(StatusCode(400, null));
            }
            var controller = new YamlScriptController();
            var response   = new ExecuteRuleYamlFromContentResponse();
            var parameters = request.ClientParameters.Adapt <IParametersCollection>();

            if (parameters is null)
            {
                parameters = new ParametersCollection();
            }
            IExecutionResult executionResult = null;

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                executionResult.Questions = args;
            };
            var result = controller.Parse(request.Yaml);

            if (result.IsError)
            {
                response.ParseResult = new ParseResult();
                response.ParseResult.FormattingExceptions = result.Exceptions.Exceptions.Adapt <List <Dto.Exceptions.FormattingException> >();
                response.ExecutionStatus = ExecuteRuleYamlResultTypes.SyntaxError;

                return(StatusCode(400, response));
            }
            executionResult = new ExecutionResult(ref parameters);
            try
            {
                executionResult = controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException)
            {
            }
            if (executionResult.IsError)
            {
                response.ExecutionStatus = ExecuteRuleYamlResultTypes.Ok;
                return(StatusCode(400, response));
            }
            response.Questions        = executionResult.Questions.Parameters.Adapt <IEnumerable <ServerParameter> >();
            response.ServerParameters = executionResult.Parameters.Adapt <IEnumerable <ServerParameter> >();
            return(StatusCode(200, response));
        }
Exemple #8
0
        public void ShouldReturnNoRight()
        {
            var isException = false;

            //prepare the result
            var parameters = new ParametersCollection
            {
                new ClientParameter("A", "nee", TypeInference.InferenceResult.TypeEnum.Boolean, "Dummy"),
                new ClientParameter("B", "ja", TypeInference.InferenceResult.TypeEnum.Boolean, "Dummy")
            } as IParametersCollection;
            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            //prepare yaml definition
            var controller = new YamlScriptController();

            controller.Parse(_testYaml2);
            //set the callback
            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                executionResult.Questions = args;
            };

            try
            {
                controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException)
            {
                isException = true;
            }

            Assert.False(isException);
            Assert.Equal(3, executionResult.Parameters.Count);
            Assert.Equal("A", executionResult.Parameters[0].Name);
            Assert.False((bool)executionResult.Parameters[0].Value);
            Assert.Equal("B", executionResult.Parameters[1].Name);
            Assert.True((bool)executionResult.Parameters[1].Value);
            Assert.Equal("recht", executionResult.Parameters[2].Name);
            Assert.False((bool)executionResult.Parameters[2].Value);
            Assert.Null(executionResult.Questions);
            Assert.Single(executionResult.Stacktrace);
            Assert.Equal("Test A of B", executionResult.Stacktrace.First().Step.Description);
        }
Exemple #9
0
        public async Task <IExecutionResult> Execute(string yaml, IParametersCollection parameters)
        {
            IExecutionResult executionResult = null;
            var controller = new YamlScriptController();

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                executionResult.Questions = args;
            };
            var result = controller.Parse(yaml);

            executionResult = new ExecutionResult(ref parameters) as IExecutionResult;
            try
            {
                controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException) { }

            return(executionResult);
        }
        public async Task <IActionResult> ExecuteRuleYaml([FromBody] ExecuteRuleYamlFromUriRequest request)
        {
            var controller = new YamlScriptController();
            var response   = new ExecuteRuleYamlFromUriResponse();
            var parameters = request.ClientParameters.Adapt <IParametersCollection>();
            IExecutionResult executionResult = null;

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                executionResult.Questions = args;
            };

            var downloadResult = request.Endpoint.DownloadYaml();
            var result         = controller.Parse(downloadResult.Content);

            if (result.IsError)
            {
                return(StatusCode(400, response));
            }
            ;
            executionResult = new ExecutionResult(ref parameters);
            try
            {
                executionResult = controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException)
            {
            }

            if (executionResult.IsError)
            {
                response.ExecutionStatus = ExecuteRuleYamlResultTypes.SyntaxError;
                return(StatusCode(400, response));
            }
            response.ServerParameters = executionResult.Parameters.Adapt <IEnumerable <ServerParameter> >();
            return(StatusCode(200, new ExecuteRuleYamlFromUriResponse()));
        }
Exemple #11
0
        public void YamlCanParseAndEvaluateSituationalTables()
        {
            var controller = new YamlScriptController();
            var result     = controller.Parse(YamlTestFileLoader.Load(
                                                  @"UnitTests/SituationalTables/ValidSituations.yaml"));

            Assert.False(result.IsError);
            Assert.True(result.Model.Tables.ElementAt(0).IsSituational);
            Assert.True(result.Model.Tables.ElementAt(0).Situations.ElementAt(0).Expression == "keuze_c1");
            Assert.True(result.Model.GetTablesByName("tabel1").Count() == 3);

            var parameters = new ParametersCollection()
            {
                new ClientParameter("waarde_a", "70", TypeInference.InferenceResult.TypeEnum.Double, "Dummy"),
                new ClientParameter("waarde_b", "40", TypeInference.InferenceResult.TypeEnum.Double, "Dummy"),
                new ClientParameter("keuze_c1", "ja", TypeInference.InferenceResult.TypeEnum.Boolean, "Dummy"),
                new ClientParameter("keuze_c2", "nee", TypeInference.InferenceResult.TypeEnum.Boolean, "Dummy")
            } as IParametersCollection;

            var executionResult = null as IExecutionResult;

            executionResult = new ExecutionResult(ref parameters);
            executionResult = controller.ExecuteWorkflow(ref parameters, ref executionResult);
        }
Exemple #12
0
        public void ShouldReturnBooleanAsFirstQuestionOldSituation2()
        {
            var isException = false;

            //prepare the result
            var parameters      = new ParametersCollection() as IParametersCollection;
            var executionResult = new ExecutionResult(ref parameters) as IExecutionResult;

            //prepare yaml definition
            var controller = new YamlScriptController();

            //controller.Parse(_testYaml5);
            controller.Parse(YamlTestFileLoader.Load(@"Zorgtoeslag4.yaml"));
            //set the callback
            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                executionResult.Questions = args;
            };

            try
            {
                controller.ExecuteWorkflow(ref parameters, ref executionResult);
            }
            catch (UnresolvedException)
            {
                isException = true;
            }

            Assert.True(isException);
            Assert.Empty(executionResult.Parameters);
            Assert.Single(executionResult.Questions.Parameters);
            Assert.Equal("woonland", executionResult.Questions.Parameters[0].Name);
            Assert.Equal(41, ((List <object>)executionResult.Questions.Parameters[0].Value).Count);
            Assert.Single(executionResult.Stacktrace);
            Assert.Equal("woonland", executionResult.Stacktrace.First().Step.Description);
        }