Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/doc_links/tests.rs')
-rw-r--r--crates/ide/src/doc_links/tests.rs152
1 files changed, 133 insertions, 19 deletions
diff --git a/crates/ide/src/doc_links/tests.rs b/crates/ide/src/doc_links/tests.rs
index 104181a33e..05a64b33bf 100644
--- a/crates/ide/src/doc_links/tests.rs
+++ b/crates/ide/src/doc_links/tests.rs
@@ -1,3 +1,5 @@
+use std::ffi::OsStr;
+
use expect_test::{expect, Expect};
use hir::{HasAttrs, Semantics};
use ide_db::{
@@ -13,11 +15,33 @@ use crate::{
fixture, TryToNav,
};
-fn check_external_docs(ra_fixture: &str, expect: Expect) {
+fn check_external_docs(
+ ra_fixture: &str,
+ target_dir: Option<&OsStr>,
+ expect_web_url: Option<Expect>,
+ expect_local_url: Option<Expect>,
+ sysroot: Option<&OsStr>,
+) {
let (analysis, position) = fixture::position(ra_fixture);
- let url = analysis.external_docs(position).unwrap().expect("could not find url for symbol");
+ let links = analysis.external_docs(position, target_dir, sysroot).unwrap();
+
+ let web_url = links.web_url;
+ let local_url = links.local_url;
+
+ println!("web_url: {:?}", web_url);
+ println!("local_url: {:?}", local_url);
+
+ match (expect_web_url, web_url) {
+ (Some(expect), Some(url)) => expect.assert_eq(&url),
+ (None, None) => (),
+ _ => panic!("Unexpected web url"),
+ }
- expect.assert_eq(&url)
+ match (expect_local_url, local_url) {
+ (Some(expect), Some(url)) => expect.assert_eq(&url),
+ (None, None) => (),
+ _ => panic!("Unexpected local url"),
+ }
}
fn check_rewrite(ra_fixture: &str, expect: Expect) {
@@ -97,6 +121,20 @@ fn node_to_def(
}
#[test]
+fn external_docs_doc_builtin_type() {
+ check_external_docs(
+ r#"
+//- /main.rs crate:foo
+let x: u3$02 = 0;
+"#,
+ Some(&OsStr::new("/home/user/project")),
+ Some(expect![[r#"https://doc.rust-lang.org/nightly/core/primitive.u32.html"#]]),
+ Some(expect![[r#"file:///sysroot/share/doc/rust/html/core/primitive.u32.html"#]]),
+ Some(&OsStr::new("/sysroot")),
+ );
+}
+
+#[test]
fn external_docs_doc_url_crate() {
check_external_docs(
r#"
@@ -105,7 +143,10 @@ use foo$0::Foo;
//- /lib.rs crate:foo
pub struct Foo;
"#,
- expect![[r#"https://docs.rs/foo/*/foo/index.html"#]],
+ Some(&OsStr::new("/home/user/project")),
+ Some(expect![[r#"https://docs.rs/foo/*/foo/index.html"#]]),
+ Some(expect![[r#"file:///home/user/project/doc/foo/index.html"#]]),
+ Some(&OsStr::new("/sysroot")),
);
}
@@ -116,7 +157,10 @@ fn external_docs_doc_url_std_crate() {
//- /main.rs crate:std
use self$0;
"#,
- expect![[r#"https://doc.rust-lang.org/nightly/std/index.html"#]],
+ Some(&OsStr::new("/home/user/project")),
+ Some(expect!["https://doc.rust-lang.org/stable/std/index.html"]),
+ Some(expect!["file:///sysroot/share/doc/rust/html/std/index.html"]),
+ Some(&OsStr::new("/sysroot")),
);
}
@@ -127,7 +171,38 @@ fn external_docs_doc_url_struct() {
//- /main.rs crate:foo
pub struct Fo$0o;
"#,
- expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]],
+ Some(&OsStr::new("/home/user/project")),
+ Some(expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]]),
+ Some(expect![[r#"file:///home/user/project/doc/foo/struct.Foo.html"#]]),
+ Some(&OsStr::new("/sysroot")),
+ );
+}
+
+#[test]
+fn external_docs_doc_url_windows_backslash_path() {
+ check_external_docs(
+ r#"
+//- /main.rs crate:foo
+pub struct Fo$0o;
+"#,
+ Some(&OsStr::new(r"C:\Users\user\project")),
+ Some(expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]]),
+ Some(expect![[r#"file:///C:/Users/user/project/doc/foo/struct.Foo.html"#]]),
+ Some(&OsStr::new("/sysroot")),
+ );
+}
+
+#[test]
+fn external_docs_doc_url_windows_slash_path() {
+ check_external_docs(
+ r#"
+//- /main.rs crate:foo
+pub struct Fo$0o;
+"#,
+ Some(&OsStr::new(r"C:/Users/user/project")),
+ Some(expect![[r#"https://docs.rs/foo/*/foo/struct.Foo.html"#]]),
+ Some(expect![[r#"file:///C:/Users/user/project/doc/foo/struct.Foo.html"#]]),
+ Some(&OsStr::new("/sysroot")),
);
}
@@ -140,7 +215,10 @@ pub struct Foo {
field$0: ()
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#structfield.field"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#structfield.field"##]]),
+ None,
+ None,
);
}
@@ -151,7 +229,10 @@ fn external_docs_doc_url_fn() {
//- /main.rs crate:foo
pub fn fo$0o() {}
"#,
- expect![[r#"https://docs.rs/foo/*/foo/fn.foo.html"#]],
+ None,
+ Some(expect![[r#"https://docs.rs/foo/*/foo/fn.foo.html"#]]),
+ None,
+ None,
);
}
@@ -165,7 +246,10 @@ impl Foo {
pub fn method$0() {}
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]]),
+ None,
+ None,
);
check_external_docs(
r#"
@@ -175,7 +259,10 @@ impl Foo {
const CONST$0: () = ();
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]]),
+ None,
+ None,
);
}
@@ -192,7 +279,10 @@ impl Trait for Foo {
pub fn method$0() {}
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"##]]),
+ None,
+ None,
);
check_external_docs(
r#"
@@ -205,7 +295,10 @@ impl Trait for Foo {
const CONST$0: () = ();
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"##]]),
+ None,
+ None,
);
check_external_docs(
r#"
@@ -218,7 +311,10 @@ impl Trait for Foo {
type Type$0 = ();
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedtype.Type"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedtype.Type"##]]),
+ None,
+ None,
);
}
@@ -231,7 +327,10 @@ pub trait Foo {
fn method$0();
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#tymethod.method"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#tymethod.method"##]]),
+ None,
+ None,
);
check_external_docs(
r#"
@@ -240,7 +339,10 @@ pub trait Foo {
const CONST$0: ();
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedconstant.CONST"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedconstant.CONST"##]]),
+ None,
+ None,
);
check_external_docs(
r#"
@@ -249,7 +351,10 @@ pub trait Foo {
type Type$0;
}
"#,
- expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedtype.Type"##]],
+ None,
+ Some(expect![[r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedtype.Type"##]]),
+ None,
+ None,
);
}
@@ -260,7 +365,10 @@ fn external_docs_trait() {
//- /main.rs crate:foo
trait Trait$0 {}
"#,
- expect![[r#"https://docs.rs/foo/*/foo/trait.Trait.html"#]],
+ None,
+ Some(expect![[r#"https://docs.rs/foo/*/foo/trait.Trait.html"#]]),
+ None,
+ None,
)
}
@@ -273,7 +381,10 @@ pub mod foo {
pub mod ba$0r {}
}
"#,
- expect![[r#"https://docs.rs/foo/*/foo/foo/bar/index.html"#]],
+ None,
+ Some(expect![[r#"https://docs.rs/foo/*/foo/foo/bar/index.html"#]]),
+ None,
+ None,
)
}
@@ -294,7 +405,10 @@ fn foo() {
let bar: wrapper::It$0em;
}
"#,
- expect![[r#"https://docs.rs/foo/*/foo/wrapper/module/struct.Item.html"#]],
+ None,
+ Some(expect![[r#"https://docs.rs/foo/*/foo/wrapper/module/struct.Item.html"#]]),
+ None,
+ None,
)
}