Skip to content

Commit 637530b

Browse files
committed
Tests for externalDocs
1 parent 7eaad4b commit 637530b

File tree

1 file changed

+100
-19
lines changed

1 file changed

+100
-19
lines changed

crates/ide/src/doc_links/tests.rs

Lines changed: 100 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::ffi::OsStr;
2+
13
use expect_test::{expect, Expect};
24
use hir::{HasAttrs, Semantics};
35
use ide_db::{
@@ -13,11 +15,32 @@ use crate::{
1315
fixture, TryToNav,
1416
};
1517

16-
fn check_external_docs(ra_fixture: &str, expect: Expect) {
18+
fn check_external_docs(
19+
ra_fixture: &str,
20+
target_dir: Option<&OsStr>,
21+
expect_web_url: Option<Expect>,
22+
expect_local_url: Option<Expect>,
23+
) {
1724
let (analysis, position) = fixture::position(ra_fixture);
18-
let url = analysis.external_docs(position).unwrap().expect("could not find url for symbol");
25+
let links = analysis.external_docs(position, target_dir).unwrap();
26+
27+
let web_url = links.web_url;
28+
let local_url = links.local_url;
29+
30+
println!("web_url: {:?}", web_url);
31+
println!("local_url: {:?}", local_url);
1932

20-
expect.assert_eq(&url)
33+
match (expect_web_url, web_url) {
34+
(Some(expect), Some(url)) => expect.assert_eq(&url),
35+
(None, None) => (),
36+
_ => panic!("Unexpected web url"),
37+
}
38+
39+
match (expect_local_url, local_url) {
40+
(Some(expect), Some(url)) => expect.assert_eq(&url),
41+
(None, None) => (),
42+
_ => panic!("Unexpected local url"),
43+
}
2144
}
2245

2346
fn check_rewrite(ra_fixture: &str, expect: Expect) {
@@ -105,7 +128,9 @@ use foo$0::Foo;
105128
//- /lib.rs crate:foo
106129
pub struct Foo;
107130
"#,
108-
expect![[r#"https://docs.rs/foo/*/foo/index.html"#]],
131+
Some(&OsStr::new("/home/user/project/")),
132+
Some(expect![[r#"https://docs.rs/foo/*/foo/index.html"#]]),
133+
Some(expect![[r#"file:///home/user/project/doc/foo/index.html"#]]),
109134
);
110135
}
111136

@@ -116,7 +141,9 @@ fn external_docs_doc_url_std_crate() {
116141
//- /main.rs crate:std
117142
use self$0;
118143
"#,
119-
expect!["https://doc.rust-lang.org/stable/std/index.html"],
144+
Some(&OsStr::new("/home/user/project/")),
145+
Some(expect!["https://doc.rust-lang.org/stable/std/index.html"]),
146+
None,
120147
);
121148
}
122149

@@ -127,7 +154,35 @@ fn external_docs_doc_url_struct() {
127154
//- /main.rs crate:foo
128155
pub struct Fo$0o;
129156
"#,
130-
expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]],
157+
Some(&OsStr::new("/home/user/project/")),
158+
Some(expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]]),
159+
Some(expect![[r#"file:///home/user/project/doc/foo/struct.Foo.html"#]]),
160+
);
161+
}
162+
163+
#[test]
164+
fn external_docs_doc_url_windows_backslash_path() {
165+
check_external_docs(
166+
r#"
167+
//- /main.rs crate:foo
168+
pub struct Fo$0o;
169+
"#,
170+
Some(&OsStr::new(r"C:\Users\user\project")),
171+
Some(expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]]),
172+
Some(expect![[r#"file:///C:\Users\user\project/doc/foo/struct.Foo.html"#]]),
173+
);
174+
}
175+
176+
#[test]
177+
fn external_docs_doc_url_windows_slash_path() {
178+
check_external_docs(
179+
r#"
180+
//- /main.rs crate:foo
181+
pub struct Fo$0o;
182+
"#,
183+
Some(&OsStr::new(r"C:/Users/user/project")),
184+
Some(expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]]),
185+
Some(expect![[r#"file:///C:/Users/user/project/doc/foo/struct.Foo.html"#]]),
131186
);
132187
}
133188

@@ -140,7 +195,9 @@ pub struct Foo {
140195
field$0: ()
141196
}
142197
"#,
143-
expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#structfield.field"##]],
198+
None,
199+
Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#structfield.field"##]]),
200+
None,
144201
);
145202
}
146203

@@ -151,7 +208,9 @@ fn external_docs_doc_url_fn() {
151208
//- /main.rs crate:foo
152209
pub fn fo$0o() {}
153210
"#,
154-
expect![[r#"https://docs.rs/foo/*/foo/fn.foo.html"#]],
211+
None,
212+
Some(expect![[r#"https://docs.rs/foo/*/foo/fn.foo.html"#]]),
213+
None,
155214
);
156215
}
157216

@@ -165,7 +224,9 @@ impl Foo {
165224
pub fn method$0() {}
166225
}
167226
"#,
168-
expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]],
227+
None,
228+
Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]]),
229+
None,
169230
);
170231
check_external_docs(
171232
r#"
@@ -175,7 +236,9 @@ impl Foo {
175236
const CONST$0: () = ();
176237
}
177238
"#,
178-
expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]],
239+
None,
240+
Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]]),
241+
None,
179242
);
180243
}
181244

