Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion src/NetEscapades.EnumGenerators/SourceGenerationHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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(@"
Expand Down Expand Up @@ -530,4 +555,4 @@ public static string[] GetNames()

return sb.ToString();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public class EnumInNamespaceExtensionsTests : ExtensionTests<EnumInNamespace>
};

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
Expand All @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan<char> 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);
Expand Down Expand Up @@ -79,4 +85,4 @@ protected override bool TryParse(in ReadOnlySpan<char> name, out EnumInNamespace

[Fact]
public void GeneratesGetNames() => base.GeneratesGetNamesTest(EnumInNamespaceExtensions.GetNames());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public class EnumWithDisplayNameInNamespaceExtensionsTests : ExtensionTests<Enum
};

protected override string ToStringFast(EnumWithDisplayNameInNamespace value) => 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
Expand All @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan<char> 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);
Expand Down Expand Up @@ -115,4 +121,4 @@ protected override bool TryParse(in ReadOnlySpan<char> name, out EnumWithDisplay

[Fact]
public void GeneratesGetNames() => base.GeneratesGetNamesTest(EnumWithDisplayNameInNamespaceExtensions.GetNames());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public class EnumWithSameDisplayNameExtensionsTests : ExtensionTests<EnumWithSam
};

protected override string ToStringFast(EnumWithSameDisplayName value) => 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
Expand All @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan<char> 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);
Expand Down Expand Up @@ -115,4 +121,4 @@ protected override bool TryParse(in ReadOnlySpan<char> name, out EnumWithSameDis

[Fact]
public void GeneratesGetNames() => base.GeneratesGetNamesTest(EnumWithSameDisplayNameExtensions.GetNames());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace NetEscapades.EnumGenerators.IntegrationTests;
public abstract class ExtensionTests<T> 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
Expand All @@ -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);
}

Expand Down Expand Up @@ -164,12 +176,12 @@ private bool TryGetDisplayName(
{
return false;
}

return true;
}
}
}

return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public class FlagsEnumExtensionsTests : ExtensionTests<FlagsEnum>
};

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
Expand All @@ -48,6 +50,10 @@ protected override bool TryParse(in ReadOnlySpan<char> 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);
Expand Down Expand Up @@ -101,4 +107,4 @@ public void HasFlags(FlagsEnum value)

[Fact]
public void GeneratesGetNames() => base.GeneratesGetNamesTest(FlagsEnumExtensions.GetNames());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public class LongEnumExtensionsTests : ExtensionTests<LongEnum>
};

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
Expand All @@ -46,6 +48,10 @@ protected override bool TryParse(in ReadOnlySpan<char> 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);
Expand Down Expand Up @@ -85,4 +91,4 @@ protected override bool TryParse(in ReadOnlySpan<char> name, out LongEnum parsed

[Fact]
public void GeneratesGetNames() => base.GeneratesGetNamesTest(LongEnumExtensions.GetNames());
}
}