import XCTest
import PhysarumEngine
@testable import Physarum
final class AudioPresetStoreTests: XCTestCase {
private func tempStore() -> AudioPresetStore {
AudioPresetStore(baseDir: URL(fileURLWithPath: NSTemporaryDirectory())
.appendingPathComponent("phys-audiopreset-\(UUID().uuidString)", isDirectory: true))
}
private func sampleReactive() -> AudioReactive {
AudioReactive(enabled: true, gain: 1.5, autoGain: true,
routes: [AudioRoute(source: .bass, target: .moveSpeed, depth: 1, mode: .transient)])
}
func testSaveLoadRoundTrip() {
let store = tempStore()
let cfg = AudioConfig(id: "a1", name: "Club", reactive: sampleReactive())
try? store.save(cfg)
let loaded = store.loadAll()
XCTAssertEqual(loaded.count, 1)
XCTAssertEqual(loaded.first?.name, "Club")
XCTAssertEqual(loaded.first?.reactive.gain, 1.5)
XCTAssertEqual(loaded.first?.reactive.routes.count, 1)
}
func testDeleteAndOrder() {
let store = tempStore()
try? store.save(AudioConfig(id: "a1", name: "One", reactive: sampleReactive()))
try? store.save(AudioConfig(id: "a2", name: "Two", reactive: sampleReactive()))
store.delete("a1")
XCTAssertEqual(store.loadAll().map(\.id), ["a2"])
}
func testReorder() {
let store = tempStore()
try? store.save(AudioConfig(id: "a1", name: "One", reactive: sampleReactive()))
try? store.save(AudioConfig(id: "a2", name: "Two", reactive: sampleReactive()))
store.reorder(["a2", "a1"])
XCTAssertEqual(store.loadAll().map(\.id), ["a2", "a1"])
}
func testAppLocalEquality() {
// AudioConfig equality is app-local (engine AudioReactive/AudioRoute are NOT Equatable).
let base = AudioConfig(id: "a1", name: "Club", reactive: sampleReactive())
XCTAssertEqual(base, AudioConfig(id: "a1", name: "Club", reactive: sampleReactive()))
XCTAssertNotEqual(base, AudioConfig(id: "a1", name: "Renamed", reactive: sampleReactive()))
XCTAssertNotEqual(base, AudioConfig(id: "a2", name: "Club", reactive: sampleReactive()))
let louder = AudioReactive(enabled: true, gain: 9.0, autoGain: true,
routes: [AudioRoute(source: .bass, target: .moveSpeed, depth: 1, mode: .transient)])
XCTAssertNotEqual(base, AudioConfig(id: "a1", name: "Club", reactive: louder))
}
}