@@ -395,13 +395,193 @@ mod tests {
395395 assert ! ( !enabled( & logger. directives, Level :: Debug , "crate2" ) ) ;
396396 }
397397
398+ // Some of our tests are only correct or complete when they cover the full
399+ // universe of variants for log::Level. In the unlikely event that a new
400+ // variant is added in the future, this test will detect the scenario and
401+ // alert us to the need to review and update the tests. In such a
402+ // situation, this test will fail to compile, and the error message will
403+ // look something like this:
404+ //
405+ // error[E0004]: non-exhaustive patterns: `NewVariant` not covered
406+ // --> src/filter/mod.rs:413:15
407+ // |
408+ // 413 | match level_universe {
409+ // | ^^^^^^^^^^^^^^ pattern `NewVariant` not covered
410+ #[ test]
411+ fn ensure_tests_cover_level_universe ( ) {
412+ let level_universe: Level = Level :: Trace ; // use of trace variant is arbitrary
413+ match level_universe {
414+ Level :: Error | Level :: Warn | Level :: Info | Level :: Debug | Level :: Trace => ( ) ,
415+ }
416+ }
417+
398418 #[ test]
399419 fn parse_default ( ) {
400420 let logger = Builder :: new ( ) . parse ( "info,crate1::mod1=warn" ) . build ( ) ;
401421 assert ! ( enabled( & logger. directives, Level :: Warn , "crate1::mod1" ) ) ;
402422 assert ! ( enabled( & logger. directives, Level :: Info , "crate2::mod2" ) ) ;
403423 }
404424
425+ #[ test]
426+ fn parse_default_bare_level_off_lc ( ) {
427+ let logger = Builder :: new ( ) . parse ( "off" ) . build ( ) ;
428+ assert ! ( !enabled( & logger. directives, Level :: Error , "" ) ) ;
429+ assert ! ( !enabled( & logger. directives, Level :: Warn , "" ) ) ;
430+ assert ! ( !enabled( & logger. directives, Level :: Info , "" ) ) ;
431+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
432+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
433+ }
434+
435+ #[ test]
436+ fn parse_default_bare_level_off_uc ( ) {
437+ let logger = Builder :: new ( ) . parse ( "OFF" ) . build ( ) ;
438+ assert ! ( !enabled( & logger. directives, Level :: Error , "" ) ) ;
439+ assert ! ( !enabled( & logger. directives, Level :: Warn , "" ) ) ;
440+ assert ! ( !enabled( & logger. directives, Level :: Info , "" ) ) ;
441+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
442+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
443+ }
444+
445+ #[ test]
446+ fn parse_default_bare_level_error_lc ( ) {
447+ let logger = Builder :: new ( ) . parse ( "error" ) . build ( ) ;
448+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
449+ assert ! ( !enabled( & logger. directives, Level :: Warn , "" ) ) ;
450+ assert ! ( !enabled( & logger. directives, Level :: Info , "" ) ) ;
451+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
452+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
453+ }
454+
455+ #[ test]
456+ fn parse_default_bare_level_error_uc ( ) {
457+ let logger = Builder :: new ( ) . parse ( "ERROR" ) . build ( ) ;
458+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
459+ assert ! ( !enabled( & logger. directives, Level :: Warn , "" ) ) ;
460+ assert ! ( !enabled( & logger. directives, Level :: Info , "" ) ) ;
461+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
462+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
463+ }
464+
465+ #[ test]
466+ fn parse_default_bare_level_warn_lc ( ) {
467+ let logger = Builder :: new ( ) . parse ( "warn" ) . build ( ) ;
468+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
469+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
470+ assert ! ( !enabled( & logger. directives, Level :: Info , "" ) ) ;
471+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
472+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
473+ }
474+
475+ #[ test]
476+ fn parse_default_bare_level_warn_uc ( ) {
477+ let logger = Builder :: new ( ) . parse ( "WARN" ) . build ( ) ;
478+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
479+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
480+ assert ! ( !enabled( & logger. directives, Level :: Info , "" ) ) ;
481+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
482+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
483+ }
484+
485+ #[ test]
486+ fn parse_default_bare_level_info_lc ( ) {
487+ let logger = Builder :: new ( ) . parse ( "info" ) . build ( ) ;
488+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
489+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
490+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
491+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
492+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
493+ }
494+
495+ #[ test]
496+ fn parse_default_bare_level_info_uc ( ) {
497+ let logger = Builder :: new ( ) . parse ( "INFO" ) . build ( ) ;
498+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
499+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
500+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
501+ assert ! ( !enabled( & logger. directives, Level :: Debug , "" ) ) ;
502+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
503+ }
504+
505+ #[ test]
506+ fn parse_default_bare_level_debug_lc ( ) {
507+ let logger = Builder :: new ( ) . parse ( "debug" ) . build ( ) ;
508+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
509+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
510+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
511+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
512+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
513+ }
514+
515+ #[ test]
516+ fn parse_default_bare_level_debug_uc ( ) {
517+ let logger = Builder :: new ( ) . parse ( "DEBUG" ) . build ( ) ;
518+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
519+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
520+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
521+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
522+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
523+ }
524+
525+ #[ test]
526+ fn parse_default_bare_level_trace_lc ( ) {
527+ let logger = Builder :: new ( ) . parse ( "trace" ) . build ( ) ;
528+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
529+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
530+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
531+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
532+ assert ! ( enabled( & logger. directives, Level :: Trace , "" ) ) ;
533+ }
534+
535+ #[ test]
536+ fn parse_default_bare_level_trace_uc ( ) {
537+ let logger = Builder :: new ( ) . parse ( "TRACE" ) . build ( ) ;
538+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
539+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
540+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
541+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
542+ assert ! ( enabled( & logger. directives, Level :: Trace , "" ) ) ;
543+ }
544+
545+ // In practice, the desired log level is typically specified by a token
546+ // that is either all lowercase (e.g., 'trace') or all uppercase (.e.g,
547+ // 'TRACE'), but this tests serves as a reminder that
548+ // log::Level::from_str() ignores all case variants.
549+ #[ test]
550+ fn parse_default_bare_level_debug_mixed ( ) {
551+ {
552+ let logger = Builder :: new ( ) . parse ( "Debug" ) . build ( ) ;
553+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
554+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
555+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
556+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
557+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
558+ }
559+ {
560+ let logger = Builder :: new ( ) . parse ( "debuG" ) . build ( ) ;
561+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
562+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
563+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
564+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
565+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
566+ }
567+ {
568+ let logger = Builder :: new ( ) . parse ( "deBug" ) . build ( ) ;
569+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
570+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
571+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
572+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
573+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
574+ }
575+ {
576+ let logger = Builder :: new ( ) . parse ( "DeBuG" ) . build ( ) ; // LaTeX flavor!
577+ assert ! ( enabled( & logger. directives, Level :: Error , "" ) ) ;
578+ assert ! ( enabled( & logger. directives, Level :: Warn , "" ) ) ;
579+ assert ! ( enabled( & logger. directives, Level :: Info , "" ) ) ;
580+ assert ! ( enabled( & logger. directives, Level :: Debug , "" ) ) ;
581+ assert ! ( !enabled( & logger. directives, Level :: Trace , "" ) ) ;
582+ }
583+ }
584+
405585 #[ test]
406586 fn match_full_path ( ) {
407587 let logger = make_logger_filter ( vec ! [
@@ -569,6 +749,36 @@ mod tests {
569749 assert ! ( filter. is_none( ) ) ;
570750 }
571751
752+ #[ test]
753+ fn parse_spec_global_bare_warn_lc ( ) {
754+ // test parse_spec with no crate, in isolation, all lowercase
755+ let ( dirs, filter) = parse_spec ( "warn" ) ;
756+ assert_eq ! ( dirs. len( ) , 1 ) ;
757+ assert_eq ! ( dirs[ 0 ] . name, None ) ;
758+ assert_eq ! ( dirs[ 0 ] . level, LevelFilter :: Warn ) ;
759+ assert ! ( filter. is_none( ) ) ;
760+ }
761+
762+ #[ test]
763+ fn parse_spec_global_bare_warn_uc ( ) {
764+ // test parse_spec with no crate, in isolation, all uppercase
765+ let ( dirs, filter) = parse_spec ( "WARN" ) ;
766+ assert_eq ! ( dirs. len( ) , 1 ) ;
767+ assert_eq ! ( dirs[ 0 ] . name, None ) ;
768+ assert_eq ! ( dirs[ 0 ] . level, LevelFilter :: Warn ) ;
769+ assert ! ( filter. is_none( ) ) ;
770+ }
771+
772+ #[ test]
773+ fn parse_spec_global_bare_warn_mixed ( ) {
774+ // test parse_spec with no crate, in isolation, mixed case
775+ let ( dirs, filter) = parse_spec ( "wArN" ) ;
776+ assert_eq ! ( dirs. len( ) , 1 ) ;
777+ assert_eq ! ( dirs[ 0 ] . name, None ) ;
778+ assert_eq ! ( dirs[ 0 ] . level, LevelFilter :: Warn ) ;
779+ assert ! ( filter. is_none( ) ) ;
780+ }
781+
572782 #[ test]
573783 fn parse_spec_valid_filter ( ) {
574784 let ( dirs, filter) = parse_spec ( "crate1::mod1=error,crate1::mod2,crate2=debug/abc" ) ;
0 commit comments