diff --git a/src/System.CommandLine.Tests/Help/HelpBuilderTests.cs b/src/System.CommandLine.Tests/Help/HelpBuilderTests.cs index 342907d5db..1126365073 100644 --- a/src/System.CommandLine.Tests/Help/HelpBuilderTests.cs +++ b/src/System.CommandLine.Tests/Help/HelpBuilderTests.cs @@ -1350,6 +1350,27 @@ public void Help_describes_default_value_for_option_with_argument_having_default help.Should().Contain($"[default: the-arg-value]"); } + [Fact] + public void Help_describes_default_value_for_boolean_option_when_default_value_is_true() + { + var command = new Command("the-command", "command help") + { + new Option("--bool-default") + { + Description = "Bool value with default", + DefaultValueFactory = _ => true + } + }; + + HelpBuilder helpBuilder = GetHelpBuilder(SmallMaxWidth); + + helpBuilder.Write(command, _console); + + var help = _console.ToString(); + + help.Should().Contain("--bool-default").And.Contain("[default: true]"); + } + [Fact] public void Option_arguments_with_default_values_that_are_enumerable_display_pipe_delimited_list() { diff --git a/src/System.CommandLine/Help/HelpBuilder.Default.cs b/src/System.CommandLine/Help/HelpBuilder.Default.cs index 6dd03f433c..00364784dd 100644 --- a/src/System.CommandLine/Help/HelpBuilder.Default.cs +++ b/src/System.CommandLine/Help/HelpBuilder.Default.cs @@ -24,16 +24,18 @@ public static string GetArgumentDefaultValue(Symbol symbol) return symbol switch { Argument argument => ShouldShowDefaultValue(argument) - ? ToString(argument.GetDefaultValue()) + ? ToString(argument.GetDefaultValue(), argument.ValueType) : "", Option option => ShouldShowDefaultValue(option) - ? ToString(option.GetDefaultValue()) + ? ToString(option.GetDefaultValue(), option.ValueType) : "", _ => throw new InvalidOperationException("Symbol must be an Argument or Option.") }; - static string ToString(object? value) => value switch + static string ToString(object? value, Type valueType) => value switch { + _ when (valueType == typeof(bool) || valueType == typeof(bool?)) && value is not true => string.Empty, + bool boolValue => boolValue ? "true" : "false", null => string.Empty, string str => str, IEnumerable enumerable => string.Join("|", enumerable.Cast()), @@ -50,12 +52,10 @@ public static bool ShouldShowDefaultValue(Symbol symbol) => }; public static bool ShouldShowDefaultValue(Option option) => - option.HasDefaultValue && - !(option.ValueType == typeof(bool) || option.ValueType == typeof(bool?)); + option.HasDefaultValue; public static bool ShouldShowDefaultValue(Argument argument) => - argument.HasDefaultValue && - !(argument.ValueType == typeof(bool) || argument.ValueType == typeof(bool?)); + argument.HasDefaultValue; /// /// Gets the description for an argument (typically used in the second column text in the arguments section). @@ -289,4 +289,4 @@ public static Func OptionsSection() => public static Func AdditionalArgumentsSection() => ctx => ctx.HelpBuilder.WriteAdditionalArguments(ctx); } -} \ No newline at end of file +} diff --git a/src/System.CommandLine/Help/HelpBuilder.cs b/src/System.CommandLine/Help/HelpBuilder.cs index af6046d898..eccbd7a668 100644 --- a/src/System.CommandLine/Help/HelpBuilder.cs +++ b/src/System.CommandLine/Help/HelpBuilder.cs @@ -475,10 +475,9 @@ string GetOptionOrCommandDefaultValue() } var isSingleArgument = defaultArguments.Length == 1; - var argumentDefaultValues = string.Join( - ", ", - defaultArguments - .Select(argument => GetArgumentDefaultValue(symbol, argument, isSingleArgument, context))); + var argumentDefaultValues = string.Join(", ", defaultArguments + .Select(argument => GetArgumentDefaultValue(symbol, argument, isSingleArgument, context)) + .Where(defaultValue => !string.IsNullOrEmpty(defaultValue))); return string.IsNullOrEmpty(argumentDefaultValues) ? ""