broken changes

This commit is contained in:
Mark Gregory
2026-11-05 21:10:04 +00:00
parent 83a97ff3fd
commit 78c4411fa6
6 changed files with 218 additions and 21 deletions
+57
View File
@@ -2140,6 +2140,21 @@ extension KJamsCloneTests {
control.selectItem(withTag:0);_ = control.sendAction(try XCTUnwrap(control.action),to:control.target)
XCTAssertEqual(selected,0)
}
@MainActor func testLiveAudioRoutingKeepsPlayingPositionAndPausedState() async throws {
let output = try XCTUnwrap(DJAudioDevice.defaultOutput())
let audio = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.mp3"))
let player = Player(persistsMix:false);player.volume = 0;defer { player.stop() }
try player.load(.init(id:1,title:"Routing",audio:audio.path,cdg:nil,rating:0,plays:0))
player.seek(0.5);try await Task.sleep(nanoseconds:100_000_000)
let before = player.time
try player.routeOutput(output,firstChannel:0)
XCTAssertTrue(player.playing);XCTAssertGreaterThanOrEqual(player.time,before-0.05)
try await Task.sleep(nanoseconds:100_000_000)
XCTAssertGreaterThan(player.time,before)
player.toggle();let paused = player.time
try player.routeOutput(output,firstChannel:0)
XCTAssertFalse(player.playing);XCTAssertEqual(player.time,paused,accuracy:0.02)
}
@MainActor func testAudioOutputsAndActualFourChannelRoutingWhenInterfaceAttached() async throws {
let outputs = DJAudioDevice.outputs()
print("DJ audio discovery:",outputs.map { "\($0.name) [\($0.outputChannels) out / \($0.inputChannels) in]" }.joined(separator:", "))
@@ -2328,6 +2343,48 @@ extension KJamsCloneTests {
}
extension KJamsCloneTests {
func testLoopMouseRangesResizeMoveCreateAndClamp() throws {
let loop = 1.0...3.0
let left = DJLoopDrag(x:100,viewport:0,span:6,width:600,loop:loop,create:false)
XCTAssertEqual(left.mode,.start);XCTAssertEqual(left.range(x:50,duration:6),0.5...3)
let right = DJLoopDrag(x:300,viewport:0,span:6,width:600,loop:loop,create:false)
XCTAssertEqual(right.mode,.end);XCTAssertEqual(right.range(x:450,duration:6),1...4.5)
let move = DJLoopDrag(x:200,viewport:0,span:6,width:600,loop:loop,create:false)
XCTAssertEqual(move.mode,.move);XCTAssertEqual(move.range(x:300,duration:6),2...4)
XCTAssertEqual(move.range(x:-200,duration:6),0...2)
XCTAssertEqual(move.range(x:900,duration:6),4...6)
let create = DJLoopDrag(x:400,viewport:0,span:6,width:600,loop:nil,create:true)
XCTAssertEqual(create.range(x:200,duration:6),2...4)
let seek = DJLoopDrag(x:500,viewport:0,span:6,width:600,loop:loop,create:false)
XCTAssertEqual(seek.mode,.seek);XCTAssertNil(seek.range(x:400,duration:6))
let narrow = try XCTUnwrap(left.range(x:500,duration:6))
XCTAssertEqual(narrow.upperBound-narrow.lowerBound,0.1,accuracy:0.00001)
}
@MainActor func testActualMouseDragMovesAndResizesPlayingLoop() async throws {
let file = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.mp3"))
let player = Player(persistsMix:false);player.volume = 0;defer { player.stop() }
try player.load(.init(id:1,title:"Mouse Loop",audio:file.path,cdg:nil,rating:0,plays:0),startPlaying:false)
player.defineLoop(start:0.5,end:1.5);player.seek(0.75);player.toggle()
var frozen: Double?
let host = NSHostingView(rootView:Color.black.modifier(DJLoopWaveInteraction(player:player,start:0,span:3,width:600,frozenStart:Binding(get:{frozen},set:{frozen = $0}))).frame(width:600,height:100))
host.frame = NSRect(x:0,y:0,width:600,height:100)
let window = NSWindow(contentRect:host.frame,styleMask:[.borderless],backing:.buffered,defer:false)
window.contentView = host;window.setFrameOrigin(NSPoint(x:-10000,y:-10000));window.orderFront(nil);window.makeKey()
defer { window.orderOut(nil);window.contentView = nil }
try await Task.sleep(nanoseconds:100_000_000);host.layoutSubtreeIfNeeded()
func drag(_ from: Double,_ to: Double) async throws {
for (type,x) in [(NSEvent.EventType.leftMouseDown,from),(.leftMouseDragged,to),(.leftMouseUp,to)] {
let event = try XCTUnwrap(NSEvent.mouseEvent(with:type,location:NSPoint(x:x,y:50),modifierFlags:[],timestamp:ProcessInfo.processInfo.systemUptime,windowNumber:window.windowNumber,context:nil,eventNumber:0,clickCount:1,pressure:type == .leftMouseUp ? 0 : 1))
NSApp.sendEvent(event)
}
try await Task.sleep(nanoseconds:50_000_000)
}
try await drag(200,300)
XCTAssertEqual(player.loopIn!,1,accuracy:0.01);XCTAssertEqual(player.loopOut!,2,accuracy:0.01)
try await drag(200,150)
XCTAssertEqual(player.loopIn!,0.75,accuracy:0.01);XCTAssertEqual(player.loopOut!,2,accuracy:0.01)
XCTAssertTrue(player.playing);XCTAssertTrue(player.loopEnabled);XCTAssertNil(frozen)
}
@MainActor private func automixFixture(_ root: URL) throws -> (DJSystem,[Song]) {
let system = DJSystem(storageURL:root),library = try XCTUnwrap(system.library)
let fixture = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.mp3"))