public async Task Help_text_shows_all_immediate_child_commands_of_each_child_command() { // Arrange var commandTypes = DynamicCommandBuilder.CompileMany( // language=cs @" [Command(""cmd1"")] public class FirstCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd1 child1"")] public class FirstCommandFirstChildCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd2"")] public class SecondCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd2 child11"")] public class SecondCommandFirstChildCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd2 child2"")] public class SecondCommandSecondChildCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } "); var application = new CliApplicationBuilder() .AddCommands(commandTypes) .UseConsole(FakeConsole) .Build(); // Act var exitCode = await application.RunAsync( new[] { "--help" }, new Dictionary <string, string>() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Should().ContainAllInOrder( "COMMANDS", "cmd1", "Subcommands:", "cmd1 child1", "cmd2", "Subcommands:", "cmd2 child1", "cmd2 child2" ); }
public async Task Specific_named_command_is_executed_if_provided_arguments_match_its_name() { // Arrange var commandTypes = DynamicCommandBuilder.CompileMany( // language=cs @" [Command] public class DefaultCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { console.Output.WriteLine(""default""); return default; } } [Command(""cmd"")] public class NamedCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { console.Output.WriteLine(""cmd""); return default; } } [Command(""cmd child"")] public class NamedChildCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) { console.Output.WriteLine(""cmd child""); return default; } } "); var application = new CliApplicationBuilder() .AddCommands(commandTypes) .UseConsole(FakeConsole) .Build(); // Act var exitCode = await application.RunAsync( new[] { "cmd" }, new Dictionary <string, string>() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Trim().Should().Be("cmd"); }
public async Task Help_text_shows_all_immediate_child_commands() { // Arrange var commandTypes = DynamicCommandBuilder.CompileMany( // language=cs @" [Command(""cmd1"", Description = ""Description of one command."")] public class FirstCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd2"", Description = ""Description of another command."")] public class SecondCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd2 child"", Description = ""Description of another command's child command."")] public class SecondCommandChildCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } "); var application = new CliApplicationBuilder() .AddCommands(commandTypes) .UseConsole(FakeConsole) .Build(); // Act var exitCode = await application.RunAsync( new[] { "--help" }, new Dictionary <string, string>() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Should().ContainAllInOrder( "COMMANDS", "cmd1", "Description of one command.", "cmd2", "Description of another command." ); // `cmd2 child` will still appear in the list of `cmd2` subcommands, // but its description will not be seen. stdOut.Should().NotContain( "Description of another command's child command." ); }
public async Task Help_text_for_a_specific_named_child_command_is_printed_if_provided_arguments_match_its_name_and_contain_the_help_option() { // Arrange var commandTypes = DynamicCommandBuilder.CompileMany( // language=cs @" [Command] public class DefaultCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd"")] public class NamedCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd child"", Description = ""Description of a named child command."")] public class NamedChildCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } "); var application = new CliApplicationBuilder() .AddCommands(commandTypes) .UseConsole(FakeConsole) .Build(); // Act var exitCode = await application.RunAsync( new[] { "cmd", "sub", "--help" }, new Dictionary <string, string>() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Should().Contain("Description of a named child command."); }
public async Task Help_text_shows_usage_format_which_indicates_how_to_execute_a_named_command() { // Arrange var commandTypes = DynamicCommandBuilder.CompileMany( // language=cs @" [Command] public class DefaultCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd"")] public class NamedCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } "); var application = new CliApplicationBuilder() .AddCommands(commandTypes) .UseConsole(FakeConsole) .Build(); // Act var exitCode = await application.RunAsync( new[] { "--help" }, new Dictionary <string, string>() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Should().ContainAllInOrder( "USAGE", "[command]", "[...]" ); }
public async Task Help_text_is_printed_if_provided_arguments_contain_the_help_option_even_if_the_default_command_is_not_defined() { // Arrange var commandTypes = DynamicCommandBuilder.CompileMany( // language=cs @" [Command(""cmd"")] public class NamedCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } [Command(""cmd child"")] public class NamedChildCommand : ICommand { public ValueTask ExecuteAsync(IConsole console) => default; } "); var application = new CliApplicationBuilder() .AddCommands(commandTypes) .UseConsole(FakeConsole) .SetDescription("This will be in help text") .Build(); // Act var exitCode = await application.RunAsync( new[] { "--help" }, new Dictionary <string, string>() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Should().Contain("This will be in help text"); }