| var assert = require('assert'); | 
 | var Pend = require('./'); | 
 |  | 
 | var tests = [ | 
 |   { | 
 |     name: "basic", | 
 |     fn: testBasic, | 
 |   }, | 
 |   { | 
 |     name: "max", | 
 |     fn: testWithMax, | 
 |   }, | 
 |   { | 
 |     name: "callback twice", | 
 |     fn: testCallbackTwice, | 
 |   }, | 
 |   { | 
 |     name: "calling wait twice", | 
 |     fn: testCallingWaitTwice, | 
 |   }, | 
 |   { | 
 |     name: "hold()", | 
 |     fn: testHoldFn, | 
 |   }, | 
 | ]; | 
 | var testCount = tests.length; | 
 |  | 
 | doOneTest(); | 
 |  | 
 | function doOneTest() { | 
 |   var test = tests.shift(); | 
 |   if (!test) { | 
 |     console.log(testCount + " tests passed."); | 
 |     return; | 
 |   } | 
 |   process.stdout.write(test.name + "..."); | 
 |   test.fn(function() { | 
 |     process.stdout.write("OK\n"); | 
 |     doOneTest(); | 
 |   }); | 
 | } | 
 |  | 
 | function testBasic(cb) { | 
 |   var pend = new Pend(); | 
 |   var results = []; | 
 |   pend.go(function(cb) { | 
 |     results.push(1); | 
 |     setTimeout(function() { | 
 |       results.push(3); | 
 |       cb(); | 
 |     }, 500); | 
 |   }); | 
 |   pend.go(function(cb) { | 
 |     results.push(2); | 
 |     setTimeout(function() { | 
 |       results.push(4); | 
 |       cb(); | 
 |     }, 1000); | 
 |   }); | 
 |   pend.wait(function(err) { | 
 |     assert.deepEqual(results, [1,2,3,4]); | 
 |     cb(); | 
 |   }); | 
 |   assert.deepEqual(results, [1, 2]); | 
 | } | 
 |  | 
 | function testWithMax(cb) { | 
 |   var pend = new Pend(); | 
 |   var results = []; | 
 |   pend.max = 2; | 
 |   pend.go(function(cb) { | 
 |     results.push('a'); | 
 |     setTimeout(function() { | 
 |       results.push(1); | 
 |       cb(); | 
 |     }, 500); | 
 |   }); | 
 |   pend.go(function(cb) { | 
 |     results.push('b'); | 
 |     setTimeout(function() { | 
 |       results.push(1); | 
 |       cb(); | 
 |     }, 500); | 
 |   }); | 
 |   pend.go(function(cb) { | 
 |     results.push('c'); | 
 |     setTimeout(function() { | 
 |       results.push(2); | 
 |       cb(); | 
 |     }, 100); | 
 |   }); | 
 |   pend.wait(function(err) { | 
 |     assert.deepEqual(results, ['a', 'b', 1, 'c', 1, 2]); | 
 |     cb(); | 
 |   }); | 
 |   assert.deepEqual(results, ['a', 'b']); | 
 | } | 
 |  | 
 | function testCallbackTwice(cb) { | 
 |   var pend = new Pend(); | 
 |   pend.go(function(cb) { | 
 |     setTimeout(cb, 100); | 
 |   }); | 
 |   pend.go(function(cb) { | 
 |     cb(); | 
 |     assert.throws(cb, /callback called twice/); | 
 |   }); | 
 |   pend.wait(cb); | 
 | } | 
 |  | 
 | function testCallingWaitTwice(cb) { | 
 |   var pend = new Pend(); | 
 |   pend.go(function(cb) { | 
 |     setTimeout(cb, 100); | 
 |   }); | 
 |   pend.wait(function() { | 
 |     pend.go(function(cb) { | 
 |       setTimeout(cb, 50); | 
 |     }); | 
 |     pend.go(function(cb) { | 
 |       setTimeout(cb, 10); | 
 |     }); | 
 |     pend.go(function(cb) { | 
 |       setTimeout(cb, 20); | 
 |     }); | 
 |     pend.wait(cb); | 
 |   }); | 
 | } | 
 |  | 
 | function testHoldFn(cb) { | 
 |   var pend = new Pend(); | 
 |   setTimeout(pend.hold(), 100); | 
 |   pend.go(function(cb) { | 
 |     cb(); | 
 |   }); | 
 |   pend.wait(cb); | 
 | } |