You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
3.2 KiB

var pull = require('../')
var test = require('tape')
test('through - onEnd', function (t) {
t.plan(2)
var values = [1,2,3,4,5,6,7,8,9,10]
//read values, and then just stop!
//this is a subtle edge case for take!
//I did have a thing that used this edge case,
//but it broke take, actually. so removing it.
//TODO: fix that thing - was a test for some level-db stream thing....
// pull.Source(function () {
// return function (end, cb) {
// if(end) cb(end)
// else if(values.length)
// cb(null, values.shift())
// else console.log('drop')
// }
// })()
pull(
pull.values(values),
pull.take(10),
pull.through(null, function (err) {
console.log('end')
t.ok(true)
process.nextTick(function () {
t.end()
})
}),
pull.collect(function (err, ary) {
console.log(ary)
t.ok(true)
})
)
})
test('take - exclude last (default)', function (t) {
pull(
pull.values([1,2,3,4,5,6,7,8,9,10]),
pull.take(function(n) {return n<5}),
pull.collect(function (err, four) {
t.deepEqual(four, [1,2,3,4])
t.end()
})
)
})
test('take - include last', function (t) {
pull(
pull.values([1,2,3,4,5,6,7,8,9,10]),
pull.take(function(n) {return n<5}, {last: true}),
pull.collect(function (err, five) {
t.deepEqual(five, [1,2,3,4,5])
t.end()
})
)
})
test('take 5 causes 5 reads upstream', function (t) {
var reads = 0
pull(
pull.values([1,2,3,4,5,6,7,8,9,10]),
function (read) {
return function (end, cb) {
if (end !== true) reads++
console.log(reads, end)
read(end, cb)
}
},
pull.take(5),
pull.collect(function (err, five) {
t.deepEqual(five, [1,2,3,4,5])
process.nextTick(function() {
t.equal(reads, 5)
t.end()
})
})
)
})
test("take doesn't abort until the last read", function (t) {
var aborted = false
var ary = [1,2,3,4,5], i = 0
var read = pull(
function (abort, cb) {
if(abort) cb(aborted = true)
else if(i > ary.length) cb(true)
else cb(null, ary[i++])
},
pull.take(function (d) {
return d < 3
}, {last: true})
)
read(null, function (_, d) {
t.notOk(aborted, "hasn't aborted yet")
read(null, function (_, d) {
t.notOk(aborted, "hasn't aborted yet")
read(null, function (_, d) {
t.notOk(aborted, "hasn't aborted yet")
read(null, function (end, d) {
t.ok(end, 'stream ended')
t.equal(d, undefined, 'data undefined')
t.ok(aborted, "has aborted by now")
t.end()
})
})
})
})
})
test('take should throw error on last read', function (t) {
var i = 0
var error = new Error('error on last call')
pull(
pull.values([1,2,3,4,5,6,7,8,9,10]),
pull.take(function(n) {return n<5}, {last: true}),
// pull.take(5),
pull.asyncMap(function (data, cb) {
setTimeout(function () {
if(++i < 5) cb(null, data)
else cb(error)
}, 100)
}),
pull.collect(function (err, five) {
t.equal(err, error, 'should return err')
t.deepEqual(five, [1,2,3,4], 'should skip failed item')
t.end()
})
)
})