diff --git a/src/bin/cargo/commands/bench.rs b/src/bin/cargo/commands/bench.rs index f611179e8c9..3739d880e2c 100644 --- a/src/bin/cargo/commands/bench.rs +++ b/src/bin/cargo/commands/bench.rs @@ -14,7 +14,7 @@ pub fn cli() -> Command { Arg::new("args") .help("Arguments for the bench binary") .num_args(0..) - .trailing_var_arg(true), + .last(true), ) .arg_targets_all( "Benchmark only this package's library", diff --git a/src/bin/cargo/commands/test.rs b/src/bin/cargo/commands/test.rs index a47b783315a..607655aaf33 100644 --- a/src/bin/cargo/commands/test.rs +++ b/src/bin/cargo/commands/test.rs @@ -15,7 +15,7 @@ pub fn cli() -> Command { Arg::new("args") .help("Arguments for the test binary") .num_args(0..) - .trailing_var_arg(true), + .last(true), ) .arg( flag( diff --git a/tests/testsuite/test.rs b/tests/testsuite/test.rs index 0e1d5c3fd34..b6e21775cc5 100644 --- a/tests/testsuite/test.rs +++ b/tests/testsuite/test.rs @@ -725,13 +725,101 @@ fn dont_run_examples() { } #[cargo_test] -fn pass_through_command_line() { +fn pass_through_escaped() { let p = project() .file( "src/lib.rs", " - #[test] fn foo() {} - #[test] fn bar() {} + /// ```rust + /// assert!(foo::foo()); + /// ``` + pub fn foo() -> bool { + true + } + + /// ```rust + /// assert!(!foo::bar()); + /// ``` + pub fn bar() -> bool { + false + } + + #[test] fn test_foo() { + assert!(foo()); + } + #[test] fn test_bar() { + assert!(!bar()); + } + ", + ) + .build(); + + p.cargo("test -- bar") + .with_stderr( + "\ +[COMPILING] foo v0.0.1 ([CWD]) +[FINISHED] test [unoptimized + debuginfo] target(s) in [..] +[RUNNING] [..] (target/debug/deps/foo-[..][EXE]) +[DOCTEST] foo +", + ) + .with_stdout_contains("running 1 test") + .with_stdout_contains("test test_bar ... ok") + .run(); + + p.cargo("test -- foo") + .with_stderr( + "\ +[FINISHED] test [unoptimized + debuginfo] target(s) in [..] +[RUNNING] [..] (target/debug/deps/foo-[..][EXE]) +[DOCTEST] foo +", + ) + .with_stdout_contains("running 1 test") + .with_stdout_contains("test test_foo ... ok") + .run(); + + p.cargo("test -- foo bar") + .with_stderr( + "\ +[FINISHED] test [unoptimized + debuginfo] target(s) in [..] +[RUNNING] [..] (target/debug/deps/foo-[..][EXE]) +[DOCTEST] foo +", + ) + .with_stdout_contains("running 2 tests") + .with_stdout_contains("test test_foo ... ok") + .with_stdout_contains("test test_bar ... ok") + .run(); +} + +// Unlike `pass_through_escaped`, doctests won't run when using `testname` as an optimization +#[cargo_test] +fn pass_through_testname() { + let p = project() + .file( + "src/lib.rs", + " + /// ```rust + /// assert!(foo::foo()); + /// ``` + pub fn foo() -> bool { + true + } + + /// ```rust + /// assert!(!foo::bar()); + /// ``` + pub fn bar() -> bool { + false + } + + #[test] fn test_foo() { + assert!(foo()); + } + #[test] fn test_bar() { + assert!(!bar()); + } ", ) .build(); @@ -745,7 +833,7 @@ fn pass_through_command_line() { ", ) .with_stdout_contains("running 1 test") - .with_stdout_contains("test bar ... ok") + .with_stdout_contains("test test_bar ... ok") .run(); p.cargo("test foo") @@ -756,7 +844,19 @@ fn pass_through_command_line() { ", ) .with_stdout_contains("running 1 test") - .with_stdout_contains("test foo ... ok") + .with_stdout_contains("test test_foo ... ok") + .run(); + + p.cargo("test foo -- bar") + .with_stderr( + "\ +[FINISHED] test [unoptimized + debuginfo] target(s) in [..] +[RUNNING] [..] (target/debug/deps/foo-[..][EXE]) +", + ) + .with_stdout_contains("running 2 tests") + .with_stdout_contains("test test_foo ... ok") + .with_stdout_contains("test test_bar ... ok") .run(); }