use anyhow::Result; use assert_unordered::assert_eq_unordered; use lsp_types::{ request::DocumentLinkRequest, ClientCapabilities, DocumentLink, DocumentLinkParams, TextDocumentIdentifier, }; use crate::lsp::{client::Client, fixture}; fn check(fixture: &str) -> Result<()> { let mut client = Client::spawn()?; client.initialize(ClientCapabilities::default(), None)?; let fixture = fixture::parse(fixture); for file in fixture.files { client.open(file.name, file.lang, file.text)?; } let mut expected_links = Vec::new(); for ranges in fixture.ranges.values() { expected_links.push(DocumentLink { range: ranges[&1].range, target: Some(client.uri(ranges[&2].name)?), tooltip: None, data: None, }); } let actual_links = client .request::(DocumentLinkParams { text_document: TextDocumentIdentifier::new(client.uri(fixture.cursor.unwrap().name)?), work_done_progress_params: Default::default(), partial_result_params: Default::default(), })? .unwrap_or_default(); client.shutdown()?; assert_eq_unordered!(actual_links, expected_links); Ok(()) } #[test] fn document_include() -> Result<()> { check( r#" %TEX foo.tex %SRC \input{bar.tex} %1.1 ^^^^^^^ %CUR ^ %TEX bar.tex %SRC %1.2 "#, ) } #[test] fn document_import() -> Result<()> { check( r#" %TEX foo.tex %SRC \import{bar/}{baz} %1.1 ^^^ %CUR ^ %TEX bar/baz.tex %SRC %1.2 "#, ) }