From 5cf41725a57138c0ca313959c67d6c994b702b97 Mon Sep 17 00:00:00 2001 From: Patrik Svensson Date: Thu, 31 Dec 2020 12:16:08 +0100 Subject: [PATCH] Do not split remaining args on space Closes #186 --- .../Unit/Cli/CommandAppTests.Remaining.cs | 77 +++++++++++++++++++ .../Internal/Parsing/CommandTreeTokenizer.cs | 4 +- .../Parsing/CommandTreeTokenizerContext.cs | 9 +-- 3 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs diff --git a/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs new file mode 100644 index 0000000..cd95a31 --- /dev/null +++ b/src/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Remaining.cs @@ -0,0 +1,77 @@ +using Shouldly; +using Spectre.Console.Cli; +using Spectre.Console.Testing; +using Spectre.Console.Tests.Data; +using Xunit; + +namespace Spectre.Console.Tests.Unit.Cli +{ + public sealed partial class CommandAppTests + { + public sealed class Remaining + { + [Fact] + public void Should_Register_Remaining_Parsed_Arguments_With_Context() + { + // Given + var app = new CommandAppFixture(); + app.Configure(config => + { + config.PropagateExceptions(); + config.AddBranch("animal", animal => + { + animal.AddCommand("dog"); + }); + }); + + // When + var (result, _, ctx, _) = app.Run(new[] + { + "animal", "4", "dog", "12", "--", + "--foo", "bar", "--foo", "baz", + "-bar", "\"baz\"", "qux", + "foo bar baz qux", + }); + + // Then + ctx.Remaining.Parsed.Count.ShouldBe(4); + ctx.ShouldHaveRemainingArgument("foo", values: new[] { "bar", "baz" }); + ctx.ShouldHaveRemainingArgument("b", values: new[] { (string)null }); + ctx.ShouldHaveRemainingArgument("a", values: new[] { (string)null }); + ctx.ShouldHaveRemainingArgument("r", values: new[] { (string)null }); + } + + [Fact] + public void Should_Register_Remaining_Raw_Arguments_With_Context() + { + // Given + var app = new CommandAppFixture(); + app.Configure(config => + { + config.PropagateExceptions(); + config.AddBranch("animal", animal => + { + animal.AddCommand("dog"); + }); + }); + + // When + var (result, _, ctx, _) = app.Run(new[] + { + "animal", "4", "dog", "12", "--", + "--foo", "bar", "-bar", "\"baz\"", "qux", + "foo bar baz qux", + }); + + // Then + ctx.Remaining.Raw.Count.ShouldBe(6); + ctx.Remaining.Raw[0].ShouldBe("--foo"); + ctx.Remaining.Raw[1].ShouldBe("bar"); + ctx.Remaining.Raw[2].ShouldBe("-bar"); + ctx.Remaining.Raw[3].ShouldBe("baz"); + ctx.Remaining.Raw[4].ShouldBe("qux"); + ctx.Remaining.Raw[5].ShouldBe("foo bar baz qux"); + } + } + } +} diff --git a/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs b/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs index 8314618..a70a832 100644 --- a/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs +++ b/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs @@ -74,6 +74,9 @@ namespace Spectre.Console.Cli.Internal tokens.Add(ScanString(context, reader)); } } + + // Flush remaining tokens + context.FlushRemaining(); } return position; @@ -145,7 +148,6 @@ namespace Spectre.Console.Cli.Internal // Add to the context context.AddRemaining(quotedString); - context.FlushRemaining(); return new CommandTreeToken( CommandTreeToken.Kind.String, diff --git a/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizerContext.cs b/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizerContext.cs index 4d8a2cb..c6cdb24 100644 --- a/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizerContext.cs +++ b/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizerContext.cs @@ -21,14 +21,7 @@ namespace Spectre.Console.Cli.Internal { if (Mode == CommandTreeTokenizer.Mode.Remaining) { - if (char.IsWhiteSpace(character)) - { - FlushRemaining(); - } - else - { - _builder.Append(character); - } + _builder.Append(character); } }