1import { describe, expect, it } from "vite-plus/test";
2
3import { normalizeVoiceInputDecibels } from "./voiceInputMetering";
4
5describe("normalizeVoiceInputDecibels", () => {
6 it.each([undefined, Number.NaN, Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY])(
7 "treats a missing or invalid reading %s as silence",
8 (decibels) => {
9 expect(normalizeVoiceInputDecibels(decibels)).toBe(0);
10 },
11 );
12
13 it.each([-160, -90, -60])("keeps a reading at or below the noise floor %s silent", (decibels) => {
14 expect(normalizeVoiceInputDecibels(decibels)).toBe(0);
15 });
16
17 it("keeps quiet background readings close to the baseline", () => {
18 const quiet = normalizeVoiceInputDecibels(-50);
19 expect(quiet).toBeGreaterThan(0);
20 expect(quiet).toBeLessThan(0.05);
21 });
22
23 it("keeps loud negative speech readings distinct below full height", () => {
24 const levels = [-20, -18, -12, -6, -3].map(normalizeVoiceInputDecibels);
25
26 for (const level of levels) {
27 expect(level).toBeGreaterThan(0);
28 expect(level).toBeLessThan(1);
29 }
30 expect(levels.every((level, index) => index === 0 || level > levels[index - 1]!)).toBe(true);
31 });
32
33 it("makes near-speech changes visible without an early ceiling", () => {
34 expect(normalizeVoiceInputDecibels(-6) - normalizeVoiceInputDecibels(-12)).toBeGreaterThan(
35 0.18,
36 );
37 expect(normalizeVoiceInputDecibels(-3) - normalizeVoiceInputDecibels(-12)).toBeGreaterThan(0.3);
38 });
39
40 it("increases throughout the usable microphone range", () => {
41 const levels = [-60, -55, -50, -40, -30, -20, -12, -6, -3, -0.001, 0].map(
42 normalizeVoiceInputDecibels,
43 );
44 expect(levels.every((level, index) => index === 0 || level > levels[index - 1]!)).toBe(true);
45 });
46
47 it("approaches the noise floor and full scale without a jump", () => {
48 expect(normalizeVoiceInputDecibels(-59.999)).toBeLessThan(0.001);
49 expect(normalizeVoiceInputDecibels(-0.001)).toBeGreaterThan(0.999);
50 expect(normalizeVoiceInputDecibels(-0.001)).toBeLessThan(1);
51 });
52
53 it.each([0, 6, 160])("caps only full-scale or higher readings %s at one", (decibels) => {
54 expect(normalizeVoiceInputDecibels(decibels)).toBe(1);
55 });
56});