tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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 }