@@ -51,7 +51,6 @@ use std::fmt;
5151use  std:: path:: Path ; 
5252use  std:: path:: PathBuf ; 
5353use  std:: str; 
54- use  url:: Url ; 
5554
5655/// This makes it easier to write regex replacements that are guaranteed to only 
5756/// get compiled once 
@@ -333,111 +332,37 @@ static E2E_LITERAL_REDACTIONS: &[(&str, &str)] = &[
333332] ; 
334333
335334/// Normalizes the output so that it can be compared against the expected value. 
336- fn  normalize_actual ( actual :  & str ,  cwd :  Option < & Path > )  -> String  { 
337-     // It's easier to read tabs in outputs if they don't show up as literal 
338-     // hidden characters 
339-     let  actual = actual. replace ( '\t' ,  "<tab>" ) ; 
340-     if  cfg ! ( windows)  { 
341-         // Let's not deal with \r\n vs \n on windows... 
342-         let  actual = actual. replace ( '\r' ,  "" ) ; 
343-         normalize_windows ( & actual,  cwd) 
344-     }  else  { 
345-         actual
346-     } 
335+ fn  normalize_actual ( content :  & str ,  redactions :  & snapbox:: Redactions )  -> String  { 
336+     use  snapbox:: filter:: Filter  as  _; 
337+     let  content = snapbox:: filter:: FilterPaths . filter ( content. into_data ( ) ) ; 
338+     let  content = snapbox:: filter:: FilterNewlines . filter ( content) ; 
339+     let  content = content. render ( ) . expect ( "came in as a String" ) ; 
340+     let  content = redactions. redact ( & content) ; 
341+     content
347342} 
348343
349344/// Normalizes the expected string so that it can be compared against the actual output. 
350- fn  normalize_expected ( expected :  & str ,  cwd :  Option < & Path > )  -> String  { 
351-     let  expected = replace_dirty_msvc ( expected) ; 
352-     let  expected = substitute_macros ( & expected) ; 
353- 
354-     if  cfg ! ( windows)  { 
355-         normalize_windows ( & expected,  cwd) 
356-     }  else  { 
357-         let  expected = match  cwd { 
358-             None  => expected, 
359-             Some ( cwd)  => expected. replace ( "[CWD]" ,  & cwd. display ( ) . to_string ( ) ) , 
360-         } ; 
361-         let  expected = expected. replace ( "[ROOT]" ,  & paths:: root ( ) . display ( ) . to_string ( ) ) ; 
362-         expected
363-     } 
364- } 
365- 
366- fn  replace_dirty_msvc_impl ( s :  & str ,  is_msvc :  bool )  -> String  { 
367-     if  is_msvc { 
368-         s. replace ( "[DIRTY-MSVC]" ,  "[DIRTY]" ) 
369-     }  else  { 
370-         use  itertools:: Itertools ; 
371- 
372-         let  mut  new = s
373-             . lines ( ) 
374-             . filter ( |it| !it. starts_with ( "[DIRTY-MSVC]" ) ) 
375-             . join ( "\n " ) ; 
376- 
377-         if  s. ends_with ( "\n " )  { 
378-             new. push_str ( "\n " ) ; 
379-         } 
380- 
381-         new
382-     } 
383- } 
384- 
385- fn  replace_dirty_msvc ( s :  & str )  -> String  { 
386-     replace_dirty_msvc_impl ( s,  cfg ! ( target_env = "msvc" ) ) 
387- } 
388- 
389- /// Normalizes text for both actual and expected strings on Windows. 
390- fn  normalize_windows ( text :  & str ,  cwd :  Option < & Path > )  -> String  { 
391-     // Let's not deal with / vs \ (windows...) 
392-     let  text = text. replace ( '\\' ,  "/" ) ; 
393- 
394-     // Weirdness for paths on Windows extends beyond `/` vs `\` apparently. 
395-     // Namely paths like `c:\` and `C:\` are equivalent and that can cause 
396-     // issues. The return value of `env::current_dir()` may return a 
397-     // lowercase drive name, but we round-trip a lot of values through `Url` 
398-     // which will auto-uppercase the drive name. To just ignore this 
399-     // distinction we try to canonicalize as much as possible, taking all 
400-     // forms of a path and canonicalizing them to one. 
401-     let  replace_path = |s :  & str ,  path :  & Path ,  with :  & str | { 
402-         let  path_through_url = Url :: from_file_path ( path) . unwrap ( ) . to_file_path ( ) . unwrap ( ) ; 
403-         let  path1 = path. display ( ) . to_string ( ) . replace ( '\\' ,  "/" ) ; 
404-         let  path2 = path_through_url. display ( ) . to_string ( ) . replace ( '\\' ,  "/" ) ; 
405-         s. replace ( & path1,  with) 
406-             . replace ( & path2,  with) 
407-             . replace ( with,  & path1) 
408-     } ; 
409- 
410-     let  text = match  cwd { 
411-         None  => text, 
412-         Some ( p)  => replace_path ( & text,  p,  "[CWD]" ) , 
413-     } ; 
414- 
415-     // Similar to cwd above, perform similar treatment to the root path 
416-     // which in theory all of our paths should otherwise get rooted at. 
417-     let  root = paths:: root ( ) ; 
418-     let  text = replace_path ( & text,  & root,  "[ROOT]" ) ; 
419- 
420-     text
421- } 
422- 
423- fn  substitute_macros ( input :  & str )  -> String  { 
424-     let  mut  result = input. to_owned ( ) ; 
425-     for  & ( pat,  subst)  in  MIN_LITERAL_REDACTIONS  { 
426-         result = result. replace ( pat,  subst) 
427-     } 
428-     for  & ( pat,  subst)  in  E2E_LITERAL_REDACTIONS  { 
429-         result = result. replace ( pat,  subst) 
430-     } 
431-     result
345+ fn  normalize_expected ( content :  & str ,  redactions :  & snapbox:: Redactions )  -> String  { 
346+     use  snapbox:: filter:: Filter  as  _; 
347+     let  content = snapbox:: filter:: FilterPaths . filter ( content. into_data ( ) ) ; 
348+     let  content = snapbox:: filter:: FilterNewlines . filter ( content) ; 
349+     // Remove any conditionally absent redactions like `[EXE]` 
350+     let  content = content. render ( ) . expect ( "came in as a String" ) ; 
351+     let  content = redactions. clear_unused ( & content) ; 
352+     content. into_owned ( ) 
432353} 
433354
434355/// Checks that the given string contains the given contiguous lines 
435356/// somewhere. 
436357/// 
437358/// See [Patterns](index.html#patterns) for more information on pattern matching. 
438- pub ( crate )  fn  match_contains ( expected :  & str ,  actual :  & str ,  cwd :  Option < & Path > )  -> Result < ( ) >  { 
439-     let  expected = normalize_expected ( expected,  cwd) ; 
440-     let  actual = normalize_actual ( actual,  cwd) ; 
359+ pub ( crate )  fn  match_contains ( 
360+     expected :  & str , 
361+     actual :  & str , 
362+     redactions :  & snapbox:: Redactions , 
363+ )  -> Result < ( ) >  { 
364+     let  expected = normalize_expected ( expected,  redactions) ; 
365+     let  actual = normalize_actual ( actual,  redactions) ; 
441366    let  e:  Vec < _ >  = expected. lines ( ) . map ( |line| WildStr :: new ( line) ) . collect ( ) ; 
442367    let  a:  Vec < _ >  = actual. lines ( ) . map ( |line| WildStr :: new ( line) ) . collect ( ) ; 
443368    if  e. len ( )  == 0  { 
@@ -465,9 +390,9 @@ pub(crate) fn match_contains(expected: &str, actual: &str, cwd: Option<&Path>) -
465390pub ( crate )  fn  match_does_not_contain ( 
466391    expected :  & str , 
467392    actual :  & str , 
468-     cwd :   Option < & Path > , 
393+     redactions :   & snapbox :: Redactions , 
469394)  -> Result < ( ) >  { 
470-     if  match_contains ( expected,  actual,  cwd ) . is_ok ( )  { 
395+     if  match_contains ( expected,  actual,  redactions ) . is_ok ( )  { 
471396        bail ! ( 
472397            "expected not to find:\n \  
473398\n \n \ 
@@ -492,10 +417,10 @@ pub(crate) fn match_with_without(
492417    actual :  & str , 
493418    with :  & [ String ] , 
494419    without :  & [ String ] , 
495-     cwd :   Option < & Path > , 
420+     redactions :   & snapbox :: Redactions , 
496421)  -> Result < ( ) >  { 
497-     let  actual = normalize_actual ( actual,  cwd ) ; 
498-     let  norm = |s :  & String | format ! ( "[..]{}[..]" ,  normalize_expected( s,  cwd ) ) ; 
422+     let  actual = normalize_actual ( actual,  redactions ) ; 
423+     let  norm = |s :  & String | format ! ( "[..]{}[..]" ,  normalize_expected( s,  redactions ) ) ; 
499424    let  with:  Vec < _ >  = with. iter ( ) . map ( norm) . collect ( ) ; 
500425    let  without:  Vec < _ >  = without. iter ( ) . map ( norm) . collect ( ) ; 
501426    let  with_wild:  Vec < _ >  = with. iter ( ) . map ( |w| WildStr :: new ( w) ) . collect ( ) ; 
@@ -748,117 +673,6 @@ mod test {
748673        } 
749674    } 
750675
751-     #[ test]  
752-     fn  dirty_msvc ( )  { 
753-         let  case = |expected :  & str ,  wild :  & str ,  msvc :  bool | { 
754-             assert_eq ! ( expected,  & replace_dirty_msvc_impl( wild,  msvc) ) ; 
755-         } ; 
756- 
757-         // no replacements 
758-         case ( "aa" ,  "aa" ,  false ) ; 
759-         case ( "aa" ,  "aa" ,  true ) ; 
760- 
761-         // with replacements 
762-         case ( 
763-             "\  
764- , 
765-             "\  
766- , 
767-             true , 
768-         ) ; 
769-         case ( 
770-             "" , 
771-             "\  
772- , 
773-             false , 
774-         ) ; 
775-         case ( 
776-             "\  
777- 
778- [COMPILING] a" , 
779-             "\  
780- 
781- [COMPILING] a" , 
782-             true , 
783-         ) ; 
784-         case ( 
785-             "\  
786- , 
787-             "\  
788- 
789- [COMPILING] a" , 
790-             false , 
791-         ) ; 
792- 
793-         // test trailing newline behavior 
794-         case ( 
795-             "\  
796- 
797- B 
798- " ,  "\  
799- 
800- B 
801- " ,  true , 
802-         ) ; 
803- 
804-         case ( 
805-             "\  
806- 
807- B 
808- " ,  "\  
809- 
810- B 
811- " ,  false , 
812-         ) ; 
813- 
814-         case ( 
815-             "\  
816- 
817- B" ,  "\  
818- 
819- B" ,  true , 
820-         ) ; 
821- 
822-         case ( 
823-             "\  
824- 
825- B" ,  "\  
826- 
827- B" ,  false , 
828-         ) ; 
829- 
830-         case ( 
831-             "\  
832- 
833- " , 
834-             "\  
835- 
836- " , 
837-             true , 
838-         ) ; 
839-         case ( 
840-             "\n " , 
841-             "\  
842- 
843- " , 
844-             false , 
845-         ) ; 
846- 
847-         case ( 
848-             "\  
849- , 
850-             "\  
851- , 
852-             true , 
853-         ) ; 
854-         case ( 
855-             "" , 
856-             "\  
857- , 
858-             false , 
859-         ) ; 
860-     } 
861- 
862676    #[ test]  
863677    fn  redact_elapsed_time ( )  { 
864678        let  mut  subs = snapbox:: Redactions :: new ( ) ; 
0 commit comments