import XCTest @testable import MarkBase final class G12BCompleteTests: XCTestCase { // ── Buffer Pool Tests ────────────────────────────── func testBufferPoolAcquireAndRelease() throws { let engine = try MarkBaseEngine() // Acquire a buffer let buf1 = engine.acquireBuffer(length: 1024) XCTAssertGreaterThan(buf1.length, 0) // Release back to pool engine.releaseBuffer(buf1) // Acquire again - should reuse let buf2 = engine.acquireBuffer(length: 1024) XCTAssertEqual(buf1.length, buf2.length) } func testBufferPoolAlignment() throws { let engine = try MarkBaseEngine() // Request non-aligned size let buf = engine.acquireBuffer(length: 100) // Should be aligned to 256 bytes XCTAssertEqual(buf.length % 256, 0) XCTAssertEqual(buf.length, 256) } func testBufferPoolReuse() throws { let engine = try MarkBaseEngine() // Acquire and release multiple buffers for _ in 0..<10 { let buf = engine.acquireBuffer(length: 2048) engine.releaseBuffer(buf) } // Should have reused buffers XCTAssertTrue(engine.bufferPool.totalReuses >= 9, "Expected at least 9 reuses, got \(engine.bufferPool.totalReuses)") } // ── 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..