| /* |
| ** 2023-08-29 |
| ** |
| ** The author disclaims copyright to this source code. In place of |
| ** a legal notice, here is a blessing: |
| ** |
| ** May you do good and not evil. |
| ** May you find forgiveness for yourself and forgive others. |
| ** May you share freely, never taking more than you give. |
| ** |
| ************************************************************************* |
| ** This file contains a test application for SQLTester.js. |
| */ |
| import {default as ns} from './SQLTester.mjs'; |
| import {default as allTests} from './test-list.mjs'; |
| |
| globalThis.sqlite3 = ns.sqlite3; |
| const log = function f(...args){ |
| console.log('SQLTester.run:',...args); |
| return f; |
| }; |
| |
| const out = function f(...args){ return f.outer.out(...args) }; |
| out.outer = new ns.Outer(); |
| out.outer.getOutputPrefix = ()=>'SQLTester.run: '; |
| const outln = (...args)=>{ return out.outer.outln(...args) }; |
| |
| const affirm = function(expr, msg){ |
| if( !expr ){ |
| throw new Error(arguments[1] |
| ? ("Assertion failed: "+arguments[1]) |
| : "Assertion failed"); |
| } |
| } |
| |
| let ts = new ns.TestScript('/foo.test',` |
| /* |
| ** This is a comment. There are many like it but this one is mine. |
| ** |
| ** SCRIPT_MODULE_NAME: sanity-check-0 |
| ** xMIXED_MODULE_NAME: mixed-module |
| ** xMODULE_NAME: module-name |
| ** xREQUIRED_PROPERTIES: small fast reliable |
| ** xREQUIRED_PROPERTIES: RECURSIVE_TRIGGERS |
| ** xREQUIRED_PROPERTIES: TEMPSTORE_FILE TEMPSTORE_MEM |
| ** xREQUIRED_PROPERTIES: AUTOVACUUM INCRVACUUM |
| ** |
| */ |
| /* --verbosity 3 */ |
| /* ---must-fail */ |
| /* # must fail */ |
| /* --verbosity 0 */ |
| --print Hello, world. |
| --close all |
| --oom |
| --db 0 |
| --new my.db |
| --null zilch |
| --testcase 1.0 |
| SELECT 1, null; |
| --result 1 zilch |
| --glob *zil* |
| --notglob *ZIL* |
| SELECT 1, 2; |
| intentional error; |
| --run |
| /* ---intentional-failure */ |
| --testcase json-1 |
| SELECT json_array(1,2,3) |
| --json [1,2,3] |
| --testcase tableresult-1 |
| select 1, 'a'; |
| select 2, 'b'; |
| --tableresult |
| # [a-z] |
| 2 b |
| --end |
| --testcase json-block-1 |
| select json_array(1,2,3); |
| select json_object('a',1,'b',2); |
| --json-block |
| [1,2,3] |
| {"a":1,"b":2} |
| --end |
| --testcase col-names-on |
| --column-names 1 |
| select 1 as 'a', 2 as 'b'; |
| --result a 1 b 2 |
| --testcase col-names-off |
| --column-names 0 |
| select 1 as 'a', 2 as 'b'; |
| --result 1 2 |
| --close |
| --print Until next time |
| `); |
| |
| const sqt = new ns.SQLTester() |
| .setLogger(console.log.bind(console)) |
| .verbosity(1) |
| .addTestScript(ts); |
| sqt.outer().outputPrefix(''); |
| |
| const runTests = function(){ |
| try{ |
| if( 0 ){ |
| affirm( !sqt.getCurrentDb(), 'sqt.getCurrentDb()' ); |
| sqt.openDb('/foo.db', true); |
| affirm( !!sqt.getCurrentDb(),'sqt.getCurrentDb()' ); |
| affirm( 'zilch' !== sqt.nullValue() ); |
| ts.run(sqt); |
| affirm( 'zilch' === sqt.nullValue() ); |
| sqt.addTestScript(ts); |
| sqt.runTests(); |
| }else{ |
| for(const t of allTests){ |
| sqt.addTestScript( new ns.TestScript(t) ); |
| } |
| allTests.length = 0; |
| sqt.runTests(); |
| } |
| }finally{ |
| //log( "Metrics:", sqt.metrics ); |
| sqt.reset(); |
| } |
| }; |
| |
| if( globalThis.WorkerGlobalScope ){ |
| const wPost = (type,payload)=>globalThis.postMessage({type, payload}); |
| globalThis.onmessage = function({data}){ |
| switch(data.type){ |
| case 'run-tests':{ |
| try{ runTests(); } |
| finally{ wPost('tests-end', sqt.metrics); } |
| break; |
| } |
| default: |
| log("unhandled onmessage: ",data); |
| break; |
| } |
| }; |
| sqt.setLogger((msg)=>{ |
| wPost('stdout', {message: msg}); |
| }); |
| wPost('is-ready'); |
| //globalThis.onmessage({data:{type:'run-tests'}}); |
| }else{ |
| runTests(); |
| } |