diff options
Diffstat (limited to 'support/texlab/tests/integration/lsp/client.rs')
-rw-r--r-- | support/texlab/tests/integration/lsp/client.rs | 165 |
1 files changed, 0 insertions, 165 deletions
diff --git a/support/texlab/tests/integration/lsp/client.rs b/support/texlab/tests/integration/lsp/client.rs deleted file mode 100644 index 004422813a..0000000000 --- a/support/texlab/tests/integration/lsp/client.rs +++ /dev/null @@ -1,165 +0,0 @@ -use anyhow::{bail, Result}; -use crossbeam_channel::{Receiver, Sender}; -use lsp_server::{Connection, Message, Notification, Request, Response}; -use lsp_types::{ - notification::{Exit, Initialized}, - request::{Initialize, Shutdown}, - ClientCapabilities, ClientInfo, DidOpenTextDocumentParams, InitializeParams, InitializeResult, - InitializedParams, Url, -}; -use tempfile::{tempdir, TempDir}; -use texlab::Server; - -pub struct IncomingHandler { - _handle: jod_thread::JoinHandle<Result<()>>, - pub requests: Receiver<Request>, - pub notifications: Receiver<Notification>, - pub responses: Receiver<Response>, -} - -impl IncomingHandler { - pub fn spawn(receiver: Receiver<Message>) -> Result<Self> { - let (req_sender, req_receiver) = crossbeam_channel::unbounded(); - let (not_sender, not_receiver) = crossbeam_channel::unbounded(); - let (res_sender, res_receiver) = crossbeam_channel::unbounded(); - - let _handle = jod_thread::spawn(move || { - for message in &receiver { - match message { - Message::Request(req) => req_sender.send(req)?, - Message::Response(res) => res_sender.send(res)?, - Message::Notification(not) => not_sender.send(not)?, - }; - } - - Ok(()) - }); - - Ok(Self { - _handle, - requests: req_receiver, - notifications: not_receiver, - responses: res_receiver, - }) - } -} - -pub struct ClientResult { - pub directory: TempDir, - pub incoming: IncomingHandler, -} - -pub struct Client { - outgoing: Sender<Message>, - incoming: IncomingHandler, - directory: TempDir, - request_id: i32, - _handle: jod_thread::JoinHandle, -} - -impl Client { - pub fn spawn() -> Result<Self> { - let directory = tempdir()?; - let (client, server) = Connection::memory(); - let incoming = IncomingHandler::spawn(client.receiver)?; - let outgoing = client.sender; - let server = Server::with_connection(server, directory.path().to_path_buf(), false); - let _handle = jod_thread::spawn(move || { - server.run().expect("server failed to run"); - }); - - Ok(Self { - outgoing, - incoming, - directory, - request_id: 0, - _handle, - }) - } - - #[allow(deprecated)] - pub fn initialize( - &mut self, - client_capabilities: ClientCapabilities, - client_info: Option<ClientInfo>, - ) -> Result<InitializeResult> { - let result = self.request::<Initialize>(InitializeParams { - process_id: None, - root_path: None, - root_uri: None, - initialization_options: None, - capabilities: client_capabilities, - trace: None, - workspace_folders: None, - client_info, - locale: None, - })?; - - self.notify::<Initialized>(InitializedParams {})?; - Ok(result) - } - - pub fn request<R: lsp_types::request::Request>( - &mut self, - params: R::Params, - ) -> Result<R::Result> { - self.request_id += 1; - - self.outgoing - .send(Request::new(self.request_id.into(), R::METHOD.into(), params).into())?; - - let response = self.incoming.responses.recv()?; - assert_eq!(response.id, self.request_id.into()); - - let result = match response.result { - Some(result) => result, - None => bail!("request failed: {:?}", response.error), - }; - - Ok(serde_json::from_value(result)?) - } - - pub fn notify<N: lsp_types::notification::Notification>( - &mut self, - params: N::Params, - ) -> Result<()> { - self.outgoing - .send(Notification::new(N::METHOD.into(), serde_json::to_value(params)?).into())?; - - Ok(()) - } - - pub fn open(&mut self, name: &str, language_id: &str, text: String) -> Result<()> { - self.notify::<lsp_types::notification::DidOpenTextDocument>(DidOpenTextDocumentParams { - text_document: lsp_types::TextDocumentItem { - uri: self.uri(name)?, - language_id: language_id.to_string(), - version: 0, - text, - }, - })?; - - Ok(()) - } - - pub fn store_on_disk(&mut self, name: &str, text: &str) -> Result<()> { - let path = self.directory.path().join(name); - std::fs::create_dir_all(path.parent().unwrap())?; - std::fs::write(path, text)?; - Ok(()) - } - - pub fn shutdown(mut self) -> Result<ClientResult> { - self.request::<Shutdown>(())?; - self.notify::<Exit>(())?; - Ok(ClientResult { - directory: self.directory, - incoming: self.incoming, - }) - } - - pub fn uri(&self, name: &str) -> Result<Url> { - Url::from_file_path(self.directory.path().join(name)) - .map_err(|()| anyhow::anyhow!("failed to create uri")) - } -} |