prng-lfsr
Version:
seedable, seeded, pseudo random number generator, prng, linear feedback shift register, fibonnaci, galois, lfsr
103 lines (74 loc) • 2.89 kB
JavaScript
var fibonacci16 = require('../').fibonacci16
, test = require('tape')
;
/* START common 16bit lfsr tests */
test('fibonacci16 exists', function (assert) {
assert.ok(!!fibonacci16);
assert.is('function', typeof fibonacci16);
assert.end();
});
test('fibonacci16 rejects bad seeds', function (assert) {
assert.is(fibonacci16(), false, 'mandatory seed!');
assert.is(fibonacci16('foo'), false);
assert.is(fibonacci16(function () {}), false);
assert.is(fibonacci16({}), false);
assert.is(fibonacci16([]), false);
assert.is(fibonacci16(65536), false);
assert.is(fibonacci16(-1), false);
assert.is(fibonacci16(0), false);
assert.end();
});
test('fibonacci16 returns a function if seed ok', function (assert) {
assert.is(typeof fibonacci16(1), 'function');
assert.is(typeof fibonacci16(2), 'function');
assert.is(typeof fibonacci16(65535), 'function');
assert.is(typeof fibonacci16(0xACE1), 'function');
assert.end();
});
test('fibonacci16 has expected periodicity', function (assert) {
var seed = 0xACE1
, g = fibonacci16(seed)
, remainingIterations = 0xffff // 65535 iterations to return to start
, lastResult
;
while (remainingIterations--) {
if (seed === lastResult) { assert.ok(false, 'found seed value too early! remainingIterations: ' + remainingIterations) };
lastResult = g();
}
assert.is(lastResult, seed, '0xACE1 -------> 0xACE1 after maximum iterations');
assert.end();
});
test('fibonacci16 output bit stream', function (assert) {
var seed = 0xACE1
, g = fibonacci16(seed)
, remainingIterations = 0xffff // 65535 iterations to return to start. aka (2^n)-1
, lastResult
, bitString = ''
, maxZeroRun = /000000000000000/g // n - 1
, impossibleZeroRun = /0000000000000000/g // n
, maxOneRun = /1111111111111111/g // n
, impossibleOneRun = /11111111111111111/g // n + 1
, found
;
while (remainingIterations--) {
lastResult = g();
bitString += (lastResult >> 15) & 1; // left-most bit is last output bit. NB. different output bit to galois
}
assert.is(bitString.length, 0xffff, 'got right number of bits');
found = maxZeroRun.exec(bitString);
assert.is(found.length, 1, 'got right number of maximum runs of 0');
found = impossibleZeroRun.exec(bitString);
assert.is(found, null, 'got no runs of 0 exceeding n');
found = maxOneRun.exec(bitString);
assert.is(found.length, 1, 'got right number of maximum runs of 1');
found = impossibleOneRun.exec(bitString);
assert.is(found, null, 'got no runs of 1 exceeding n');
assert.end();
});
/* END common 16bit lfsr tests */
test('fibonacci16 returns successful next values', function (assert) {
var g = fibonacci16(0xACE1);
assert.is(g(), 0x5670, '0xACE1 -> 0x5670');
assert.is(g(), 0xAB38, '0x5670 -> 0xAB38');
assert.end();
});