74 lines
1.4 KiB
JavaScript
74 lines
1.4 KiB
JavaScript
|
|
||
|
/**
|
||
|
* Module dependencies.
|
||
|
*/
|
||
|
|
||
|
var Base = require('./base')
|
||
|
, utils = require('../utils');
|
||
|
|
||
|
/**
|
||
|
* Expose `Doc`.
|
||
|
*/
|
||
|
|
||
|
exports = module.exports = Doc;
|
||
|
|
||
|
/**
|
||
|
* Initialize a new `Doc` reporter.
|
||
|
*
|
||
|
* @param {Runner} runner
|
||
|
* @api public
|
||
|
*/
|
||
|
|
||
|
function Doc(runner) {
|
||
|
Base.call(this, runner);
|
||
|
|
||
|
var self = this
|
||
|
, stats = this.stats
|
||
|
, total = runner.total
|
||
|
, indents = 2;
|
||
|
|
||
|
function indent() {
|
||
|
return Array(indents).join(' ');
|
||
|
}
|
||
|
|
||
|
runner.on('suite', function(suite){
|
||
|
if (suite.root) return;
|
||
|
++indents;
|
||
|
console.log('%s<section class="suite">', indent());
|
||
|
++indents;
|
||
|
console.log('%s<h1>%s</h1>', indent(), suite.title);
|
||
|
console.log('%s<dl>', indent());
|
||
|
});
|
||
|
|
||
|
runner.on('suite end', function(suite){
|
||
|
if (suite.root) return;
|
||
|
console.log('%s</dl>', indent());
|
||
|
--indents;
|
||
|
console.log('%s</section>', indent());
|
||
|
--indents;
|
||
|
});
|
||
|
|
||
|
runner.on('pass', function(test){
|
||
|
console.log('%s <dt>%s</dt>', indent(), test.title);
|
||
|
var code = utils.escape(clean(test.fn.toString()));
|
||
|
console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Strip the function definition from `str`,
|
||
|
* and re-indent for pre whitespace.
|
||
|
*/
|
||
|
|
||
|
function clean(str) {
|
||
|
str = str
|
||
|
.replace(/^function *\(.*\) *{/, '')
|
||
|
.replace(/\s+\}$/, '');
|
||
|
|
||
|
var spaces = str.match(/^\n?( *)/)[1].length
|
||
|
, re = new RegExp('^ {' + spaces + '}', 'gm');
|
||
|
|
||
|
str = str.replace(re, '');
|
||
|
|
||
|
return str;
|
||
|
}
|