blob: a28ed9cad3db0d271c1e31853d2d313adff8ff55 [file] [log] [blame]
(function() {
if (! jasmine) {
throw new Exception("jasmine library does not exist in global namespace!");
}
/**
* Basic reporter that outputs spec results to the terminal.
* Use this reporter in your build pipeline.
*
* Usage:
*
* jasmine.getEnv().addReporter(new jasmine.TerminalReporter({
verbosity: 2,
color: true
}));
* jasmine.getEnv().execute();
*/
var DEFAULT_VERBOSITY = 2,
ATTRIBUTES_TO_ANSI = {
"off": 0,
"bold": 1,
"red": 31,
"green": 32
};
var TerminalReporter = function(params) {
var parameters = params || {};
if (parameters.verbosity === 0) {
this.verbosity = 0;
} else {
this.verbosity = parameters.verbosity || DEFAULT_VERBOSITY;
}
this.color = parameters.color;
this.started = false;
this.finished = false;
this.current_suite_hierarchy = [];
this.indent_string = ' ';
};
TerminalReporter.prototype = {
reportRunnerResults: function(runner) {
var dur = (new Date()).getTime() - this.start_time,
failed = this.executed_specs - this.passed_specs,
spec_str = this.executed_specs + (this.executed_specs === 1 ? " spec, " : " specs, "),
fail_str = failed + (failed === 1 ? " failure in " : " failures in "),
summary_str = spec_str + fail_str + (dur/1000) + "s.",
result_str = (failed && "FAILURE: " || "SUCCESS: ") + summary_str,
result_color = failed && "red+bold" || "green+bold";
if (this.verbosity === 2) {
this.log("");
}
if (this.verbosity > 0) {
this.log(this.inColor(result_str, result_color));
}
this.finished = true;
},
reportRunnerStarting: function(runner) {
this.started = true;
this.start_time = (new Date()).getTime();
this.executed_specs = 0;
this.passed_specs = 0;
},
reportSpecResults: function(spec) {
var color = "red";
if (spec.results().skipped) {
return;
}
if (spec.results().passed()) {
this.passed_specs++;
color = "green";
}
if (this.verbosity === 2) {
var resultText = 'F';
if (spec.results().passed()) {
resultText = '.';
}
this.log(this.inColor(resultText, color));
} else if (this.verbosity > 2) {
resultText = "Failed";
if (spec.results().passed()) {
resultText = 'Passed';
}
this.log(' ' + this.inColor(resultText, color));
}
if (!spec.results().passed()) {
if (this.verbosity === 2) {
this.log(" ");
this.log(this.indentWithCurrentLevel(this.indent_string + spec.getFullName()));
} else if (this.verbosity === 1) {
this.log(spec.getFullName());
}
var items = spec.results().getItems()
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item instanceof jasmine.ExpectationResult && !item.passed()) {
this.log(this.inColor(this.indentWithCurrentLevel(this.indent_string + this.indent_string + item.toString()), color));
}
}
}
},
reportSpecStarting: function(spec) {
this.executed_specs++;
if (this.verbosity > 2) {
this.logCurrentSuite(spec.suite);
this.log(this.indentWithCurrentLevel(this.indent_string + spec.description + ' ...'));
}
},
reportSuiteResults: function(suite) {
var results = suite.results(),
failed = results.totalCount - results.passedCount,
color = failed ? "red+bold" : "green+bold";
if (this.verbosity > 2) {
this.logCurrentSuite(suite);
this.log(this.indentWithCurrentLevel(this.inColor(results.passedCount + " of "
+ results.totalCount + " passed.", color)));
}
},
indentWithCurrentLevel: function(string) {
return new Array(this.current_suite_hierarchy.length).join(this.indent_string) + string;
},
recursivelyUpdateHierarchyUpToRootAndLogNewBranches: function(suite) {
var suite_path = [],
current_level;
if (suite.parentSuite != null) {
suite_path = this.recursivelyUpdateHierarchyUpToRootAndLogNewBranches(suite.parentSuite);
}
suite_path.push(suite);
current_level = suite_path.length - 1;
if (this.current_suite_hierarchy.length <= current_level
|| this.current_suite_hierarchy[current_level] !== suite) {
this.current_suite_hierarchy = suite_path.slice(0);
this.log(this.indentWithCurrentLevel(this.inColor(suite.description, "bold")));
}
return suite_path;
},
logCurrentSuite: function(suite) {
var suite_path = this.recursivelyUpdateHierarchyUpToRootAndLogNewBranches(suite);
// If we just popped down from a higher path, we need to update here
this.current_suite_hierarchy = suite_path;
},
inColor: function (string, color) {
var color_attributes = color && color.split("+"),
ansi_string = "",
i, attr;
if (! this.color || ! color_attributes) {
return string;
}
for(i = 0; i < color_attributes.length; i++) {
ansi_string += "\033[" + ATTRIBUTES_TO_ANSI[color_attributes[i]] + "m";
}
ansi_string += string + "\033[" + ATTRIBUTES_TO_ANSI["off"] + "m";
return ansi_string;
},
log: function(str) {
var console = jasmine.getGlobal().console;
if (console && console.log) {
console.log(str);
}
}
};
// export public
jasmine.TerminalReporter = TerminalReporter;
})();