Skip to content

Commit cefe331

Browse files
committed
test(lsp): add more test cases for recent fixes
1 parent 10d1bec commit cefe331

File tree

6 files changed

+91
-15
lines changed

6 files changed

+91
-15
lines changed

crates/nu-lsp/src/completion.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,17 @@ mod tests {
258258
"kind": 6
259259
}
260260
]))]
261+
#[case::local_variable("var.nu", (5, 10), None, serde_json::json!([
262+
{
263+
"label": "$bar",
264+
"labelDetails": { "description": "variable" },
265+
"textEdit": {
266+
"newText": "$bar",
267+
"range": { "start": { "character": 7, "line": 5 }, "end": { "character": 10, "line": 5 } }
268+
},
269+
"kind": 6
270+
}
271+
]))]
261272
#[case::keyword("keyword.nu", (0, 2), None, serde_json::json!([
262273
{
263274
"label": "overlay",

crates/nu-lsp/src/goto.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl LanguageServer {
9797
#[cfg(test)]
9898
mod tests {
9999
use crate::path_to_uri;
100-
use crate::tests::{initialize_language_server, open_unchecked, result_from_message};
100+
use crate::tests::{initialize_language_server, open, open_unchecked, result_from_message};
101101
use assert_json_diff::assert_json_eq;
102102
use lsp_server::{Connection, Message};
103103
use lsp_types::{
@@ -205,4 +205,39 @@ mod tests {
205205
);
206206
}
207207
}
208+
209+
#[rstest]
210+
// https://github.com/nushell/nushell/issues/16539
211+
fn goto_definition_in_new_file() {
212+
let (client_connection, _recv) = initialize_language_server(None, None);
213+
214+
let mut script = fixtures();
215+
script.push("lsp/no_such_file.nu");
216+
let script = path_to_uri(&script);
217+
218+
let file_content = r#"def foo [] {}; foo"#;
219+
let _ = open(
220+
&client_connection,
221+
script.clone(),
222+
Some(file_content.into()),
223+
);
224+
let resp = send_goto_definition_request(
225+
&client_connection,
226+
script.clone(),
227+
0,
228+
file_content.len() as u32 - 1,
229+
);
230+
let result = result_from_message(resp);
231+
232+
assert_json_eq!(
233+
result,
234+
serde_json::json!({
235+
"uri": script,
236+
"range": {
237+
"start": { "line": 0, "character": 11 },
238+
"end": { "line": 0, "character": 13 }
239+
}
240+
})
241+
);
242+
}
208243
}

crates/nu-lsp/src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -576,14 +576,17 @@ mod tests {
576576
client_connection: &Connection,
577577
uri: Uri,
578578
) -> lsp_server::Notification {
579-
open(client_connection, uri).unwrap()
579+
open(client_connection, uri, None).unwrap()
580580
}
581581

582582
pub(crate) fn open(
583583
client_connection: &Connection,
584584
uri: Uri,
585+
new_text: Option<String>,
585586
) -> Result<lsp_server::Notification, String> {
586-
let text = std::fs::read_to_string(uri_to_path(&uri)).map_err(|e| e.to_string())?;
587+
let text = new_text
588+
.or_else(|| std::fs::read_to_string(uri_to_path(&uri)).ok())
589+
.ok_or("Failed to read file.")?;
587590

588591
client_connection
589592
.sender

crates/nu-lsp/src/notification.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ impl LanguageServer {
136136
mod tests {
137137
use crate::path_to_uri;
138138
use crate::tests::{
139-
initialize_language_server, open, open_unchecked, result_from_message, send_hover_request,
140-
update,
139+
initialize_language_server, open_unchecked, result_from_message, send_hover_request, update,
141140
};
142141
use assert_json_diff::assert_json_eq;
143142
use lsp_types::Range;
@@ -195,8 +194,6 @@ hello"#,
195194
script.push("lsp/notifications/issue_11522.nu");
196195
let script = path_to_uri(&script);
197196

198-
let result = open(&client_connection, script);
199-
200-
assert_eq!(result.map(|_| ()), Ok(()))
197+
open_unchecked(&client_connection, script);
201198
}
202199
}

crates/nu-lsp/src/workspace.rs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ impl LanguageServer {
543543
#[cfg(test)]
544544
mod tests {
545545
use crate::path_to_uri;
546-
use crate::tests::{initialize_language_server, open_unchecked, send_hover_request};
546+
use crate::tests::{initialize_language_server, open, open_unchecked, send_hover_request};
547547
use assert_json_diff::assert_json_eq;
548548
use lsp_server::{Connection, Message};
549549
use lsp_types::{
@@ -761,28 +761,41 @@ mod tests {
761761

762762
#[rstest]
763763
#[case::command_reference(
764-
"foo.nu", (0, 12),
764+
"foo.nu", (0, 12), true,
765765
vec![make_location_ref("bar", 4, 2, 4, 7), make_location_ref("foo", 0, 11, 0, 16)],
766766
)]
767+
#[case::single_file_without_workspace_folder_param(
768+
"foo.nu", (0, 12), false,
769+
vec![make_location_ref("foo", 0, 11, 0, 16)],
770+
)]
771+
#[case::new_file(
772+
"no_such_file.nu", (0, 5), true,
773+
vec![make_location_ref("no_such_file", 0, 4, 0, 7)],
774+
)]
775+
#[case::new_file_without_workspace_folder_param(
776+
"no_such_file.nu", (0, 5), false,
777+
vec![make_location_ref("no_such_file", 0, 4, 0, 7)],
778+
)]
767779
#[case::quoted_command_reference(
768-
"bar.nu", (0, 23),
780+
"bar.nu", (0, 23), true,
769781
vec![make_location_ref("bar", 5, 4, 5, 11), make_location_ref("foo", 6, 13, 6, 20)],
770782
)]
771783
#[case::module_path_reference(
772-
"baz.nu", (0, 12),
784+
"baz.nu", (0, 12), true,
773785
vec![make_location_ref("bar", 0, 4, 0, 12), make_location_ref("baz", 6, 4, 6, 12)],
774786
)]
775787
fn reference_in_workspace(
776788
#[case] main_file: &str,
777789
#[case] cursor_position: (u32, u32),
790+
#[case] with_workspace_folder: bool,
778791
#[case] expected_refs: Vec<serde_json::Value>,
779792
) {
780793
let mut script = fixtures();
781794
script.push("lsp/workspace");
782795
let (client_connection, _recv) = initialize_language_server(
783796
None,
784797
serde_json::to_value(InitializeParams {
785-
workspace_folders: Some(vec![WorkspaceFolder {
798+
workspace_folders: with_workspace_folder.then_some(vec![WorkspaceFolder {
786799
uri: path_to_uri(&script),
787800
name: "random name".to_string(),
788801
}]),
@@ -791,11 +804,24 @@ mod tests {
791804
.ok(),
792805
);
793806
script.push(main_file);
807+
let file_exists = script.is_file();
794808
let script = path_to_uri(&script);
795809

796-
open_unchecked(&client_connection, script.clone());
810+
if file_exists {
811+
open_unchecked(&client_connection, script.clone());
812+
} else {
813+
let _ = open(
814+
&client_connection,
815+
script.clone(),
816+
Some("def foo [] {}".into()),
817+
);
818+
}
797819

798-
let message_num = 6;
820+
let message_num = if with_workspace_folder {
821+
if file_exists { 6 } else { 7 }
822+
} else {
823+
1
824+
};
799825
let (line, character) = cursor_position;
800826
let messages = send_reference_request(
801827
&client_connection,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
let greeting = "Hello"
22

33
echo $gre
4+
5+
def foo [bar: int] {
6+
echo $ba
7+
}

0 commit comments

Comments
 (0)