@@ -75,6 +75,9 @@ impl Validate for EnumDefinition {
75
75
span : self . span ( ) ,
76
76
diags : vec ! [ ] ,
77
77
} ;
78
+ if !options. enum_params {
79
+ return out;
80
+ }
78
81
// raise error if no NatSpec is available
79
82
let Some ( natspec) = & self . natspec else {
80
83
out. diags . push ( Diagnostic {
@@ -83,9 +86,7 @@ impl Validate for EnumDefinition {
83
86
} ) ;
84
87
return out;
85
88
} ;
86
- if options. enum_params {
87
- out. diags = check_params ( natspec, & self . members ) ;
88
- }
89
+ out. diags = check_params ( natspec, & self . members ) ;
89
90
out
90
91
}
91
92
}
@@ -101,3 +102,194 @@ fn extract_enum_members(cursor: Cursor) -> Vec<Identifier> {
101
102
}
102
103
out
103
104
}
105
+
106
+ #[ cfg( test) ]
107
+ mod tests {
108
+ use semver:: Version ;
109
+ use slang_solidity:: { cst:: NonterminalKind , parser:: Parser } ;
110
+
111
+ use super :: * ;
112
+
113
+ static OPTIONS : ValidationOptions = ValidationOptions {
114
+ inheritdoc : false ,
115
+ constructor : false ,
116
+ struct_params : false ,
117
+ enum_params : true ,
118
+ } ;
119
+
120
+ fn parse_file ( contents : & str ) -> EnumDefinition {
121
+ let parser = Parser :: create ( Version :: new ( 0 , 8 , 0 ) ) . unwrap ( ) ;
122
+ let output = parser. parse ( NonterminalKind :: SourceUnit , contents) ;
123
+ assert ! ( output. is_valid( ) , "{:?}" , output. errors( ) ) ;
124
+ let cursor = output. create_tree_cursor ( ) ;
125
+ let m = cursor. query ( vec ! [ EnumDefinition :: query( ) ] ) . next ( ) . unwrap ( ) ;
126
+ let def = EnumDefinition :: extract ( m) . unwrap ( ) ;
127
+ def. as_enum ( ) . unwrap ( )
128
+ }
129
+
130
+ #[ test]
131
+ fn test_enum ( ) {
132
+ let contents = "contract Test {
133
+ enum Foobar {
134
+ First,
135
+ Second
136
+ }
137
+ }" ;
138
+ let res = parse_file ( contents) . validate (
139
+ & ValidationOptions :: builder ( )
140
+ . inheritdoc ( false )
141
+ . constructor ( false )
142
+ . enum_params ( false )
143
+ . struct_params ( false )
144
+ . build ( ) ,
145
+ ) ;
146
+ assert ! ( res. diags. is_empty( ) , "{:#?}" , res. diags) ;
147
+ }
148
+
149
+ #[ test]
150
+ fn test_enum_missing ( ) {
151
+ let contents = "contract Test {
152
+ enum Foobar {
153
+ First,
154
+ Second
155
+ }
156
+ }" ;
157
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
158
+ assert_eq ! ( res. diags. len( ) , 1 ) ;
159
+ assert_eq ! ( res. diags[ 0 ] . message, "missing NatSpec" ) ;
160
+ }
161
+
162
+ #[ test]
163
+ fn test_enum_params ( ) {
164
+ let contents = "contract Test {
165
+ /// @param First The first
166
+ /// @param Second The second
167
+ enum Foobar {
168
+ First,
169
+ Second
170
+ }
171
+ }" ;
172
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
173
+ assert ! ( res. diags. is_empty( ) , "{:#?}" , res. diags) ;
174
+ }
175
+
176
+ #[ test]
177
+ fn test_enum_only_notice ( ) {
178
+ let contents = "contract Test {
179
+ /// @notice An enum
180
+ enum Foobar {
181
+ First,
182
+ Second
183
+ }
184
+ }" ;
185
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
186
+ assert_eq ! ( res. diags. len( ) , 2 ) ;
187
+ assert_eq ! ( res. diags[ 0 ] . message, "@param First is missing" ) ;
188
+ assert_eq ! ( res. diags[ 1 ] . message, "@param Second is missing" ) ;
189
+ }
190
+
191
+ #[ test]
192
+ fn test_enum_one_missing ( ) {
193
+ let contents = "contract Test {
194
+ /// @notice An enum
195
+ /// @param First The first
196
+ enum Foobar {
197
+ First,
198
+ Second
199
+ }
200
+ }" ;
201
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
202
+ assert_eq ! ( res. diags. len( ) , 1 ) ;
203
+ assert_eq ! ( res. diags[ 0 ] . message, "@param Second is missing" ) ;
204
+ }
205
+
206
+ #[ test]
207
+ fn test_enum_multiline ( ) {
208
+ let contents = "contract Test {
209
+ /**
210
+ * @param First The first
211
+ * @param Second The second
212
+ */
213
+ enum Foobar {
214
+ First,
215
+ Second
216
+ }
217
+ }" ;
218
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
219
+ assert ! ( res. diags. is_empty( ) , "{:#?}" , res. diags) ;
220
+ }
221
+
222
+ #[ test]
223
+ fn test_enum_duplicate ( ) {
224
+ let contents = "contract Test {
225
+ /// @param First The first
226
+ /// @param First The first twice
227
+ enum Foobar {
228
+ First
229
+ }
230
+ }" ;
231
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
232
+ assert_eq ! ( res. diags. len( ) , 1 ) ;
233
+ assert_eq ! (
234
+ res. diags[ 0 ] . message,
235
+ "@param First is present more than once"
236
+ ) ;
237
+ }
238
+
239
+ #[ test]
240
+ fn test_enum_inheritdoc ( ) {
241
+ let contents = "contract Test {
242
+ /// @inheritdoc
243
+ enum Foobar {
244
+ First
245
+ }
246
+ }" ;
247
+ let res = parse_file ( contents) . validate (
248
+ & ValidationOptions :: builder ( )
249
+ . inheritdoc ( true ) // has no effect for enums
250
+ . constructor ( false )
251
+ . enum_params ( true )
252
+ . struct_params ( false )
253
+ . build ( ) ,
254
+ ) ;
255
+ assert_eq ! ( res. diags. len( ) , 1 ) ;
256
+ assert_eq ! ( res. diags[ 0 ] . message, "@param First is missing" ) ;
257
+ }
258
+
259
+ #[ test]
260
+ fn test_enum_no_contract ( ) {
261
+ let contents = "
262
+ /// @param First The first
263
+ /// @param Second The second
264
+ enum Foobar {
265
+ First,
266
+ Second
267
+ }" ;
268
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
269
+ assert ! ( res. diags. is_empty( ) , "{:#?}" , res. diags) ;
270
+ }
271
+
272
+ #[ test]
273
+ fn test_enum_no_contract_missing ( ) {
274
+ let contents = "enum Foobar {
275
+ First,
276
+ Second
277
+ }" ;
278
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
279
+ assert_eq ! ( res. diags. len( ) , 1 ) ;
280
+ assert_eq ! ( res. diags[ 0 ] . message, "missing NatSpec" ) ;
281
+ }
282
+
283
+ #[ test]
284
+ fn test_enum_no_contract_one_missing ( ) {
285
+ let contents = "
286
+ /// @param First The first
287
+ enum Foobar {
288
+ First,
289
+ Second
290
+ }" ;
291
+ let res = parse_file ( contents) . validate ( & OPTIONS ) ;
292
+ assert_eq ! ( res. diags. len( ) , 1 ) ;
293
+ assert_eq ! ( res. diags[ 0 ] . message, "@param Second is missing" ) ;
294
+ }
295
+ }
0 commit comments