From 774ebc6ef7cd4fdcfcb917c8885197d85cb574be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20F=C3=B6rster?= Date: Thu, 23 May 2019 19:51:58 +0200 Subject: [PATCH] Add integration tests for definition request --- Cargo.lock | 33 ++++++++-- Cargo.toml | 2 + scenarios/definition_citation/bar.bib | 5 ++ scenarios/definition_citation/foo.bib | 5 ++ scenarios/definition_citation/foo.tex | 8 +++ scenarios/definition_label/bar.tex | 1 + scenarios/definition_label/baz.tex | 1 + scenarios/definition_label/foo.tex | 11 ++++ tests/common.rs | 95 +++++++++++++++++++++++++++ tests/definition.rs | 47 +++++++++++++ 10 files changed, 202 insertions(+), 6 deletions(-) create mode 100644 scenarios/definition_citation/bar.bib create mode 100644 scenarios/definition_citation/foo.bib create mode 100644 scenarios/definition_citation/foo.tex create mode 100644 scenarios/definition_label/bar.tex create mode 100644 scenarios/definition_label/baz.tex create mode 100644 scenarios/definition_label/foo.tex create mode 100644 tests/common.rs create mode 100644 tests/definition.rs diff --git a/Cargo.lock b/Cargo.lock index f3f60bb4d..f6101361c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,6 +190,14 @@ dependencies = [ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "copy_dir" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "core-foundation" version = "0.6.4" @@ -560,16 +568,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "indoc" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "indoc-impl 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "indoc-impl 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "indoc-impl" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1477,9 +1485,10 @@ version = "0.1.0" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", + "copy_dir 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.15 (registry+https://github.com/rust-lang/crates.io-index)", "html2md 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", - "indoc 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "indoc 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc 0.1.0", "jsonrpc-derive 0.1.0", @@ -1493,6 +1502,7 @@ dependencies = [ "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "stderrlog 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-stdin-stdout 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1844,6 +1854,15 @@ name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "walkdir" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "walkdir" version = "2.2.7" @@ -1942,6 +1961,7 @@ dependencies = [ "checksum combine 3.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" "checksum cookie 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "99be24cfcf40d56ed37fd11c2123be833959bbc5bddecb46e1c2e442e15fa3e0" "checksum cookie_store 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b0d2f2ecb21dce00e2453268370312978af9b8024020c7a37ae2cc6dbbe64685" +"checksum copy_dir 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e4281031634644843bd2f5aa9c48cf98fc48d6b083bd90bb11becf10deaf8b0" "checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" "checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" @@ -1982,8 +2002,8 @@ dependencies = [ "checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" -"checksum indoc 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "730a9283f0eb1a0ee27817121aafc4395ca3dc33779ed2a5a314cbffbf787c19" -"checksum indoc-impl 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c5341c89b193926a5251b35a2668b003e8cd05b76372ec0fe5fd6f0552635f69" +"checksum indoc 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1f59f228c76fda6ecd8dab79683039a7054c748587f682a911094f473647bd6" +"checksum indoc-impl 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "63f070ef080db3601c1a0ecc75c7bb35104cc0ce2d7c4e049952a96a61d8933b" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" @@ -2122,6 +2142,7 @@ dependencies = [ "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c66c0b9792f0a765345452775f3adbd28dde9d33f30d13e5dcc5ae17cf6f3780" "checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" diff --git a/Cargo.toml b/Cargo.toml index 29a54c9b2..71b4b833f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,8 @@ walkdir = "2" reqwest = "0.9.16" html2md = "0.2.9" lazy_static = "1.3.0" +tempfile = "3" +copy_dir = "0.1.2" [profile.release] lto = true diff --git a/scenarios/definition_citation/bar.bib b/scenarios/definition_citation/bar.bib new file mode 100644 index 000000000..83e27f026 --- /dev/null +++ b/scenarios/definition_citation/bar.bib @@ -0,0 +1,5 @@ +@article{foo,} + +@article{bar,} + +@article{baz,} \ No newline at end of file diff --git a/scenarios/definition_citation/foo.bib b/scenarios/definition_citation/foo.bib new file mode 100644 index 000000000..83e27f026 --- /dev/null +++ b/scenarios/definition_citation/foo.bib @@ -0,0 +1,5 @@ +@article{foo,} + +@article{bar,} + +@article{baz,} \ No newline at end of file diff --git a/scenarios/definition_citation/foo.tex b/scenarios/definition_citation/foo.tex new file mode 100644 index 000000000..33c3a958a --- /dev/null +++ b/scenarios/definition_citation/foo.tex @@ -0,0 +1,8 @@ +\documentclass{article} +\bibliography{foo} + +\begin{document} + +\cite{bar} + +\end{document} \ No newline at end of file diff --git a/scenarios/definition_label/bar.tex b/scenarios/definition_label/bar.tex new file mode 100644 index 000000000..d14f045aa --- /dev/null +++ b/scenarios/definition_label/bar.tex @@ -0,0 +1 @@ +\label{bar} diff --git a/scenarios/definition_label/baz.tex b/scenarios/definition_label/baz.tex new file mode 100644 index 000000000..d14f045aa --- /dev/null +++ b/scenarios/definition_label/baz.tex @@ -0,0 +1 @@ +\label{bar} diff --git a/scenarios/definition_label/foo.tex b/scenarios/definition_label/foo.tex new file mode 100644 index 000000000..b43ebf571 --- /dev/null +++ b/scenarios/definition_label/foo.tex @@ -0,0 +1,11 @@ +\documentclass{article} + +\begin{document} + +\label{foo} +\include{bar} +\label{baz} + +\ref{bar} + +\end{document} \ No newline at end of file diff --git a/tests/common.rs b/tests/common.rs new file mode 100644 index 000000000..ffcef169d --- /dev/null +++ b/tests/common.rs @@ -0,0 +1,95 @@ +#![feature(await_macro, async_await)] + +use copy_dir::copy_dir; +use futures::future::BoxFuture; +use futures::lock::Mutex; +use futures::prelude::*; +use jsonrpc::client::FutureResult; +use jsonrpc::server::EventHandler; +use lsp_types::*; +use std::path::PathBuf; +use std::sync::Arc; +use tempfile::TempDir; +use texlab::client::LspClient; +use texlab::server::LatexLspServer; +use std::fs::remove_dir; + +#[derive(Debug, Default)] +pub struct LspClientMock { + pub messages: Mutex>, +} + +impl LspClient for LspClientMock { + fn configuration(&self, _params: ConfigurationParams) -> FutureResult<'_, serde_json::Value> { + let handler = async move { Ok(serde_json::Value::Null) }; + handler.boxed() + } + + fn show_message(&self, params: ShowMessageParams) -> BoxFuture<'_, ()> { + let handler = async move { + let mut messages = await!(self.messages.lock()); + messages.push(params); + }; + handler.boxed() + } +} + +pub struct Scenario { + pub server: LatexLspServer, + pub client: Arc, + pub directory: TempDir, +} + +impl Scenario { + pub async fn new(name: &str) -> Self { + let client = Arc::new(LspClientMock::default()); + let server = LatexLspServer::new(Arc::clone(&client)); + + let directory = tempfile::tempdir().unwrap(); + remove_dir(directory.path()).unwrap(); + let source = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("scenarios") + .join(name); + copy_dir(source, directory.path()).unwrap(); + + let root_uri = Uri::from_file_path(directory.path()).unwrap(); + let init_params = InitializeParams { + process_id: None, + root_path: Some(directory.path().to_string_lossy().into_owned()), + root_uri: Some(root_uri), + initialization_options: None, + capabilities: ClientCapabilities::default(), + trace: None, + workspace_folders: None, + }; + await!(server.initialize(init_params)).unwrap(); + await!(server.handle_events()); + server.initialized(InitializedParams {}); + await!(server.handle_events()); + + Scenario { + server, + client, + directory, + } + } + + pub fn uri(&self, name: &str) -> Uri { + let mut path = self.directory.path().to_owned(); + path.push(name); + Uri::from_file_path(path).unwrap() + } + + pub async fn open(&self, name: &'static str, language_id: &'static str) { + let mut path = self.directory.path().to_owned(); + path.push(name); + self.server.did_open(DidOpenTextDocumentParams { + text_document: TextDocumentItem { + uri: self.uri(name), + version: 0, + language_id: language_id.to_owned(), + text: std::fs::read_to_string(path).unwrap(), + }, + }) + } +} diff --git a/tests/definition.rs b/tests/definition.rs new file mode 100644 index 000000000..ac630eee3 --- /dev/null +++ b/tests/definition.rs @@ -0,0 +1,47 @@ +#![feature(await_macro, async_await)] + +mod common; + +use crate::common::Scenario; +use futures::executor::block_on; +use lsp_types::*; + +#[test] +fn test_citation() { + block_on(async move { + let scenario = await!(Scenario::new("definition_citation")); + let params = TextDocumentPositionParams::new( + TextDocumentIdentifier::new(scenario.uri("foo.tex")), + Position::new(5, 8), + ); + await!(scenario.open("foo.tex", "latex")); + let definitions = await!(scenario.server.definition(params)).unwrap(); + assert_eq!( + definitions, + vec![Location::new( + scenario.uri("foo.bib"), + Range::new_simple(2, 9, 2, 12) + )] + ); + }); +} + +#[test] +fn test_label() { + block_on(async move { + let scenario = await!(Scenario::new("definition_label")); + let params = TextDocumentPositionParams::new( + TextDocumentIdentifier::new(scenario.uri("foo.tex")), + Position::new(8, 8), + ); + await!(scenario.open("foo.tex", "latex")); + let definitions = await!(scenario.server.definition(params)).unwrap(); + assert_eq!( + definitions, + vec![Location::new( + scenario.uri("bar.tex"), + Range::new_simple(0, 7, 0, 10) + )] + ); + }); +}