public void PropertyMustHaveCompatibleTypeToBeBoundAgainst()
        {
            InvalidCommand       command = new();
            CommandLineArguments args    = CreateArgs("F0");

            Assert.Throws <UnsupportedCommandArgumentsTypeException>(() => CommandArgumentsBinder.BindArguments(command, args));
        }
        public void CommandDoesNotRequireMatchIfNoArgumentsAreProvided()
        {
            NullCommand          command = new();
            CommandLineArguments args    = CreateArgs();

            CommandArgumentsBinder.BindArguments(command, args);
        }
        public void CommandCannotHaveMultipleConventionalMatchesForArguments()
        {
            AmbiguousCommand     command = new();
            CommandLineArguments args    = CreateArgs("F0");

            Assert.Throws <AmbiguousCommandArgumentsException>(() => CommandArgumentsBinder.BindArguments(command, args));
        }
        public void CommandRequiresMatchIfArgumentsAreProvided()
        {
            NullCommand          command = new();
            CommandLineArguments args    = CreateArgs("F0");

            Assert.Throws <CommandArgumentsNotFoundException>(() => CommandArgumentsBinder.BindArguments(command, args));
        }
        public void NullCheck()
        {
            NullCommand          command = new();
            CommandLineArguments args    = CreateArgs();

            Assert.Throws <ArgumentNullException>("command", () => CommandArgumentsBinder.BindArguments(null, args));
            Assert.Throws <ArgumentNullException>("args", () => CommandArgumentsBinder.BindArguments(command, null));
        }
        public void ArgumentsAreBoundToConventionallyNamedPropertyOfTypeCollectionOfStrings()
        {
            Command command           = new();
            CommandLineArguments args = CreateArgs("2", "4", "0");

            Assert.Null(command.Arguments);
            CommandArgumentsBinder.BindArguments(command, args);
            Assert.Equal(new string[] { "2", "4", "0" }, command.Arguments);
        }
        private static async Task <CommandResult> RunCommandPipelineAsync(ReadOnlyCollection <string> commandLineArguments, Assembly commandAssembly, IServiceProvider provider, CancellationToken stoppingToken)
        {
            CommandLineArguments args = CommandLineArgumentsParser.Parse(commandLineArguments);
            Type type = CommandSelector.SelectCommand(commandAssembly, args);

            using CommandBase instance = CommandActivator.ConstructCommand(provider, type);
            CommandArgumentsBinder.BindArguments(instance, args);
            CommandOptionsBinder.BindOptions(instance, args);

            CommandResult result = await CommandExecutor.InvokeAsync(instance, stoppingToken);

            return(result);
        }