Skip to content

Commit 3c1aa55

Browse files
Add regression test for scraped examples in crates without [workspace]
1 parent ce8dc50 commit 3c1aa55

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

tests/testsuite/docscrape.rs

+121
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,127 @@ fn basic() {
4848
assert!(p.build_dir().join("doc/src/ex/ex.rs.html").exists());
4949
}
5050

51+
// This test ensures that even if there is no `[workspace]` in the top-level `Cargo.toml` file, the
52+
// dependencies will get their examples scraped and that they appear in the generated documentation.
53+
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
54+
fn without_workspace() {
55+
let p = project()
56+
.file(
57+
"Cargo.toml",
58+
r#"
59+
[package]
60+
name = "foo"
61+
version = "0.0.1"
62+
edition = "2021"
63+
authors = []
64+
65+
[dependencies]
66+
a = { path = "crates/a" }
67+
b = { path = "crates/b" }
68+
"#,
69+
)
70+
.file("src/lib.rs", "pub use a::*;\npub use b::*;")
71+
// Examples
72+
.file(
73+
"examples/one.rs",
74+
r#"use foo::*;
75+
fn main() {
76+
let foo = Foo::new("yes".into());
77+
foo.maybe();
78+
}"#,
79+
)
80+
.file(
81+
"examples/two.rs",
82+
r#"use foo::*;
83+
fn main() {
84+
let foo: Foo = Foo::new("yes".into());
85+
let bar = Bar { amount: 1200. };
86+
println!("{}", bar.pa());
87+
}"#,
88+
)
89+
// `a` crate
90+
.file(
91+
"crates/a/Cargo.toml",
92+
r#"
93+
[package]
94+
name = "a"
95+
version = "0.0.1"
96+
authors = []
97+
"#,
98+
)
99+
.file(
100+
"crates/a/src/lib.rs",
101+
r#"
102+
#[derive(Debug)]
103+
pub struct Foo {
104+
foo: String,
105+
yes: bool,
106+
}
107+
108+
impl Foo {
109+
pub fn new(foo: String) -> Self {
110+
Self { foo, yes: true }
111+
}
112+
113+
pub fn maybe(&self) {
114+
if self.yes {
115+
println!("{}", self.foo)
116+
}
117+
}
118+
}"#,
119+
)
120+
// `b` crate
121+
.file(
122+
"crates/b/Cargo.toml",
123+
r#"
124+
[package]
125+
name = "b"
126+
version = "0.0.1"
127+
authors = []
128+
"#,
129+
)
130+
.file(
131+
"crates/b/src/lib.rs",
132+
r#"
133+
#[derive(Debug)]
134+
pub struct Bar {
135+
/// pressure in Pascal
136+
pub amount: f32,
137+
}
138+
139+
impl Bar {
140+
pub fn pa(&self) -> f32 {
141+
self.amount
142+
}
143+
}"#,
144+
)
145+
.build();
146+
147+
p.cargo("doc -Zunstable-options -Zrustdoc-scrape-examples --no-deps")
148+
.masquerade_as_nightly_cargo(&["rustdoc-scrape-examples"])
149+
.with_stderr_unordered(
150+
"\
151+
[CHECKING] a v0.0.1 ([CWD]/crates/a)
152+
[CHECKING] b v0.0.1 ([CWD]/crates/b)
153+
[CHECKING] foo v0.0.1 ([CWD])
154+
[SCRAPING] foo v0.0.1 ([CWD])
155+
[DOCUMENTING] foo v0.0.1 ([CWD])
156+
[FINISHED] [..]
157+
[GENERATED] [CWD]/target/doc/foo/index.html",
158+
)
159+
.run();
160+
161+
let doc_html = p.read_file("target/doc/foo/struct.Foo.html");
162+
assert!(doc_html.contains("Examples found in repository"));
163+
// `Foo` is used in the two examples so since there are more than one example, we should have
164+
// this sentence.
165+
assert!(doc_html.contains("More examples"));
166+
let doc_html = p.read_file("target/doc/foo/struct.Bar.html");
167+
assert!(doc_html.contains("Examples found in repository"));
168+
// There is only only usage of `Bar` so we shouldn't have this sentence in the docs.
169+
assert!(!doc_html.contains("More examples"));
170+
}
171+
51172
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
52173
fn avoid_build_script_cycle() {
53174
let p = project()

0 commit comments

Comments
 (0)