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);
                }
            }
        }
示例#2
0
        public void Ctor_WhenCalled_SetsProperties()
        {
            // arrange
            var property     = CreateProperty();
            var textResolver = Substitute.For <ITextResolver>();

            // act
            var sut = new NumberedParameterDescriptor(1, "param", property, textResolver, true);

            // assert
            Assert.Equal(1, sut.Number);
            Assert.Equal("param", sut.PlaceholderText);
            Assert.Equal(property, sut.Property);
            Assert.True(sut.Required);
        }
示例#3
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);
        }
示例#4
0
        public void Build_AfterNumberedParameterAdded_ReturnsCommandDescriptorWithNumberedParameter()
        {
            // arrange
            var sut        = new CommandDescriptor.Builder("command", GetType(), Substitute.For <ITextResolver>());
            var property   = CreateProperty();
            var descriptor = new NumberedParameterDescriptor(1, "ph", property, Substitute.For <ITextResolver>(), false);

            sut.AddNumberedParameter(descriptor);

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

            // assert
            Assert.Equal(1, commandDescriptor.NumberedParameters.Count);
            Assert.Equal(descriptor, commandDescriptor.NumberedParameters[0]);
        }