public void TestStructuredTemplate()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("StructuredTemplate.lg"));

            var evaled = engine.EvaluateTemplate("AskForAge.prompt");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Activity\",\"text\":\"how old are you?\",\"speak\":\"how old are you?\"}"), evaled as JObject) ||
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Activity\",\"text\":\"what's your age?\",\"speak\":\"what's your age?\"}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("AskForAge.prompt2");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Activity\",\"text\":\"how old are you?\",\"suggestedactions\":[\"10\",\"20\",\"30\"]}"), evaled as JObject) ||
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Activity\",\"text\":\"what's your age?\",\"suggestedactions\":[\"10\",\"20\",\"30\"]}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("AskForAge.prompt3");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Activity\",\"text\":\"@{GetAge()}\",\"suggestions\":[\"10 | cards\",\"20 | cards\"]}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("T1");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Activity\",\"text\":\"This is awesome\",\"speak\":\"foo bar I can also speak!\"}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("ST1");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"MyStruct\",\"text\":\"foo\",\"speak\":\"bar\"}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("AskForColor");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Activity\",\"suggestedactions\":[{\"lgType\":\"MyStruct\",\"speak\":\"bar\",\"text\":\"zoo\"},{\"lgType\":\"Activity\",\"speak\":\"I can also speak!\"}]}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("MultiExpression");
            var options = new string[]
            {
                "{\r\n  \"lgType\": \"Activity\",\r\n  \"speak\": \"I can also speak!\"\r\n} {\r\n  \"lgType\": \"MyStruct\",\r\n  \"text\": \"hi\"\r\n}",
                "{\n  \"lgType\": \"Activity\",\n  \"speak\": \"I can also speak!\"\n} {\n  \"lgType\": \"MyStruct\",\n  \"text\": \"hi\"\n}"
            };

            Assert.IsTrue(options.Contains(evaled.ToString()));

            evaled = engine.EvaluateTemplate("StructuredTemplateRef");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"MyStruct\",\"text\":\"hi\"}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("MultiStructuredRef");

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"MyStruct\",\"list\":[{\"lgType\":\"SubStruct\",\"text\":\"hello\"},{\"lgType\":\"SubStruct\",\"text\":\"world\"}]}"), evaled as JObject));

            evaled = engine.EvaluateTemplate("templateWithSquareBrackets", new { manufacturer = new { Name = "Acme Co" } });

            Assert.IsTrue(
                JToken.DeepEquals(JObject.Parse("{\"lgType\":\"Struct\",\"text\":\"Acme Co\"}"), evaled as JObject));
        }
        public void TestTemplateNameWithDotIn()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("TemplateNameWithDot.lg"));

            Assert.AreEqual(engine.EvaluateTemplate("Hello.World", null), "Hello World");
            Assert.AreEqual(engine.EvaluateTemplate("Hello", null), "Hello World");
        }
        public void TestMemoryScope()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("MemoryScope.lg"));
            var evaled = engine.EvaluateTemplate("T1", new { turn = new { name = "Dong", count = 3 } });

            Assert.AreEqual(evaled, "Hi Dong, welcome to Seattle, Seattle is a beautiful place, how many burgers do you want, 3?");

            var scope = new SimpleObjectMemory(new
            {
                schema = new Dictionary <string, object>()
                {
                    {
                        "Bread", new Dictionary <string, object>()
                        {
                            {
                                "enum", new List <string>()
                                {
                                    "A", "B"
                                }
                            }
                        }
                    }
                }
            });

            evaled = engine.EvaluateTemplate("AskBread", scope);

            Assert.AreEqual(evaled, "Which Bread, A or B do you want?");
        }
        public void TestMultiLine()
        {
            var engine   = new TemplateEngine().AddFile(GetExampleFilePath("MultilineTextForAdaptiveCard.lg"));
            var evaled1  = engine.EvaluateTemplate("wPhrase", string.Empty);
            var options1 = new List <string> {
                "\r\ncardContent\r\n", "hello", "\ncardContent\n"
            };

            Assert.IsTrue(options1.Contains(evaled1), $"Evaled is {evaled1}");

            var evaled2  = engine.EvaluateTemplate("nameTemplate", new { name = "N" });
            var options2 = new List <string> {
                "\r\nN\r\n", "N", "\nN\n"
            };

            Assert.IsTrue(options2.Contains(evaled2), $"Evaled is {evaled2}");

            var evaled3 = engine.EvaluateTemplate("adaptivecardsTemplate", string.Empty);

            var evaled4  = engine.EvaluateTemplate("refTemplate", string.Empty);
            var options4 = new List <string> {
                "\r\nhi\r\n", "\nhi\n"
            };

            Assert.IsTrue(options4.Contains(evaled4), $"Evaled is {evaled4}");
        }
        public void TestBasicListSupport()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("BasicList.lg"));

            Assert.AreEqual(engine.EvaluateTemplate("BasicJoin", new { items = new[] { "1" } }), "1");
            Assert.AreEqual(engine.EvaluateTemplate("BasicJoin", new { items = new[] { "1", "2" } }), "1, 2");
            Assert.AreEqual(engine.EvaluateTemplate("BasicJoin", new { items = new[] { "1", "2", "3" } }), "1, 2 and 3");
        }
        public void TestBasicSwitchCaseTemplate()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("switchcase.lg"));

            string evaled = engine.EvaluateTemplate("greetInAWeek", new { day = "Saturday" }).ToString();

            Assert.IsTrue(evaled == "Happy Saturday!");

            evaled = engine.EvaluateTemplate("greetInAWeek", new { day = "Monday" }).ToString();
            Assert.IsTrue(evaled == "Work Hard!");
        }
        public void TestIfElseTemplate()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("5.lg"));

            string evaled = engine.EvaluateTemplate("time-of-day-readout", new { timeOfDay = "morning" }).ToString();

            Assert.IsTrue(evaled == "Good morning" || evaled == "Morning! ", $"Evaled is {evaled}");

            evaled = engine.EvaluateTemplate("time-of-day-readout", new { timeOfDay = "evening" }).ToString();
            Assert.IsTrue(evaled == "Good evening" || evaled == "Evening! ", $"Evaled is {evaled}");
        }
        public void TestRegex()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("Regex.lg"));
            var evaled = engine.EvaluateTemplate("wPhrase", string.Empty);

            Assert.AreEqual(evaled, "Hi");

            evaled = engine.EvaluateTemplate("wPhrase", new { name = "jack" });
            Assert.AreEqual(evaled, "Hi jack");

            evaled = engine.EvaluateTemplate("wPhrase", new { name = "morethanfive" });
            Assert.AreEqual(evaled, "Hi");
        }
 private static async Task <DialogTurnResult> TransportStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
 {
     // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog.
     // Running a prompt here means the next WaterfallStep will be run when the users response is received.
     return(await stepContext.PromptAsync(nameof(ChoicePrompt),
                                          new PromptOptions
     {
         Prompt = ActivityFactory.CreateActivity(_lgEngine.EvaluateTemplate("ModeOfTransportPrompt").ToString()),
         Choices = ChoiceFactory.ToChoices(new List <string> {
             "Car", "Bus", "Bicycle"
         }),
     }, cancellationToken));
 }
