crate::ix!();
#[cfg(test)]
mod coeffmaker_tests {
#[test]
fn test_make_coeffs_fixed() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(tuner.clone(), tables.clone(), srunit.clone());
let fixed_coeffs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9];
let fixed_generator = Box::new(FixedCoeffGenerator { coeffs: fixed_coeffs });
maker.make_coeffs(432.0, 1.0, fixed_generator);
let expected_tcoeff = fixed_coeffs;
let expected_dcoeff = [0.0; N_COEFFMAKER_COEFFS];
assert_eq!(maker.tcoeff, expected_tcoeff);
assert_eq!(maker.dcoeff, expected_dcoeff);
}
#[test]
fn test_make_coeffs_out_of_range() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(tuner.clone(), tables.clone(), srunit.clone());
let out_of_range_generator = Box::new(OutOfRangeCoeffGenerator);
let result = maker.make_coeffs(432.0, 1.0, out_of_range_generator);
assert!(result.is_err());
}
#[test]
fn test_reset() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(tuner.clone(), tables.clone(), srunit.clone());
maker.tcoeff = [0.1; N_COEFFMAKER_COEFFS];
maker.dcoeff = [0.2; N_COEFFMAKER_COEFFS];
maker.first_run = false;
maker.reset();
assert_eq!(maker.tcoeff, [0.0; N_COEFFMAKER_COEFFS]);
assert_eq!(maker.dcoeff, [0.0; N_COEFFMAKER_COEFFS]);
assert_eq!(maker.first_run, true);
}
#[test]
fn test_make_coeffs() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(tuner, tables, srunit);
maker.make_coeffs(100.0, 1.0, Box::new(Gen1 {}));
assert!(maker.coeff[0] > 0.0);
assert!(maker.coeff[1] > 0.0);
assert!(maker.coeff[2] > 0.0);
maker.make_coeffs(1000.0, 0.5, Box::new(Gen2 {}));
assert!(maker.coeff[0] > 0.0);
assert!(maker.coeff[1] > 0.0);
assert!(maker.coeff[2] > 0.0);
}
#[test]
fn test_reset() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(tuner, tables, srunit);
maker.coeff.fill(1.0);
maker.dcoeff.fill(1.0);
maker.tcoeff.fill(1.0);
maker.first_run = false;
maker.reset();
assert!(maker.coeff.iter().all(|&c| c == 0.0));
assert!(maker.dcoeff.iter().all(|&c| c == 0.0));
assert!(maker.tcoeff.iter().all(|&c| c == 0.0));
assert_eq!(maker.first_run, true);
}
#[test]
fn test_from_direct() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(tuner, tables, srunit);
let coeffs = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
maker.from_direct(coeffs);
for i in 0..N_COEFFMAKER_COEFFS {
assert_eq!(maker.tcoeff[i], coeffs[i]);
assert_eq!(maker.coeff[i], coeffs[i]);
assert_eq!(maker.dcoeff[i], 0.0);
}
}
#[test]
fn make_coeffs() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(
tuner.clone(),
tables.clone(),
srunit.clone()
);
maker.make_coeffs(1000.0, 0.5, Box::new(Gen1 {}));
assert_eq!(maker.coeff, [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]);
maker.make_coeffs(1000.0, 0.5, Box::new(Gen2 {}));
assert_eq!(maker.coeff, [0.9641483, -1.8999989, 0.940621, 0.0, 0.0, 0.0, 0.0, 0.0]);
}
#[test]
fn from_direct() {
let srunit = SampleRateHandle::default();
let tuner = TunerHandle::new(&srunit);
let tables = TablesHandle::new(&srunit);
let mut maker = FilterCoefficientMaker::new(
tuner.clone(),
tables.clone(),
srunit.clone()
);
let coeffs = [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
maker.from_direct(coeffs);
assert_eq!(maker.tcoeff, coeffs);
assert_eq!(maker.coeff, coeffs);
assert_eq!(maker.dcoeff, [0.0; 8]);
let coeffs = [0.5, 0.0, 0.0, 0.0, 0.2, 0.0, 0.0, 0.1];
maker.from_direct(coeffs);
assert_eq!(maker.tcoeff, [0.7, 0.0, 0.0, 0.0, 0.26, 0.0, 0.0, 0.14]);
assert_eq!(maker.coeff, [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]);
assert_eq!(maker.dcoeff, [
-0.019986667, 0.0, 0.0, 0.0, -0.00028333337, 0.0, 0.0, -0.0013333333
]);
}
}