main
swift 53 lines 1.95 KB
Raw
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 }