use anyhow::Result; use assert_unordered::assert_eq_unordered; use lsp_types::{ request::References, ClientCapabilities, Location, ReferenceContext, ReferenceParams, }; use crate::lsp::{client::Client, fixture}; fn check(fixture: &str, context: ReferenceContext) -> 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_locations = Vec::new(); for ranges in fixture.ranges.values() { expected_locations.push(Location::new( client.uri(ranges[&1].name)?, ranges[&1].range, )); } let actual_locations = client .request::(ReferenceParams { text_document_position: fixture.cursor.unwrap().into_params(&client)?, context, partial_result_params: Default::default(), work_done_progress_params: Default::default(), })? .unwrap_or_default(); client.shutdown()?; assert_eq_unordered!(actual_locations, expected_locations); Ok(()) } #[test] fn entry_definition() -> Result<()> { check( r#" %BIB foo.bib %SRC @article{foo,} %CUR ^ %TEX bar.tex %SRC \cite{foo} %1.1 ^^^ %SRC \addbibresource{foo.bib} "#, ReferenceContext { include_declaration: false, }, ) } #[test] fn entry_definition_include_decl() -> Result<()> { check( r#" %BIB foo.bib %SRC @article{foo,} %CUR ^ %2.1 ^^^ %TEX bar.tex %SRC \cite{foo} %1.1 ^^^ %SRC \addbibresource{foo.bib} "#, ReferenceContext { include_declaration: true, }, ) } #[test] fn entry_reference() -> Result<()> { check( r#" %BIB foo.bib %SRC @article{foo,} %TEX bar.tex %SRC \cite{foo} %CUR ^ %1.1 ^^^ %SRC \addbibresource{foo.bib} "#, ReferenceContext { include_declaration: false, }, ) } #[test] fn entry_reference_include_decl() -> Result<()> { check( r#" %BIB foo.bib %SRC @article{foo,} %2.1 ^^^ %TEX bar.tex %SRC \cite{foo} %CUR ^ %1.1 ^^^ %SRC \addbibresource{foo.bib} "#, ReferenceContext { include_declaration: true, }, ) } #[test] fn label_definition() -> Result<()> { check( r#" %TEX foo.tex %SRC \label{foo} %CUR ^ %TEX bar.tex %SRC \ref{foo} %1.1 ^^^ %SRC \input{foo.tex} "#, ReferenceContext { include_declaration: false, }, ) } #[test] fn label_definition_include_decl() -> Result<()> { check( r#" %TEX foo.tex %SRC \label{foo} %CUR ^ %2.1 ^^^ %TEX bar.tex %SRC \ref{foo} %1.1 ^^^ %SRC \input{foo.tex} "#, ReferenceContext { include_declaration: true, }, ) } #[test] fn label_reference() -> Result<()> { check( r#" %TEX foo.tex %SRC \label{foo} %SRC \input{bar.tex} %TEX bar.tex %SRC \ref{foo} %CUR ^ %1.1 ^^^ %TEX baz.tex %SRC \ref{foo} %2.1 ^^^ %SRC \input{bar.tex} "#, ReferenceContext { include_declaration: false, }, ) } #[test] fn label_reference_include_decl() -> Result<()> { check( r#" %TEX foo.tex %SRC \label{foo} %3.1 ^^^ %SRC \input{bar.tex} %TEX bar.tex %SRC \ref{foo} %CUR ^ %1.1 ^^^ %TEX baz.tex %SRC \ref{foo} %2.1 ^^^ %SRC \input{bar.tex} "#, ReferenceContext { include_declaration: true, }, ) } #[test] fn string_reference() -> Result<()> { check( r#" %BIB main.bib %SRC @string{foo = {Foo}} %SRC @string{bar = {Bar}} %SRC @article{baz, author = foo} %CUR ^ %1.1 ^^^ "#, ReferenceContext { include_declaration: false, }, ) } #[test] fn string_reference_include_decl() -> Result<()> { check( r#" %BIB main.bib %SRC @string{foo = {Foo}} %2.1 ^^^ %SRC @string{bar = {Bar}} %SRC @article{baz, author = foo} %CUR ^ %1.1 ^^^ "#, ReferenceContext { include_declaration: true, }, ) } #[test] fn string_definition() -> Result<()> { check( r#" %BIB main.bib %SRC @string{foo = {Foo}} %CUR ^ %SRC @string{bar = {Bar}} %SRC @article{baz, author = foo} %1.1 ^^^ "#, ReferenceContext { include_declaration: false, }, ) } #[test] fn string_definition_include_decl() -> Result<()> { check( r#" %BIB main.bib %SRC @string{foo = {Foo}} %CUR ^ %2.1 ^^^ %SRC @string{bar = {Bar}} %SRC @article{baz, author = foo} %1.1 ^^^ "#, ReferenceContext { include_declaration: true, }, ) }