use super::common::*;
#[cfg(test)]
use crate::lighting::effects::*;
use crate::lighting::engine::EffectEngine;
use std::collections::HashMap;
use std::time::Duration;
#[test]
fn test_effect_layering_with_strobe() {
let mut engine = EffectEngine::new();
let fixture = create_test_fixture("test_fixture", 1, 1);
engine.register_fixture(fixture.clone());
let mut blue_params = HashMap::new();
blue_params.insert("red".to_string(), 0.0);
blue_params.insert("green".to_string(), 0.0);
blue_params.insert("blue".to_string(), 1.0);
let blue_effect = create_effect_with_layering(
"static_blue".to_string(),
EffectType::Static {
parameters: blue_params,
duration: Duration::from_secs(10),
},
vec!["test_fixture".to_string()],
EffectLayer::Background,
BlendMode::Replace,
);
let strobe_effect = create_effect_with_layering(
"strobe".to_string(),
EffectType::Strobe {
frequency: TempoAwareFrequency::Fixed(1.0), duration: Duration::from_secs(10),
},
vec!["test_fixture".to_string()],
EffectLayer::Foreground,
BlendMode::Overlay,
);
engine.start_effect(blue_effect).unwrap();
engine.start_effect(strobe_effect).unwrap();
let commands = engine.update(Duration::from_millis(16), None).unwrap();
assert_eq!(commands.len(), 4);
let commands = engine.update(Duration::from_millis(250), None).unwrap(); let strobe_cmd = commands.iter().find(|cmd| cmd.channel == 4).unwrap();
assert_eq!(strobe_cmd.value, 12);
let commands = engine.update(Duration::from_millis(500), None).unwrap(); let strobe_cmd = commands.iter().find(|cmd| cmd.channel == 4).unwrap();
assert_eq!(strobe_cmd.value, 12); }
#[test]
fn test_strobe_effect_crossfade() {
let mut engine = EffectEngine::new();
let mut channels = HashMap::new();
channels.insert("strobe".to_string(), 1);
let fixture = FixtureInfo::new(
"test_fixture".to_string(),
1,
1,
"Strobe".to_string(),
channels,
Some(20.0),
);
engine.register_fixture(fixture);
let mut strobe_effect = create_effect_with_timing(
"strobe_test".to_string(),
EffectType::Strobe {
frequency: TempoAwareFrequency::Fixed(16.0), duration: Duration::from_secs(5),
},
vec!["test_fixture".to_string()],
EffectLayer::Foreground,
BlendMode::Overlay,
Some(Duration::from_secs(1)), Some(Duration::from_secs(1)), );
strobe_effect.hold_time = Some(Duration::from_secs(3));
engine.start_effect(strobe_effect).unwrap();
let commands = engine.update(Duration::from_millis(500), None).unwrap();
let strobe_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert!(strobe_cmd.value > 0 && strobe_cmd.value < 255);
let commands = engine.update(Duration::from_secs(2), None).unwrap();
let strobe_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert!(strobe_cmd.value > 200);
let commands = engine.update(Duration::from_millis(2000), None).unwrap(); let strobe_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert!(strobe_cmd.value > 0 && strobe_cmd.value < 255);
let commands = engine.update(Duration::from_millis(500), None).unwrap(); assert!(commands.is_empty()); }