From ceac2380ed5fddc623e0b7e2134f75dc4c9e5e7c Mon Sep 17 00:00:00 2001 From: Andrew Hlynskyi Date: Fri, 12 May 2023 16:34:13 +0300 Subject: [PATCH] chore(test): reorganize test helpers --- cli/src/tests/helpers/query_helpers.rs | 57 +++++++++++++++++++++++- cli/src/tests/query_test.rs | 60 ++------------------------ 2 files changed, 60 insertions(+), 57 deletions(-) diff --git a/cli/src/tests/helpers/query_helpers.rs b/cli/src/tests/helpers/query_helpers.rs index 78ae559c..0638701c 100644 --- a/cli/src/tests/helpers/query_helpers.rs +++ b/cli/src/tests/helpers/query_helpers.rs @@ -1,6 +1,8 @@ use rand::prelude::Rng; use std::{cmp::Ordering, fmt::Write, ops::Range}; -use tree_sitter::{Node, Point, Tree, TreeCursor}; +use tree_sitter::{ + Language, Node, Parser, Point, Query, QueryCapture, QueryCursor, QueryMatch, Tree, TreeCursor, +}; #[derive(Debug)] pub struct Pattern { @@ -304,3 +306,56 @@ fn compare_depth_first(a: Node, b: Node) -> Ordering { let b = b.byte_range(); a.start.cmp(&b.start).then_with(|| b.end.cmp(&a.end)) } + +pub fn assert_query_matches( + language: Language, + query: &Query, + source: &str, + expected: &[(usize, Vec<(&str, &str)>)], +) { + let mut parser = Parser::new(); + parser.set_language(language).unwrap(); + let tree = parser.parse(source, None).unwrap(); + let mut cursor = QueryCursor::new(); + let matches = cursor.matches(&query, tree.root_node(), source.as_bytes()); + assert_eq!(collect_matches(matches, &query, source), expected); + assert_eq!(cursor.did_exceed_match_limit(), false); +} + +pub fn collect_matches<'a>( + matches: impl Iterator>, + query: &'a Query, + source: &'a str, +) -> Vec<(usize, Vec<(&'a str, &'a str)>)> { + matches + .map(|m| { + ( + m.pattern_index, + format_captures(m.captures.iter().cloned(), query, source), + ) + }) + .collect() +} + +pub fn collect_captures<'a>( + captures: impl Iterator, usize)>, + query: &'a Query, + source: &'a str, +) -> Vec<(&'a str, &'a str)> { + format_captures(captures.map(|(m, i)| m.captures[i]), query, source) +} + +fn format_captures<'a>( + captures: impl Iterator>, + query: &'a Query, + source: &'a str, +) -> Vec<(&'a str, &'a str)> { + captures + .map(|capture| { + ( + query.capture_names()[capture.index as usize].as_str(), + capture.node.utf8_text(source.as_bytes()).unwrap(), + ) + }) + .collect() +} diff --git a/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs index f0bded2f..912136cb 100644 --- a/cli/src/tests/query_test.rs +++ b/cli/src/tests/query_test.rs @@ -1,16 +1,17 @@ use super::helpers::{ allocations, fixtures::get_language, - query_helpers::{Match, Pattern}, + query_helpers::{assert_query_matches, Match, Pattern}, ITERATION_COUNT, }; +use crate::tests::helpers::query_helpers::{collect_captures, collect_matches}; use indoc::indoc; use lazy_static::lazy_static; use rand::{prelude::StdRng, SeedableRng}; use std::{env, fmt::Write}; use tree_sitter::{ - CaptureQuantifier, Language, Node, Parser, Point, Query, QueryCapture, QueryCursor, QueryError, - QueryErrorKind, QueryMatch, QueryPredicate, QueryPredicateArg, QueryProperty, + CaptureQuantifier, Language, Node, Parser, Point, Query, QueryCursor, QueryError, + QueryErrorKind, QueryPredicate, QueryPredicateArg, QueryProperty, }; use unindent::Unindent; @@ -4574,56 +4575,3 @@ fn test_query_max_start_depth() { } }); } - -fn assert_query_matches( - language: Language, - query: &Query, - source: &str, - expected: &[(usize, Vec<(&str, &str)>)], -) { - let mut parser = Parser::new(); - parser.set_language(language).unwrap(); - let tree = parser.parse(source, None).unwrap(); - let mut cursor = QueryCursor::new(); - let matches = cursor.matches(&query, tree.root_node(), source.as_bytes()); - assert_eq!(collect_matches(matches, &query, source), expected); - assert_eq!(cursor.did_exceed_match_limit(), false); -} - -fn collect_matches<'a>( - matches: impl Iterator>, - query: &'a Query, - source: &'a str, -) -> Vec<(usize, Vec<(&'a str, &'a str)>)> { - matches - .map(|m| { - ( - m.pattern_index, - format_captures(m.captures.iter().cloned(), query, source), - ) - }) - .collect() -} - -fn collect_captures<'a>( - captures: impl Iterator, usize)>, - query: &'a Query, - source: &'a str, -) -> Vec<(&'a str, &'a str)> { - format_captures(captures.map(|(m, i)| m.captures[i]), query, source) -} - -fn format_captures<'a>( - captures: impl Iterator>, - query: &'a Query, - source: &'a str, -) -> Vec<(&'a str, &'a str)> { - captures - .map(|capture| { - ( - query.capture_names()[capture.index as usize].as_str(), - capture.node.utf8_text(source.as_bytes()).unwrap(), - ) - }) - .collect() -}