Skip to content
This repository was archived by the owner on Aug 12, 2025. It is now read-only.

Commit 704da67

Browse files
author
ash.blade
committed
add tests for extracting names
1 parent aa18b2a commit 704da67

File tree

7 files changed

+159
-9
lines changed

7 files changed

+159
-9
lines changed

src/EnumClass.Core/EnumInfoFactory.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,19 @@ public static EnumInfo CreateFromNamedTypeSymbol(INamedTypeSymbol enumSymbol,
3131
var members = enumSymbol.GetMembers();
3232

3333
var attributeInfo = ExtractEnumClassAttributeCtorInfo(enumSymbol, enumClassAttribute);
34-
var fullyQualifiedEnumName = SymbolDisplay.ToDisplayString(enumSymbol, SymbolDisplayFormat.FullyQualifiedFormat);
35-
var generatedClassName = GetClassName(enumSymbol, attributeInfo);
36-
var resultNamespace = GetResultNamespace(enumSymbol, attributeInfo);
3734
var underlyingType = GetUnderlyingType(enumSymbol);
3835
var accessibility = GetAccessibility(enumSymbol);
39-
var fullyQualifiedClassName = $"global::{resultNamespace}.{generatedClassName}";
4036

41-
var className = new ManuallySpecifiedSymbolName(fullyQualifiedClassName, generatedClassName);
42-
var enumName = new ManuallySpecifiedSymbolName(fullyQualifiedEnumName, enumSymbol.Name);
37+
var resultNamespace = GetResultNamespace(enumSymbol, attributeInfo);
4338
var @namespace = new ManuallySpecifiedSymbolName($"global::{resultNamespace}", resultNamespace);
4439

40+
var generatedClassName = GetClassName(enumSymbol, attributeInfo);
41+
var fullyQualifiedClassName = $"global::{resultNamespace}.{generatedClassName}";
42+
var className = new ManuallySpecifiedSymbolName(fullyQualifiedClassName, generatedClassName);
43+
44+
var fullyQualifiedEnumName = SymbolDisplay.ToDisplayString(enumSymbol, SymbolDisplayFormat.FullyQualifiedFormat);
45+
var enumName = new ManuallySpecifiedSymbolName(fullyQualifiedEnumName, enumSymbol.Name);
46+
4547
var memberInfos = members
4648
.OfType<IFieldSymbol>()
4749
.Combine(new EnumMemberInfoCreationContext(className, @namespace, enumName))

src/EnumClass.Core/EnumMemberInfoFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal static class EnumMemberInfoFactory
3131

3232
// Class name is equivalent to enum member name
3333
var enumClassName = $"{fieldSymbol.Name}EnumValue";
34-
var fullyQualifiedEnumClassName = $"{fieldSymbol.ContainingNamespace.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}.EnumClass.{enumClassName}";
34+
var fullyQualifiedEnumClassName = $"{context.EnumClassName.FullyQualified}.{enumClassName}";
3535

3636
var fullyQualifiedMemberName = $"{context.EnumName.FullyQualified}.{fieldSymbol.Name}";
3737
var memberName = fieldSymbol.Name;

src/EnumClass.Core/Models/EnumMemberInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class EnumMemberInfo
2626
/// Name of enum value we constructing.
2727
/// This is fully qualified, with 'global::' prefix
2828
/// </summary>
29-
public string FullyQualifiedEnumValue => _memberName.FullyQualified;
29+
public string FullyQualifiedEnumMemberName => _memberName.FullyQualified;
3030

3131
/// <summary>
3232
/// Name of enum member we constructing.

src/EnumClass.Generator/EnumClassIncrementalGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ private static void GenerateAllEnumClasses(Compilation
314314
builder.AppendLine(" {");
315315

316316
// Generate constructor
317-
builder.AppendFormat(" public {0}(): base({1}) {{ }}\n", member.ClassName, member.FullyQualifiedEnumValue);
317+
builder.AppendFormat(" public {0}(): base({1}) {{ }}\n", member.ClassName, member.FullyQualifiedEnumMemberName);
318318

319319
// Override default ToString()
320320
builder.AppendLine(" public override string ToString()");

tests/Generator/EnumClass.Generator.Tests/EnumClass.Generator.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<ItemGroup>
3030
<ProjectReference Include="..\..\..\src\EnumClass.Attributes\EnumClass.Attributes.csproj" />
3131
<ProjectReference Include="..\..\..\src\EnumClass.Generator\EnumClass.Generator.csproj" />
32+
<ProjectReference Include="..\..\..\src\EnumClass.Core\EnumClass.Core.csproj" />
3233
</ItemGroup>
3334

3435
</Project>

tests/Generator/EnumClass.Generator.Tests/EnumClassGenerationTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Reflection;
22
using System.Runtime.InteropServices;
33
using EnumClass.Attributes;
4+
using EnumClass.Core;
45
using Microsoft.CodeAnalysis;
56
using Microsoft.CodeAnalysis.CSharp;
67

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
using System.Reflection;
2+
using EnumClass.Attributes;
3+
using EnumClass.Core;
4+
using EnumClass.Core.Models;
5+
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.CSharp;
7+
8+
namespace EnumClass.Generator.Tests;
9+
10+
public class EnumInfoFactoryTests
11+
{
12+
public const string SampleEnumCode = @"using EnumClass.Attributes;
13+
14+
namespace Test;
15+
16+
[EnumClass]
17+
public enum SampleEnum
18+
{
19+
One = 1,
20+
Two = 2,
21+
Three = 3
22+
}";
23+
24+
private List<EnumInfo> GetEnumInfos(params string[] sourceCodes)
25+
{
26+
var compilation = CSharpCompilation.Create("Test",
27+
syntaxTrees: sourceCodes.Select(x => CSharpSyntaxTree.ParseText(x)),
28+
references: new[]
29+
{
30+
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
31+
MetadataReference.CreateFromFile(typeof(EnumClassAttribute).Assembly.Location),
32+
MetadataReference.CreateFromFile(typeof(EnumInfo).Assembly.Location),
33+
MetadataReference.CreateFromFile(Assembly.GetCallingAssembly().Location),
34+
MetadataReference.CreateFromFile(typeof(string).Assembly.Location),
35+
MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Runtime")).Location),
36+
MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("netstandard")).Location),
37+
},
38+
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
39+
40+
CSharpGeneratorDriver.Create(new EnumClassIncrementalGenerator())
41+
.RunGeneratorsAndUpdateCompilation(compilation, out var resultCompilation, out var d);
42+
43+
// Pass SourceProductionContext safely,
44+
// because there no errors expected
45+
return EnumInfoFactory.GetAllEnumInfosFromCompilation(resultCompilation, new SourceProductionContext())!;
46+
}
47+
48+
[Fact]
49+
public void GetAllEnumsFromCompilation__WithSingleMarkedEnum__ShouldReturnListWithSingleElement()
50+
{
51+
var enums = GetEnumInfos(SampleEnumCode);
52+
Assert.Single(enums);
53+
}
54+
55+
[Fact]
56+
public void GetAllEnumsFromCompilation__WithSingleMarkedEnumAnd3Members__ShouldReturnSingleEnumInfoWith3EnumMemberInfo()
57+
{
58+
var e = GetEnumInfos(SampleEnumCode).First();
59+
Assert.Equal(3, e.Members.Length);
60+
}
61+
62+
[Fact]
63+
public void ShouldCorrectlyExtractClassName()
64+
{
65+
var e = GetEnumInfos(SampleEnumCode).First();
66+
Assert.Equal("SampleEnum", e.ClassName);
67+
}
68+
69+
[Fact]
70+
public void ShouldCorrectlyExtractFullyQualifiedMemberClassNames()
71+
{
72+
var expected = new HashSet<string>()
73+
{
74+
"global::Test.EnumClass.SampleEnum.OneEnumValue",
75+
"global::Test.EnumClass.SampleEnum.TwoEnumValue",
76+
"global::Test.EnumClass.SampleEnum.ThreeEnumValue",
77+
};
78+
var e = GetEnumInfos(SampleEnumCode).First();
79+
var actual = e.Members.Select(x => x.FullyQualifiedClassName).ToHashSet();
80+
Assert.Equal(expected, actual);
81+
}
82+
83+
[Fact]
84+
public void ShouldCorrectlyExtractMemberClassNames()
85+
{
86+
var expected = new HashSet<string>()
87+
{
88+
"OneEnumValue",
89+
"TwoEnumValue",
90+
"ThreeEnumValue",
91+
};
92+
var e = GetEnumInfos(SampleEnumCode).First();
93+
var actual = e.Members.Select(x => x.ClassName).ToHashSet();
94+
Assert.Equal(expected, actual);
95+
}
96+
97+
[Fact]
98+
public void ShouldCorrectlyExtractFullyQualifiedEnumName()
99+
{
100+
var expected = "global::Test.SampleEnum";
101+
var e = GetEnumInfos(SampleEnumCode).First();
102+
var actual = e.FullyQualifiedEnumName;
103+
Assert.Equal(expected, actual);
104+
}
105+
106+
[Fact]
107+
public void ShouldCorrectlyExtractFullyQualifiedEnumMemberValueName()
108+
{
109+
var expected = new HashSet<string>()
110+
{
111+
"global::Test.SampleEnum.One",
112+
"global::Test.SampleEnum.Two",
113+
"global::Test.SampleEnum.Three",
114+
};
115+
var e = GetEnumInfos(SampleEnumCode).First();
116+
var actual = e.Members.Select(x => x.FullyQualifiedEnumMemberName).ToHashSet();
117+
Assert.Equal(expected, actual);
118+
}
119+
120+
[Fact]
121+
public void ShouldCorrectlyExtractNamespace()
122+
{
123+
var expected = "Test.EnumClass";
124+
var actual = GetEnumInfos(SampleEnumCode).First().Namespace;
125+
Assert.Equal(expected, actual);
126+
}
127+
128+
public const string SecondEnumCode = @"using EnumClass.Attributes;
129+
130+
namespace Test;
131+
132+
[EnumClass]
133+
public enum SecondEnum
134+
{
135+
Nope,
136+
Yes,
137+
No
138+
}";
139+
140+
[Fact]
141+
public void GetAllEnumsFromCompilation_With2MarkedEnums_ShouldReturnListWith2Elements()
142+
{
143+
var enums = GetEnumInfos(SampleEnumCode, SecondEnumCode);
144+
Assert.Equal(2, enums.Count);
145+
}
146+
}

0 commit comments

Comments
 (0)