diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 10fa46e..9641dbb 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -17,6 +17,8 @@ use logos::{Logos, Source}; use crate::tokens::Token; pub mod ast; +#[cfg(test)] +mod tests; use self::ast::{Expr, File}; type Span = SimpleSpan; @@ -89,153 +91,3 @@ fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src decls: IndexMap::from_iter(decls), })) } - -#[cfg(test)] -mod tests { - use crate::parser::ast::{Expr, File}; - use crate::parser::parse; - use crate::tokens::Token; - use chumsky::input::Stream; - use chumsky::prelude::*; - use indexmap::IndexMap; - use logos::Logos; - - #[test] - fn test_parse_node_with_params() { - const INPUT: &str = "meow [ hello: $foo, world: @bar]"; - assert_eq!( - parse(INPUT).unwrap(), - File { - decls: IndexMap::from_iter([( - ("main", (0..0).into()), - ( - Expr::Node( - ("meow", (0..4).into()), - Some(( - IndexMap::from_iter([ - ( - ("hello", (7..12).into()), - Expr::Var(("foo", (14..18).into())) - ), - ( - ("world", (20..25).into()), - Expr::InputVar(("bar", (27..31).into())) - ) - ]), - (5..32).into() - )) - ), - (0..32).into() - ) - )]) - } - ); - } - - fn test_parse_multiple_top_level_complex() { - const INPUT: &str = r#"def main = meow - | uwu - [ foo: @bar - , hello: world @| test [ more: params ] | yay - ] - !| awa - @| nya - | rawr; - -def test = meow - [ hello: $foo - , world: @bar - ]; -"#; - assert_eq!( - parse(INPUT).unwrap(), - File { - decls: IndexMap::from_iter([ - ( - ("main", (4..8).into()), - ( - Expr::SimplePipe( - Box::new(Expr::Node(("meow", (11..15).into()), None)), - Box::new(Expr::NullPipe( - Box::new(Expr::Node( - ("uwu", (20..23).into()), - Some(( - IndexMap::from_iter([ - ( - ("foo", (29..32).into()), - Expr::InputVar(("bar", (34..38).into())) - ), - ( - ("hello", (44..49).into()), - Expr::MappingPipe( - Box::new(Expr::Node( - ("world", (51..56).into()), - None - )), - Box::new(Expr::SimplePipe( - Box::new(Expr::Node( - ("test", (60..64).into()), - Some(( - IndexMap::from_iter([( - ("more", (67..71).into()), - Expr::Node( - ( - "params", - (73..79).into() - ), - None - ) - )]), - (65..81).into() - )) - )), - Box::new(Expr::Node( - ("yay", (84..87).into()), - None - )) - )) - ) - ) - ]), - (27..92).into() - )) - )), - Box::new(Expr::MappingPipe( - Box::new(Expr::Node(("awa", (97..100).into()), None)), - Box::new(Expr::SimplePipe( - Box::new(Expr::Node(("nya", (106..109).into()), None)), - Box::new(Expr::Node(("rawr", (114..118).into()), None)) - )) - )) - )) - ), - (11..118).into() - ), - ), - ( - ("test", (125..129).into()), - ( - Expr::Node( - ("meow", (132..136).into()), - Some(( - IndexMap::from_iter([ - ( - ("hello", (141..146).into()), - Expr::Var(("foo", (148..152).into())) - ), - ( - ("world", (156..161).into()), - Expr::InputVar(("bar", (163..167).into())) - ) - ]), - (139..171).into() - )) - ), - (132..171).into() - ) - ) - ]) - } - ); - } -} diff --git a/crates/lang/src/parser/tests.rs b/crates/lang/src/parser/tests.rs new file mode 100644 index 0000000..308b09b --- /dev/null +++ b/crates/lang/src/parser/tests.rs @@ -0,0 +1,143 @@ +use crate::parser::ast::{Expr, File}; +use crate::parser::parse; +use crate::tokens::Token; +use chumsky::input::Stream; +use chumsky::prelude::*; +use indexmap::IndexMap; +use logos::Logos; + +#[test] +fn test_parse_node_with_params() { + const INPUT: &str = "meow [ hello: $foo, world: @bar]"; + assert_eq!( + parse(INPUT).unwrap(), + File { + decls: IndexMap::from_iter([( + ("main", (0..0).into()), + ( + Expr::Node( + ("meow", (0..4).into()), + Some(( + IndexMap::from_iter([ + ( + ("hello", (7..12).into()), + Expr::Var(("foo", (14..18).into())) + ), + ( + ("world", (20..25).into()), + Expr::InputVar(("bar", (27..31).into())) + ) + ]), + (5..32).into() + )) + ), + (0..32).into() + ) + )]) + } + ); +} + +fn test_parse_multiple_top_level_complex() { + const INPUT: &str = r#"def main = meow + | uwu + [ foo: @bar + , hello: world @| test [ more: params ] | yay + ] + !| awa + @| nya + | rawr; + +def test = meow + [ hello: $foo + , world: @bar + ]; +"#; + assert_eq!( + parse(INPUT).unwrap(), + File { + decls: IndexMap::from_iter([ + ( + ("main", (4..8).into()), + ( + Expr::SimplePipe( + Box::new(Expr::Node(("meow", (11..15).into()), None)), + Box::new(Expr::NullPipe( + Box::new(Expr::Node( + ("uwu", (20..23).into()), + Some(( + IndexMap::from_iter([ + ( + ("foo", (29..32).into()), + Expr::InputVar(("bar", (34..38).into())) + ), + ( + ("hello", (44..49).into()), + Expr::MappingPipe( + Box::new(Expr::Node( + ("world", (51..56).into()), + None + )), + Box::new(Expr::SimplePipe( + Box::new(Expr::Node( + ("test", (60..64).into()), + Some(( + IndexMap::from_iter([( + ("more", (67..71).into()), + Expr::Node( + ("params", (73..79).into()), + None + ) + )]), + (65..81).into() + )) + )), + Box::new(Expr::Node( + ("yay", (84..87).into()), + None + )) + )) + ) + ) + ]), + (27..92).into() + )) + )), + Box::new(Expr::MappingPipe( + Box::new(Expr::Node(("awa", (97..100).into()), None)), + Box::new(Expr::SimplePipe( + Box::new(Expr::Node(("nya", (106..109).into()), None)), + Box::new(Expr::Node(("rawr", (114..118).into()), None)) + )) + )) + )) + ), + (11..118).into() + ), + ), + ( + ("test", (125..129).into()), + ( + Expr::Node( + ("meow", (132..136).into()), + Some(( + IndexMap::from_iter([ + ( + ("hello", (141..146).into()), + Expr::Var(("foo", (148..152).into())) + ), + ( + ("world", (156..161).into()), + Expr::InputVar(("bar", (163..167).into())) + ) + ]), + (139..171).into() + )) + ), + (132..171).into() + ) + ) + ]) + } + ); +}