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.
259 lines
5.2 KiB
259 lines
5.2 KiB
var concat = require('level-concat-iterator')
|
|
|
|
var data = (function () {
|
|
var d = []
|
|
var i = 0
|
|
var k
|
|
for (; i < 100; i++) {
|
|
k = (i < 10 ? '0' : '') + i
|
|
d.push({
|
|
key: k,
|
|
value: String(Math.random())
|
|
})
|
|
}
|
|
return d
|
|
}())
|
|
|
|
exports.setUp = function (test, testCommon) {
|
|
test('setUp common', testCommon.setUp)
|
|
}
|
|
|
|
exports.range = function (test, testCommon) {
|
|
function rangeTest (name, opts, expected) {
|
|
test('db#clear() with ' + name, function (t) {
|
|
prepare(t, function (db) {
|
|
db.clear(opts, function (err) {
|
|
t.ifError(err, 'no clear error')
|
|
verify(t, db, expected)
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
function prepare (t, callback) {
|
|
var db = testCommon.factory()
|
|
|
|
db.open(function (err) {
|
|
t.ifError(err, 'no open error')
|
|
|
|
db.batch(data.map(function (d) {
|
|
return {
|
|
type: 'put',
|
|
key: d.key,
|
|
value: d.value
|
|
}
|
|
}), function (err) {
|
|
t.ifError(err, 'no batch error')
|
|
callback(db)
|
|
})
|
|
})
|
|
}
|
|
|
|
function verify (t, db, expected) {
|
|
var it = db.iterator({ keyAsBuffer: false, valueAsBuffer: false })
|
|
|
|
concat(it, function (err, result) {
|
|
t.ifError(err, 'no concat error')
|
|
t.is(result.length, expected.length, 'correct number of entries')
|
|
t.same(result, expected)
|
|
|
|
db.close(t.end.bind(t))
|
|
})
|
|
}
|
|
|
|
function exclude (data, start, end, expectedLength) {
|
|
data = data.slice()
|
|
var removed = data.splice(start, end - start + 1) // Inclusive
|
|
if (expectedLength != null) checkLength(removed, expectedLength)
|
|
return data
|
|
}
|
|
|
|
// For sanity checks on test arguments
|
|
function checkLength (arr, length) {
|
|
if (arr.length !== length) {
|
|
throw new RangeError('Expected ' + length + ' elements, got ' + arr.length)
|
|
}
|
|
|
|
return arr
|
|
}
|
|
|
|
rangeTest('full range', {}, [])
|
|
|
|
// Reversing has no effect without limit
|
|
rangeTest('reverse=true', {
|
|
reverse: true
|
|
}, [])
|
|
|
|
rangeTest('gte=00', {
|
|
gte: '00'
|
|
}, [])
|
|
|
|
rangeTest('gte=50', {
|
|
gte: '50'
|
|
}, data.slice(0, 50))
|
|
|
|
rangeTest('lte=50 and reverse=true', {
|
|
lte: '50',
|
|
reverse: true
|
|
}, data.slice(51))
|
|
|
|
rangeTest('gte=49.5 (midway)', {
|
|
gte: '49.5'
|
|
}, data.slice(0, 50))
|
|
|
|
rangeTest('gte=49999 (midway)', {
|
|
gte: '49999'
|
|
}, data.slice(0, 50))
|
|
|
|
rangeTest('lte=49.5 (midway) and reverse=true', {
|
|
lte: '49.5',
|
|
reverse: true
|
|
}, data.slice(50))
|
|
|
|
rangeTest('lt=49.5 (midway) and reverse=true', {
|
|
lt: '49.5',
|
|
reverse: true
|
|
}, data.slice(50))
|
|
|
|
rangeTest('lt=50 and reverse=true', {
|
|
lt: '50',
|
|
reverse: true
|
|
}, data.slice(50))
|
|
|
|
rangeTest('lte=50', {
|
|
lte: '50'
|
|
}, data.slice(51))
|
|
|
|
rangeTest('lte=50.5 (midway)', {
|
|
lte: '50.5'
|
|
}, data.slice(51))
|
|
|
|
rangeTest('lte=50555 (midway)', {
|
|
lte: '50555'
|
|
}, data.slice(51))
|
|
|
|
rangeTest('lt=50555 (midway)', {
|
|
lt: '50555'
|
|
}, data.slice(51))
|
|
|
|
rangeTest('gte=50.5 (midway) and reverse=true', {
|
|
gte: '50.5',
|
|
reverse: true
|
|
}, data.slice(0, 51))
|
|
|
|
rangeTest('gt=50.5 (midway) and reverse=true', {
|
|
gt: '50.5',
|
|
reverse: true
|
|
}, data.slice(0, 51))
|
|
|
|
rangeTest('gt=50 and reverse=true', {
|
|
gt: '50',
|
|
reverse: true
|
|
}, data.slice(0, 51))
|
|
|
|
// Starting key is actually '00' so it should avoid it
|
|
rangeTest('lte=0', {
|
|
lte: '0'
|
|
}, data)
|
|
|
|
// Starting key is actually '00' so it should avoid it
|
|
rangeTest('lt=0', {
|
|
lt: '0'
|
|
}, data)
|
|
|
|
rangeTest('gte=30 and lte=70', {
|
|
gte: '30',
|
|
lte: '70'
|
|
}, exclude(data, 30, 70))
|
|
|
|
rangeTest('gt=29 and lt=71', {
|
|
gt: '29',
|
|
lt: '71'
|
|
}, exclude(data, 30, 70))
|
|
|
|
rangeTest('gte=30 and lte=70 and reverse=true', {
|
|
lte: '70',
|
|
gte: '30',
|
|
reverse: true
|
|
}, exclude(data, 30, 70))
|
|
|
|
rangeTest('gt=29 and lt=71 and reverse=true', {
|
|
lt: '71',
|
|
gt: '29',
|
|
reverse: true
|
|
}, exclude(data, 30, 70))
|
|
|
|
rangeTest('limit=20', {
|
|
limit: 20
|
|
}, data.slice(20))
|
|
|
|
rangeTest('limit=20 and gte=20', {
|
|
limit: 20,
|
|
gte: '20'
|
|
}, exclude(data, 20, 39, 20))
|
|
|
|
rangeTest('limit=20 and reverse=true', {
|
|
limit: 20,
|
|
reverse: true
|
|
}, data.slice(0, -20))
|
|
|
|
rangeTest('limit=20 and lte=79 and reverse=true', {
|
|
limit: 20,
|
|
lte: '79',
|
|
reverse: true
|
|
}, exclude(data, 60, 79, 20))
|
|
|
|
rangeTest('limit=-1 should clear whole database', {
|
|
limit: -1
|
|
}, [])
|
|
|
|
rangeTest('limit=0 should not clear anything', {
|
|
limit: 0
|
|
}, data)
|
|
|
|
rangeTest('lte after limit', {
|
|
limit: 20,
|
|
lte: '50'
|
|
}, data.slice(20))
|
|
|
|
rangeTest('lte before limit', {
|
|
limit: 50,
|
|
lte: '19'
|
|
}, data.slice(20))
|
|
|
|
rangeTest('gte after database end', {
|
|
gte: '9a'
|
|
}, data)
|
|
|
|
rangeTest('gt after database end', {
|
|
gt: '9a'
|
|
}, data)
|
|
|
|
rangeTest('lte after database end and reverse=true', {
|
|
lte: '9a',
|
|
reverse: true
|
|
}, [])
|
|
|
|
rangeTest('lte and gte after database and reverse=true', {
|
|
lte: '9b',
|
|
gte: '9a',
|
|
reverse: true
|
|
}, data)
|
|
|
|
rangeTest('lt and gt after database and reverse=true', {
|
|
lt: '9b',
|
|
gt: '9a',
|
|
reverse: true
|
|
}, data)
|
|
}
|
|
|
|
exports.tearDown = function (test, testCommon) {
|
|
test('tearDown', testCommon.tearDown)
|
|
}
|
|
|
|
exports.all = function (test, testCommon) {
|
|
exports.setUp(test, testCommon)
|
|
exports.range(test, testCommon)
|
|
exports.tearDown(test, testCommon)
|
|
}
|