use serde::{Deserialize, Serialize};
use super::UnivariateEnergy;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Boxcar {
pub epsilon: f64,
pub left: f64,
pub right: f64,
}
impl UnivariateEnergy for Boxcar {
#[inline]
fn energy(&self, r: f64) -> f64 {
match r {
x if x < self.left => 0.0,
x if x < self.right => self.epsilon,
_ => 0.0,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::*;
#[rstest]
fn general_case(
#[values(1.0, -2.0, 12.125, 0.25)] epsilon: f64,
#[values(1.0, 2.0, 0.5)] left: f64,
#[values(0.5, 0.125)] w: f64,
) {
let right = left + w;
let boxcar = Boxcar {
epsilon,
left,
right,
};
assert_eq!(boxcar.epsilon, epsilon);
assert_eq!(boxcar.left, left);
assert_eq!(boxcar.right, right);
assert_eq!(boxcar.energy(0.0), 0.0);
assert_eq!(boxcar.energy(left.next_down()), 0.0);
assert_eq!(boxcar.energy(left), epsilon);
assert_eq!(boxcar.energy(left.next_up()), epsilon);
assert_eq!(boxcar.energy(left + w / 2.0), epsilon);
assert_eq!(boxcar.energy(right.next_down()), epsilon);
assert_eq!(boxcar.energy(right), 0.0);
assert_eq!(boxcar.energy(right * 10.0), 0.0);
}
}