<!doctype html> <html lang="en-us"> <head> <meta charset="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon"> <!--link rel="stylesheet" href="../common/emscripten.css"/--> <link rel="stylesheet" href="../common/testing.css"/> <title>SQLTester</title> </head> <style> fieldset { display: flex; flex-direction: row; padding-right: 1em; } fieldset > :not(.legend) { display: flex; flex-direction: row; padding-right: 1em; } </style> <body> <h1>SQLTester for JS/WASM</h1> <p>This app reads in a build-time-defined set of SQLTester test scripts and runs them through the test suite. </p> <fieldset> <legend>Options</legend> <span class='input-wrapper'> <input type='checkbox' id='cb-log-reverse' checked> <label for='cb-log-reverse'>Reverse log order?</label> </span> <input type='button' id='btn-run-tests' value='Run tests'/> </fieldset> <div id='test-output'>Test output will go here.</div> <!--script src='SQLTester.run.mjs' type='module'></script--> <script> (async function(){ const W = new Worker('SQLTester.run.mjs',{ type: 'module' }); const wPost = (type,payload)=>W.postMessage({type,payload}); const mapToString = (v)=>{ switch(typeof v){ case 'string': return v; case 'number': case 'boolean': case 'undefined': case 'bigint': return ''+v; default: break; } if(null===v) return 'null'; if(v instanceof Error){ v = { message: v.message, stack: v.stack, errorClass: v.name }; } return JSON.stringify(v,undefined,2); }; const normalizeArgs = (args)=>args.map(mapToString); const logTarget = document.querySelector('#test-output'); const logClass = function(cssClass,...args){ const ln = document.createElement('div'); if(cssClass){ for(const c of (Array.isArray(cssClass) ? cssClass : [cssClass])){ ln.classList.add(c); } } ln.append(document.createTextNode(normalizeArgs(args).join(' '))); logTarget.append(ln); }; { const cbReverse = document.querySelector('#cb-log-reverse'); const cbReverseKey = 'SQLTester:cb-log-reverse'; const cbReverseIt = ()=>{ logTarget.classList[cbReverse.checked ? 'add' : 'remove']('reverse'); }; cbReverse.addEventListener('change', cbReverseIt, true); cbReverseIt(); } const btnRun = document.querySelector('#btn-run-tests'); const runTests = ()=>{ btnRun.setAttribute('disabled','disabled'); wPost('run-tests'); logTarget.innerText = 'Running tests...'; } btnRun.addEventListener('click', runTests); const log2 = function f(...args){ logClass('', ...args); return f; }; const log = function f(...args){ logClass('','index.html:',...args); return f; }; const timerId = setTimeout( ()=>{ logClass('error',"The SQLTester module is taking an unusually ", "long time to load. More information may be available", "in the dev console."); }, 3000 /* assuming localhost */ ); W.onmessage = function({data}){ switch(data.type){ case 'stdout': log2(data.payload.message); break; case 'tests-end': btnRun.removeAttribute('disabled'); delete data.payload.nTest; log("test results:",data.payload); break; case 'is-ready': clearTimeout(timerId); runTests(); break; default: log("unhandled onmessage",data); break; } }; //runTests() /* Inexplicably, */ })(); </script> </body> </html>