aboutsummaryrefslogtreecommitdiffstats
path: root/prototypes/workbench/qa-document-guards.js
diff options
context:
space:
mode:
Diffstat (limited to 'prototypes/workbench/qa-document-guards.js')
-rw-r--r--prototypes/workbench/qa-document-guards.js30
1 files changed, 30 insertions, 0 deletions
diff --git a/prototypes/workbench/qa-document-guards.js b/prototypes/workbench/qa-document-guards.js
new file mode 100644
index 0000000..c938ec3
--- /dev/null
+++ b/prototypes/workbench/qa-document-guards.js
@@ -0,0 +1,30 @@
+async page => {
+ const checks=[],check=(ok,label)=>{if(!ok)throw new Error(label);checks.push(label);};
+ const onDialog=d=>d.accept();page.on('dialog',onDialog);
+ try {
+ await page.goto('http://127.0.0.1:8766/document.html');await page.waitForFunction(()=>window.pureDocument?.snapshot().ready);
+ await page.setViewportSize({width:1440,height:1000});await page.locator('#document-text').fill('보존할 문서');
+ await page.locator('.policy summary').click();const source=await page.locator('#policy-source').inputValue();
+ const bad=source.replace('clamp(event_value, 20, 80)','999');check(bad!==source,'invalid-output fixture changes the numeric rule');
+ await page.locator('#policy-source').fill(bad);await page.locator('#apply-policy').click();await page.locator('#split-range').focus();await page.keyboard.press('End');
+ check(await page.locator('#divider').getAttribute('aria-valuenow')==='50'&&await page.locator('#split-range').inputValue()==='50'&&(await page.locator('#policy-status').textContent()).includes('20~80'),'out-of-range authored output preserves both the layout and its native control projection');
+ await page.locator('#policy-source').fill(source);await page.locator('#apply-policy').click();await page.locator('#split-range').focus();await page.keyboard.press('Home');
+ check(await page.locator('#divider').getAttribute('aria-valuenow')==='20','a corrected policy and valid request recover from invalid host output');
+ await page.locator('#policy-source').fill(source.replace('clamp(event_value, 20, 80)','1 / 0'));await page.locator('#apply-policy').click();await page.locator('#split-range').focus();await page.keyboard.press('End');
+ const s=await page.evaluate(()=>window.pureDocument.snapshot());check(s.runtime.lastError===4&&s.runtime.states.ratio===20&&await page.locator('#split-range').inputValue()==='20','arithmetic rollback also restores the native range projection');
+ await page.locator('#policy-source').fill(source);await page.locator('#apply-policy').click();
+ await page.locator('#divider').scrollIntoViewIfNeeded();const box=await page.locator('#divider').boundingBox();await page.mouse.move(box.x+box.width/2,box.y+box.height/2);await page.mouse.down();
+ const revision=await page.evaluate(()=>window.pureDocument.snapshot().runtime.revision);
+ await page.evaluate(()=>document.querySelector('#apply-policy').click());
+ check(await page.evaluate(r=>window.pureDocument.snapshot().dragging&&window.pureDocument.snapshot().runtime.revision===r,revision)&&(await page.locator('#policy-status').textContent()).includes('경계를 놓거나'),'policy replacement is refused during an active native gesture');await page.mouse.up();
+ await page.locator('#file-input').evaluate(input=>{const d=new DataTransfer();d.items.add(new File([new Uint8Array(2*1024*1024+1)],'oversize.txt'));input.files=d.files;input.dispatchEvent(new Event('change',{bubbles:true}));});
+ await page.waitForFunction(()=>document.querySelector('#document-status').textContent.includes('2 MiB'));
+ check(await page.locator('#document-text').inputValue()==='보존할 문서','oversize files cannot replace the editable text');
+ await page.locator('.policy summary').click();await page.locator('#sample').click();await page.locator('#reset-split').click();
+ await page.evaluate(()=>new Promise(resolve=>requestAnimationFrame(()=>requestAnimationFrame(resolve))));
+ await page.screenshot({path:'output/playwright/pure-document-desktop.png',fullPage:true});
+ await page.setViewportSize({width:390,height:844});await page.screenshot({path:'output/playwright/pure-document-mobile.png',fullPage:true});
+ await page.evaluate(e=>window.__pureDocumentGuards=e,{checks});return{checks};
+ }catch(error){await page.evaluate(e=>window.__pureDocumentGuards=e,{failed:String(error),checks});throw error;}
+ finally{page.off('dialog',onDialog);}
+}