From c0bb67941af6cbea9c909447c7611f3f6f2b2aee Mon Sep 17 00:00:00 2001 From: hond Date: Mon, 12 Oct 2020 11:26:25 +0800 Subject: [PATCH] Make languagepolicy in Recognizer align with the policy in UseLanguagePolicy --- .../TestScript.cs | 8 +- .../Recognizers/MultiLanguageRecognizer.cs | 10 +- .../MultiLanguageRecognizerTests.cs | 7 + .../TestUtils.cs | 4 +- ...eRecognizerTest_LanguagePolicy.test.dialog | 123 ++++++++++++++++++ 5 files changed, 146 insertions(+), 6 deletions(-) create mode 100644 tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Tests/MultiLanguageRecognizerTests/MultiLanguageRecognizerTest_LanguagePolicy.test.dialog diff --git a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive.Testing/TestScript.cs b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive.Testing/TestScript.cs index 30501ba21f..65311ae8fe 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive.Testing/TestScript.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive.Testing/TestScript.cs @@ -143,8 +143,9 @@ public TestAdapter DefaultTestAdapter(ResourceExplorer resourceExplorer, [Caller /// Name of the test. /// The bot logic. /// optional test adapter. + /// The default language policy. /// Runs the exchange between the user and the bot. - public async Task ExecuteAsync(ResourceExplorer resourceExplorer, [CallerMemberName] string testName = null, BotCallbackHandler callback = null, TestAdapter adapter = null) + public async Task ExecuteAsync(ResourceExplorer resourceExplorer, [CallerMemberName] string testName = null, BotCallbackHandler callback = null, TestAdapter adapter = null, LanguagePolicy languagePolicy = null) { if (adapter == null) { @@ -185,6 +186,11 @@ await adapter.ProcessActivityAsync( .UseResourceExplorer(resourceExplorer) .UseLanguageGeneration(); + if (languagePolicy != null) + { + dm.UseLanguagePolicy(languagePolicy); + } + foreach (var testAction in Script) { await testAction.ExecuteAsync(adapter, dm.OnTurnAsync, Inspect).ConfigureAwait(false); diff --git a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Recognizers/MultiLanguageRecognizer.cs b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Recognizers/MultiLanguageRecognizer.cs index 6b6b23d5ec..d6549fca4a 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Recognizers/MultiLanguageRecognizer.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Recognizers/MultiLanguageRecognizer.cs @@ -41,7 +41,7 @@ public MultiLanguageRecognizer([CallerFilePath] string callerPath = "", [CallerL /// [JsonProperty("languagePolicy")] #pragma warning disable CA2227 // Collection properties should be read only (we can't change this without breaking binary compat) - public LanguagePolicy LanguagePolicy { get; set; } = new LanguagePolicy(); + public LanguagePolicy LanguagePolicy { get; set; } #pragma warning restore CA2227 // Collection properties should be read only /// @@ -66,13 +66,17 @@ public MultiLanguageRecognizer([CallerFilePath] string callerPath = "", [CallerL /// Analysis of utterance. public override async Task RecognizeAsync(DialogContext dialogContext, Activity activity, CancellationToken cancellationToken = default, Dictionary telemetryProperties = null, Dictionary telemetryMetrics = null) { + var languagePolicy = LanguagePolicy ?? + dialogContext.Services.Get() ?? + new LanguagePolicy(); + var policy = new List(); - if (activity.Locale != null && LanguagePolicy.TryGetValue(activity.Locale, out string[] targetpolicy)) + if (activity.Locale != null && languagePolicy.TryGetValue(activity.Locale, out string[] targetpolicy)) { policy.AddRange(targetpolicy); } - if (LanguagePolicy.TryGetValue(string.Empty, out string[] defaultPolicy)) + if (languagePolicy.TryGetValue(string.Empty, out string[] defaultPolicy)) { // we now explictly add defaultPolicy instead of coding that into target's policy policy.AddRange(defaultPolicy); diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/MultiLanguageRecognizerTests.cs b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/MultiLanguageRecognizerTests.cs index 6a578467d2..af4215eae2 100644 --- a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/MultiLanguageRecognizerTests.cs +++ b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/MultiLanguageRecognizerTests.cs @@ -46,5 +46,12 @@ public async Task MultiLanguageRecognizerTest_DefaultFallback() { await TestUtils.RunTestScript(_resourceExplorerFixture.ResourceExplorer); } + + [Fact] + public async Task MultiLanguageRecognizerTest_LanguagePolicy() + { + var languagePolicy = new LanguagePolicy("en-gb"); + await TestUtils.RunTestScript(_resourceExplorerFixture.ResourceExplorer, languagePolicy: languagePolicy); + } } } diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/TestUtils.cs b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/TestUtils.cs index 35d412cf83..9e4c281fbf 100644 --- a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/TestUtils.cs +++ b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/TestUtils.cs @@ -22,12 +22,12 @@ public static IEnumerable GetTestScripts(string relativeFolder) return Directory.EnumerateFiles(testFolder, "*.test.dialog", SearchOption.AllDirectories).Select(s => new object[] { Path.GetFileName(s) }).ToArray(); } - public static async Task RunTestScript(ResourceExplorer resourceExplorer, string resourceId = null, IConfiguration configuration = null, [CallerMemberName] string testName = null) + public static async Task RunTestScript(ResourceExplorer resourceExplorer, string resourceId = null, IConfiguration configuration = null, [CallerMemberName] string testName = null, LanguagePolicy languagePolicy = null) { var script = resourceExplorer.LoadType(resourceId ?? $"{testName}.test.dialog"); script.Configuration = configuration ?? new ConfigurationBuilder().AddInMemoryCollection().Build(); script.Description = script.Description ?? resourceId; - await script.ExecuteAsync(testName: testName, resourceExplorer: resourceExplorer).ConfigureAwait(false); + await script.ExecuteAsync(testName: testName, resourceExplorer: resourceExplorer, languagePolicy: languagePolicy).ConfigureAwait(false); } public static string GetProjectPath() diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Tests/MultiLanguageRecognizerTests/MultiLanguageRecognizerTest_LanguagePolicy.test.dialog b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Tests/MultiLanguageRecognizerTests/MultiLanguageRecognizerTest_LanguagePolicy.test.dialog new file mode 100644 index 0000000000..8e96b728ea --- /dev/null +++ b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Tests/MultiLanguageRecognizerTests/MultiLanguageRecognizerTest_LanguagePolicy.test.dialog @@ -0,0 +1,123 @@ +{ + "$schema": "../../../tests.schema", + "$kind": "Microsoft.Test.Script", + "dialog": { + "$kind": "Microsoft.AdaptiveDialog", + "recognizer": { + "$kind": "Microsoft.MultiLanguageRecognizer", + "recognizers": { + "en-us": { + "$kind": "Microsoft.RegexRecognizer", + "intents": [ + { + "intent": "Greeting", + "pattern": "(?i)howdy" + }, + { + "intent": "Goodbye", + "pattern": "(?i)bye" + } + ] + }, + "en-gb": { + "$kind": "Microsoft.RegexRecognizer", + "intents": [ + { + "intent": "Greeting", + "pattern": "(?i)hiya" + }, + { + "intent": "Goodbye", + "pattern": "(?i)cheerio" + } + ] + }, + "en": { + "$kind": "Microsoft.RegexRecognizer", + "intents": [ + { + "intent": "Greeting", + "pattern": "(?i)hello" + }, + { + "intent": "Goodbye", + "pattern": "(?i)goodbye" + } + ] + }, + "": { + "$kind": "Microsoft.RegexRecognizer", + "intents": [ + { + "intent": "Greeting", + "pattern": "(?i)salve" + }, + { + "intent": "Goodbye", + "pattern": "(?i)vale dicere" + } + ] + } + } + }, + "triggers": [ + { + "$kind": "Microsoft.OnIntent", + "intent": "Greeting", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "activity": "greeting intent" + } + ] + }, + { + "$kind": "Microsoft.OnIntent", + "intent": "Goodbye", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "activity": "goodbye intent" + } + ] + }, + { + "$kind": "Microsoft.OnUnknownIntent", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "activity": "default rule" + } + ] + } + ], + "defaultResultProperty": "dialog.result" + }, + "locale": "", + "script": [ + { + "$kind": "Microsoft.Test.UserSays", + "text": "hiya" + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "greeting intent" + }, + { + "$kind": "Microsoft.Test.UserSays", + "text": "howdy" + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "default rule" + }, + { + "$kind": "Microsoft.Test.UserSays", + "text": "cheerio" + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "goodbye intent" + } + ] +} \ No newline at end of file