/* jshint loopfunc: true */
|
/* global describe:true, beforeEach:true, it:true */
|
|
var chan = require('..')
|
var expect = require('expect.js')
|
|
describe('A unbuffered channel', function () {
|
|
it(
|
'should not call the added callback until the value is removed',
|
function (done) {
|
var ch = chan(0) // unbuffered
|
var cbCalled = false
|
ch('foo')(function () {
|
cbCalled = true
|
})
|
setImmediate(function () {
|
expect(cbCalled).to.not.be.ok()
|
ch(function (err, val) {
|
setImmediate(function () {
|
expect(cbCalled).to.be.ok()
|
done()
|
})
|
})
|
})
|
}
|
)
|
|
})
|
|
describe('A buffered channel', function () {
|
|
it(
|
'should pull values from the buffer when yielded',
|
function (done) {
|
var ch = chan(1)
|
var cbCalled = false
|
var testValue = 'foo'
|
ch(testValue)
|
ch(function (err, val) {
|
cbCalled = true
|
expect(val).to.be(testValue)
|
})
|
setImmediate(function () {
|
expect(cbCalled).to.be.ok()
|
done()
|
})
|
}
|
)
|
|
describe('with a non-full buffer', function () {
|
|
it(
|
'should call added callback as soon as it is given to the returned thunk',
|
function (done) {
|
var buffer = 3
|
var ch = chan(buffer)
|
var called = 0
|
var added = 0
|
while (++added <= buffer + 10) {
|
ch(added)(function (err) {
|
called++
|
})
|
}
|
setImmediate(function () {
|
expect(called).to.be(buffer)
|
done()
|
})
|
}
|
)
|
|
})
|
|
describe('with a full buffer', function () {
|
|
it(
|
'should not add another value untill a value has been removed',
|
function (done) {
|
var ch = chan(1)
|
var cbCalled = false
|
ch('foo')
|
ch('bar')(function () {
|
cbCalled = true
|
})
|
setImmediate(function () {
|
expect(cbCalled).to.not.be.ok()
|
ch(function (err, val) {
|
setImmediate(function () {
|
expect(cbCalled).to.be.ok()
|
done()
|
})
|
})
|
})
|
}
|
)
|
|
it(
|
'should call cb with an error when the channel is closed before adding',
|
function (done) {
|
var ch = chan(0)
|
var cbCalled = false
|
ch('foo')(function (err) {
|
cbCalled = true
|
expect(err).to.be.an(Error)
|
})
|
ch.close()
|
setImmediate(function () {
|
expect(cbCalled).to.be.ok()
|
done()
|
})
|
}
|
)
|
|
})
|
|
})
|