public async Task RunAsync_Test()
        {
            // Arrange
            var command          = new TestCommand();
            var expectedExitCode = await command.ExecuteAsync();

            var commandOptionParser = new CommandOptionParser();

            var typeProvider           = new TypeProvider(typeof(TestCommand));
            var commandOptionConverter = new CommandOptionConverter();
            var commandResolver        = new CommandResolver(typeProvider, commandOptionConverter);

            var application = new CliApplication(commandOptionParser, commandResolver);

            // Act
            var exitCodeValue = await application.RunAsync();

            // Assert
            Assert.That(exitCodeValue, Is.EqualTo(expectedExitCode.Value), "Exit code");
        }
        public void ParseOptions_Test(IReadOnlyList <string> commandLineArguments, CommandOptionSet expectedCommandOptionSet)
        {
            // Arrange
            var parser = new CommandOptionParser();

            // Act
            var optionSet = parser.ParseOptions(commandLineArguments);

            // Assert
            Assert.Multiple(() =>
            {
                Assert.That(optionSet.CommandName, Is.EqualTo(expectedCommandOptionSet.CommandName), "Command name");
                Assert.That(optionSet.Options.Count, Is.EqualTo(expectedCommandOptionSet.Options.Count), "Option count");

                for (var i = 0; i < optionSet.Options.Count; i++)
                {
                    Assert.That(optionSet.Options[i].Name, Is.EqualTo(expectedCommandOptionSet.Options[i].Name),
                                $"Option[{i}] name");

                    Assert.That(optionSet.Options[i].Values, Is.EqualTo(expectedCommandOptionSet.Options[i].Values),
                                $"Option[{i}] values");
                }
            });
        }