lib/nyanCat.js
'use strict';
var dataStore = require('./data/store');
var dataTypes = require('./data/types');
var drawUtil = require('./util/draw');
var printers = require('./util/printers');
var rainbowifier = require('./util/rainbowifier');
var shellUtil = require('./util/shell').getInstance();
var fs = require('fs');
/**
* NyanCat constructor
*/
function NyanCat(baseReporterDecorator, formatError, config) {
var self = this;
var defaultOptions = function() {
return {
suppressErrorReport: false,
suppressErrorHighlighting: false,
numberOfRainbowLines: 4,
renderOnRunCompleteOnly: false
};
};
self.options = defaultOptions();
if (config && config.nyanReporter) {
// merge defaults
Object.keys(self.options).forEach(function(optionName){
if (config.nyanReporter.hasOwnProperty(optionName)) {
self.options[optionName] = config.nyanReporter[optionName];
}
});
}
self.adapters = [fs.writeSync.bind(fs.writeSync, 1)];
dataTypes.setErrorFormatterMethod(formatError);
if (self.options.suppressErrorHighlighting) {
dataTypes.suppressErrorHighlighting();
}
}
NyanCat.prototype.reset = function() {
var numOfLines = this.options.numberOfRainbowLines;
this.allResults = {};
this._browsers = [];
this.browser_logs = {};
this.browserErrors = [];
this.colorIndex = 0;
this.dataStore = dataStore.getInstance();
this.drawUtil = drawUtil.getInstance(numOfLines);
this.rainbowifier = rainbowifier.getInstance();
this.stats = {};
this.totalTime = 0;
this.numberOfSlowTests = 0;
};
/**
* Draw the nyan cat
*
* @api private
*/
NyanCat.prototype.draw = function(appendOnly){
this.drawUtil.appendRainbow(this.rainbowifier);
if (!appendOnly) {
this.drawUtil.drawScoreboard(this.stats);
this.drawUtil.drawRainbow();
this.drawUtil.drawNyanCat(this.stats);
}
this.drawUtil.tick = !this.drawUtil.tick;
};
/*******************************************************/
/*************** Karma LifeCycle Mehtods ***************/
/*******************************************************/
/**
* onRunStart - karma api method
*
* called at the beginning of each test run
*/
NyanCat.prototype.onRunStart = function (browsers) {
shellUtil.cursor.hide();
this.reset();
this.numberOfBrowsers = (browsers || []).length;
printers.write('\n');
};
/**
* onBrowserLog - karma api method
*
* called each time a browser encounters a
* console message (console.log, console.info, etc...)
*/
NyanCat.prototype.onBrowserLog = function(browser, log) {
if (!this.browser_logs[browser.id]) {
this.browser_logs[browser.id] = {
name: browser.name,
log_messages: []
};
}
this.browser_logs[browser.id].log_messages.push(log);
};
/**
* onSpecComplete - karma api method
*
* called when each test finishes
*/
NyanCat.prototype.onSpecComplete = function(browser, result) {
// don't pollute original object
this.stats = Object.create(browser.lastResult);
// sum up tests stats
var testStats = {
success: 0,
failed: 0,
skipped: 0,
total: 0
};
var matched = this._browsers.some(function(br, idx, all) {
if (all[idx].id === browser.id) {
return all.splice(idx, 1, browser);
}
});
if (!matched) {
this._browsers.push(browser);
}
this._browsers.forEach(function(br) {
Object.keys(testStats).forEach(function(prop) {
testStats[prop] += br.lastResult[prop];
});
});
var self = this;
Object.keys(testStats).forEach(function (prop) {
self.stats[prop] = testStats[prop];
});
if (!this.options.suppressErrorReport) {
this.dataStore.save(browser, result);
}
this.draw(this.options.renderOnRunCompleteOnly);
};
/**
* onRunComplete - karma api method
*
* called either when a browser encounters
* an error or when all tests have run
*/
NyanCat.prototype.onRunComplete = function() {
this.draw();
if (this.browserErrors.length) {
printers.printRuntimeErrors(this.rainbowifier.rainbowify, this.browserErrors);
} else {
this.drawUtil.fillWithNewlines();
printers.printTestFailures(this.dataStore.getData(), this.options.suppressErrorReport);
printers.printStats(this.stats);
printers.printBrowserLogs(this.browser_logs);
}
shellUtil.cursor.show();
};
/**
* onBrowserStart - karma api method
*
* called when each browser is launched
*/
NyanCat.prototype.onBrowserStart = function (browser) {
this._browsers.push(browser);
this.numberOfBrowsers = this._browsers.length;
};
/**
* onBrowserError - karma api method
*
* called when a browser encounters a compilation
* error at runtime
*/
NyanCat.prototype.onBrowserError = function(browser, error) {
this.browserErrors.push({'browser': browser, 'error': error});
};
exports.NyanCat = NyanCat;