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