use std::f32::consts::TAU;
use super::NaiveOsc;
use crate::{Oscillator, Waveform};
const EPSILON: f32 = 1e-6;
fn approx_eq(a: f32, b: f32) -> bool {
(a - b).abs() < EPSILON
}
#[test]
fn test_sine_at_known_phases() {
let mut osc = NaiveOsc::new(4.0, 1.0, Waveform::Sine);
assert!(approx_eq(osc.next_sample(), 1.0)); assert!(approx_eq(osc.next_sample(), 0.0)); assert!(approx_eq(osc.next_sample(), -1.0)); assert!(approx_eq(osc.next_sample(), 0.0)); }
#[test]
fn test_saw_ramps_up() {
let mut osc = NaiveOsc::new(4.0, 1.0, Waveform::Saw);
assert!(approx_eq(osc.next_sample(), -0.5)); assert!(approx_eq(osc.next_sample(), 0.0)); assert!(approx_eq(osc.next_sample(), 0.5)); assert!(approx_eq(osc.next_sample(), -1.0)); }
#[test]
fn test_square_alternates() {
let mut osc = NaiveOsc::new(4.0, 1.0, Waveform::Square);
assert!(approx_eq(osc.next_sample(), 1.0)); assert!(approx_eq(osc.next_sample(), -1.0)); assert!(approx_eq(osc.next_sample(), -1.0)); assert!(approx_eq(osc.next_sample(), 1.0)); }
#[test]
fn test_triangle_peaks_at_midpoint() {
let mut osc = NaiveOsc::new(4.0, 1.0, Waveform::Triangle);
assert!(approx_eq(osc.next_sample(), 0.0)); assert!(approx_eq(osc.next_sample(), 1.0)); assert!(approx_eq(osc.next_sample(), 0.0)); assert!(approx_eq(osc.next_sample(), -1.0)); }
#[test]
fn test_set_frequency_changes_increment() {
let mut osc = NaiveOsc::new(100.0, 10.0, Waveform::Sine);
osc.next_sample();
osc.set_frequency(20.0); osc.next_sample(); osc.next_sample();
assert!(approx_eq(osc.next_sample(), (0.7 * TAU).sin()));
}
#[test]
fn test_set_phase() {
let mut osc = NaiveOsc::new(4.0, 1.0, Waveform::Sine);
osc.set_phase(0.25);
assert!(approx_eq(osc.next_sample(), 0.0)); }
#[test]
fn test_reset_zeros_phase() {
let mut osc = NaiveOsc::new(4.0, 1.0, Waveform::Sine);
osc.next_sample();
osc.next_sample();
osc.reset();
assert!(approx_eq(osc.next_sample(), 1.0));
}
#[test]
fn test_fill_buffer() {
let mut osc = NaiveOsc::new(4.0, 1.0, Waveform::Sine);
let mut buffer = [0.0f32; 4];
osc.fill(&mut buffer);
assert!(approx_eq(buffer[0], 1.0));
assert!(approx_eq(buffer[1], 0.0));
assert!(approx_eq(buffer[2], -1.0));
assert!(approx_eq(buffer[3], 0.0));
}
#[test]
fn test_iterator() {
let osc = NaiveOsc::new(4.0, 1.0, Waveform::Sine);
let samples: Vec<f32> = osc.take(4).collect();
assert!(approx_eq(samples[0], 1.0));
assert!(approx_eq(samples[1], 0.0));
assert!(approx_eq(samples[2], -1.0));
assert!(approx_eq(samples[3], 0.0));
}