import XCTest
import PhysarumEngine
@testable import Physarum
final class AudioPresetAppStateTests: XCTestCase {
private func state() -> AppState {
let tmp = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("phys-aps-\(UUID().uuidString)", isDirectory: true)
return AppState(store: PresetStore(baseDir: tmp), audioStore: AudioPresetStore(baseDir: tmp.appendingPathComponent("audio")))
}
func testSaveThenApply() {
let s = state()
s.audioReactive = AudioReactive(enabled: true, gain: 2, autoGain: false, routes: [])
s.saveAudioPreset(name: "Loud")
s.audioReactive = AudioReactive(enabled: false, gain: 1, autoGain: true, routes: [])
let id = s.audioPresets.first!.id
s.applyAudioPreset(id: id)
XCTAssertEqual(s.audioReactive.gain, 2)
XCTAssertTrue(s.audioReactive.enabled)
}
func testSaveAddsToPresets() {
let s = state()
XCTAssertTrue(s.audioPresets.isEmpty)
s.saveAudioPreset(name: "Club")
XCTAssertEqual(s.audioPresets.count, 1)
XCTAssertEqual(s.audioPresets.first?.name, "Club")
}
func testEmptyNameFallsBack() {
let s = state()
s.saveAudioPreset(name: "")
XCTAssertEqual(s.audioPresets.first?.name, "Audio")
}
func testDeleteRemovesPreset() {
let s = state()
s.saveAudioPreset(name: "One")
s.saveAudioPreset(name: "Two")
let id = s.audioPresets.first!.id
s.deleteAudioPreset(id: id)
XCTAssertEqual(s.audioPresets.count, 1)
XCTAssertFalse(s.audioPresets.contains { $0.id == id })
}
func testReorderMovesPreset() {
let s = state()
s.saveAudioPreset(name: "One")
s.saveAudioPreset(name: "Two")
let order = s.audioPresets.map { $0.id }
let second = order[1]
s.reorderAudioPreset(id: second, up: true)
XCTAssertEqual(s.audioPresets.map { $0.id }, [second, order[0]])
}
func testApplyUnknownIDIsNoOp() {
let s = state()
s.audioReactive = AudioReactive(enabled: true, gain: 3, autoGain: false, routes: [])
s.applyAudioPreset(id: "does-not-exist")
XCTAssertEqual(s.audioReactive.gain, 3)
XCTAssertTrue(s.audioReactive.enabled)
}
func testPresetsPersistAcrossInstances() {
let tmp = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("phys-aps-\(UUID().uuidString)", isDirectory: true)
let s1 = AppState(store: PresetStore(baseDir: tmp), audioStore: AudioPresetStore(baseDir: tmp.appendingPathComponent("audio")))
s1.audioReactive = AudioReactive(enabled: true, gain: 4, autoGain: false, routes: [])
s1.saveAudioPreset(name: "Persisted")
let s2 = AppState(store: PresetStore(baseDir: tmp), audioStore: AudioPresetStore(baseDir: tmp.appendingPathComponent("audio")))
XCTAssertEqual(s2.audioPresets.count, 1)
XCTAssertEqual(s2.audioPresets.first?.reactive.gain, 4)
}
}