test(audio): regression tests for mic meter + gate drag
Extracts the peak-hold/throttle logic shared by the in-call capture thread and run_mic_monitor into MicLevelMeter, and adds unit coverage: - core: MicLevelMeter reports only after a full window, holds the window peak, resets between windows, and reports zero for silence. - app: GateMeter::x_to_threshold maps edges/midpoint correctly, clamps out-of-bounds drags, and stays finite for a zero-width (pre-layout) bar. 9 new tests, all green; clippy clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+33
-1
@@ -1150,11 +1150,43 @@ impl Program<AppMessage> for GateMeter {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{reconnect_attempt_chime, reconnected_chime};
|
||||
use super::{reconnect_attempt_chime, reconnected_chime, GateMeter, METER_MAX};
|
||||
use crate::notify::Sound;
|
||||
use iroh::EndpointId;
|
||||
use std::collections::HashSet;
|
||||
|
||||
const W: f32 = 200.0;
|
||||
|
||||
#[test]
|
||||
fn gate_drag_maps_left_edge_to_zero() {
|
||||
assert_eq!(GateMeter::x_to_threshold(0.0, W), 0.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gate_drag_maps_right_edge_to_full_scale() {
|
||||
assert!((GateMeter::x_to_threshold(W, W) - METER_MAX).abs() < 1e-6);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gate_drag_maps_midpoint_to_half_scale() {
|
||||
assert!((GateMeter::x_to_threshold(W / 2.0, W) - METER_MAX / 2.0).abs() < 1e-6);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gate_drag_clamps_out_of_bounds() {
|
||||
// Dragging past either edge clamps to the axis ends (no overshoot).
|
||||
assert_eq!(GateMeter::x_to_threshold(-50.0, W), 0.0);
|
||||
assert!((GateMeter::x_to_threshold(W + 80.0, W) - METER_MAX).abs() < 1e-6);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gate_drag_zero_width_is_finite() {
|
||||
// A degenerate bound (pre-layout) must not divide by zero / produce NaN.
|
||||
let t = GateMeter::x_to_threshold(10.0, 0.0);
|
||||
assert!(t.is_finite());
|
||||
assert!((0.0..=METER_MAX).contains(&t));
|
||||
}
|
||||
|
||||
/// A distinct, real `EndpointId` (via the same path the network tests use).
|
||||
fn id() -> EndpointId {
|
||||
iroh::EndpointAddr::from(iroh::SecretKey::generate().public()).id
|
||||
|
||||
Reference in New Issue
Block a user