Zum Inhalt

apple/PhysarumApp/Tests/AudioPresetAppStateTests.swift

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)
    }
}