tricu

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

backend-check.mjs (2133B)


      1 import assert from 'node:assert/strict';
      2 import {readFile} from 'node:fs/promises';
      3 import {createHash} from 'node:crypto';
      4 import {openSession,backendFactories} from './backends.mjs';
      5 const bundle=await readFile('test/fixtures/id.arboricx');
      6 const hash=createHash('sha256').update(bundle).digest('hex');
      7 const wasm=await readFile(process.argv[2]);
      8 assert.deepEqual(Object.keys(backendFactories),['js','zig-wasm']);
      9 for(const backend of ['toString','haskell-wasm','unknown'])
     10   await assert.rejects(openSession({backend,bundle,hash}),/Unknown backend/);
     11 for(const backend of Object.keys(backendFactories)) {
     12   const session=await openSession({backend,bundle,hash,artifacts:{wasm}});
     13   assert.equal(await session.runText('λ雪🙂'),'λ雪🙂');
     14   assert.equal(await session.runTree('21100',['2100']),'2100');
     15   await session.dispose();await session.dispose();
     16   await assert.rejects(async()=>session.runText('stale'),/disposed/);
     17 }
     18 await assert.rejects(openSession({backend:'zig-wasm',bundle,hash}),/Missing zig-wasm artifact/);
     19 // A future backend may have asynchronous operations and completely different
     20 // internal ownership. No Graph/WASM exports/BigInt handles are required here.
     21 let calls=0;
     22 const factories={alternate:async config=>{
     23   calls++;assert.equal(config.name,'id');
     24   return {runText:async text=>text,stats:async()=>({backendMetric:7}),dispose:async()=>{}};
     25 }};
     26 await assert.rejects(openSession({backend:'alternate',bundle,hash:'0'.repeat(64)},factories),/hash mismatch/);
     27 assert.equal(calls,0);
     28 const alternate=await openSession({backend:'alternate',bundle,hash},factories);
     29 assert.equal(await alternate.runText('async'),'async');assert.deepEqual(await alternate.stats(),{backendMetric:7});
     30 await alternate.dispose();assert.equal(calls,1);
     31 let fallback=false;
     32 await assert.rejects(openSession({backend:'broken',bundle,hash},{
     33   broken:async()=>{throw new Error('Selected backend failed');},
     34   js:async()=>{fallback=true;},
     35 }),/Selected backend failed/);
     36 assert.equal(fallback,false);
     37 console.log('Backend sessions: explicit selection, authentication, isolation/disposal, async adapters and no fallback passed');