@@ -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