// apple/PhysarumApp/Tests/ClipRecorderTests.swift
import XCTest
import CoreMedia
@testable import Physarum
final class ClipRecorderTests: XCTestCase {
final class MockRecorder: ClipRecorder {
var began = false, finished = false
var appended: [(Int, CMTime)] = []
let url = URL(fileURLWithPath: "/tmp/mock.mov")
func begin() throws { began = true }
func appendFrame(index: Int, pts: CMTime) throws { appended.append((index, pts)) }
func finish() async throws -> URL { finished = true; return url }
}
func testRunClipAppendsEveryFrameWithMonotonicPTS() async throws {
let rec = MockRecorder()
var rendered: [Int] = []
var progress = 0.0
let url = try await runClip(frameCount: 5, fps: 60, recorder: rec,
renderFrame: { rendered.append($0) },
isCancelled: { false },
progress: { progress = $0 })
XCTAssertTrue(rec.began); XCTAssertTrue(rec.finished)
XCTAssertEqual(rendered, [0, 1, 2, 3, 4])
XCTAssertEqual(rec.appended.map(\.0), [0, 1, 2, 3, 4])
XCTAssertEqual(rec.appended.map { $0.1.value }, [0, 1, 2, 3, 4])
XCTAssertEqual(progress, 1.0, accuracy: 1e-9)
XCTAssertEqual(url.lastPathComponent, "mock.mov")
}
func testRunClipStopsOnCancel() async throws {
let rec = MockRecorder()
var rendered = 0
_ = try await runClip(frameCount: 100, fps: 60, recorder: rec,
renderFrame: { _ in rendered += 1 },
isCancelled: { rendered >= 3 }, // cancel after 3 renders
progress: { _ in })
XCTAssertLessThanOrEqual(rendered, 4)
XCTAssertTrue(rec.finished, "finish() must still close the file cleanly")
}
}