public void Help_ShouldReturnCommandSetup()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <Command1Options>(parser)));

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.Help("helpText").Should().Be(setup);
        }
        public void ExampleUsage_ShouldReturnCommandSetup()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <Command1Options>(parser)));

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.ExampleUsage("newExampleUsage").Should().Be(setup);
        }
        public void Validate_ShouldReturnCommandSetup()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <Command1Options>(parser)));
            var validator     = A.Fake <Action <CommandValidatorContext <Command1Options> > >();

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.Validate(validator).Should().Be(setup);
        }
        public void Help_ShouldAssignHelpTextToCommandParser()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <Command1Options>(parser)));

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.Help("newHelpText");

            A.CallToSet(() => commandParser.CommandHelp).To("newHelpText").MustHaveHappened();
        }
        public void ExampleUsage_ShouldAssignExampleUsageToCommandParser()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <Command1Options>(parser)));

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.ExampleUsage("newExampleUsage");

            A.CallToSet(() => commandParser.CommandExampleUsage).To("newExampleUsage").MustHaveHappened();
        }
        public void Name_ShouldReturnCommandSetup()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >();

            A.CallTo(() => parser.CanCommandParserUseCommandName(commandParser, "name")).Returns(true);

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.Name("name").Should().Be(setup);
        }
        public void Validate_ShouldAssignValidatorToCommandParser()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <Command1Options>(parser)));
            var validator     = A.Fake <Action <CommandValidatorContext <Command1Options> > >();

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.Validate(validator);

            A.CallToSet(() => commandParser.Validator).To(validator).MustHaveHappened();
        }
        public void Name_ShouldAssignNameToCommandParser()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >();

            A.CallTo(() => parser.CanCommandParserUseCommandName(commandParser, "newCommandName")).Returns(true);

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.Name("newCommandName");

            A.CallToSet(() => commandParser.CommandName).To("newCommandName").MustHaveHappened();
        }
        public void Name_DuplicateName_ShouldThrowException()
        {
            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <Command1Options> >();

            A.CallTo(() => parser.CanCommandParserUseCommandName(commandParser, "command2")).Returns(false);

            var setup = new NamedCommandSetup <Command1Options>(parser, commandParser);

            setup.Invoking(a => a.Name("command2"))
            .Should()
            .Throw <ArgumentException>()
            .WithMessage(@"The given command name 'command2' is already in use by another command. Please use a different name.
Parameter name: name");

            A.CallTo(() => parser.CanCommandParserUseCommandName(commandParser, "command2")).MustHaveHappened();
        }
        public void Option_TimeSpanTargetProperty_ShouldReturnANewTimeSpanOptionSetup()
        {
            var targetProperty = typeof(DataTypesCommandOptions).GetProperty("TimeSpan");

            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <DataTypesCommandOptions> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <DataTypesCommandOptions>(parser)));
            var optionParser  = A.Fake <TimeSpanOptionParser>(ob => ob.WithArgumentsForConstructor(() => new TimeSpanOptionParser(targetProperty, "timeSpan")));
            var optionSetup   = A.Fake <TimeSpanOptionSetup <DataTypesCommandOptions> >(ob => ob.WithArgumentsForConstructor(() => new TimeSpanOptionSetup <DataTypesCommandOptions>(commandParser, optionParser)));

            var setup = new NamedCommandSetup <DataTypesCommandOptions>(parser, commandParser);

            A.CallTo(() => commandParser.GetOrCreateOptionParser <TimeSpanOptionParser>(targetProperty)).Returns(optionParser);
            A.CallTo(() => this.DependencyResolver.Resolve <TimeSpanOptionSetup <DataTypesCommandOptions> >(commandParser, optionParser)).Returns(optionSetup);

            Expression <Func <DataTypesCommandOptions, TimeSpan> > propertyExpression = a => a.TimeSpan;

            setup.Option(propertyExpression).Should().Be(optionSetup);

            A.CallTo(() => commandParser.GetOrCreateOptionParser <TimeSpanOptionParser>(targetProperty)).MustHaveHappened();
            A.CallTo(() => this.DependencyResolver.Resolve <TimeSpanOptionSetup <DataTypesCommandOptions> >(commandParser, optionParser)).MustHaveHappened();
        }
        public void Option_NullableEnumTargetProperty_ShouldReturnANewEnumOptionSetup()
        {
            var targetProperty = typeof(DataTypesCommandOptions).GetProperty("NullableEnum");

            var parser        = A.Fake <Parser>();
            var commandParser = A.Fake <CommandParser <DataTypesCommandOptions> >(ob => ob.WithArgumentsForConstructor(() => new CommandParser <DataTypesCommandOptions>(parser)));
            var optionParser  = A.Fake <EnumOptionParser <LogLevel> >(ob => ob.WithArgumentsForConstructor(() => new EnumOptionParser <LogLevel>(targetProperty, "nullableEnum")));
            var optionSetup   = A.Fake <EnumOptionSetup <DataTypesCommandOptions, LogLevel> >(ob => ob.WithArgumentsForConstructor(() => new EnumOptionSetup <DataTypesCommandOptions, LogLevel>(commandParser, optionParser)));

            var setup = new NamedCommandSetup <DataTypesCommandOptions>(parser, commandParser);

            A.CallTo(() => commandParser.GetOrCreateOptionParser <EnumOptionParser <LogLevel> >(targetProperty)).Returns(optionParser);
            A.CallTo(() => this.DependencyResolver.Resolve <EnumOptionSetup <DataTypesCommandOptions, LogLevel> >(commandParser, optionParser)).Returns(optionSetup);

            Expression <Func <DataTypesCommandOptions, Nullable <LogLevel> > > propertyExpression = a => a.NullableEnum;

            setup.Option(propertyExpression).Should().Be(optionSetup);

            A.CallTo(() => commandParser.GetOrCreateOptionParser <EnumOptionParser <LogLevel> >(targetProperty)).MustHaveHappened();
            A.CallTo(() => this.DependencyResolver.Resolve <EnumOptionSetup <DataTypesCommandOptions, LogLevel> >(commandParser, optionParser)).MustHaveHappened();
        }