Skip to content

Commit

Permalink
use functional inheritancefor assertion lists, remove use of new oper…
Browse files Browse the repository at this point in the history
…ator
  • Loading branch information
Caolan McMahon committed Mar 18, 2010
1 parent 3e8710a commit 4bda34b
Showing 1 changed file with 41 additions and 53 deletions.
94 changes: 41 additions & 53 deletions lib/nodeunit.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,56 +5,61 @@ var assert = require('assert'),

exports.testrunner = require('./testrunner');

var Assertion = function(method, message, error){
var assertion = function(obj){
return {
method: method,
message: message || '',
error: error,
passed: function(){return !error;},
failed: function(){return Boolean(error);}
method: obj.method || '',
message: obj.message || (obj.error && obj.error.message) || '',
error: obj.error,
passed: function(){return !this.error;},
failed: function(){return Boolean(this.error);}
};
};

var TestEnv = function(start, options){
var assertions = function(arr, duration){
var that = arr || [];
that.__defineGetter__('failures', function(){
return this.reduce(function(a,x){
return x.failed() ? a+1 : a;
}, 0);
});
that.duration = duration || 0;
return that;
};

var testEnv = function(start, options){
var expecting;
var assertions = [];
var a_list = [];
options.log = options.log || function(){}; // log callback optional

var wrapAssert = function(new_method, assert_method){
return function(){
try {
assert[assert_method].apply(global, arguments);
var message = arguments[arguments.length-1];
var assertion = new Assertion(new_method, message);
var a = assertion({method:new_method, message:message});
}
catch (e){
var assertion = new Assertion(new_method, e.message || '', e);
var a = assertion({method:new_method, error:e});
}
assertions.push(assertion);
process.nextTick(function(){options.log(assertion)});
a_list.push(a);
process.nextTick(function(){options.log(a)});
};
};

return {
done: function(){
if(expecting !== undefined && expecting != assertions.length){
if(expecting !== undefined && expecting != a_list.length){
var err = new Error(
'Expected ' + expecting + ' assertions, ' +
assertions.length + ' ran'
a_list.length + ' ran'
);
var assertion = new Assertion('expect', err.message, err);
assertions.push(assertion);
process.nextTick(function(){options.log(assertion);});
var a = assertion({method:'expect', error:err});
a_list.push(a);
process.nextTick(function(){options.log(a);});
}
var end = new Date().getTime();
assertions.__defineGetter__('failures', function(){
return this.reduce(function(a,x){
return x.failed() ? a+1 : a;
}, 0);
});
assertions.duration = end - start;
process.nextTick(function(){
options.testDone(options.name, assertions);
options.testDone(options.name, assertions(a_list, end-start));
});
},
ok: wrapAssert('ok', 'ok'),
Expand All @@ -71,17 +76,14 @@ exports.runTest = function(fn, options){
options.log = options.log || function(){}; // log callback optional
var start = new Date().getTime();
try {
fn(new TestEnv(start, options));
fn(testEnv(start, options));
}
catch (e){
var end = new Date().getTime();
var assertion = new Assertion('', e.message || '', e);
var assertions = [assertion];
assertions.failures = 1;
assertions.duration = end - start;
process.nextTick(function(){options.log(assertion)});
var a = assertion({error:e});
process.nextTick(function(){options.log(a)});
process.nextTick(function(){
options.testDone(options.name, assertions);
options.testDone(options.name, assertions([a], end-start));
});
}
};
Expand All @@ -97,24 +99,18 @@ exports.runModule = function(mod, options){
exports.runTest(mod[testname], {
name: testname,
log: options.log,
testDone: function(name, assertions){
m_assertions = m_assertions.concat(assertions);
(options.testDone || function(){})(name, assertions);
testDone: function(name, a_list){
m_assertions = m_assertions.concat(a_list);
(options.testDone || function(){})(name, a_list);

i++;
if(i < tests.length){
_fn(tests[i]);
}
else {
var end = new Date().getTime();
m_assertions.__defineGetter__('failures', function(){
return this.reduce(function(a,x){
return x.failed() ? a+1 : a;
}, 0);
});
m_assertions.duration = end - start;
(options.moduleDone || function(){})(
options.name, m_assertions
options.name, assertions(m_assertions, end-start)
)
}
}
Expand All @@ -129,9 +125,7 @@ exports.runFiles = function(paths, options){
var start = new Date().getTime();

if(!paths.length){
all_assertions.failures = 0;
all_assertions.duration = 0;
return options.done(all_assertions);
return options.done(assertions(all_assertions));
}

var files = paths.reduce(function(a,p){
Expand All @@ -157,22 +151,16 @@ exports.runFiles = function(paths, options){
moduleStart: options.moduleStart,
testStart: options.testStart,
testDone: options.testDone,
moduleDone: function(name, assertions){
all_assertions = all_assertions.concat(assertions);
moduleDone: function(name, a_list){
all_assertions = all_assertions.concat(a_list);
(options.moduleDone || function(){}).apply(global, arguments);
i++;
if(i < files.length){
_fn(files[i]);
}
else {
var end = new Date().getTime();
all_assertions.__defineGetter__('failures', function(){
return this.reduce(function(a,x){
return x.failed() ? a+1 : a;
}, 0);
});
all_assertions.duration = end - start;
options.done(all_assertions);
options.done(assertions(all_assertions, end-start));
}
}
});
Expand Down

0 comments on commit 4bda34b

Please sign in to comment.