big-int-stats
Version:
Create BigIntStats from fs.Stats for compatiblity on earlier versions of Node.js
45 lines (40 loc) • 2.63 kB
text/typescript
import assert from 'assert';
import JSBI from 'jsbi-compat';
import isDate from 'lodash.isdate';
import { inspect } from 'util';
const kNsPerMsBigInt = JSBI.BigInt(10 ** 6);
export default function verifyStats(bigintStats, numStats, allowableDelta) {
// allowableDelta: It's possible that the file stats are updated between the
// two stat() calls so allow for a small difference.
for (var key in numStats) {
// biome-ignore lint/suspicious/noPrototypeBuiltins: hasOwnProperty
if (!numStats.hasOwnProperty(key)) continue;
var val = numStats[key];
if (isDate(val)) {
var time = val.getTime();
var time2 = bigintStats[key].getTime();
assert(time - time2 <= allowableDelta, `difference of ${key}.getTime() should <= ${allowableDelta}.\nNumber version ${time}, BigInt version ${time2}n`);
} else if (key === 'mode') {
assert.ok(JSBI.equal(bigintStats[key], JSBI.BigInt(val)));
assert.strictEqual(bigintStats.isBlockDevice(), numStats.isBlockDevice());
assert.strictEqual(bigintStats.isCharacterDevice(), numStats.isCharacterDevice());
assert.strictEqual(bigintStats.isDirectory(), numStats.isDirectory());
assert.strictEqual(bigintStats.isFIFO(), numStats.isFIFO());
assert.strictEqual(bigintStats.isFile(), numStats.isFile());
assert.strictEqual(bigintStats.isSocket(), numStats.isSocket());
assert.strictEqual(bigintStats.isSymbolicLink(), numStats.isSymbolicLink());
} else if (key.endsWith('Ms')) {
var nsKey = key.replace('Ms', 'Ns');
var msFromBigInt = bigintStats[key];
var nsFromBigInt = bigintStats[nsKey];
var msFromBigIntNs = JSBI.divide(nsFromBigInt, kNsPerMsBigInt);
var msFromNum = numStats[key];
assert(msFromNum - JSBI.toNumber(msFromBigInt) <= allowableDelta, `Number version ${key} = ${msFromNum}, BigInt version ${key} = ${JSBI.toNumber(msFromBigInt)}n, Allowable delta = ${allowableDelta}`);
assert(msFromNum - JSBI.toNumber(msFromBigIntNs) <= allowableDelta, `Number version ${key} = ${msFromNum}, BigInt version ${nsKey} = ${JSBI.toNumber(nsFromBigInt)}n = ${JSBI.toNumber(msFromBigIntNs)}ms, Allowable delta = ${allowableDelta}`);
} else if (Number.isSafeInteger(val)) {
assert.ok(JSBI.equal(bigintStats[key], JSBI.BigInt(val)), `${inspect(bigintStats[key])} !== ${inspect(JSBI.BigInt(val))}\nkey=${key}, val=${val}`);
} else {
typeof bigintStats[key] === 'undefined' || assert(JSBI.toNumber(bigintStats[key]) - val < 1, `${key} is not a safe integer, difference should < 1.\nNumber version ${val}, BigInt version ${bigintStats[key]}n`);
}
}
}