Zum Inhalt

apple/PhysarumApp/Tests/ClipRecorderTests.swift

// 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")
    }
}