node/lib/internal/test_runner/utils.js
2022-07-30 23:10:51 +03:00

63 lines
1.4 KiB
JavaScript

'use strict';
const { RegExpPrototypeExec } = primordials;
const { basename } = require('path');
const { createDeferredPromise } = require('internal/util');
const {
codes: {
ERR_TEST_FAILURE,
},
kIsNodeError,
} = require('internal/errors');
const kMultipleCallbackInvocations = 'multipleCallbackInvocations';
const kSupportedFileExtensions = /\.[cm]?js$/;
const kTestFilePattern = /((^test(-.+)?)|(.+[.\-_]test))\.[cm]?js$/;
function doesPathMatchFilter(p) {
return RegExpPrototypeExec(kTestFilePattern, basename(p)) !== null;
}
function isSupportedFileType(p) {
return RegExpPrototypeExec(kSupportedFileExtensions, p) !== null;
}
function createDeferredCallback() {
let calledCount = 0;
const { promise, resolve, reject } = createDeferredPromise();
const cb = (err) => {
calledCount++;
// If the callback is called a second time, let the user know, but
// don't let them know more than once.
if (calledCount > 1) {
if (calledCount === 2) {
throw new ERR_TEST_FAILURE(
'callback invoked multiple times',
kMultipleCallbackInvocations
);
}
return;
}
if (err) {
return reject(err);
}
resolve();
};
return { promise, cb };
}
function isTestFailureError(err) {
return err?.code === 'ERR_TEST_FAILURE' && kIsNodeError in err;
}
module.exports = {
createDeferredCallback,
doesPathMatchFilter,
isSupportedFileType,
isTestFailureError,
};