mirror of
https://github.com/latex-lsp/texlab.git
synced 2025-12-23 09:19:21 +00:00
Test BibTeX parser
This commit is contained in:
parent
6f40ae59d7
commit
ef05b79ff5
1 changed files with 383 additions and 0 deletions
|
|
@ -12,3 +12,386 @@ pub fn open(text: &str) -> Tree {
|
|||
let parser = Parser::new(lexer);
|
||||
parser.parse()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{
|
||||
protocol::{Range, RangeExt},
|
||||
syntax::text::SyntaxNode,
|
||||
};
|
||||
use petgraph::graph::NodeIndex;
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
struct TreeTraversal {
|
||||
nodes: Vec<NodeIndex>,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<'a> for TreeTraversal {
|
||||
fn visit(&mut self, tree: &Tree, node: NodeIndex) {
|
||||
self.nodes.push(node);
|
||||
tree.walk(self, node);
|
||||
}
|
||||
}
|
||||
|
||||
mod range {
|
||||
use super::*;
|
||||
use indoc::indoc;
|
||||
|
||||
fn verify(expected_ranges: Vec<Range>, text: &str) {
|
||||
let tree = open(text.trim());
|
||||
|
||||
let mut traversal = TreeTraversal::default();
|
||||
traversal.visit(&tree, tree.root);
|
||||
let actual_ranges: Vec<_> = traversal
|
||||
.nodes
|
||||
.into_iter()
|
||||
.map(|node| tree.graph[node].range())
|
||||
.collect();
|
||||
|
||||
println!("{:#?}", actual_ranges);
|
||||
assert_eq!(actual_ranges, expected_ranges);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_document() {
|
||||
verify(vec![Range::new_simple(0, 0, 0, 0)], "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn comment() {
|
||||
verify(
|
||||
vec![Range::new_simple(0, 0, 0, 3), Range::new_simple(0, 0, 0, 3)],
|
||||
"foo",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preamble_no_left() {
|
||||
verify(
|
||||
vec![Range::new_simple(0, 0, 0, 9), Range::new_simple(0, 0, 0, 9)],
|
||||
"@preamble",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preamble_no_content() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 10),
|
||||
Range::new_simple(0, 0, 0, 10),
|
||||
],
|
||||
"@preamble{",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preamble_no_right() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 15),
|
||||
Range::new_simple(0, 0, 0, 15),
|
||||
Range::new_simple(0, 10, 0, 15),
|
||||
Range::new_simple(0, 11, 0, 14),
|
||||
],
|
||||
r#"@preamble{"foo""#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preamble_complete() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 16),
|
||||
Range::new_simple(0, 0, 0, 16),
|
||||
Range::new_simple(0, 10, 0, 15),
|
||||
Range::new_simple(0, 11, 0, 14),
|
||||
],
|
||||
r#"@preamble{"foo"}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_no_left() {
|
||||
verify(
|
||||
vec![Range::new_simple(0, 0, 0, 7), Range::new_simple(0, 0, 0, 7)],
|
||||
r#"@string"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_no_name() {
|
||||
verify(
|
||||
vec![Range::new_simple(0, 0, 0, 8), Range::new_simple(0, 0, 0, 8)],
|
||||
r#"@string{"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_no_assign() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 11),
|
||||
Range::new_simple(0, 0, 0, 11),
|
||||
],
|
||||
r#"@string{foo"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_no_value() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 13),
|
||||
Range::new_simple(0, 0, 0, 13),
|
||||
],
|
||||
r#"@string{foo ="#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_no_right() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 19),
|
||||
Range::new_simple(0, 0, 0, 19),
|
||||
Range::new_simple(0, 14, 0, 19),
|
||||
Range::new_simple(0, 15, 0, 18),
|
||||
],
|
||||
r#"@string{foo = "bar""#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_complete() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 20),
|
||||
Range::new_simple(0, 0, 0, 20),
|
||||
Range::new_simple(0, 14, 0, 19),
|
||||
Range::new_simple(0, 15, 0, 18),
|
||||
],
|
||||
r#"@string{foo = "bar"}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn entry_no_left() {
|
||||
verify(
|
||||
vec![Range::new_simple(0, 0, 0, 8), Range::new_simple(0, 0, 0, 8)],
|
||||
r#"@article"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn entry_no_key() {
|
||||
verify(
|
||||
vec![Range::new_simple(0, 0, 0, 9), Range::new_simple(0, 0, 0, 9)],
|
||||
r#"@article{"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn entry_no_comma() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 12),
|
||||
Range::new_simple(0, 0, 0, 12),
|
||||
],
|
||||
r#"@article{foo"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn entry_no_right() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 13),
|
||||
Range::new_simple(0, 0, 0, 13),
|
||||
],
|
||||
r#"@article{foo,"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn entry_parentheses() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 14),
|
||||
Range::new_simple(0, 0, 0, 14),
|
||||
],
|
||||
r#"@article(foo,)"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn field_no_assign() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 1, 10),
|
||||
Range::new_simple(0, 0, 1, 10),
|
||||
Range::new_simple(1, 4, 1, 10),
|
||||
],
|
||||
indoc!(
|
||||
r#"
|
||||
@article{foo,
|
||||
author
|
||||
"#
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn field_no_value() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 1, 12),
|
||||
Range::new_simple(0, 0, 1, 12),
|
||||
Range::new_simple(1, 4, 1, 12),
|
||||
],
|
||||
indoc!(
|
||||
r#"
|
||||
@article{foo,
|
||||
author =
|
||||
"#
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn field_no_comma() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 1, 16),
|
||||
Range::new_simple(0, 0, 1, 16),
|
||||
Range::new_simple(1, 4, 1, 16),
|
||||
Range::new_simple(1, 13, 1, 16),
|
||||
],
|
||||
indoc!(
|
||||
r#"
|
||||
@article{foo,
|
||||
author = bar
|
||||
"#
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn field_complete() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 2, 1),
|
||||
Range::new_simple(0, 0, 2, 1),
|
||||
Range::new_simple(1, 4, 1, 17),
|
||||
Range::new_simple(1, 13, 1, 16),
|
||||
],
|
||||
indoc!(
|
||||
r#"
|
||||
@article{foo,
|
||||
author = bar,
|
||||
}
|
||||
"#
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn entry_two_fields() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 3, 1),
|
||||
Range::new_simple(0, 0, 3, 1),
|
||||
Range::new_simple(1, 4, 1, 17),
|
||||
Range::new_simple(1, 13, 1, 16),
|
||||
Range::new_simple(2, 4, 2, 16),
|
||||
Range::new_simple(2, 12, 2, 15),
|
||||
],
|
||||
indoc!(
|
||||
r#"
|
||||
@article{foo,
|
||||
author = bar,
|
||||
title = baz,
|
||||
}
|
||||
"#
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn quoted_content_no_children() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 12),
|
||||
Range::new_simple(0, 0, 0, 12),
|
||||
Range::new_simple(0, 10, 0, 11),
|
||||
],
|
||||
r#"@preamble{"}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn quoted_content_no_right() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 16),
|
||||
Range::new_simple(0, 0, 0, 16),
|
||||
Range::new_simple(0, 10, 0, 15),
|
||||
Range::new_simple(0, 11, 0, 15),
|
||||
],
|
||||
r#"@preamble{"word}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn braced_content_no_children() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 11),
|
||||
Range::new_simple(0, 0, 0, 11),
|
||||
Range::new_simple(0, 10, 0, 11),
|
||||
],
|
||||
r#"@preamble{{"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn braced_content_no_right() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 15),
|
||||
Range::new_simple(0, 0, 0, 15),
|
||||
Range::new_simple(0, 10, 0, 15),
|
||||
Range::new_simple(0, 11, 0, 15),
|
||||
],
|
||||
r#"@preamble{{word"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn concat_no_right() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 16),
|
||||
Range::new_simple(0, 0, 0, 16),
|
||||
Range::new_simple(0, 10, 0, 15),
|
||||
Range::new_simple(0, 10, 0, 13),
|
||||
],
|
||||
r#"@preamble{foo #}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn concat_complete() {
|
||||
verify(
|
||||
vec![
|
||||
Range::new_simple(0, 0, 0, 20),
|
||||
Range::new_simple(0, 0, 0, 20),
|
||||
Range::new_simple(0, 10, 0, 19),
|
||||
Range::new_simple(0, 10, 0, 13),
|
||||
Range::new_simple(0, 16, 0, 19),
|
||||
],
|
||||
r#"@preamble{foo # bar}"#,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue