Spaces:
Running
Running
| /** | |
| * css_bridge.test.ts | |
| * | |
| * Vitest tests for the Lutar.QEC.CSS (CSSBridge) gate. | |
| * | |
| * Tests: | |
| * 1. 1000-input random consistency check — verifies X ⊕ Z = 0xFF for all codewords | |
| * 2. Injectivity: 1000-pair random tests | |
| * 3. Edge cases: 0x00, 0xFF, 0x55, 0xAA | |
| * 4. Receipt emission with mock signer | |
| * | |
| * Lean commit: c4d13795689601324fce0236351bfe0ade990a43 | |
| */ | |
| import { describe, it, expect } from "vitest"; | |
| import { | |
| classicalToCSS, | |
| consistent, | |
| verifyBridgeInjective, | |
| emitCSSBridgeReceipt, | |
| cssBridgeGate, | |
| type Signer, | |
| } from "../../src/gates/css_bridge"; | |
| // --------------------------------------------------------------------------- | |
| // Seeded LCG | |
| // --------------------------------------------------------------------------- | |
| function seedRandom(seed: number) { | |
| let s = seed >>> 0; | |
| return () => { | |
| s = (Math.imul(1664525, s) + 1013904223) >>> 0; | |
| return s / 0x100000000; | |
| }; | |
| } | |
| const mockSigner: Signer = (p: string) => | |
| `mock-sig::${Buffer.from(p).slice(0, 16).toString("hex")}`; | |
| // --------------------------------------------------------------------------- | |
| // 1. 1000-input random consistency test | |
| // --------------------------------------------------------------------------- | |
| describe("css_bridge: 1000-input random consistency (css_bridge_consistent)", () => { | |
| it("consistent(classicalToCSS(c)) = true for 1000 random codewords", () => { | |
| const rand = seedRandom(0xfeedface); | |
| let inconsistencies = 0; | |
| for (let i = 0; i < 1000; i++) { | |
| const codeword = Math.floor(rand() * 256); | |
| const pair = classicalToCSS(codeword); | |
| if (!consistent(pair)) inconsistencies++; | |
| } | |
| expect(inconsistencies).toBe(0); | |
| }); | |
| it("X ⊕ Z = 0xFF for every codeword in [0, 255] (exhaustive)", () => { | |
| let failures = 0; | |
| for (let c = 0; c <= 255; c++) { | |
| const pair = classicalToCSS(c); | |
| if ((pair.xParity ^ pair.zParity) !== 0xff) failures++; | |
| } | |
| expect(failures).toBe(0); | |
| }); | |
| }); | |
| // --------------------------------------------------------------------------- | |
| // 2. Injectivity tests | |
| // --------------------------------------------------------------------------- | |
| describe("css_bridge: injectivity (css_bridge_injective)", () => { | |
| it("distinct codewords yield distinct pairs for 1000 random pairs", () => { | |
| const rand = seedRandom(0x01234567); | |
| let colisions = 0; | |
| for (let i = 0; i < 1000; i++) { | |
| const a = Math.floor(rand() * 256); | |
| let b = Math.floor(rand() * 256); | |
| if (b === a) b = (b + 1) % 256; | |
| if (!verifyBridgeInjective(a, b)) colisions++; | |
| } | |
| expect(colisions).toBe(0); | |
| }); | |
| it("verifyBridgeInjective(a, a) is trivially true", () => { | |
| expect(verifyBridgeInjective(0x42, 0x42)).toBe(true); | |
| }); | |
| }); | |
| // --------------------------------------------------------------------------- | |
| // 3. Edge cases | |
| // --------------------------------------------------------------------------- | |
| describe("css_bridge: edge cases", () => { | |
| it("classicalToCSS(0x00) = { xParity: 0x00, zParity: 0xFF }", () => { | |
| const pair = classicalToCSS(0x00); | |
| expect(pair.xParity).toBe(0x00); | |
| expect(pair.zParity).toBe(0xff); | |
| expect(consistent(pair)).toBe(true); | |
| }); | |
| it("classicalToCSS(0xFF) = { xParity: 0xFF, zParity: 0x00 }", () => { | |
| const pair = classicalToCSS(0xff); | |
| expect(pair.xParity).toBe(0xff); | |
| expect(pair.zParity).toBe(0x00); | |
| expect(consistent(pair)).toBe(true); | |
| }); | |
| it("classicalToCSS(0x55) is consistent", () => { | |
| const pair = classicalToCSS(0x55); | |
| expect(pair.zParity).toBe(0xaa); | |
| expect(consistent(pair)).toBe(true); | |
| }); | |
| it("inconsistent pair: { xParity: 0, zParity: 0 } → consistent = false", () => { | |
| expect(consistent({ xParity: 0, zParity: 0 })).toBe(false); | |
| }); | |
| it("throws on codeword out of [0,255] range", () => { | |
| expect(() => classicalToCSS(-1)).toThrow(); | |
| expect(() => classicalToCSS(256)).toThrow(); | |
| expect(() => classicalToCSS(1.5)).toThrow(); | |
| }); | |
| }); | |
| // --------------------------------------------------------------------------- | |
| // 4. Receipt emission | |
| // --------------------------------------------------------------------------- | |
| describe("css_bridge: DSSE receipt emission", () => { | |
| it("emits receipt with correct theorem and commit SHA", () => { | |
| const { pair, receipt } = emitCSSBridgeReceipt(0xab, mockSigner); | |
| expect(receipt.theorem).toBe("Lutar.QEC.CSS.css_bridge_consistent"); | |
| expect(receipt.lean_commit_sha).toBe("c4d13795689601324fce0236351bfe0ade990a43"); | |
| expect(receipt.output).toBe(true); | |
| expect(pair.xParity).toBe(0xab); | |
| expect(pair.zParity).toBe(0x54); | |
| }); | |
| it("receipt output matches consistent(classicalToCSS(c)) for 50 random codewords", () => { | |
| const rand = seedRandom(0x99aabbcc); | |
| for (let i = 0; i < 50; i++) { | |
| const c = Math.floor(rand() * 256); | |
| const { receipt } = emitCSSBridgeReceipt(c, mockSigner); | |
| expect(receipt.output).toBe(true); // Lean theorem: always consistent | |
| } | |
| }); | |
| it("gate returns pair, consistent=true, and receipt", () => { | |
| const { pair, consistent: cons, receipt } = cssBridgeGate(0x42, mockSigner); | |
| expect(cons).toBe(true); | |
| expect(pair.xParity).toBe(0x42); | |
| expect(receipt.output).toBe(true); | |
| }); | |
| it("inputs_hash is deterministic for the same codeword", () => { | |
| const r1 = emitCSSBridgeReceipt(0x77, mockSigner); | |
| const r2 = emitCSSBridgeReceipt(0x77, mockSigner); | |
| expect(r1.receipt.inputs_hash).toBe(r2.receipt.inputs_hash); | |
| }); | |
| it("inputs_hash differs for different codewords", () => { | |
| const r1 = emitCSSBridgeReceipt(0x10, mockSigner); | |
| const r2 = emitCSSBridgeReceipt(0x20, mockSigner); | |
| expect(r1.receipt.inputs_hash).not.toBe(r2.receipt.inputs_hash); | |
| }); | |
| }); | |