#![cfg(debug_assertions)]
use df_ls_lexical_analysis::{Tree, TreeCursor};
use std::rc::Rc;
#[macro_export]
macro_rules! test_tree_structure {
( $builder:ident, [$( $t:ty => $x:expr ),* $(,)*]) => {
{
#[cfg(debug_assertions)]
use pretty_assertions::assert_eq;
let ($builder, tree, source) = $builder.run_lexer_test_builder();
let mut tree_cursor = tree.walk();
tree_cursor.goto_first_child();
tree_cursor.goto_next_sibling();
let mut diagnostic_info = DiagnosticsInfo::default();
let mut token_group_counter = 1;
$(
$crate::test_utils::skip_comment(&mut tree_cursor, &tree, token_group_counter);
let given_value: $t = match $crate::TokenDeserialize::deserialize_tokens(&mut tree_cursor, &source, &mut diagnostic_info){
Ok(v) => *v,
Err(_err) => {
let given_s_exp = tree.root_node().to_sexp(0);
log::info!("Given S-Expression:\n{}", given_s_exp);
panic!("Current token group #{}. Failed to deserialize token", token_group_counter);
}
};
assert_eq!(
$x,
given_value
);
token_group_counter += 1;
)*
let _ = token_group_counter;
$builder.run_test_with_custom_data(&false, diagnostic_info);
}
};
( $builder:ident, [$( $t:ty =! ),* $(,)*]) => {
{
let ($builder, tree, source) = $builder.run_lexer_test_builder();
let mut tree_cursor = tree.walk();
tree_cursor.goto_first_child();
tree_cursor.goto_next_sibling();
let mut diagnostic_info = DiagnosticsInfo::default();
let mut token_group_counter = 1;
$(
$crate::test_utils::skip_comment(&mut tree_cursor, &tree, token_group_counter);
let given_result: Result<Box<$t>, ()> = $crate::TokenDeserialize::deserialize_tokens(&mut tree_cursor, &source, &mut diagnostic_info);
match given_result {
Ok(v) => {
let given_s_exp = tree.root_node().to_sexp(0);
log::info!("Given S-Expression:\n{}", given_s_exp);
log::error!("Value correctly deserialized: {:#?}", *v);
panic!(
"Current token group #{}. Was correctly deserialize token, \
Expected an deserialization error", token_group_counter
);
}
Err(_err) => {}
}
token_group_counter += 1;
)*
let _ = token_group_counter;
$builder.run_test_with_custom_data(&false, diagnostic_info);
}
};
}
pub fn skip_comment(tree_cursor: &mut TreeCursor, tree: &Rc<Tree>, token_group_counter: u32) {
let node = tree_cursor.node();
if &node.kind() == "comment" {
if !tree_cursor.goto_next_sibling() {
let given_s_exp = tree.root_node().to_sexp(0);
log::info!("Given S-Expression:\n{}", given_s_exp);
panic!(
"Current token group #{}. The next token does not exist.",
token_group_counter
);
}
}
}