From 75a23006bc62184aa108bbfad28a7e2e10c67ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Luthi?= Date: Wed, 6 May 2026 16:32:46 +0200 Subject: [PATCH 1/2] Add test for pair deconstruction with default values Currently crashes with System.ArgumentNullException: Value cannot be null. (Parameter 'value') --- .../CommandAppTests.Pairs.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Spectre.Console.Cli.Tests/CommandAppTests.Pairs.cs b/src/Spectre.Console.Cli.Tests/CommandAppTests.Pairs.cs index 38d58ba..a9e2435 100644 --- a/src/Spectre.Console.Cli.Tests/CommandAppTests.Pairs.cs +++ b/src/Spectre.Console.Cli.Tests/CommandAppTests.Pairs.cs @@ -52,6 +52,13 @@ public sealed class ReadOnlyDictionarySettings : CommandSettings public IReadOnlyDictionary? Values { get; set; } } + public sealed class DefaultValuesSettings : CommandSettings + { + [CommandOption("--var ")] + [DefaultValue(new[] { "Monday=1", "Tuesday=2" })] + public IReadOnlyDictionary? Values { get; set; } + } + public sealed class StringIntDeconstructor : PairDeconstructor { protected override (string Key, string Value) Deconstruct(string? value) @@ -312,5 +319,30 @@ public void Should_Map_ReadOnly_Dictionary_Values() pair.Values["baz"].ShouldBe("qux"); }); } + + [Fact] + public void Should_Map_Default_Values() + { + // Given + var app = new CommandAppTester(); + app.SetDefaultCommand>(); + app.Configure(config => + { + config.PropagateExceptions(); + }); + + // When + var result = app.Run(); + + // Then + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(pair => + { + pair.Values.ShouldNotBeNull(); + pair.Values.Count.ShouldBe(2); + pair.Values[DayOfWeek.Monday].ShouldBe(1); + pair.Values[DayOfWeek.Tuesday].ShouldBe(2); + }); + } } } \ No newline at end of file From acdd222dec8d13456c36de4cf4b465a0fa238194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Luthi?= Date: Wed, 6 May 2026 16:35:37 +0200 Subject: [PATCH 2/2] Fix pair deconstruction with default values Fixes #75 --- .../Internal/Binding/CommandValueBinder.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Spectre.Console.Cli/Internal/Binding/CommandValueBinder.cs b/src/Spectre.Console.Cli/Internal/Binding/CommandValueBinder.cs index 8dfbee4..0c9541d 100644 --- a/src/Spectre.Console.Cli/Internal/Binding/CommandValueBinder.cs +++ b/src/Spectre.Console.Cli/Internal/Binding/CommandValueBinder.cs @@ -54,10 +54,13 @@ private object GetLookup(CommandParameter parameter, ITypeResolver resolver, obj } // Deconstruct and add to multimap. - var pair = deconstructor.Deconstruct(resolver, genericTypes[0], genericTypes[1], value as string); - if (pair.Key != null) + foreach (var text in value as IEnumerable ?? [ value as string ]) { - multimap.Add(pair); + var pair = deconstructor.Deconstruct(resolver, genericTypes[0], genericTypes[1], text); + if (pair.Key != null) + { + multimap.Add(pair); + } } return multimap;