Add unit test to illustrate how language server renames should work

This commit is contained in:
Antonio Scandurra 2022-04-05 14:32:25 +02:00
parent e697ffbbf0
commit 9188f51993

View file

@ -4970,7 +4970,7 @@ mod tests {
) )
.await; .await;
let project = Project::test(fs, cx); let project = Project::test(fs.clone(), cx);
project.update(cx, |project, _| { project.update(cx, |project, _| {
project.languages.add(Arc::new(rust_language)); project.languages.add(Arc::new(rust_language));
project.languages.add(Arc::new(json_language)); project.languages.add(Arc::new(json_language));
@ -5122,6 +5122,80 @@ mod tests {
) )
); );
// Renames are reported only to servers matching the buffer's language.
fs.rename(
Path::new("/the-root/test2.rs"),
Path::new("/the-root/test3.rs"),
Default::default(),
)
.await
.unwrap();
assert_eq!(
fake_rust_server
.receive_notification::<lsp::notification::DidCloseTextDocument>()
.await
.text_document,
lsp::TextDocumentIdentifier::new(
lsp::Url::from_file_path("/the-root/test2.rs").unwrap()
),
);
assert_eq!(
fake_rust_server
.receive_notification::<lsp::notification::DidOpenTextDocument>()
.await
.text_document,
lsp::TextDocumentItem {
uri: lsp::Url::from_file_path("/the-root/test3.rs").unwrap(),
version: 0,
text: rust_buffer2.read_with(cx, |buffer, _| buffer.text()),
language_id: Default::default()
},
);
// When the rename changes the extension of the file, the buffer gets closed on the old
// language server and gets opened on the new one.
fs.rename(
Path::new("/the-root/test3.rs"),
Path::new("/the-root/test3.json"),
Default::default(),
)
.await
.unwrap();
assert_eq!(
fake_rust_server
.receive_notification::<lsp::notification::DidCloseTextDocument>()
.await
.text_document,
lsp::TextDocumentIdentifier::new(
lsp::Url::from_file_path("/the-root/test3.json").unwrap(),
),
);
assert_eq!(
fake_json_server
.receive_notification::<lsp::notification::DidOpenTextDocument>()
.await
.text_document,
lsp::TextDocumentItem {
uri: lsp::Url::from_file_path("/the-root/test3.json").unwrap(),
version: 0,
text: rust_buffer2.read_with(cx, |buffer, _| buffer.text()),
language_id: Default::default()
},
);
// The renamed file's version resets after changing language server.
rust_buffer2.update(cx, |buffer, cx| buffer.edit([0..0], "// ", cx));
assert_eq!(
fake_json_server
.receive_notification::<lsp::notification::DidChangeTextDocument>()
.await
.text_document,
lsp::VersionedTextDocumentIdentifier::new(
lsp::Url::from_file_path("/the-root/test3.json").unwrap(),
1
)
);
// Restart language servers // Restart language servers
project.update(cx, |project, cx| { project.update(cx, |project, cx| {
project.restart_language_servers_for_buffers( project.restart_language_servers_for_buffers(
@ -5139,48 +5213,48 @@ mod tests {
let mut fake_rust_server = fake_rust_servers.next().await.unwrap(); let mut fake_rust_server = fake_rust_servers.next().await.unwrap();
let mut fake_json_server = fake_json_servers.next().await.unwrap(); let mut fake_json_server = fake_json_servers.next().await.unwrap();
// Ensure both rust documents are reopened in new rust language server without worrying about order // Ensure rust document is reopened in new rust language server
assert_eq!(
fake_rust_server
.receive_notification::<lsp::notification::DidOpenTextDocument>()
.await
.text_document,
lsp::TextDocumentItem {
uri: lsp::Url::from_file_path("/the-root/test.rs").unwrap(),
version: 1,
text: rust_buffer.read_with(cx, |buffer, _| buffer.text()),
language_id: Default::default()
}
);
// Ensure json documents are reopened in new json language server
assert_set_eq!( assert_set_eq!(
[ [
fake_rust_server fake_json_server
.receive_notification::<lsp::notification::DidOpenTextDocument>() .receive_notification::<lsp::notification::DidOpenTextDocument>()
.await .await
.text_document, .text_document,
fake_rust_server fake_json_server
.receive_notification::<lsp::notification::DidOpenTextDocument>() .receive_notification::<lsp::notification::DidOpenTextDocument>()
.await .await
.text_document, .text_document,
], ],
[ [
lsp::TextDocumentItem { lsp::TextDocumentItem {
uri: lsp::Url::from_file_path("/the-root/test.rs").unwrap(), uri: lsp::Url::from_file_path("/the-root/package.json").unwrap(),
version: 1, version: 0,
text: rust_buffer.read_with(cx, |buffer, _| buffer.text()), text: json_buffer.read_with(cx, |buffer, _| buffer.text()),
language_id: Default::default() language_id: Default::default()
}, },
lsp::TextDocumentItem { lsp::TextDocumentItem {
uri: lsp::Url::from_file_path("/the-root/test2.rs").unwrap(), uri: lsp::Url::from_file_path("/the-root/test3.json").unwrap(),
version: 1, version: 1,
text: rust_buffer2.read_with(cx, |buffer, _| buffer.text()), text: rust_buffer2.read_with(cx, |buffer, _| buffer.text()),
language_id: Default::default() language_id: Default::default()
}, }
] ]
); );
// Ensure json document is reopened in new json language server
assert_eq!(
fake_json_server
.receive_notification::<lsp::notification::DidOpenTextDocument>()
.await
.text_document,
lsp::TextDocumentItem {
uri: lsp::Url::from_file_path("/the-root/package.json").unwrap(),
version: 0,
text: json_buffer.read_with(cx, |buffer, _| buffer.text()),
language_id: Default::default()
}
);
// Close notifications are reported only to servers matching the buffer's language. // Close notifications are reported only to servers matching the buffer's language.
cx.update(|_| drop(json_buffer)); cx.update(|_| drop(json_buffer));
let close_message = lsp::DidCloseTextDocumentParams { let close_message = lsp::DidCloseTextDocumentParams {