diff options
Diffstat (limited to 'crates/ra_lsp_server')
-rw-r--r-- | crates/ra_lsp_server/tests/heavy_tests/main.rs | 35 | ||||
-rw-r--r-- | crates/ra_lsp_server/tests/heavy_tests/support.rs | 62 |
2 files changed, 68 insertions, 29 deletions
diff --git a/crates/ra_lsp_server/tests/heavy_tests/main.rs b/crates/ra_lsp_server/tests/heavy_tests/main.rs index e9ce002de..6f37a980d 100644 --- a/crates/ra_lsp_server/tests/heavy_tests/main.rs +++ b/crates/ra_lsp_server/tests/heavy_tests/main.rs | |||
@@ -14,7 +14,7 @@ use ra_lsp_server::req::{ | |||
14 | use serde_json::json; | 14 | use serde_json::json; |
15 | use tempfile::TempDir; | 15 | use tempfile::TempDir; |
16 | 16 | ||
17 | use crate::support::{project, project_with_tmpdir}; | 17 | use crate::support::{project, Project}; |
18 | 18 | ||
19 | const LOG: &'static str = ""; | 19 | const LOG: &'static str = ""; |
20 | 20 | ||
@@ -95,25 +95,34 @@ fn foo() { | |||
95 | 95 | ||
96 | #[test] | 96 | #[test] |
97 | fn test_runnables_project() { | 97 | fn test_runnables_project() { |
98 | let server = project( | 98 | let code = r#" |
99 | r#" | 99 | //- foo/Cargo.toml |
100 | //- Cargo.toml | ||
101 | [package] | 100 | [package] |
102 | name = "foo" | 101 | name = "foo" |
103 | version = "0.0.0" | 102 | version = "0.0.0" |
104 | 103 | ||
105 | //- src/lib.rs | 104 | //- foo/src/lib.rs |
106 | pub fn foo() {} | 105 | pub fn foo() {} |
107 | 106 | ||
108 | //- tests/spam.rs | 107 | //- foo/tests/spam.rs |
109 | #[test] | 108 | #[test] |
110 | fn test_eggs() {} | 109 | fn test_eggs() {} |
111 | "#, | 110 | |
112 | ); | 111 | //- bar/Cargo.toml |
112 | [package] | ||
113 | name = "bar" | ||
114 | version = "0.0.0" | ||
115 | |||
116 | //- bar/src/main.rs | ||
117 | fn main() {} | ||
118 | "#; | ||
119 | |||
120 | let server = Project::with_fixture(code).root("foo").root("bar").server(); | ||
121 | |||
113 | server.wait_until_workspace_is_loaded(); | 122 | server.wait_until_workspace_is_loaded(); |
114 | server.request::<Runnables>( | 123 | server.request::<Runnables>( |
115 | RunnablesParams { | 124 | RunnablesParams { |
116 | text_document: server.doc_id("tests/spam.rs"), | 125 | text_document: server.doc_id("foo/tests/spam.rs"), |
117 | position: None, | 126 | position: None, |
118 | }, | 127 | }, |
119 | json!([ | 128 | json!([ |
@@ -126,7 +135,7 @@ fn test_eggs() {} | |||
126 | "end": { "character": 17, "line": 1 }, | 135 | "end": { "character": 17, "line": 1 }, |
127 | "start": { "character": 0, "line": 0 } | 136 | "start": { "character": 0, "line": 0 } |
128 | }, | 137 | }, |
129 | "cwd": server.path() | 138 | "cwd": server.path().join("foo") |
130 | }, | 139 | }, |
131 | { | 140 | { |
132 | "args": [ | 141 | "args": [ |
@@ -138,7 +147,7 @@ fn test_eggs() {} | |||
138 | ], | 147 | ], |
139 | "bin": "cargo", | 148 | "bin": "cargo", |
140 | "env": {}, | 149 | "env": {}, |
141 | "cwd": server.path(), | 150 | "cwd": server.path().join("foo"), |
142 | "label": "cargo check -p foo", | 151 | "label": "cargo check -p foo", |
143 | "range": { | 152 | "range": { |
144 | "end": { | 153 | "end": { |
@@ -287,7 +296,9 @@ fn main() {{}} | |||
287 | "#, | 296 | "#, |
288 | PROJECT = project.to_string(), | 297 | PROJECT = project.to_string(), |
289 | ); | 298 | ); |
290 | let server = project_with_tmpdir(tmp_dir, &code); | 299 | |
300 | let server = Project::with_fixture(&code).tmp_dir(tmp_dir).server(); | ||
301 | |||
291 | server.wait_until_workspace_is_loaded(); | 302 | server.wait_until_workspace_is_loaded(); |
292 | let empty_context = || CodeActionContext { diagnostics: Vec::new(), only: None }; | 303 | let empty_context = || CodeActionContext { diagnostics: Vec::new(), only: None }; |
293 | server.request::<CodeActionRequest>( | 304 | server.request::<CodeActionRequest>( |
diff --git a/crates/ra_lsp_server/tests/heavy_tests/support.rs b/crates/ra_lsp_server/tests/heavy_tests/support.rs index 9e115fb7f..b07882700 100644 --- a/crates/ra_lsp_server/tests/heavy_tests/support.rs +++ b/crates/ra_lsp_server/tests/heavy_tests/support.rs | |||
@@ -26,26 +26,51 @@ use ra_lsp_server::{ | |||
26 | InitializationOptions, | 26 | InitializationOptions, |
27 | }; | 27 | }; |
28 | 28 | ||
29 | pub fn project(fixture: &str) -> Server { | 29 | pub struct Project<'a> { |
30 | let tmp_dir = TempDir::new().unwrap(); | 30 | fixture: &'a str, |
31 | project_with_tmpdir(tmp_dir, fixture) | 31 | tmp_dir: Option<TempDir>, |
32 | roots: Vec<PathBuf>, | ||
32 | } | 33 | } |
33 | 34 | ||
34 | pub fn project_with_tmpdir(tmp_dir: TempDir, fixture: &str) -> Server { | 35 | impl<'a> Project<'a> { |
35 | static INIT: Once = Once::new(); | 36 | pub fn with_fixture(fixture: &str) -> Project { |
36 | INIT.call_once(|| { | 37 | Project { fixture, tmp_dir: None, roots: vec![] } |
37 | let _ = Logger::with_env_or_str(crate::LOG).start().unwrap(); | 38 | } |
38 | }); | ||
39 | 39 | ||
40 | let mut paths = vec![]; | 40 | pub fn tmp_dir(mut self, tmp_dir: TempDir) -> Project<'a> { |
41 | self.tmp_dir = Some(tmp_dir); | ||
42 | self | ||
43 | } | ||
41 | 44 | ||
42 | for entry in parse_fixture(fixture) { | 45 | pub fn root(mut self, path: &str) -> Project<'a> { |
43 | let path = tmp_dir.path().join(entry.meta); | 46 | self.roots.push(path.into()); |
44 | fs::create_dir_all(path.parent().unwrap()).unwrap(); | 47 | self |
45 | fs::write(path.as_path(), entry.text.as_bytes()).unwrap(); | 48 | } |
46 | paths.push((path, entry.text)); | 49 | |
50 | pub fn server(self) -> Server { | ||
51 | let tmp_dir = self.tmp_dir.unwrap_or_else(|| TempDir::new().unwrap()); | ||
52 | static INIT: Once = Once::new(); | ||
53 | INIT.call_once(|| { | ||
54 | let _ = Logger::with_env_or_str(crate::LOG).start().unwrap(); | ||
55 | }); | ||
56 | |||
57 | let mut paths = vec![]; | ||
58 | |||
59 | for entry in parse_fixture(self.fixture) { | ||
60 | let path = tmp_dir.path().join(entry.meta); | ||
61 | fs::create_dir_all(path.parent().unwrap()).unwrap(); | ||
62 | fs::write(path.as_path(), entry.text.as_bytes()).unwrap(); | ||
63 | paths.push((path, entry.text)); | ||
64 | } | ||
65 | |||
66 | let roots = self.roots.into_iter().map(|root| tmp_dir.path().join(root)).collect(); | ||
67 | |||
68 | Server::new(tmp_dir, roots, paths) | ||
47 | } | 69 | } |
48 | Server::new(tmp_dir, paths) | 70 | } |
71 | |||
72 | pub fn project(fixture: &str) -> Server { | ||
73 | Project::with_fixture(fixture).server() | ||
49 | } | 74 | } |
50 | 75 | ||
51 | pub struct Server { | 76 | pub struct Server { |
@@ -56,14 +81,17 @@ pub struct Server { | |||
56 | } | 81 | } |
57 | 82 | ||
58 | impl Server { | 83 | impl Server { |
59 | fn new(dir: TempDir, files: Vec<(PathBuf, String)>) -> Server { | 84 | fn new(dir: TempDir, roots: Vec<PathBuf>, files: Vec<(PathBuf, String)>) -> Server { |
60 | let path = dir.path().to_path_buf(); | 85 | let path = dir.path().to_path_buf(); |
86 | |||
87 | let roots = if roots.is_empty() { vec![path] } else { roots }; | ||
88 | |||
61 | let worker = Worker::<RawMessage, RawMessage>::spawn( | 89 | let worker = Worker::<RawMessage, RawMessage>::spawn( |
62 | "test server", | 90 | "test server", |
63 | 128, | 91 | 128, |
64 | move |mut msg_receiver, mut msg_sender| { | 92 | move |mut msg_receiver, mut msg_sender| { |
65 | main_loop( | 93 | main_loop( |
66 | vec![path], | 94 | roots, |
67 | InitializationOptions::default(), | 95 | InitializationOptions::default(), |
68 | &mut msg_receiver, | 96 | &mut msg_receiver, |
69 | &mut msg_sender, | 97 | &mut msg_sender, |