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) {
|
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 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
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 |
|
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 |
|
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 |
|
121 | self.suiteStarted(suite);
|
122 | }
|
123 | currentSuite = suite._parent;
|
124 | };
|
125 | self.jasmineDone = function() {
|
126 | if (currentSuite) {
|
127 |
|
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 |
|
151 | exportObject.endTime = endTime;
|
152 | };
|
153 | };
|
154 | })(this);
|