UNPKG

@tsdi/unit

Version:

unit testing framework, base on AOP, Ioc container

1,283 lines (1,193 loc) 59.9 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('tslib'), require('@tsdi/ioc'), require('@tsdi/boot'), require('@tsdi/aop'), require('@tsdi/logs'), require('@tsdi/core'), require('assert'), require('expect')) : typeof define === 'function' && define.amd ? define(['tslib', '@tsdi/ioc', '@tsdi/boot', '@tsdi/aop', '@tsdi/logs', '@tsdi/core', 'assert', 'expect'], factory) : (global = global || self, (global.unit = global.unit || {}, global.unit.umd = factory(global.tslib, global.ioc, global.boot, global.aop, global.logs, global.core, global.assert$1, global.expect))); }(this, (function (tslib, ioc, boot, aop, logs, core, assert$1, expect) { 'use strict'; tslib = tslib && Object.prototype.hasOwnProperty.call(tslib, 'default') ? tslib['default'] : tslib; ioc = ioc && Object.prototype.hasOwnProperty.call(ioc, 'default') ? ioc['default'] : ioc; boot = boot && Object.prototype.hasOwnProperty.call(boot, 'default') ? boot['default'] : boot; aop = aop && Object.prototype.hasOwnProperty.call(aop, 'default') ? aop['default'] : aop; logs = logs && Object.prototype.hasOwnProperty.call(logs, 'default') ? logs['default'] : logs; core = core && Object.prototype.hasOwnProperty.call(core, 'default') ? core['default'] : core; assert$1 = assert$1 && Object.prototype.hasOwnProperty.call(assert$1, 'default') ? assert$1['default'] : assert$1; expect = expect && Object.prototype.hasOwnProperty.call(expect, 'default') ? expect['default'] : expect; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function unwrapExports (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var metadata = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); }); unwrapExports(metadata); var decorators = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.AfterEach = exports.After = exports.AfterAll = exports.BeforeEach = exports.Before = exports.BeforeAll = exports.Test = exports.createTestDecorator = exports.Suite = exports.createSuiteDecorator = void 0; /** * create filed decorator. * * @export * @template T * @param {string} [SuiteType] * @param {ArgsIteratorAction<T>[]} [actions] * @param {MetadataExtends<T>} [metaExtends] * @returns {IFiledDecorator<T>} */ function createSuiteDecorator(actions, metaExtends) { return ioc.createClassDecorator('Suite', tslib.__spreadArrays((actions || []), [ function (ctx, next) { var arg = ctx.currArg; if (ioc.isString(arg)) { ctx.metadata.describe = arg; ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isNumber(arg)) { ctx.metadata.timeout = arg; ctx.next(next); } } ]), function (metadata) { if (metaExtends) { metaExtends(metadata); } metadata.singleton = true; return metadata; }); } exports.createSuiteDecorator = createSuiteDecorator; exports.Suite = createSuiteDecorator(); /** * create Test decorator. * * @export * @template T * @param {string} [TestType] * @param {MetadataAdapter} [actions] * @param {MetadataExtends<T>} [metaExtends] * @returns {ITestDecorator<T>} */ function createTestDecorator(name, actions, finallyActions, metaExtends) { return ioc.createMethodDecorator(name, tslib.__spreadArrays((actions ? (ioc.isArray(actions) ? actions : [actions]) : []), [ function (ctx, next) { var arg = ctx.currArg; if (ioc.isNumber(arg)) { ctx.metadata.timeout = arg; ctx.next(next); } } ], (finallyActions ? (ioc.isArray(finallyActions) ? finallyActions : [finallyActions]) : [])), metaExtends); } exports.createTestDecorator = createTestDecorator; /** * @Test decorator. define the method of class as unit test case. Describe a specification or test-case with the given `title` and callback `fn` acting * as a thunk. * * @export * @interface ITestDecorator * @template T */ exports.Test = createTestDecorator('TestCase', function (ctx, next) { var arg = ctx.currArg; if (ioc.isString(arg)) { ctx.metadata.title = arg; ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isNumber(arg)) { ctx.metadata.setp = arg; ctx.next(next); } }); /** * @BeforeAll decorator. define the method of class as unit test action run before all test case. * * @export * @interface IBeforeTestDecorator * @template T */ exports.BeforeAll = createTestDecorator('BeforeAll'); /** * @BeforeAll decorator. define the method of class as unit test action run before all test case. * * @export * @interface IBeforeTestDecorator * @template T */ exports.Before = exports.BeforeAll; /** * @BeforeEach decorator. define the method of class as unit test action run before each test case. * * @export * @interface IBeforeEachTestDecorator * @template T */ exports.BeforeEach = createTestDecorator('TestBeforeEach'); /** * @AfterAll decorator. define the method of class as unit test action run after all test case. * * @export * @interface IAfterTestDecorator * @template T */ exports.AfterAll = createTestDecorator('AfterAll'); /** * @AfterAll decorator. define the method of class as unit test action run after all test case. * * @export * @interface IAfterTestDecorator * @template T */ exports.After = exports.AfterAll; /** * @AfterEach decorator. define the method of class as unit test action run after each test case. * * @export * @interface IAfterEachTestDecorator * @template T */ exports.AfterEach = createTestDecorator('TestAfterEach'); }); unwrapExports(decorators); var decorators_1 = decorators.AfterEach; var decorators_2 = decorators.After; var decorators_3 = decorators.AfterAll; var decorators_4 = decorators.BeforeEach; var decorators_5 = decorators.Before; var decorators_6 = decorators.BeforeAll; var decorators_7 = decorators.Test; var decorators_8 = decorators.createTestDecorator; var decorators_9 = decorators.Suite; var decorators_10 = decorators.createSuiteDecorator; var assert = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Assert = exports.RunCaseToken = exports.RunSuiteToken = void 0; exports.RunSuiteToken = ioc.tokenId('runSuite'); exports.RunCaseToken = ioc.tokenId('runCase'); /** * abstract Assert class. * * @export * @abstract * @class Assert */ var Assert = /** @class */ (function () { function Assert() { } Assert.ρAnn = function () { return { "name": "Assert", "params": { "fail": ["actual", "expected", "message", "operator"], "ok": ["value", "message"], "equal": ["actual", "expected", "message"], "notEqual": ["actual", "expected", "message"], "deepEqual": ["actual", "expected", "message"], "notDeepEqual": ["acutal", "expected", "message"], "strictEqual": ["actual", "expected", "message"], "notStrictEqual": ["actual", "expected", "message"], "deepStrictEqual": ["actual", "expected", "message"], "notDeepStrictEqual": ["actual", "expected", "message"], "throws": ["block", "error", "message"], "doesNotThrow": ["block", "error", "message"], "ifError": ["value"], "rejects": ["block", "error", "message"], "doesNotReject": ["block", "error", "message"] } }; }; Assert = tslib.__decorate([ ioc.Abstract() ], Assert); return Assert; }()); exports.Assert = Assert; }); unwrapExports(assert); var assert_1 = assert.Assert; var assert_2 = assert.RunCaseToken; var assert_3 = assert.RunSuiteToken; var expects = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpectToken = void 0; exports.ExpectToken = ioc.tokenId('unit-expect'); }); unwrapExports(expects); var expects_1 = expects.ExpectToken; var ISuiteRunner = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); }); unwrapExports(ISuiteRunner); var SuiteRunner_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.SuiteRunner = void 0; /** * Suite runner. * * @export * @class SuiteRunner * @implements {IRunner<any>} */ var SuiteRunner = /** @class */ (function (_super) { tslib.__extends(SuiteRunner, _super); function SuiteRunner() { return _super !== null && _super.apply(this, arguments) || this; } SuiteRunner.prototype.configureService = function (ctx) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { this.context = ctx; return [2 /*return*/]; }); }); }; /** * get suite describe. * * @returns {ISuiteDescribe} * @memberof SuiteRunner */ SuiteRunner.prototype.getSuiteDescribe = function () { var meta = this.context.getTargetReflect().getAnnoation(); this.timeout = (meta && meta.timeout) ? meta.timeout : (3 * 60 * 60 * 1000); this.describe = meta.describe || ioc.lang.getClassName(this.getBootType()); return { timeout: this.timeout, describe: this.describe, cases: [] }; }; SuiteRunner.prototype.run = function (data) { return tslib.__awaiter(this, void 0, void 0, function () { var desc, err_1; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); desc = this.getSuiteDescribe(); return [4 /*yield*/, this.runSuite(desc)]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: err_1 = _a.sent(); return [3 /*break*/, 3]; case 3: return [2 /*return*/]; } }); }); }; SuiteRunner.prototype.runSuite = function (desc) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.runBefore(desc)]; case 1: _a.sent(); return [4 /*yield*/, this.runTest(desc)]; case 2: _a.sent(); return [4 /*yield*/, this.runAfter(desc)]; case 3: _a.sent(); return [2 /*return*/]; } }); }); }; SuiteRunner.prototype.runTimeout = function (key, describe, timeout) { var instance = this.getBoot(); var defer = ioc.PromiseUtil.defer(); var injector = this.getContext().injector; var timer = setTimeout(function () { if (timer) { clearTimeout(timer); var assert$1 = injector.resolve(assert.Assert); var err = new assert$1.AssertionError({ message: describe + ", timeout " + timeout, stackStartFunction: instance[key], stackStartFn: instance[key] }); defer.reject(err); } }, timeout || this.timeout); Promise.resolve(injector.invoke(instance, key, { provide: assert.RunCaseToken, useValue: instance[key] }, { provide: assert.RunSuiteToken, useValue: instance })) .then(function (r) { clearTimeout(timer); timer = null; defer.resolve(r); }) .catch(function (err) { clearTimeout(timer); timer = null; defer.reject(err); }); return defer.promise; }; SuiteRunner.prototype.runBefore = function (describe) { return tslib.__awaiter(this, void 0, void 0, function () { var methodMaps; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: methodMaps = this.context.reflects.getMethodMetadata(decorators.Before, this.getBoot()); return [4 /*yield*/, ioc.PromiseUtil.step(Object.keys(methodMaps) .map(function (key) { return function () { var meta = methodMaps[key].find(function (m) { return ioc.isNumber(m.timeout); }); return _this.runTimeout(key, 'sutie before ' + key, meta ? meta.timeout : describe.timeout); }; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; SuiteRunner.prototype.runBeforeEach = function () { return tslib.__awaiter(this, void 0, void 0, function () { var methodMaps; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: methodMaps = this.context.reflects.getMethodMetadata(decorators.BeforeEach, this.getBoot()); return [4 /*yield*/, ioc.PromiseUtil.step(Object.keys(methodMaps) .map(function (key) { return function () { var meta = methodMaps[key].find(function (m) { return ioc.isNumber(m.timeout); }); return _this.runTimeout(key, 'before each ' + key, meta ? meta.timeout : _this.timeout); }; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; SuiteRunner.prototype.runAfterEach = function () { return tslib.__awaiter(this, void 0, void 0, function () { var methodMaps; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: methodMaps = this.context.reflects.getMethodMetadata(decorators.AfterEach, this.getBoot()); return [4 /*yield*/, ioc.PromiseUtil.step(Object.keys(methodMaps) .map(function (key) { return function () { var meta = methodMaps[key].find(function (m) { return ioc.isNumber(m.timeout); }); return _this.runTimeout(key, 'after each ' + key, meta ? meta.timeout : _this.timeout); }; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; SuiteRunner.prototype.runAfter = function (describe) { return tslib.__awaiter(this, void 0, void 0, function () { var methodMaps; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: methodMaps = this.context.reflects.getMethodMetadata(decorators.After, this.getBoot()); return [4 /*yield*/, ioc.PromiseUtil.step(Object.keys(methodMaps) .map(function (key) { return function () { var meta = methodMaps[key].find(function (m) { return ioc.isNumber(m.timeout); }); return _this.runTimeout(key, 'sutie after ' + key, meta ? meta.timeout : describe.timeout); }; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; SuiteRunner.prototype.runTest = function (desc) { return tslib.__awaiter(this, void 0, void 0, function () { var methodMaps, keys; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: methodMaps = this.context.reflects.getMethodMetadata(decorators.Test, this.getBoot()); keys = Object.keys(methodMaps); return [4 /*yield*/, ioc.PromiseUtil.step(keys.map(function (key) { var meta = methodMaps[key].find(function (m) { return ioc.isNumber(m.setp); }); var timeoutMeta = methodMaps[key].find(function (m) { return ioc.isNumber(m.timeout); }); var title = methodMaps[key].map(function (m) { return m.title; }).filter(function (t) { return t; }).join('; '); return { key: key, order: meta ? meta.setp : keys.length, timeout: timeoutMeta ? timeoutMeta.timeout : _this.timeout, title: title || key }; }) .sort(function (a, b) { return b.order - a.order; }) .map(function (caseDesc) { return function () { return _this.runCase(caseDesc); }; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; SuiteRunner.prototype.runCase = function (caseDesc) { return tslib.__awaiter(this, void 0, void 0, function () { var err_2; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 4, , 5]); return [4 /*yield*/, this.runBeforeEach()]; case 1: _a.sent(); return [4 /*yield*/, this.runTimeout(caseDesc.key, caseDesc.title, caseDesc.timeout)]; case 2: _a.sent(); return [4 /*yield*/, this.runAfterEach()]; case 3: _a.sent(); return [3 /*break*/, 5]; case 4: err_2 = _a.sent(); caseDesc.error = err_2; return [3 /*break*/, 5]; case 5: return [2 /*return*/, caseDesc]; } }); }); }; SuiteRunner.ρAnn = function () { return { "name": "SuiteRunner", "params": { "configureService": ["ctx"], "run": ["data"], "runSuite": ["desc"], "runTimeout": ["key", "describe", "timeout"], "runBefore": ["describe"], "runAfter": ["describe"], "runTest": ["desc"], "runCase": ["caseDesc"] } }; }; SuiteRunner = tslib.__decorate([ ioc.Injectable(), ioc.Refs('@Suite', boot.Startup) ], SuiteRunner); return SuiteRunner; }(boot.Runnable)); exports.SuiteRunner = SuiteRunner; }); unwrapExports(SuiteRunner_1); var SuiteRunner_2 = SuiteRunner_1.SuiteRunner; var OldTestRunner_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.OldTestRunner = void 0; var gls = { describe: undefined, suite: undefined, it: undefined, test: undefined, before: undefined, beforeAll: undefined, beforeEach: undefined, after: undefined, afterAll: undefined, afterEach: undefined }; var testkeys = Object.keys(gls); var globals = typeof window !== 'undefined' ? window : commonjsGlobal; /** * Suite runner. * * @export * @class SuiteRunner * @implements {IRunner<any>} */ var OldTestRunner = /** @class */ (function (_super) { tslib.__extends(OldTestRunner, _super); function OldTestRunner(timeout) { var _this = _super.call(this) || this; _this.suites = []; _this.timeout = timeout || (3 * 60 * 60 * 1000); return _this; } OldTestRunner.prototype.configureService = function (ctx) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/]; }); }); }; OldTestRunner.prototype.getContext = function () { return null; }; OldTestRunner.prototype.getBootType = function () { return null; }; OldTestRunner.prototype.getBoot = function () { return this.suites; }; OldTestRunner.prototype.registerGlobalScope = function () { // isUndefined(window) ? global : window; testkeys.forEach(function (k) { gls[k] = globals[k]; }); var suites = this.suites; // BDD style var describe = globals.describe = function (name, fn, superDesc) { if (!ioc.isFunction(fn)) return; var suiteDesc = tslib.__assign(tslib.__assign({}, superDesc), { describe: name, cases: [] }); suites.push(suiteDesc); globals.describe = function (subname, fn) { describe(name + ' ' + subname, fn, suiteDesc); }; globals.it = function (title, test, timeout) { if (!ioc.isFunction(test)) return; suiteDesc.cases.push({ title: title, key: '', fn: test, timeout: timeout }); }; globals.before = globals.beforeAll = function (fn, timeout) { if (!ioc.isFunction(fn)) return; suiteDesc.before = suiteDesc.before || []; suiteDesc.before.push({ fn: fn, timeout: timeout }); }; globals.beforeEach = function (fn, timeout) { if (!ioc.isFunction(fn)) return; suiteDesc.beforeEach = suiteDesc.beforeEach || []; suiteDesc.beforeEach.push({ fn: fn, timeout: timeout }); }; globals.after = globals.afterAll = function (fn, timeout) { if (!ioc.isFunction(fn)) return; suiteDesc.after = suiteDesc.after || []; suiteDesc.after.push({ fn: fn, timeout: timeout }); }; globals.afterEach = function (fn, timeout) { if (!ioc.isFunction(fn)) return; suiteDesc.afterEach = suiteDesc.afterEach || []; suiteDesc.afterEach.push({ fn: fn, timeout: timeout }); }; fn && fn(); globals.describe = describe; }; // TDD style var suite = globals.suite = function (name, fn, superDesc) { var suiteDesc = tslib.__assign(tslib.__assign({}, superDesc), { describe: name, cases: [] }); suites.push(suiteDesc); globals.suite = function (subname, fn) { suite(name + ' ' + subname, fn, suiteDesc); }; globals.test = function (title, test, timeout) { suiteDesc.cases.push({ title: title, key: '', fn: test, timeout: timeout }); }; globals.before = globals.beforeAll = function (test, timeout) { suiteDesc.before = suiteDesc.before || []; suiteDesc.before.push({ fn: test, timeout: timeout }); }; globals.beforeEach = function (test, timeout) { suiteDesc.beforeEach = suiteDesc.beforeEach || []; suiteDesc.beforeEach.push({ fn: test, timeout: timeout }); }; globals.after = globals.afterAll = function (test, timeout) { suiteDesc.after = suiteDesc.after || []; suiteDesc.after.push({ fn: test, timeout: timeout }); }; globals.afterEach = function (test, timeout) { suiteDesc.afterEach = suiteDesc.afterEach || []; suiteDesc.afterEach.push({ fn: test, timeout: timeout }); }; fn && fn(); globals.suite = suite; }; }; OldTestRunner.prototype.unregisterGlobalScope = function () { // reset to default. testkeys.forEach(function (k) { globals[k] = gls[k]; }); }; OldTestRunner.prototype.startup = function () { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, this.run()]; }); }); }; OldTestRunner.prototype.run = function () { return tslib.__awaiter(this, void 0, void 0, function () { var err_1; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, ioc.PromiseUtil.step(this.suites.map(function (desc) { return desc.cases.length ? function () { return _this.runSuite(desc); } : function () { return Promise.resolve(); }; }))]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: err_1 = _a.sent(); return [3 /*break*/, 3]; case 3: return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runSuite = function (desc) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.runBefore(desc)]; case 1: _a.sent(); return [4 /*yield*/, this.runTest(desc)]; case 2: _a.sent(); return [4 /*yield*/, this.runAfter(desc)]; case 3: _a.sent(); return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runTimeout = function (fn, describe, timeout) { var _this = this; var defer = ioc.PromiseUtil.defer(); var timer = setTimeout(function () { if (timer) { clearTimeout(timer); var assert$1 = _this.injector.resolve(assert.Assert); var err = new assert$1.AssertionError({ message: describe + ", timeout " + timeout, stackStartFunction: fn, stackStartFn: fn }); defer.reject(err); } }, timeout || this.timeout); Promise.resolve(fn(function () { return defer.resolve(); })) .then(function (r) { clearTimeout(timer); timer = null; defer.resolve(r); }) .catch(function (err) { clearTimeout(timer); timer = null; defer.reject(err); }); return defer.promise; }; OldTestRunner.prototype.runHook = function (describe, action, desc) { return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, ioc.PromiseUtil.step((describe[action] || []) .map(function (hk) { return function () { return _this.runTimeout(hk.fn, desc, hk.timeout || describe.timeout); }; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runBefore = function (describe) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.runHook(describe, 'before', 'suite before')]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runBeforeEach = function (describe) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.runHook(describe, 'beforeEach', 'before each')]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runAfterEach = function (describe) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.runHook(describe, 'afterEach', 'after case each')]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runAfter = function (describe) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.runHook(describe, 'after', 'suite after')]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runTest = function (desc) { return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, ioc.PromiseUtil.step(desc.cases.map(function (caseDesc) { return function () { return _this.runCase(caseDesc, desc); }; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; OldTestRunner.prototype.runCase = function (caseDesc, suiteDesc) { return tslib.__awaiter(this, void 0, void 0, function () { var err_2; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 4, , 5]); return [4 /*yield*/, this.runBeforeEach(suiteDesc)]; case 1: _a.sent(); return [4 /*yield*/, this.runTimeout(caseDesc.fn, caseDesc.title, caseDesc.timeout)]; case 2: _a.sent(); return [4 /*yield*/, this.runAfterEach(suiteDesc)]; case 3: _a.sent(); return [3 /*break*/, 5]; case 4: err_2 = _a.sent(); caseDesc.error = err_2; return [3 /*break*/, 5]; case 5: return [2 /*return*/, caseDesc]; } }); }); }; OldTestRunner.prototype.destroying = function () { }; OldTestRunner.ρAnn = function () { return { "name": "OldTestRunner", "params": { "configureService": ["ctx"], "constructor": ["timeout"], "runSuite": ["desc"], "runTimeout": ["fn", "describe", "timeout"], "runHook": ["describe", "action", "desc"], "runBefore": ["describe"], "runBeforeEach": ["describe"], "runAfterEach": ["describe"], "runAfter": ["describe"], "runTest": ["desc"], "runCase": ["caseDesc", "suiteDesc"] } }; }; tslib.__decorate([ ioc.Inject(ioc.INJECTOR), tslib.__metadata("design:type", Object) ], OldTestRunner.prototype, "injector", void 0); OldTestRunner = tslib.__decorate([ ioc.Singleton, tslib.__metadata("design:paramtypes", [Number]) ], OldTestRunner); return OldTestRunner; }(ioc.Destoryable)); exports.OldTestRunner = OldTestRunner; }); unwrapExports(OldTestRunner_1); var OldTestRunner_2 = OldTestRunner_1.OldTestRunner; var Reporter_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.isReporterClass = exports.RealtimeReporter = exports.Reporter = void 0; /** * reportor. * * @export * @abstract * @class Reporter */ var Reporter = /** @class */ (function () { function Reporter() { } Reporter.ρAnn = function () { return { "name": "Reporter", "params": { "render": ["suites"], "track": ["error"] } }; }; Reporter = tslib.__decorate([ ioc.Abstract(), tslib.__metadata("design:paramtypes", []) ], Reporter); return Reporter; }()); exports.Reporter = Reporter; /** * realtime reporter. * * @export * @abstract * @class RealtimeReporter */ var RealtimeReporter = /** @class */ (function (_super) { tslib.__extends(RealtimeReporter, _super); function RealtimeReporter() { return _super.call(this) || this; } RealtimeReporter.ρAnn = function () { return { "name": "RealtimeReporter", "params": { "renderSuite": ["desc"], "renderCase": ["desc"] } }; }; RealtimeReporter = tslib.__decorate([ ioc.Abstract(), tslib.__metadata("design:paramtypes", []) ], RealtimeReporter); return RealtimeReporter; }(Reporter)); exports.RealtimeReporter = RealtimeReporter; /** * is target reporter. * * @export * @param {*} target * @returns */ function isReporterClass(target) { return ioc.isClass(target) && ioc.lang.isExtendsClass(target, Reporter); } exports.isReporterClass = isReporterClass; }); unwrapExports(Reporter_1); var Reporter_2 = Reporter_1.isReporterClass; var Reporter_3 = Reporter_1.RealtimeReporter; var Reporter_4 = Reporter_1.Reporter; var TestReport_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.TestReport = exports.ReportsToken = void 0; /** * report token. */ exports.ReportsToken = ioc.tokenId('unit-reports'); /** * test report. * * @export * @class TestReport * @implements {ITestReport} */ var TestReport = /** @class */ (function () { function TestReport() { this.suites = new Map(); } TestReport.prototype.getReports = function () { if (!this.resports || this.resports.length < 0) { this.resports = this.injector.getServices(Reporter_1.Reporter); } return this.resports || []; }; TestReport.prototype.track = function (error) { this.resports.forEach(function (rep) { rep.track(error); }); }; TestReport.prototype.addSuite = function (suit, describe) { var _this = this; if (!this.suites.has(suit)) { describe.start = new Date().getTime(); // init suite must has no completed cases. if (describe.cases.length) { describe = ioc.lang.omit(describe, 'cases'); } describe.cases = []; this.suites.set(suit, describe); this.getReports().forEach(function (rep) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { if (rep instanceof Reporter_1.RealtimeReporter) { rep.renderSuite(describe); } return [2 /*return*/]; }); }); }); } }; TestReport.prototype.getSuite = function (suit) { return this.suites.has(suit) ? this.suites.get(suit) : null; }; TestReport.prototype.setSuiteCompleted = function (suit) { var suite = this.getSuite(suit); if (suite) { suite.end = new Date().getTime(); } }; TestReport.prototype.addCase = function (suit, testCase) { if (this.suites.has(suit)) { testCase.start = new Date().getTime(); this.suites.get(suit).cases.push(testCase); } }; TestReport.prototype.getCase = function (suit, test) { var suite = this.getSuite(suit); if (suite) { var tCase = suite.cases.find(function (c) { return c.key === test; }); if (!tCase) { tCase = suite.cases.find(function (c) { return c.title === test; }); } return tCase; } return null; }; TestReport.prototype.setCaseCompleted = function (testCase) { var _this = this; testCase.end = new Date().getTime(); this.getReports().forEach(function (rep) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { if (rep instanceof Reporter_1.RealtimeReporter) { rep.renderCase(testCase); } return [2 /*return*/]; }); }); }); }; TestReport.prototype.report = function () { return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Promise.all(this.getReports().map(function (rep) { if (rep) { return rep.render(_this.suites); } return null; }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; TestReport.ρAnn = function () { return { "name": "TestReport", "params": { "track": ["error"], "addSuite": ["suit", "describe"], "getSuite": ["suit"], "setSuiteCompleted": ["suit"], "addCase": ["suit", "testCase"], "getCase": ["suit", "test"], "setCaseCompleted": ["testCase"] } }; }; tslib.__decorate([ ioc.Inject(ioc.INJECTOR), tslib.__metadata("design:type", Object) ], TestReport.prototype, "injector", void 0); TestReport = tslib.__decorate([ ioc.Singleton(), tslib.__metadata("design:paramtypes", []) ], TestReport); return TestReport; }()); exports.TestReport = TestReport; }); unwrapExports(TestReport_1); var TestReport_2 = TestReport_1.TestReport; var TestReport_3 = TestReport_1.ReportsToken; var UnitTestRunner_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.UnitTestRunner = void 0; /** * Suite runner. * * @export * @class SuiteRunner * @implements {IRunner<any>} */ var UnitTestRunner = /** @class */ (function (_super) { tslib.__extends(UnitTestRunner, _super); function UnitTestRunner() { return _super !== null && _super.apply(this, arguments) || this; } UnitTestRunner.prototype.configureService = function (ctx) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { this.context = ctx; return [2 /*return*/]; }); }); }; UnitTestRunner.prototype.getContext = function () { return this.context; }; UnitTestRunner.prototype.run = function (data) { return tslib.__awaiter(this, void 0, void 0, function () { var context, config, src, injector, exit, suites, oldRunner, loader, alltypes, alltypes, builder, reflects; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: context = this.getContext(); return [4 /*yield*/, context.getConfiguration()]; case 1: config = _a.sent(); src = config.src; injector = context.injector; exit = injector.get(boot.ApplicationExit); if (exit) { exit.enable = false; } suites = []; oldRunner = injector.resolve(OldTestRunner_1.OldTestRunner); return [4 /*yield*/, oldRunner.configureService(context)]; case 2: _a.sent(); loader = injector.getLoader(); oldRunner.registerGlobalScope(); if (!ioc.isString(src)) return [3 /*break*/, 4]; return [4 /*yield*/, loader.loadTypes({ files: [src], basePath: this.context.baseURL })]; case 3: alltypes = _a.sent(); alltypes.forEach(function (tys) { suites = suites.concat(tys); }); return [3 /*break*/, 8]; case 4: if (!ioc.isClass(src)) return [3 /*break*/, 5]; suites = [src]; return [3 /*break*/, 8]; case 5: if (!ioc.isArray(src)) return [3 /*break*/, 8]; if (!src.some(function (t) { return ioc.isClass(t); })) return [3 /*break*/, 6]; suites = src; return [3 /*break*/, 8]; case 6: return [4 /*yield*/, loader.loadTypes({ files: src, basePath: this.context.baseURL })]; case 7: alltypes = _a.sent(); alltypes.forEach(function (tys) { suites = suites.concat(tys); }); _a.label = 8; case 8: oldRunner.unregisterGlobalScope(); return [4 /*yield*/, oldRunner.run()]; case 9: _a.sent(); builder = injector.resolve(boot.BuilderService); reflects = this.context.reflects; return [4 /*yield*/, ioc.PromiseUtil.step(suites.filter(function (v) { return ioc.isClass(v) && reflects.hasMetadata(decorators.Suite, v); }).map(function (s) { return function () { return builder.run({ type: s, injector: injector }); }; }))]; case 10: _a.sent(); return [4 /*yield*/, injector.resolve(TestReport_1.TestReport).report()]; case 11: _a.sent(); return [2 /*return*/]; } }); }); }; UnitTestRunner.ρAnn = function () { return { "name": "UnitTestRunner", "params": { "configureService": ["ctx"], "run": ["data"] } }; }; UnitTestRunner = tslib.__decorate([ ioc.Injectable ], UnitTestRunner); return UnitTestRunner; }(boot.Runnable)); exports.UnitTestRunner = UnitTestRunner; }); unwrapExports(UnitTestRunner_1); var UnitTestRunner_2 = UnitTestRunner_1.UnitTestRunner; var ITestReport = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); }); unwrapExports(ITestReport); var UnitSetup_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.UnitSetup = void 0; /** * Bootstrap ext for ioc. auto run setup after registered. * with @IocExt('setup') decorator. * @export * @class BootModule */ var UnitSetup = /** @class */ (function () { function UnitSetup() { } /** * register aop for container. * * @memberof AopModule */ UnitSetup.prototype.setup = function (container) { var actInjector = container.getActionInjector(); actInjector.getInstance(ioc.DesignRegisterer) .register(decorators.Suite, 'Class', boot.AnnoationAction); actInjector.getInstance(ioc.RuntimeRegisterer) .register(decorators.Suite, 'Class', ioc.RegSingletionAction); actInjector.getInstance(ioc.DecoratorProvider) .bindProviders(decorators.Suite, { provide: boot.BootContext, deps: [core.ContainerToken], useFactory: function (container) { var providers = []; for (var _i = 1; _i < arguments.length; _i++) { providers[_i - 1] = arguments[_i]; } var ref = new ioc.InjectReference(boot.BootContext, decorators.Suite.toString()); if (container.has(ref)) { return container.get.apply(container, tslib.__spreadArrays([ref], providers)); } return null; } }); }; UnitSetup.ρAnn = function () { return { "name": "UnitSetup", "params": { "setup": ["container"] } }; }; tslib.__decorate([ tslib.__param(0, ioc.Inject(core.ContainerToken)), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [Object]), tslib.__metadata("design:returntype", void 0) ], UnitSetup.prototype, "setup", null); UnitSetup = tslib.__decorate([ ioc.IocExt(), tslib.__metadata("design:paramtypes", []) ], UnitSetup); return UnitSetup; }()); exports.UnitSetup = UnitSetup; }); unwrapExports(UnitSetup_1); var UnitSetup_2 = UnitSetup_1.UnitSetup; var UnitTestConfigureRegister_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.UnitTestConfigureRegister = void 0; /** * unit test configure register. * * @export * @class UnitTestConfigureRegister * @extends {ConfigureRegister} */ var UnitTestConfigureRegister = /** @class */ (function (_super) { tslib.__extends(UnitTestConfigureRegister, _super); function UnitTestConfigureRegister() { return _super !== null && _super.apply(this, arguments) || this; } UnitTestConfigureRegister.prototype.register = function (config, ctx) { return tslib.__awaiter(this, void 0, void 0, function () { var _a; return tslib.__generator(this, function (_b) { if (!ctx.injector.has(assert.Assert)) { ctx.injector.setValue(assert.Assert, assert$1); } if (!ctx.injector.has(expects.ExpectToken)) { ctx.injector.setValue(expects.ExpectToken, expect); } if (ioc.isArray(config.reporters) && config.reporters.length) { (_a = ctx.injector).use.apply(_a, config.reporters); } return [2 /*return*/]; }); });