@tsdi/unit
Version:
unit testing framework, base on AOP, Ioc container
1,283 lines (1,193 loc) • 59.9 kB
JavaScript
(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*/];
});
});