Пример #10
0
        private async Task <DialogTurnResult> ChoiceCardStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            _logger.LogInformation("MainDialog.ChoiceCardStepAsync");

            // Create options for the prompt
            var options = new PromptOptions()
            {
                Prompt  = stepContext.Context.Activity.CreateReply(_lgEngine.EvaluateTemplate("CardChoice", null)),
                Choices = new List <Choice>(),
            };

            // Add the choices for the prompt.
            options.Choices.Add(new Choice()
            {
                Value = "Adaptive card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "Animation card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "Audio card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "Hero card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "Receipt card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "Signin card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "Thumbnail card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "Video card"
            });
            options.Choices.Add(new Choice()
            {
                Value = "All cards"
            });

            return(await stepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken));
        }
Пример #11
0
        public void TestTemplateRef()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("TemplateRef.lg"));

            var scope = new
            {
                time = "morning",
                name = "Dong Lei"
            };

            Assert.AreEqual(engine.EvaluateTemplate("Hello", scope), "Good morning Dong Lei");
            Assert.AreEqual(engine.EvaluateTemplate("Hello2", scope), "Good morning Dong Lei");
            Assert.AreEqual(engine.EvaluateTemplate("Hello3", scope), "Good morning Dong Lei");
        }
        public void TestBasicTemplateRefWithParameters()
        {
            var    engine = new TemplateEngine().AddFile(GetExampleFilePath("6.lg"));
            string evaled = engine.EvaluateTemplate("welcome", null).ToString();

            Assert.IsTrue(evaled == "Hi DongLei :)" ||
                          evaled == "Hey DongLei :)" ||
                          evaled == "Hello DongLei :)");

            evaled = engine.EvaluateTemplate("welcome", new { userName = "******" }).ToString();
            Assert.IsTrue(evaled == "Hi DL :)" ||
                          evaled == "Hey DL :)" ||
                          evaled == "Hello DL :)");
        }
        public void TestIsTemplateFunction()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("IsTemplate.lg"));

            var evaled = engine.EvaluateTemplate("template2", new { templateName = "template1" });

            Assert.AreEqual("template template1 exists", evaled);

            evaled = engine.EvaluateTemplate("template2", new { templateName = "wPhrase" });
            Assert.AreEqual("template wPhrase exists", evaled);

            evaled = engine.EvaluateTemplate("template2", new { templateName = "xxx" });
            Assert.AreEqual("template xxx does not exist", evaled);
        }
        public void TestBasicConditionalTemplateWithoutDefault()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("5.lg"));

            string evaled = engine.EvaluateTemplate("time-of-day-readout-without-default", new { timeOfDay = "morning" }).ToString();

            Assert.IsTrue(evaled == "Good morning" || evaled == "Morning! ", $"Evaled is {evaled}");

            evaled = engine.EvaluateTemplate("time-of-day-readout-without-default2", new { timeOfDay = "morning" }).ToString();
            Assert.IsTrue(evaled == "Good morning" || evaled == "Morning! ", $"Evaled is {evaled}");

            object evaledNull = engine.EvaluateTemplate("time-of-day-readout-without-default2", new { timeOfDay = "evening" });

            Assert.IsNull(evaledNull, "Evaled is not null");
        }
