You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
1.9 KiB
101 lines
1.9 KiB
|
|
/** |
|
* Module dependencies. |
|
*/ |
|
|
|
var Base = require('./base') |
|
, utils = require('../utils') |
|
, escape = utils.escape; |
|
|
|
/** |
|
* Expose `XUnit`. |
|
*/ |
|
|
|
exports = module.exports = XUnit; |
|
|
|
/** |
|
* Initialize a new `XUnit` reporter. |
|
* |
|
* @param {Runner} runner |
|
* @api public |
|
*/ |
|
|
|
function XUnit(runner) { |
|
Base.call(this, runner); |
|
var stats = this.stats |
|
, tests = [] |
|
, self = this; |
|
|
|
runner.on('test end', function(test){ |
|
tests.push(test); |
|
}); |
|
|
|
runner.on('end', function(){ |
|
console.log(tag('testsuite', { |
|
name: 'Mocha Tests' |
|
, tests: stats.tests |
|
, failures: stats.failures |
|
, errors: stats.failures |
|
, skip: stats.tests - stats.failures - stats.passes |
|
, timestamp: (new Date).toUTCString() |
|
, time: stats.duration / 1000 |
|
}, false)); |
|
|
|
tests.forEach(test); |
|
console.log('</testsuite>'); |
|
}); |
|
} |
|
|
|
/** |
|
* Inherit from `Base.prototype`. |
|
*/ |
|
|
|
XUnit.prototype.__proto__ = Base.prototype; |
|
|
|
/** |
|
* Output tag for the given `test.` |
|
*/ |
|
|
|
function test(test) { |
|
var attrs = { |
|
classname: test.parent.fullTitle() |
|
, name: test.title |
|
, time: test.duration / 1000 |
|
}; |
|
|
|
if (test.failed) { |
|
var err = test.err; |
|
attrs.message = escape(err.message); |
|
console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); |
|
} else if (test.pending) { |
|
console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); |
|
} else { |
|
console.log(tag('testcase', attrs, true) ); |
|
} |
|
} |
|
|
|
/** |
|
* HTML tag helper. |
|
*/ |
|
|
|
function tag(name, attrs, close, content) { |
|
var end = close ? '/>' : '>' |
|
, pairs = [] |
|
, tag; |
|
|
|
for (var key in attrs) { |
|
pairs.push(key + '="' + escape(attrs[key]) + '"'); |
|
} |
|
|
|
tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; |
|
if (content) tag += content + '</' + name + end; |
|
return tag; |
|
} |
|
|
|
/** |
|
* Return cdata escaped CDATA `str`. |
|
*/ |
|
|
|
function cdata(str) { |
|
return '<![CDATA[' + escape(str) + ']]>'; |
|
}
|
|
|