// Differential fuzzing: patchmark one-shot HTML vs commonmark.js (core) and micromark + GFM (gfm: true). // Usage: bun scripts/fuzz-differential.ts [coreCases=100000] [gfmCases=30000] [seed=1] import { generate, mutate, normalizeHtml, patchmark, referenceCore, referenceGfm, rng } from "../test/fuzz" import { isKnownGfmDivergence } from "../test/fuzz-known" const coreCases = Number(process.argv[2] ?? 100_000) const gfmCases = Number(process.argv[3] ?? 30_000) const seed = Number(process.argv[4] ?? 1) const r = rng(seed) let coreDiffs = 0 const t0 = performance.now() for (let i = 0; i < coreCases; i++) { const md = r() < 0.6 ? generate(r, false) : mutate(r) const want = referenceCore(md) const got = patchmark(md, false) if (got !== want) { coreDiffs++ if (coreDiffs <= 15) console.log(`CORE DIFF #${i} ${JSON.stringify(md)}\n got ${JSON.stringify(got)}\n want ${JSON.stringify(want)}`) } } const t1 = performance.now() let gfmDiffs = 0 let gfmKnown = 0 for (let i = 0; i < gfmCases; i++) { const md = r() < 0.7 ? generate(r, true) : mutate(r) const want = normalizeHtml(referenceGfm(md)) const got = normalizeHtml(patchmark(md, true)) if (got !== want) { if (isKnownGfmDivergence(md, got, want)) { gfmKnown++ continue } gfmDiffs++ if (gfmDiffs <= 15) console.log(`GFM DIFF #${i} ${JSON.stringify(md)}\n got ${JSON.stringify(got)}\n want ${JSON.stringify(want)}`) } } const t2 = performance.now() console.log(`Core CommonMark: ${coreCases} cases in ${((t1 - t0) / 1000).toFixed(1)}s — ${coreDiffs} diffs`) console.log( `GFM: ${gfmCases} cases in ${((t2 - t1) / 1000).toFixed(1)}s — ${gfmDiffs} unexpected diffs (${gfmKnown} known narrow divergences)`, ) if (coreDiffs > 0 || gfmDiffs > 0) process.exit(1)