@@ -7,21 +7,23 @@ use std::io;
7
7
use term;
8
8
9
9
use super :: {
10
+ bench:: fmt_bench_samples,
11
+ cli:: TestOpts ,
12
+ event:: { TestEvent , CompletedTest } ,
13
+ formatters:: { JsonFormatter , OutputFormatter , PrettyFormatter , TerseFormatter } ,
10
14
helpers:: {
11
15
concurrency:: get_concurrency,
12
16
metrics:: MetricMap ,
13
17
} ,
14
18
types:: { TestDesc , TestDescAndFn , NamePadding } ,
15
19
options:: { Options , OutputFormat } ,
16
- bench:: fmt_bench_samples,
17
20
test_result:: TestResult ,
18
21
time:: TestExecTime ,
19
- cli:: TestOpts ,
20
- event:: TestEvent ,
21
22
run_tests,
22
23
filter_tests,
23
24
} ;
24
25
26
+ /// Generic wrapper over stdout.
25
27
pub enum OutputLocation < T > {
26
28
Pretty ( Box < term:: StdoutTerminal > ) ,
27
29
Raw ( T ) ,
@@ -43,8 +45,6 @@ impl<T: Write> Write for OutputLocation<T> {
43
45
}
44
46
}
45
47
46
- use crate :: formatters:: { JsonFormatter , OutputFormatter , PrettyFormatter , TerseFormatter } ;
47
-
48
48
pub struct ConsoleTestState {
49
49
pub log_out : Option < File > ,
50
50
pub total : usize ,
@@ -190,65 +190,77 @@ pub fn list_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Res
190
190
Ok ( ( ) )
191
191
}
192
192
193
- // A simple console test runner
194
- pub fn run_tests_console ( opts : & TestOpts , tests : Vec < TestDescAndFn > ) -> io:: Result < bool > {
195
- // A callback handling events that occure during test execution.
196
- fn on_test_event (
197
- event : & TestEvent ,
198
- st : & mut ConsoleTestState ,
199
- out : & mut dyn OutputFormatter ,
200
- ) -> io:: Result < ( ) > {
201
- match ( * event) . clone ( ) {
202
- TestEvent :: TeFiltered ( ref filtered_tests) => {
203
- st. total = filtered_tests. len ( ) ;
204
- out. write_run_start ( filtered_tests. len ( ) )
205
- }
206
- TestEvent :: TeFilteredOut ( filtered_out) => Ok ( st. filtered_out = filtered_out) ,
207
- TestEvent :: TeWait ( ref test) => out. write_test_start ( test) ,
208
- TestEvent :: TeTimeout ( ref test) => out. write_timeout ( test) ,
209
- TestEvent :: TeResult ( completed_test) => {
210
- let test = completed_test. desc ;
211
- let result = & completed_test. result ;
212
- let exec_time = & completed_test. exec_time ;
213
- let stdout = completed_test. stdout ;
214
-
215
- st. write_log_result ( & test, result, exec_time. as_ref ( ) ) ?;
216
- out. write_result ( & test, result, exec_time. as_ref ( ) , & * stdout, st) ?;
217
- match result {
218
- TestResult :: TrOk => {
219
- st. passed += 1 ;
220
- st. not_failures . push ( ( test, stdout) ) ;
221
- }
222
- TestResult :: TrIgnored => st. ignored += 1 ,
223
- TestResult :: TrAllowedFail => st. allowed_fail += 1 ,
224
- TestResult :: TrBench ( bs) => {
225
- st. metrics . insert_metric (
226
- test. name . as_slice ( ) ,
227
- bs. ns_iter_summ . median ,
228
- bs. ns_iter_summ . max - bs. ns_iter_summ . min ,
229
- ) ;
230
- st. measured += 1
231
- }
232
- TestResult :: TrFailed => {
233
- st. failed += 1 ;
234
- st. failures . push ( ( test, stdout) ) ;
235
- }
236
- TestResult :: TrFailedMsg ( msg) => {
237
- st. failed += 1 ;
238
- let mut stdout = stdout;
239
- stdout. extend_from_slice ( format ! ( "note: {}" , msg) . as_bytes ( ) ) ;
240
- st. failures . push ( ( test, stdout) ) ;
241
- }
242
- TestResult :: TrTimedFail => {
243
- st. failed += 1 ;
244
- st. time_failures . push ( ( test, stdout) ) ;
245
- }
246
- }
247
- Ok ( ( ) )
248
- }
193
+ // Updates `ConsoleTestState` depending on result of the test execution.
194
+ fn handle_test_result ( st : & mut ConsoleTestState , completed_test : CompletedTest ) {
195
+ let test = completed_test. desc ;
196
+ let stdout = completed_test. stdout ;
197
+ match completed_test. result {
198
+ TestResult :: TrOk => {
199
+ st. passed += 1 ;
200
+ st. not_failures . push ( ( test, stdout) ) ;
201
+ }
202
+ TestResult :: TrIgnored => st. ignored += 1 ,
203
+ TestResult :: TrAllowedFail => st. allowed_fail += 1 ,
204
+ TestResult :: TrBench ( bs) => {
205
+ st. metrics . insert_metric (
206
+ test. name . as_slice ( ) ,
207
+ bs. ns_iter_summ . median ,
208
+ bs. ns_iter_summ . max - bs. ns_iter_summ . min ,
209
+ ) ;
210
+ st. measured += 1
211
+ }
212
+ TestResult :: TrFailed => {
213
+ st. failed += 1 ;
214
+ st. failures . push ( ( test, stdout) ) ;
215
+ }
216
+ TestResult :: TrFailedMsg ( msg) => {
217
+ st. failed += 1 ;
218
+ let mut stdout = stdout;
219
+ stdout. extend_from_slice ( format ! ( "note: {}" , msg) . as_bytes ( ) ) ;
220
+ st. failures . push ( ( test, stdout) ) ;
221
+ }
222
+ TestResult :: TrTimedFail => {
223
+ st. failed += 1 ;
224
+ st. time_failures . push ( ( test, stdout) ) ;
225
+ }
226
+ }
227
+ }
228
+
229
+ // Handler for events that occur during test execution.
230
+ // It is provided as a callback to the `run_tests` function.
231
+ fn on_test_event (
232
+ event : & TestEvent ,
233
+ st : & mut ConsoleTestState ,
234
+ out : & mut dyn OutputFormatter ,
235
+ ) -> io:: Result < ( ) > {
236
+ match ( * event) . clone ( ) {
237
+ TestEvent :: TeFiltered ( ref filtered_tests) => {
238
+ st. total = filtered_tests. len ( ) ;
239
+ out. write_run_start ( filtered_tests. len ( ) ) ?;
240
+ }
241
+ TestEvent :: TeFilteredOut ( filtered_out) => {
242
+ st. filtered_out = filtered_out;
243
+ }
244
+ TestEvent :: TeWait ( ref test) => out. write_test_start ( test) ?,
245
+ TestEvent :: TeTimeout ( ref test) => out. write_timeout ( test) ?,
246
+ TestEvent :: TeResult ( completed_test) => {
247
+ let test = & completed_test. desc ;
248
+ let result = & completed_test. result ;
249
+ let exec_time = & completed_test. exec_time ;
250
+ let stdout = & completed_test. stdout ;
251
+
252
+ st. write_log_result ( test, result, exec_time. as_ref ( ) ) ?;
253
+ out. write_result ( test, result, exec_time. as_ref ( ) , & * stdout, st) ?;
254
+ handle_test_result ( st, completed_test) ;
249
255
}
250
256
}
251
257
258
+ Ok ( ( ) )
259
+ }
260
+
261
+ /// A simple console test runner.
262
+ /// Runs provided tests reporting process and results to the stdout.
263
+ pub fn run_tests_console ( opts : & TestOpts , tests : Vec < TestDescAndFn > ) -> io:: Result < bool > {
252
264
let output = match term:: stdout ( ) {
253
265
None => OutputLocation :: Raw ( io:: stdout ( ) ) ,
254
266
Some ( t) => OutputLocation :: Pretty ( t) ,
@@ -279,16 +291,18 @@ pub fn run_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Resu
279
291
OutputFormat :: Json => Box :: new ( JsonFormatter :: new ( output) ) ,
280
292
} ;
281
293
let mut st = ConsoleTestState :: new ( opts) ?;
282
- fn len_if_padded ( t : & TestDescAndFn ) -> usize {
283
- match t. testfn . padding ( ) {
284
- NamePadding :: PadNone => 0 ,
285
- NamePadding :: PadOnRight => t. desc . name . as_slice ( ) . len ( ) ,
286
- }
287
- }
288
294
289
295
run_tests ( opts, tests, |x| on_test_event ( & x, & mut st, & mut * out) ) ?;
290
296
291
297
assert ! ( st. current_test_count( ) == st. total) ;
292
298
293
299
return out. write_run_finish ( & st) ;
294
300
}
301
+
302
+ // Calculates padding for given test description.
303
+ fn len_if_padded ( t : & TestDescAndFn ) -> usize {
304
+ match t. testfn . padding ( ) {
305
+ NamePadding :: PadNone => 0 ,
306
+ NamePadding :: PadOnRight => t. desc . name . as_slice ( ) . len ( ) ,
307
+ }
308
+ }
0 commit comments