diff --git a/CliFx.Tests/ArgumentBindingSpecs.cs b/CliFx.Tests/ArgumentBindingSpecs.cs index a100b25..14cbfc4 100644 --- a/CliFx.Tests/ArgumentBindingSpecs.cs +++ b/CliFx.Tests/ArgumentBindingSpecs.cs @@ -894,6 +894,31 @@ namespace CliFx.Tests }); } + [Fact] + public void Scalar_properties_annotated_as_parameter_requires_input() + { + // Arrange + var input = new CommandInputBuilder() + .Build(); + + // Act & assert + var ex = Assert.Throws(() => CommandHelper.ResolveCommand(input)); + _output.WriteLine(ex.Message); + } + + [Fact] + public void NonScalar_properties_annotated_as_parameter_requires_input() + { + // Arrange + var input = new CommandInputBuilder() + .AddParameter("foo") + .AddParameter("bar") + .Build(); + + var ex = Assert.Throws(() => CommandHelper.ResolveCommand(input)); + _output.WriteLine(ex.Message); + } + [Fact] public void Property_annotated_as_parameter_must_always_be_bound_to_some_value() { diff --git a/CliFx/Domain/CommandSchema.cs b/CliFx/Domain/CommandSchema.cs index 99df332..73300ec 100644 --- a/CliFx/Domain/CommandSchema.cs +++ b/CliFx/Domain/CommandSchema.cs @@ -103,7 +103,10 @@ namespace CliFx.Domain if (nonScalarParameter != null) { - // TODO: Should it verify that at least one value is passed? + // Verify that we have at least one value + if(!parameterInputs.Skip(scalarParameters.Length).Any()) + throw CliFxException.ParameterNotSet(nonScalarParameter); + var nonScalarValues = parameterInputs .Skip(scalarParameters.Length) .Select(p => p.Value)