9 lines
2.6 KiB
JavaScript
9 lines
2.6 KiB
JavaScript
// Execute the actual component's read lifecycle with deterministic hooks, not a browser.
|
|
import fs from 'node:fs';import assert from 'node:assert/strict';import {transformWithOxc} from 'vite';
|
|
const hooks=globalThis.fiscalHooks={cursor:0,values:[],effects:[]};
|
|
const mock='const h=globalThis.fiscalHooks;export function useState(initial){const i=h.cursor++;if(!(i in h.values))h.values[i]=initial;return[h.values[i],v=>h.values[i]=v];}export function useRef(initial){const i=h.cursor++;if(!(i in h.values))h.values[i]={current:initial};return h.values[i];}export function useEffect(f){h.effects.push(f);}export default {createElement(){return {};}};';const mockURL='data:text/javascript;base64,'+Buffer.from(mock).toString('base64');
|
|
let source=fs.readFileSync('resources/js/ServiceFiscalWorkspace.jsx','utf8').replace("from 'react'",'from '+JSON.stringify(mockURL)).replace("import FiscalCoverage from './FiscalCoverage.jsx';",'const FiscalCoverage=()=>null;');const transformed=await transformWithOxc(source,'ServiceFiscalWorkspace.jsx',{jsx:{runtime:'classic'}});const {default:Workspace}=await import('data:text/javascript;base64,'+Buffer.from(transformed.code).toString('base64'));const pending=[];const props={api:()=>new Promise((resolve,reject)=>pending.push({resolve,reject})),can:()=>false,perform:()=>{throw Error('No business commands');},busy:false};
|
|
const mount=token=>{hooks.cursor=0;Workspace({...props,context:{token,unit:{id:2,name:token}}});return hooks.effects.shift()();};const flush=()=>new Promise(r=>setTimeout(r,0));
|
|
const cleanA=mount('A');assert.equal(pending.length,1);cleanA();const cleanB=mount('B');pending[1].resolve({coverage:{version:'B'},proposals:[]});await flush();assert.equal(hooks.values[0].coverage.version,'B');pending[0].resolve({coverage:{version:'A'},proposals:['old-unit']});await flush();assert.equal(hooks.values[0].coverage.version,'B');assert.deepEqual(hooks.values[0].proposals,[]);cleanB();const cleanC=mount('C');cleanC();mount('D');pending[2].reject(Error('Old context error'));pending[3].resolve({coverage:{version:'D'},proposals:[]});await flush();assert.equal(hooks.values[0].coverage.version,'D');assert.equal(hooks.values[1],'');
|
|
const run=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json'));const file=run.root+'/private/receipt-composition-cc50a276c10c/fiscal-context-ui-20261110.json';fs.writeFileSync(file,JSON.stringify({passed:true,checks:['new context wins','late old proposal list suppressed','old context error suppressed'],browser_visual_review:false,business_commands:0},null,2));console.log(JSON.stringify({passed:true,checks:3,proof:file}));
|