2025-07-16 22:29:28 +08:00
|
|
|
"use strict";
|
|
|
|
|
2018-01-27 06:59:38 +08:00
|
|
|
expect.extend({
|
|
|
|
toBeTypeOf(received, expected) {
|
|
|
|
const objType = typeof received;
|
|
|
|
const pass = objType === expected;
|
|
|
|
|
|
|
|
const message = pass
|
2018-02-25 18:46:17 +08:00
|
|
|
? () =>
|
2024-07-31 10:39:30 +08:00
|
|
|
`${this.utils.matcherHint(".not.toBeTypeOf")}\n\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Expected value to not be (using typeof):\n" +
|
2018-02-25 18:46:17 +08:00
|
|
|
` ${this.utils.printExpected(expected)}\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Received:\n" +
|
2018-02-25 18:46:17 +08:00
|
|
|
` ${this.utils.printReceived(objType)}`
|
|
|
|
: () =>
|
2024-07-31 10:39:30 +08:00
|
|
|
`${this.utils.matcherHint(".toBeTypeOf")}\n\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Expected value to be (using typeof):\n" +
|
2018-02-25 18:46:17 +08:00
|
|
|
` ${this.utils.printExpected(expected)}\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Received:\n" +
|
2018-02-25 18:46:17 +08:00
|
|
|
` ${this.utils.printReceived(objType)}`;
|
2018-01-27 06:59:38 +08:00
|
|
|
|
2020-03-09 21:14:44 +08:00
|
|
|
return { message, pass };
|
|
|
|
},
|
|
|
|
toEndWith(received, expected) {
|
|
|
|
const pass = typeof received === "string" && received.endsWith(expected);
|
|
|
|
|
|
|
|
const message = pass
|
|
|
|
? () =>
|
2024-07-31 10:39:30 +08:00
|
|
|
`${this.utils.matcherHint(".not.toEndWith")}\n\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Expected value to not end with:\n" +
|
2020-03-09 21:14:44 +08:00
|
|
|
` ${this.utils.printExpected(expected)}\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Received:\n" +
|
2020-03-09 21:14:44 +08:00
|
|
|
` ${this.utils.printReceived(received)}`
|
|
|
|
: () =>
|
2024-07-31 10:39:30 +08:00
|
|
|
`${this.utils.matcherHint(".toEndWith")}\n\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Expected value to end with:\n" +
|
2020-03-09 21:14:44 +08:00
|
|
|
` ${this.utils.printExpected(expected)}\n` +
|
2024-07-31 12:23:44 +08:00
|
|
|
"Received:\n" +
|
2020-03-09 21:14:44 +08:00
|
|
|
` ${this.utils.printReceived(received)}`;
|
|
|
|
|
2018-01-27 06:59:38 +08:00
|
|
|
return { message, pass };
|
|
|
|
}
|
|
|
|
});
|
2018-10-19 17:39:06 +08:00
|
|
|
|
|
|
|
if (process.env.ALTERNATIVE_SORT) {
|
|
|
|
const oldSort = Array.prototype.sort;
|
|
|
|
|
2025-07-02 20:10:54 +08:00
|
|
|
// eslint-disable-next-line no-extend-native
|
2025-07-03 17:06:45 +08:00
|
|
|
Array.prototype.sort = function sort(cmp) {
|
2018-10-19 17:39:06 +08:00
|
|
|
oldSort.call(this, cmp);
|
|
|
|
if (cmp) {
|
|
|
|
for (let i = 1; i < this.length; i++) {
|
|
|
|
if (cmp(this[i - 1], this[i]) === 0) {
|
|
|
|
let j = i + 1;
|
|
|
|
for (; j < this.length; j++) {
|
|
|
|
if (cmp(this[j - 1], this[j]) !== 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (let x = i - 1, y = j - 1; x < y; x++, y--) {
|
|
|
|
const temp = this[x];
|
|
|
|
this[x] = this[y];
|
|
|
|
this[y] = temp;
|
|
|
|
}
|
|
|
|
i = j;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}
|
2018-10-30 20:46:50 +08:00
|
|
|
|
2018-11-30 18:20:47 +08:00
|
|
|
// Setup debugging info for tests
|
2019-02-19 15:58:46 +08:00
|
|
|
if (process.env.DEBUG_INFO) {
|
2025-07-17 00:13:14 +08:00
|
|
|
const addDebugInfo = (it) => (name, fn, timeout) => {
|
2024-07-31 11:31:11 +08:00
|
|
|
if (fn.length === 0) {
|
|
|
|
it(
|
|
|
|
name,
|
|
|
|
() => {
|
|
|
|
process.stdout.write(`START1 ${name}\n`);
|
|
|
|
try {
|
|
|
|
const promise = fn();
|
|
|
|
if (promise && promise.then) {
|
|
|
|
return promise.then(
|
2025-07-17 00:13:14 +08:00
|
|
|
(r) => {
|
2024-07-31 11:31:11 +08:00
|
|
|
process.stdout.write(`DONE OK ${name}\n`);
|
|
|
|
return r;
|
|
|
|
},
|
2025-07-17 00:13:14 +08:00
|
|
|
(err) => {
|
2024-07-31 11:31:11 +08:00
|
|
|
process.stdout.write(`DONE FAIL ${name}\n`);
|
2024-07-31 15:37:05 +08:00
|
|
|
throw err;
|
2024-07-31 11:31:11 +08:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2024-07-31 04:21:27 +08:00
|
|
|
|
2024-07-31 11:31:11 +08:00
|
|
|
process.stdout.write(`DONE OK ${name}\n`);
|
2024-07-31 15:37:05 +08:00
|
|
|
} catch (err) {
|
2024-07-31 11:31:11 +08:00
|
|
|
process.stdout.write(`DONE FAIL ${name}\n`);
|
2024-07-31 15:37:05 +08:00
|
|
|
throw err;
|
2024-07-31 11:31:11 +08:00
|
|
|
}
|
|
|
|
},
|
|
|
|
timeout
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
it(
|
|
|
|
name,
|
2025-07-17 00:13:14 +08:00
|
|
|
(done) => {
|
2024-07-31 11:31:11 +08:00
|
|
|
process.stdout.write(`START2 ${name}\n`);
|
2025-07-17 00:13:14 +08:00
|
|
|
return fn((err) => {
|
2024-07-31 11:31:11 +08:00
|
|
|
if (err) {
|
2018-11-30 18:20:47 +08:00
|
|
|
process.stdout.write(`DONE FAIL ${name}\n`);
|
2024-07-31 11:31:11 +08:00
|
|
|
} else {
|
|
|
|
process.stdout.write(`DONE OK ${name}\n`);
|
2018-11-30 18:20:47 +08:00
|
|
|
}
|
2024-07-31 11:31:11 +08:00
|
|
|
return done(err);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
timeout
|
|
|
|
);
|
|
|
|
}
|
2018-11-30 18:20:47 +08:00
|
|
|
};
|
2025-07-02 20:10:54 +08:00
|
|
|
|
2021-07-13 16:20:21 +08:00
|
|
|
// eslint-disable-next-line no-global-assign
|
|
|
|
it = addDebugInfo(it);
|
2018-11-30 18:20:47 +08:00
|
|
|
}
|
|
|
|
|
2022-01-18 17:38:06 +08:00
|
|
|
// cspell:word wabt
|
2018-10-30 20:46:50 +08:00
|
|
|
// Workaround for a memory leak in wabt
|
|
|
|
// It leaks an Error object on construction
|
|
|
|
// so it leaks the whole stack trace
|
|
|
|
require("wast-loader");
|
2018-11-30 22:20:14 +08:00
|
|
|
process.removeAllListeners("uncaughtException");
|
|
|
|
process.removeAllListeners("unhandledRejection");
|