Пример #15
0
        public void EvaluatorThrowExceptionTest(string input, string templateName)
        {
            var            isFail       = false;
            var            errorMessage = string.Empty;
            TemplateEngine engine       = null;

            try
            {
                engine = new TemplateEngine().AddFile(GetExampleFilePath(input));
            }
            catch (Exception)
            {
                isFail       = true;
                errorMessage = "error occurs when parsing file";
            }

            if (!isFail)
            {
                try
                {
                    engine.EvaluateTemplate(templateName, null);
                    isFail       = true;
                    errorMessage = "No exception is thrown.";
                }
                catch (Exception e)
                {
                    TestContext.WriteLine(e.Message);
                }
            }

            if (isFail)
            {
                Assert.Fail(errorMessage);
            }
        }
Пример #16
0
        public AdapterWithErrorHandler(ICredentialProvider credentialProvider, ILogger <BotFrameworkHttpAdapter> logger, ConversationState conversationState = null)
            : base(credentialProvider)
        {
            // combine path for cross platform support
            string[] paths    = { ".", "Resources", "AdapterWithErrorHandler.lg" };
            string   fullPath = Path.Combine(paths);

            _lgEngine   = new TemplateEngine().AddFile(fullPath);
            OnTurnError = async(turnContext, exception) =>
            {
                // Log any leaked exception from the application.
                logger.LogError($"Exception caught : {exception.Message}");

                // Send a catch-all apology to the user.
                await turnContext.SendActivityAsync(ActivityBuilder.GenerateFromLG(_lgEngine.EvaluateTemplate("SomethingWentWrong", exception)));

                if (conversationState != null)
                {
                    try
                    {
                        // Delete the conversationState for the current conversation to prevent the
                        // bot from getting stuck in a error-loop caused by being in a bad state.
                        // ConversationState should be thought of as similar to "cookie-state" in a Web pages.
                        await conversationState.DeleteAsync(turnContext);
                    }
                    catch (Exception e)
                    {
                        logger.LogError($"Exception caught on attempting to Delete ConversationState : {e.Message}");
                    }
                }
            };
        }
        public void TestListWithOnlyOneElement()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("8.lg"));
            var evaled = engine.EvaluateTemplate("ShowTasks", new { recentTasks = new[] { "Task1" } });

            Assert.AreEqual("Your most recent task is Task1. You can let me know if you want to add or complete a task.", evaled);
        }
        public void TestlgTemplateFunction()
        {
            var engine  = new TemplateEngine().AddFile(GetExampleFilePath("lgTemplate.lg"));
            var evaled  = engine.EvaluateTemplate("TemplateC", string.Empty);
            var options = new List <string> {
                "Hi", "Hello"
            };

            Assert.AreEqual(options.Contains(evaled), true);

            evaled  = engine.EvaluateTemplate("TemplateD", new { b = "morning" });
            options = new List <string> {
                "Hi morning", "Hello morning"
            };
            Assert.AreEqual(options.Contains(evaled), true);
        }
        public void TestEvaluateOnce()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("EvaluateOnce.lg"));

            var evaled = engine.EvaluateTemplate("templateWithSameParams", new { param = "ms" });

            Assert.IsNotNull(evaled);

            var resultList = evaled.ToString().Split(" ");

            Assert.IsTrue(resultList.Length == 2);
            Assert.IsTrue(resultList[0] == resultList[1]);

            // may be has different values
            evaled = engine.EvaluateTemplate("templateWithDifferentParams", new { param1 = "ms", param2 = "newms" });
        }
