@@ -9,44 +9,57 @@ impl<T: Write> JsonFormatter<T> {
99        Self  {  out } 
1010    } 
1111
12-     fn  write_message ( & mut  self ,  s :  & str )  -> io:: Result < ( ) >  { 
12+     fn  writeln_message ( & mut  self ,  s :  & str )  -> io:: Result < ( ) >  { 
1313        assert ! ( !s. contains( '\n' ) ) ; 
1414
1515        self . out . write_all ( s. as_ref ( ) ) ?; 
1616        self . out . write_all ( b"\n " ) 
1717    } 
1818
19+     fn  write_message ( & mut  self ,  s :  & str )  -> io:: Result < ( ) >  { 
20+         assert ! ( !s. contains( '\n' ) ) ; 
21+ 
22+         self . out . write_all ( s. as_ref ( ) ) 
23+     } 
24+ 
1925    fn  write_event ( 
2026        & mut  self , 
2127        ty :  & str , 
2228        name :  & str , 
2329        evt :  & str , 
24-         extra :  Option < String > , 
30+         stdout :  Option < Cow < ' _ ,  str > > , 
31+         extra :  Option < & str > , 
2532    )  -> io:: Result < ( ) >  { 
26-         if  let  Some ( extras)  = extra { 
33+         self . write_message ( & * format ! ( 
34+             r#"{{ "type": "{}", "name": "{}", "event": "{}""# , 
35+             ty,  name,  evt
36+         ) ) ?; 
37+         if  let  Some ( stdout)  = stdout { 
2738            self . write_message ( & * format ! ( 
28-                 r#"{{ "type": "{}", "name": "{}", "event": "{}", {} }}"# , 
29-                 ty,  name,  evt,  extras
30-             ) ) 
31-         }  else  { 
39+                 r#", "stdout": "{}""# , 
40+                 EscapedString ( stdout) 
41+             ) ) ?; 
42+         } 
43+         if  let  Some ( extra)  = extra { 
3244            self . write_message ( & * format ! ( 
33-                 r#"{{ "type": "{}", "name": "{}", "event": "{}" } }"# , 
34-                 ty ,  name ,  evt 
35-             ) ) 
45+                 r#", { }"# , 
46+                 extra 
47+             ) ) ? ; 
3648        } 
49+         self . writeln_message ( " }" ) 
3750    } 
3851} 
3952
4053impl < T :  Write >  OutputFormatter  for  JsonFormatter < T >  { 
4154    fn  write_run_start ( & mut  self ,  test_count :  usize )  -> io:: Result < ( ) >  { 
42-         self . write_message ( & * format ! ( 
55+         self . writeln_message ( & * format ! ( 
4356            r#"{{ "type": "suite", "event": "started", "test_count": {} }}"# , 
4457            test_count
4558        ) ) 
4659    } 
4760
4861    fn  write_test_start ( & mut  self ,  desc :  & TestDesc )  -> io:: Result < ( ) >  { 
49-         self . write_message ( & * format ! ( 
62+         self . writeln_message ( & * format ! ( 
5063            r#"{{ "type": "test", "event": "started", "name": "{}" }}"# , 
5164            desc. name
5265        ) ) 
@@ -57,34 +70,30 @@ impl<T: Write> OutputFormatter for JsonFormatter<T> {
5770        desc :  & TestDesc , 
5871        result :  & TestResult , 
5972        stdout :  & [ u8 ] , 
73+         state :  & ConsoleTestState , 
6074    )  -> io:: Result < ( ) >  { 
75+         let  stdout = if  ( state. options . display_output  || * result != TrOk )  && stdout. len ( )  > 0  { 
76+             Some ( String :: from_utf8_lossy ( stdout) ) 
77+         }  else  { 
78+             None 
79+         } ; 
6180        match  * result { 
62-             TrOk  => self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "ok" ,  None ) , 
63- 
64-             TrFailed  => { 
65-                 let  extra_data = if  stdout. len ( )  > 0  { 
66-                     Some ( format ! ( 
67-                         r#""stdout": "{}""# , 
68-                         EscapedString ( String :: from_utf8_lossy( stdout) ) 
69-                     ) ) 
70-                 }  else  { 
71-                     None 
72-                 } ; 
81+             TrOk  => self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "ok" ,  stdout,  None ) , 
7382
74-                 self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "failed" ,  extra_data) 
75-             } 
83+             TrFailed  => self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "failed" ,  stdout,  None ) , 
7684
7785            TrFailedMsg ( ref  m)  => self . write_event ( 
7886                "test" , 
7987                desc. name . as_slice ( ) , 
8088                "failed" , 
81-                 Some ( format ! ( r#""message": "{}""# ,  EscapedString ( m) ) ) , 
89+                 stdout, 
90+                 Some ( & * format ! ( r#""message": "{}""# ,  EscapedString ( m) ) ) , 
8291            ) , 
8392
84-             TrIgnored  => self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "ignored" ,  None ) , 
93+             TrIgnored  => self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "ignored" ,  stdout ,   None ) , 
8594
8695            TrAllowedFail  => { 
87-                 self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "allowed_failure" ,  None ) 
96+                 self . write_event ( "test" ,  desc. name . as_slice ( ) ,  "allowed_failure" ,  stdout ,   None ) 
8897            } 
8998
9099            TrBench ( ref  bs)  => { 
@@ -105,20 +114,20 @@ impl<T: Write> OutputFormatter for JsonFormatter<T> {
105114                    desc. name,  median,  deviation,  mbps
106115                ) ; 
107116
108-                 self . write_message ( & * line) 
117+                 self . writeln_message ( & * line) 
109118            } 
110119        } 
111120    } 
112121
113122    fn  write_timeout ( & mut  self ,  desc :  & TestDesc )  -> io:: Result < ( ) >  { 
114-         self . write_message ( & * format ! ( 
123+         self . writeln_message ( & * format ! ( 
115124            r#"{{ "type": "test", "event": "timeout", "name": "{}" }}"# , 
116125            desc. name
117126        ) ) 
118127    } 
119128
120129    fn  write_run_finish ( & mut  self ,  state :  & ConsoleTestState )  -> io:: Result < bool >  { 
121-         self . write_message ( & * format ! ( 
130+         self . writeln_message ( & * format ! ( 
122131            "{{ \" type\" : \" suite\" , \  
123132\" event\" : \" {}\" , \ 
124133\" passed\" : {}, \ 
0 commit comments