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.
156 lines
3.6 KiB
156 lines
3.6 KiB
var varint = require('./index') |
|
, test = require('tape') |
|
, decode = varint.decode |
|
, encode = varint.encode |
|
, encodingLength = varint.encodingLength |
|
|
|
test('fuzz test', function(assert) { |
|
var expect |
|
, encoded |
|
|
|
for(var i = 0, len = 100; i < len; ++i) { |
|
expect = randint(0x7FFFFFFF) |
|
encoded = encode(expect) |
|
var data = decode(encoded) |
|
assert.equal(expect, data, 'fuzz test: ' + expect.toString()) |
|
assert.equal(decode.bytes, encoded.length) |
|
} |
|
|
|
assert.end() |
|
}) |
|
|
|
test('test single byte works as expected', function(assert) { |
|
var buf = new Uint8Array(2) |
|
buf[0] = 172 |
|
buf[1] = 2 |
|
var data = decode(buf) |
|
assert.equal(data, 300, 'should equal 300') |
|
assert.equal(decode.bytes, 2) |
|
assert.end() |
|
}) |
|
|
|
test('test encode works as expected', function(assert) { |
|
var out = [] |
|
|
|
assert.deepEqual(encode(300), [0xAC, 0x02]) |
|
|
|
assert.end() |
|
}) |
|
|
|
test('test decode single bytes', function(assert) { |
|
var expected = randint(parseInt('1111111', '2')) |
|
var buf = new Uint8Array(1) |
|
buf[0] = expected |
|
var data = decode(buf) |
|
assert.equal(data, expected) |
|
assert.equal(decode.bytes, 1) |
|
assert.end() |
|
}) |
|
|
|
test('test decode multiple bytes with zero', function(assert) { |
|
var expected = randint(parseInt('1111111', '2')) |
|
var buf = new Uint8Array(2) |
|
buf[0] = 128 |
|
buf[1] = expected |
|
var data = decode(buf) |
|
assert.equal(data, expected << 7) |
|
assert.equal(decode.bytes, 2) |
|
assert.end() |
|
}) |
|
|
|
test('encode single byte', function(assert) { |
|
var expected = randint(parseInt('1111111', '2')) |
|
assert.deepEqual(encode(expected), [expected]) |
|
assert.equal(encode.bytes, 1) |
|
assert.end() |
|
}) |
|
|
|
test('encode multiple byte with zero first byte', function(assert) { |
|
var expected = 0x0F00 |
|
assert.deepEqual(encode(expected), [0x80, 0x1E]) |
|
assert.equal(encode.bytes, 2) |
|
assert.end() |
|
}) |
|
|
|
test('big integers', function (assert) { |
|
|
|
var bigs = [] |
|
for(var i = 32; i <= 53; i++) (function (i) { |
|
bigs.push(Math.pow(2, i) - 1) |
|
})(i) |
|
|
|
bigs.forEach(function (n) { |
|
var data = encode(n) |
|
console.error(n, '->', data) |
|
assert.equal(decode(data), n) |
|
assert.notEqual(decode(data), n - 1) |
|
}) |
|
assert.end() |
|
}) |
|
|
|
test('fuzz test - big', function(assert) { |
|
var expect |
|
, encoded |
|
|
|
var MAX_INTD = Number.MAX_SAFE_INTEGER |
|
var MAX_INT = Math.pow(2, 31) |
|
|
|
for(var i = 0, len = 100; i < len; ++i) { |
|
expect = randint(MAX_INTD - MAX_INT) + MAX_INT |
|
encoded = encode(expect) |
|
var data = decode(encoded) |
|
assert.equal(expect, data, 'fuzz test: ' + expect.toString()) |
|
assert.equal(decode.bytes, encoded.length) |
|
} |
|
|
|
assert.end() |
|
}) |
|
|
|
test('encodingLength', function (assert) { |
|
|
|
for(var i = 0; i <= 53; i++) { |
|
var n = Math.pow(2, i) - 1 |
|
assert.equal(encode(n).length, encodingLength(n)) |
|
} |
|
|
|
assert.end() |
|
}) |
|
|
|
test('buffer too short', function (assert) { |
|
|
|
var value = encode(9812938912312) |
|
var buffer = encode(value) |
|
|
|
var l = buffer.length |
|
while(l--) { |
|
try { |
|
var val = decode(buffer.slice(0, l)) |
|
} catch (err) { |
|
assert.equal(err.constructor, RangeError) |
|
assert.equal(decode.bytes, 0) |
|
} |
|
} |
|
assert.end() |
|
}) |
|
|
|
test('buffer too long', function (assert) { |
|
|
|
var buffer = Uint8Array.from( |
|
Array.from({length: 150}, function () { return 0xff }) |
|
.concat(Array.from({length: 1}, function () { return 0x1 })) |
|
) |
|
|
|
try { |
|
var val = decode(buffer) |
|
encode(val) |
|
assert.fail('expected an error received value instead: ' + val) |
|
} catch (err) { |
|
assert.equal(err.constructor, RangeError) |
|
assert.equal(decode.bytes, 0) |
|
} |
|
assert.end() |
|
}) |
|
|
|
function randint(range) { |
|
return Math.floor(Math.random() * range) |
|
}
|
|
|