123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /**
- * Module dependencies.
- */
- var Base = require('./base')
- , utils = require('../utils')
- , escape = utils.escape;
- /**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
- var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
- /**
- * 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('pass', function(test){
- tests.push(test);
- });
- runner.on('fail', 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
- , skipped: stats.tests - stats.failures - stats.passes
- , timestamp: (new Date).toUTCString()
- , time: (stats.duration / 1000) || 0
- }, 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 ('failed' == test.state) {
- 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) + ']]>';
- }
|