intern
Version:
Intern. A next-generation code testing stack for JavaScript.
308 lines • 13.3 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "tslib", "charm", "istanbul-lib-coverage", "./Reporter", "./TextCoverage", "../common/util"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var charm_1 = tslib_1.__importDefault(require("charm"));
var istanbul_lib_coverage_1 = require("istanbul-lib-coverage");
var Reporter_1 = require("./Reporter");
var TextCoverage_1 = tslib_1.__importDefault(require("./TextCoverage"));
var util_1 = require("../common/util");
var eventHandler = Reporter_1.createEventHandler();
var Runner = (function (_super) {
tslib_1.__extends(Runner, _super);
function Runner(executor, options) {
if (options === void 0) { options = {}; }
var _this = _super.call(this, executor, options) || this;
_this.hidePassed = options.hidePassed || false;
_this.hideSkipped = options.hideSkipped || false;
_this.hideTunnelDownloadProgress =
options.hideTunnelDownloadProgress || false;
_this.sessions = {};
_this.hasRunErrors = false;
_this.hasSuiteErrors = false;
_this.serveOnly = executor.config.serveOnly;
_this.charm = charm_1.default();
_this.charm.pipe(_this.output);
_this.charm.display('reset');
_this._deprecationMessages = {};
return _this;
}
Runner.prototype.coverage = function (message) {
var sessionId = message.sessionId || '';
if (!this.sessions[sessionId]) {
this.sessions[sessionId] = {};
}
var session = this.sessions[sessionId];
session.coverage = session.coverage || istanbul_lib_coverage_1.createCoverageMap();
session.coverage.merge(message.coverage);
};
Runner.prototype.deprecated = function (message) {
var key = message.original + "|" + message.replacement + "|" + message.message;
if (this._deprecationMessages[key]) {
return;
}
this._deprecationMessages[key] = true;
this.charm
.foreground('yellow')
.write('⚠︎ ' + message.original + ' is deprecated. ');
if (message.replacement) {
this.charm.write('Use ' + message.replacement + ' instead.');
}
else {
this.charm.write('Please open a ticket at https://github.com/theintern/intern/issues if you still ' +
'require access to this function.');
}
if (message.message) {
this.charm.write(' ' + message.message);
}
this.charm.write('\n');
this.charm.display('reset');
};
Runner.prototype.error = function (error) {
this.charm.foreground('red');
this.charm.write('(ノಠ益ಠ)ノ彡┻━┻\n');
this.charm.write(this.formatError(error));
this.charm.display('reset');
this.charm.write('\n\n');
this.hasRunErrors = true;
};
Runner.prototype.warning = function (warning) {
this.charm.foreground('yellow');
var message = typeof warning === 'string' ? warning : this.formatError(warning);
this.charm.write("WARNING: " + message.replace(/^Error:\s+/, ''));
this.charm.display('reset');
this.charm.write('\n\n');
};
Runner.prototype.log = function (message) {
var _this = this;
message.split('\n').forEach(function (line) {
_this.console.log("DEBUG: " + line);
});
};
Runner.prototype.runEnd = function () {
var _this = this;
var map = this.executor.coverageMap;
var numTests = 0;
var numPassedTests = 0;
var numFailedTests = 0;
var numSkippedTests = 0;
var sessionIds = Object.keys(this.sessions);
var numEnvironments = sessionIds.length;
sessionIds
.filter(function (sessionId) { return _this.sessions[sessionId].suite; })
.forEach(function (sessionId) {
var suite = _this.sessions[sessionId].suite;
numTests += suite.numTests;
numPassedTests += suite.numPassedTests;
numFailedTests += suite.numFailedTests;
numSkippedTests += suite.numSkippedTests;
});
var charm = this.charm;
if (map.files().length > 0) {
charm.write('\n');
charm.display('bright');
charm.write('Total coverage\n');
charm.display('reset');
this.createCoverageReport(this.reportType, map);
}
var message = "TOTAL: tested " + numEnvironments + " platforms, " + numPassedTests + " passed, " + numFailedTests + " failed";
if (numSkippedTests) {
message += ", " + numSkippedTests + " skipped";
}
var numUnrunTests = numTests - (numPassedTests + numFailedTests + numSkippedTests);
if (numUnrunTests) {
message += ", " + numUnrunTests + " not run";
}
if (this.hasRunErrors) {
message += '; fatal error occurred';
}
else if (this.hasSuiteErrors) {
message += '; suite error occurred';
}
charm.display('bright');
charm.foreground(numFailedTests > 0 || this.hasRunErrors || this.hasSuiteErrors
? 'red'
: 'green');
charm.write(message);
charm.display('reset');
charm.write('\n');
};
Runner.prototype.serverStart = function (server) {
if (this.executor.config.serveOnly) {
this.charm.write("To use the browser client, browse to\n\n " + this.executor.config.serverUrl + "__intern/\n\n");
this.charm.write('Press CTRL-C to stop serving\n\n');
}
else {
var message = "Listening on localhost:" + server.port;
if (server.socketPort) {
message += " (ws " + server.socketPort + ")";
}
this.charm.write(message + "\n");
}
};
Runner.prototype.suiteEnd = function (suite) {
var session = this.sessions[suite.sessionId || ''];
if (!session) {
if (!this.serveOnly) {
var charm_2 = this.charm;
charm_2.display('bright');
charm_2.foreground('yellow');
charm_2.write('BUG: suiteEnd was received for invalid session ' + suite.sessionId);
charm_2.display('reset');
charm_2.write('\n');
}
return;
}
if (suite.error) {
var error = suite.error;
var charm_3 = this.charm;
charm_3.foreground('red');
charm_3.write("Suite " + suite.id + " ERROR" + (error.lifecycleMethod ? " in " + error.lifecycleMethod : '') + "\n");
charm_3.write(this.formatError(error));
charm_3.display('reset');
charm_3.write('\n');
this.hasSuiteErrors = session.hasSuiteErrors = true;
}
else if (!suite.hasParent && this.executor.suites.length > 1) {
if (session.coverage) {
this.charm.write('\n');
this.createCoverageReport(this.reportType, session.coverage);
}
else {
var charm_4 = this.charm;
charm_4.write('No unit test coverage for ' + suite.name);
charm_4.display('reset');
charm_4.write('\n');
}
var name_1 = suite.name;
var hasError = suite.error || session.hasSuiteErrors;
var numTests = suite.numTests;
var numFailedTests = suite.numFailedTests;
var numSkippedTests = suite.numSkippedTests;
var numPassedTests = numTests - numFailedTests - numSkippedTests;
var summary = name_1 + ": " + numPassedTests + " passed, " + numFailedTests + " failed";
if (numSkippedTests) {
summary += ", " + numSkippedTests + " skipped";
}
if (hasError) {
summary += '; suite error occurred';
}
var charm_5 = this.charm;
charm_5.display('bright');
charm_5.foreground(numFailedTests || hasError > 0 ? 'red' : 'green');
charm_5.write(summary);
charm_5.display('reset');
charm_5.write('\n');
}
};
Runner.prototype.suiteStart = function (suite) {
if (!suite.hasParent) {
this.sessions[suite.sessionId || ''] = { suite: suite };
if (suite.sessionId) {
this.charm.write('\n');
this.charm.write('‣ Created remote session ' +
suite.name +
' (' +
suite.sessionId +
')\n');
}
}
};
Runner.prototype.testEnd = function (test) {
var charm = this.charm;
if (test.error) {
charm.foreground('red');
charm.write('× ' + test.id);
charm.write(' (' + test.timeElapsed / 1000 + 's)');
charm.write('\n');
charm.write(util_1.prefix(this.formatError(test.error), ' '));
charm.display('reset');
charm.write('\n\n');
}
else if (test.skipped) {
if (!this.hideSkipped) {
charm.write('~ ' + test.id);
charm.display('reset');
charm.write(' (' + (test.skipped || 'skipped') + ')');
charm.display('reset');
charm.write('\n');
}
}
else {
if (!this.hidePassed) {
charm.foreground('green');
charm.write('✓ ' + test.id);
charm.display('reset');
charm.write(' (' + test.timeElapsed / 1000 + 's)');
charm.display('reset');
charm.write('\n');
}
}
};
Runner.prototype.tunnelDownloadProgress = function (message) {
if (this.hideTunnelDownloadProgress) {
return;
}
var progress = message.progress;
this.charm.write('Tunnel download: ' +
((progress.received / progress.total) * 100).toFixed(3) +
'%\r');
};
Runner.prototype.tunnelStart = function (_) {
this.charm.write('Tunnel started\n');
};
Runner.prototype.tunnelStatus = function (message) {
this.charm.write(message.status + '\x1b[K\r');
};
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "coverage", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "deprecated", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "error", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "warning", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "log", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "runEnd", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "serverStart", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "suiteEnd", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "suiteStart", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "testEnd", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "tunnelDownloadProgress", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "tunnelStart", null);
tslib_1.__decorate([
eventHandler()
], Runner.prototype, "tunnelStatus", null);
return Runner;
}(TextCoverage_1.default));
exports.default = Runner;
});
//# sourceMappingURL=Runner.js.map