From 5da32ad40fa107ec26d54ede1c4e07f235e0f599 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Fri, 20 Jan 2023 15:48:18 +0100 Subject: [PATCH 1/3] add a failing test --- .../ParsingValidationTests.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/System.CommandLine.Tests/ParsingValidationTests.cs b/src/System.CommandLine.Tests/ParsingValidationTests.cs index f0e7fba9a9..b9278d9afe 100644 --- a/src/System.CommandLine.Tests/ParsingValidationTests.cs +++ b/src/System.CommandLine.Tests/ParsingValidationTests.cs @@ -170,6 +170,29 @@ public void When_FromAmong_is_used_for_multiple_arguments_and_invalid_input_is_p .Be(LocalizationResources.Instance.UnrecognizedArgument("not-value1", new[] { "value1", "value2" })); } + [Fact] + public void When_FromAmong_is_used_and_multiple_invalid_inputs_are_provided_the_error_mentions_first_invalid_argument() + { + Option option = new(new[] { "--columns" }); + option.AcceptOnlyFromAmong("author", "language", "tags", "type"); + option.Arity = new ArgumentArity(1, 4); + option.AllowMultipleArgumentsPerToken = true; + + var command = new Command("--list") + { + option + }; + + var result = command.Parse("--list --columns c1 c2"); + + // Currently there is no possibility for a single validator to produce multiple errors, + // so only the first one is checked. + result.Errors[0] + .Message + .Should() + .Be(LocalizationResources.Instance.UnrecognizedArgument("c1", new[] { "author", "language", "tags", "type" })); + } + [Fact] public void When_a_required_argument_is_not_supplied_then_an_error_is_returned() { From 5f5936f08590351f7ec8f50a47ae551b992aa169 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Fri, 20 Jan 2023 16:24:21 +0100 Subject: [PATCH 2/3] fix --- src/System.CommandLine/Argument{T}.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/System.CommandLine/Argument{T}.cs b/src/System.CommandLine/Argument{T}.cs index 7f49d98bd9..35c3d4204d 100644 --- a/src/System.CommandLine/Argument{T}.cs +++ b/src/System.CommandLine/Argument{T}.cs @@ -195,6 +195,7 @@ void UnrecognizedArgumentError(ArgumentResult argumentResult) if (Array.IndexOf(values, token.Value) < 0) { argumentResult.ErrorMessage = argumentResult.LocalizationResources.UnrecognizedArgument(token.Value, values); + break; } } } From 3f12d0e4fa5923811c860956564c153f421ad3bf Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Fri, 20 Jan 2023 17:48:49 +0100 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Jon Sequeira --- src/System.CommandLine.Tests/ParsingValidationTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.CommandLine.Tests/ParsingValidationTests.cs b/src/System.CommandLine.Tests/ParsingValidationTests.cs index b9278d9afe..523e982b08 100644 --- a/src/System.CommandLine.Tests/ParsingValidationTests.cs +++ b/src/System.CommandLine.Tests/ParsingValidationTests.cs @@ -178,12 +178,12 @@ public void When_FromAmong_is_used_and_multiple_invalid_inputs_are_provided_the_ option.Arity = new ArgumentArity(1, 4); option.AllowMultipleArgumentsPerToken = true; - var command = new Command("--list") + var command = new Command("list") { option }; - var result = command.Parse("--list --columns c1 c2"); + var result = command.Parse("list --columns c1 c2"); // Currently there is no possibility for a single validator to produce multiple errors, // so only the first one is checked.