diff --git a/src/NetEscapades.EnumGenerators/SourceGenerationHelper.cs b/src/NetEscapades.EnumGenerators/SourceGenerationHelper.cs index 6002d6b..6320e88 100644 --- a/src/NetEscapades.EnumGenerators/SourceGenerationHelper.cs +++ b/src/NetEscapades.EnumGenerators/SourceGenerationHelper.cs @@ -93,6 +93,31 @@ public static string ToStringFast(this ").Append(enumToGenerate.FullyQualifiedNa _ => value.ToString(), };"); + sb.Append(@" + + public static string ToStringFastLowerCase(this ").Append(enumToGenerate.FullyQualifiedName).Append(@" value) + => value switch + {"); + foreach (var member in enumToGenerate.Names) + { + sb.Append(@" + ").Append(enumToGenerate.FullyQualifiedName).Append('.').Append(member.Key) + .Append(" => "); + + if (member.Value.DisplayName is null) + { + sb.Append("\"").Append(member.Key.ToLowerInvariant()).Append("\","); + } + else + { + sb.Append('"').Append(member.Value.DisplayName).Append(@""","); + } + } + + sb.Append(@" + _ => value.ToString().ToLowerInvariant(), + };"); + if (enumToGenerate.HasFlags) { sb.Append(@" @@ -530,4 +555,4 @@ public static string[] GetNames() return sb.ToString(); } -} \ No newline at end of file +} diff --git a/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumInNamespaceExtensionsTests.cs b/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumInNamespaceExtensionsTests.cs index cf89b11..d4b42a0 100644 --- a/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumInNamespaceExtensionsTests.cs +++ b/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumInNamespaceExtensionsTests.cs @@ -30,6 +30,8 @@ public class EnumInNamespaceExtensionsTests : ExtensionTests }; protected override string ToStringFast(EnumInNamespace value) => value.ToStringFast(); + protected override string ToStringFastLowerCase(EnumInNamespace value)=> value.ToStringFastLowerCase(); + protected override bool IsDefined(EnumInNamespace value) => EnumInNamespaceExtensions.IsDefined(value); protected override bool IsDefined(string name, bool allowMatchingMetadataAttribute) => EnumInNamespaceExtensions.IsDefined(name, allowMatchingMetadataAttribute: false); #if NETCOREAPP && !NETCOREAPP2_0 && !NETCOREAPP1_1 && !NETCOREAPP1_0 @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan name, out EnumInNamespace [MemberData(nameof(ValidEnumValues))] public void GeneratesToStringFast(EnumInNamespace value) => GeneratesToStringFastTest(value); + [Theory] + [MemberData(nameof(ValidEnumValues))] + public void GeneratesToStringFastLowerCase(EnumInNamespace value) => GeneratesToStringFastLowerCaseTest(value); + [Theory] [MemberData(nameof(ValidEnumValues))] public void GeneratesIsDefined(EnumInNamespace value) => GeneratesIsDefinedTest(value); @@ -79,4 +85,4 @@ protected override bool TryParse(in ReadOnlySpan name, out EnumInNamespace [Fact] public void GeneratesGetNames() => base.GeneratesGetNamesTest(EnumInNamespaceExtensions.GetNames()); -} \ No newline at end of file +} diff --git a/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithDisplayNameInNamespaceExtensionsTests.cs b/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithDisplayNameInNamespaceExtensionsTests.cs index 8c31945..86ffb4e 100644 --- a/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithDisplayNameInNamespaceExtensionsTests.cs +++ b/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithDisplayNameInNamespaceExtensionsTests.cs @@ -30,6 +30,8 @@ public class EnumWithDisplayNameInNamespaceExtensionsTests : ExtensionTests value.ToStringFast(); + protected override string ToStringFastLowerCase(EnumWithDisplayNameInNamespace value)=> value.ToStringFastLowerCase(); + protected override bool IsDefined(EnumWithDisplayNameInNamespace value) => EnumWithDisplayNameInNamespaceExtensions.IsDefined(value); protected override bool IsDefined(string name, bool allowMatchingMetadataAttribute) => EnumWithDisplayNameInNamespaceExtensions.IsDefined(name, allowMatchingMetadataAttribute); #if NETCOREAPP && !NETCOREAPP2_0 && !NETCOREAPP1_1 && !NETCOREAPP1_0 @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan name, out EnumWithDisplay [MemberData(nameof(ValidEnumValues))] public void GeneratesToStringFast(EnumWithDisplayNameInNamespace value) => GeneratesToStringFastTest(value); + [Theory] + [MemberData(nameof(ValidEnumValues))] + public void GeneratesToStringFastLowerCase(EnumWithDisplayNameInNamespace value) => GeneratesToStringFastLowerCaseTest(value); + [Theory] [MemberData(nameof(ValidEnumValues))] public void GeneratesIsDefined(EnumWithDisplayNameInNamespace value) => GeneratesIsDefinedTest(value); @@ -115,4 +121,4 @@ protected override bool TryParse(in ReadOnlySpan name, out EnumWithDisplay [Fact] public void GeneratesGetNames() => base.GeneratesGetNamesTest(EnumWithDisplayNameInNamespaceExtensions.GetNames()); -} \ No newline at end of file +} diff --git a/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithSameDisplayNameExtensionsTests.cs b/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithSameDisplayNameExtensionsTests.cs index de2bfe4..afb9c29 100644 --- a/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithSameDisplayNameExtensionsTests.cs +++ b/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumWithSameDisplayNameExtensionsTests.cs @@ -30,6 +30,8 @@ public class EnumWithSameDisplayNameExtensionsTests : ExtensionTests value.ToStringFast(); + protected override string ToStringFastLowerCase(EnumWithSameDisplayName value)=> value.ToStringFastLowerCase(); + protected override bool IsDefined(EnumWithSameDisplayName value) => EnumWithSameDisplayNameExtensions.IsDefined(value); protected override bool IsDefined(string name, bool allowMatchingMetadataAttribute) => EnumWithSameDisplayNameExtensions.IsDefined(name, allowMatchingMetadataAttribute); #if NETCOREAPP && !NETCOREAPP2_0 && !NETCOREAPP1_1 && !NETCOREAPP1_0 @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan name, out EnumWithSameDis [MemberData(nameof(ValidEnumValues))] public void GeneratesToStringFast(EnumWithSameDisplayName value) => GeneratesToStringFastTest(value); + [Theory] + [MemberData(nameof(ValidEnumValues))] + public void GeneratesToStringFastLowerCase(EnumWithSameDisplayName value) => GeneratesToStringFastLowerCaseTest(value); + [Theory] [MemberData(nameof(ValidEnumValues))] public void GeneratesIsDefined(EnumWithSameDisplayName value) => GeneratesIsDefinedTest(value); @@ -115,4 +121,4 @@ protected override bool TryParse(in ReadOnlySpan name, out EnumWithSameDis [Fact] public void GeneratesGetNames() => base.GeneratesGetNamesTest(EnumWithSameDisplayNameExtensions.GetNames()); -} \ No newline at end of file +} diff --git a/tests/NetEscapades.EnumGenerators.IntegrationTests/ExtensionTests.cs b/tests/NetEscapades.EnumGenerators.IntegrationTests/ExtensionTests.cs index 91b41f9..7a3e4d2 100644 --- a/tests/NetEscapades.EnumGenerators.IntegrationTests/ExtensionTests.cs +++ b/tests/NetEscapades.EnumGenerators.IntegrationTests/ExtensionTests.cs @@ -10,6 +10,7 @@ namespace NetEscapades.EnumGenerators.IntegrationTests; public abstract class ExtensionTests where T : struct { protected abstract string ToStringFast(T value); + protected abstract string ToStringFastLowerCase(T value); protected abstract bool IsDefined(T value); protected abstract bool IsDefined(string name, bool allowMatchingMetadataAttribute = false); #if NETCOREAPP && !NETCOREAPP2_0 && !NETCOREAPP1_1 && !NETCOREAPP1_0 @@ -27,7 +28,18 @@ protected void GeneratesToStringFastTest(T value) TryGetDisplayName(valueAsString, out var displayName); var expectedValue = displayName is null ? valueAsString : displayName; - + + serialized.Should().Be(expectedValue); + } + + protected void GeneratesToStringFastLowerCaseTest(T value) + { + var serialized = ToStringFastLowerCase(value); + var valueAsString = value.ToString()!.ToLowerInvariant(); + + TryGetDisplayName(valueAsString, out var displayName); + var expectedValue = displayName is null ? valueAsString : displayName; + serialized.Should().Be(expectedValue); } @@ -164,7 +176,7 @@ private bool TryGetDisplayName( { return false; } - + return true; } } @@ -172,4 +184,4 @@ private bool TryGetDisplayName( return false; } -} \ No newline at end of file +} diff --git a/tests/NetEscapades.EnumGenerators.IntegrationTests/FlagsEnumExtensionsTests.cs b/tests/NetEscapades.EnumGenerators.IntegrationTests/FlagsEnumExtensionsTests.cs index e2cec8e..4e37bf9 100644 --- a/tests/NetEscapades.EnumGenerators.IntegrationTests/FlagsEnumExtensionsTests.cs +++ b/tests/NetEscapades.EnumGenerators.IntegrationTests/FlagsEnumExtensionsTests.cs @@ -32,6 +32,8 @@ public class FlagsEnumExtensionsTests : ExtensionTests }; protected override string ToStringFast(FlagsEnum value) => value.ToStringFast(); + protected override string ToStringFastLowerCase(FlagsEnum value) => value.ToStringFast(); + protected override bool IsDefined(FlagsEnum value) => FlagsEnumExtensions.IsDefined(value); protected override bool IsDefined(string name, bool allowMatchingMetadataAttribute) => FlagsEnumExtensions.IsDefined(name, allowMatchingMetadataAttribute: false); #if NETCOREAPP && !NETCOREAPP2_0 && !NETCOREAPP1_1 && !NETCOREAPP1_0 @@ -48,6 +50,10 @@ protected override bool TryParse(in ReadOnlySpan name, out FlagsEnum parse [MemberData(nameof(ValidEnumValues))] public void GeneratesToStringFast(FlagsEnum value) => GeneratesToStringFastTest(value); + [Theory] + [MemberData(nameof(ValidEnumValues))] + public void GeneratesToStringFastLowerCase(FlagsEnum value) => GeneratesToStringFastLowerCaseTest(value); + [Theory] [MemberData(nameof(ValidEnumValues))] public void GeneratesIsDefined(FlagsEnum value) => GeneratesIsDefinedTest(value); @@ -101,4 +107,4 @@ public void HasFlags(FlagsEnum value) [Fact] public void GeneratesGetNames() => base.GeneratesGetNamesTest(FlagsEnumExtensions.GetNames()); -} \ No newline at end of file +} diff --git a/tests/NetEscapades.EnumGenerators.IntegrationTests/LongEnumExtensionsTests.cs b/tests/NetEscapades.EnumGenerators.IntegrationTests/LongEnumExtensionsTests.cs index b29c086..845dae6 100644 --- a/tests/NetEscapades.EnumGenerators.IntegrationTests/LongEnumExtensionsTests.cs +++ b/tests/NetEscapades.EnumGenerators.IntegrationTests/LongEnumExtensionsTests.cs @@ -30,6 +30,8 @@ public class LongEnumExtensionsTests : ExtensionTests }; protected override string ToStringFast(LongEnum value) => value.ToStringFast(); + protected override string ToStringFastLowerCase(LongEnum value) => value.ToStringFast(); + protected override bool IsDefined(LongEnum value) => LongEnumExtensions.IsDefined(value); protected override bool IsDefined(string name, bool allowMatchingMetadataAttribute) => LongEnumExtensions.IsDefined(name, allowMatchingMetadataAttribute: false); #if NETCOREAPP && !NETCOREAPP2_0 && !NETCOREAPP1_1 && !NETCOREAPP1_0 @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan name, out LongEnum parsed [MemberData(nameof(ValidEnumValues))] public void GeneratesToStringFast(LongEnum value) => GeneratesToStringFastTest(value); + [Theory] + [MemberData(nameof(ValidEnumValues))] + public void GeneratesToStringFastLowerCase(LongEnum value) => GeneratesToStringFastLowerCaseTest(value); + [Theory] [MemberData(nameof(ValidEnumValues))] public void GeneratesIsDefined(LongEnum value) => GeneratesIsDefinedTest(value); @@ -85,4 +91,4 @@ protected override bool TryParse(in ReadOnlySpan name, out LongEnum parsed [Fact] public void GeneratesGetNames() => base.GeneratesGetNamesTest(LongEnumExtensions.GetNames()); -} \ No newline at end of file +}