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)
- }
- )
- })
|