larabr d49d92e5cb Update to Mocha v10 in tests, declare lib as module and add exports to package.json
Mocha v10 requires the lib to be esm compliant.
ESM mandates the use of file extensions in imports, so to minimize the
changes (for now), we rely on the flag `experimental-specifier-resolution=node`
and on `ts-node` (needed only for Node 20).

Breaking changes:
downstream bundlers might be affected by the package.json changes depending on
how they load the library.
NB: legacy package.json entrypoints are still available.
2023-10-25 12:53:10 +02:00

178 lines
6.2 KiB
JavaScript

import { expect } from 'chai';
import util from '../../src/util';
export default () => describe('Util unit tests', function() {
describe('isString', function() {
it('should return true for type "string"', function() {
const data = 'foo';
expect(util.isString(data)).to.be.true;
});
it('should return true for type String', function() {
const data = String('foo');
expect(util.isString(data)).to.be.true;
});
it('should return true for inherited type of String', function() {
function MyString() {}
MyString.prototype = Object.create(String.prototype);
const data = new MyString();
expect(util.isString(data)).to.be.true;
});
it('should return true for empty string', function() {
const data = '';
expect(util.isString(data)).to.be.true;
});
it('should return false for undefined', function() {
let data;
expect(util.isString(data)).to.be.false;
});
it('should return false for Object', function() {
const data = {};
expect(util.isString(data)).to.be.false;
});
});
describe('isArray', function() {
it('should return true for []', function() {
const data = [];
expect(util.isArray(data)).to.be.true;
});
it('should return true for type Array', function() {
const data = Array(); // eslint-disable-line no-array-constructor
expect(util.isArray(data)).to.be.true;
});
it('should return true for inherited type of Array', function() {
function MyArray() {}
MyArray.prototype = Object.create(Array.prototype);
const data = new MyArray();
expect(util.isArray(data)).to.be.true;
});
it('should return false for undefined', function() {
let data;
expect(util.isArray(data)).to.be.false;
});
it('should return false for Object', function() {
const data = {};
expect(util.isArray(data)).to.be.false;
});
});
describe('isUint8Array', function() {
it('should return true for type Uint8Array', function() {
const data = new Uint8Array();
expect(util.isUint8Array(data)).to.be.true;
});
it('should return true for inherited type of Uint8Array', function() {
function MyUint8Array() {}
MyUint8Array.prototype = new Uint8Array();
const data = new MyUint8Array();
expect(util.isUint8Array(data)).to.be.true;
});
it('should return false for undefined', function() {
let data;
expect(util.isUint8Array(data)).to.be.false;
});
it('should return false for Object', function() {
const data = {};
expect(util.isUint8Array(data)).to.be.false;
});
});
describe('leftPad', function() {
it('should not change the input if the length is correct', function() {
const bytes = new Uint8Array([2, 1]);
const padded = util.leftPad(bytes, 2);
expect(padded).to.deep.equal(bytes);
});
it('should add leading zeros to input array', function() {
const bytes = new Uint8Array([1, 2]);
const padded = util.leftPad(bytes, 5);
expect(padded).to.deep.equal(new Uint8Array([0, 0, 0, 1, 2]));
});
});
describe('uint8ArrayToMPI', function() {
it('should strip leading zeros', function() {
const bytes = new Uint8Array([0, 0, 1, 2]);
const mpi = util.uint8ArrayToMPI(bytes);
expect(mpi).to.deep.equal(new Uint8Array([0, 9, 1, 2]));
});
it('should throw on array of all zeros', function() {
const bytes = new Uint8Array([0, 0]);
expect(() => util.uint8ArrayToMPI(bytes)).to.throw('Zero MPI');
});
});
describe('isEmailAddress', function() {
it('should return true for valid email address', function() {
const data = 'test@example.com';
expect(util.isEmailAddress(data)).to.be.true;
});
it('should return true for valid email address', function() {
const data = 'test@xn--wgv.xn--q9jyb4c';
expect(util.isEmailAddress(data)).to.be.true;
});
it('should return false for invalid email address', function() {
const data = 'Test User <test@example.com>';
expect(util.isEmailAddress(data)).to.be.false;
});
it('should return false for invalid email address', function() {
const data = 'test@examplecom';
expect(util.isEmailAddress(data)).to.be.false;
});
it('should return false for invalid email address', function() {
const data = 'testexamplecom';
expect(util.isEmailAddress(data)).to.be.false;
});
it('should return false for empty string', function() {
const data = '';
expect(util.isEmailAddress(data)).to.be.false;
});
it('should return false for undefined', function() {
let data;
expect(util.isEmailAddress(data)).to.be.false;
});
it('should return false for Object', function() {
const data = {};
expect(util.isEmailAddress(data)).to.be.false;
});
});
describe('constant time select', function() {
it('selectUint8Array should work for arrays of equal length', function () {
const size = 10;
const a = new Uint8Array(size).fill(1);
const b = new Uint8Array(size).fill(2);
expect(util.selectUint8Array(true, a, b)).to.deep.equal(a);
expect(util.selectUint8Array(false, a, b)).to.deep.equal(b);
});
it('selectUint8Array should work for arrays of different length', function () {
const size = 10;
const a = new Uint8Array(size).fill(1);
const b = new Uint8Array(2 * size).fill(2);
expect(util.selectUint8Array(true, a, b)).to.deep.equal(a);
expect(util.selectUint8Array(false, a, b)).to.deep.equal(b);
expect(util.selectUint8Array(true, b, a)).to.deep.equal(b);
expect(util.selectUint8Array(false, b, a)).to.deep.equal(a);
});
it('selectUint8 should return the expected value based on condition', function () {
const a = 1;
const b = 2;
expect(util.selectUint8(true, a, b)).to.equal(a);
expect(util.selectUint8(false, a, b)).to.equal(b);
});
});
describe('Misc.', function() {
it('util.readNumber should not overflow until full range of uint32', function () {
const ints = [2 ** 20, 2 ** 25, 2 ** 30, 2 ** 32 - 1];
for (let i = 0; i < ints.length; i++) {
expect(util.readNumber(util.writeNumber(ints[i], 4))).to.equal(ints[i]);
}
});
});
});