@@ -235,4 +235,130 @@ mod test {
235
235
use clap:: CommandFactory ;
236
236
Cli :: command ( ) . debug_assert ( ) ;
237
237
}
238
+
239
+ #[ test]
240
+ fn verbosity_error_level ( ) {
241
+ let tests = [
242
+ // verbose, quiet, expected_level, expected_filter
243
+ ( 0 , 0 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
244
+ ( 1 , 0 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
245
+ ( 2 , 0 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
246
+ ( 3 , 0 , Some ( Level :: Debug ) , LevelFilter :: Debug ) ,
247
+ ( 4 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
248
+ ( 5 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
249
+ ( 0 , 1 , None , LevelFilter :: Off ) ,
250
+ ( 0 , 2 , None , LevelFilter :: Off ) ,
251
+ ( 255 , 255 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
252
+ ] ;
253
+
254
+ for ( verbose, quiet, expected_level, expected_filter) in tests. iter ( ) {
255
+ let v = Verbosity :: < ErrorLevel > :: new ( * verbose, * quiet) ;
256
+ assert_eq ! (
257
+ v. log_level( ) ,
258
+ * expected_level,
259
+ "verbose = {verbose}, quiet = {quiet}"
260
+ ) ;
261
+ assert_eq ! (
262
+ v. log_level_filter( ) ,
263
+ * expected_filter,
264
+ "verbose = {verbose}, quiet = {quiet}"
265
+ ) ;
266
+ }
267
+ }
268
+
269
+ /// These are characterization tests that show the current behavior
270
+ #[ test]
271
+ fn verbosity_error_level_max_incorrect ( ) {
272
+ let v: Verbosity < ErrorLevel > = Verbosity :: new ( 255 , 0 ) ;
273
+ assert_eq ! ( v. log_level( ) , None ) ; // Should be Some(Level::Trace)
274
+ assert_eq ! ( v. log_level_filter( ) , LevelFilter :: Off ) ; // Should be LevelFilter::Trace
275
+
276
+ let v: Verbosity < ErrorLevel > = Verbosity :: new ( 0 , 255 ) ;
277
+ assert_eq ! ( v. log_level( ) , Some ( Level :: Warn ) ) ; // Should be None
278
+ assert_eq ! ( v. log_level_filter( ) , LevelFilter :: Warn ) ; // Should be LevelFilter::Off
279
+ }
280
+
281
+ #[ test]
282
+ fn verbosity_warn_level ( ) {
283
+ let tests = [
284
+ // verbose, quiet, expected_level, expected_filter
285
+ ( 0 , 0 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
286
+ ( 1 , 0 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
287
+ ( 2 , 0 , Some ( Level :: Debug ) , LevelFilter :: Debug ) ,
288
+ ( 3 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
289
+ ( 4 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
290
+ ( 0 , 1 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
291
+ ( 0 , 2 , None , LevelFilter :: Off ) ,
292
+ ( 0 , 3 , None , LevelFilter :: Off ) ,
293
+ ( 255 , 255 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
294
+ ] ;
295
+
296
+ for ( verbose, quiet, expected_level, expected_filter) in tests. iter ( ) {
297
+ let v = Verbosity :: < WarnLevel > :: new ( * verbose, * quiet) ;
298
+ assert_eq ! (
299
+ v. log_level( ) ,
300
+ * expected_level,
301
+ "verbose = {verbose}, quiet = {quiet}"
302
+ ) ;
303
+ assert_eq ! (
304
+ v. log_level_filter( ) ,
305
+ * expected_filter,
306
+ "verbose = {verbose}, quiet = {quiet}"
307
+ ) ;
308
+ }
309
+ }
310
+
311
+ /// These are characterization tests that show the current behavior
312
+ #[ test]
313
+ fn verbosity_warn_level_max_incorrect ( ) {
314
+ let v: Verbosity < WarnLevel > = Verbosity :: new ( 255 , 0 ) ;
315
+ assert_eq ! ( v. log_level( ) , Some ( Level :: Error ) ) ; // Should be Some(Level::Trace)
316
+ assert_eq ! ( v. log_level_filter( ) , LevelFilter :: Error ) ; // Should be LevelFilter::Trace
317
+
318
+ let v: Verbosity < WarnLevel > = Verbosity :: new ( 0 , 255 ) ;
319
+ assert_eq ! ( v. log_level( ) , Some ( Level :: Info ) ) ; // Should be None
320
+ assert_eq ! ( v. log_level_filter( ) , LevelFilter :: Info ) ; // Should be LevelFilter::Off
321
+ }
322
+
323
+ #[ test]
324
+ fn verbosity_info_level ( ) {
325
+ let tests = [
326
+ // verbose, quiet, expected_level, expected_filter
327
+ ( 0 , 0 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
328
+ ( 1 , 0 , Some ( Level :: Debug ) , LevelFilter :: Debug ) ,
329
+ ( 2 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
330
+ ( 3 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
331
+ ( 0 , 1 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
332
+ ( 0 , 2 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
333
+ ( 0 , 3 , None , LevelFilter :: Off ) ,
334
+ ( 0 , 4 , None , LevelFilter :: Off ) ,
335
+ ( 255 , 255 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
336
+ ] ;
337
+
338
+ for ( verbose, quiet, expected_level, expected_filter) in tests. iter ( ) {
339
+ let v = Verbosity :: < InfoLevel > :: new ( * verbose, * quiet) ;
340
+ assert_eq ! (
341
+ v. log_level( ) ,
342
+ * expected_level,
343
+ "verbose = {verbose}, quiet = {quiet}"
344
+ ) ;
345
+ assert_eq ! (
346
+ v. log_level_filter( ) ,
347
+ * expected_filter,
348
+ "verbose = {verbose}, quiet = {quiet}"
349
+ ) ;
350
+ }
351
+ }
352
+
353
+ /// These are characterization tests that show the current behavior
354
+ #[ test]
355
+ fn verbosity_info_level_max_incorrect ( ) {
356
+ let v: Verbosity < InfoLevel > = Verbosity :: new ( 255 , 0 ) ;
357
+ assert_eq ! ( v. log_level( ) , Some ( Level :: Warn ) ) ; // Should be Some(Level::Trace)
358
+ assert_eq ! ( v. log_level_filter( ) , LevelFilter :: Warn ) ; // Should be LevelFilter::Trace
359
+
360
+ let v: Verbosity < InfoLevel > = Verbosity :: new ( 0 , 255 ) ;
361
+ assert_eq ! ( v. log_level( ) , Some ( Level :: Debug ) ) ; // Should be None
362
+ assert_eq ! ( v. log_level_filter( ) , LevelFilter :: Debug ) ; // Should be LevelFilter::Off
363
+ }
238
364
}
0 commit comments