示例#1
0
        public void StuurInformatieTest()
        {
            var controller = new YamlScriptController();
            var result     = controller.Parse(YamlTestFileLoader.Load(@"Rijksoverheid/Zorgtoeslag.yaml"));

            Assert.False(result.IsError);
            var header = controller.GetHeader();

            Assert.True(header.Onderwerp == "zorgtoeslag");
            Assert.True(header.Organisatie == "belastingdienst");
            Assert.True(header.Type == "toeslagen");
            Assert.True(header.Domein == "zorg");
            Assert.True(header.Versie == "1.0");
            Assert.True(header.Status == "ontwikkel");
            Assert.True(header.Jaar == "2019");
            Assert.True(header.Bron == "https://download.belastingdienst.nl/toeslagen/docs/berekening_zorgtoeslag_2019_tg0821z91fd.pdf");
        }
示例#2
0
        void Formula_Table_Lookup_Test()
        {
            // -naam: woonlandfactoren
            //  woonland, factor:
            //  - [Finland, 0.7161]
            var controller            = new YamlScriptController();
            var result                = controller.Parse(YamlTestFileLoader.Load(@"Rijksoverheid/Zorgtoeslag.yaml"));
            ExpressionContext context = new ExpressionContext(controller);

            //  Tsjechië,            0.2412
            context.Variables.Add("woonland", "Tsjechië");
            var formula = controller.GetFormula("woonlandfactor");
            //  select(string tableName, string lookupValue, string lookupColumn, string resultColumn)
            IDynamicExpression e       = context.CompileDynamic(formula.Functions[0].Expression);
            double             result1 = (double)e.Evaluate();

            Assert.True(result1 == 0.2412);
        }
示例#3
0
 public async void ShouldReturnDebugInformation(string yamlFile)
 {
     // IMPORTANT please the nl-NL language at the end of the collection, as other
     // tests are primarily tested under nl-NL yaml test files.
     foreach (var language in new[] { "nl-NL", "en-US" })
     {
         Globalization.SetKeywordResourceCulture(new System.Globalization.CultureInfo(language));
         Globalization.SetFormattingExceptionResourceCulture(new System.Globalization.CultureInfo(language));
         var controller = new YamlScriptController();
         var result     = controller.Parse(YamlTestFileLoader.Load($"Malformed/{language}/{yamlFile}.yaml"));
         Assert.True(result.IsError);
         Assert.NotNull(result.Exceptions);
         Assert.NotNull(result.Message);
         Assert.True(result.Exceptions.Exceptions.Count == 1);
         Assert.NotNull(result.Exceptions.Exceptions[0].DebugInfo);
         Output.WriteLine($"{language} message: {result.Message} {result.Exceptions.Exceptions[0].DebugInfo}");
     }
 }
示例#4
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);
        }
示例#5
0
        public void MinimalCompilationTest()
        {
            var controller = new YamlScriptController();
            var result     = controller.Parse(File.OpenText(@"../../../minimal.yaml").ReadToEnd());
            //var p = parser.Flow();
            StringBuilder i = new StringBuilder(); // grain interface.
            StringBuilder p = new StringBuilder(); // grain persistence.

            var m = result.Model;

            i.AppendLine($"public interface {m.Header.Onderwerp} : IGrainWithStringKey {{");
            p.AppendLine("using System;");
            p.AppendLine($"namespace {m.Header.Organisatie.ToPascalCase()}.{m.Header.Domein.ToPascalCase()}.{m.Header.Type.ToPascalCase()}.{m.Header.Onderwerp.ToPascalCase()} {{");
            p.AppendLine($"[Serializable]public class {m.Header.Onderwerp}_state {{");
            p.AppendLine($"public const string hBron = \"{m.Header.Bron}\";");
            p.AppendLine($"public const string hDomein = \"{m.Header.Domein}\";");
            p.AppendLine($"public const string hPeriode = \"{m.Header.Jaar}\";");
            p.AppendLine($"public const string hOnderwerp = \"{m.Header.Onderwerp}\";");
            p.AppendLine($"public const string hOrganisatie = \"{m.Header.Organisatie}\";");
            p.AppendLine($"public const string hStatus = \"{m.Header.Status}\";");
            p.AppendLine($"public const string hType = \"{m.Header.Type}\";");
            p.AppendLine($"public const string hVersie = \"{m.Header.Versie}\";");
            //p.AppendLine($"public class {m.Header.Onderwerp}_state {{");
            foreach (var step in result.Model.Steps)
            {
                // i.AppendLine($"public interface {m.Header.Onderwerp} : IGrainWithIntegerKey {{");
                if (step.Choices != null)
                {
                    foreach (var choice in step.Choices)
                    {
                        p.AppendLine($"public bool {choice.Situation} {{get;set;}}");
                    }
                }
                if (step.Value != null)
                {
                    p.AppendLine($"public double {step.Value} {{get;set;}}");
                }
            }

            p.AppendLine($"}}"); // end class
            p.AppendLine($"}}"); // end namespace
            var state = p.ToString();
        }
