(function() { "use strict"; function getJasmineRequireObj() { if (typeof module !== "undefined" && module.exports) { return exports; } else { window.jasmineRequire = window.jasmineRequire || {}; return window.jasmineRequire; } } if (typeof getJasmineRequireObj() == 'undefined') { throw new Error("jasmine 2.0 must be loaded before jasmine-junit"); } getJasmineRequireObj().JUnitXmlReporter = function() { function JUnitXmlReporter(options) { var runStartTime; var specStartTime; var suiteLevel = -1; var suites = [] var currentSuite; var totalNumberOfSpecs; var totalNumberOfFailures; this.jasmineStarted = function(started) { totalNumberOfSpecs = started.totalSpecsDefined; runStartTime = new Date(); }; this.jasmineDone = function() { console.log('Jasmine ran in ', elapsed(runStartTime, new Date()), ' seconds') window.done = true }; this.suiteStarted = function(result) { suiteLevel++; if (suiteLevel == 0) { totalNumberOfSpecs = 0; totalNumberOfFailures = 0; suites.push(result); currentSuite = result; currentSuite.startTime = new Date(); currentSuite.noOfSpecs = 0; currentSuite.noOfFails = 0; currentSuite.specs = []; } }; this.suiteDone = function(result) { if (suiteLevel == 0) { currentSuite.endTime = new Date(); writeFile('.', descToFilename(result.description), suiteToJUnitXml(currentSuite)) } suiteLevel--; }; this.specStarted = function(result) { specStartTime = new Date(); }; this.specDone = function(result) { totalNumberOfSpecs++; if (isFailed(result)) { currentSuite.noOfFails++; } result.startTime = specStartTime; result.endTime = new Date(); currentSuite.specs.push(result); currentSuite.noOfSpecs++; }; return this; } return JUnitXmlReporter; }; function isFailed(result) { return result.status === 'failed' } function isSkipped(result) { return result.status === 'pending' } function suiteToJUnitXml(suite) { var resultXml = '\n'; resultXml += '\n'; resultXml += '\t\n' for (var i = 0; i < suite.specs.length; i++) { resultXml += specToJUnitXml(suite.specs[i], suite.id); } resultXml += '\t\n\n\n' return resultXml; } function specToJUnitXml(spec, suiteId) { var xml = '\t\t\n'; if (isSkipped(spec)) { xml += '\t\t\t\n'; } if (isFailed(spec)) { xml += failedToJUnitXml(spec.failedExpectations) } xml += '\t\t\n' return xml; } function failedToJUnitXml(failedExpectations) { var failure; var failureXml = "" for (var i = 0; i < failedExpectations.length; i++) { failure = failedExpectations[i]; failureXml += '\t\t\t\n'; failureXml += escapeInvalidXmlChars(failure.stack || failure.message); failureXml += "\t\t\t\n"; } return failureXml; } function descToFilename(desc) { return 'TEST-' + desc + '.xml'; } function ISODateString(d) { function pad(n) { return n < 10 ? '0' + n : n; } return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + 'T' + pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds()); } function elapsed(startTime, endTime) { return (endTime - startTime) / 1000; } function trim(str) { return str.replace(/^\s+/, "").replace(/\s+$/, ""); } function escapeInvalidXmlChars(str) { return str.replace(//g, ">") .replace(/\"/g, """) .replace(/\'/g, "'") .replace(/\&/g, "&"); } function writeFile(path, filename, text) { function getQualifiedFilename(separator) { if (path && path.substr(-1) !== separator && filename.substr(0) !== separator) { path += separator; } return path + filename; } // PhantomJS if(typeof(__phantom_writeFile) !== 'undefined') { try { // turn filename into a qualified path filename = getQualifiedFilename(window.fs_path_separator); // function injected by jasmine-runner.js __phantom_writeFile(filename, text); return; } catch (error) { console.log('Error writing file', error) } } // Node.js if(typeof(global) !== 'undefined') { try { var fs = require("fs"); var nodejs_path = require("path"); var fd = fs.openSync(nodejs_path.join(path, filename), "w"); fs.writeSync(fd, text, 0); fs.closeSync(fd); return; } catch (error) { console.log('Error writing file', error) } } } })()