about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume.gomez@huawei.com>2024-06-20 15:55:18 +0200
committerGuillaume Gomez <guillaume.gomez@huawei.com>2024-08-13 20:14:56 +0200
commitd512438435aa1ee1731e2d5a45d01b6f14493e15 (patch)
tree281ce1bc0df0ba53e43125fbe9f3f178b205fc6b
parentbfabf1db446349e3cfce48f4fdd6d734e7031d5b (diff)
downloadrust-d512438435aa1ee1731e2d5a45d01b6f14493e15.tar.gz
rust-d512438435aa1ee1731e2d5a45d01b6f14493e15.zip
Run mergeable doctest as part of standalone doctests if there is only one
-rw-r--r--src/librustdoc/doctest.rs77
-rw-r--r--tests/rustdoc-ui/2024-doctests-checks.rs2
-rw-r--r--tests/rustdoc-ui/doctest/failed-doctest-should-panic.stdout4
-rw-r--r--tests/rustdoc-ui/doctest/wrong-ast-2024.stdout11
-rw-r--r--tests/rustdoc-ui/run-as-standalone.rs17
-rw-r--r--tests/rustdoc-ui/run-as-standalone.stdout7
6 files changed, 70 insertions, 48 deletions
diff --git a/src/librustdoc/doctest.rs b/src/librustdoc/doctest.rs
index 000683d0693..d0e08d07e24 100644
--- a/src/librustdoc/doctest.rs
+++ b/src/librustdoc/doctest.rs
@@ -267,50 +267,53 @@ pub(crate) fn run_tests(
         if doctests.is_empty() {
             continue;
         }
-        doctests.sort_by(|(_, a), (_, b)| a.name.cmp(&b.name));
+        // If there is only one mergeable doctest, the cost to run it would be higher than just
+        // running it alonside standalone doctests.
+        if doctests.len() > 1 {
+            doctests.sort_by(|(_, a), (_, b)| a.name.cmp(&b.name));
 
-        let mut tests_runner = runner::DocTestRunner::new();
+            let mut tests_runner = runner::DocTestRunner::new();
 
-        let rustdoc_test_options = IndividualTestOptions::new(
-            &rustdoc_options,
-            &Some(format!("merged_doctest_{edition}")),
-            PathBuf::from(format!("doctest_{edition}.rs")),
-        );
+            let rustdoc_test_options = IndividualTestOptions::new(
+                &rustdoc_options,
+                &Some(format!("merged_doctest_{edition}")),
+                PathBuf::from(format!("doctest_{edition}.rs")),
+            );
 
-        for (doctest, scraped_test) in &doctests {
-            tests_runner.add_test(doctest, scraped_test, &target_str);
-        }
-        if let Ok(success) = tests_runner.run_merged_tests(
-            rustdoc_test_options,
-            edition,
-            &opts,
-            &test_args,
-            rustdoc_options,
-        ) {
-            ran_edition_tests += 1;
-            if !success {
-                nb_errors += 1;
+            for (doctest, scraped_test) in &doctests {
+                tests_runner.add_test(doctest, scraped_test, &target_str);
+            }
+            if let Ok(success) = tests_runner.run_merged_tests(
+                rustdoc_test_options,
+                edition,
+                &opts,
+                &test_args,
+                rustdoc_options,
+            ) {
+                ran_edition_tests += 1;
+                if !success {
+                    nb_errors += 1;
+                }
+                continue;
             }
-            continue;
-        } else {
             // We failed to compile all compatible tests as one so we push them into the
             // `standalone_tests` doctests.
             debug!("Failed to compile compatible doctests for edition {} all at once", edition);
-            for (doctest, scraped_test) in doctests {
-                doctest.generate_unique_doctest(
-                    &scraped_test.text,
-                    scraped_test.langstr.test_harness,
-                    &opts,
-                    Some(&opts.crate_name),
-                );
-                standalone_tests.push(generate_test_desc_and_fn(
-                    doctest,
-                    scraped_test,
-                    opts.clone(),
-                    Arc::clone(&rustdoc_options),
-                    unused_extern_reports.clone(),
-                ));
-            }
+        }
+        for (doctest, scraped_test) in doctests {
+            doctest.generate_unique_doctest(
+                &scraped_test.text,
+                scraped_test.langstr.test_harness,
+                &opts,
+                Some(&opts.crate_name),
+            );
+            standalone_tests.push(generate_test_desc_and_fn(
+                doctest,
+                scraped_test,
+                opts.clone(),
+                Arc::clone(&rustdoc_options),
+                unused_extern_reports.clone(),
+            ));
         }
     }
 
diff --git a/tests/rustdoc-ui/2024-doctests-checks.rs b/tests/rustdoc-ui/2024-doctests-checks.rs
index 6f62c0f73ad..f6b6faa8c6a 100644
--- a/tests/rustdoc-ui/2024-doctests-checks.rs
+++ b/tests/rustdoc-ui/2024-doctests-checks.rs
@@ -2,7 +2,7 @@
 //@ compile-flags: --test --test-args=--test-threads=1 -Zunstable-options --edition 2024
 //@ normalize-stdout-test: "tests/rustdoc-ui" -> "$$DIR"
 //@ normalize-stdout-test "finished in \d+\.\d+s" -> "finished in $$TIME"
-//@ normalize-stdout-test "wrong-ast.rs:\d+:\d+" -> "wrong-ast.rs:$$LINE:$$COL"
+//@ normalize-stdout-test ".rs:\d+:\d+" -> ".rs:$$LINE:$$COL"
 
 /// This one should fail: crate attributes should remain crate attributes
 /// in standalone doctests.
diff --git a/tests/rustdoc-ui/doctest/failed-doctest-should-panic.stdout b/tests/rustdoc-ui/doctest/failed-doctest-should-panic.stdout
index cb3456e087e..57a20092a5d 100644
--- a/tests/rustdoc-ui/doctest/failed-doctest-should-panic.stdout
+++ b/tests/rustdoc-ui/doctest/failed-doctest-should-panic.stdout
@@ -1,11 +1,11 @@
 
 running 1 test
-test $DIR/failed-doctest-should-panic.rs - Foo (line 9) - should panic ... FAILED
+test $DIR/failed-doctest-should-panic.rs - Foo (line 9) ... FAILED
 
 failures:
 
 ---- $DIR/failed-doctest-should-panic.rs - Foo (line 9) stdout ----
-note: test did not panic as expected
+Test executable succeeded, but it's marked `should_panic`.
 
 failures:
     $DIR/failed-doctest-should-panic.rs - Foo (line 9)
diff --git a/tests/rustdoc-ui/doctest/wrong-ast-2024.stdout b/tests/rustdoc-ui/doctest/wrong-ast-2024.stdout
index 22c8ce468fd..08ec69199d3 100644
--- a/tests/rustdoc-ui/doctest/wrong-ast-2024.stdout
+++ b/tests/rustdoc-ui/doctest/wrong-ast-2024.stdout
@@ -1,12 +1,7 @@
 
-running 1 test
-test $DIR/wrong-ast-2024.rs - three (line 17) - should panic ... ok
-
-test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
-
-
-running 2 tests
+running 3 tests
 test $DIR/wrong-ast-2024.rs - one (line 7) ... FAILED
+test $DIR/wrong-ast-2024.rs - three (line 17) ... ok
 test $DIR/wrong-ast-2024.rs - two (line 12) ... FAILED
 
 failures:
@@ -37,5 +32,5 @@ failures:
     $DIR/wrong-ast-2024.rs - one (line 7)
     $DIR/wrong-ast-2024.rs - two (line 12)
 
-test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
+test result: FAILED. 1 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
 
diff --git a/tests/rustdoc-ui/run-as-standalone.rs b/tests/rustdoc-ui/run-as-standalone.rs
new file mode 100644
index 00000000000..a0fb0340f8d
--- /dev/null
+++ b/tests/rustdoc-ui/run-as-standalone.rs
@@ -0,0 +1,17 @@
+// This test ensures that if there is only one mergeable doctest, then it is
+// instead run as part of standalone doctests.
+
+//@ compile-flags:--test --test-args=--test-threads=1 -Zunstable-options --edition 2024
+//@ normalize-stdout-test: "tests/rustdoc-ui" -> "$$DIR"
+//@ normalize-stdout-test "finished in \d+\.\d+s" -> "finished in $$TIME"
+//@ normalize-stdout-test ".rs:\d+:\d+" -> ".rs:$$LINE:$$COL"
+//@ check-pass
+
+/// ```
+/// let x = 12;
+/// ```
+///
+/// ```compile_fail
+/// let y = x;
+/// ```
+pub fn one() {}
diff --git a/tests/rustdoc-ui/run-as-standalone.stdout b/tests/rustdoc-ui/run-as-standalone.stdout
new file mode 100644
index 00000000000..ec66f6753b1
--- /dev/null
+++ b/tests/rustdoc-ui/run-as-standalone.stdout
@@ -0,0 +1,7 @@
+
+running 2 tests
+test $DIR/run-as-standalone.rs - one (line 10) ... ok
+test $DIR/run-as-standalone.rs - one (line 14) - compile fail ... ok
+
+test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
+