/** * @module josm/unittest */ /* global Java */ import * as util from 'josm/util' const System = Java.type('java.lang.System') const out = System.out export function TestCase(name, test) { this._name = name this._test = test } export function test() { switch (arguments.length) { case 1: return new TestCase('No Name', arguments[0]) case 2: return new TestCase(arguments[0], arguments[1]) default: util.assert(false, 'Unsupported arguments') } } TestCase.prototype.run = function () { try { this._test() out.println('PASS - ' + this._name) return true } catch (e) { out.println(`FAIL - ${this._name}`) const desc = e.message || e.description || e out.println(` description: ${desc}`) let context if (e.lineNumber || e.fileName) { context = ` filename: ${e.fileName}, line: ${e.lineNumber}` } if (context) { out.println(` context: ${context}`) } return false } } export function Suite(name) { this._name = name this._tests = [] } export function suite() { if (arguments.length === 0) return new Suite() let idx = 0 const name = arguments[0] let suite if (util.isString(name)) { suite = new Suite(name) idx = 1 } else { suite = new Suite() } for (let i = idx; i < arguments.length; i++) { const test = arguments[i] if (test instanceof TestCase) { suite.add(test) } else if (util.isFunction(test)) { suite.add(test(test)) } else { util.assert(false, 'Unsupported arguments') } } return suite } Suite.prototype.add = function (test) { this._tests.push(test) } Suite.prototype.run = function () { out.println('----------------------------------------------------------------------') if (this._name) { out.println('suite: ' + this._name) out.println('----------------------------------------------------------------------') } let numtests = 0 let numfail = 0 let numok = 0 for (let i = 0; i < this._tests.length; i++) { const ret = this._tests[i].run() numtests++ if (ret) { numok++ } else { numfail++ } } out.println('----------------------------------------------------------------------') out.println(' # tests: ' + numtests + ' # PASS : ' + numok + ' # FAIL : ' + numfail) out.println('----------------------------------------------------------------------') return numfail } export function expectError() { let name = 'no name' let f switch (arguments.length) { case 0: return case 1: f = arguments[0]; break case 2: name = arguments[0] f = arguments[1] break default: util.assert(false, 'Unexpected number of arguments') } try { f() util.assert(false, "''{0}'': should have failed. Didn''t catch an error.", name) } catch (e) { // OK } } export function expectAssertionError() { let name = 'no name' let f switch (arguments.length) { case 0: return case 1: f = arguments[0]; break case 2: name = arguments[0] f = arguments[1] break default: util.assert(false, 'Unexpected number of arguments') } try { f() util.assert(false, "''{0}'': should have failed. Didn''t catch an error.", name) } catch (e) { if (e.name !== 'AssertionError') { util.assert(false, "''{0}'': expected an AssertionError, caught {1}.", name, e.toSource()) } } }