UNPKG

prng-lfsr

Version:

seedable, seeded, pseudo random number generator, prng, linear feedback shift register, fibonnaci, galois, lfsr

103 lines (74 loc) 2.89 kB
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(); });