Zum Inhalt

apple/PhysarumEngine/Tests/PhysarumEngineTests/SimStateTests.swift

import XCTest
import Metal
@testable import PhysarumEngine

final class SimStateTests: XCTestCase {
    private func makeSim(field: Int = 64) throws -> (SimEngine, MTLDevice)? {
        guard let device = MTLCreateSystemDefaultDevice() else { return nil }
        let lib = ShaderLibrary(device: device)
        let preset = try TestFixtures.minimalPreset().params
        let s = try SimEngine(device: device, library: lib, width: field, height: field, preset: preset)
        return (s, device)
    }

    func testSnapshotRestoreRoundTripRestoresPheromoneAndAgents() throws {
        guard let (s, device) = try makeSim() else { throw XCTSkip("No Metal device") }
        for _ in 0..<20 { s.step() }
        let snap = s.snapshot()
        XCTAssertEqual(snap.width, 64)
        XCTAssertEqual(snap.height, 64)
        XCTAssertGreaterThan(snap.agentCount, 0)
        XCTAssertEqual(snap.pheromone.count, 64 * 64 * 16)
        XCTAssertEqual(snap.agents.count, snap.agentCount * agentByteStride)

        let lib = ShaderLibrary(device: device)
        let preset = try TestFixtures.minimalPreset().params
        let target = try SimEngine(device: device, library: lib, width: 64, height: 64, preset: preset)
        try target.restore(snap)
        let restored = target.snapshot()
        XCTAssertEqual(restored.pheromone, snap.pheromone)
        XCTAssertEqual(restored.agents, snap.agents)
    }

    func testRestoreWithMismatchedDimensionsThrows() throws {
        guard let (s, device) = try makeSim(field: 64) else { throw XCTSkip("No Metal device") }
        let snap = s.snapshot()
        let lib = ShaderLibrary(device: device)
        let preset = try TestFixtures.minimalPreset().params
        let smaller = try SimEngine(device: device, library: lib, width: 32, height: 32, preset: preset)
        XCTAssertThrowsError(try smaller.restore(snap))
    }
}