Skip to content

Commit 85628e8

Browse files
committed
Add more explaining comments to the code
1 parent ddc6a5f commit 85628e8

File tree

3 files changed

+94
-68
lines changed

3 files changed

+94
-68
lines changed

src/libtest/console.rs

Lines changed: 81 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,23 @@ use std::io;
77
use term;
88

99
use 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.
2527
pub 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-
4848
pub 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+
}

src/libtest/options.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,46 @@ pub enum Concurrent {
77
No,
88
}
99

10+
/// Number of times to run a benchmarked function
1011
#[derive(Clone, PartialEq, Eq)]
1112
pub enum BenchMode {
1213
Auto,
1314
Single,
1415
}
1516

17+
/// Whether test is expected to panic or not
1618
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1719
pub enum ShouldPanic {
1820
No,
1921
Yes,
2022
YesWithMessage(&'static str),
2123
}
2224

25+
/// Whether should console output be colored or not
2326
#[derive(Copy, Clone, Debug)]
2427
pub enum ColorConfig {
2528
AutoColor,
2629
AlwaysColor,
2730
NeverColor,
2831
}
2932

33+
/// Format of the test results output
3034
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
3135
pub enum OutputFormat {
36+
/// Verbose output
3237
Pretty,
38+
/// Quiet output
3339
Terse,
40+
/// JSON output
3441
Json,
3542
}
3643

44+
/// Whether ignored test should be runned or not
3745
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
3846
pub enum RunIgnored {
3947
Yes,
4048
No,
49+
/// Run only ignored tests
4150
Only,
4251
}
4352

@@ -53,6 +62,7 @@ pub enum RunStrategy {
5362
SpawnPrimary,
5463
}
5564

65+
/// Options for the test run defined by the caller (instead of CLI arguments).
5666
/// In case we want to add other options as well, just add them in this struct.
5767
#[derive(Copy, Clone, Debug)]
5868
pub struct Options {

src/libtest/test_result.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ pub enum TestResult {
2727

2828
unsafe impl Send for TestResult {}
2929

30-
30+
/// Creates a `TestResult` depending on the raw result of test execution
31+
/// and assotiated data.
3132
pub fn calc_result<'a>(
3233
desc: &TestDesc,
3334
task_result: Result<(), &'a (dyn Any + 'static + Send)>,
@@ -73,6 +74,7 @@ pub fn calc_result<'a>(
7374
result
7475
}
7576

77+
/// Creates a `TestResult` depending on the exit code of test subprocess.
7678
pub fn get_result_from_exit_code(
7779
desc: &TestDesc,
7880
code: i32,

0 commit comments

Comments
 (0)