From fb39301b31e9d1953f2f733ea4b2042d34c25e44 Mon Sep 17 00:00:00 2001 From: Breval Ferrari Date: Wed, 21 May 2025 18:15:48 +0200 Subject: [PATCH] tuplet parser --- src/parser.rs | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index d34b6e7..76ba714 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -259,7 +259,7 @@ mod tests { use crate::{ compiler::{ - Loop, LoopCount, Marker, Note, Silence, Slope, Token, TokenVec, VariableChange, + Loop, LoopCount, Marker, Note, Silence, Slope, Token, TokenVec, Tuplet, VariableChange, }, parser::expression_parser, }; @@ -483,4 +483,52 @@ mod tests { ); } } + + #[test] + fn tuplet() { + let slopes = Default::default(); + fn parser_builder<'s>( + slopes: &'s HashMap, + ) -> impl Fn(&str) -> IResult<&str, Tuplet<'s>> { + move |input: &str| { + Tuplet::parser( + &ParserBuilder::create_empty() + .notes(&["do", "ré", "mi"]) + .slopes(slopes) + .variables(&['n']) + .build() + .unwrap(), + ) + .parse(input) + } + } + let parser = parser_builder(&slopes); + let mut working_cases = vec![ + ( + "[.%]", + ( + "", + Tuplet(TokenVec(vec![Box::new(Silence), Box::new(Marker)])), + ), + ), + ("[]", ("", Tuplet(TokenVec(vec![])))), + ("[do]f", ("f", Tuplet(TokenVec(vec![Box::new(Note(0))])))), + ]; + let mut not_working_cases = vec!["", "[", "]", "[2", "[p]"]; + for (test, expected) in working_cases.drain(..) { + let output = parser(test); + if let Ok(result) = output { + assert_eq!(expected, result, "case \"{test}\""); + } else { + panic!("result of \"{test}\" was not Ok: {output:?}"); + } + } + for test in not_working_cases.drain(..) { + let output = parser(test); + assert!( + output.is_err(), + "result of \"{test}\" was not Err: {output:?}" + ); + } + } }