@@ -192,7 +255,9 @@ impl Trait for Foo {
192255
pub fn method$0() {}
193256
}
194257
"#,
195-
expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]],
258+
None,
259+
Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]]),
260+
None,
196261
);
197262
check_external_docs(
198263
r#"
@@ -205,7 +270,9 @@ impl Trait for Foo {
205270
const CONST$0: () = ();
206271
}
207272
"#,
208-
expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]],
273+
None,
274+
Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]]),
275+
None,
209276
);
210277
check_external_docs(
211278
r#"
@@ -218,7 +285,9 @@ impl Trait for Foo {
218285
type Type$0 = ();
219286
}
220287
"#,
221-
expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedtype.Type"##]],
288+
None,
289+
Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedtype.Type"##]]),
290+
None,
222291
);
223292
}
224293

@@ -231,7 +300,9 @@ pub trait Foo {
231300
fn method$0();
232301
}
233302
"#,
234-
expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#tymethod.method"##]],
303+
None,
304+
Some(expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#tymethod.method"##]]),
305+
None,
235306
);
236307
check_external_docs(
237308
r#"
@@ -240,7 +311,9 @@ pub trait Foo {
240311
const CONST$0: ();
241312
}
242313
"#,
243-
expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedconstant.CONST"##]],
314+
None,
315+
Some(expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedconstant.CONST"##]]),
316+
None,
244317
);
245318
check_external_docs(
246319
r#"
@@ -249,7 +322,9 @@ pub trait Foo {
249322
type Type$0;
250323
}
251324
"#,
252-
expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedtype.Type"##]],
325+
None,
326+
Some(expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedtype.Type"##]]),
327+
None,
253328
);
254329
}
255330

@@ -260,7 +335,9 @@ fn external_docs_trait() {
260335
//- /main.rs crate:foo
261336
trait Trait$0 {}
262337
"#,
263-
expect![[r#"https://docs.rs/foo/*/foo/trait.Trait.html"#]],
338+
None,
339+
Some(expect![[r#"https://docs.rs/foo/*/foo/trait.Trait.html"#]]),
340+
None,
264341
)
265342
}
266343

@@ -273,7 +350,9 @@ pub mod foo {
273350
pub mod ba$0r {}
274351
}
275352
"#,
276-
expect![[r#"https://docs.rs/foo/*/foo/foo/bar/index.html"#]],
353+
None,
354+
Some(expect![[r#"https://docs.rs/foo/*/foo/foo/bar/index.html"#]]),
355+
None,
277356
)
278357
}
279358

@@ -294,7 +373,9 @@ fn foo() {
294373
let bar: wrapper::It$0em;
295374
}
296375
"#,
297-
expect![[r#"https://docs.rs/foo/*/foo/wrapper/module/struct.Item.html"#]],
376+
None,
377+
Some(expect![[r#"https://docs.rs/foo/*/foo/wrapper/module/struct.Item.html"#]]),
378+
None,
298379
)
299380
}
300381

0 commit comments

Comments
 (0)