using System; using System.Collections.Generic; using System.Threading.Tasks; using CliFx.Tests.Utils; using FluentAssertions; using Xunit; using Xunit.Abstractions; namespace CliFx.Tests { public class RoutingSpecs : SpecsBase { public RoutingSpecs(ITestOutputHelper testOutput) : base(testOutput) { } [Fact] public async Task Default_command_is_executed_if_provided_arguments_do_not_match_any_named_command() { // 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( Array.Empty(), new Dictionary() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Trim().Should().Be("default"); } [Fact] 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() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Trim().Should().Be("cmd"); } [Fact] public async Task Specific_named_child_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", "child"}, new Dictionary() ); var stdOut = FakeConsole.ReadOutputString(); // Assert exitCode.Should().Be(0); stdOut.Trim().Should().Be("cmd child"); } } }