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); } } }
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); }
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); }
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]); }