示例#6
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 void CanDiscoverAllSemanticKeysAndBindToParameters()
        {
            var controller = new YamlScriptController();
            var result     = controller.Parse(YamlTestFileLoader.Load(@"Zorgtoeslag5.yaml"));

            Assert.False(result.IsError);
            Assert.True(controller.ContentNodes.Count == 35);
            List <string> keys = new List <string>();

            foreach (var item in controller.ContentNodes)
            {
                if (item.Name != "end")
                {
                    Assert.NotNull(item.Parameter);
                    Assert.NotNull(item.Parameter.SemanticKey);
                    Assert.True(item.Parameter.SemanticKey == item.Name);
                }
                keys.Add(item.Name);
            }
            var s = string.Join('\n', keys);
        }
示例#8
0
        public async Task <IActionResult> ValidateRuleYaml(Uri url)
        {
            try
            {
                var ret = await Download(url);

                if (ret.StatusCode != 200)
                {
                    return(ret);
                }
                YamlScriptController controller = new YamlScriptController();
                var         yaml        = ret.Value.ToString();
                var         result      = controller.Parse(yaml);
                ParseResult parseResult = new ParseResult()
                {
                };
                return(StatusCode(200, parseResult));
            }
            catch (Exception ex)
            {
                return(StatusCode(500, new ServerError500Response(ex)));
            }
        }
示例#9
0
        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()));
        }
示例#10
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);
        }
示例#11
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);
        }
示例#12
0
        public void ShouldCorrectlyMapServerParameters()
        {
            TypeAdapterConfig <Vs.Rules.Core.Model.IParameter, OpenApi.v1.Features.discipl.Dto.ServerParameter> .NewConfig().Compile();

            // Get The Server Model.
            var controller = new YamlScriptController();
            var result     = controller.Parse(YamlTestFileLoader.Load(@"Rijksoverheid/Zorgtoeslag.yaml"));
            var model      = result.Model;
            var parameters = new Vs.Rules.Core.ParametersCollection()
            {
                new Vs.Rules.Core.Model.Parameter("alleenstaande", "ja", Vs.Rules.Core.TypeInference.InferenceResult.TypeEnum.Boolean, ref model),
                new Vs.Rules.Core.Model.Parameter("toetsingsinkomen_aanvrager", (double)19000, Vs.Rules.Core.TypeInference.InferenceResult.TypeEnum.Double, ref model),
                new Vs.Rules.Core.Model.Parameter("vermogen_aanvrager", (double)1000, Vs.Rules.Core.TypeInference.InferenceResult.TypeEnum.Double, ref model),
                new Vs.Rules.Core.Model.Parameter("woonland", "Nederland", Vs.Rules.Core.TypeInference.InferenceResult.TypeEnum.List, ref model)
            } as Vs.Rules.Core.Interfaces.IParametersCollection;

            var apiParameters = parameters.Adapt <OpenApi.v1.Features.discipl.Dto.ServerParametersCollection>();

            Assert.True(apiParameters.Count == 4);
            for (int i = 0; i < parameters.Count; i++)
            {
                Assert.True(apiParameters[i].Name == parameters[i].Name);
                Assert.True((int)apiParameters[i].Type == (int)parameters[i].Type);
                Assert.True(apiParameters[i].Value == parameters[i].Value);
            }

            // test implicit mapping
            var serverParameters = apiParameters.Adapt <Vs.Rules.Core.ParametersCollection>();

            for (int i = 0; i < parameters.Count; i++)
            {
                Assert.True(apiParameters[i].Name == serverParameters[i].Name);
                Assert.True((int)apiParameters[i].Type == (int)serverParameters[i].Type);
                Assert.True(apiParameters[i].Value == serverParameters[i].Value);
            }
        }
        public CodeGeneratorTests()
        {
            var controller = new YamlScriptController();

            _context.ParseResult = controller.Parse(File.OpenText(@"../../../minimal.yaml").ReadToEnd());
        }
        public async Task <Model> Parse(string yaml)
        {
            var controller = new YamlScriptController();

            return(controller.Parse(yaml).Model);
        }
