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)); }
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)); }
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"); }
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); } }
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" }); }
// 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"); }