240 lines
5.9 KiB
JavaScript
240 lines
5.9 KiB
JavaScript
module.exports = exports = ConsoleReporter;
|
|
|
|
var noopTimer = {
|
|
start: function(){},
|
|
elapsed: function(){ return 0; }
|
|
};
|
|
|
|
function ConsoleReporter() {
|
|
var print = function() {},
|
|
showColors = false,
|
|
timer = noopTimer,
|
|
jasmineCorePath = null,
|
|
printDeprecation = function() {},
|
|
specCount,
|
|
executableSpecCount,
|
|
failureCount,
|
|
failedSpecs = [],
|
|
pendingSpecs = [],
|
|
ansi = {
|
|
green: '\x1B[32m',
|
|
red: '\x1B[31m',
|
|
yellow: '\x1B[33m',
|
|
none: '\x1B[0m'
|
|
},
|
|
failedSuites = [],
|
|
stackFilter = defaultStackFilter,
|
|
onComplete = function() {};
|
|
|
|
this.setOptions = function(options) {
|
|
if (options.print) {
|
|
print = options.print;
|
|
}
|
|
showColors = options.showColors || false;
|
|
if (options.timer) {
|
|
timer = options.timer;
|
|
}
|
|
if (options.jasmineCorePath) {
|
|
jasmineCorePath = options.jasmineCorePath;
|
|
}
|
|
if (options.printDeprecation) {
|
|
printDeprecation = options.printDeprecation;
|
|
}
|
|
if (options.stackFilter) {
|
|
stackFilter = options.stackFilter;
|
|
}
|
|
|
|
if(options.onComplete) {
|
|
printDeprecation('Passing in an onComplete function to the ConsoleReporter is deprecated.');
|
|
onComplete = options.onComplete;
|
|
}
|
|
};
|
|
|
|
this.jasmineStarted = function(options) {
|
|
specCount = 0;
|
|
executableSpecCount = 0;
|
|
failureCount = 0;
|
|
if (options && options.order && options.order.random) {
|
|
print('Randomized with seed ' + options.order.seed);
|
|
printNewline();
|
|
}
|
|
print('Started');
|
|
printNewline();
|
|
timer.start();
|
|
};
|
|
|
|
this.jasmineDone = function(result) {
|
|
printNewline();
|
|
printNewline();
|
|
if(failedSpecs.length > 0) {
|
|
print('Failures:');
|
|
}
|
|
for (var i = 0; i < failedSpecs.length; i++) {
|
|
specFailureDetails(failedSpecs[i], i + 1);
|
|
}
|
|
|
|
if (pendingSpecs.length > 0) {
|
|
print("Pending:");
|
|
}
|
|
for(i = 0; i < pendingSpecs.length; i++) {
|
|
pendingSpecDetails(pendingSpecs[i], i + 1);
|
|
}
|
|
|
|
if(specCount > 0) {
|
|
printNewline();
|
|
|
|
if(executableSpecCount !== specCount) {
|
|
print('Ran ' + executableSpecCount + ' of ' + specCount + plural(' spec', specCount));
|
|
printNewline();
|
|
}
|
|
var specCounts = executableSpecCount + ' ' + plural('spec', executableSpecCount) + ', ' +
|
|
failureCount + ' ' + plural('failure', failureCount);
|
|
|
|
if (pendingSpecs.length) {
|
|
specCounts += ', ' + pendingSpecs.length + ' pending ' + plural('spec', pendingSpecs.length);
|
|
}
|
|
|
|
print(specCounts);
|
|
} else {
|
|
print('No specs found');
|
|
}
|
|
|
|
printNewline();
|
|
var seconds = timer.elapsed() / 1000;
|
|
print('Finished in ' + seconds + ' ' + plural('second', seconds));
|
|
printNewline();
|
|
|
|
for(i = 0; i < failedSuites.length; i++) {
|
|
suiteFailureDetails(failedSuites[i]);
|
|
}
|
|
|
|
if (result && result.failedExpectations) {
|
|
suiteFailureDetails(result);
|
|
}
|
|
|
|
if (result && result.order && result.order.random) {
|
|
print('Randomized with seed ' + result.order.seed);
|
|
printNewline();
|
|
}
|
|
|
|
onComplete(failureCount === 0);
|
|
};
|
|
|
|
this.specDone = function(result) {
|
|
specCount++;
|
|
|
|
if (result.status == 'pending') {
|
|
pendingSpecs.push(result);
|
|
executableSpecCount++;
|
|
print(colored('yellow', '*'));
|
|
return;
|
|
}
|
|
|
|
if (result.status == 'passed') {
|
|
executableSpecCount++;
|
|
print(colored('green', '.'));
|
|
return;
|
|
}
|
|
|
|
if (result.status == 'failed') {
|
|
failureCount++;
|
|
failedSpecs.push(result);
|
|
executableSpecCount++;
|
|
print(colored('red', 'F'));
|
|
}
|
|
};
|
|
|
|
this.suiteDone = function(result) {
|
|
if (result.failedExpectations && result.failedExpectations.length > 0) {
|
|
failureCount++;
|
|
failedSuites.push(result);
|
|
}
|
|
};
|
|
|
|
return this;
|
|
|
|
function printNewline() {
|
|
print('\n');
|
|
}
|
|
|
|
function colored(color, str) {
|
|
return showColors ? (ansi[color] + str + ansi.none) : str;
|
|
}
|
|
|
|
function plural(str, count) {
|
|
return count == 1 ? str : str + 's';
|
|
}
|
|
|
|
function repeat(thing, times) {
|
|
var arr = [];
|
|
for (var i = 0; i < times; i++) {
|
|
arr.push(thing);
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
function indent(str, spaces) {
|
|
var lines = (str || '').split('\n');
|
|
var newArr = [];
|
|
for (var i = 0; i < lines.length; i++) {
|
|
newArr.push(repeat(' ', spaces).join('') + lines[i]);
|
|
}
|
|
return newArr.join('\n');
|
|
}
|
|
|
|
function defaultStackFilter(stack) {
|
|
if (!stack) {
|
|
return '';
|
|
}
|
|
|
|
var filteredStack = stack.split('\n').filter(function(stackLine) {
|
|
return stackLine.indexOf(jasmineCorePath) === -1;
|
|
}).join('\n');
|
|
return filteredStack;
|
|
}
|
|
|
|
function specFailureDetails(result, failedSpecNumber) {
|
|
printNewline();
|
|
print(failedSpecNumber + ') ');
|
|
print(result.fullName);
|
|
|
|
for (var i = 0; i < result.failedExpectations.length; i++) {
|
|
var failedExpectation = result.failedExpectations[i];
|
|
printNewline();
|
|
print(indent('Message:', 2));
|
|
printNewline();
|
|
print(colored('red', indent(failedExpectation.message, 4)));
|
|
printNewline();
|
|
print(indent('Stack:', 2));
|
|
printNewline();
|
|
print(indent(stackFilter(failedExpectation.stack), 4));
|
|
}
|
|
|
|
printNewline();
|
|
}
|
|
|
|
function suiteFailureDetails(result) {
|
|
for (var i = 0; i < result.failedExpectations.length; i++) {
|
|
printNewline();
|
|
print(colored('red', 'An error was thrown in an afterAll'));
|
|
printNewline();
|
|
print(colored('red', 'AfterAll ' + result.failedExpectations[i].message));
|
|
|
|
}
|
|
printNewline();
|
|
}
|
|
|
|
function pendingSpecDetails(result, pendingSpecNumber) {
|
|
printNewline();
|
|
printNewline();
|
|
print(pendingSpecNumber + ') ');
|
|
print(result.fullName);
|
|
printNewline();
|
|
var pendingReason = "No reason given";
|
|
if (result.pendingReason && result.pendingReason !== '') {
|
|
pendingReason = result.pendingReason;
|
|
}
|
|
print(indent(colored('yellow', pendingReason), 2));
|
|
printNewline();
|
|
}
|
|
}
|