| 1 | import assert from "node:assert/strict"; |
| 2 | import { createServer } from "vite"; |
| 3 | import path from "node:path"; |
| 4 | import { fileURLToPath } from "node:url"; |
| 5 | const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); |
| 6 | process.env.PLAYWRIGHT_BROWSERS_PATH = path.join(root, ".pw-browsers"); |
| 7 | const { chromium } = await import("playwright"); |
| 8 | const server = await createServer({ root, server: { host: "127.0.0.1", port: 0 } }); |
| 9 | await server.listen(); |
| 10 | const browser = await chromium.launch(); |
| 11 | try { |
| 12 | const page = await browser.newPage(); |
| 13 | const errors = []; |
| 14 | page.on("pageerror", e => errors.push(e.message)); |
| 15 | await page.goto(`http://127.0.0.1:${server.httpServer.address().port}/bench/session-export.html`); |
| 16 | const result = await page.evaluate(async () => { |
| 17 | const { renderSessionExportPages } = await import("/src/lib/sessionExport.tsx"); |
| 18 | const reports = []; |
| 19 | for (const format of ["pdf", "image"]) { |
| 20 | async function* blocks() { |
| 21 | yield {kind:"markdown", text:"# 完整会话\n\nFIRST-QUESTION\n\n公式 $x^2+y^2=z^2$"}; |
| 22 | for(let group=0;group<3;group++) yield {kind:"code",label:"工具输出",text:Array.from({length:160},(_,i)=>`LINE-${group}-${i} `+"中文 abc ".repeat(12)).join("\n")}; |
| 23 | yield {kind:"markdown",text:"| key | value |\n|---|---|\n"+Array.from({length:80},(_,i)=>`| ROW-${i} | `+"table 中文 ".repeat(12)+" |").join("\n")}; |
| 24 | yield {kind:"markdown",text:"FINAL-ANSWER"}; |
| 25 | } |
| 26 | let pages=0, maxSurfaces=0, maxWidth=0, rendered="";const seen=new WeakSet(); |
| 27 | for await(const output of renderSessionExportPages(blocks(),format)) { |
| 28 | pages++; const surfaces=[...document.querySelectorAll(".session-export-page")];maxSurfaces=Math.max(maxSurfaces,surfaces.length); |
| 29 | for(const surface of surfaces) {maxWidth=Math.max(maxWidth,surface.scrollWidth);if(!seen.has(surface)){seen.add(surface);rendered+=surface.textContent;}} |
| 30 | if(output.width>8192 || output.height>8192 || !output.blob.size) throw new Error("Invalid raster page"); |
| 31 | const bitmap=await createImageBitmap(output.blob);if(bitmap.width!==output.width || bitmap.height!==output.height) throw new Error("Bad encoded dimensions");bitmap.close(); |
| 32 | } |
| 33 | reports.push({format,pages,maxSurfaces,maxWidth,first:rendered.includes("FIRST-QUESTION"),last:rendered.includes("FINAL-ANSWER"),lines:Array.from({length:480},(_,i)=>`LINE-${Math.floor(i/160)}-${i%160} `).every(token=>rendered.includes(token)),surfacesAfter:document.querySelectorAll(".session-export-page").length}); |
| 34 | } |
| 35 | return reports; |
| 36 | }); |
| 37 | for(const report of result){assert.ok(report.pages>1);assert.equal(report.maxSurfaces,1);assert.equal(report.maxWidth,920);assert.ok(report.first&&report.last&&report.lines);assert.equal(report.surfacesAfter,0);} |
| 38 | assert.deepEqual(errors,[]); |
| 39 | console.log(JSON.stringify(result,null,2)); |
| 40 | } finally {await browser.close();await server.close();} |
| 41 |