Socket
Socket
Sign inDemoInstall

nodeunit

Package Overview
Dependencies
Maintainers
1
Versions
48
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nodeunit - npm Package Compare versions

Comparing version 0.5.5 to 0.6.0

dist/browser/test/test-testcase-legacy.js

8

CONTRIBUTORS.md

@@ -33,2 +33,6 @@ Nodeunit contributors (sorted alphabeticaly)

* **[Λlisue](https://github.com/lambdalisue)**
* Add machineout reporter
* **[Matthias Lübken](https://github.com/luebken)**

@@ -60,3 +64,7 @@

* **[Maciej Małecki](https://github.com/mmalecki)**
* Removal of `testCase`
**[Full contributors list](https://github.com/caolan/nodeunit/contributors).**

4

deps/json2.js

@@ -162,5 +162,3 @@ /*

if (!this.JSON) {
this.JSON = {};
}
var JSON = {};

@@ -167,0 +165,0 @@ (function () {

@@ -174,5 +174,3 @@ /*!

if (!this.JSON) {
this.JSON = {};
}
var JSON = {};

@@ -1139,2 +1137,5 @@ (function () {

if(Object.keys) return Object.keys(obj);
if (typeof obj != 'object' && typeof obj != 'function') {
throw new TypeError('-');
}
var keys = [];

@@ -1294,2 +1295,10 @@ for(var k in obj){

// 7.2.1 If the expcted value is a RegExp object, the actual value is
// equivalent if it is also a RegExp object that refers to the same source and options
} else if (actual instanceof RegExp && expected instanceof RegExp) {
return actual.source === expected.source &&
actual.global === expected.global &&
actual.ignoreCase === expected.ignoreCase &&
actual.multiline === expected.multiline;
// 7.3. Other pairs that do not both pass typeof value == "object",

@@ -1721,2 +1730,3 @@ // equivalence is determined by ==.

exports.runSuite = function (name, suite, opt, callback) {
suite = wrapGroup(suite);
var keys = _keys(suite);

@@ -1772,2 +1782,5 @@

var _moduleStart = options.moduleStart;
mod = wrapGroup(mod);
function run_once() {

@@ -1787,2 +1800,5 @@ if (!_run) {

options.moduleDone(name, assertion_list);
if (nodeunit.complete) {
nodeunit.complete(name, assertion_list);
}
callback(null, a_list);

@@ -1866,21 +1882,51 @@ });

/**
* Returns a serial callback from two functions.
*
* @param {Function} funcFirst
* @param {Function} funcSecond
* @api private
*/
var getSerialCallback = function (funcFirst, funcSecond) {
if (!(funcFirst && funcSecond))
return funcSecond || funcFirst;
return function (callback) {
funcFirst(function () {
funcSecond(callback);
});
};
}
/**
* Wraps a group of tests with setUp and tearDown functions.
* Used by testCase.
*
* @param {Function} setUp
* @param {Function} tearDown
* @param {Object} group
* @param {Function} parentSetUp
* @param {Function} parentTearDown
* @api private
*/
var wrapGroup = function (setUp, tearDown, group) {
var wrapGroup = function (group, parentSetUp, parentTearDown) {
var tests = {};
var setUp = group.setUp;
var tearDown = group.tearDown;
delete group.setUp;
delete group.tearDown;
var keys = _keys(group);
for (var i = 0; i < keys.length; i += 1) {
var k = keys[i];
if (typeof group[k] === 'function') {
tests[k] = wrapTest(setUp, tearDown, group[k]);
tests[k] = wrapTest(
getSerialCallback(parentSetUp, setUp),
getSerialCallback(tearDown, parentTearDown),
group[k]
);
}
else if (typeof group[k] === 'object') {
tests[k] = wrapGroup(setUp, tearDown, group[k]);
tests[k] = wrapGroup(group[k], setUp, tearDown);
}

@@ -1893,16 +1939,7 @@ }

/**
* Utility for wrapping a suite of test functions with setUp and tearDown
* functions.
*
* @param {Object} suite
* @return {Object}
* @api public
* Backwards compatibility for test suites using old testCase API
*/
exports.testCase = function (suite) {
var setUp = suite.setUp;
var tearDown = suite.tearDown;
delete suite.setUp;
delete suite.tearDown;
return wrapGroup(setUp, tearDown, suite);
return suite;
};

@@ -1943,3 +1980,5 @@ })(core);

exports.run = function (modules, options) {
var start = new Date().getTime();
var start = new Date().getTime(), div;
options = options || {};
div = options.div || document.body;

@@ -1960,3 +1999,3 @@ function setText(el, txt) {

el.id = id;
document.body.appendChild(el);
div.appendChild(el);
}

@@ -1963,0 +2002,0 @@ return el;

@@ -11,2 +11,2 @@ /*!

* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
*/nodeunit=function(){this.JSON||(this.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c<f;c+=1)h[c]=str(c,i)||"null";return e=h.length===0?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]",gap=g,e}if(rep&&typeof rep=="object"){f=rep.length;for(c=0;c<f;c+=1)d=rep[c],typeof d=="string"&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e))}else for(d in i)Object.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e));return e=h.length===0?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}",gap=g,e}}"use strict",typeof Date.prototype.toJSON!="function"&&(Date.prototype.toJSON=function(a){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(a){return this.valueOf()});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;typeof JSON.stringify!="function"&&(JSON.stringify=function(a,b,c){var d;gap="",indent="";if(typeof c=="number")for(d=0;d<c;d+=1)indent+=" ";else typeof c=="string"&&(indent=c);rep=b;if(!b||typeof b=="function"||typeof b=="object"&&typeof b.length=="number")return str("",{"":a});throw new Error("JSON.stringify")}),typeof JSON.parse!="function"&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&typeof e=="object")for(c in e)Object.hasOwnProperty.call(e,c)&&(d=walk(e,c),d!==undefined?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),typeof reviver=="function"?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();var assert=this.assert={},types={},core={},nodeunit={},reporter={};return function(){var a={},b=this,c=b.async;typeof module!="undefined"&&module.exports?module.exports=a:b.async=a,a.noConflict=function(){return b.async=c,a};var d=function(a,b){if(a.forEach)return a.forEach(b);for(var c=0;c<a.length;c+=1)b(a[c],c,a)},e=function(a,b){if(a.map)return a.map(b);var c=[];return d(a,function(a,d,e){c.push(b(a,d,e))}),c},f=function(a,b,c){return a.reduce?a.reduce(b,c):(d(a,function(a,d,e){c=b(c,a,d,e)}),c)},g=function(a){if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},h=function(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0;c<a.length;c+=1)if(a[c]===b)return c;return-1};typeof process=="undefined"||!process.nextTick?a.nextTick=function(a){setTimeout(a,0)}:a.nextTick=process.nextTick,a.forEach=function(a,b,c){if(!a.length)return c();var e=0;d(a,function(d){b(d,function(b){b?(c(b),c=function(){}):(e+=1,e===a.length&&c())})})},a.forEachSeries=function(a,b,c){if(!a.length)return c();var d=0,e=function(){b(a[d],function(b){b?(c(b),c=function(){}):(d+=1,d===a.length?c():e())})};e()};var i=function(b){return function(){var c=Array.prototype.slice.call(arguments);return b.apply(null,[a.forEach].concat(c))}},j=function(b){return function(){var c=Array.prototype.slice.call(arguments);return b.apply(null,[a.forEachSeries].concat(c))}},k=function(a,b,c,d){var f=[];b=e(b,function(a,b){return{index:b,value:a}}),a(b,function(a,b){c(a.value,function(c,d){f[a.index]=d,b(c)})},function(a){d(a,f)})};a.map=i(k),a.mapSeries=j(k),a.reduce=function(b,c,d,e){a.forEachSeries(b,function(a,b){d(c,a,function(a,d){c=d,b(a)})},function(a){e(a,c)})},a.inject=a.reduce,a.foldl=a.reduce,a.reduceRight=function(b,c,d,f){var g=e(b,function(a){return a}).reverse();a.reduce(g,c,d,f)},a.foldr=a.reduceRight;var l=function(a,b,c,d){var f=[];b=e(b,function(a,b){return{index:b,value:a}}),a(b,function(a,b){c(a.value,function(c){c&&f.push(a),b()})},function(a){d(e(f.sort(function(a,b){return a.index-b.index}),function(a){return a.value}))})};a.filter=i(l),a.filterSeries=j(l),a.select=a.filter,a.selectSeries=a.filterSeries;var m=function(a,b,c,d){var f=[];b=e(b,function(a,b){return{index:b,value:a}}),a(b,function(a,b){c(a.value,function(c){c||f.push(a),b()})},function(a){d(e(f.sort(function(a,b){return a.index-b.index}),function(a){return a.value}))})};a.reject=i(m),a.rejectSeries=j(m);var n=function(a,b,c,d){a(b,function(a,b){c(a,function(c){c?d(a):b()})},function(a){d()})};a.detect=i(n),a.detectSeries=j(n),a.some=function(b,c,d){a.forEach(b,function(a,b){c(a,function(a){a&&(d(!0),d=function(){}),b()})},function(a){d(!1)})},a.any=a.some,a.every=function(b,c,d){a.forEach(b,function(a,b){c(a,function(a){a||(d(!1),d=function(){}),b()})},function(a){d(!0)})},a.all=a.every,a.sortBy=function(b,c,d){a.map(b,function(a,b){c(a,function(c,d){c?b(c):b(null,{value:a,criteria:d})})},function(a,b){if(a)return d(a);var c=function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0};d(null,e(b.sort(c),function(a){return a.value}))})},a.auto=function(a,b){b=b||function(){};var c=g(a);if(!c.length)return b(null);var e=[],i=[],j=function(a){i.unshift(a)},k=function(a){for(var b=0;b<i.length;b+=1)if(i[b]===a){i.splice(b,1);return}},l=function(){d(i,function(a){a()})};j(function(){e.length===c.length&&b(null)}),d(c,function(c){var d=a[c]instanceof Function?[a[c]]:a[c],g=function(a){a?(b(a),b=function(){}):(e.push(c),l())},i=d.slice(0,Math.abs(d.length-1))||[],m=function(){return f(i,function(a,b){return a&&h(e,b)!==-1},!0)};if(m())d[d.length-1](g);else{var n=function(){m()&&(k(n),d[d.length-1](g))};j(n)}})},a.waterfall=function(b,c){if(!b.length)return c();c=c||function(){};var d=function(b){return function(e){if(e)c(e),c=function(){};else{var f=Array.prototype.slice.call(arguments,1),g=b.next();g?f.push(d(g)):f.push(c),a.nextTick(function(){b.apply(null,f)})}}};d(a.iterator(b))()},a.parallel=function(b,c){c=c||function(){};if(b.constructor===Array)a.map(b,function(a,b){a&&a(function(a){var c=Array.prototype.slice.call(arguments,1);c.length<=1&&(c=c[0]),b.call(null,a,c||null)})},c);else{var d={};a.forEach(g(b),function(a,c){b[a](function(b){var e=Array.prototype.slice.call(arguments,1);e.length<=1&&(e=e[0]),d[a]=e,c(b)})},function(a){c(a,d)})}},a.series=function(b,c){c=c||function(){};if(b.constructor===Array)a.mapSeries(b,function(a,b){a&&a(function(a){var c=Array.prototype.slice.call(arguments,1);c.length<=1&&(c=c[0]),b.call(null,a,c||null)})},c);else{var d={};a.forEachSeries(g(b),function(a,c){b[a](function(b){var e=Array.prototype.slice.call(arguments,1);e.length<=1&&(e=e[0]),d[a]=e,c(b)})},function(a){c(a,d)})}},a.iterator=function(a){var b=function(c){var d=function(){return a.length&&a[c].apply(null,arguments),d.next()};return d.next=function(){return c<a.length-1?b(c+1):null},d};return b(0)},a.apply=function(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b.concat(Array.prototype.slice.call(arguments)))}};var o=function(a,b,c,d){var e=[];a(b,function(a,b){c(a,function(a,c){e=e.concat(c||[]),b(a)})},function(a){d(a,e)})};a.concat=i(o),a.concatSeries=j(o),a.whilst=function(b,c,d){b()?c(function(e){if(e)return d(e);a.whilst(b,c,d)}):d()},a.until=function(b,c,d){b()?d():c(function(e){if(e)return d(e);a.until(b,c,d)})},a.queue=function(b,c){var d=0,e=[],f={concurrency:c,push:function(b,c){e.push({data:b,callback:c}),a.nextTick(f.process)},process:function(){if(d<f.concurrency&&e.length){var a=e.splice(0,1)[0];d+=1,b(a.data,function(){d-=1,a.callback&&a.callback.apply(a,arguments),f.process()})}},length:function(){return e.length}};return f};var p=function(a){return function(b){var c=Array.prototype.slice.call(arguments,1);b.apply(null,c.concat([function(b){var c=Array.prototype.slice.call(arguments,1);typeof console!="undefined"&&(b?console.error&&console.error(b):console[a]&&d(c,function(b){console[a](b)}))}]))}};a.log=p("log"),a.dir=p("dir"),a.memoize=function(a,b){var c={};return b=b||function(a){return a},function(){var d=Array.prototype.slice.call(arguments),e=d.pop(),f=b.apply(null,d);f in c?e.apply(null,c[f]):a.apply(null,d.concat([function(){c[f]=arguments,e.apply(null,arguments)}]))}}}(),function(a){function f(a,b,c,e,f){throw new d.AssertionError({message:c,actual:a,expected:b,operator:e,stackStartFunction:f})}function g(a,b){return a===b?!0:a instanceof Date&&b instanceof Date?a.getTime()===b.getTime():typeof a!="object"&&typeof b!="object"?a==b:j(a,b)}function h(a){return a===null||a===undefined}function i(a){return Object.prototype.toString.call(a)=="[object Arguments]"}function j(a,d){if(h(a)||h(d))return!1;if(a.prototype!==d.prototype)return!1;if(i(a))return i(d)?(a=c.call(a),d=c.call(d),g(a,d)):!1;try{var e=b(a),f=b(d),j,k}catch(l){return!1}if(e.length!=f.length)return!1;e.sort(),f.sort();for(k=e.length-1;k>=0;k--)if(e[k]!=f[k])return!1;for(k=e.length-1;k>=0;k--){j=e[k];if(!g(a[j],d[j]))return!1}return!0}function k(a,b,c,d){var e=null,g=!1,h=!0;d=d||"",arguments.length==3?typeof c=="string"&&(d=c,h=!1):arguments.length==2&&(h=!1);try{b()}catch(i){g=!0,e=i}a&&!g&&f("Missing expected exception"+(c&&c.name?" ("+c.name+").":".")+(d?" "+d:"")),!a&&g&&h&&e instanceof c&&f("Got unwanted exception"+(c&&c.name?" ("+c.name+").":".")+(d?" "+d:""));if(a&&g&&h&&!(e instanceof c)||!a&&g)throw e}var b=function(a){if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},c=Array.prototype.slice,d=a;d.AssertionError=function(a){this.name="AssertionError",this.message=a.message,this.actual=a.actual,this.expected=a.expected,this.operator=a.operator;var b=a.stackStartFunction||f;Error.captureStackTrace&&Error.captureStackTrace(this,b)},d.AssertionError.super_=Error;var e=function(){this.constructor=d.AssertionError};e.prototype=Error.prototype,d.AssertionError.prototype=new e,d.AssertionError.prototype.toString=function(){return this.message?[this.name+":",this.message].join(" "):[this.name+":",JSON.stringify(this.expected),this.operator,JSON.stringify(this.actual)].join(" ")},d.AssertionError.__proto__=Error.prototype,d.fail=f,d.ok=function(a,b){a||f(a,!0,b,"==",d.ok)},d.equal=function(a,b,c){a!=b&&f(a,b,c,"==",d.equal)},d.notEqual=function(a,b,c){a==b&&f(a,b,c,"!=",d.notEqual)},d.deepEqual=function(a,b,c){g(a,b)||f(a,b,c,"deepEqual",d.deepEqual)},d.notDeepEqual=function(a,b,c){g(a,b)&&f(a,b,c,"notDeepEqual",d.notDeepEqual)},d.strictEqual=function(a,b,c){a!==b&&f(a,b,c,"===",d.strictEqual)},d.notStrictEqual=function(a,b,c){a===b&&f(a,b,c,"!==",d.notStrictEqual)},d.throws=function(a,b,d){k.apply(this,[!0].concat(c.call(arguments)))},d.doesNotThrow=function(a,b,d){k.apply(this,[!1].concat(c.call(arguments)))},d.ifError=function(a){if(a)throw a}}(assert),function(a){a.assertion=function(a){return{method:a.method||"",message:a.message||a.error&&a.error.message||"",error:a.error,passed:function(){return!this.error},failed:function(){return Boolean(this.error)}}},a.assertionList=function(a,b){var c=a||[];return c.failures=function(){var a=0;for(var b=0;b<this.length;b+=1)this[b].failed()&&(a+=1);return a},c.passes=function(){return c.length-c.failures()},c.duration=b||0,c};var b=function(b){return function(c,d,e){return function(){var f=arguments[e-1],g=a.assertion({method:c,message:f});try{assert[d].apply(null,arguments)}catch(h){g.error=h}b(g)}}};a.test=function(c,d,e,f){var g,h=[],i=b(function(a){h.push(a),e.log&&async.nextTick(function(){e.log(a)})}),j={done:function(b){if(g!==undefined&&g!==h.length){var i=new Error("Expected "+g+" assertions, "+h.length+" ran"),j=a.assertion({method:"expect",error:i});h.push(j),e.log&&async.nextTick(function(){e.log(j)})}if(b){var k=a.assertion({error:b});h.push(k),e.log&&async.nextTick(function(){e.log(k)})}var l=(new Date).getTime();async.nextTick(function(){var b=a.assertionList(h,l-d);e.testDone(c,b),f(null,h)})},ok:i("ok","ok",2),same:i("same","deepEqual",3),equals:i("equals","equal",3),expect:function(a){g=a},_assertion_list:h};for(var k in assert)assert.hasOwnProperty(k)&&(j[k]=i(k,k,assert[k].length));return j},a.options=function(a){var b=function(b){a[b]=a[b]||function(){}};return b("moduleStart"),b("moduleDone"),b("testStart"),b("testDone"),a}}(types),function(a){var b=function(a){if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},c=function(a){var c={},d=b(a);for(var e=0;e<d.length;e+=1)c[d[e]]=a[d[e]];return c};a.runTest=function(a,b,c,d){var e=types.options(c);e.testStart(a);var f=(new Date).getTime(),g=types.test(a,f,e,d);try{b(g)}catch(h){g.done(h)}},a.runSuite=function(c,d,e,f){var g=b(d);async.concatSeries(g,function(b,f){var g=d[b],h;h=c?[].concat(c,b):[b],h.toString=function(){return this.join(" - ")};if(typeof g=="function"){var i=!1;for(var j=0;j<h.length;j+=1)h[j]===e.testspec&&(i=!0);if(!e.testspec||i)e.moduleStart&&e.moduleStart(),a.runTest(h,d[b],e,f);else return f()}else a.runSuite(h,d[b],e,f)},f)},a.runModule=function(b,d,e,f){function j(){h||(h=!0,i(b))}var g=c(types.options(e)),h=!1,i=g.moduleStart;g.moduleStart=j;var k=(new Date).getTime();a.runSuite(null,d,g,function(a,c){var d=(new Date).getTime(),e=types.assertionList(c,d-k);g.moduleDone(b,e),f(null,c)})},a.runModules=function(c,d){var e=[],f=types.options(d),g=(new Date).getTime();async.concatSeries(b(c),function(b,d){a.runModule(b,c[b],f,d)},function(a,b){var c=(new Date).getTime();f.done(types.assertionList(b,c-g))})};var d=function(a,b,c){return function(d){var e={};if(b){var f=d.done;d.done=function(a){try{b.call(e,function(b){if(a&&b)return d._assertion_list.push(types.assertion({error:a})),f(b);f(a||b)})}catch(c){f(c)}}}a?a.call(e,function(a){if(a)return d.done(a);c.call(e,d)}):c.call(e,d)}},e=function(a,c,f){var g={},h=b(f);for(var i=0;i<h.length;i+=1){var j=h[i];typeof f[j]=="function"?g[j]=d(a,c,f[j]):typeof f[j]=="object"&&(g[j]=e(a,c,f[j]))}return g};a.testCase=function(a){var b=a.setUp,c=a.tearDown;return delete a.setUp,delete a.tearDown,e(b,c,a)}}(core),function(a){a.info="Browser-based test reporter",a.run=function(a,b){function d(a,b){"innerText"in a?a.innerText=b:"textContent"in a&&(a.textContent=b)}function e(a,b){var c=document.getElementById(b);return c||(c=document.createElement(a),c.id=b,document.body.appendChild(c)),c}var c=(new Date).getTime(),f=e("h1","nodeunit-header"),g=e("h2","nodeunit-banner"),h=e("h2","nodeunit-userAgent"),i=e("ol","nodeunit-tests"),j=e("p","nodeunit-testresult");d(h,navigator.userAgent),nodeunit.runModules(a,{moduleStart:function(a){},testDone:function(a,b){var c=document.createElement("li"),d=document.createElement("strong");d.innerHTML=a+' <b style="color: black;">('+'<b class="fail">'+b.failures()+"</b>, "+'<b class="pass">'+b.passes()+"</b>, "+b.length+")</b>",c.className=b.failures()?"fail":"pass",c.appendChild(d);var e=document.createElement("ol");e.style.display="none",c.onclick=function(){var a=e.style.display;e.style.display=a=="none"?"block":"none"};for(var f=0;f<b.length;f++){var g=document.createElement("li"),h=b[f];h.failed()?(g.innerHTML=(h.message||h.method||"no message")+"<pre>"+(h.error.stack||h.error)+"</pre>",g.className="fail"):(g.innerHTML=h.message||h.method||"no message",g.className="pass"),e.appendChild(g)}c.appendChild(e),i.appendChild(c)},done:function(a){var b=(new Date).getTime(),d=b-c,e=a.failures();g.className=e?"fail":"pass",j.innerHTML="Tests completed in "+d+' milliseconds.<br/><span class="passed">'+a.passes()+"</span> assertions of "+'<span class="all">'+a.length+"<span> passed, "+a.failures()+" failed."}})}}(reporter),nodeunit=core,nodeunit.assert=assert,nodeunit.reporter=reporter,nodeunit.run=reporter.run,nodeunit}()
*/nodeunit=function(){var JSON={};(function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c<f;c+=1)h[c]=str(c,i)||"null";return e=h.length===0?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]",gap=g,e}if(rep&&typeof rep=="object"){f=rep.length;for(c=0;c<f;c+=1)d=rep[c],typeof d=="string"&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e))}else for(d in i)Object.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e));return e=h.length===0?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}",gap=g,e}}"use strict",typeof Date.prototype.toJSON!="function"&&(Date.prototype.toJSON=function(a){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(a){return this.valueOf()});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;typeof JSON.stringify!="function"&&(JSON.stringify=function(a,b,c){var d;gap="",indent="";if(typeof c=="number")for(d=0;d<c;d+=1)indent+=" ";else typeof c=="string"&&(indent=c);rep=b;if(!b||typeof b=="function"||typeof b=="object"&&typeof b.length=="number")return str("",{"":a});throw new Error("JSON.stringify")}),typeof JSON.parse!="function"&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&typeof e=="object")for(c in e)Object.hasOwnProperty.call(e,c)&&(d=walk(e,c),d!==undefined?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),typeof reviver=="function"?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})})();var assert=this.assert={},types={},core={},nodeunit={},reporter={};return function(){var a={},b=this,c=b.async;typeof module!="undefined"&&module.exports?module.exports=a:b.async=a,a.noConflict=function(){return b.async=c,a};var d=function(a,b){if(a.forEach)return a.forEach(b);for(var c=0;c<a.length;c+=1)b(a[c],c,a)},e=function(a,b){if(a.map)return a.map(b);var c=[];return d(a,function(a,d,e){c.push(b(a,d,e))}),c},f=function(a,b,c){return a.reduce?a.reduce(b,c):(d(a,function(a,d,e){c=b(c,a,d,e)}),c)},g=function(a){if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},h=function(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0;c<a.length;c+=1)if(a[c]===b)return c;return-1};typeof process=="undefined"||!process.nextTick?a.nextTick=function(a){setTimeout(a,0)}:a.nextTick=process.nextTick,a.forEach=function(a,b,c){if(!a.length)return c();var e=0;d(a,function(d){b(d,function(b){b?(c(b),c=function(){}):(e+=1,e===a.length&&c())})})},a.forEachSeries=function(a,b,c){if(!a.length)return c();var d=0,e=function(){b(a[d],function(b){b?(c(b),c=function(){}):(d+=1,d===a.length?c():e())})};e()};var i=function(b){return function(){var c=Array.prototype.slice.call(arguments);return b.apply(null,[a.forEach].concat(c))}},j=function(b){return function(){var c=Array.prototype.slice.call(arguments);return b.apply(null,[a.forEachSeries].concat(c))}},k=function(a,b,c,d){var f=[];b=e(b,function(a,b){return{index:b,value:a}}),a(b,function(a,b){c(a.value,function(c,d){f[a.index]=d,b(c)})},function(a){d(a,f)})};a.map=i(k),a.mapSeries=j(k),a.reduce=function(b,c,d,e){a.forEachSeries(b,function(a,b){d(c,a,function(a,d){c=d,b(a)})},function(a){e(a,c)})},a.inject=a.reduce,a.foldl=a.reduce,a.reduceRight=function(b,c,d,f){var g=e(b,function(a){return a}).reverse();a.reduce(g,c,d,f)},a.foldr=a.reduceRight;var l=function(a,b,c,d){var f=[];b=e(b,function(a,b){return{index:b,value:a}}),a(b,function(a,b){c(a.value,function(c){c&&f.push(a),b()})},function(a){d(e(f.sort(function(a,b){return a.index-b.index}),function(a){return a.value}))})};a.filter=i(l),a.filterSeries=j(l),a.select=a.filter,a.selectSeries=a.filterSeries;var m=function(a,b,c,d){var f=[];b=e(b,function(a,b){return{index:b,value:a}}),a(b,function(a,b){c(a.value,function(c){c||f.push(a),b()})},function(a){d(e(f.sort(function(a,b){return a.index-b.index}),function(a){return a.value}))})};a.reject=i(m),a.rejectSeries=j(m);var n=function(a,b,c,d){a(b,function(a,b){c(a,function(c){c?d(a):b()})},function(a){d()})};a.detect=i(n),a.detectSeries=j(n),a.some=function(b,c,d){a.forEach(b,function(a,b){c(a,function(a){a&&(d(!0),d=function(){}),b()})},function(a){d(!1)})},a.any=a.some,a.every=function(b,c,d){a.forEach(b,function(a,b){c(a,function(a){a||(d(!1),d=function(){}),b()})},function(a){d(!0)})},a.all=a.every,a.sortBy=function(b,c,d){a.map(b,function(a,b){c(a,function(c,d){c?b(c):b(null,{value:a,criteria:d})})},function(a,b){if(a)return d(a);var c=function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0};d(null,e(b.sort(c),function(a){return a.value}))})},a.auto=function(a,b){b=b||function(){};var c=g(a);if(!c.length)return b(null);var e=[],i=[],j=function(a){i.unshift(a)},k=function(a){for(var b=0;b<i.length;b+=1)if(i[b]===a){i.splice(b,1);return}},l=function(){d(i,function(a){a()})};j(function(){e.length===c.length&&b(null)}),d(c,function(c){var d=a[c]instanceof Function?[a[c]]:a[c],g=function(a){a?(b(a),b=function(){}):(e.push(c),l())},i=d.slice(0,Math.abs(d.length-1))||[],m=function(){return f(i,function(a,b){return a&&h(e,b)!==-1},!0)};if(m())d[d.length-1](g);else{var n=function(){m()&&(k(n),d[d.length-1](g))};j(n)}})},a.waterfall=function(b,c){if(!b.length)return c();c=c||function(){};var d=function(b){return function(e){if(e)c(e),c=function(){};else{var f=Array.prototype.slice.call(arguments,1),g=b.next();g?f.push(d(g)):f.push(c),a.nextTick(function(){b.apply(null,f)})}}};d(a.iterator(b))()},a.parallel=function(b,c){c=c||function(){};if(b.constructor===Array)a.map(b,function(a,b){a&&a(function(a){var c=Array.prototype.slice.call(arguments,1);c.length<=1&&(c=c[0]),b.call(null,a,c||null)})},c);else{var d={};a.forEach(g(b),function(a,c){b[a](function(b){var e=Array.prototype.slice.call(arguments,1);e.length<=1&&(e=e[0]),d[a]=e,c(b)})},function(a){c(a,d)})}},a.series=function(b,c){c=c||function(){};if(b.constructor===Array)a.mapSeries(b,function(a,b){a&&a(function(a){var c=Array.prototype.slice.call(arguments,1);c.length<=1&&(c=c[0]),b.call(null,a,c||null)})},c);else{var d={};a.forEachSeries(g(b),function(a,c){b[a](function(b){var e=Array.prototype.slice.call(arguments,1);e.length<=1&&(e=e[0]),d[a]=e,c(b)})},function(a){c(a,d)})}},a.iterator=function(a){var b=function(c){var d=function(){return a.length&&a[c].apply(null,arguments),d.next()};return d.next=function(){return c<a.length-1?b(c+1):null},d};return b(0)},a.apply=function(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b.concat(Array.prototype.slice.call(arguments)))}};var o=function(a,b,c,d){var e=[];a(b,function(a,b){c(a,function(a,c){e=e.concat(c||[]),b(a)})},function(a){d(a,e)})};a.concat=i(o),a.concatSeries=j(o),a.whilst=function(b,c,d){b()?c(function(e){if(e)return d(e);a.whilst(b,c,d)}):d()},a.until=function(b,c,d){b()?d():c(function(e){if(e)return d(e);a.until(b,c,d)})},a.queue=function(b,c){var d=0,e=[],f={concurrency:c,push:function(b,c){e.push({data:b,callback:c}),a.nextTick(f.process)},process:function(){if(d<f.concurrency&&e.length){var a=e.splice(0,1)[0];d+=1,b(a.data,function(){d-=1,a.callback&&a.callback.apply(a,arguments),f.process()})}},length:function(){return e.length}};return f};var p=function(a){return function(b){var c=Array.prototype.slice.call(arguments,1);b.apply(null,c.concat([function(b){var c=Array.prototype.slice.call(arguments,1);typeof console!="undefined"&&(b?console.error&&console.error(b):console[a]&&d(c,function(b){console[a](b)}))}]))}};a.log=p("log"),a.dir=p("dir"),a.memoize=function(a,b){var c={};return b=b||function(a){return a},function(){var d=Array.prototype.slice.call(arguments),e=d.pop(),f=b.apply(null,d);f in c?e.apply(null,c[f]):a.apply(null,d.concat([function(){c[f]=arguments,e.apply(null,arguments)}]))}}}(),function(a){function f(a,b,c,e,f){throw new d.AssertionError({message:c,actual:a,expected:b,operator:e,stackStartFunction:f})}function g(a,b){return a===b?!0:a instanceof Date&&b instanceof Date?a.getTime()===b.getTime():a instanceof RegExp&&b instanceof RegExp?a.source===b.source&&a.global===b.global&&a.ignoreCase===b.ignoreCase&&a.multiline===b.multiline:typeof a!="object"&&typeof b!="object"?a==b:j(a,b)}function h(a){return a===null||a===undefined}function i(a){return Object.prototype.toString.call(a)=="[object Arguments]"}function j(a,d){if(h(a)||h(d))return!1;if(a.prototype!==d.prototype)return!1;if(i(a))return i(d)?(a=c.call(a),d=c.call(d),g(a,d)):!1;try{var e=b(a),f=b(d),j,k}catch(l){return!1}if(e.length!=f.length)return!1;e.sort(),f.sort();for(k=e.length-1;k>=0;k--)if(e[k]!=f[k])return!1;for(k=e.length-1;k>=0;k--){j=e[k];if(!g(a[j],d[j]))return!1}return!0}function k(a,b,c,d){var e=null,g=!1,h=!0;d=d||"",arguments.length==3?typeof c=="string"&&(d=c,h=!1):arguments.length==2&&(h=!1);try{b()}catch(i){g=!0,e=i}a&&!g&&f("Missing expected exception"+(c&&c.name?" ("+c.name+").":".")+(d?" "+d:"")),!a&&g&&h&&e instanceof c&&f("Got unwanted exception"+(c&&c.name?" ("+c.name+").":".")+(d?" "+d:""));if(a&&g&&h&&!(e instanceof c)||!a&&g)throw e}var b=function(a){if(Object.keys)return Object.keys(a);if(typeof a!="object"&&typeof a!="function")throw new TypeError("-");var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},c=Array.prototype.slice,d=a;d.AssertionError=function(a){this.name="AssertionError",this.message=a.message,this.actual=a.actual,this.expected=a.expected,this.operator=a.operator;var b=a.stackStartFunction||f;Error.captureStackTrace&&Error.captureStackTrace(this,b)},d.AssertionError.super_=Error;var e=function(){this.constructor=d.AssertionError};e.prototype=Error.prototype,d.AssertionError.prototype=new e,d.AssertionError.prototype.toString=function(){return this.message?[this.name+":",this.message].join(" "):[this.name+":",JSON.stringify(this.expected),this.operator,JSON.stringify(this.actual)].join(" ")},d.AssertionError.__proto__=Error.prototype,d.fail=f,d.ok=function(a,b){a||f(a,!0,b,"==",d.ok)},d.equal=function(a,b,c){a!=b&&f(a,b,c,"==",d.equal)},d.notEqual=function(a,b,c){a==b&&f(a,b,c,"!=",d.notEqual)},d.deepEqual=function(a,b,c){g(a,b)||f(a,b,c,"deepEqual",d.deepEqual)},d.notDeepEqual=function(a,b,c){g(a,b)&&f(a,b,c,"notDeepEqual",d.notDeepEqual)},d.strictEqual=function(a,b,c){a!==b&&f(a,b,c,"===",d.strictEqual)},d.notStrictEqual=function(a,b,c){a===b&&f(a,b,c,"!==",d.notStrictEqual)},d.throws=function(a,b,d){k.apply(this,[!0].concat(c.call(arguments)))},d.doesNotThrow=function(a,b,d){k.apply(this,[!1].concat(c.call(arguments)))},d.ifError=function(a){if(a)throw a}}(assert),function(a){a.assertion=function(a){return{method:a.method||"",message:a.message||a.error&&a.error.message||"",error:a.error,passed:function(){return!this.error},failed:function(){return Boolean(this.error)}}},a.assertionList=function(a,b){var c=a||[];return c.failures=function(){var a=0;for(var b=0;b<this.length;b+=1)this[b].failed()&&(a+=1);return a},c.passes=function(){return c.length-c.failures()},c.duration=b||0,c};var b=function(b){return function(c,d,e){return function(){var f=arguments[e-1],g=a.assertion({method:c,message:f});try{assert[d].apply(null,arguments)}catch(h){g.error=h}b(g)}}};a.test=function(c,d,e,f){var g,h=[],i=b(function(a){h.push(a),e.log&&async.nextTick(function(){e.log(a)})}),j={done:function(b){if(g!==undefined&&g!==h.length){var i=new Error("Expected "+g+" assertions, "+h.length+" ran"),j=a.assertion({method:"expect",error:i});h.push(j),e.log&&async.nextTick(function(){e.log(j)})}if(b){var k=a.assertion({error:b});h.push(k),e.log&&async.nextTick(function(){e.log(k)})}var l=(new Date).getTime();async.nextTick(function(){var b=a.assertionList(h,l-d);e.testDone(c,b),f(null,h)})},ok:i("ok","ok",2),same:i("same","deepEqual",3),equals:i("equals","equal",3),expect:function(a){g=a},_assertion_list:h};for(var k in assert)assert.hasOwnProperty(k)&&(j[k]=i(k,k,assert[k].length));return j},a.options=function(a){var b=function(b){a[b]=a[b]||function(){}};return b("moduleStart"),b("moduleDone"),b("testStart"),b("testDone"),a}}(types),function(a){var b=function(a){if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},c=function(a){var c={},d=b(a);for(var e=0;e<d.length;e+=1)c[d[e]]=a[d[e]];return c};a.runTest=function(a,b,c,d){var e=types.options(c);e.testStart(a);var f=(new Date).getTime(),g=types.test(a,f,e,d);try{b(g)}catch(h){g.done(h)}},a.runSuite=function(c,d,e,g){d=f(d);var h=b(d);async.concatSeries(h,function(b,f){var g=d[b],h;h=c?[].concat(c,b):[b],h.toString=function(){return this.join(" - ")};if(typeof g=="function"){var i=!1;for(var j=0;j<h.length;j+=1)h[j]===e.testspec&&(i=!0);if(!e.testspec||i)e.moduleStart&&e.moduleStart(),a.runTest(h,d[b],e,f);else return f()}else a.runSuite(h,d[b],e,f)},g)},a.runModule=function(b,d,e,g){function k(){i||(i=!0,j(b))}var h=c(types.options(e)),i=!1,j=h.moduleStart;d=f(d),h.moduleStart=k;var l=(new Date).getTime();a.runSuite(null,d,h,function(a,c){var d=(new Date).getTime(),e=types.assertionList(c,d-l);h.moduleDone(b,e),nodeunit.complete&&nodeunit.complete(b,e),g(null,c)})},a.runModules=function(c,d){var e=[],f=types.options(d),g=(new Date).getTime();async.concatSeries(b(c),function(b,d){a.runModule(b,c[b],f,d)},function(a,b){var c=(new Date).getTime();f.done(types.assertionList(b,c-g))})};var d=function(a,b,c){return function(d){var e={};if(b){var f=d.done;d.done=function(a){try{b.call(e,function(b){if(a&&b)return d._assertion_list.push(types.assertion({error:a})),f(b);f(a||b)})}catch(c){f(c)}}}a?a.call(e,function(a){if(a)return d.done(a);c.call(e,d)}):c.call(e,d)}},e=function(a,b){return!a||!b?b||a:function(c){a(function(){b(c)})}},f=function(a,c,g){var h={},i=a.setUp,j=a.tearDown;delete a.setUp,delete a.tearDown;var k=b(a);for(var l=0;l<k.length;l+=1){var m=k[l];typeof a[m]=="function"?h[m]=d(e(c,i),e(j,g),a[m]):typeof a[m]=="object"&&(h[m]=f(a[m],i,j))}return h};a.testCase=function(a){return a}}(core),function(a){a.info="Browser-based test reporter",a.run=function(a,b){function e(a,b){"innerText"in a?a.innerText=b:"textContent"in a&&(a.textContent=b)}function f(a,b){var c=document.getElementById(b);return c||(c=document.createElement(a),c.id=b,d.appendChild(c)),c}var c=(new Date).getTime(),d;b=b||{},d=b.div||document.body;var g=f("h1","nodeunit-header"),h=f("h2","nodeunit-banner"),i=f("h2","nodeunit-userAgent"),j=f("ol","nodeunit-tests"),k=f("p","nodeunit-testresult");e(i,navigator.userAgent),nodeunit.runModules(a,{moduleStart:function(a){},testDone:function(a,b){var c=document.createElement("li"),d=document.createElement("strong");d.innerHTML=a+' <b style="color: black;">('+'<b class="fail">'+b.failures()+"</b>, "+'<b class="pass">'+b.passes()+"</b>, "+b.length+")</b>",c.className=b.failures()?"fail":"pass",c.appendChild(d);var e=document.createElement("ol");e.style.display="none",c.onclick=function(){var a=e.style.display;e.style.display=a=="none"?"block":"none"};for(var f=0;f<b.length;f++){var g=document.createElement("li"),h=b[f];h.failed()?(g.innerHTML=(h.message||h.method||"no message")+"<pre>"+(h.error.stack||h.error)+"</pre>",g.className="fail"):(g.innerHTML=h.message||h.method||"no message",g.className="pass"),e.appendChild(g)}c.appendChild(e),j.appendChild(c)},done:function(a){var b=(new Date).getTime(),d=b-c,e=a.failures();h.className=e?"fail":"pass",k.innerHTML="Tests completed in "+d+' milliseconds.<br/><span class="passed">'+a.passes()+"</span> assertions of "+'<span class="all">'+a.length+"<span> passed, "+a.failures()+" failed."}})}}(reporter),nodeunit=core,nodeunit.assert=assert,nodeunit.reporter=reporter,nodeunit.run=reporter.run,nodeunit}();

