diff options
Diffstat (limited to 'support/texlab/tests/integration/lsp/text_document/formatting.rs')
-rw-r--r-- | support/texlab/tests/integration/lsp/text_document/formatting.rs | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/support/texlab/tests/integration/lsp/text_document/formatting.rs b/support/texlab/tests/integration/lsp/text_document/formatting.rs new file mode 100644 index 0000000000..a0c02bf4b1 --- /dev/null +++ b/support/texlab/tests/integration/lsp/text_document/formatting.rs @@ -0,0 +1,148 @@ +use anyhow::Result; +use insta::assert_snapshot; +use lsp_types::{ + request::Formatting, ClientCapabilities, DocumentFormattingParams, FormattingOptions, + TextDocumentIdentifier, +}; +use texlab::{LineIndex, LineIndexExt}; + +use crate::lsp::{client::Client, fixture}; + +fn format(fixture: &str) -> Result<String> { + let mut client = Client::spawn()?; + client.initialize(ClientCapabilities::default(), None)?; + + let fixture = fixture::parse(fixture); + let file = fixture.files.into_iter().next().unwrap(); + let old_text = file.text.clone(); + client.open(file.name, file.lang, file.text)?; + + let actual_edits = client + .request::<Formatting>(DocumentFormattingParams { + text_document: TextDocumentIdentifier::new(client.uri(file.name)?), + work_done_progress_params: Default::default(), + options: FormattingOptions { + insert_spaces: true, + tab_size: 4, + ..Default::default() + }, + })? + .unwrap_or_default(); + + client.shutdown()?; + + let line_index = LineIndex::new(&old_text); + let mut actual_text = old_text; + for edit in actual_edits.into_iter().rev() { + let range = line_index.offset_lsp_range(edit.range); + actual_text.replace_range::<std::ops::Range<usize>>(range.into(), &edit.new_text); + } + + Ok(actual_text) +} + +#[test] +fn bibtex_internal_wrap_long_lines() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. +%SRC Lorem ipsum dolor sit amet, +%SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}"#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_multiple_entries() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, +%SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},} +%SRC +%SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, +%SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}""#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_trailing_comma() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @article{foo, bar = baz}"#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_insert_braces() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @article{foo, bar = baz,"#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_command() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @article{foo, bar = "\baz",}"#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_join_strings() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @article{foo, bar = "baz" # "qux"}"#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_parens() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @article(foo,)"#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_string() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @string{foo="bar"}"#, + )?); + + Ok(()) +} + +#[test] +fn bibtex_internal_preamble() -> Result<()> { + assert_snapshot!(format( + r#" +%BIB main.bib +%SRC @preamble{ +%SRC "foo bar baz" }"#, + )?); + + Ok(()) +} |