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