1+ using System . Diagnostics . CodeAnalysis ;
2+ using System . Threading . Tasks ;
3+ using NetEscapades . EnumGenerators . Diagnostics ;
4+ using Xunit ;
5+ using Verifier = Microsoft . CodeAnalysis . CSharp . Testing . CSharpAnalyzerVerifier <
6+ NetEscapades . EnumGenerators . Diagnostics . DuplicateEnumValueAnalyzer ,
7+ Microsoft . CodeAnalysis . Testing . DefaultVerifier > ;
8+
9+ namespace NetEscapades . EnumGenerators . Tests ;
10+
11+ public class DuplicateEnumValueAnalyzerTests
12+ {
13+ private const string DiagnosticId = DuplicateEnumValueAnalyzer . DiagnosticId ;
14+
15+ [ Fact ]
16+ public async Task EmptySourceShouldNotHaveDiagnostics ( )
17+ {
18+ var test = string . Empty ;
19+ await Verifier . VerifyAnalyzerAsync ( test ) ;
20+ }
21+
22+ [ Fact ]
23+ public async Task EnumWithoutAttributeShouldNotHaveDiagnostics ( )
24+ {
25+ var test = GetTestCode (
26+ /* lang=c# */
27+ """
28+ public enum TestEnum
29+ {
30+ First = 0,
31+ Second = 0,
32+ }
33+ """ ) ;
34+ await Verifier . VerifyAnalyzerAsync ( test ) ;
35+ }
36+
37+ [ Fact ]
38+ public async Task EnumWithoutDuplicatesShouldNotHaveDiagnostics ( )
39+ {
40+ var test = GetTestCode (
41+ /* lang=c# */
42+ """
43+ [EnumExtensions]
44+ public enum TestEnum
45+ {
46+ First = 0,
47+ Second = 1,
48+ Third = 2,
49+ }
50+ """ ) ;
51+ await Verifier . VerifyAnalyzerAsync ( test ) ;
52+ }
53+
54+ [ Fact ]
55+ public async Task EnumWithDuplicateValuesShouldHaveDiagnosticsForSecondOccurrence ( )
56+ {
57+ var test = GetTestCode (
58+ /* lang=c# */
59+ """
60+ [EnumExtensions]
61+ public enum TestEnum
62+ {
63+ First = 0,
64+ {|NEEG003:Second|} = 0,
65+ }
66+ """ ) ;
67+ await Verifier . VerifyAnalyzerAsync ( test ) ;
68+ }
69+
70+ [ Fact ]
71+ public async Task EnumWithMultipleDuplicateValuesShouldHaveDiagnosticsForAllButFirst ( )
72+ {
73+ var test = GetTestCode (
74+ /* lang=c# */
75+ """
76+ [EnumExtensions]
77+ public enum TestEnum
78+ {
79+ First = 0,
80+ {|NEEG003:Second|} = 0,
81+ {|NEEG003:Third|} = 0,
82+ Fourth = 1,
83+ {|NEEG003:Fifth|} = 1,
84+ }
85+ """ ) ;
86+ await Verifier . VerifyAnalyzerAsync ( test ) ;
87+ }
88+
89+ [ Fact ]
90+ public async Task EnumWithImplicitValuesShouldDetectDuplicates ( )
91+ {
92+ var test = GetTestCode (
93+ /* lang=c# */
94+ """
95+ [EnumExtensions]
96+ public enum TestEnum
97+ {
98+ First, // 0
99+ {|NEEG003:Second|} = 0, // duplicate of First
100+ {|NEEG003:Third|} = 0, // duplicate of First and Second
101+ }
102+ """ ) ;
103+ await Verifier . VerifyAnalyzerAsync ( test ) ;
104+ }
105+
106+ [ Fact ]
107+ public async Task EnumWithDifferentTypesButSameValuesShouldDetectDuplicates ( )
108+ {
109+ var test = GetTestCode (
110+ /* lang=c# */
111+ """
112+ [EnumExtensions]
113+ public enum TestEnum : byte
114+ {
115+ First = 0,
116+ {|NEEG003:Second|} = 0,
117+ }
118+ """ ) ;
119+ await Verifier . VerifyAnalyzerAsync ( test ) ;
120+ }
121+
122+ [ Fact ]
123+ public async Task MultipleEnumsWithDuplicatesShouldTrackSeparately ( )
124+ {
125+ var test = GetTestCode (
126+ /* lang=c# */
127+ """
128+ [EnumExtensions]
129+ public enum FirstEnum
130+ {
131+ A = 0,
132+ {|NEEG003:B|} = 0,
133+ }
134+
135+ [EnumExtensions]
136+ public enum SecondEnum
137+ {
138+ X = 0,
139+ {|NEEG003:Y|} = 0,
140+ }
141+ """ ) ;
142+ await Verifier . VerifyAnalyzerAsync ( test ) ;
143+ }
144+
145+ [ Fact ]
146+ public async Task ComplexEnumThatReferencesOthers ( )
147+ {
148+ var test = GetTestCode (
149+ /* lang=c# */
150+ """
151+ [EnumExtensions]
152+ public enum ComplexEnum
153+ {
154+ Zero = 0,
155+ One = 1,
156+ {|NEEG003:AlsoOne|} = One,
157+ }
158+ """ ) ;
159+ await Verifier . VerifyAnalyzerAsync ( test ) ;
160+ }
161+
162+ [ Fact ]
163+ public async Task ComplexEnumThatReferencesCombinationOfOthers ( )
164+ {
165+ var test = GetTestCode (
166+ /* lang=c# */
167+ """
168+ [EnumExtensions]
169+ public enum ComplexEnum
170+ {
171+ Zero = 0,
172+ One = 1,
173+ Two = 2,
174+ {|NEEG003:ZeroAndOne|} = Zero | One,
175+ OneAndTwo = One | Two,
176+ }
177+ """ ) ;
178+ await Verifier . VerifyAnalyzerAsync ( test ) ;
179+ }
180+
181+ private static string GetTestCode ( string testCode ) => $$ """
182+ using System;
183+ using System.Collections.Generic;
184+ using System.Linq;
185+ using System.Text;
186+ using System.Threading;
187+ using System.Threading.Tasks;
188+ using System.Diagnostics;
189+ using NetEscapades.EnumGenerators;
190+
191+ namespace ConsoleApplication1
192+ {
193+ {{ testCode }}
194+ }
195+
196+ {{ TestHelpers . LoadEmbeddedAttribute ( ) }}
197+ """ ;
198+ }
0 commit comments