From fc2912edd2bbd0e1b01f3b87d5e5560b84a1571d Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Tue, 16 Sep 2025 00:00:26 -0500 Subject: [PATCH] Start adding ast build tests. --- src/ast/build_tests/backtick_inner/greeting | 1 + src/ast/build_tests/backtick_string/mixed | 1 + src/ast/build_tests/boolean_literal/false | 1 + src/ast/build_tests/boolean_literal/true | 1 + src/ast/mod.rs | 50 +++++++++++++++++++++ src/parser/ast.yaml | 6 ++- 6 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/ast/build_tests/backtick_inner/greeting create mode 100644 src/ast/build_tests/backtick_string/mixed create mode 100644 src/ast/build_tests/boolean_literal/false create mode 100644 src/ast/build_tests/boolean_literal/true diff --git a/src/ast/build_tests/backtick_inner/greeting b/src/ast/build_tests/backtick_inner/greeting new file mode 100644 index 0000000..b45ef6f --- /dev/null +++ b/src/ast/build_tests/backtick_inner/greeting @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file diff --git a/src/ast/build_tests/backtick_string/mixed b/src/ast/build_tests/backtick_string/mixed new file mode 100644 index 0000000..4b847b0 --- /dev/null +++ b/src/ast/build_tests/backtick_string/mixed @@ -0,0 +1 @@ +`Hello, ${world}!` \ No newline at end of file diff --git a/src/ast/build_tests/boolean_literal/false b/src/ast/build_tests/boolean_literal/false new file mode 100644 index 0000000..02e4a84 --- /dev/null +++ b/src/ast/build_tests/boolean_literal/false @@ -0,0 +1 @@ +false \ No newline at end of file diff --git a/src/ast/build_tests/boolean_literal/true b/src/ast/build_tests/boolean_literal/true new file mode 100644 index 0000000..f32a580 --- /dev/null +++ b/src/ast/build_tests/boolean_literal/true @@ -0,0 +1 @@ +true \ No newline at end of file diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 067b266..eb28e17 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -53,4 +53,54 @@ pub mod build { use crate::ast::node::*; include!(concat!(env!("OUT_DIR"), "/src/ast/build.rs")); + + #[cfg(test)] + mod build_tests { + use super::*; + use crate::parser::DeimosParser; + use pest::Parser; + + fn parse(rule: Rule, input: &str) -> Pair { + let parse_result = DeimosParser::parse(rule, input); + parse_result.expect("parsing failed").next().unwrap() + } + + #[test] + fn boolean_literal_true() { + let pair = parse( + Rule::BooleanLiteral, + include_str!("build_tests/boolean_literal/true"), + ); + assert_eq!(true, build_boolean_literal(pair)); + } + + #[test] + fn boolean_literal_false() { + let pair = parse( + Rule::BooleanLiteral, + include_str!("build_tests/boolean_literal/false"), + ); + assert_eq!(false, build_boolean_literal(pair)); + } + + #[test] + fn backtick_inner_greeting() { + let pair = parse( + Rule::BacktickInner, + include_str!("build_tests/backtick_inner/greeting"), + ); + assert_eq!("Hello, World!", build_backtick_inner(pair)); + } + + #[test] + fn backtick_string_mixed() { + let pair = parse( + Rule::BacktickString, + include_str!("build_tests/backtick_string/mixed"), + ); + let backtick_string = build_backtick_string(pair); + assert_eq!(backtick_string.inners().count(), 2); + assert_eq!(backtick_string.expressions().count(), 1); + } + } } diff --git a/src/parser/ast.yaml b/src/parser/ast.yaml index 48554f0..b8ef053 100644 --- a/src/parser/ast.yaml +++ b/src/parser/ast.yaml @@ -628,6 +628,7 @@ ShiftExpression: optional: true - right: rule: Expression + optional: true ShiftOperator: leaf_rules: - LeftShift @@ -655,6 +656,7 @@ MultiplicativeExpression: optional: true - right: rule: Expression + optional: true MultiplicativeOperator: leaf_rules: - Multiply @@ -665,6 +667,8 @@ PrefixExpression: - operators: rule: PrefixOperator vec: true + - right: + rule: SuffixExpression PrefixOperator: leaf_rules: - Spread @@ -812,7 +816,7 @@ BacktickString: BacktickInner: produce: kind: string - from: string_inner + from: whole_pair BooleanLiteral: produce: kind: boolean