extern crate testutils; #[macro_use] extern crate tom; #[macro_use] extern crate lazy_static; mod ast; mod edit; mod factory; use std::{ panic, sync::Mutex }; use testutils::assert_eq_text; use tom::{AstNode, CstNode, TomlDoc}; #[test] fn test_parser_inline() { testutils::dir_tests(&["inline"], |text| toml(text).debug()) } #[test] fn test_parser_ok() { testutils::dir_tests(&["ok"], |text| toml(text).debug()) } #[test] fn test_parser_err() { testutils::dir_tests(&["err"], |text| toml(text).debug()) } #[test] fn test_parser_validation() { testutils::dir_tests(&["validation"], |text| toml(text).debug()) } fn toml(text: &str) -> TomlDoc { TomlDoc::new(text) } fn find(doc: &TomlDoc) -> A { subtree(doc.cst(), doc) .into_iter() .filter_map(|node| A::cast(node, doc)) .next() .unwrap() } fn subtree(node: CstNode, doc: &TomlDoc) -> Vec { let mut buff = Vec::new(); go(node, doc, &mut buff); return buff; fn go(node: CstNode, doc: &TomlDoc, buff: &mut Vec) { buff.push(node); for child in node.children(doc) { go(child, doc, buff); } } } pub fn check_edit(before: &str, after: &str, edit: impl FnOnce(&mut TomlDoc)) { let mut doc = TomlDoc::new(before); doc.start_edit(); edit(&mut doc); let actual = doc.cst().get_text(&doc); assert_eq_text(after, &actual); } lazy_static! { static ref LOCK: std::sync::Mutex<()> = Mutex::new(()); } pub fn check_panics(f: impl FnOnce()) { let _guard = LOCK.lock().unwrap(); let old_hook = panic::take_hook(); panic::set_hook(Box::new(|_| ())); let result = panic::catch_unwind(panic::AssertUnwindSafe(f)); panic::set_hook(old_hook); assert!(result.is_err()); }