diff --git a/source/SysConsole/CreativeCoders.SysConsole.Cli.Parsing/OptionProperties/CliValueConverters.cs b/source/SysConsole/CreativeCoders.SysConsole.Cli.Parsing/OptionProperties/CliValueConverters.cs index 7e332968..6000af8f 100644 --- a/source/SysConsole/CreativeCoders.SysConsole.Cli.Parsing/OptionProperties/CliValueConverters.cs +++ b/source/SysConsole/CreativeCoders.SysConsole.Cli.Parsing/OptionProperties/CliValueConverters.cs @@ -69,7 +69,14 @@ private CliValueConverters() return boolValue; } - var valueConverted = InternalConvert(value, nullableType, optionAttribute); + var valueConverted = nullableType.IsEnum + ? _enumConverter.Convert(value, nullableType, optionAttribute) + : InternalConvert(value, nullableType, optionAttribute); + + if (valueConverted == ConverterAction.DoNothing) + { + return ConverterAction.DoNothing; + } return valueConverted == null ? Activator.CreateInstance(targetType) diff --git a/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/OptionParserTests.cs b/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/OptionParserTests.cs index 39208c10..f758c69d 100644 --- a/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/OptionParserTests.cs +++ b/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/OptionParserTests.cs @@ -360,6 +360,58 @@ public void Parse_EnumValue_PropertyIsSetCorrect(string argValue, TestEnum enumV .Be(enumValue); } + [Theory] + [InlineData("Ok", TestEnum.Ok)] + [InlineData("OK", TestEnum.OK)] + [InlineData("ok", null)] + [InlineData("", null)] + [InlineData("Default", TestEnum.Default)] + [InlineData("default", TestEnum.Default)] + [InlineData("Custom", TestEnum.Custom)] + [InlineData("CUSTOM", TestEnum.Custom)] + [InlineData("Failed", TestEnum.Failed)] + [InlineData("failED", TestEnum.Failed)] + [InlineData("None", TestEnum.None)] + [InlineData("nONe", TestEnum.None)] + public void Parse_NullableEnumValue_PropertyIsSetCorrect(string argValue, TestEnum? enumValue) + { + var args = new[] { "-ne", argValue }; + + var parser = new OptionParser(typeof(TestOptionWithEnum)); + + // Act + var option = parser.Parse(args) as TestOptionWithEnum; + + // Assert + option + .Should() + .NotBeNull(); + + option.NullableEnumValue + .Should() + .Be(enumValue); + } + + [Fact] + public void Parse_NotGivenNullableEnumValue_PropertyIsNull() + { + var args = Array.Empty(); + + var parser = new OptionParser(typeof(TestOptionWithEnum)); + + // Act + var option = parser.Parse(args) as TestOptionWithEnum; + + // Assert + option + .Should() + .NotBeNull(); + + option.NullableEnumValue + .Should() + .Be(null); + } + [Theory] [InlineData("Hello", "World")] [InlineData("World", "Hello")] diff --git a/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/TestData/TestOptionWithEnum.cs b/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/TestData/TestOptionWithEnum.cs index 7be5262b..de564821 100644 --- a/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/TestData/TestOptionWithEnum.cs +++ b/tests/CreativeCoders.SysConsole.Cli.Parsing.UnitTests/TestData/TestOptionWithEnum.cs @@ -6,4 +6,7 @@ namespace CreativeCoders.SysConsole.Cli.Parsing.UnitTests.TestData; public class TestOptionWithEnum { [OptionParameter('e', "enum")] public TestEnum EnumValue { get; set; } + + [OptionParameter("ne", "nullableenum")] + public TestEnum? NullableEnumValue { get; set; } }