@@ -112,8 +112,7 @@ mod __doctest_mod {{
112
112
use std::path::PathBuf;
113
113
114
114
pub static BINARY_PATH: OnceLock<PathBuf> = OnceLock::new();
115
- pub const RUN_OPTION: &str = \" *doctest-inner-test\" ;
116
- pub const BIN_OPTION: &str = \" *doctest-bin-path\" ;
115
+ pub const RUN_OPTION: &str = \" RUSTDOC_DOCTEST_RUN_NB_TEST\" ;
117
116
118
117
#[allow(unused)]
119
118
pub fn doctest_path() -> Option<&'static PathBuf> {{
@@ -123,8 +122,8 @@ mod __doctest_mod {{
123
122
#[allow(unused)]
124
123
pub fn doctest_runner(bin: &std::path::Path, test_nb: usize) -> Result<(), String> {{
125
124
let out = std::process::Command::new(bin)
126
- .arg (self::RUN_OPTION)
127
- .arg(test_nb.to_string ())
125
+ .env (self::RUN_OPTION, test_nb.to_string() )
126
+ .args(std::env::args().skip(1).collect::<Vec<_>> ())
128
127
.output()
129
128
.expect(\" failed to run command\" );
130
129
if !out.status.success() {{
@@ -138,36 +137,27 @@ mod __doctest_mod {{
138
137
#[rustc_main]
139
138
fn main() -> std::process::ExitCode {{
140
139
const TESTS: [test::TestDescAndFn; {nb_tests}] = [{ids}];
141
- let bin_marker = std::ffi::OsStr::new(__doctest_mod::BIN_OPTION);
142
140
let test_marker = std::ffi::OsStr::new(__doctest_mod::RUN_OPTION);
143
141
let test_args = &[{test_args}];
142
+ const ENV_BIN: &'static str = \" RUSTDOC_DOCTEST_BIN_PATH\" ;
144
143
145
- let mut args = std::env::args_os().skip(1);
146
- while let Some(arg) = args.next() {{
147
- if arg == bin_marker {{
148
- let Some(binary) = args.next() else {{
149
- panic!(\" missing argument after `{{}}`\" , __doctest_mod::BIN_OPTION);
150
- }};
151
- if crate::__doctest_mod::BINARY_PATH.set(binary.into()).is_err() {{
152
- panic!(\" `{{}}` option was used more than once\" , bin_marker.to_string_lossy());
153
- }}
154
- return std::process::Termination::report(test::test_main(test_args, Vec::from(TESTS), None));
155
- }} else if arg == test_marker {{
156
- let Some(nb_test) = args.next() else {{
157
- panic!(\" missing argument after `{{}}`\" , __doctest_mod::RUN_OPTION);
158
- }};
159
- if let Some(nb_test) = nb_test.to_str().and_then(|nb| nb.parse::<usize>().ok()) {{
160
- if let Some(test) = TESTS.get(nb_test) {{
161
- if let test::StaticTestFn(f) = test.testfn {{
162
- return std::process::Termination::report(f());
163
- }}
144
+ if let Ok(binary) = std::env::var(ENV_BIN) {{
145
+ let _ = crate::__doctest_mod::BINARY_PATH.set(binary.into());
146
+ unsafe {{ std::env::remove_var(ENV_BIN); }}
147
+ return std::process::Termination::report(test::test_main(test_args, Vec::from(TESTS), None));
148
+ }} else if let Ok(nb_test) = std::env::var(__doctest_mod::RUN_OPTION) {{
149
+ if let Ok(nb_test) = nb_test.parse::<usize>() {{
150
+ if let Some(test) = TESTS.get(nb_test) {{
151
+ if let test::StaticTestFn(f) = test.testfn {{
152
+ return std::process::Termination::report(f());
164
153
}}
165
154
}}
166
- panic!(\" Unexpected value after `{{}}`\" , __doctest_mod::RUN_OPTION);
167
155
}}
156
+ panic!(\" Unexpected value for `{{}}`\" , __doctest_mod::RUN_OPTION);
168
157
}}
169
158
170
- eprintln!(\" WARNING: No argument provided so doctests will be run in the same process\" );
159
+ eprintln!(\" WARNING: No rustdoc doctest environment variable provided so doctests will be run in \
160
+ the same process\" );
171
161
std::process::Termination::report(test::test_main(test_args, Vec::from(TESTS), None))
172
162
}}" ,
173
163
nb_tests = self . nb_tests,
0 commit comments