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