n-readlines-next
Version:
Read file line by line without buffering the whole file in memory.
122 lines (92 loc) • 4.33 kB
JavaScript
;
var lineByLine = require('./readlines.js');
var runThrough = require('./readlines_test_helpers.js').runThrough;
var exec = require('child_process').exec;
var assert = require('assert');
describe('Line by line', function() {
it('should get all lines', function () {
var filename = __dirname + '/dummy_files/twoLineFile.txt';
var liner = new lineByLine(filename);
assert(liner.next().toString('ascii') === 'hello');
assert(liner.next().toString('ascii') === 'hello2');
assert(liner.next() === false);
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should get all lines even if the file doesnt end with new line', function () {
var filename = __dirname + '/dummy_files/badEndFile.txt';
var liner = new lineByLine(filename);
assert(liner.next().toString('ascii') === 'google.com');
assert(liner.next().toString('ascii') === 'yahoo.com');
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should get all lines if there is no new lines', function () {
var filename = __dirname + '/dummy_files/noNewLinesFile.txt';
var liner = new lineByLine(filename);
assert(liner.next().toString('ascii') === 'no new line');
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should handle empty files', function () {
var filename = __dirname + '/dummy_files/emptyFile.txt';
var liner = new lineByLine(filename);
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should read right between two chunks', function () {
var filename = __dirname + '/dummy_files/normalFile.txt';
var liner = new lineByLine(filename, {'readChunk': 16});
assert(liner.next().toString('ascii') === 'google.com');
assert(liner.next().toString('ascii') === 'yahoo.com');
assert(liner.next().toString('ascii') === 'yandex.ru');
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should read empty lines', function () {
var filename = __dirname + '/dummy_files/withEmptyLines.txt';
var liner = new lineByLine(filename);
assert(liner.next().toString('ascii') === 'hello');
assert(liner.next().toString('ascii') === 'hello4');
assert(liner.next().toString('ascii') === '');
assert(liner.next().toString('ascii') === 'hello2');
assert(liner.next().toString('ascii') === 'hello3');
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should reset and start from the beggining', function() {
var filename = __dirname + '/dummy_files/normalFile.txt';
var liner = new lineByLine(filename, {'readChunk': 16});
assert(liner.next().toString('ascii') === 'google.com');
assert(liner.next().toString('ascii') === 'yahoo.com');
liner.reset()
assert(liner.next().toString('ascii') === 'google.com');
assert(liner.next().toString('ascii') === 'yahoo.com');
assert(liner.next().toString('ascii') === 'yandex.ru');
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should read big lines', function() {
var filename = __dirname + '/dummy_files/bigLines.json';
var liner = new lineByLine(filename);
var parsedLine = JSON.parse(liner.next().toString('ascii'));
assert(parsedLine);
var parsedLine = JSON.parse(liner.next().toString('ascii'));
assert(parsedLine);
var parsedLine = JSON.parse(liner.next().toString('ascii'));
assert(parsedLine);
assert(liner.next() === false);
assert(liner.fd === null);
});
it('should log time output', function() {
var file = 'movies.csv';
var filename = __dirname + '/dummy_files/' + file;
var trials = 50;
exec('wc -l ' + file, function(err, result) {
var numOfLines = result.trim().split(' ')[0];
var avg = runThrough(filename, lineByLine, trials);
console.log('average time in seconds to parse', file, '(' + numOfLines, 'line file):', avg.toFixed(5));
});
assert(true);
});
});