import XCTest @testable import MarkBase final class G12BOptimizationTests: XCTestCase { // ── Buffer Pool Tests ───────────────────────────── func testBufferPoolAcquireAndRelease() throws { let engine = try MarkBaseEngine() let buf1 = engine.acquireBuffer(length: 1024) XCTAssertGreaterThan(buf1.length, 0) engine.releaseBuffer(buf1) let buf2 = engine.acquireBuffer(length: 1024) XCTAssertEqual(buf1.length, buf2.length) } func testBufferPoolAlignment() throws { let engine = try MarkBaseEngine() let buf = engine.acquireBuffer(length: 100) XCTAssertEqual(buf.length % 256, 0) XCTAssertEqual(buf.length, 256) } func testBufferPoolReuse() throws { let engine = try MarkBaseEngine() for _ in 0..<10 { let buf = engine.acquireBuffer(length: 2048) engine.releaseBuffer(buf) } XCTAssertTrue(engine.bufferPool.totalReuses >= 9, "Expected at least 9 reuses, got \(engine.bufferPool.totalReuses)") } func testBufferPoolStats() throws { let engine = try MarkBaseEngine() let buf1 = engine.acquireBuffer(length: 512) let buf2 = engine.acquireBuffer(length: 1024) engine.releaseBuffer(buf1) let buf3 = engine.acquireBuffer(length: 512) engine.releaseBuffer(buf2) engine.releaseBuffer(buf3) let stats = engine.bufferPool.stats XCTAssertTrue(stats.contains("Allocations:")) } // ── Batch Dispatch Tests ────────────────────────── func testBatchDispatch() throws { let engine = try MarkBaseEngine() try engine.compileSource(MetalKernels.vectorAdd) let pipeline = try engine.pipeline(named: "vector_add") let n: UInt = 128 let a = (0...stride) let bufN = try engine.makeBuffer([n]) let gridSize = MTLSize(width: Int(n), height: 1, depth: 1) try engine.batchDispatch([ (pipeline, [bufA, bufB, bufC, bufN], gridSize) ]) let result = engine.readFloats(from: bufC, count: Int(n)) for i in 0...stride) let bufN = try engine.makeBuffer([n]) enc.setBuffer(bufA, offset: 0, index: 0) enc.setBuffer(bufB, offset: 0, index: 1) enc.setBuffer(bufC, offset: 0, index: 2) enc.setBuffer(bufN, offset: 0, index: 3) let tg = engine.threadgroupSize1D(pipeline, count: Int(n)) enc.dispatchThreads(MTLSize(width: Int(n), height: 1, depth: 1), threadsPerThreadgroup: tg) enc.endEncoding() cmdBuf.commit() cmdBuf.waitUntilCompleted() let result = engine.readFloats(from: bufC, count: Int(n)) for i in 0..