@tsdi/unit
Version:
unit testing framework, base on AOP, Ioc container
263 lines (261 loc) • 11.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SuiteRunner = void 0;
var tslib_1 = require("tslib");
var ioc_1 = require("@tsdi/ioc");
var boot_1 = require("@tsdi/boot");
var decorators_1 = require("../decorators");
var assert_1 = require("../assert/assert");
/**
* Suite runner.
*
* @export
* @class SuiteRunner
* @implements {IRunner<any>}
*/
var SuiteRunner = /** @class */ (function (_super) {
tslib_1.__extends(SuiteRunner, _super);
function SuiteRunner() {
return _super !== null && _super.apply(this, arguments) || this;
}
SuiteRunner.prototype.configureService = function (ctx) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__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_1.lang.getClassName(this.getBootType());
return {
timeout: this.timeout,
describe: this.describe,
cases: []
};
};
SuiteRunner.prototype.run = function (data) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var desc, err_1;
return tslib_1.__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_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__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_1.PromiseUtil.defer();
var injector = this.getContext().injector;
var timer = setTimeout(function () {
if (timer) {
clearTimeout(timer);
var assert = injector.resolve(assert_1.Assert);
var err = new assert.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_1.RunCaseToken, useValue: instance[key] }, { provide: assert_1.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_1.__awaiter(this, void 0, void 0, function () {
var methodMaps;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
methodMaps = this.context.reflects.getMethodMetadata(decorators_1.Before, this.getBoot());
return [4 /*yield*/, ioc_1.PromiseUtil.step(Object.keys(methodMaps)
.map(function (key) { return function () {
var meta = methodMaps[key].find(function (m) { return ioc_1.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_1.__awaiter(this, void 0, void 0, function () {
var methodMaps;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
methodMaps = this.context.reflects.getMethodMetadata(decorators_1.BeforeEach, this.getBoot());
return [4 /*yield*/, ioc_1.PromiseUtil.step(Object.keys(methodMaps)
.map(function (key) { return function () {
var meta = methodMaps[key].find(function (m) { return ioc_1.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_1.__awaiter(this, void 0, void 0, function () {
var methodMaps;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
methodMaps = this.context.reflects.getMethodMetadata(decorators_1.AfterEach, this.getBoot());
return [4 /*yield*/, ioc_1.PromiseUtil.step(Object.keys(methodMaps)
.map(function (key) { return function () {
var meta = methodMaps[key].find(function (m) { return ioc_1.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_1.__awaiter(this, void 0, void 0, function () {
var methodMaps;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
methodMaps = this.context.reflects.getMethodMetadata(decorators_1.After, this.getBoot());
return [4 /*yield*/, ioc_1.PromiseUtil.step(Object.keys(methodMaps)
.map(function (key) { return function () {
var meta = methodMaps[key].find(function (m) { return ioc_1.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_1.__awaiter(this, void 0, void 0, function () {
var methodMaps, keys;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
methodMaps = this.context.reflects.getMethodMetadata(decorators_1.Test, this.getBoot());
keys = Object.keys(methodMaps);
return [4 /*yield*/, ioc_1.PromiseUtil.step(keys.map(function (key) {
var meta = methodMaps[key].find(function (m) { return ioc_1.isNumber(m.setp); });
var timeoutMeta = methodMaps[key].find(function (m) { return ioc_1.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_1.__awaiter(this, void 0, void 0, function () {
var err_2;
return tslib_1.__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_1.__decorate([
ioc_1.Injectable(),
ioc_1.Refs('@Suite', boot_1.Startup)
], SuiteRunner);
return SuiteRunner;
}(boot_1.Runnable));
exports.SuiteRunner = SuiteRunner;
//# sourceMappingURL=../sourcemaps/runner/SuiteRunner.js.map