diff options
Diffstat (limited to 'support/texlab/tests/integration/document_symbol.rs')
-rw-r--r-- | support/texlab/tests/integration/document_symbol.rs | 836 |
1 files changed, 425 insertions, 411 deletions
diff --git a/support/texlab/tests/integration/document_symbol.rs b/support/texlab/tests/integration/document_symbol.rs index afc3d54831..dbdbe64972 100644 --- a/support/texlab/tests/integration/document_symbol.rs +++ b/support/texlab/tests/integration/document_symbol.rs @@ -1,424 +1,438 @@ -use indoc::indoc; -use texlab::{ - protocol::{DocumentSymbol, Range, RangeExt}, - test::{TestBedBuilder, NESTED_SYMBOL_CAPABILITIES}, +use anyhow::Result; +use insta::assert_json_snapshot; +use lsp_types::{ + ClientCapabilities, DocumentSymbolClientCapabilities, TextDocumentClientCapabilities, Url, }; -fn verify_symbol( - symbol: &DocumentSymbol, - name: &str, - detail: Option<&str>, - selection_range: Range, - range: Range, -) { - assert_eq!(symbol.name, name); - assert_eq!(symbol.detail.as_ref().map(AsRef::as_ref), detail); - assert_eq!(symbol.selection_range, selection_range); - assert_eq!(symbol.range, range); +use crate::common::ServerTester; + +fn nested_symbol_capabilities() -> ClientCapabilities { + ClientCapabilities { + text_document: Some(TextDocumentClientCapabilities { + document_symbol: Some(DocumentSymbolClientCapabilities { + hierarchical_document_symbol_support: Some(true), + ..DocumentSymbolClientCapabilities::default() + }), + ..TextDocumentClientCapabilities::default() + }), + ..ClientCapabilities::default() + } } -#[tokio::test] -async fn enumerate() { - let mut test_bed = TestBedBuilder::new() - .file( - "main.tex", - indoc!( - r#" - \documentclass{article} - % - \begin{document} - % - \begin{enumerate} - \item\label{it:foo} Foo - \item\label{it:bar} Bar - \item[Baz] Baz - \item[Qux]\label{it:qux} Qux - \end{enumerate} - % - \end{document} - "# - ), - ) - .file( - "main.aux", - indoc!( - r#" - \relax - \newlabel{it:foo}{{1}{1}} - \newlabel{it:qux}{{2}{1}} - "# - ), - ) - .build() - .await; - - test_bed.spawn(); - test_bed - .initialize(NESTED_SYMBOL_CAPABILITIES.clone()) - .await; - test_bed.open("main.tex").await; - test_bed.open("main.aux").await; - - let mut actual_symbols = test_bed.document_symbol_nested("main.tex").await.unwrap(); - - test_bed.shutdown().await; - - assert_eq!(actual_symbols.len(), 1); - verify_symbol( - &actual_symbols[0], - "Enumerate", - None, - Range::new_simple(4, 0, 9, 15), - Range::new_simple(4, 0, 9, 15), - ); - - let children = actual_symbols[0].children.take().unwrap(); - assert_eq!(children.len(), 4); - verify_symbol( - &children[0], - "1", - Some("it:foo"), - Range::new_simple(5, 9, 5, 23), - Range::new_simple(5, 4, 6, 4), - ); - verify_symbol( - &children[1], - "Item", - Some("it:bar"), - Range::new_simple(6, 9, 6, 23), - Range::new_simple(6, 4, 7, 4), - ); - verify_symbol( - &children[2], - "Baz", - None, - Range::new_simple(7, 4, 7, 14), - Range::new_simple(7, 4, 8, 4), - ); - verify_symbol( - &children[3], - "Qux", - Some("it:qux"), - Range::new_simple(8, 14, 8, 28), - Range::new_simple(8, 4, 9, 0), - ); +#[test] +fn test_enumerate_nested() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(nested_symbol_capabilities(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \begin{enumerate} + \item\label{it:foo} Foo + \item\label{it:bar} Bar + \item[Baz] Baz + \item[Qux]\label{it:qux} Qux + \end{enumerate} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \newlabel{it:foo}{{1}{1}} + \newlabel{it:qux}{{2}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) } -#[tokio::test] -async fn equation() { - let mut test_bed = TestBedBuilder::new() - .file( - "main.tex", - indoc!( - r#" - \documentclass{article} - % - \begin{document} - % - \begin{equation}\label{eq:foo} - Foo - \end{equation} - % - \begin{equation}\label{eq:bar} - Bar - \end{equation} - % - \begin{equation} - Baz - \end{equation} - % - \end{document} - "# - ), - ) - .file( - "main.aux", - indoc!( - r#" - \relax - \newlabel{eq:foo}{{1}{1}} - "# - ), - ) - .build() - .await; - - test_bed.spawn(); - test_bed - .initialize(NESTED_SYMBOL_CAPABILITIES.clone()) - .await; - test_bed.open("main.tex").await; - test_bed.open("main.aux").await; - - let actual_symbols = test_bed.document_symbol_nested("main.tex").await.unwrap(); - - test_bed.shutdown().await; - - assert_eq!(actual_symbols.len(), 3); - verify_symbol( - &actual_symbols[0], - "Equation (1)", - Some("eq:foo"), - Range::new_simple(4, 16, 4, 30), - Range::new_simple(4, 0, 6, 14), - ); - verify_symbol( - &actual_symbols[1], - "Equation", - Some("eq:bar"), - Range::new_simple(8, 16, 8, 30), - Range::new_simple(8, 0, 10, 14), - ); - verify_symbol( - &actual_symbols[2], - "Equation", - None, - Range::new_simple(12, 0, 14, 14), - Range::new_simple(12, 0, 14, 14), - ); +#[test] +fn test_enumerate_flat() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(ClientCapabilities::default(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \begin{enumerate} + \item\label{it:foo} Foo + \item\label{it:bar} Bar + \item[Baz] Baz + \item[Qux]\label{it:qux} Qux + \end{enumerate} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \newlabel{it:foo}{{1}{1}} + \newlabel{it:qux}{{2}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) } -#[tokio::test] -async fn float() { - let mut test_bed = TestBedBuilder::new() - .file( - "main.tex", - indoc!( - r#" - \documentclass{article} - % - \begin{document} - % - \begin{figure} - Foo - \caption{Foo}\label{fig:foo} - \end{figure} - % - \begin{figure} - Bar - \caption{Bar}\label{fig:bar} - \end{figure} - % - \begin{figure} - Baz - \caption{Baz} - \end{figure} - % - \begin{figure} - Qux - \end{figure} - % - \end{document} - "# - ), - ) - .file( - "main.aux", - indoc!( - r#" - \relax - \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Foo}}{1}\protected@file@percent } - \newlabel{fig:foo}{{1}{1}} - \@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Bar}}{1}\protected@file@percent } - \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Baz}}{1}\protected@file@percent } - "# - ), - ) - .build() - .await; - - test_bed.spawn(); - test_bed - .initialize(NESTED_SYMBOL_CAPABILITIES.clone()) - .await; - test_bed.open("main.tex").await; - test_bed.open("main.aux").await; - - let actual_symbols = test_bed.document_symbol_nested("main.tex").await.unwrap(); - - test_bed.shutdown().await; - - assert_eq!(actual_symbols.len(), 3); - verify_symbol( - &actual_symbols[0], - "Figure 1: Foo", - Some("fig:foo"), - Range::new_simple(6, 17, 6, 32), - Range::new_simple(4, 0, 7, 12), - ); - verify_symbol( - &actual_symbols[1], - "Figure: Bar", - Some("fig:bar"), - Range::new_simple(11, 17, 11, 32), - Range::new_simple(9, 0, 12, 12), - ); - verify_symbol( - &actual_symbols[2], - "Figure: Baz", - None, - Range::new_simple(14, 0, 17, 12), - Range::new_simple(14, 0, 17, 12), - ); +#[test] +fn test_equation_nested() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(nested_symbol_capabilities(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \begin{equation}\label{eq:foo} + Foo + \end{equation} + + \begin{equation}\label{eq:bar} + Bar + \end{equation} + + \begin{equation} + Baz + \end{equation} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \newlabel{eq:foo}{{1}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) } -#[tokio::test] -async fn section() { - let mut test_bed = TestBedBuilder::new() - .file( - "main.tex", - indoc!( - r#" - \documentclass{article} - % - \begin{document} - % - \section{Foo} - % - \section{Bar}\label{sec:bar} - % - \subsection{Baz}\label{sec:baz} - % - \end{document} - "# - ), - ) - .file( - "main.aux", - indoc!( - r#" - \relax - \@writefile{toc}{\contentsline {section}{\numberline {1}Foo}{1}\protected@file@percent } - \@writefile{toc}{\contentsline {section}{\numberline {2}Bar}{1}\protected@file@percent } - \newlabel{sec:bar}{{2}{1}} - "# - ), - ) - .build() - .await; - - test_bed.spawn(); - test_bed - .initialize(NESTED_SYMBOL_CAPABILITIES.clone()) - .await; - test_bed.open("main.tex").await; - test_bed.open("main.aux").await; - - let mut actual_symbols = test_bed.document_symbol_nested("main.tex").await.unwrap(); - - test_bed.shutdown().await; - - assert_eq!(actual_symbols.len(), 2); - verify_symbol( - &actual_symbols[0], - "Foo", - None, - Range::new_simple(4, 0, 4, 13), - Range::new_simple(4, 0, 6, 0), - ); - verify_symbol( - &actual_symbols[1], - "2 Bar", - Some("sec:bar"), - Range::new_simple(6, 0, 6, 13), - Range::new_simple(6, 0, 10, 0), - ); - - let children = actual_symbols[1].children.take().unwrap(); - assert_eq!(children.len(), 1); - verify_symbol( - &children[0], - "Baz", - Some("sec:baz"), - Range::new_simple(8, 0, 8, 16), - Range::new_simple(8, 0, 10, 0), - ); +#[test] +fn test_equation_flat() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(ClientCapabilities::default(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \begin{equation}\label{eq:foo} + Foo + \end{equation} + + \begin{equation}\label{eq:bar} + Bar + \end{equation} + + \begin{equation} + Baz + \end{equation} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \newlabel{eq:foo}{{1}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) } -#[tokio::test] -async fn theorem() { - let mut test_bed = TestBedBuilder::new() - .file( - "main.tex", - indoc!( - r#" - \documentclass{article} - \usepackage{amsthm} - \newtheorem{lemma}{Lemma} - % - \begin{document} - % - \begin{lemma}[Foo]\label{thm:foo} - Foo - \end{lemma} - % - \begin{lemma}\label{thm:bar} - Bar - \end{lemma} - % - \begin{lemma}\label{thm:baz} - Baz - \end{lemma} - % - \begin{lemma}[Qux] - Qux - \end{lemma} - % - \end{document} - "# - ), - ) - .file( - "main.aux", - indoc!( - r#" - \relax - \newlabel{thm:foo}{{1}{1}} - \newlabel{thm:bar}{{2}{1}} - "# - ), - ) - .build() - .await; - - test_bed.spawn(); - test_bed - .initialize(NESTED_SYMBOL_CAPABILITIES.clone()) - .await; - test_bed.open("main.tex").await; - test_bed.open("main.aux").await; - - let actual_symbols = test_bed.document_symbol_nested("main.tex").await.unwrap(); - - test_bed.shutdown().await; - - assert_eq!(actual_symbols.len(), 4); - verify_symbol( - &actual_symbols[0], - "Lemma 1 (Foo)", - Some("thm:foo"), - Range::new_simple(6, 18, 6, 33), - Range::new_simple(6, 0, 8, 11), - ); - verify_symbol( - &actual_symbols[1], - "Lemma 2", - Some("thm:bar"), - Range::new_simple(10, 13, 10, 28), - Range::new_simple(10, 0, 12, 11), - ); - verify_symbol( - &actual_symbols[2], - "Lemma", - Some("thm:baz"), - Range::new_simple(14, 13, 14, 28), - Range::new_simple(14, 0, 16, 11), - ); - verify_symbol( - &actual_symbols[3], - "Lemma (Qux)", - None, - Range::new_simple(18, 0, 20, 11), - Range::new_simple(18, 0, 20, 11), - ); +#[test] +fn test_float_nested() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(nested_symbol_capabilities(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \begin{figure} + Foo + \caption{Foo}\label{fig:foo} + \end{figure} + + \begin{figure} + Bar + \caption{Bar}\label{fig:bar} + \end{figure} + + \begin{figure} + Baz + \caption{Baz} + \end{figure} + + \begin{figure} + Qux + \end{figure} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Foo}}{1}\protected@file@percent } + \newlabel{fig:foo}{{1}{1}} + \@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Bar}}{1}\protected@file@percent } + \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Baz}}{1}\protected@file@percent } + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) +} + +#[test] +fn test_float_flat() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(ClientCapabilities::default(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \begin{figure} + Foo + \caption{Foo}\label{fig:foo} + \end{figure} + + \begin{figure} + Bar + \caption{Bar}\label{fig:bar} + \end{figure} + + \begin{figure} + Baz + \caption{Baz} + \end{figure} + + \begin{figure} + Qux + \end{figure} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Foo}}{1}\protected@file@percent } + \newlabel{fig:foo}{{1}{1}} + \@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Bar}}{1}\protected@file@percent } + \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Baz}}{1}\protected@file@percent } + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) +} + +#[test] +fn test_section_nested() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(nested_symbol_capabilities(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \section{Foo} + + \section{Bar}\label{sec:bar} + + \subsection{Baz}\label{sec:baz} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \@writefile{toc}{\contentsline {section}{\numberline {1}Foo}{1}\protected@file@percent } + \@writefile{toc}{\contentsline {section}{\numberline {2}Bar}{1}\protected@file@percent } + \newlabel{sec:bar}{{2}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) +} + +#[test] +fn test_section_flat() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(ClientCapabilities::default(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + + \begin{document} + + \section{Foo} + + \section{Bar}\label{sec:bar} + + \subsection{Baz}\label{sec:baz} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \@writefile{toc}{\contentsline {section}{\numberline {1}Foo}{1}\protected@file@percent } + \@writefile{toc}{\contentsline {section}{\numberline {2}Bar}{1}\protected@file@percent } + \newlabel{sec:bar}{{2}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) +} + +#[test] +fn test_theorem_nested() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(nested_symbol_capabilities(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + \usepackage{amsthm} + \newtheorem{lemma}{Lemma} + + \begin{document} + + \begin{lemma}[Foo]\label{thm:foo} + Foo + \end{lemma} + + \begin{lemma}\label{thm:bar} + Bar + \end{lemma} + + \begin{lemma}\label{thm:baz} + Baz + \end{lemma} + + \begin{lemma}[Qux] + Qux + \end{lemma} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \newlabel{thm:foo}{{1}{1}} + \newlabel{thm:bar}{{2}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) +} + +#[test] +fn test_theorem_flat() -> Result<()> { + let server = ServerTester::launch_new_instance()?; + server.initialize(ClientCapabilities::default(), None)?; + let uri = Url::parse("http://www.example.com/main.tex")?; + server.open_memory( + uri.clone(), + r#" + \documentclass{article} + \usepackage{amsthm} + \newtheorem{lemma}{Lemma} + + \begin{document} + + \begin{lemma}[Foo]\label{thm:foo} + Foo + \end{lemma} + + \begin{lemma}\label{thm:bar} + Bar + \end{lemma} + + \begin{lemma}\label{thm:baz} + Baz + \end{lemma} + + \begin{lemma}[Qux] + Qux + \end{lemma} + + \end{document} + "#, + "latex", + )?; + server.open_memory( + Url::parse("http://www.example.com/main.aux")?, + r#" + \relax + \newlabel{thm:foo}{{1}{1}} + \newlabel{thm:bar}{{2}{1}} + "#, + "latex", + )?; + assert_json_snapshot!(server.find_document_symbols(uri)?); + Ok(()) } |