pdf-data-parser
Version:
Parse, search and stream PDF tabular data using Node.js with Mozilla's PDF.js library.
186 lines (158 loc) • 5.32 kB
JavaScript
/**
* test/compare
*/
;
import fs from 'node:fs';
import path from 'node:path';
import { unzipSync } from 'node:zlib';
import colors from 'colors';
colors.enable();
function compareText(output, expected, compareValues) {
let outLines = output.split(/\r?\n/);
let expLines = expected.split(/\r?\n/);
if (outLines.length !== expLines.length) {
console.error(`output file has different length ${outLines.length} ${expLines.length}`.red);
return 1;
}
if (compareValues > 1) {
for (let i = 0; i < expLines.length; i++) {
if (outLines[ i ] !== expLines[ i ]) {
console.error(("contents of files are not equal on line: " + (i + 1)).red);
console.error(outLines[ i ]);
console.error(expLines[ i ]);
return 1;
}
}
}
return 0;
}
function compareBuffer(output, expected, compareValues) {
let ok = (output.length === expected.length);
if (!ok) {
console.error(`output files have different lengths ${output.length} ${expected.length}`.red);
return 1;
}
if (compareValues > 1) {
let ok = expected.compare(output) === 0;
if (!ok) {
console.error("contents of files are not equal".red);
return 1;
}
}
return 0;
}
function compareCSV(output, expected, compareValues) {
return 0;
// using compareText for now
}
/**
*
* @param {*} var1 output value
* @param {*} var2 expected value
* @param {Number} compareValues 0 = no, 1 = compare basic values , 2 = compare dates and array lengths
* @returns 0 if OK, 1 if different
*/
function compareJSON(var1, var2, compareValues) {
if (!compareValues)
return 0;
// objects must be of same type
if (typeof var1 !== typeof var2) {
console.error(`objects are different types: ${typeof var1} <> ${typeof var2}`.red);
return 1;
}
if ((var1 === null || var2 === null)) {
if (compareValues > 1 && var1 !== var2) {
console.error(`compare value mismatch: ${var1} <> ${var2}`.red);
return 1;
}
}
else if (Array.isArray(var1)) {
// check array lengths
if (compareValues > 1 && var1.length !== var2.length) {
console.error("arrays have different lengths".red);
return 1;
}
if (compareValues > 1) {
// check array elements
for (let i = 0; i < var2.length; i++) {
if (compareJSON(var1[ i ], var2[ i ], compareValues))
return 1;
}
}
}
else if (typeof var1 === 'object') {
let keys1 = Object.keys(var1);
let keys2 = Object.keys(var2);
if ((compareValues > 1) ? keys1.length != keys2.length : keys1.length < keys2.length) {
console.error("compare object maps have different lengths".red);
return 1;
}
// walk var2 and compare to var1
for (let key of keys2) {
if (!Object.hasOwn(var1, key)) {
console.error(("compare object1 does not contain property: " + key).red);
return 1;
}
if (compareJSON(var1[ key ], var2[ key ], compareValues))
return 1;
}
}
// don't compare values of dates
else if (compareValues > 1 && (var1 instanceof Date)) {
return 0;
}
// check values of basic types
else if (compareValues > 1 && var1 !== var2) {
console.error(`compare value mismatch: ${var1} <> ${var2}`.red);
return 1;
}
return 0; // values match
}
/**
* @param {String} filename_output filename of test output
* @param {String} filename_expected filename of expected data
* @param {Number} compareValues 0 = no, 1 = compare basic values , 2 = compare dates and array lengths
* @returns 0 if OK, 1 if different
*/
export default function (filename_output, filename_expected, compareValues = 1) {
console.log(">>> compare files");
if (compareValues <= 0)
return 0;
try {
let ext1 = path.extname(filename_output);
let ext2 = path.extname(filename_expected);
console.log(">>> " + filename_output + " === " + filename_expected);
// unzip, if needed
if (ext1 === ".gz")
ext1 = path.extname(filename_output.substring(0, filename_output.length - 3));
if (ext2 === ".gz")
ext2 = path.extname(filename_expected.substring(0, filename_expected.length - 3));
// compare file extensions
if (ext1 !== ext2) {
console.error("Compare filename extension mismatch!".red);
return 1;
}
// read files
let output = fs.readFileSync(filename_output, { encoding: 'utf8' });
if (path.extname(filename_output) === '.gz')
output = unzipSync(output);
let expected = fs.readFileSync(filename_expected, { encoding: 'utf8' });
if (path.extname(filename_expected) === '.gz')
expected = unzipSync(expected);
// choose parser
if (ext1 === '.json')
return compareJSON(JSON.parse(output), JSON.parse(expected), compareValues);
else if (ext1 === '.csv')
return compareText(output, expected, compareValues);
else if (ext1 === '.txt')
return compareText(output, expected, compareValues);
else {
console.error("compare unknown file extension".red);
return 1;
}
}
catch (err) {
console.error(err);
return 1;
}
};