mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-07-05 03:58:16 +08:00
* TestConsole can now be configured and accessed in CommandAppTester * Add test with mocked user inputs for interactive command * Add documentation for using the CommandAppTester Co-authored-by: Patrik Svensson <patriksvensson@users.noreply.github.com> Co-authored-by: Marek Magath <Marek.Magath@solarwinds.com>
This commit is contained in:
@ -44,4 +44,40 @@ public sealed class CommandAppTesterTests
|
||||
// Then
|
||||
result.Output.ShouldBe(expected);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultCtor_WithoutParameters_CreatesDefaultConsole()
|
||||
{
|
||||
// Given, When
|
||||
CommandAppTester app = new();
|
||||
|
||||
// Then
|
||||
app.Console.ShouldNotBeNull();
|
||||
app.Console.Profile.Width.ShouldBe(int.MaxValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultCtor_WithCustomConsole_UsesProvidedInstance()
|
||||
{
|
||||
// Given
|
||||
TestConsole console = new();
|
||||
|
||||
// When
|
||||
CommandAppTester app = new(null, new CommandAppTesterSettings(), console);
|
||||
|
||||
// Then
|
||||
app.Console.ShouldNotBeNull();
|
||||
app.Console.ShouldBeSameAs(console);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ctor_WithSettings_CreatesDefaultConsole()
|
||||
{
|
||||
// Given, When
|
||||
CommandAppTester app = new(new CommandAppTesterSettings());
|
||||
|
||||
// Then
|
||||
app.Console.ShouldNotBeNull();
|
||||
app.Console.Profile.Width.ShouldBe(int.MaxValue);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,80 @@
|
||||
namespace Spectre.Console.Cli.Tests.Unit.Testing;
|
||||
|
||||
public sealed class InteractiveCommandTests
|
||||
{
|
||||
private sealed class InteractiveCommand : Command
|
||||
{
|
||||
private readonly IAnsiConsole _console;
|
||||
|
||||
public InteractiveCommand(IAnsiConsole console)
|
||||
{
|
||||
_console = console;
|
||||
}
|
||||
|
||||
public override int Execute(CommandContext context)
|
||||
{
|
||||
var fruits = _console.Prompt(
|
||||
new MultiSelectionPrompt<string>()
|
||||
.Title("What are your [green]favorite fruits[/]?")
|
||||
.NotRequired() // Not required to have a favorite fruit
|
||||
.PageSize(10)
|
||||
.MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]")
|
||||
.InstructionsText(
|
||||
"[grey](Press [blue]<space>[/] to toggle a fruit, " +
|
||||
"[green]<enter>[/] to accept)[/]")
|
||||
.AddChoices(new[] {
|
||||
"Apple", "Apricot", "Avocado",
|
||||
"Banana", "Blackcurrant", "Blueberry",
|
||||
"Cherry", "Cloudberry", "Coconut",
|
||||
}));
|
||||
|
||||
var fruit = _console.Prompt(
|
||||
new SelectionPrompt<string>()
|
||||
.Title("What's your [green]favorite fruit[/]?")
|
||||
.PageSize(10)
|
||||
.MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]")
|
||||
.AddChoices(new[] {
|
||||
"Apple", "Apricot", "Avocado",
|
||||
"Banana", "Blackcurrant", "Blueberry",
|
||||
"Cherry", "Cloudberry", "Cocunut",
|
||||
}));
|
||||
|
||||
var name = _console.Ask<string>("What's your name?");
|
||||
|
||||
_console.WriteLine($"[{string.Join(',', fruits)};{fruit};{name}]");
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void InteractiveCommand_WithMockedUserInputs_ProducesExpectedOutput()
|
||||
{
|
||||
// Given
|
||||
TestConsole console = new();
|
||||
console.Interactive();
|
||||
|
||||
// Your mocked inputs must always end with "Enter" for each prompt!
|
||||
|
||||
// Multi selection prompt: Choose first option
|
||||
console.Input.PushKey(ConsoleKey.Spacebar);
|
||||
console.Input.PushKey(ConsoleKey.Enter);
|
||||
|
||||
// Selection prompt: Choose second option
|
||||
console.Input.PushKey(ConsoleKey.DownArrow);
|
||||
console.Input.PushKey(ConsoleKey.Enter);
|
||||
|
||||
// Ask text prompt: Enter name
|
||||
console.Input.PushTextWithEnter("Spectre Console");
|
||||
|
||||
var app = new CommandAppTester(null, new CommandAppTesterSettings(), console);
|
||||
app.SetDefaultCommand<InteractiveCommand>();
|
||||
|
||||
// When
|
||||
var result = app.Run();
|
||||
|
||||
// Then
|
||||
result.ExitCode.ShouldBe(0);
|
||||
result.Output.EndsWith("[Apple;Apricot;Spectre Console]");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user