import Testing @testable import AudioProvider @Suite("Overdrive") struct OverdriveTests { @Test("Ohne Overdrive ist bei 100 % Schluss") func normalMaximumIsOne() { #expect(Gain.maximum(overdrive: false) == 1) var store = VolumeStore() store.set(3.5, for: "com.google.Chrome") #expect(store.volume(for: "com.google.Chrome") == 1) } @Test("Mit Overdrive geht der Regler bis 400 %") func overdriveMaximumIsFour() { #expect(Gain.maximum(overdrive: true) == 4) var store = VolumeStore() store.setOverdrive(true, for: "com.google.Chrome") store.set(3.4, for: "com.google.Chrome") #expect(store.volume(for: "com.google.Chrome") == 3.4) } @Test("Auch mit Overdrive ist bei 400 % Schluss") func overdriveStillHasACeiling() { var store = VolumeStore() store.setOverdrive(true, for: "app") store.set(99, for: "app") #expect(store.volume(for: "app") == 4) } @Test("Über 100 % bedeutet die Zahl den Faktor selbst") func aboveOneTheNumberIsTheFactor() { // Mit der Kennlinie wären aus 400 % das 10,4-Fache geworden. Eine // Beschriftung, die etwas anderes verspricht als der Regler tut, ist // schlimmer als eine grobe Kennlinie. #expect(Gain.factor(forVolume: 4) == 4) #expect(Gain.factor(forVolume: 2) == 2) } @Test("Bei genau 100 % passen beide Hälften zusammen") func curveIsContinuousAtOne() { #expect(abs(Gain.factor(forVolume: 1) - 1) < 0.0001) #expect(abs(Gain.factor(forVolume: 0.999) - 1) < 0.01) } @Test("Unterhalb von 100 % bleibt die Kennlinie") func belowOneTheTaperStays() { // Halber Reglerweg soll halb so laut klingen — rund −10 dB. #expect(abs(Gain.factor(forVolume: 0.5) - 0.316) < 0.01) } @Test("Abschalten holt die Lautstärke zurück") func turningOffPullsVolumeBack() { // Sonst bliebe ein Programm dreifach verstärkt, während sein Regler am // rechten Anschlag steht und 100 % anzeigt. var store = VolumeStore() store.setOverdrive(true, for: "app") store.set(3.0, for: "app") store.setOverdrive(false, for: "app") #expect(store.volume(for: "app") == 1) #expect(store.effectiveGain(for: "app") == 1) } @Test("Abschalten lässt eine leise Einstellung in Ruhe") func turningOffKeepsQuietSettings() { var store = VolumeStore() store.setOverdrive(true, for: "app") store.set(0.4, for: "app") store.setOverdrive(false, for: "app") #expect(store.volume(for: "app") == 0.4) } @Test("Der Overdrive übersteht einen Neustart") func overdriveSurvivesRestart() { var store = VolumeStore() store.setOverdrive(true, for: "app") store.set(2.5, for: "app") let restored = VolumeStore(volumes: store.snapshot, muted: store.mutedIdentifiers, overdrive: store.overdrivenIdentifiers) #expect(restored.isOverdriven("app")) #expect(restored.volume(for: "app") == 2.5) } @Test("Ein gespeicherter Wert ohne Overdrive wird zurückgeholt") func storedValueWithoutOverdriveIsClamped() { // Aus der Zeit, als der Regler noch ohne Freigabe bis 200 % ging. let restored = VolumeStore(volumes: ["app": 1.8], muted: [], overdrive: []) #expect(restored.volume(for: "app") == 1) } @Test("Stumm schlägt Overdrive") func muteWins() { var store = VolumeStore() store.setOverdrive(true, for: "app") store.set(4, for: "app") store.setMuted(true, for: "app") #expect(store.effectiveGain(for: "app") == 0) } }