From 512bd0c6a17f6efcf9d14710a0b8fda6a511d0fb Mon Sep 17 00:00:00 2001 From: Francois Botha Date: Mon, 8 Sep 2014 11:59:56 +0200 Subject: [PATCH 1/3] Makes boolean options falsible --- src/libcmdline/Parsing/OptionGroupParser.cs | 89 +++++++++++---------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/src/libcmdline/Parsing/OptionGroupParser.cs b/src/libcmdline/Parsing/OptionGroupParser.cs index 9199b914..68733297 100644 --- a/src/libcmdline/Parsing/OptionGroupParser.cs +++ b/src/libcmdline/Parsing/OptionGroupParser.cs @@ -49,68 +49,71 @@ public override PresentParserState Parse(IArgumentEnumerator argumentEnumerator, ArgumentParser.EnsureOptionArrayAttributeIsNotBoundToScalar(option); - if (!option.IsBoolean) + if (argumentEnumerator.IsLast && optionGroup.IsLast) { - if (argumentEnumerator.IsLast && optionGroup.IsLast) - { - return PresentParserState.Failure; - } - - bool valueSetting; - if (!optionGroup.IsLast) - { - if (!option.IsArray) - { - valueSetting = option.SetValue(optionGroup.GetRemainingFromNext(), options); - if (!valueSetting) - { - DefineOptionThatViolatesFormat(option); - } - - return ArgumentParser.BooleanToParserState(valueSetting); - } - - ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); - - var items = ArgumentParser.GetNextInputValues(argumentEnumerator); - items.Insert(0, optionGroup.GetRemainingFromNext()); - - valueSetting = option.SetValue(items, options); - if (!valueSetting) - { - DefineOptionThatViolatesFormat(option); - } - - return ArgumentParser.BooleanToParserState(valueSetting, true); - } - - if (!argumentEnumerator.IsLast && !ArgumentParser.IsInputValue(argumentEnumerator.Next)) - { - return PresentParserState.Failure; - } + return PresentParserState.Failure; + } + bool valueSetting; + if (!optionGroup.IsLast) + { if (!option.IsArray) { - valueSetting = option.SetValue(argumentEnumerator.Next, options); + valueSetting = option.SetValue(optionGroup.GetRemainingFromNext(), options); if (!valueSetting) { DefineOptionThatViolatesFormat(option); } - return ArgumentParser.BooleanToParserState(valueSetting, true); + return ArgumentParser.BooleanToParserState(valueSetting); } ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); - var moreItems = ArgumentParser.GetNextInputValues(argumentEnumerator); + var items = ArgumentParser.GetNextInputValues(argumentEnumerator); + items.Insert(0, optionGroup.GetRemainingFromNext()); - valueSetting = option.SetValue(moreItems, options); + valueSetting = option.SetValue(items, options); if (!valueSetting) { DefineOptionThatViolatesFormat(option); } - return ArgumentParser.BooleanToParserState(valueSetting); + return ArgumentParser.BooleanToParserState(valueSetting, true); + } + + if (!option.IsBoolean && !argumentEnumerator.IsLast && !ArgumentParser.IsInputValue(argumentEnumerator.Next)) + { + return PresentParserState.Failure; + } + + if (!option.IsArray) + { + valueSetting = option.SetValue(argumentEnumerator.Next, options); + if (!option.IsBoolean || valueSetting) + { + if (!valueSetting) + { + DefineOptionThatViolatesFormat(option); + } + + return ArgumentParser.BooleanToParserState(valueSetting, true); + } + } + + if (!option.IsBoolean) + { + ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); + + var moreItems = ArgumentParser.GetNextInputValues(argumentEnumerator); + + valueSetting = option.SetValue(moreItems, options); + if (!valueSetting) + { + DefineOptionThatViolatesFormat(option); + } + + return ArgumentParser.BooleanToParserState(valueSetting); } if (!optionGroup.IsLast && map[optionGroup.Next] == null) From 8364325b5a29ea6cf5917ad5b838822bf43f7581 Mon Sep 17 00:00:00 2001 From: Francois Botha Date: Mon, 22 Sep 2014 09:30:32 +0200 Subject: [PATCH 2/3] Fix broken tests --- src/libcmdline/Parsing/OptionGroupParser.cs | 44 ++++++++++++--------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/libcmdline/Parsing/OptionGroupParser.cs b/src/libcmdline/Parsing/OptionGroupParser.cs index 68733297..e8d173f4 100644 --- a/src/libcmdline/Parsing/OptionGroupParser.cs +++ b/src/libcmdline/Parsing/OptionGroupParser.cs @@ -47,9 +47,11 @@ public override PresentParserState Parse(IArgumentEnumerator argumentEnumerator, option.IsDefined = true; - ArgumentParser.EnsureOptionArrayAttributeIsNotBoundToScalar(option); - - if (argumentEnumerator.IsLast && optionGroup.IsLast) + ArgumentParser.EnsureOptionArrayAttributeIsNotBoundToScalar(option); + + //previous place + + if (!option.IsBoolean && argumentEnumerator.IsLast && optionGroup.IsLast) { return PresentParserState.Failure; } @@ -60,26 +62,30 @@ public override PresentParserState Parse(IArgumentEnumerator argumentEnumerator, if (!option.IsArray) { valueSetting = option.SetValue(optionGroup.GetRemainingFromNext(), options); - if (!valueSetting) + if (!valueSetting && !option.IsBoolean) { DefineOptionThatViolatesFormat(option); } - return ArgumentParser.BooleanToParserState(valueSetting); - } - - ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); - - var items = ArgumentParser.GetNextInputValues(argumentEnumerator); - items.Insert(0, optionGroup.GetRemainingFromNext()); - - valueSetting = option.SetValue(items, options); - if (!valueSetting) - { - DefineOptionThatViolatesFormat(option); + if (valueSetting || !option.IsBoolean) + return ArgumentParser.BooleanToParserState(valueSetting); + } + + if (!option.IsBoolean) + { + ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); + + var items = ArgumentParser.GetNextInputValues(argumentEnumerator); + items.Insert(0, optionGroup.GetRemainingFromNext()); + + valueSetting = option.SetValue(items, options); + if (!valueSetting) + { + DefineOptionThatViolatesFormat(option); + } + + return ArgumentParser.BooleanToParserState(valueSetting, true); } - - return ArgumentParser.BooleanToParserState(valueSetting, true); } if (!option.IsBoolean && !argumentEnumerator.IsLast && !ArgumentParser.IsInputValue(argumentEnumerator.Next)) @@ -116,6 +122,8 @@ public override PresentParserState Parse(IArgumentEnumerator argumentEnumerator, return ArgumentParser.BooleanToParserState(valueSetting); } + //old place close + if (!optionGroup.IsLast && map[optionGroup.Next] == null) { return PresentParserState.Failure; From 06fdab34516df66f09c06f5b41121132fc5f45d9 Mon Sep 17 00:00:00 2001 From: Francois Botha Date: Mon, 22 Sep 2014 09:30:51 +0200 Subject: [PATCH 3/3] Add test fixture for falsible boolean --- src/tests/Unit/Parser/ParserFixture.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/tests/Unit/Parser/ParserFixture.cs b/src/tests/Unit/Parser/ParserFixture.cs index fcf15f2d..2d5984cd 100644 --- a/src/tests/Unit/Parser/ParserFixture.cs +++ b/src/tests/Unit/Parser/ParserFixture.cs @@ -531,7 +531,23 @@ public void Parser_should_report_missing_value() options.LastParserState.Errors.Count.Should().BeGreaterThan(0); } - #endregion + #endregion + + [Fact] + public void Parse_falsible_boolean() + { + var options = new BooleanSetOptions(); + var parser = new CommandLine.Parser(); + var result = parser.ParseArguments(new string[] { "-a true", "-c false", "-d65" }, options); + + result.Should().BeTrue(); + options.BooleanOne.Should().BeTrue(); + options.BooleanTwo.Should().BeFalse(); + options.BooleanThree.Should().BeFalse(); + options.NonBooleanValue.Should().Be(65D); + Console.WriteLine(options); + } + } }