Skip to content

Commit

Permalink
fix: reset state of commandline app, args, and options on each call o…
Browse files Browse the repository at this point in the history
…f .Parse

Fixes #253
  • Loading branch information
natemcmaster committed Sep 4, 2019
1 parent 6992e9b commit d48b4df
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/CommandLineUtils/CommandArgument.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,10 @@ public CommandArgument()
/// When validation fails, <see cref="CommandLineApplication.ValidationErrorHandler"/> is invoked.
/// </summary>
public ICollection<IArgumentValidator> Validators { get; } = new List<IArgumentValidator>();

internal void Reset()
{
Values.Clear();
}
}
}
23 changes: 23 additions & 0 deletions src/CommandLineUtils/CommandLineApplication.cs
Original file line number Diff line number Diff line change
Expand Up @@ -707,6 +707,27 @@ public void OnExecuteAsync(Func<CancellationToken, Task<int>> invoke)
_handler = invoke;
}

private void Reset()
{
foreach (var arg in Arguments)
{
arg.Reset();
}

foreach (var option in Options)
{
option.Reset();
}

foreach (var cmd in Commands)
{
cmd.Reset();
}

IsShowingInformation = default;
RemainingArguments.Clear();
}

/// <summary>
/// Adds an action to be invoked when all command line arguments have been parsed and validated.
/// </summary>
Expand All @@ -729,6 +750,8 @@ public void OnParsingComplete(Action<ParseResult> action)
/// <returns>The result of parsing.</returns>
public ParseResult Parse(params string[] args)
{
Reset();

args ??= Util.EmptyArray<string>();

var processor = new CommandLineProcessor(this, args);
Expand Down
5 changes: 5 additions & 0 deletions src/CommandLineUtils/CommandOption.cs
Original file line number Diff line number Diff line change
Expand Up @@ -244,5 +244,10 @@ private bool IsEnglishLetter(char c)
{
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

internal void Reset()
{
Values.Clear();
}
}
}
23 changes: 23 additions & 0 deletions test/CommandLineUtils.Tests/CommandLineApplicationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,29 @@ public CommandLineApplicationTests(ITestOutputHelper output)
_output = output;
}

[Fact]
public void CommandLineAppCanBeCalledTwice()
{
var app = new CommandLineApplication(new TestConsole(_output));
var helpOption = app.HelpOption(inherited: true);
var verboseOption = app.VerboseOption();
var subcmd = app.Command("test", _ => { });

app.Execute("test", "--help");
Assert.True(app.IsShowingInformation);
Assert.True(subcmd.IsShowingInformation);
Assert.True(helpOption.HasValue());

app.Execute("-vvv");
Assert.False(app.IsShowingInformation);
Assert.False(subcmd.IsShowingInformation);
Assert.False(helpOption.HasValue());
Assert.Equal(3, verboseOption.Values.Count);

app.Execute("test");
Assert.Empty(verboseOption.Values);
}

[Fact]
public void CommandNameCanBeMatched()
{
Expand Down

0 comments on commit d48b4df

Please sign in to comment.