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("