zig-negative-fixtures.mjs (1654B)
1 // Constructor-only security fixtures, independent of the compiler/evaluator. 2 import {makeBundle} from './bundle-fixture.mjs'; 3 import {createHash} from 'node:crypto'; 4 export function fixtures(){ 5 const result={}; 6 const fixture=(name,build)=>{ 7 const nodes=[],memo=new Map(); 8 const node=(...children)=>{const key=children.join(',');if(memo.has(key))return memo.get(key);const id=nodes.length;nodes.push(children);memo.set(key,id);return id;}; 9 const leaf=node(),fork=(a,b)=>node(a,b),num=n=>n===0?leaf:fork(n%2?node(leaf):leaf,num(Math.floor(n/2))); 10 const list=xs=>xs.reduceRight((tail,x)=>fork(x,tail),leaf),text=s=>list(Array.from(s,c=>num(c.codePointAt(0)))); 11 const action=(tag,payload)=>fork(num(tag),payload),constant=t=>fork(leaf,t); 12 const io=(value,version=1)=>fork(text('tricuIO'),fork(num(version),value)); 13 const root=build({leaf,fork,num,text,action,constant,io});const bytes=makeBundle(nodes,[['root',root]]); 14 result[name]={bytes:[...bytes],hash:createHash('sha256').update(bytes).digest('hex')}; 15 }; 16 fixture('version',x=>x.io(x.action(0,x.leaf),2)); 17 fixture('unsupported',x=>x.io(x.action(99,x.leaf))); 18 fixture('abort',x=>{let t=x.leaf;for(let i=0;i<40;i++)t=x.fork(t,t);return x.io(x.action(2,t));}); 19 fixture('output',x=>{let a=x.action(0,x.leaf);const write=x.action(10,x.text('x'.repeat(4096)));for(let i=0;i<5;i++)a=x.action(1,x.fork(write,x.constant(a)));return x.io(a);}); 20 fixture('actions',x=>{let a=x.action(0,x.leaf);for(let i=0;i<65;i++)a=x.action(1,x.fork(x.action(0,x.leaf),x.constant(a)));return x.io(a);}); 21 fixture('sharing',x=>{let t=x.leaf;for(let i=0;i<40;i++)t=x.fork(t,t);return t;}); 22 return result; 23 }