diff --git a/cli/src/tests/language_test.rs b/cli/src/tests/language_test.rs new file mode 100644 index 00000000..2ac5bb77 --- /dev/null +++ b/cli/src/tests/language_test.rs @@ -0,0 +1,41 @@ +use super::helpers::fixtures::get_language; +use tree_sitter::Parser; + +#[test] +fn test_lookahead_iterator() { + let mut parser = Parser::new(); + let language = get_language("rust"); + parser.set_language(language).unwrap(); + + let tree = parser.parse("struct Stuff {}", None).unwrap(); + + let mut cursor = tree.walk(); + + assert!(cursor.goto_first_child()); // struct + assert!(cursor.goto_first_child()); // struct keyword + + let next_state = cursor.node().next_parse_state(); + assert_ne!(next_state, 0); + assert_eq!( + next_state, + language.next_state(cursor.node().parse_state(), cursor.node().grammar_id()) + ); + assert!((next_state as usize) < language.parse_state_count()); + assert!(cursor.goto_next_sibling()); // type_identifier + assert_eq!(next_state, cursor.node().parse_state()); + assert_eq!(cursor.node().grammar_name(), "identifier"); + assert_ne!(cursor.node().grammar_id(), cursor.node().kind_id()); + + let expected_symbols = ["identifier", "block_comment", "line_comment"]; + let lookahead = language.lookahead_iterator(next_state).unwrap(); + assert_eq!(lookahead.language(), language); + assert!(lookahead.iter_names().eq(expected_symbols)); + + lookahead.reset_state(next_state); + assert!(lookahead.iter_names().eq(expected_symbols)); + + lookahead.reset(&language, next_state); + assert!(lookahead + .map(|s| language.node_kind_for_id(s).unwrap()) + .eq(expected_symbols)); +} diff --git a/cli/src/tests/mod.rs b/cli/src/tests/mod.rs index 223b6d3c..577770a2 100644 --- a/cli/src/tests/mod.rs +++ b/cli/src/tests/mod.rs @@ -2,6 +2,7 @@ mod corpus_test; mod github_issue_test; mod helpers; mod highlight_test; +mod language_test; mod node_test; mod parser_test; mod pathological_test;