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