import XCTest @testable import MixBoard /// Tests for all DAW exporters. final class ExporterTests: XCTestCase { private var playlist: Playlist! private var outputDir: URL! override func setUp() { super.setUp() outputDir = FileManager.default.temporaryDirectory .appendingPathComponent("MixBoardExportTests", isDirectory: true) try? FileManager.default.createDirectory(at: outputDir, withIntermediateDirectories: true) playlist = Playlist(name: "Test Mix") let t1 = Track(title: "Track One", artist: "Artist A", album: "Album X", filePath: "/tmp/t1.mp3", duration: 180, fileFormat: "MP3") let t2 = Track(title: "Track Two", artist: "Artist B", album: "Album Y", filePath: "/tmp/t2.wav", duration: 240, fileFormat: "WAV") let t3 = Track(title: "Track Three", artist: "Artist A", filePath: "/tmp/t3.flac", duration: 300, fileFormat: "FLAC") t1.bpm = 128 t1.musicalKey = "Am" t2.bpm = 130 playlist.addTrack(t1, crossfadeDuration: 0) playlist.addTrack(t2, crossfadeDuration: 2.0) playlist.addTrack(t3, crossfadeDuration: 1.5) } override func tearDown() { super.tearDown() try? FileManager.default.removeItem(at: outputDir) } // MARK: - Audition Exporter func testAuditionExport() throws { let url = outputDir.appendingPathComponent("test.sesx") var options = ExportOptions.default options.copyAudioFiles = false try AuditionExporter.export(playlist: playlist, to: url, options: options) let content = try String(contentsOf: url, encoding: .utf8) // Verify XML structure XCTAssertTrue(content.contains("")) XCTAssertTrue(content.contains("")) XCTAssertTrue(content.contains("")) XCTAssertTrue(content.contains("absolutePath=")) XCTAssertTrue(content.contains("")) } func testAuditionExportFileReferences() throws { let url = outputDir.appendingPathComponent("test_refs.sesx") var options = ExportOptions.default options.copyAudioFiles = false try AuditionExporter.export(playlist: playlist, to: url, options: options) let content = try String(contentsOf: url, encoding: .utf8) // Should have file references with media handlers XCTAssertTrue(content.contains("mediaHandler=\"AmioMP3\"")) XCTAssertTrue(content.contains("mediaHandler=\"AmioWav\"")) XCTAssertTrue(content.contains("mediaHandler=\"AmioLSF\"")) } func testAuditionExportMasterTrack() throws { let url = outputDir.appendingPathComponent("test_master.sesx") var options = ExportOptions.default options.copyAudioFiles = false try AuditionExporter.export(playlist: playlist, to: url, options: options) let content = try String(contentsOf: url, encoding: .utf8) XCTAssertTrue(content.contains("")) XCTAssertTrue(content.contains("