use crate::lighting::effects::*;
use crate::lighting::engine::tests::common::create_test_fixture;
use crate::lighting::engine::EffectEngine;
use std::time::{Duration, Instant};
#[test]
fn test_dimmer_effect() {
let mut engine = EffectEngine::new();
let fixture = create_test_fixture("test_fixture", 1, 1);
engine.register_fixture(fixture);
let effect = EffectInstance::new(
"test_effect".to_string(),
EffectType::Dimmer {
start_level: 0.0,
end_level: 1.0,
duration: Duration::from_secs(1),
curve: DimmerCurve::Linear,
},
vec!["test_fixture".to_string()],
None,
None,
None,
)
.with_timing(Some(Instant::now()), Some(Duration::from_secs(1)));
engine.start_effect(effect).unwrap();
let commands = engine.update(Duration::from_millis(500), None).unwrap();
assert_eq!(commands.len(), 1);
let dimmer_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert_eq!(dimmer_cmd.value, 127);
}
#[test]
fn test_dimmer_effect_dim_down() {
let mut engine = EffectEngine::new();
let fixture = create_test_fixture("test_fixture", 1, 1);
engine.register_fixture(fixture);
let effect = EffectInstance::new(
"test_effect".to_string(),
EffectType::Dimmer {
start_level: 1.0,
end_level: 0.0,
duration: Duration::from_secs(1),
curve: DimmerCurve::Linear,
},
vec!["test_fixture".to_string()],
None,
None,
None,
)
.with_timing(Some(Instant::now()), Some(Duration::from_secs(1)));
engine.start_effect(effect).unwrap();
let commands = engine.update(Duration::from_millis(0), None).unwrap();
assert_eq!(commands.len(), 1);
let dimmer_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert_eq!(dimmer_cmd.value, 255, "At start, dimmer should be at 100%");
let commands = engine.update(Duration::from_millis(500), None).unwrap();
assert_eq!(commands.len(), 1);
let dimmer_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert_eq!(
dimmer_cmd.value, 127,
"At midpoint, dimmer should be at 50%"
);
let commands = engine.update(Duration::from_millis(500), None).unwrap();
assert_eq!(commands.len(), 0, "No commands after dimmer completes");
}
#[test]
fn test_dimmer_effect_dim_down_partial() {
let mut engine = EffectEngine::new();
let fixture = create_test_fixture("test_fixture", 1, 1);
engine.register_fixture(fixture);
let effect = EffectInstance::new(
"test_effect".to_string(),
EffectType::Dimmer {
start_level: 0.8,
end_level: 0.3,
duration: Duration::from_secs(1),
curve: DimmerCurve::Linear,
},
vec!["test_fixture".to_string()],
None,
None,
None,
)
.with_timing(Some(Instant::now()), Some(Duration::from_secs(1)));
engine.start_effect(effect).unwrap();
let commands = engine.update(Duration::from_millis(0), None).unwrap();
assert_eq!(commands.len(), 1);
let dimmer_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert_eq!(
dimmer_cmd.value, 204,
"At start, dimmer should be at 80% (204)"
);
let commands = engine.update(Duration::from_millis(500), None).unwrap();
assert_eq!(commands.len(), 1);
let dimmer_cmd = commands.iter().find(|cmd| cmd.channel == 1).unwrap();
assert!(
(140..=141).contains(&dimmer_cmd.value),
"At midpoint, dimmer should be at ~55% (140-141), got {}",
dimmer_cmd.value
);
let commands = engine.update(Duration::from_millis(500), None).unwrap();
assert_eq!(commands.len(), 0, "No commands after dimmer completes");
}