| 1 | import Testing |
| 2 | @testable import Demucs |
| 3 | |
| 4 | @Test func modelsRoundTripThroughTheBridge() { |
| 5 | let models: [DemucsModel] = [.fourStem, .sixStem, .fineTunedAll, .fineTuned(stems: [.vocals])] |
| 6 | for model in models { |
| 7 | #expect(model.ffi.swift == model) |
| 8 | } |
| 9 | } |
| 10 | |
| 11 | @Test func stemKindsRoundTripThroughTheBridge() { |
| 12 | for kind in StemKind.allCases { |
| 13 | #expect(kind.ffi.swift == kind) |
| 14 | } |
| 15 | } |
| 16 | |
| 17 | @Test func bridgeErrorsMapToPublicErrors() { |
| 18 | #expect(DemucsError(.Cancelled) == .cancelled) |
| 19 | #expect(DemucsError(.NotLoaded) == .notLoaded) |
| 20 | #expect(DemucsError(.NotCached(modelId: "htdemucs")) == .notDownloaded(modelID: "htdemucs")) |
| 21 | #expect(DemucsError(.InvalidInput(reason: "empty")) == .invalidInput("empty")) |
| 22 | #expect(DemucsError(.Download(reason: "timeout")) == .downloadFailed("timeout")) |
| 23 | #expect(DemucsError(.Io(reason: "denied")) == .io("denied")) |
| 24 | #expect(DemucsError(.Inference(reason: "gpu")) == .inferenceFailed("gpu")) |
| 25 | } |
| 26 | |
| 27 | @Test func modelCatalogMatchesTheRustSide() { |
| 28 | let models = DemucsEngine.models |
| 29 | #expect(models.map(\.id) == ["htdemucs", "htdemucs_6s", "htdemucs_ft"]) |
| 30 | #expect(DemucsEngine.info(for: .sixStem).stems.contains(.guitar)) |
| 31 | #expect(DemucsEngine.info(for: .fineTunedAll).sizeMB > DemucsEngine.info(for: .fourStem).sizeMB) |
| 32 | } |
| 33 | |
| 34 | @Test func chunkCountAccountsForSampleRate() { |
| 35 | let oneChunk = 343_980 |
| 36 | #expect(DemucsEngine.chunkCount(sampleCount: oneChunk, sampleRate: 44_100) == 1) |
| 37 | #expect(DemucsEngine.chunkCount(sampleCount: oneChunk, sampleRate: 22_050) > 1) |
| 38 | } |
| 39 | |
| 40 | @Test func separatingWithoutAModelFails() async { |
| 41 | let engine = DemucsEngine() |
| 42 | #expect(!engine.isLoaded) |
| 43 | await #expect(throws: DemucsError.notLoaded) { |
| 44 | try await engine.separate(mono: [0, 0, 0, 0], sampleRate: 44_100) |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | @Test func mismatchedChannelsAreRejected() async { |
| 49 | let engine = DemucsEngine() |
| 50 | await #expect(throws: DemucsError.self) { |
| 51 | try await engine.separate(left: [0, 0], right: [0], sampleRate: 44_100) |
| 52 | } |
| 53 | } |