private void AddParameters(Type type, CommandDescriptor.Builder builder)
        {
            var properties = type.GetProperties();

            foreach (var property in properties)
            {
                var requiredAttribute = property.GetCustomAttribute(typeof(RequiredAttribute), true);
                var descriptions      = ExtractDescriptions(property);

                var attribute = property.GetCustomAttribute(typeof(NumberedParameterAttribute), true);
                if (attribute != null)
                {
                    var numberedParameterAttribute = attribute as NumberedParameterAttribute;
                    var descriptor = new NumberedParameterDescriptor(
                        numberedParameterAttribute.Number,
                        numberedParameterAttribute.PlaceholderText,
                        property,
                        descriptions,
                        requiredAttribute != null
                        );
                    builder.AddNumberedParameter(descriptor);
                }

                attribute = property.GetCustomAttribute(typeof(NamedParameterAttribute), true);
                if (attribute != null)
                {
                    var namedParameterAttribute = attribute as NamedParameterAttribute;
                    var descriptor = new NamedParameterDescriptor(
                        namedParameterAttribute.Name,
                        namedParameterAttribute.ValuePlaceholderText,
                        property,
                        descriptions,
                        requiredAttribute != null
                        );
                    builder.AddNamedParameter(descriptor);
                }

                attribute = property.GetCustomAttribute(typeof(FlagParameterAttribute), true);
                if (attribute != null)
                {
                    if (requiredAttribute != null)
                    {
                        var typeName     = type.FullName;
                        var propertyPath = $"{typeName}.{property.Name}";
                        throw new InvalidParameterDefinitionException(property, string.Format(Texts.FlagParametersCannotBeRequired, propertyPath));
                    }

                    var flagParameterAttribute = attribute as FlagParameterAttribute;
                    var descriptor             = new FlagParameterDescriptor(
                        flagParameterAttribute.Name,
                        property,
                        descriptions,
                        requiredAttribute != null
                        );
                    builder.AddFlagParameter(descriptor);
                }
            }
        }
Example #2
0
        private CommandDescriptor CreateSampleCommand2Descriptor()
        {
            var descriptions = new LocalisedTexts();

            descriptions.AddText("description", "en");

            var builder = new CommandDescriptor.Builder("sample2", typeof(SampleCommand2), descriptions);

            return(builder.Build());
        }
Example #3
0
        public void AddNamedParameter_DescriptorIsNull_ThrowsException()
        {
            // arrange
            var    sut       = new CommandDescriptor.Builder("command", GetType(), Substitute.For <ITextResolver>());
            Action sutAction = () => sut.AddNamedParameter(null);

            // act, assert
            var ex = Assert.Throws <ArgumentNullException>(sutAction);

            Assert.Equal("descriptor", ex.ParamName);
        }
Example #4
0
        public void Build_WhenCalled_ReturnsCommandDescriptor()
        {
            // arrange
            var sut = new CommandDescriptor.Builder("command", GetType(), Substitute.For <ITextResolver>());

            // act
            var commandDescriptor = sut.Build();

            // assert
            Assert.Equal("command", commandDescriptor.CommandName);
            Assert.Equal(commandDescriptor.ImplementingType, GetType());
            Assert.Empty(commandDescriptor.NumberedParameters);
            Assert.Empty(commandDescriptor.NamedParameters);
        }
Example #5
0
        public void GetDescription_CultureIsNull_ThrowsException()
        {
            // arrange
            var texts = Substitute.For <ITextResolver>();

            texts.GetText("en").Returns("text");

            var    builder   = new CommandDescriptor.Builder("command", GetType(), texts);
            var    sut       = builder.Build();
            Action sutAction = () => sut.GetDescription(null);

            // act, assert
            var ex = Assert.Throws <ArgumentNullException>(sutAction);

            Assert.Equal("cultureName", ex.ParamName);
        }
Example #6
0
        public void GetDescription_DescriptionHasBeenSet_ReturnsDescription()
        {
            // arrange
            var texts = Substitute.For <ITextResolver>();

            texts.GetText("en").Returns("text");

            var builder = new CommandDescriptor.Builder("command", GetType(), texts);
            var sut     = builder.Build();

            // act
            var result = sut.GetDescription("en");

            // assert
            Assert.Equal("text", result);
        }
Example #7
0
        public void AddNumberedParameter_DescriptorAlreadyAdded_ThrowsException()
        {
            // arrange
            var sut         = new CommandDescriptor.Builder("command", GetType(), Substitute.For <ITextResolver>());
            var property    = CreateProperty();
            var descriptor1 = new NumberedParameterDescriptor(1, "ph", property, Substitute.For <ITextResolver>(), false);
            var descriptor2 = new NumberedParameterDescriptor(1, "ph", property, Substitute.For <ITextResolver>(), false);

            sut.AddNumberedParameter(descriptor1);
            Action sutAction = () => sut.AddNumberedParameter(descriptor2);

            // act, assert
            var ex = Assert.Throws <InvalidOperationException>(sutAction);

            Assert.Contains("Descriptor '1' has already been added.", ex.Message);
        }
Example #8
0
        public void Build_AfterFlagParameterAdded_ReturnsCommandDescriptorWithFlagParameter()
        {
            // arrange
            var sut        = new CommandDescriptor.Builder("command", GetType(), Substitute.For <ITextResolver>());
            var property   = CreateProperty();
            var descriptor = new FlagParameterDescriptor("name", property, Substitute.For <ITextResolver>(), false);

            sut.AddFlagParameter(descriptor);

            // act
            var commandDescriptor = sut.Build();

            // assert
            Assert.Equal(1, commandDescriptor.FlagParameters.Count);
            Assert.Equal(descriptor, commandDescriptor.FlagParameters[0]);
        }
        public CommandDescriptor DescribeCommand(Type commandType)
        {
            if (commandType == null)
            {
                throw new ArgumentNullException(nameof(commandType));
            }

            var commandAttribute = ExtractCommandAttribute(commandType);

            if (commandAttribute == null)
            {
                throw new TypeNotACommandException(commandType);
            }

            var descriptions = ExtractDescriptions(commandType);

            var builder = new CommandDescriptor.Builder(commandAttribute.CommandName, commandType, descriptions);

            AddParameters(commandType, builder);

            return(builder.Build());
        }