Zum Inhalt

apple/PhysarumEngine/Tests/PhysarumEngineTests/FeedbackStateTests.swift

import XCTest
import Metal
@testable import PhysarumEngine

final class FeedbackStateTests: XCTestCase {
    func testFeedbackSnapshotRestoreRoundTrip() throws {
        guard let device = MTLCreateSystemDefaultDevice() else { throw XCTSkip("No Metal device") }
        let lib = ShaderLibrary(device: device)
        let preset = try TestFixtures.minimalPreset().params
        let r = try Renderer(device: device, library: lib, width: 64, height: 64)
        let s = try SimEngine(device: device, library: lib, width: 64, height: 64, preset: preset)
        r.resetFeedback()
        for _ in 0..<10 { s.step(); try r.renderOffscreen(sim: s, preset: preset) }
        let snap = try XCTUnwrap(r.snapshotFeedback())
        XCTAssertEqual(snap.width, 64)
        XCTAssertEqual(snap.height, 64)
        XCTAssertEqual(snap.texData.count, 64 * 64 * 8)   // rgba16Float = 8 bytes/texel

        let r2 = try Renderer(device: device, library: lib, width: 64, height: 64)
        r2.restoreFeedback(snap)
        let snap2 = try XCTUnwrap(r2.snapshotFeedback())
        XCTAssertEqual(snap2.texData, snap.texData)
    }

    func testRestoreFeedbackWrongSizeIsNoOp() throws {
        guard let device = MTLCreateSystemDefaultDevice() else { throw XCTSkip("No Metal device") }
        let lib = ShaderLibrary(device: device)
        let r = try Renderer(device: device, library: lib, width: 64, height: 64)
        let bogus = FeedbackState(texData: Data(count: 32 * 32 * 8), width: 32, height: 32)
        r.restoreFeedback(bogus)   // must not crash; silently ignored
    }
}