Пример #20
0
 // Load attachment from file.
 private Attachment CreateAdaptiveCardAttachment()
 {
     return(new Attachment()
     {
         ContentType = "application/vnd.microsoft.card.adaptive",
         Content = JsonConvert.DeserializeObject(_lgEngine.EvaluateTemplate("WelcomeCard", null))
     });
 }
        public void TestImportLgFiles()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("import.lg"));

            // Assert 6.lg is imported only once when there are several relative paths which point to the same file.
            // Assert import cycle loop is handled well as expected when a file imports itself.
            Assert.AreEqual(14, engine.Templates.Count());

            string evaled = engine.EvaluateTemplate("basicTemplate", null).ToString();

            Assert.IsTrue(evaled == "Hi" || evaled == "Hello");

            evaled = engine.EvaluateTemplate("welcome", null).ToString();
            Assert.IsTrue(evaled == "Hi DongLei :)" ||
                          evaled == "Hey DongLei :)" ||
                          evaled == "Hello DongLei :)");

            evaled = engine.EvaluateTemplate("template3", null).ToString();
            Assert.IsTrue(evaled == "Hi 2" || evaled == "Hello 2");

            evaled = engine.EvaluateTemplate("welcome", new { userName = "******" }).ToString();
            Assert.IsTrue(evaled == "Hi DL :)" ||
                          evaled == "Hey DL :)" ||
                          evaled == "Hello DL :)");

            evaled = engine.EvaluateTemplate("basicTemplate2", null).ToString();
            Assert.IsTrue(evaled == "Hi 2" || evaled == "Hello 2");

            // Assert 6.lg of relative path is imported from text.
            engine = new TemplateEngine().AddText(content: "# basicTemplate\r\n- Hi\r\n- Hello\r\n[import](./6.lg)", id: GetExampleFilePath("xx.lg"));

            Assert.AreEqual(8, engine.Templates.Count());
            evaled = engine.EvaluateTemplate("basicTemplate", null).ToString();
            Assert.IsTrue(evaled == "Hi" || evaled == "Hello");

            evaled = engine.EvaluateTemplate("welcome", null).ToString();
            Assert.IsTrue(evaled == "Hi DongLei :)" ||
                          evaled == "Hey DongLei :)" ||
                          evaled == "Hello DongLei :)");

            evaled = engine.EvaluateTemplate("welcome", new { userName = "******" }).ToString();
            Assert.IsTrue(evaled == "Hi DL :)" ||
                          evaled == "Hey DL :)" ||
                          evaled == "Hello DL :)");
        }
        public void TestConditionExpression()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("ConditionExpression.lg"));

            var evaled = engine.EvaluateTemplate("conditionTemplate", new { num = 1 });

            Assert.AreEqual(evaled, "Your input is one");

            evaled = engine.EvaluateTemplate("conditionTemplate", new { num = 2 });

            Assert.AreEqual(evaled, "Your input is two");

            evaled = engine.EvaluateTemplate("conditionTemplate", new { num = 3 });

            Assert.AreEqual(evaled, "Your input is three");

            evaled = engine.EvaluateTemplate("conditionTemplate", new { num = 4 });

            Assert.AreEqual(evaled, "Your input is not one, two or three");
        }
        public void TestBasic()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("2.lg"));

            var evaled  = engine.EvaluateTemplate("wPhrase");
            var options = new List <string> {
                "Hi", "Hello", "Hiya"
            };

            Assert.IsTrue(options.Contains(evaled), $"The result `{evaled}` is not in those options [{string.Join(",", options)}]");
        }
        public void TestBasicTemplateReference()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("3.lg"));

            var evaled  = engine.EvaluateTemplate("welcome-user", null);
            var options = new List <string> {
                "Hi", "Hello", "Hiya", "Hi :)", "Hello :)", "Hiya :)"
            };

            Assert.IsTrue(options.Contains(evaled), $"The result {evaled} is not in those options [{string.Join(",", options)}]");
        }
        public void TestTemplateAsFunction()
        {
            var    engine = new TemplateEngine().AddFile(GetExampleFilePath("TemplateAsFunction.lg"));
            string evaled = engine.EvaluateTemplate("Test2", string.Empty).ToString();

            Assert.AreEqual(evaled, "hello world");

            evaled = engine.EvaluateTemplate("Test3", string.Empty).ToString();
            Assert.AreEqual(evaled, "hello world");

            evaled = engine.EvaluateTemplate("Test4", string.Empty).ToString();

            Assert.AreEqual(evaled.Trim(), "hello world");

            evaled = engine.EvaluateTemplate("dupNameWithTemplate").ToString();
            Assert.AreEqual(evaled, "calculate length of ms by user's template");

            evaled = engine.EvaluateTemplate("dupNameWithBuiltinFunc").ToString();
            Assert.AreEqual(evaled, "2");
        }
        public void TestBasicTemplateRefAndEntityRef()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("4.lg"));

            var userName = "******";
            var evaled   = engine.EvaluateTemplate("welcome-user", new { userName = userName }).ToString();
            var options  = new List <string> {
                "Hi", "Hello", "Hiya ", "Hi :)", "Hello :)", "Hiya  :)"
            };

            Assert.IsTrue(evaled.Contains(userName), $"The result {evaled} does not contiain `{userName}`");
        }
        public void TestBasicExtendedFunctions()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("6.lg"));
            var alarms = new[]
            {
                new
                {
                    time = "7 am",
                    date = "tomorrow"
                },
                new
                {
                    time = "8 pm",
                    date = "tomorrow"
                }
            };

            // var alarmStrs = alarms.Select(x => engine.EvaluateTemplate("ShowAlarm", new { alarm = x })).ToList() ;
            // var evaled = engine.EvaluateTemplate("ShowAlarms", new { alarms = alarmStrs });
            // Assert.AreEqual("You have 2 alarms, 7 am at tomorrow and 8 pm at tomorrow", evaled);

            var evaled = engine.EvaluateTemplate("ShowAlarmsWithForeach", new { alarms = alarms });

            Assert.AreEqual("You have 2 alarms, 7 am at tomorrow and 8 pm at tomorrow", evaled);

            evaled = engine.EvaluateTemplate("ShowAlarmsWithLgTemplate", new { alarms = alarms });
            Assert.AreEqual("You have 2 alarms, 7 am at tomorrow and 8 pm at tomorrow", evaled);

            evaled = engine.EvaluateTemplate("ShowAlarmsWithDynamicLgTemplate", new { alarms = alarms, templateName = "ShowAlarm" });
            Assert.AreEqual("You have 2 alarms, 7 am at tomorrow and 8 pm at tomorrow", evaled);

            // var evaled = engine.EvaluateTemplate("ShowAlarmsWithMemberForeach", new { alarms = alarms });
            // Assert.AreEqual("You have 2 alarms, 7 am at tomorrow and 8 pm at tomorrow", evaled);

            // var evaled = engine.EvaluateTemplate("ShowAlarmsWithHumanize", new { alarms = alarms });
            // Assert.AreEqual("You have 2 alarms, 7 am at tomorrow and 8 pm at tomorrow", evaled);

            // var evaled = engine.EvaluateTemplate("ShowAlarmsWithMemberHumanize", new { alarms = alarms });
            // Assert.AreEqual("You have 2 alarms, 7 am at tomorrow and 8 pm at tomorrow", evaled);
        }
        public void TestEvalExpression()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("EvalExpression.lg"));

            var userName = "******";
            var evaled   = engine.EvaluateTemplate("template1", new { userName });

            Assert.AreEqual(evaled, "Hi MS");

            evaled = engine.EvaluateTemplate("template2", new { userName });
            Assert.AreEqual(evaled, "Hi MS");

            evaled = engine.EvaluateTemplate("template3", new { userName });
            Assert.AreEqual(evaled, "HiMS");

            evaled = engine.EvaluateTemplate("template4", new { userName });
            var eval1Options = new List <string>()
            {
                "\r\nHi MS\r\n", "\nHi MS\n"
            };

            Assert.IsTrue(eval1Options.Contains(evaled));

            evaled = engine.EvaluateTemplate("template5", new { userName });
            var eval2Options = new List <string>()
            {
                "\r\nHiMS\r\n", "\nHiMS\n"
            };

            Assert.IsTrue(eval2Options.Contains(evaled));

            evaled = engine.EvaluateTemplate("template6", new { userName });
            Assert.AreEqual(evaled, "goodmorning");
        }
        public void TestExceptionCatch()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("ExceptionCatch.lg"));

            try
            {
                engine.EvaluateTemplate("NoVariableMatch", null);
            }
            catch (Exception e)
            {
                TestContext.WriteLine(e.Message);
            }
        }
        public void TestMemoryAccessPath()
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath("MemoryAccess.lg"));

            var memory = new
            {
                myProperty = new
                {
                    name = "p1"
                },

                turn = new
                {
                    properties = new Dictionary <string, object>
                    {
                        {
                            "p1", new Dictionary <string, object>()
                            {
                                { "enum", "p1enum" }
                            }
                        }
                    }
                }
            };

            // this evaulate will hit memory access twice
            // first for "property", and get "p1", from local
            // sencond for "turn.property[p1].enum" and get "p1enum" from global
            var result = engine.EvaluateTemplate("T1", memory);

            Assert.AreEqual(result, "p1enum");

            // this evaulate will hit memory access twice
            // first for "myProperty.name", and get "p1", from global
            // sencond for "turn.property[p1].enum" and get "p1enum" from global
            result = engine.EvaluateTemplate("T3", memory);
            Assert.AreEqual(result, "p1enum");
        }