| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 | /* 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)    }  )})
 |