mirror of
https://github.com/0x5eal/rbxts-pako.git
synced 2025-04-05 19:31:01 +01:00
172 lines
4.1 KiB
JavaScript
172 lines
4.1 KiB
JavaScript
'use strict';
|
|
|
|
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var _ = require('lodash');
|
|
var async = require('async');
|
|
|
|
var pako_utils = require('../lib/utils/common');
|
|
var pako = require('../index');
|
|
|
|
// Load fixtures to test
|
|
// return: { 'filename1': content1, 'filename2': content2, ...}
|
|
//
|
|
function loadSamples(subdir) {
|
|
var result = {};
|
|
var dir = path.join(__dirname, 'fixtures', subdir || 'samples');
|
|
|
|
fs.readdirSync(dir).sort().forEach(function (sample) {
|
|
var filepath = path.join(dir, sample),
|
|
extname = path.extname(filepath),
|
|
basename = path.basename(filepath, extname),
|
|
content = new Uint8Array(fs.readFileSync(filepath));
|
|
|
|
if (basename[0] === '_') { return; } // skip files with name, started with dash
|
|
|
|
result[basename] = content;
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
// Compare 2 buffers (can be Array, Uint8Array, Buffer).
|
|
//
|
|
function cmpBuf(a, b) {
|
|
if (a.length !== b.length) {
|
|
return false;
|
|
}
|
|
|
|
for (var i = 0, l = a.length; i < l; i++) {
|
|
if (a[i] !== b[i]) {
|
|
//console.log('pos: ' +i+ ' - ' + a[i].toString(16) + '/' + b[i].toString(16));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
// Helper to test deflate/inflate with different options.
|
|
// Use zlib streams, because it's the only way to define options.
|
|
//
|
|
function testSingle(zlib_factory, pako_deflate, data, options, callback) {
|
|
|
|
var zlib_options = _.clone(options);
|
|
|
|
// hack for testing negative windowBits
|
|
if (zlib_options.windowBits < 0) { zlib_options.windowBits = -zlib_options.windowBits; }
|
|
|
|
var zlibStream = zlib_factory(zlib_options);
|
|
var buffers = [], nread = 0;
|
|
|
|
|
|
zlibStream.on('error', function (err) {
|
|
zlibStream.removeAllListeners();
|
|
zlibStream = null;
|
|
callback(err);
|
|
});
|
|
|
|
zlibStream.on('data', function (chunk) {
|
|
buffers.push(chunk);
|
|
nread += chunk.length;
|
|
});
|
|
|
|
zlibStream.on('end', function () {
|
|
zlibStream.removeAllListeners();
|
|
zlibStream = null;
|
|
|
|
var buffer = Buffer.concat(buffers);
|
|
|
|
var pako_result = pako_deflate(data, options);
|
|
|
|
if (!cmpBuf(buffer, pako_result)) {
|
|
callback(new Error('zlib result != pako result'));
|
|
return;
|
|
}
|
|
|
|
callback(null);
|
|
});
|
|
|
|
|
|
zlibStream.write(new Buffer(data));
|
|
zlibStream.end();
|
|
}
|
|
|
|
function testSamples(zlib_factory, pako_deflate, samples, options, callback) {
|
|
var queue = [];
|
|
|
|
_.forEach(samples, function (data, name) {
|
|
// with untyped arrays
|
|
queue.push(function (done) {
|
|
pako_utils.setTyped(false);
|
|
|
|
testSingle(zlib_factory, pako_deflate, data, options, function (err) {
|
|
if (err) {
|
|
done('Error in "' + name + '" - zlib result != pako result');
|
|
return;
|
|
}
|
|
done();
|
|
});
|
|
});
|
|
|
|
// with typed arrays
|
|
queue.push(function (done) {
|
|
pako_utils.setTyped(true);
|
|
|
|
testSingle(zlib_factory, pako_deflate, data, options, function (err) {
|
|
if (err) {
|
|
done('Error in "' + name + '" - zlib result != pako result');
|
|
return;
|
|
}
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
async.series(queue, callback);
|
|
}
|
|
|
|
|
|
function testInflate(samples, inflateOptions, deflateOptions, callback) {
|
|
var name, data, deflated, inflated;
|
|
|
|
// inflate options have windowBits = 0 to force autodetect window size
|
|
//
|
|
for (name in samples) {
|
|
if (!samples.hasOwnProperty(name)) continue;
|
|
data = samples[name];
|
|
|
|
// always use the same data type to generate sample
|
|
pako_utils.setTyped(true);
|
|
deflated = pako.deflate(data, deflateOptions);
|
|
|
|
// with untyped arrays
|
|
pako_utils.setTyped(false);
|
|
inflated = pako.inflate(deflated, inflateOptions);
|
|
pako_utils.setTyped(true);
|
|
|
|
if (!cmpBuf(inflated, data)) {
|
|
callback('Error in "' + name + '" - inflate result != original');
|
|
return;
|
|
}
|
|
|
|
// with typed arrays
|
|
inflated = pako.inflate(deflated, inflateOptions);
|
|
|
|
if (!cmpBuf(inflated, data)) {
|
|
callback('Error in "' + name + '" - inflate result != original');
|
|
return;
|
|
}
|
|
}
|
|
|
|
callback();
|
|
}
|
|
|
|
|
|
exports.cmpBuf = cmpBuf;
|
|
exports.testSamples = testSamples;
|
|
exports.testInflate = testInflate;
|
|
exports.loadSamples = loadSamples;
|