diff --git a/crates/libtest-lexarg/src/lib.rs b/crates/libtest-lexarg/src/lib.rs index aeffd1e..3a402e4 100644 --- a/crates/libtest-lexarg/src/lib.rs +++ b/crates/libtest-lexarg/src/lib.rs @@ -108,6 +108,7 @@ Options: --ignored Run only ignored tests --include-ignored Run ignored and not ignored tests + --fail-fast Don't start new tests after the first failure --no-capture don't capture stdout/stderr of each task, allow printing directly --show-output Show captured stdout of successful tests @@ -221,6 +222,9 @@ impl TestOptsBuilder { Long("exact") => { self.opts.filter_exact = true; } + Long("fail-fast") => { + self.opts.fail_fast = true; + } Long("color") => { let color = parser .next_flag_value() diff --git a/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs b/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs index ffce1f1..dc74494 100644 --- a/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs +++ b/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs @@ -1012,6 +1012,146 @@ failures: test result: FAILED. 2 passed; 1 failed; 5 ignored; 0 filtered out; finished in [..]s +"#]], + ); +} + +#[test] +fn fail_fast() { + check( + &["--fail-fast"], + 101, + str![[r#" + +running 8 tests +test bear ... ignored +test bunny ... ignored +test cat ... ok +test dog ... FAILED + +failures: + +---- dog ---- +was not a good boy + + +failures: + dog + +test result: FAILED. 1 passed; 1 failed; 2 ignored; 0 filtered out; finished in [..]s + + +"#]], + str![[r#" +... + +"#]], + ); +} + +#[test] +#[cfg(feature = "json")] +fn fail_fast_json() { + check( + &["-Zunstable-options", "--format=json", "--fail-fast"], + 101, + str![[r#" +[ + { + "event": "discover_start" + }, + { + "event": "discover_case", + "name": "bear" + }, + { + "event": "discover_case", + "name": "bunny" + }, + { + "event": "discover_case", + "name": "cat" + }, + { + "event": "discover_case", + "name": "dog" + }, + { + "event": "discover_case", + "name": "fly" + }, + { + "event": "discover_case", + "name": "fox" + }, + { + "event": "discover_case", + "name": "frog" + }, + { + "event": "discover_case", + "name": "owl" + }, + { + "elapsed_s": "[..]", + "event": "discover_complete" + }, + { + "event": "suite_start" + }, + { + "event": "case_start", + "name": "bear" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "message": "fails", + "name": "bear", + "status": "ignored" + }, + { + "event": "case_start", + "name": "bunny" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "message": "fails", + "name": "bunny", + "status": "ignored" + }, + { + "event": "case_start", + "name": "cat" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "name": "cat" + }, + { + "event": "case_start", + "name": "dog" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "message": "was not a good boy", + "name": "dog", + "status": "failed" + }, + { + "elapsed_s": "[..]", + "event": "suite_complete" + } +] +"#]] + .is_json() + .against_jsonlines(), + str![[r#" +... + "#]], ); } diff --git a/crates/libtest2/tests/testsuite/mixed_bag.rs b/crates/libtest2/tests/testsuite/mixed_bag.rs index 89e8c17..2f9cf64 100644 --- a/crates/libtest2/tests/testsuite/mixed_bag.rs +++ b/crates/libtest2/tests/testsuite/mixed_bag.rs @@ -1019,6 +1019,146 @@ failures: test result: FAILED. 2 passed; 1 failed; 5 ignored; 0 filtered out; finished in [..]s +"#]], + ); +} + +#[test] +fn fail_fast() { + check( + &["--fail-fast"], + 101, + str![[r#" + +running 8 tests +test bear ... ignored +test bunny ... ignored +test cat ... ok +test dog ... FAILED + +failures: + +---- dog ---- +was not a good boy + + +failures: + dog + +test result: FAILED. 1 passed; 1 failed; 2 ignored; 0 filtered out; finished in [..]s + + +"#]], + str![[r#" +... + +"#]], + ); +} + +#[test] +#[cfg(feature = "json")] +fn fail_fast_json() { + check( + &["-Zunstable-options", "--format=json", "--fail-fast"], + 101, + str![[r#" +[ + { + "event": "discover_start" + }, + { + "event": "discover_case", + "name": "bear" + }, + { + "event": "discover_case", + "name": "bunny" + }, + { + "event": "discover_case", + "name": "cat" + }, + { + "event": "discover_case", + "name": "dog" + }, + { + "event": "discover_case", + "name": "fly" + }, + { + "event": "discover_case", + "name": "fox" + }, + { + "event": "discover_case", + "name": "frog" + }, + { + "event": "discover_case", + "name": "owl" + }, + { + "elapsed_s": "[..]", + "event": "discover_complete" + }, + { + "event": "suite_start" + }, + { + "event": "case_start", + "name": "bear" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "message": "fails", + "name": "bear", + "status": "ignored" + }, + { + "event": "case_start", + "name": "bunny" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "message": "fails", + "name": "bunny", + "status": "ignored" + }, + { + "event": "case_start", + "name": "cat" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "name": "cat" + }, + { + "event": "case_start", + "name": "dog" + }, + { + "elapsed_s": "[..]", + "event": "case_complete", + "message": "was not a good boy", + "name": "dog", + "status": "failed" + }, + { + "elapsed_s": "[..]", + "event": "suite_complete" + } +] +"#]] + .is_json() + .against_jsonlines(), + str![[r#" +... + "#]], ); }