using Xunit; using ytLive.Helpers; namespace ytLive.Tests; /// A segment ladder is only useful if the band it paints is the level it measured. The /// thresholds are DESIGN.md's (nominal / caution / peak), and peak-hold is what makes clipping /// visible — a bar that follows the moment hides the one audio fault that cannot be fixed later. /// public class MeterScaleTests { [Fact] public void Bands_peak_hold_and_the_display_scale_follow_the_standard() { // Bands at the documented thresholds. Assert.Equal(MeterBand.Nominal, MeterScale.BandFor(-30f)); Assert.Equal(MeterBand.Nominal, MeterScale.BandFor(-12.1f)); Assert.Equal(MeterBand.Caution, MeterScale.BandFor(-12f)); Assert.Equal(MeterBand.Caution, MeterScale.BandFor(-6f)); Assert.Equal(MeterBand.Peak, MeterScale.BandFor(-3f)); Assert.Equal(MeterBand.Peak, MeterScale.BandFor(0f)); // Display fraction: −60 dBFS is empty, 0 dBFS is full, −30 is halfway, and nothing escapes. Assert.Equal(0f, MeterScale.ToFraction(-60f)); Assert.Equal(1f, MeterScale.ToFraction(0f)); Assert.Equal(0.5f, MeterScale.ToFraction(-30f), 4); Assert.Equal(1f, MeterScale.ToFraction(+12f)); Assert.Equal(0f, MeterScale.ToFraction(-120f)); // Peak hold rises instantly, then decays at the stated rate. Assert.Equal(0.8f, MeterScale.NextPeak(0.2f, 0.8f, 0.05f)); Assert.Equal(0.7f, MeterScale.NextPeak(0.8f, 0.1f, 0.1f / 0.35f), 3); // 0.1 fall at 0.35/s Assert.Equal(0f, MeterScale.NextPeak(0.1f, 0f, 10f)); // never negative } }