@@ -6,10 +6,10 @@ use std::io::{self, Write};
6
6
7
7
#[ derive( Debug , Default ) ]
8
8
pub ( crate ) struct JsonEmitter {
9
- num_files : u32 ,
9
+ mismatched_files : Vec < MismatchedFile > ,
10
10
}
11
11
12
- #[ derive( Debug , Default , Serialize ) ]
12
+ #[ derive( Debug , Default , PartialEq , Serialize ) ]
13
13
struct MismatchedBlock {
14
14
original_begin_line : u32 ,
15
15
original_end_line : u32 ,
@@ -19,26 +19,20 @@ struct MismatchedBlock {
19
19
expected : String ,
20
20
}
21
21
22
- #[ derive( Debug , Default , Serialize ) ]
22
+ #[ derive( Debug , Default , PartialEq , Serialize ) ]
23
23
struct MismatchedFile {
24
24
name : String ,
25
25
mismatches : Vec < MismatchedBlock > ,
26
26
}
27
27
28
28
impl Emitter for JsonEmitter {
29
- fn emit_header ( & self , output : & mut dyn Write ) -> Result < ( ) , io:: Error > {
30
- write ! ( output, "[" ) ?;
31
- Ok ( ( ) )
32
- }
33
-
34
29
fn emit_footer ( & self , output : & mut dyn Write ) -> Result < ( ) , io:: Error > {
35
- write ! ( output, "]" ) ?;
36
- Ok ( ( ) )
30
+ writeln ! ( output, "{}" , & to_json_string( & self . mismatched_files) ?)
37
31
}
38
32
39
33
fn emit_formatted_file (
40
34
& mut self ,
41
- output : & mut dyn Write ,
35
+ _output : & mut dyn Write ,
42
36
FormattedFile {
43
37
filename,
44
38
original_text,
@@ -50,66 +44,61 @@ impl Emitter for JsonEmitter {
50
44
let has_diff = !diff. is_empty ( ) ;
51
45
52
46
if has_diff {
53
- output_json_file ( output, filename, diff, self . num_files ) ?;
54
- self . num_files += 1 ;
47
+ self . add_misformatted_file ( filename, diff) ?;
55
48
}
56
49
57
50
Ok ( EmitterResult { has_diff } )
58
51
}
59
52
}
60
53
61
- fn output_json_file < T > (
62
- mut writer : T ,
63
- filename : & FileName ,
64
- diff : Vec < Mismatch > ,
65
- num_emitted_files : u32 ,
66
- ) -> Result < ( ) , io:: Error >
67
- where
68
- T : Write ,
69
- {
70
- let mut mismatches = vec ! [ ] ;
71
- for mismatch in diff {
72
- let original_begin_line = mismatch. line_number_orig ;
73
- let expected_begin_line = mismatch. line_number ;
74
- let mut original_end_line = original_begin_line;
75
- let mut expected_end_line = expected_begin_line;
76
- let mut original_line_counter = 0 ;
77
- let mut expected_line_counter = 0 ;
78
- let mut original_lines = vec ! [ ] ;
79
- let mut expected_lines = vec ! [ ] ;
54
+ impl JsonEmitter {
55
+ fn add_misformatted_file (
56
+ & mut self ,
57
+ filename : & FileName ,
58
+ diff : Vec < Mismatch > ,
59
+ ) -> Result < ( ) , io:: Error > {
60
+ let mut mismatches = vec ! [ ] ;
61
+ for mismatch in diff {
62
+ let original_begin_line = mismatch. line_number_orig ;
63
+ let expected_begin_line = mismatch. line_number ;
64
+ let mut original_end_line = original_begin_line;
65
+ let mut expected_end_line = expected_begin_line;
66
+ let mut original_line_counter = 0 ;
67
+ let mut expected_line_counter = 0 ;
68
+ let mut original_lines = vec ! [ ] ;
69
+ let mut expected_lines = vec ! [ ] ;
80
70
81
- for line in mismatch. lines {
82
- match line {
83
- DiffLine :: Expected ( msg) => {
84
- expected_end_line = expected_begin_line + expected_line_counter;
85
- expected_line_counter += 1 ;
86
- expected_lines. push ( msg)
87
- }
88
- DiffLine :: Resulting ( msg) => {
89
- original_end_line = original_begin_line + original_line_counter;
90
- original_line_counter += 1 ;
91
- original_lines. push ( msg)
71
+ for line in mismatch. lines {
72
+ match line {
73
+ DiffLine :: Expected ( msg) => {
74
+ expected_end_line = expected_begin_line + expected_line_counter;
75
+ expected_line_counter += 1 ;
76
+ expected_lines. push ( msg)
77
+ }
78
+ DiffLine :: Resulting ( msg) => {
79
+ original_end_line = original_begin_line + original_line_counter;
80
+ original_line_counter += 1 ;
81
+ original_lines. push ( msg)
82
+ }
83
+ DiffLine :: Context ( _) => continue ,
92
84
}
93
- DiffLine :: Context ( _) => continue ,
94
85
}
95
- }
96
86
97
- mismatches. push ( MismatchedBlock {
98
- original_begin_line,
99
- original_end_line,
100
- expected_begin_line,
101
- expected_end_line,
102
- original : original_lines. join ( "\n " ) ,
103
- expected : expected_lines. join ( "\n " ) ,
87
+ mismatches. push ( MismatchedBlock {
88
+ original_begin_line,
89
+ original_end_line,
90
+ expected_begin_line,
91
+ expected_end_line,
92
+ original : original_lines. join ( "\n " ) ,
93
+ expected : expected_lines. join ( "\n " ) ,
94
+ } ) ;
95
+ }
96
+ self . mismatched_files . push ( MismatchedFile {
97
+ name : format ! ( "{}" , filename) ,
98
+ mismatches,
104
99
} ) ;
100
+ Ok ( ( ) )
105
101
}
106
- let json = to_json_string ( & MismatchedFile {
107
- name : format ! ( "{}" , filename) ,
108
- mismatches,
109
- } ) ?;
110
- let prefix = if num_emitted_files > 0 { "," } else { "" } ;
111
- write ! ( writer, "{}{}" , prefix, & json) ?;
112
- Ok ( ( ) )
113
102
}
114
103
115
104
#[ cfg( test) ]
@@ -120,6 +109,9 @@ mod tests {
120
109
121
110
#[ test]
122
111
fn expected_line_range_correct_when_single_line_split ( ) {
112
+ let mut emitter = JsonEmitter {
113
+ mismatched_files : vec ! [ ] ,
114
+ } ;
123
115
let file = "foo/bar.rs" ;
124
116
let mismatched_file = MismatchedFile {
125
117
name : String :: from ( file) ,
@@ -144,19 +136,19 @@ mod tests {
144
136
] ,
145
137
} ;
146
138
147
- let mut writer = Vec :: new ( ) ;
148
- let exp_json = to_json_string ( & mismatched_file) . unwrap ( ) ;
149
- let _ = output_json_file (
150
- & mut writer,
151
- & FileName :: Real ( PathBuf :: from ( file) ) ,
152
- vec ! [ mismatch] ,
153
- 0 ,
154
- ) ;
155
- assert_eq ! ( & writer[ ..] , format!( "{}" , exp_json) . as_bytes( ) ) ;
139
+ let _ = emitter
140
+ . add_misformatted_file ( & FileName :: Real ( PathBuf :: from ( file) ) , vec ! [ mismatch] )
141
+ . unwrap ( ) ;
142
+
143
+ assert_eq ! ( emitter. mismatched_files. len( ) , 1 ) ;
144
+ assert_eq ! ( emitter. mismatched_files[ 0 ] , mismatched_file) ;
156
145
}
157
146
158
147
#[ test]
159
148
fn context_lines_ignored ( ) {
149
+ let mut emitter = JsonEmitter {
150
+ mismatched_files : vec ! [ ] ,
151
+ } ;
160
152
let file = "src/lib.rs" ;
161
153
let mismatched_file = MismatchedFile {
162
154
name : String :: from ( file) ,
@@ -189,15 +181,12 @@ mod tests {
189
181
] ,
190
182
} ;
191
183
192
- let mut writer = Vec :: new ( ) ;
193
- let exp_json = to_json_string ( & mismatched_file) . unwrap ( ) ;
194
- let _ = output_json_file (
195
- & mut writer,
196
- & FileName :: Real ( PathBuf :: from ( file) ) ,
197
- vec ! [ mismatch] ,
198
- 0 ,
199
- ) ;
200
- assert_eq ! ( & writer[ ..] , format!( "{}" , exp_json) . as_bytes( ) ) ;
184
+ let _ = emitter
185
+ . add_misformatted_file ( & FileName :: Real ( PathBuf :: from ( file) ) , vec ! [ mismatch] )
186
+ . unwrap ( ) ;
187
+
188
+ assert_eq ! ( emitter. mismatched_files. len( ) , 1 ) ;
189
+ assert_eq ! ( emitter. mismatched_files[ 0 ] , mismatched_file) ;
201
190
}
202
191
203
192
#[ test]
@@ -217,7 +206,7 @@ mod tests {
217
206
. unwrap ( ) ;
218
207
let _ = emitter. emit_footer ( & mut writer) ;
219
208
assert_eq ! ( result. has_diff, false ) ;
220
- assert_eq ! ( & writer[ ..] , "[]" . as_bytes( ) ) ;
209
+ assert_eq ! ( & writer[ ..] , "[]\n " . as_bytes( ) ) ;
221
210
}
222
211
223
212
#[ test]
@@ -263,7 +252,7 @@ mod tests {
263
252
)
264
253
. unwrap ( ) ;
265
254
let _ = emitter. emit_footer ( & mut writer) ;
266
- let exp_json = to_json_string ( & MismatchedFile {
255
+ let exp_json = to_json_string ( & vec ! [ MismatchedFile {
267
256
name: String :: from( file_name) ,
268
257
mismatches: vec![
269
258
MismatchedBlock {
@@ -287,10 +276,10 @@ mod tests {
287
276
) ,
288
277
} ,
289
278
] ,
290
- } )
279
+ } ] )
291
280
. unwrap ( ) ;
292
281
assert_eq ! ( result. has_diff, true ) ;
293
- assert_eq ! ( & writer[ ..] , format!( "[{}] " , exp_json) . as_bytes( ) ) ;
282
+ assert_eq ! ( & writer[ ..] , format!( "{} \n " , exp_json) . as_bytes( ) ) ;
294
283
}
295
284
296
285
#[ test]
@@ -325,7 +314,7 @@ mod tests {
325
314
)
326
315
. unwrap ( ) ;
327
316
let _ = emitter. emit_footer ( & mut writer) ;
328
- let exp_bin_json = to_json_string ( & MismatchedFile {
317
+ let exp_bin = MismatchedFile {
329
318
name : String :: from ( bin_file) ,
330
319
mismatches : vec ! [ MismatchedBlock {
331
320
original_begin_line: 2 ,
@@ -335,9 +324,9 @@ mod tests {
335
324
original: String :: from( "println!(\" Hello, world!\" );" ) ,
336
325
expected: String :: from( " println!(\" Hello, world!\" );" ) ,
337
326
} ] ,
338
- } )
339
- . unwrap ( ) ;
340
- let exp_lib_json = to_json_string ( & MismatchedFile {
327
+ } ;
328
+
329
+ let exp_lib = MismatchedFile {
341
330
name : String :: from ( lib_file) ,
342
331
mismatches : vec ! [ MismatchedBlock {
343
332
original_begin_line: 2 ,
@@ -347,11 +336,9 @@ mod tests {
347
336
original: String :: from( "println!(\" Greetings!\" );" ) ,
348
337
expected: String :: from( " println!(\" Greetings!\" );" ) ,
349
338
} ] ,
350
- } )
351
- . unwrap ( ) ;
352
- assert_eq ! (
353
- & writer[ ..] ,
354
- format!( "[{},{}]" , exp_bin_json, exp_lib_json) . as_bytes( )
355
- ) ;
339
+ } ;
340
+
341
+ let exp_json = to_json_string ( & vec ! [ exp_bin, exp_lib] ) . unwrap ( ) ;
342
+ assert_eq ! ( & writer[ ..] , format!( "{}\n " , exp_json) . as_bytes( ) ) ;
356
343
}
357
344
}
0 commit comments