#[derive(Debug, Clone)]
pub struct PlateauPotential {
duration_ms: f32,
time_remaining: f32,
amplitude: f32,
active: bool,
}
impl PlateauPotential {
pub fn new(duration_ms: f32) -> Self {
Self {
duration_ms,
time_remaining: 0.0,
amplitude: 0.0,
active: false,
}
}
pub fn trigger(&mut self) {
self.active = true;
self.time_remaining = self.duration_ms;
self.amplitude = 1.0;
}
pub fn update(&mut self, dt: f32) {
if !self.active {
return;
}
self.time_remaining -= dt;
if self.time_remaining <= 0.0 {
self.active = false;
self.amplitude = 0.0;
self.time_remaining = 0.0;
} else {
self.amplitude = 1.0;
}
}
pub fn is_active(&self) -> bool {
self.active
}
pub fn amplitude(&self) -> f32 {
self.amplitude
}
pub fn time_remaining(&self) -> f32 {
self.time_remaining
}
pub fn reset(&mut self) {
self.active = false;
self.amplitude = 0.0;
self.time_remaining = 0.0;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_plateau_creation() {
let plateau = PlateauPotential::new(200.0);
assert!(!plateau.is_active());
assert_eq!(plateau.amplitude(), 0.0);
}
#[test]
fn test_plateau_trigger() {
let mut plateau = PlateauPotential::new(200.0);
plateau.trigger();
assert!(plateau.is_active());
assert_eq!(plateau.amplitude(), 1.0);
assert_eq!(plateau.time_remaining(), 200.0);
}
#[test]
fn test_plateau_duration() {
let mut plateau = PlateauPotential::new(100.0);
plateau.trigger();
plateau.update(50.0);
assert!(plateau.is_active());
assert_eq!(plateau.time_remaining(), 50.0);
plateau.update(60.0);
assert!(!plateau.is_active());
assert_eq!(plateau.amplitude(), 0.0);
}
#[test]
fn test_plateau_maintains_amplitude() {
let mut plateau = PlateauPotential::new(200.0);
plateau.trigger();
for _ in 0..10 {
plateau.update(10.0);
if plateau.is_active() {
assert_eq!(plateau.amplitude(), 1.0);
}
}
}
#[test]
fn test_plateau_reset() {
let mut plateau = PlateauPotential::new(200.0);
plateau.trigger();
plateau.update(50.0);
plateau.reset();
assert!(!plateau.is_active());
assert_eq!(plateau.amplitude(), 0.0);
assert_eq!(plateau.time_remaining(), 0.0);
}
#[test]
fn test_update_inactive_plateau() {
let mut plateau = PlateauPotential::new(200.0);
plateau.update(10.0);
assert!(!plateau.is_active());
assert_eq!(plateau.amplitude(), 0.0);
}
}