Skip to content

Commit

Permalink
WIP tests 1
Browse files Browse the repository at this point in the history
  • Loading branch information
overlookmotel committed Oct 6, 2019
1 parent dea3104 commit 8c1bd48
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 1 deletion.
12 changes: 12 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
},
"dependencies": {},
"devDependencies": {
"@offirmo/random": "^2.0.4",
"@overlookmotel/eslint-config": "^4.3.2",
"@overlookmotel/eslint-config-jest": "^2.1.0",
"coveralls": "^3.0.6",
Expand All @@ -25,7 +26,8 @@
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jest": "^22.17.0",
"eslint-plugin-node": "^10.0.0",
"jest": "^24.9.0"
"jest": "^24.9.0",
"stream-gen": "^2.0.1"
},
"keywords": [
"stream",
Expand Down
3 changes: 3 additions & 0 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
// Modules
const streamChop = require('../index');

// Imports
const {createReadStream} = require('./streams.js');

// Init
require('./support');

Expand Down
99 changes: 99 additions & 0 deletions test/streams.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/* --------------------
* stream-chop
* Functions to create test streams
* ------------------*/

/* eslint-disable no-bitwise */

'use strict';

// Modules
const {GeneratorReadStream, GeneratorWriteStream} = require('stream-gen'),
Random = require('@offirmo/random');

// Constants
const SEED = 0;

// Exports

module.exports = {
createReadStream,
createWriteStream
};

/**
* Create readable byte stream of specified length.
* Stream of bytes is drawn from MT pseudo-random generator.
* Output for same `start` and `len` is deterministic.
*
* @param {number} start - Start bytes of sequence
* @param {number} len - Length of sequence
* @returns {Stream} - Readable data stream
*/
function createReadStream(start, len) {
const gen = createGenerator(start, len);
return new GeneratorReadStream(gen);
}

/**
* Create writable stream.
* It checks that data piped into it matches expected
* i.e. same data as in stream from `createReadStream()`.
* Callback is called with error if data does not match, or with `null` when stream ends without error.
*
* @param {number} start - Start bytes of sequence
* @param {number} len - Length of sequence
* @param {function} cb - Callback - called with `null` when stream ends, or an error if matching fail
* @returns {Stream} - Readable data stream
*/
function createWriteStream(start, len, cb) {
const gen = createGenerator(start, len);
return new GeneratorWriteStream(gen, cb);
}

function createGenerator(start, len) {
// Init MT pseudo-random number generator
const mt = Random.engines.mt19937();
mt.seed(SEED);

// Init empty buffer
let leftover = 0,
leftoverBytes = 0;

// Discard start
if (start > 0) {
const discardBytes = start % 4,
discardQuads = (start - discardBytes) / 4;
if (discardQuads > 0) mt.discard(discardQuads);

if (discardBytes > 0) {
// Get new 32-bit number, discard unneeded bytes, and put rest in leftover
leftover = mt();
leftover >>= discardBytes * 8;
leftoverBytes = 4 - discardBytes;
}
}

// Create generator to produce bytes
let bytesRemaining = len;
function next() {
// If finished, end generator
if (bytesRemaining === 0) return {value: undefined, done: true};

// If no leftover, pull another 32-bit number from MT.
if (leftoverBytes === 0) {
leftover = mt();
leftoverBytes = 4;
}

// Pull lowest byte from leftover
const value = leftover & 0xFF;
leftover >>= 8;
leftoverBytes--;
bytesRemaining--;

return {value, done: false};
}

return () => ({next});
}

0 comments on commit 8c1bd48

Please sign in to comment.