UNPKG

5.88 kBJavaScriptView Raw
1(function(global) {
2 var UNDEFINED,
3 exportObject;
4
5 if (typeof module !== "undefined" && module.exports) {
6 exportObject = exports;
7 } else {
8 exportObject = global.jasmineReporters = global.jasmineReporters || {};
9 }
10
11 function trim(str) { return str.replace(/^\s+/, "").replace(/\s+$/, ""); }
12 function elapsed(start, end) { return (end - start)/1000; }
13 function isFailed(obj) { return obj.status === "failed"; }
14 function isSkipped(obj) { return obj.status === "pending"; }
15 function isDisabled(obj) { return obj.status === "disabled"; }
16 function extend(dupe, obj) { // performs a shallow copy of all props of `obj` onto `dupe`
17 for (var prop in obj) {
18 if (obj.hasOwnProperty(prop)) {
19 dupe[prop] = obj[prop];
20 }
21 }
22 return dupe;
23 }
24 function log(str) {
25 var con = global.console || console;
26 if (con && con.log) {
27 con.log(str);
28 }
29 }
30
31
32 /**
33 * TAP (http://en.wikipedia.org/wiki/Test_Anything_Protocol) reporter.
34 * outputs spec results to the console.
35 *
36 * Usage:
37 *
38 * jasmine.getEnv().addReporter(new jasmineReporters.TapReporter());
39 */
40 exportObject.TapReporter = function() {
41 var self = this;
42 self.started = false;
43 self.finished = false;
44
45 var startTime,
46 endTime,
47 currentSuite = null,
48 totalSpecsExecuted = 0,
49 totalSpecsSkipped = 0,
50 totalSpecsDisabled = 0,
51 totalSpecsFailed = 0,
52 totalSpecsDefined,
53 // when use use fit, jasmine never calls suiteStarted / suiteDone, so make a fake one to use
54 fakeFocusedSuite = {
55 id: "focused",
56 description: "focused specs",
57 fullName: "focused specs"
58 };
59
60 var __suites = {}, __specs = {};
61 function getSuite(suite) {
62 __suites[suite.id] = extend(__suites[suite.id] || {}, suite);
63 return __suites[suite.id];
64 }
65 function getSpec(spec, suite) {
66 __specs[spec.id] = extend(__specs[spec.id] || {}, spec);
67 var ret = __specs[spec.id];
68 if (suite && !ret._suite) {
69 ret._suite = suite;
70 }
71 return ret;
72 }
73
74 self.jasmineStarted = function(summary) {
75 log("TAP version 13");
76 self.started = true;
77 totalSpecsDefined = summary && summary.totalSpecsDefined || NaN;
78 startTime = exportObject.startTime = new Date();
79 };
80 self.suiteStarted = function(suite) {
81 suite = getSuite(suite);
82 currentSuite = suite;
83 };
84 self.specStarted = function() {
85 if (!currentSuite) {
86 // focused spec (fit) -- suiteStarted was never called
87 self.suiteStarted(fakeFocusedSuite);
88 }
89 totalSpecsExecuted++;
90 };
91 self.specDone = function(spec) {
92 spec = getSpec(spec, currentSuite);
93 var resultStr = "ok " + totalSpecsExecuted + " - " + spec._suite.description + " : " + spec.description;
94 if (isFailed(spec)) {
95 totalSpecsFailed++;
96 resultStr = "not " + resultStr;
97 for (var i = 0, failure; i < spec.failedExpectations.length; i++) {
98 failure = spec.failedExpectations[i];
99 resultStr += "\n # Failure: " + trim(failure.message);
100 if (failure.stack && failure.stack !== failure.message) {
101 resultStr += "\n # === STACK TRACE ===";
102 resultStr += "\n # " + failure.stack.replace(/\n/mg, "\n # ");
103 resultStr += "\n # === END STACK TRACE ===";
104 }
105 }
106 }
107 if (isSkipped(spec)) {
108 totalSpecsSkipped++;
109 resultStr += " # SKIP disabled by xit or similar";
110 }
111 if (isDisabled(spec)) {
112 totalSpecsDisabled++;
113 resultStr += " # SKIP disabled by xit, ?spec=xyz or similar";
114 }
115 log(resultStr);
116 };
117 self.suiteDone = function(suite) {
118 suite = getSuite(suite);
119 if (suite._parent === UNDEFINED) {
120 // disabled suite (xdescribe) -- suiteStarted was never called
121 self.suiteStarted(suite);
122 }
123 currentSuite = suite._parent;
124 };
125 self.jasmineDone = function() {
126 if (currentSuite) {
127 // focused spec (fit) -- suiteDone was never called
128 self.suiteDone(fakeFocusedSuite);
129 }
130 endTime = new Date();
131 var dur = elapsed(startTime, endTime),
132 totalSpecs = totalSpecsDefined || totalSpecsExecuted,
133 disabledSpecs = totalSpecs - totalSpecsExecuted + totalSpecsDisabled;
134
135 if (totalSpecsExecuted === 0) {
136 log("1..0 # All tests disabled");
137 } else {
138 log("1.." + totalSpecsExecuted);
139 }
140 var diagStr = "#";
141 diagStr = "# " + totalSpecs + " spec" + (totalSpecs === 1 ? "" : "s");
142 diagStr += ", " + totalSpecsFailed + " failure" + (totalSpecsFailed === 1 ? "" : "s");
143 diagStr += ", " + totalSpecsSkipped + " skipped";
144 diagStr += ", " + disabledSpecs + " disabled";
145 diagStr += " in " + dur + "s.";
146 log(diagStr);
147 log("# NOTE: disabled specs are usually a result of xdescribe.");
148
149 self.finished = true;
150 // this is so phantomjs-testrunner.js can tell if we're done executing
151 exportObject.endTime = endTime;
152 };
153 };
154})(this);