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 });