summaryrefslogtreecommitdiff
path: root/tests/parse.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/parse.rs')
-rw-r--r--tests/parse.rs236
1 files changed, 0 insertions, 236 deletions
diff --git a/tests/parse.rs b/tests/parse.rs
deleted file mode 100644
index 616f4d70..00000000
--- a/tests/parse.rs
+++ /dev/null
@@ -1,236 +0,0 @@
-#![allow(unused_imports)]
-#![allow(dead_code)]
-#![allow(non_snake_case)]
-
-use typstc::func::Scope;
-use typstc::size::Size;
-use typstc::syntax::*;
-use typstc::{function, parse};
-
-
-mod token_shorthands {
- pub use super::Token::{
- Whitespace as W,
- LineComment as LC, BlockComment as BC, StarSlash as SS,
- LeftBracket as LB, RightBracket as RB,
- LeftParen as LP, RightParen as RP,
- LeftBrace as LBR, RightBrace as RBR,
- Colon as CL, Comma as CM, Equals as EQ,
- ExprIdent as ID, ExprStr as STR, ExprSize as SIZE,
- ExprNumber as NUM, ExprBool as BOOL,
- Star as ST, Underscore as U, Backtick as B, Text as T,
- };
-}
-
-mod node_shorthands {
- use super::Node;
- pub use Node::{
- Space as S, Newline as N, Text,
- ToggleItalic as I, ToggleBolder as B, ToggleMonospace as M,
- Func,
- };
- pub fn T(text: &str) -> Node { Node::Text(text.to_string()) }
-}
-
-macro_rules! F {
- (@body None) => (None);
- (@body Some([$($tts:tt)*])) => ({
- let nodes = vec![$($tts)*].into_iter()
- .map(|v| Spanned { v, span: Span::ZERO })
- .collect();
-
- Some(SyntaxTree { nodes })
- });
-
- ($($body:tt)*) => ({
- Func(FuncCall(Box::new(DebugFn {
- pos: vec![],
- key: vec![],
- body: F!(@body $($body)*),
- })))
- });
-}
-
-function! {
- #[derive(Debug, PartialEq)]
- pub struct DebugFn {
- pos: Vec<Spanned<Expression>>,
- key: Vec<Pair>,
- body: Option<SyntaxTree>,
- }
-
- parse(args, body, ctx) {
- DebugFn {
- pos: args.iter_pos().collect(),
- key: args.iter_keys().collect(),
- body: parse!(optional: body, ctx),
- }
- }
-
- layout() { vec![] }
-}
-
-impl DebugFn {
- fn compare(&self, other: &DebugFn) -> bool {
- self.pos.iter().zip(&other.pos).all(|(a, b)| a.v == b.v)
- && self.key.iter().zip(&other.key)
- .all(|(a, b)| a.key.v == b.key.v && a.value.v == b.value.v)
- && match (&self.body, &other.body) {
- (Some(a), Some(b)) => compare(a, b),
- (None, None) => true,
- _ => false,
- }
- }
-}
-
-fn downcast(func: &FuncCall) -> &DebugFn {
- func.0.downcast::<DebugFn>().expect("not a debug fn")
-}
-
-fn compare(a: &SyntaxTree, b: &SyntaxTree) -> bool {
- for (x, y) in a.nodes.iter().zip(&b.nodes) {
- use node_shorthands::*;
- let same = match (&x.v, &y.v) {
- (S, S) | (N, N) | (I, I) | (B, B) | (M, M) => true,
- (Text(t1), Text(t2)) => t1 == t2,
- (Func(f1), Func(f2)) => {
- downcast(f1).compare(downcast(f2))
- }
- _ => false,
- };
-
- if !same { return false; }
- }
- true
-}
-
-/// Parses the test syntax.
-macro_rules! tokens {
- ($($task:ident $src:expr =>($line:expr)=> [$($tts:tt)*])*) => ({
- #[allow(unused_mut)]
- let mut cases = Vec::new();
- $(cases.push(($line, $src, tokens!(@$task [$($tts)*])));)*
- cases
- });
-
- (@t [$($tts:tt)*]) => ({
- use token_shorthands::*;
- Target::Tokenize(vec![$($tts)*])
- });
-
- (@ts [$($tts:tt)*]) => ({
- use token_shorthands::*;
- Target::TokenizeSpanned(tokens!(@__spans [$($tts)*]))
- });
-
- (@p [$($tts:tt)*]) => ({
- use node_shorthands::*;
-
- let nodes = vec![$($tts)*].into_iter()
- .map(|v| Spanned { v, span: Span::ZERO })
- .collect();
-
- Target::Parse(SyntaxTree { nodes })
- });
-
- (@ps [$($tts:tt)*]) => ({
- use node_shorthands::*;
- Target::ParseSpanned(tokens!(@__spans [$($tts)*]))
- });
-
- (@__spans [$(($sl:tt:$sc:tt, $el:tt:$ec:tt, $v:expr)),* $(,)?]) => ({
- vec![
- $(Spanned { v: $v, span: Span {
- start: Position { line: $sl, column: $sc },
- end: Position { line: $el, column: $ec },
- }}),*
- ]
- });
-}
-
-#[derive(Debug)]
-enum Target {
- Tokenize(Vec<Token<'static>>),
- TokenizeSpanned(Vec<Spanned<Token<'static>>>),
- Parse(SyntaxTree),
- ParseSpanned(SyntaxTree),
-}
-
-fn main() {
- let tests = include!("cache/parse");
- let mut errors = false;
-
- let len = tests.len();
- println!();
- println!("Running {} test{}", len, if len > 1 { "s" } else { "" });
-
- // Go through all test files.
- for (file, cases) in tests.into_iter() {
- print!("Testing: {}. ", file);
-
- let mut okay = 0;
- let mut failed = 0;
-
- // Go through all tests in a test file.
- for (line, src, target) in cases.into_iter() {
- let (correct, expected, found) = test_case(src, target);
-
- // Check whether the tokenization works correctly.
- if correct {
- okay += 1;
- } else {
- if failed == 0 {
- println!();
- }
-
- println!(" - Case failed in file {}.rs in line {}.", file, line);
- println!(" - Source: {:?}", src);
- println!(" - Expected: {:?}", expected);
- println!(" - Found: {:?}", found);
- println!();
-
- failed += 1;
- errors = true;
- }
- }
-
- // Print a small summary.
- print!("{} okay, {} failed.", okay, failed);
- if failed == 0 {
- print!(" ✔")
- }
- println!();
- }
-
- println!();
-
- if errors {
- std::process::exit(-1);
- }
-}
-
-fn test_case(src: &str, target: Target) -> (bool, String, String) {
- match target {
- Target::Tokenize(tokens) => {
- let found: Vec<_> = tokenize(src).map(Spanned::value).collect();
- (found == tokens, format!("{:?}", tokens), format!("{:?}", found))
- }
-
- Target::TokenizeSpanned(tokens) => {
- let found: Vec<_> = tokenize(src).collect();
- (found == tokens, format!("{:?}", tokens), format!("{:?}", found))
- }
-
- Target::Parse(tree) => {
- let scope = Scope::with_debug::<DebugFn>();
- let (found, _, errs) = parse(src, ParseContext { scope: &scope });
- (compare(&tree, &found), format!("{:?}", tree), format!("{:?}", found))
- }
-
- Target::ParseSpanned(tree) => {
- let scope = Scope::with_debug::<DebugFn>();
- let (found, _, _) = parse(src, ParseContext { scope: &scope });
- (tree == found, format!("{:?}", tree), format!("{:?}", found))
- }
- }
-}