@@ -174,5 +174,3 @@ /*!

if (!this.JSON) {
this.JSON = {};
}
var JSON = {};

@@ -1139,2 +1137,5 @@ (function () {

if(Object.keys) return Object.keys(obj);
if (typeof obj != 'object' && typeof obj != 'function') {
throw new TypeError('-');
}
var keys = [];

@@ -1294,2 +1295,10 @@ for(var k in obj){

// 7.2.1 If the expcted value is a RegExp object, the actual value is
// equivalent if it is also a RegExp object that refers to the same source and options
} else if (actual instanceof RegExp && expected instanceof RegExp) {
return actual.source === expected.source &&
actual.global === expected.global &&
actual.ignoreCase === expected.ignoreCase &&
actual.multiline === expected.multiline;
// 7.3. Other pairs that do not both pass typeof value == "object",

@@ -1721,2 +1730,3 @@ // equivalence is determined by ==.

exports.runSuite = function (name, suite, opt, callback) {
suite = wrapGroup(suite);
var keys = _keys(suite);

@@ -1772,2 +1782,5 @@

var _moduleStart = options.moduleStart;
mod = wrapGroup(mod);
function run_once() {

@@ -1787,2 +1800,5 @@ if (!_run) {

options.moduleDone(name, assertion_list);
if (nodeunit.complete) {
nodeunit.complete(name, assertion_list);
}
callback(null, a_list);

@@ -1866,21 +1882,51 @@ });

/**
* Returns a serial callback from two functions.
*
* @param {Function} funcFirst
* @param {Function} funcSecond
* @api private
*/
var getSerialCallback = function (funcFirst, funcSecond) {
if (!(funcFirst && funcSecond))
return funcSecond || funcFirst;
return function (callback) {
funcFirst(function () {
funcSecond(callback);
});
};
}
/**
* Wraps a group of tests with setUp and tearDown functions.
* Used by testCase.
*
* @param {Function} setUp
* @param {Function} tearDown
* @param {Object} group
* @param {Function} parentSetUp
* @param {Function} parentTearDown
* @api private
*/
var wrapGroup = function (setUp, tearDown, group) {
var wrapGroup = function (group, parentSetUp, parentTearDown) {
var tests = {};
var setUp = group.setUp;
var tearDown = group.tearDown;
delete group.setUp;
delete group.tearDown;
var keys = _keys(group);
for (var i = 0; i < keys.length; i += 1) {
var k = keys[i];
if (typeof group[k] === 'function') {
tests[k] = wrapTest(setUp, tearDown, group[k]);
tests[k] = wrapTest(
getSerialCallback(parentSetUp, setUp),
getSerialCallback(tearDown, parentTearDown),
group[k]
);
}
else if (typeof group[k] === 'object') {
tests[k] = wrapGroup(setUp, tearDown, group[k]);
tests[k] = wrapGroup(group[k], setUp, tearDown);
}

@@ -1893,16 +1939,7 @@ }

/**
* Utility for wrapping a suite of test functions with setUp and tearDown
* functions.
*
* @param {Object} suite
* @return {Object}
* @api public
* Backwards compatibility for test suites using old testCase API
*/
exports.testCase = function (suite) {
var setUp = suite.setUp;
var tearDown = suite.tearDown;
delete suite.setUp;
delete suite.tearDown;
return wrapGroup(setUp, tearDown, suite);
return suite;
};

@@ -1943,3 +1980,5 @@ })(core);

