tricu

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

literal-input.test.mjs (2022B)


      1 import test from 'node:test';
      2 import assert from 'node:assert/strict';
      3 import {parseLiteral,printLiteral} from '../dist/literal-input.js';
      4 import {Graph} from '../dist/graph.js';
      5 import {makeLiteral} from '../dist/codecs.js';
      6 const tree = value => { const g=new Graph();return g.toTernary(makeLiteral(g,value)); };
      7 test('data-only source literals preserve canonical codec trees',()=>{
      8  for(const [source,expected] of [
      9   ['00042',{type:'number',value:'42'}],
     10   ['"λ雪🙂\\n\\t\\r\\f\\b\\\\\\\"\\\'"',{type:'string',value:'λ雪🙂\n\t\r\f\b\\"\''}],
     11   ['[1 "hello" [2 3] (t t)]',{type:'list',value:[{type:'number',value:'1'},{type:'string',value:'hello'},{type:'list',value:[{type:'number',value:'2'},{type:'number',value:'3'}]},{type:'bool',value:true}]}],
     12   ['t',{type:'tree',value:'0'}], ['(t t)',{type:'bool',value:true}],
     13   ['(t 3 [1 2])',{type:'tree',value:'221021002221002201000'}],
     14  ]) {
     15   if(source==='(t 3 [1 2])') { assert.equal(tree(parseLiteral(source)), '2'+tree({type:'number',value:'3'})+tree({type:'list',value:[{type:'number',value:'1'},{type:'number',value:'2'}]})); }
     16   else assert.equal(tree(parseLiteral(source)),tree(expected),source);
     17  }
     18 });
     19 test('every preset literal has a data-equivalent printable input',async()=>{
     20  const {readFile}=await import('node:fs/promises');
     21  const catalogue=JSON.parse(await readFile(new URL('../catalogue.json',import.meta.url)));
     22  for(const entry of catalogue)for(const preset of [entry,...Object.values(entry.presets??{})])
     23   for(const literal of preset.arguments)assert.equal(tree(parseLiteral(printLiteral(literal))),tree(literal));
     24 });
     25 test('literal syntax rejects source evaluation, bad escapes, trailing tokens and excessive nesting',()=>{
     26  for(const source of ['id','true','false','(x : x)','first 1 2','t t t t','[1,2]','[1 | t]','"\\u0041"','"\\q"','"unterminated','(t','[1','42 7','1\t','['.repeat(18)+']'.repeat(18),'1'.repeat(16001),'(t '+ '9'.repeat(1025)+')','"\ud800"','(t "\ud800")'])assert.throws(()=>parseLiteral(source),undefined,source);
     27 });