aboutsummaryrefslogtreecommitdiff
path: root/crates/proc_macro_srv/src/tests/utils.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/proc_macro_srv/src/tests/utils.rs')
-rw-r--r--crates/proc_macro_srv/src/tests/utils.rs41
1 files changed, 23 insertions, 18 deletions
diff --git a/crates/proc_macro_srv/src/tests/utils.rs b/crates/proc_macro_srv/src/tests/utils.rs
index f15381f0f..f0a514b32 100644
--- a/crates/proc_macro_srv/src/tests/utils.rs
+++ b/crates/proc_macro_srv/src/tests/utils.rs
@@ -2,9 +2,9 @@
2 2
3use crate::dylib; 3use crate::dylib;
4use crate::ProcMacroSrv; 4use crate::ProcMacroSrv;
5use expect_test::Expect;
5use proc_macro_api::ListMacrosTask; 6use proc_macro_api::ListMacrosTask;
6use std::str::FromStr; 7use std::str::FromStr;
7use test_utils::assert_eq_text;
8 8
9pub mod fixtures { 9pub mod fixtures {
10 use cargo_metadata::Message; 10 use cargo_metadata::Message;
@@ -12,9 +12,11 @@ pub mod fixtures {
12 use std::process::Command; 12 use std::process::Command;
13 13
14 // Use current project metadata to get the proc-macro dylib path 14 // Use current project metadata to get the proc-macro dylib path
15 pub fn dylib_path(crate_name: &str, version: &str) -> std::path::PathBuf { 15 pub fn proc_macro_test_dylib_path() -> std::path::PathBuf {
16 let name = "proc_macro_test";
17 let version = "0.0.0";
16 let command = Command::new(toolchain::cargo()) 18 let command = Command::new(toolchain::cargo())
17 .args(&["check", "--tests", "--message-format", "json"]) 19 .args(&["build", "-p", name, "--message-format", "json"])
18 .output() 20 .output()
19 .unwrap() 21 .unwrap()
20 .stdout; 22 .stdout;
@@ -23,7 +25,7 @@ pub mod fixtures {
23 match message.unwrap() { 25 match message.unwrap() {
24 Message::CompilerArtifact(artifact) => { 26 Message::CompilerArtifact(artifact) => {
25 if artifact.target.kind.contains(&"proc-macro".to_string()) { 27 if artifact.target.kind.contains(&"proc-macro".to_string()) {
26 let repr = format!("{} {}", crate_name, version); 28 let repr = format!("{} {}", name, version);
27 if artifact.package_id.repr.starts_with(&repr) { 29 if artifact.package_id.repr.starts_with(&repr) {
28 return PathBuf::from(&artifact.filenames[0]); 30 return PathBuf::from(&artifact.filenames[0]);
29 } 31 }
@@ -33,7 +35,7 @@ pub mod fixtures {
33 } 35 }
34 } 36 }
35 37
36 panic!("No proc-macro dylib for {} found!", crate_name); 38 panic!("No proc-macro dylib for {} found!", name);
37 } 39 }
38} 40}
39 41
@@ -41,23 +43,26 @@ fn parse_string(code: &str) -> Option<crate::rustc_server::TokenStream> {
41 Some(crate::rustc_server::TokenStream::from_str(code).unwrap()) 43 Some(crate::rustc_server::TokenStream::from_str(code).unwrap())
42} 44}
43 45
44pub fn assert_expand( 46pub fn assert_expand(macro_name: &str, ra_fixture: &str, expect: Expect) {
45 crate_name: &str, 47 assert_expand_impl(macro_name, ra_fixture, None, expect);
46 macro_name: &str, 48}
47 version: &str, 49
48 ra_fixture: &str, 50pub fn assert_expand_attr(macro_name: &str, ra_fixture: &str, attr_args: &str, expect: Expect) {
49 expect: &str, 51 assert_expand_impl(macro_name, ra_fixture, Some(attr_args), expect);
50) { 52}
51 let path = fixtures::dylib_path(crate_name, version); 53
54fn assert_expand_impl(macro_name: &str, input: &str, attr: Option<&str>, expect: Expect) {
55 let path = fixtures::proc_macro_test_dylib_path();
52 let expander = dylib::Expander::new(&path).unwrap(); 56 let expander = dylib::Expander::new(&path).unwrap();
53 let fixture = parse_string(ra_fixture).unwrap(); 57 let fixture = parse_string(input).unwrap();
58 let attr = attr.map(|attr| parse_string(attr).unwrap().into_subtree());
54 59
55 let res = expander.expand(macro_name, &fixture.into_subtree(), None).unwrap(); 60 let res = expander.expand(macro_name, &fixture.into_subtree(), attr.as_ref()).unwrap();
56 assert_eq_text!(&expect.trim(), &format!("{:?}", res)); 61 expect.assert_eq(&format!("{:?}", res));
57} 62}
58 63
59pub fn list(crate_name: &str, version: &str) -> Vec<String> { 64pub fn list() -> Vec<String> {
60 let path = fixtures::dylib_path(crate_name, version); 65 let path = fixtures::proc_macro_test_dylib_path();
61 let task = ListMacrosTask { lib: path }; 66 let task = ListMacrosTask { lib: path };
62 let mut srv = ProcMacroSrv::default(); 67 let mut srv = ProcMacroSrv::default();
63 let res = srv.list_macros(&task).unwrap(); 68 let res = srv.list_macros(&task).unwrap();