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); } } }
private CommandDescriptor CreateSampleCommand2Descriptor() { var descriptions = new LocalisedTexts(); descriptions.AddText("description", "en"); var builder = new CommandDescriptor.Builder("sample2", typeof(SampleCommand2), descriptions); return(builder.Build()); }
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); }
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); }
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); }
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); }
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_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()); }