示例#15
0
        public void TimePeriodsCanBeReadFromTable()
        {
            var controller = new YamlScriptController();
            var result     = controller.Parse(YamlTestFileLoader.Load(@"WettelijkeRente.yaml"));
            IParametersCollection parameters = new ParametersCollection();
            var  executionResult             = null as IExecutionResult;
            bool isException = false;

            controller.QuestionCallback = (FormulaExpressionContext sender, QuestionArgs args) =>
            {
                switch (args.Parameters[0].Name)
                {
                case "hoofdsom":
                    Assert.True(args.Parameters[0].Type == TypeInference.InferenceResult.TypeEnum.Double);
                    parameters.Add(new ClientParameter("hoofdsom", 7500, TypeInference.InferenceResult.TypeEnum.Double, "Dummy"));
                    break;

                case "looptijd":
                    Assert.True(args.Parameters[0].Type == TypeInference.InferenceResult.TypeEnum.Period);
                    parameters.Add(new ClientParameter("vanaf", "30 Januari 2017", TypeInference.InferenceResult.TypeEnum.Period, "Dummy"));
                    break;

                case "soort_rente":
                    Assert.True(args.Parameters[0].Type == TypeInference.InferenceResult.TypeEnum.List);
                    parameters.Add(new ClientParameter("soort_rente", 1500, TypeInference.InferenceResult.TypeEnum.Double, "Dummy"));
                    break;;
                }
            };
            Assert.False(result.IsError);
            Assert.True(result.Model.Tables.Count == 2);
            Assert.True(result.Model.Tables[0].ColumnTypes[0].Type == TypeInference.InferenceResult.TypeEnum.DateTime);
            // Create TimeRange Array
            var range = new List <TimeRange>();

            for (int i = result.Model.Tables[0].Rows.Count - 1; i > 0; i--)
            {
                range.Add(new TimeRange(
                              DateTime.Parse(result.Model.Tables[0].Rows[i].Columns[0].Value.ToString(), new CultureInfo("nl-NL")),
                              DateTime.Parse(result.Model.Tables[0].Rows[i - 1].Columns[0].Value.ToString(), new CultureInfo("nl-NL")).AddDays(-1)));
            }
            range.Add(new TimeRange(DateTime.Parse(result.Model.Tables[0].Rows[0].Columns[0].Value.ToString(), new CultureInfo("nl-NL")), DateTime.MaxValue));

            /*
             * try
             * {
             *  executionResult = new ExecutionResult(ref parameters);
             *  controller.ExecuteWorkflow(ref parameters, ref executionResult);
             * }
             * catch (UnresolvedException)
             * {
             *  isException = true;
             * }
             * Assert.True(isException);
             * isException = false;
             * try
             * {
             *  controller.ExecuteWorkflow(ref parameters, ref executionResult);
             * }
             * catch (UnresolvedException)
             * {
             *  isException = true;
             * }
             * isException = false;
             * try
             * {
             *  controller.ExecuteWorkflow(ref parameters, ref executionResult);
             * }
             * catch (UnresolvedException)
             * {
             *  isException = true;
             * }
             * Assert.True(isException);
             */
        }