| /* jshint loopfunc:true */ | 
| /* global describe:true, beforeEach:true, afterEach:true, it:true */ | 
|   | 
| var chan   = require('..') | 
| var expect = require('expect.js') | 
|   | 
| describe('Channel select', function () { | 
|   var random | 
|   beforeEach(function (done) { | 
|     // save Math.random | 
|     random = Math.random | 
|     done() | 
|   }) | 
|   | 
|   afterEach(function (done) { | 
|     // restore Math.random | 
|     Math.random = random | 
|     done() | 
|   }) | 
|   | 
|   it( | 
|     'should be able to select on channels', | 
|     function (done) { | 
|       var ch1 = chan() | 
|       var ch2 = chan() | 
|       chan.select(ch1, ch2)(function (err, ch) { | 
|         expect(ch).to.equal(ch2) | 
|         ch2.selected(function (err, val) { | 
|           expect(val).to.equal(42) | 
|           done() | 
|         }) | 
|       }) | 
|       ch2(42) | 
|     } | 
|   ) | 
|   | 
|   it( | 
|     'should be able to select on multiple channels', | 
|     function (done) { | 
|       var chs = [chan(), chan()] | 
|       var remaining = chs.length | 
|       chs.forEach(function (needle, i) { | 
|         chan.select.apply(null, chs)(function (err, ch) { | 
|           expect(ch).to.equal(needle) | 
|           ch.selected(function (err, val) { | 
|             expect(val).to.equal(i*10) | 
|             if (--remaining === 0) { | 
|               done() | 
|             } | 
|           }) | 
|         }) | 
|       }) | 
|       chs.forEach(function (ch, i) { | 
|         ch(i*10) | 
|       }) | 
|     } | 
|   ) | 
|   | 
|   it( | 
|     'should be able to select with queued messages', | 
|     function (done) { | 
|       var chs = [chan(), chan()] | 
|       var remaining = chs.length | 
|       var i = -1 | 
|       while (++i < 10) { | 
|         (function (i) { | 
|           chan.select.apply(null, chs)(function (err, ch) { | 
|             expect(ch).to.equal(chs[0]) | 
|             ch.selected(function (err, val) { | 
|               expect(val).to.equal(i * 10) | 
|               if (--remaining === 0) { | 
|                 done() | 
|               } | 
|             }) | 
|           }) | 
|         })(i) | 
|       } | 
|       var j = -1 | 
|       while (++j < 10) { | 
|         chs[0](j * 10) | 
|       } | 
|     } | 
|   ) | 
|   | 
|   it( | 
|     'should be able to select with existing messages on the channels', | 
|     function (done) { | 
|       var ch1 = chan() | 
|       var ch2 = chan() | 
|       ch2(42) | 
|       chan.select(ch1, ch2)(function (err, ch) { | 
|         expect(ch).to.equal(ch2) | 
|         ch2.selected(function (err, val) { | 
|           expect(val).to.equal(42) | 
|           done() | 
|         }) | 
|       }) | 
|     } | 
|   ) | 
|   | 
|   it( | 
|     'should randomly choose a channel to return with multiple full channels', | 
|     function (done) { | 
|       var ch1 = chan() | 
|       var ch2 = chan() | 
|   | 
|       // force the random selection to be the second channel | 
|       Math.random = function () { return 0.5 } | 
|   | 
|       // fill up both the channels | 
|       ch1(21) | 
|       ch2(42) | 
|   | 
|       // random selection should choose the second channel "randomly" | 
|       chan.select(ch1, ch2)(function (err, ch) { | 
|         expect(ch).to.equal(ch2) | 
|         ch2.selected(function (err, val) { | 
|           expect(val).to.equal(42) | 
|           done() | 
|         }) | 
|       }) | 
|     } | 
|   ) | 
|   | 
|   it ( | 
|     'should wait for previously queued callbacks before selecting', | 
|     function (done) { | 
|       var ch1 = chan() | 
|       var ch2 = chan() | 
|   | 
|       // queue a callback for ch1 | 
|       ch1(function () {}) | 
|   | 
|       chan.select(ch1, ch2)(function (err, ch) { | 
|         expect(ch).to.be(ch2) | 
|         done() | 
|       }) | 
|   | 
|       ch1(74) | 
|       ch2(47) | 
|     } | 
|   ) | 
| }) |