tuplet parser

This commit is contained in:
Breval Ferrari 2025-05-21 18:15:48 +02:00
parent 28bd727090
commit fb39301b31

View file

@ -259,7 +259,7 @@ mod tests {
use crate::{ use crate::{
compiler::{ compiler::{
Loop, LoopCount, Marker, Note, Silence, Slope, Token, TokenVec, VariableChange, Loop, LoopCount, Marker, Note, Silence, Slope, Token, TokenVec, Tuplet, VariableChange,
}, },
parser::expression_parser, parser::expression_parser,
}; };
@ -483,4 +483,52 @@ mod tests {
); );
} }
} }
#[test]
fn tuplet() {
let slopes = Default::default();
fn parser_builder<'s>(
slopes: &'s HashMap<String, VariableChange>,
) -> impl Fn(&str) -> IResult<&str, Tuplet<'s>> {
move |input: &str| {
Tuplet::parser(
&ParserBuilder::create_empty()
.notes(&["do", "", "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:?}"
);
}
}
} }