diff --git a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/InputDialog.cs b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/InputDialog.cs index 9b2a5d73db..b331dd00ce 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/InputDialog.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/InputDialog.cs @@ -266,7 +266,7 @@ public abstract class InputDialog : Dialog var (value, error) = this.DefaultValue.TryGetValue(dc.State); if (this.DefaultValueResponse != null) { - var response = await this.DefaultValueResponse.BindAsync(dc, cancellationToken).ConfigureAwait(false); + var response = await this.DefaultValueResponse.BindAsync(dc, cancellationToken: cancellationToken).ConfigureAwait(false); var properties = new Dictionary() { @@ -285,7 +285,7 @@ public abstract class InputDialog : Dialog } } - return await dc.EndDialogAsync().ConfigureAwait(false); + return await dc.EndDialogAsync(cancellationToken: cancellationToken).ConfigureAwait(false); } /// diff --git a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/OAuthInput.cs b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/OAuthInput.cs index 91abb32b40..38926986dd 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/OAuthInput.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Input/OAuthInput.cs @@ -251,7 +251,7 @@ public class OAuthInput : InputDialog var (value, _) = this.DefaultValue.TryGetValue(dc.State); if (this.DefaultValueResponse != null) { - var response = await this.DefaultValueResponse.BindAsync(dc, cancellationToken).ConfigureAwait(false); + var response = await this.DefaultValueResponse.BindAsync(dc, cancellationToken: cancellationToken).ConfigureAwait(false); var properties = new Dictionary() { { "template", JsonConvert.SerializeObject(this.DefaultValueResponse) }, diff --git a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/ActivityTemplate.cs b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/ActivityTemplate.cs index 9e92ad2433..265ef6aca7 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/ActivityTemplate.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/ActivityTemplate.cs @@ -59,6 +59,16 @@ public ActivityTemplate(string template) /// Instance of . public virtual async Task BindAsync(DialogContext dialogContext, object data = null, CancellationToken cancellationToken = default) { + if (dialogContext == null) + { + throw new ArgumentNullException(nameof(dialogContext)); + } + + if (data is CancellationToken) + { + throw new ArgumentException($"{nameof(data)} cannot be a cancellation token"); + } + if (!string.IsNullOrEmpty(this.Template)) { var languageGenerator = dialogContext.Services.Get(); diff --git a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/TextTemplate.cs b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/TextTemplate.cs index 68b3fa0868..21651abd47 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/TextTemplate.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Templates/TextTemplate.cs @@ -49,6 +49,16 @@ public TextTemplate(string template) /// Instance of string. public virtual async Task BindAsync(DialogContext dialogContext, object data = null, CancellationToken cancellationToken = default) { + if (dialogContext == null) + { + throw new ArgumentNullException(nameof(dialogContext)); + } + + if (data is CancellationToken) + { + throw new ArgumentException($"{nameof(data)} cannot be a cancellation token"); + } + if (string.IsNullOrEmpty(this.Template)) { throw new InvalidOperationException($"The {nameof(this.Template)} property can't be empty."); diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/ActionTests.cs b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/ActionTests.cs index 7b22b7ffdd..646608822a 100644 --- a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/ActionTests.cs +++ b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/ActionTests.cs @@ -243,6 +243,12 @@ public async Task Action_NumberInputWithVAlueExpression() await TestUtils.RunTestScript(_resourceExplorerFixture.ResourceExplorer); } + [Fact] + public async Task Action_NumberInputWithDefaultResponse() + { + await TestUtils.RunTestScript(_resourceExplorerFixture.ResourceExplorer); + } + [Fact] public async Task Action_RepeatDialog() { diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests.csproj b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests.csproj index 83e93a15ea..20790b490a 100644 --- a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests.csproj +++ b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests.csproj @@ -33,6 +33,9 @@ Always + + PreserveNewest + Component diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Tests/ActionTests/Action_NumberInputWithDefaultResponse.test.dialog b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Tests/ActionTests/Action_NumberInputWithDefaultResponse.test.dialog new file mode 100644 index 0000000000..780fe49901 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.Dialogs.Adaptive.Tests/Tests/ActionTests/Action_NumberInputWithDefaultResponse.test.dialog @@ -0,0 +1,61 @@ +{ + "$schema": "../../../tests.schema", + "$kind": "Microsoft.Test.Script", + "dialog": { + "$kind": "Microsoft.AdaptiveDialog", + "id": "planningTest", + "triggers": [ + { + "$kind": "Microsoft.OnBeginDialog", + "actions": [ + { + "$kind": "Microsoft.NumberInput", + "defaultLocale": "en-us", + "disabled": false, + "maxTurnCount": 2, + "alwaysPrompt": true, + "allowInterruptions": false, + "prompt": "Give me your favorite number (1-10)", + "unrecognizedPrompt": "Sorry, ${turn.activity.text} did not include a valid number.", + "invalidPrompt": "Sorry, ${this.value} does not work. Can you give me a different number that is between 1-10?", + "defaultValueResponse": "Sorry, we have tried for ${class.MaxTurnCount} number of times and I'm still not getting it. For now, I'm setting ${class.property} to ${class.DefaultValue}", + "property": "user.favoriteNumber", + "outputFormat": "=string(this.value)", + "validations": [ + "=int(this.value) >=1", + "=int(this.value) <= 10" + ], + "defaultValue": 9 + } + ] + } + ], + "defaultResultProperty": "dialog.result" + }, + "script": [ + { + "$kind": "Microsoft.Test.UserSays", + "text": "hi" + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "Give me your favorite number (1-10)" + }, + { + "$kind": "Microsoft.Test.UserSays", + "text": "1000" + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "Sorry, 1000 does not work. Can you give me a different number that is between 1-10?" + }, + { + "$kind": "Microsoft.Test.UserSays", + "text": "25" + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "Sorry, we have tried for 2 number of times and I'm still not getting it. For now, I'm setting user.favoriteNumber to 9" + } + ] +} \ No newline at end of file