use crate::lighting::effects::{ChasePattern, EffectType};
use crate::lighting::parser::*;
#[test]
fn test_parse_chase_random_pattern() {
let content = r#"tempo {
start: 1.5s
bpm: 160
time_signature: 4/4
changes: [
@68/1 {
bpm: 180
}
]
}
show "Test" {
@70/1
all_wash: chase, speed: 1beats, pattern: random, hold_time: 4measures
}
"#;
let result = parse_light_shows(content);
assert!(result.is_ok(), "Failed to parse show: {:?}", result.err());
let shows = result.unwrap();
let show = shows.get("Test").unwrap();
assert_eq!(show.cues.len(), 1);
let cue = &show.cues[0];
assert_eq!(cue.effects.len(), 1);
let effect = &cue.effects[0];
match &effect.effect_type {
EffectType::Chase {
pattern,
speed: _,
direction: _,
transition: _,
..
} => {
println!("Parsed pattern: {:?}", pattern);
println!("Pattern debug: pattern={:?}", pattern);
match pattern {
ChasePattern::Random => {
println!("✓ Pattern is correctly set to Random");
}
ChasePattern::Linear => {
println!("✗ Pattern is Linear, but should be Random!");
panic!("Pattern was parsed as Linear instead of Random");
}
ChasePattern::Snake => {
println!("✗ Pattern is Snake, but should be Random!");
panic!("Pattern was parsed as Snake instead of Random");
}
}
}
other => {
println!("Effect type: {:?}", other);
panic!("Effect is not a Chase effect! Got: {:?}", other);
}
}
}
#[test]
fn test_chase_direction_as_last_parameter() {
let content = r#"show "Test" {
@0.000
test_fixture: chase, transition: fade, layer: foreground, blend_mode: multiply, direction: right_to_left, duration: 10s
}
"#;
let result = parse_light_shows(content);
assert!(
result.is_ok(),
"Failed to parse show with direction as last parameter: {:?}",
result.err()
);
let shows = result.unwrap();
let show = shows.get("Test").unwrap();
assert_eq!(show.cues.len(), 1);
let cue = &show.cues[0];
assert_eq!(cue.effects.len(), 1);
let effect = &cue.effects[0];
match &effect.effect_type {
EffectType::Chase { direction, .. } => {
use crate::lighting::effects::ChaseDirection;
match direction {
ChaseDirection::RightToLeft => {
}
_ => panic!("Direction should be RightToLeft, got {:?}", direction),
}
}
_ => panic!("Expected Chase effect"),
}
}
#[test]
fn test_bare_identifier_as_last_parameter() {
let content = r#"show "Test" {
@0.000
test_fixture: static, dimmer: 50%, custom_param: my_custom_value, duration: 5s
}
"#;
let result = parse_light_shows(content);
assert!(
result.is_ok(),
"Failed to parse show with bare_identifier as last parameter: {:?}",
result.err()
);
let shows = result.unwrap();
let show = shows.get("Test").unwrap();
assert_eq!(show.cues.len(), 1);
let cue = &show.cues[0];
assert_eq!(cue.effects.len(), 1);
let effect = &cue.effects[0];
match &effect.effect_type {
EffectType::Static { parameters, .. } => {
assert!(
parameters.contains_key("custom_param") || parameters.contains_key("dimmer"),
"Effect should have been parsed with parameters"
);
}
_ => panic!("Expected Static effect"),
}
}