From dffc5baeb2c9374a82dc81a2fc6e94b7c9c5fd83 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Wed, 2 May 2018 20:17:53 -0700 Subject: [PATCH] Partially revert change to testing examples. Fixes #5437 I don't think changing the behavior was quite the correct thing to do. This new behavior is very similar to the old with a few small differences: ``` cargo test ORGINAL: Only builds examples. NEW: Builds all examples. Any example with `test` set is tested. cargo test --tests ORIGINAL: Runs all examples as tests. NEW: Only runs examples as tests if `test` is set. cargo test --examples ORIGINAL: Runs all examples as tests. NEW: (SAME) cargo test --example foo ORIGINAL: Runs the given example as a test. NEW: (SAME) cargo test --all-targets ORIGINAL: Runs all examples as tests. NEW: (SAME) ``` --- src/cargo/ops/cargo_compile.rs | 2 +- tests/testsuite/test.rs | 72 ++++++++++++++++++++++++++++------ 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 594c7b430..c13ad0a35 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -603,7 +603,7 @@ fn generate_targets<'a>( }; let target_mode = match target_mode { CompileMode::Test => { - if target.is_example() { + if target.is_example() && !filter.is_specific() && !target.tested() { // Examples are included as regular binaries to verify // that they compile. CompileMode::Build diff --git a/tests/testsuite/test.rs b/tests/testsuite/test.rs index 36c2f9b36..c48dbf2bb 100644 --- a/tests/testsuite/test.rs +++ b/tests/testsuite/test.rs @@ -1721,8 +1721,15 @@ fn test_run_implicit_example_target() { authors = [] [[bin]] - name="mybin" - path="src/mybin.rs" + name = "mybin" + path = "src/mybin.rs" + + [[example]] + name = "myexm1" + + [[example]] + name = "myexm2" + test = true "#, ) .file( @@ -1733,20 +1740,61 @@ fn test_run_implicit_example_target() { .file("tests/mytest.rs", "#[test] fn test_in_test() { }") .file("benches/mybench.rs", "#[test] fn test_in_bench() { }") .file( - "examples/myexm.rs", - r#"#[test] fn test_in_exm() { panic!("Don't even test me."); } - fn main() { panic!("Don't execute me!"); }"#, + "examples/myexm1.rs", + "#[test] fn test_in_exm() { } + fn main() { panic!(\"Don't execute me!\"); }", + ) + .file( + "examples/myexm2.rs", + "#[test] fn test_in_exm() { } + fn main() { panic!(\"Don't execute me!\"); }", ) .build(); + // Compiles myexm1 as normal, but does not run it. assert_that( - prj.cargo("test").arg("--examples"), - execs().with_status(0).with_stderr(format!( - "\ -[COMPILING] foo v0.0.1 ({dir}) -[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]", - dir = prj.url() - )), + prj.cargo("test -v"), + execs() + .with_status(0) + .with_stderr_contains("[RUNNING] `rustc [..]myexm1.rs --crate-type bin[..]") + .with_stderr_contains("[RUNNING] `rustc [..]myexm2.rs [..]--test[..]") + .with_stderr_does_not_contain("[RUNNING] [..]myexm1-[..]") + .with_stderr_contains("[RUNNING] [..]target[/]debug[/]examples[/]myexm2-[..]"), + ); + + // Only tests myexm2. + assert_that( + prj.cargo("test --tests"), + execs() + .with_status(0) + .with_stderr_does_not_contain("[RUNNING] [..]myexm1-[..]") + .with_stderr_contains("[RUNNING] [..]target[/]debug[/]examples[/]myexm2-[..]"), + ); + + // Tests all examples. + assert_that( + prj.cargo("test --examples"), + execs() + .with_status(0) + .with_stderr_contains("[RUNNING] [..]target[/]debug[/]examples[/]myexm1-[..]") + .with_stderr_contains("[RUNNING] [..]target[/]debug[/]examples[/]myexm2-[..]"), + ); + + // Test an example, even without `test` set. + assert_that( + prj.cargo("test --example myexm1"), + execs() + .with_status(0) + .with_stderr_contains("[RUNNING] [..]target[/]debug[/]examples[/]myexm1-[..]"), + ); + + // Tests all examples. + assert_that( + prj.cargo("test --all-targets"), + execs() + .with_status(0) + .with_stderr_contains("[RUNNING] [..]target[/]debug[/]examples[/]myexm1-[..]") + .with_stderr_contains("[RUNNING] [..]target[/]debug[/]examples[/]myexm2-[..]"), ); }