exports.run = function (modules, options) {
var start = new Date().getTime();
var start = new Date().getTime(), div;
options = options || {};
div = options.div || document.body;

@@ -1960,3 +1999,3 @@ function setText(el, txt) {

el.id = id;
document.body.appendChild(el);
div.appendChild(el);
}

@@ -1963,0 +2002,0 @@ return el;

@@ -7,3 +7,2 @@ (function (exports) {

var testCase = nodeunit.testCase;

@@ -13,3 +12,3 @@ exports.testTestCase = function (test) {

var call_order = [];
var s = testCase({
var s = {
setUp: function (callback) {

@@ -37,3 +36,3 @@ call_order.push('setUp');

}
});
};
nodeunit.runSuite(null, s, {}, function () {

@@ -50,3 +49,3 @@ test.same(call_order, [

test.expect(1);
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -59,3 +58,3 @@ test.ok(true, 'tearDown called');

}
});
};
nodeunit.runSuite(null, s, {}, function () {

@@ -69,3 +68,3 @@ test.done();

var test_error = new Error('test error');
var s = testCase({
var s = {
setUp: function (callback) {

@@ -78,3 +77,3 @@ throw test_error;

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -90,3 +89,3 @@ test.equal(assertions.length, 1);

var test_error = new Error('test error');
var s = testCase({
var s = {
setUp: function (callback) {

@@ -99,3 +98,3 @@ callback(test_error);

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -111,3 +110,3 @@ test.equal(assertions.length, 1);

var test_error = new Error('test error');
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -119,3 +118,3 @@ throw test_error;

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -131,3 +130,3 @@ test.equal(assertions.length, 1);

var test_error = new Error('test error');
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -139,3 +138,3 @@ callback(test_error);

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -152,3 +151,3 @@ test.equal(assertions.length, 1);

var error2 = new Error('test error two');
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -160,3 +159,3 @@ callback(error2);

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -172,3 +171,3 @@ test.equal(assertions.length, 2);

var call_order = [];
var s = testCase({
var s = {
setUp: function (callback) {

@@ -192,3 +191,3 @@ call_order.push('setUp');

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -209,3 +208,3 @@ test.same(call_order, [

var call_order = [];
var s = testCase({
var s = {
setUp: function (callback) {

@@ -223,3 +222,3 @@ call_order.push('setUp');

},
group1: testCase({
group1: {
setUp: function (callback) {

@@ -237,4 +236,4 @@ call_order.push('group1.setUp');

}
})
});
}
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -241,0 +240,0 @@ test.same(call_order, [

@@ -174,5 +174,3 @@ /*!

if (!this.JSON) {
this.JSON = {};
}
var JSON = {};

@@ -497,3 +495,3 @@ (function () {

}());
var assert = {};
var assert = this.assert = {};
var types = {};

@@ -503,3 +501,4 @@ var core = {};

var reporter = {};
(function(){
/*global setTimeout: false, console: false */
(function () {

@@ -509,9 +508,13 @@ var async = {};

// global on the server, window in the browser
var root = this;
var previous_async = root.async;
var root = this,
previous_async = root.async;
if(typeof module !== 'undefined' && module.exports) module.exports = async;
else root.async = async;
if (typeof module !== 'undefined' && module.exports) {
module.exports = async;
}
else {
root.async = async;
}
async.noConflict = function(){
async.noConflict = function () {
root.async = previous_async;

@@ -523,5 +526,7 @@ return async;

var _forEach = function(arr, iterator){
if(arr.forEach) return arr.forEach(iterator);
for(var i=0; i<arr.length; i++){
var _forEach = function (arr, iterator) {
if (arr.forEach) {
return arr.forEach(iterator);
}
for (var i = 0; i < arr.length; i += 1) {
iterator(arr[i], i, arr);

@@ -531,14 +536,18 @@ }

var _map = function(arr, iterator){
if(arr.map) return arr.map(iterator);
var _map = function (arr, iterator) {
if (arr.map) {
return arr.map(iterator);
}
var results = [];
_forEach(arr, function(x, i, a){
_forEach(arr, function (x, i, a) {
results.push(iterator(x, i, a));
})
});
return results;
};
var _reduce = function(arr, iterator, memo){
if(arr.reduce) return arr.reduce(iterator, memo);
_forEach(arr, function(x, i, a){
var _reduce = function (arr, iterator, memo) {
if (arr.reduce) {
return arr.reduce(iterator, memo);
}
_forEach(arr, function (x, i, a) {
memo = iterator(memo, x, i, a);

@@ -549,7 +558,11 @@ });

var _keys = function(obj){
if(Object.keys) return Object.keys(obj);
var _keys = function (obj) {
if (Object.keys) {
return Object.keys(obj);
}
var keys = [];
for(var k in obj){
if(obj.hasOwnProperty(k)) keys.push(k);
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
keys.push(k);
}
}

@@ -559,7 +572,11 @@ return keys;

var _indexOf = function(arr, item){
if(arr.indexOf) return arr.indexOf(item);
for(var i=0; i<arr.length; i++){
if(arr[i] === item) return i;
var _indexOf = function (arr, item) {
if (arr.indexOf) {
return arr.indexOf(item);
}
for (var i = 0; i < arr.length; i += 1) {
if (arr[i] === item) {
return i;
}
}
return -1;

@@ -571,21 +588,27 @@ };

//// nextTick implementation with browser-compatible fallback ////
async.nextTick = function(fn){
if(typeof process == 'undefined' || !(process.nextTick)){
if (typeof process === 'undefined' || !(process.nextTick)) {
async.nextTick = function (fn) {
setTimeout(fn, 0);
};
}
else {
async.nextTick = process.nextTick;
}
async.forEach = function (arr, iterator, callback) {
if (!arr.length) {
return callback();
}
else process.nextTick(fn);
};
async.forEach = function(arr, iterator, callback){
if(!arr.length) return callback();
var completed = 0;
_forEach(arr, function(x){
iterator(x, function(err){
if(err){
_forEach(arr, function (x) {
iterator(x, function (err) {
if (err) {
callback(err);
callback = function(){};
callback = function () {};
}
else {
completed++;
if(completed == arr.length) callback();
completed += 1;
if (completed === arr.length) {
callback();
}
}

@@ -596,15 +619,21 @@ });

async.forEachSeries = function(arr, iterator, callback){
if(!arr.length) return callback();
async.forEachSeries = function (arr, iterator, callback) {
if (!arr.length) {
return callback();
}
var completed = 0;
var iterate = function(){
iterator(arr[completed], function(err){
if(err){
var iterate = function () {
iterator(arr[completed], function (err) {
if (err) {
callback(err);
callback = function(){};
callback = function () {};
}
else {
completed++;
if(completed == arr.length) callback();
else iterate();
completed += 1;
if (completed === arr.length) {
callback();
}
else {
iterate();
}
}

@@ -617,4 +646,4 @@ });

var doParallel = function(fn){
return function(){
var doParallel = function (fn) {
return function () {
var args = Array.prototype.slice.call(arguments);

@@ -624,4 +653,4 @@ return fn.apply(null, [async.forEach].concat(args));

};
var doSeries = function(fn){
return function(){
var doSeries = function (fn) {
return function () {
var args = Array.prototype.slice.call(arguments);

@@ -633,13 +662,13 @@ return fn.apply(null, [async.forEachSeries].concat(args));

var _asyncMap = function(eachfn, arr, iterator, callback){
var _asyncMap = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function(x, i){
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function(x, callback){
iterator(x.value, function(err, v){
eachfn(arr, function (x, callback) {
iterator(x.value, function (err, v) {
results[x.index] = v;
callback(err);
});
}, function(err){
}, function (err) {
callback(err, results);

@@ -654,9 +683,9 @@ });

// work in many situations.
async.reduce = function(arr, memo, iterator, callback){
async.forEachSeries(arr, function(x, callback){
iterator(memo, x, function(err, v){
async.reduce = function (arr, memo, iterator, callback) {
async.forEachSeries(arr, function (x, callback) {
iterator(memo, x, function (err, v) {
memo = v;
callback(err);
});
}, function(err){
}, function (err) {
callback(err, memo);

@@ -670,4 +699,6 @@ });

async.reduceRight = function(arr, memo, iterator, callback){
var reversed = _map(arr, function(x){return x;}).reverse();
async.reduceRight = function (arr, memo, iterator, callback) {
var reversed = _map(arr, function (x) {
return x;
}).reverse();
async.reduce(reversed, memo, iterator, callback);

@@ -678,16 +709,18 @@ };

var _filter = function(eachfn, arr, iterator, callback){
var _filter = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function(x, i){
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function(x, callback){
iterator(x.value, function(v){
if(v) results.push(x);
eachfn(arr, function (x, callback) {
iterator(x.value, function (v) {
if (v) {
results.push(x);
}
callback();
});
}, function(err){
callback(_map(results.sort(function(a,b){
}, function (err) {
callback(_map(results.sort(function (a, b) {
return a.index - b.index;
}), function(x){
}), function (x) {
return x.value;

@@ -703,16 +736,18 @@ }));

var _reject = function(eachfn, arr, iterator, callback){
var _reject = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function(x, i){
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function(x, callback){
iterator(x.value, function(v){
if(!v) results.push(x);
eachfn(arr, function (x, callback) {
iterator(x.value, function (v) {
if (!v) {
results.push(x);
}
callback();
});
}, function(err){
callback(_map(results.sort(function(a,b){
}, function (err) {
callback(_map(results.sort(function (a, b) {
return a.index - b.index;
}), function(x){
}), function (x) {
return x.value;

@@ -725,9 +760,13 @@ }));

var _detect = function(eachfn, arr, iterator, main_callback){
eachfn(arr, function(x, callback){
iterator(x, function(result){
if(result) main_callback(x);
else callback();
var _detect = function (eachfn, arr, iterator, main_callback) {
eachfn(arr, function (x, callback) {
iterator(x, function (result) {
if (result) {
main_callback(x);
}
else {
callback();
}
});
}, function(err){
}, function (err) {
main_callback();

@@ -739,12 +778,12 @@ });

async.some = function(arr, iterator, main_callback){
async.forEach(arr, function(x, callback){
iterator(x, function(v){
if(v){
async.some = function (arr, iterator, main_callback) {
async.forEach(arr, function (x, callback) {
iterator(x, function (v) {
if (v) {
main_callback(true);
main_callback = function(){};
main_callback = function () {};
}
callback();
});
}, function(err){
}, function (err) {
main_callback(false);

@@ -756,12 +795,12 @@ });

async.every = function(arr, iterator, main_callback){
async.forEach(arr, function(x, callback){
iterator(x, function(v){
if(!v){
async.every = function (arr, iterator, main_callback) {
async.forEach(arr, function (x, callback) {
iterator(x, function (v) {
if (!v) {
main_callback(false);
main_callback = function(){};
main_callback = function () {};
}
callback();
});
}, function(err){
}, function (err) {
main_callback(true);

@@ -773,21 +812,34 @@ });

async.sortBy = function(arr, iterator, callback){
async.map(arr, function(x, callback){
iterator(x, function(err, criteria){
if(err) callback(err);
else callback(null, {value: x, criteria: criteria});
async.sortBy = function (arr, iterator, callback) {
async.map(arr, function (x, callback) {
iterator(x, function (err, criteria) {
if (err) {
callback(err);
}
else {
callback(null, {value: x, criteria: criteria});
}
});
}, function(err, results){
if(err) return callback(err);
else callback(null, _map(results.sort(function(left, right){
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
}), function(x){return x.value;}));
})
}, function (err, results) {
if (err) {
return callback(err);
}
else {
var fn = function (left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
};
callback(null, _map(results.sort(fn), function (x) {
return x.value;
}));
}
});
};
async.auto = function(tasks, callback){
callback = callback || function(){};
async.auto = function (tasks, callback) {
callback = callback || function () {};
var keys = _keys(tasks);
if(!keys.length) return callback(null);
if (!keys.length) {
return callback(null);
}

@@ -797,8 +849,8 @@ var completed = [];

var listeners = [];
var addListener = function(fn){
var addListener = function (fn) {
listeners.unshift(fn);
};
var removeListener = function(fn){
for(var i=0; i<listeners.length; i++){
if(listeners[i] === fn){
var removeListener = function (fn) {
for (var i = 0; i < listeners.length; i += 1) {
if (listeners[i] === fn) {
listeners.splice(i, 1);

@@ -809,8 +861,10 @@ return;

};
var taskComplete = function(){
_forEach(listeners, function(fn){fn();});
var taskComplete = function () {
_forEach(listeners, function (fn) {
fn();
});
};
addListener(function(){
if(completed.length == keys.length){
addListener(function () {
if (completed.length === keys.length) {
callback(null);

@@ -820,9 +874,9 @@ }

_forEach(keys, function(k){
var task = (tasks[k] instanceof Function)? [tasks[k]]: tasks[k];
var taskCallback = function(err){
if(err){
_forEach(keys, function (k) {
var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
var taskCallback = function (err) {
if (err) {
callback(err);
// stop subsequent errors hitting callback multiple times
callback = function(){};
callback = function () {};
}

@@ -834,14 +888,16 @@ else {

};
var requires = task.slice(0, Math.abs(task.length-1)) || [];
var ready = function(){
return _reduce(requires, function(a,x){
return (a && _indexOf(completed, x) != -1);
var requires = task.slice(0, Math.abs(task.length - 1)) || [];
var ready = function () {
return _reduce(requires, function (a, x) {
return (a && _indexOf(completed, x) !== -1);
}, true);
};
if(ready()) task[task.length-1](taskCallback);
if (ready()) {
task[task.length - 1](taskCallback);
}
else {
var listener = function(){
if(ready()){
var listener = function () {
if (ready()) {
removeListener(listener);
task[task.length-1](taskCallback);
task[task.length - 1](taskCallback);
}

@@ -854,10 +910,12 @@ };

async.waterfall = function(tasks, callback){
if(!tasks.length) return callback();
callback = callback || function(){};
var wrapIterator = function(iterator){
return function(err){
if(err){
async.waterfall = function (tasks, callback) {
if (!tasks.length) {
return callback();
}
callback = callback || function () {};
var wrapIterator = function (iterator) {
return function (err) {
if (err) {
callback(err);
callback = function(){};
callback = function () {};
}

@@ -867,5 +925,11 @@ else {

var next = iterator.next();
if(next) args.push(wrapIterator(next));
else args.push(callback);
async.nextTick(function(){iterator.apply(null, args);});
if (next) {
args.push(wrapIterator(next));
}
else {
args.push(callback);
}
async.nextTick(function () {
iterator.apply(null, args);
});
}

@@ -877,36 +941,76 @@ };

async.parallel = function(tasks, callback){
callback = callback || function(){};
async.map(tasks, function(fn, callback){
if(fn){
fn(function(err){
var args = Array.prototype.slice.call(arguments,1);
if(args.length <= 1) args = args[0];
callback.call(null, err, args || null);
async.parallel = function (tasks, callback) {
callback = callback || function () {};
if (tasks.constructor === Array) {
async.map(tasks, function (fn, callback) {
if (fn) {
fn(function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
callback.call(null, err, args || null);
});
}
}, callback);
}
else {
var results = {};
async.forEach(_keys(tasks), function (k, callback) {
tasks[k](function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
results[k] = args;
callback(err);
});
}
}, callback);
}, function (err) {
callback(err, results);
});
}
};
async.series = function(tasks, callback){
callback = callback || function(){};
async.mapSeries(tasks, function(fn, callback){
if(fn){
fn(function(err){
var args = Array.prototype.slice.call(arguments,1);
if(args.length <= 1) args = args[0];
callback.call(null, err, args || null);
async.series = function (tasks, callback) {
callback = callback || function () {};
if (tasks.constructor === Array) {
async.mapSeries(tasks, function (fn, callback) {
if (fn) {
fn(function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
callback.call(null, err, args || null);
});
}
}, callback);
}
else {
var results = {};
async.forEachSeries(_keys(tasks), function (k, callback) {
tasks[k](function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
results[k] = args;
callback(err);
});
}
}, callback);
}, function (err) {
callback(err, results);
});
}
};
async.iterator = function(tasks){
var makeCallback = function(index){
var fn = function(){
if(tasks.length) tasks[index].apply(null, arguments);
async.iterator = function (tasks) {
var makeCallback = function (index) {
var fn = function () {
if (tasks.length) {
tasks[index].apply(null, arguments);
}
return fn.next();
};
fn.next = function(){
return (index < tasks.length-1)? makeCallback(index+1): null;
fn.next = function () {
return (index < tasks.length - 1) ? makeCallback(index + 1): null;
};

@@ -918,5 +1022,5 @@ return fn;

async.apply = function(fn){
async.apply = function (fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function(){
return function () {
return fn.apply(

@@ -928,10 +1032,10 @@ null, args.concat(Array.prototype.slice.call(arguments))

var _concat = function(eachfn, arr, fn, callback){
var _concat = function (eachfn, arr, fn, callback) {
var r = [];
eachfn(arr, function(x, cb){
fn(x, function(err, y){
eachfn(arr, function (x, cb) {
fn(x, function (err, y) {
r = r.concat(y || []);
cb(err);
});
}, function(err){
}, function (err) {
callback(err, r);

@@ -943,13 +1047,74 @@ });

var _console_fn = function(name){
return function(fn){
async.whilst = function (test, iterator, callback) {
if (test()) {
iterator(function (err) {
if (err) {
return callback(err);
}
async.whilst(test, iterator, callback);
});
}
else {
callback();
}
};
async.until = function (test, iterator, callback) {
if (!test()) {
iterator(function (err) {
if (err) {
return callback(err);
}
async.until(test, iterator, callback);
});
}
else {
callback();
}
};
async.queue = function (worker, concurrency) {
var workers = 0;
var tasks = [];
var q = {
concurrency: concurrency,
push: function (data, callback) {
tasks.push({data: data, callback: callback});
async.nextTick(q.process);
},
process: function () {
if (workers < q.concurrency && tasks.length) {
var task = tasks.splice(0, 1)[0];
workers += 1;
worker(task.data, function () {
workers -= 1;
if (task.callback) {
task.callback.apply(task, arguments);
}
q.process();
});
}
},
length: function () {
return tasks.length;
}
};
return q;
};
var _console_fn = function (name) {
return function (fn) {
var args = Array.prototype.slice.call(arguments, 1);
fn.apply(null, args.concat([function(err){
fn.apply(null, args.concat([function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if(typeof console != 'undefined'){
if(err){
if(console.error) console.error(err);
if (typeof console !== 'undefined') {
if (err) {
if (console.error) {
console.error(err);
}
}
else if(console[name]){
_forEach(args, function(x){console[name](x);});
else if (console[name]) {
_forEach(args, function (x) {
console[name](x);
});
}

@@ -966,3 +1131,24 @@ }

})();
async.memoize = function (fn, hasher) {
var memo = {};
hasher = hasher || function (x) {
return x;
};
return function () {
var args = Array.prototype.slice.call(arguments);
var callback = args.pop();
var key = hasher.apply(null, args);
if (key in memo) {
callback.apply(null, memo[key]);
}
else {
fn.apply(null, args.concat([function () {
memo[key] = arguments;
callback.apply(null, arguments);
}]));
}
};
};
}());
(function(exports){

@@ -982,2 +1168,5 @@ /**

if(Object.keys) return Object.keys(obj);
if (typeof obj != 'object' && typeof obj != 'function') {
throw new TypeError('-');
}
var keys = [];

@@ -1132,12 +1321,2 @@ for(var k in obj){

return true;
} else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {
if (actual.length != expected.length) return false;
for (var i = 0; i < actual.length; i++) {
if (actual[i] !== expected[i]) return false;
}
return true;
// 7.2. If the expected value is a Date object, the actual value is

@@ -1305,2 +1484,3 @@ // equivalent if it is also a Date object that refers to the same time.

* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
* You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build.
* Only code on that line will be removed, its mostly to avoid requiring code

@@ -1314,2 +1494,4 @@ * that is node specific

//var assert = require('./assert'), //@REMOVE_LINE_FOR_BROWSER
// async = require('../deps/async'); //@REMOVE_LINE_FOR_BROWSER

@@ -1352,7 +1534,12 @@

var failures = 0;
for (var i=0; i<this.length; i++) {
if (this[i].failed()) failures++;
for (var i = 0; i < this.length; i += 1) {
if (this[i].failed()) {
failures += 1;
}
}
return failures;
};
that.passes = function () {
return that.length - that.failures();
};
that.duration = duration || 0;

@@ -1373,3 +1560,3 @@ return that;

return function () {
var message = arguments[arity-1];
var message = arguments[arity - 1];
var a = exports.assertion({method: new_method, message: message});

@@ -1405,5 +1592,7 @@ try {

a_list.push(a);
async.nextTick(function () {
options.log(a);
});
if (options.log) {
async.nextTick(function () {
options.log(a);
});
}
});

@@ -1420,5 +1609,7 @@

a_list.push(a1);
async.nextTick(function () {
options.log(a1);
});
if (options.log) {
async.nextTick(function () {
options.log(a1);
});
}
}

@@ -1428,5 +1619,7 @@ if (err) {

a_list.push(a2);
async.nextTick(function () {
options.log(a2);
});
if (options.log) {
async.nextTick(function () {
options.log(a2);
});
}
}

@@ -1475,3 +1668,3 @@ var end = new Date().getTime();

optionalCallback('testDone');
optionalCallback('log');
//optionalCallback('log');

@@ -1490,2 +1683,3 @@ // 'done' callback is not optional.

* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
* You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build.
* Only code on that line will be removed, its mostly to avoid requiring code

@@ -1499,2 +1693,4 @@ * that is node specific

//var async = require('../deps/async'), //@REMOVE_LINE_FOR_BROWSER
// types = require('./types'); //@REMOVE_LINE_FOR_BROWSER

@@ -1506,7 +1702,11 @@

var _keys = function(obj){
if(Object.keys) return Object.keys(obj);
var _keys = function (obj) {
if (Object.keys) {
return Object.keys(obj);
}
var keys = [];
for(var k in obj){
if(obj.hasOwnProperty(k)) keys.push(k);
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
keys.push(k);
}
}

@@ -1517,2 +1717,12 @@ return keys;

var _copy = function (obj) {
var nobj = {};
var keys = _keys(obj);
for (var i = 0; i < keys.length; i += 1) {
nobj[keys[i]] = obj[keys[i]];
}
return nobj;
};
/**

@@ -1574,3 +1784,17 @@ * Runs a test function (fn) from a loaded module. After the test function

if (typeof prop === 'function') {
exports.runTest(_name, suite[k], opt, cb);
var in_name = false;
for (var i = 0; i < _name.length; i += 1) {
if (_name[i] === opt.testspec) {
in_name = true;
}
}
if (!opt.testspec || in_name) {
if (opt.moduleStart) {
opt.moduleStart();
}
exports.runTest(_name, suite[k], opt, cb);
}
else {
return cb();
}
}

@@ -1594,8 +1818,17 @@ else {

exports.runModule = function (name, mod, opt, callback) {
var options = types.options(opt);
var options = _copy(types.options(opt));
options.moduleStart(name);
var _run = false;
var _moduleStart = options.moduleStart;
function run_once() {
if (!_run) {
_run = true;
_moduleStart(name);
}
}
options.moduleStart = run_once;
var start = new Date().getTime();
exports.runSuite(null, mod, opt, function (err, a_list) {
exports.runSuite(null, mod, options, function (err, a_list) {
var end = new Date().getTime();

@@ -1635,2 +1868,75 @@ var assertion_list = types.assertionList(a_list, end - start);

/**
* Wraps a test function with setUp and tearDown functions.
* Used by testCase.
*
* @param {Function} setUp
* @param {Function} tearDown
* @param {Function} fn
* @api private
*/
var wrapTest = function (setUp, tearDown, fn) {
return function (test) {
var context = {};
if (tearDown) {
var done = test.done;
test.done = function (err) {
try {
tearDown.call(context, function (err2) {
if (err && err2) {
test._assertion_list.push(
types.assertion({error: err})
);
return done(err2);
}
done(err || err2);
});
}
catch (e) {
done(e);
}
};
}
if (setUp) {
setUp.call(context, function (err) {
if (err) {
return test.done(err);
}
fn.call(context, test);
});
}
else {
fn.call(context, test);
}
};
};
/**
* Wraps a group of tests with setUp and tearDown functions.
* Used by testCase.
*
* @param {Function} setUp
* @param {Function} tearDown
* @param {Object} group
* @api private
*/
var wrapGroup = function (setUp, tearDown, group) {
var tests = {};
var keys = _keys(group);
for (var i = 0; i < keys.length; i += 1) {
var k = keys[i];
if (typeof group[k] === 'function') {
tests[k] = wrapTest(setUp, tearDown, group[k]);
}
else if (typeof group[k] === 'object') {
tests[k] = wrapGroup(setUp, tearDown, group[k]);
}
}
return tests;
};
/**
* Utility for wrapping a suite of test functions with setUp and tearDown

@@ -1645,4 +1951,2 @@ * functions.

exports.testCase = function (suite) {
var tests = {};
var setUp = suite.setUp;

@@ -1652,43 +1956,3 @@ var tearDown = suite.tearDown;

delete suite.tearDown;
var keys = _keys(suite);
// TODO: replace reduce here with browser-safe alternative
return keys.reduce(function (tests, k) {
tests[k] = function (test) {
var context = {};
if (tearDown) {
var done = test.done;
test.done = function (err) {
try {
tearDown.call(context, function (err2) {
if (err && err2) {
test._assertion_list.push(
types.assertion({error: err})
);
return done(err2);
}
done(err || err2);
});
}
catch (e) {
done(e);
}
};
}
if (setUp) {
setUp.call(context, function (err) {
if (err) {
return test.done(err);
}
suite[k].call(context, test);
});
}
else {
suite[k].call(context, test);
}
};
return tests;
}, {});
return wrapGroup(setUp, tearDown, suite);
};

@@ -1703,2 +1967,3 @@ })(core);

* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
* You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build.
* Only code on that line will be removed, its mostly to avoid requiring code

@@ -1722,26 +1987,2 @@ * that is node specific

exports.addStyles = function () {
document.body.innerHTML += '<style type="text/css">' +
'body { font: 12px Helvetica Neue }' +
'h2 { margin:0 ; padding:0 }' +
'pre {' +
'font: 11px Andale Mono;' +
'margin-left: 1em;' +
'padding-left: 1em;' +
'margin-top: 0;' +
'font-size:smaller;' +
'}' +
'.assertion_message { margin-left: 1em; }' +
' ol {' +
'list-style: none;' +
'margin-left: 1em;' +
'padding-left: 1em;' +
'text-indent: -1em;' +
'}' +
' ol li.pass:before { content: "\\2714 \\0020"; }' +
' ol li.fail:before { content: "\\2716 \\0020"; }' +
'</style>';
};
/**

@@ -1756,48 +1997,84 @@ * Run all tests within each module, reporting the results

var start = new Date().getTime();
exports.addStyles();
var html = '';
function setText(el, txt) {
if ('innerText' in el) {
el.innerText = txt;
}
else if ('textContent' in el){
el.textContent = txt;
}
}
function getOrCreate(tag, id) {
var el = document.getElementById(id);
if (!el) {
el = document.createElement(tag);
el.id = id;
document.body.appendChild(el);
}
return el;
};
var header = getOrCreate('h1', 'nodeunit-header');
var banner = getOrCreate('h2', 'nodeunit-banner');
var userAgent = getOrCreate('h2', 'nodeunit-userAgent');
var tests = getOrCreate('ol', 'nodeunit-tests');
var result = getOrCreate('p', 'nodeunit-testresult');
setText(userAgent, navigator.userAgent);
nodeunit.runModules(modules, {
moduleStart: function (name) {
html += '<h2>' + name + '</h2>';
html += '<ol>';
/*var mheading = document.createElement('h2');
mheading.innerText = name;
results.appendChild(mheading);
module = document.createElement('ol');
results.appendChild(module);*/
},
testDone: function (name, assertions) {
if (!assertions.failures()) {
html += '<li class="pass">' + name + '</li>';
var test = document.createElement('li');
var strong = document.createElement('strong');
strong.innerHTML = name + ' <b style="color: black;">(' +
'<b class="fail">' + assertions.failures() + '</b>, ' +
'<b class="pass">' + assertions.passes() + '</b>, ' +
assertions.length +
')</b>';
test.className = assertions.failures() ? 'fail': 'pass';
test.appendChild(strong);
var aList = document.createElement('ol');
aList.style.display = 'none';
test.onclick = function () {
var d = aList.style.display;
aList.style.display = (d == 'none') ? 'block': 'none';
};
for (var i=0; i<assertions.length; i++) {
var li = document.createElement('li');
var a = assertions[i];
if (a.failed()) {
li.innerHTML = (a.message || a.method || 'no message') +
'<pre>' + (a.error.stack || a.error) + '</pre>';
li.className = 'fail';
}
else {
li.innerHTML = a.message || a.method || 'no message';
li.className = 'pass';
}
aList.appendChild(li);
}
else {
html += '<li class="fail">' + name;
for (var i=0; i<assertions.length; i++) {
var a = assertions[i];
if (a.failed()) {
if (a.error instanceof assert.AssertionError && a.message) {
html += '<div class="assertion_message">' +
'Assertion Message: ' + a.message +
'</div>';
}
html += '<pre>';
html += a.error.stack || a.error;
html += '</pre>';
}
};
html += '</li>';
}
test.appendChild(aList);
tests.appendChild(test);
},
moduleDone: function () {
html += '</ol>';
},
done: function (assertions) {
var end = new Date().getTime();
var duration = end - start;
if (assertions.failures()) {
html += '<h3>FAILURES: ' + assertions.failures() +
'/' + assertions.length + ' assertions failed (' +
assertions.duration + 'ms)</h3>';
}
else {
html += '<h3>OK: ' + assertions.length +
' assertions (' + assertions.duration + 'ms)</h3>';
}
document.body.innerHTML += html;
var failures = assertions.failures();
banner.className = failures ? 'fail': 'pass';
result.innerHTML = 'Tests completed in ' + duration +
' milliseconds.<br/><span class="passed">' +
assertions.passes() + '</span> assertions of ' +
'<span class="all">' + assertions.length + '<span> passed, ' +
assertions.failures() + ' failed.';
}

@@ -1804,0 +2081,0 @@ });

@@ -14,2 +14,5 @@ /**

if(Object.keys) return Object.keys(obj);
if (typeof obj != 'object' && typeof obj != 'function') {
throw new TypeError('-');
}
var keys = [];

@@ -169,2 +172,10 @@ for(var k in obj){

// 7.2.1 If the expcted value is a RegExp object, the actual value is
// equivalent if it is also a RegExp object that refers to the same source and options
} else if (actual instanceof RegExp && expected instanceof RegExp) {
return actual.source === expected.source &&
actual.global === expected.global &&
actual.ignoreCase === expected.ignoreCase &&
actual.multiline === expected.multiline;
// 7.3. Other pairs that do not both pass typeof value == "object",

@@ -171,0 +182,0 @@ // equivalence is determined by ==.

@@ -8,3 +8,3 @@ /*!

* You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build.
* Only code on that line will be removed, its mostly to avoid requiring code
* Only code on that line will be removed, it's mostly to avoid requiring code
* that is node specific

@@ -17,4 +17,5 @@ */

var async = require('../deps/async'), //@REMOVE_LINE_FOR_BROWSER
types = require('./types'); //@REMOVE_LINE_FOR_BROWSER
var async = require('../deps/async'), //@REMOVE_LINE_FOR_BROWSER
nodeunit = require('./nodeunit'), //@REMOVE_LINE_FOR_BROWSER
types = require('./types'); //@REMOVE_LINE_FOR_BROWSER

@@ -93,2 +94,3 @@

exports.runSuite = function (name, suite, opt, callback) {
suite = wrapGroup(suite);
var keys = _keys(suite);

@@ -100,3 +102,2 @@

_name = name ? [].concat(name, k) : [k];
_name.toString = function () {

@@ -145,2 +146,5 @@ // fallback for old one

var _moduleStart = options.moduleStart;
mod = wrapGroup(mod);
function run_once() {

@@ -160,2 +164,5 @@ if (!_run) {

options.moduleDone(name, assertion_list);
if (nodeunit.complete) {
nodeunit.complete(name, assertion_list);
}
callback(null, a_list);

@@ -239,21 +246,51 @@ });

/**
* Returns a serial callback from two functions.
*
* @param {Function} funcFirst
* @param {Function} funcSecond
* @api private
*/
var getSerialCallback = function (funcFirst, funcSecond) {
if (!(funcFirst && funcSecond))
return funcSecond || funcFirst;
return function (callback) {
funcFirst(function () {
funcSecond(callback);
});
};
}
/**
* Wraps a group of tests with setUp and tearDown functions.
* Used by testCase.
*
* @param {Function} setUp
* @param {Function} tearDown
* @param {Object} group
* @param {Function} parentSetUp
* @param {Function} parentTearDown
* @api private
*/
var wrapGroup = function (setUp, tearDown, group) {
var wrapGroup = function (group, parentSetUp, parentTearDown) {
var tests = {};
var setUp = group.setUp;
var tearDown = group.tearDown;
delete group.setUp;
delete group.tearDown;
var keys = _keys(group);
for (var i = 0; i < keys.length; i += 1) {
var k = keys[i];
if (typeof group[k] === 'function') {
tests[k] = wrapTest(setUp, tearDown, group[k]);
tests[k] = wrapTest(
getSerialCallback(parentSetUp, setUp),
getSerialCallback(tearDown, parentTearDown),
group[k]
);
}
else if (typeof group[k] === 'object') {
tests[k] = wrapGroup(setUp, tearDown, group[k]);
tests[k] = wrapGroup(group[k], setUp, tearDown);
}

@@ -266,16 +303,7 @@ }

/**
* Utility for wrapping a suite of test functions with setUp and tearDown
* functions.
*
* @param {Object} suite
* @return {Object}
* @api public
* Backwards compatibility for test suites using old testCase API
*/
exports.testCase = function (suite) {
var setUp = suite.setUp;
var tearDown = suite.tearDown;
delete suite.setUp;
delete suite.tearDown;
return wrapGroup(setUp, tearDown, suite);
return suite;
};

@@ -17,3 +17,4 @@ /*!

assert = require('./assert'),
path = require('path');
path = require('path')
events = require('events');

@@ -79,2 +80,3 @@

var end = new Date().getTime();
exports.done()
options.done(types.assertionList(all_assertions, end - start));

@@ -85,1 +87,21 @@ });

};
/* Export all prototypes from events.EventEmitter */
var label;
for (label in events.EventEmitter.prototype) {
exports[label] = events.EventEmitter.prototype[label];
}
/* Emit event 'complete' on completion of a test suite. */
exports.complete = function(name, assertions)
{
exports.emit('complete', name, assertions);
};
/* Emit event 'complete' on completion of all tests. */
exports.done = function()
{
exports.emit('done');
};
module.exports = exports;

@@ -34,3 +34,5 @@ /*!

exports.run = function (modules, options) {
var start = new Date().getTime();
var start = new Date().getTime(), div;
options = options || {};
div = options.div || document.body;

@@ -51,3 +53,3 @@ function setText(el, txt) {

el.id = id;
document.body.appendChild(el);
div.appendChild(el);
}

@@ -54,0 +56,0 @@ return el;

@@ -15,3 +15,3 @@ /*!

track = require('../track'),
path = require('path');
path = require('path'),
AssertionError = require('../assert').AssertionError;

@@ -33,3 +33,3 @@

exports.run = function (files, options) {
exports.run = function (files, options, callback) {

@@ -58,5 +58,2 @@ if (!options) {

var start = new Date().getTime();
var paths = files.map(function (p) {
return path.join(process.cwd(), p);
});
var tracker = track.createTracker(function (tracker) {

@@ -78,3 +75,3 @@ if (tracker.unfinished()) {

nodeunit.runFiles(paths, {
var opts = {
testspec: options.testspec,

@@ -122,2 +119,4 @@ moduleStart: function (name) {

}
if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
},

@@ -127,3 +126,11 @@ testStart: function(name) {

}
});
};
if (files && files.length) {
var paths = files.map(function (p) {
return path.join(process.cwd(), p);
});
nodeunit.runFiles(paths, opts);
} else {
nodeunit.runModules(files,opts);
}
};

@@ -15,3 +15,3 @@ /*!

track = require('../track'),
path = require('path');
path = require('path'),
AssertionError = require('../assert').AssertionError;

@@ -33,3 +33,3 @@

exports.run = function (files, options) {
exports.run = function (files, options, callback) {

@@ -99,2 +99,4 @@ var start = new Date().getTime();

}
if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
},

@@ -101,0 +103,0 @@ testStart: function (name) {

@@ -30,3 +30,3 @@ /*!

exports.run = function (files, options) {
exports.run = function (files, options, callback) {

@@ -105,5 +105,7 @@ var start = new Date().getTime();

console.log('</body>');
console.log('</html>');
if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
}
});
};

@@ -8,5 +8,7 @@ module.exports = {

'eclipse': require('./eclipse'),
'machineout': require('./machineout')
'machineout': require('./machineout'),
'tap': require('./tap'),
'nested': require('./nested')
// browser test reporter is not listed because it cannot be used
// with the command line tool, only inside a browser.
};

@@ -178,7 +178,7 @@ /*!

if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
});
});
}
});
}

@@ -19,3 +19,3 @@ /*!

track = require('../track'),
path = require('path');
path = require('path'),
AssertionError = require('../assert').AssertionError;

@@ -37,3 +37,3 @@

exports.run = function (files, options) {
exports.run = function (files, options, callback) {
// options doesn't effect

@@ -105,3 +105,5 @@

},
done: function (assertions, end) {},
done: function (assertions, end) {
if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
},
testStart: function(name) {

@@ -108,0 +110,0 @@ tracker.put(name);

@@ -30,3 +30,3 @@ /*!

exports.run = function (files, options) {
exports.run = function (files, options, callback) {

@@ -55,7 +55,4 @@ if (!options) {

var start = new Date().getTime();
var paths = files.map(function (p) {
return path.join(process.cwd(), p);
});
nodeunit.runFiles(paths, {
var opts = {
testspec: options.testspec,

@@ -112,4 +109,15 @@ moduleStart: function (name) {

}
if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
}
});
};
if (files && files.length) {
var paths = files.map(function (p) {
return path.join(process.cwd(), p);
});
nodeunit.runFiles(paths, opts);
} else {
nodeunit.runModules(files,opts);
}
};

@@ -30,3 +30,3 @@ /*!

exports.run = function (files, options) {
exports.run = function (files, options, callback) {

@@ -104,4 +104,6 @@ if (!options) {

}
if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
}
});
};

@@ -8,3 +8,3 @@ /*!

* You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build.
* Only code on that line will be removed, its mostly to avoid requiring code
* Only code on that line will be removed, it's mostly to avoid requiring code
* that is node specific

@@ -72,3 +72,3 @@ */

* Create a wrapper function for assert module methods. Executes a callback
* after the it's complete with an assertion object representing the result.
* after it's complete with an assertion object representing the result.
*

@@ -75,0 +75,0 @@ * @param {Function} callback

@@ -9,3 +9,6 @@ { "name": "nodeunit"

, "contributors" :
[ { "name": "Alex Gorbatchev"
[ { "name": "Romain Beauxis"
, "web": "https://github.com/toots"
}
, { "name": "Alex Gorbatchev"
, "web": "https://github.com/alexgorbatchev"

@@ -44,3 +47,3 @@ }

]
, "version": "0.5.5"
, "version": "0.6.0"
, "repository" :

@@ -50,3 +53,5 @@ { "type" : "git"

}
, "bugs" : { "web" : "http://github.com/caolan/nodeunit/issues" }
, "devDependencies":
{ "uglify-js": ">=1.1.0" }
, "bugs" : { "url" : "http://github.com/caolan/nodeunit/issues" }
, "licenses" :

@@ -59,2 +64,6 @@ [ { "type" : "MIT"

, "bin" : { "nodeunit" : "./bin/nodeunit" }
, "dependencies" :
{ "tap-assert": ">=0.0.9"
, "tap-producer": ">=0.0.1"
}
}

@@ -21,2 +21,3 @@ Nodeunit

* [coffeemate](https://github.com/coffeemate)
* [lambdalisue](https://github.com/lambdalisue)
* [luebken](https://github.com/luebken)

@@ -27,2 +28,3 @@ * [orlandov](https://github.com/orlandov)

* [thegreatape](https://github.com/thegreatape)
* [mmalecki](https://github.com/mmalecki)
* and thanks to [cjohansen](https://github.com/cjohansen) for input and advice

@@ -184,10 +186,7 @@ on implementing setUp and tearDown functions. See

Using these groups its possible to add setUp and tearDown functions to your
tests. Nodeunit has a utility function called testCase which allows you to
define a setUp function, which is run before each test, and a tearDown
function, which is run after each test calls test.done():
Using these groups, Nodeunit allows you to define a `setUp` function, which is
run before each test, and a `tearDown` function, which is run after each test
calls `test.done()`:
var testCase = require('nodeunit').testCase;
module.exports = testCase({
module.exports = {
setUp: function (callback) {

@@ -205,3 +204,3 @@ this.foo = 'bar';

}
});
};

@@ -353,2 +352,4 @@ In this way, its possible to have multiple groups of tests in a module, each

continuous integration tools such as [Hudson](http://hudson-ci.org/).
* __machineout__ - Simple reporter for machine analysis. There is [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim)
which is useful for TDD on VIM

@@ -426,2 +427,18 @@

__machineout__ reporter
----------------------------------------------
The default reporter is really readable for human but for machinally analysis.
When you want to analyze the output of nodeunit, use __machineout__ reporter and you will get
<img src="https://github.com/caolan/nodeunit/raw/master/img/example_machineout.png" />
nodeunit with vim
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There is [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim) so you can use nodeunit with VIM.
That compiler use __machineout__ reporter and it is useful to use with [vim-makegreen](https://github.com/reinh/vim-makegreen)
Contributing

@@ -428,0 +445,0 @@ ------------

@@ -8,3 +8,2 @@ /* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!

var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER
var testCase = nodeunit.testCase;

@@ -14,3 +13,3 @@ exports.testTestCase = function (test) {

var call_order = [];
var s = testCase({
var s = {
setUp: function (callback) {

@@ -38,3 +37,3 @@ call_order.push('setUp');

}
});
};
nodeunit.runSuite(null, s, {}, function () {

@@ -51,3 +50,3 @@ test.same(call_order, [

test.expect(1);
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -60,3 +59,3 @@ test.ok(true, 'tearDown called');

}
});
};
nodeunit.runSuite(null, s, {}, function () {

@@ -70,3 +69,3 @@ test.done();

var test_error = new Error('test error');
var s = testCase({
var s = {
setUp: function (callback) {

@@ -79,3 +78,3 @@ throw test_error;

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -91,3 +90,3 @@ test.equal(assertions.length, 1);

var test_error = new Error('test error');
var s = testCase({
var s = {
setUp: function (callback) {

@@ -100,3 +99,3 @@ callback(test_error);

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -112,3 +111,3 @@ test.equal(assertions.length, 1);

var test_error = new Error('test error');
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -120,3 +119,3 @@ throw test_error;

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -132,3 +131,3 @@ test.equal(assertions.length, 1);

var test_error = new Error('test error');
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -140,3 +139,3 @@ callback(test_error);

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -153,3 +152,3 @@ test.equal(assertions.length, 1);

var error2 = new Error('test error two');
var s = testCase({
var s = {
tearDown: function (callback) {

@@ -161,3 +160,3 @@ callback(error2);

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -173,3 +172,3 @@ test.equal(assertions.length, 2);

var call_order = [];
var s = testCase({
var s = {
setUp: function (callback) {

@@ -193,3 +192,3 @@ call_order.push('setUp');

}
});
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -210,3 +209,3 @@ test.same(call_order, [

var call_order = [];
var s = testCase({
var s = {
setUp: function (callback) {

@@ -224,3 +223,3 @@ call_order.push('setUp');

},
group1: testCase({
group1: {
setUp: function (callback) {

@@ -238,4 +237,4 @@ call_order.push('group1.setUp');

}
})
});
}
};
nodeunit.runSuite(null, s, {}, function (err, assertions) {

@@ -242,0 +241,0 @@ test.same(call_order, [

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc