@@ -7,21 +7,23 @@ use std::io;
77use term;
88
99use super :: {
10+ bench:: fmt_bench_samples,
11+ cli:: TestOpts ,
12+ event:: { TestEvent , CompletedTest } ,
13+ formatters:: { JsonFormatter , OutputFormatter , PrettyFormatter , TerseFormatter } ,
1014 helpers:: {
1115 concurrency:: get_concurrency,
1216 metrics:: MetricMap ,
1317 } ,
1418 types:: { TestDesc , TestDescAndFn , NamePadding } ,
1519 options:: { Options , OutputFormat } ,
16- bench:: fmt_bench_samples,
1720 test_result:: TestResult ,
1821 time:: TestExecTime ,
19- cli:: TestOpts ,
20- event:: TestEvent ,
2122 run_tests,
2223 filter_tests,
2324} ;
2425
26+ /// Generic wrapper over stdout.
2527pub enum OutputLocation < T > {
2628 Pretty ( Box < term:: StdoutTerminal > ) ,
2729 Raw ( T ) ,
@@ -43,8 +45,6 @@ impl<T: Write> Write for OutputLocation<T> {
4345 }
4446}
4547
46- use crate :: formatters:: { JsonFormatter , OutputFormatter , PrettyFormatter , TerseFormatter } ;
47-
4848pub struct ConsoleTestState {
4949 pub log_out : Option < File > ,
5050 pub total : usize ,
@@ -190,65 +190,77 @@ pub fn list_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Res
190190 Ok ( ( ) )
191191}
192192
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) ;
249255 }
250256 }
251257
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 > {
252264 let output = match term:: stdout ( ) {
253265 None => OutputLocation :: Raw ( io:: stdout ( ) ) ,
254266 Some ( t) => OutputLocation :: Pretty ( t) ,
@@ -279,16 +291,18 @@ pub fn run_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Resu
279291 OutputFormat :: Json => Box :: new ( JsonFormatter :: new ( output) ) ,
280292 } ;
281293 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- }
288294
289295 run_tests ( opts, tests, |x| on_test_event ( & x, & mut st, & mut * out) ) ?;
290296
291297 assert ! ( st. current_test_count( ) == st. total) ;
292298
293299 return out. write_run_finish ( & st) ;
294300}
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