ladybird/Tests/LibWeb/Text/input/include.js
Andrew Kaster 8edaec79de LibWeb: Add a feature to LibWeb tests to fail on unhandled exceptions
Previously, if there was an unhandled exception in an async test, it
might fail to call done() and timeout. Now we have a default "error"
handler to catch unhandled exceptions and fail the test. A few tests
want to actually test the behavior of window.onerror, so they need an
escape hatch.
2024-10-05 09:18:32 +02:00

100 lines
2.4 KiB
JavaScript

var __outputElement = null;
let __alreadyCalledTest = false;
let __originalURL = null;
function __preventMultipleTestFunctions() {
if (__alreadyCalledTest) {
throw new Error("You must only call test() or asyncTest() once per page");
}
__alreadyCalledTest = true;
}
if (globalThis.internals === undefined) {
internals = {
signalTextTestIsDone: function () {},
spoofCurrentURL: function (url) {},
};
}
function __finishTest() {
if (__originalURL) {
internals.spoofCurrentURL(__originalURL);
}
internals.signalTextTestIsDone(__outputElement.innerText);
}
function spoofCurrentURL(url) {
if (__originalURL === null) {
__originalURL = document.location.href;
}
internals.spoofCurrentURL(url);
}
function println(s) {
__outputElement.appendChild(document.createTextNode(s + "\n"));
}
function printElement(e) {
let element_string = `<${e.nodeName} `;
if (e.id) element_string += `id="${e.id}" `;
element_string += ">";
println(element_string);
}
function animationFrame() {
const { promise, resolve } = Promise.withResolvers();
requestAnimationFrame(resolve);
return promise;
}
function timeout(ms) {
const { promise, resolve } = Promise.withResolvers();
setTimeout(resolve, ms);
return promise;
}
const __testErrorHandlerController = new AbortController();
window.addEventListener(
"error",
event => {
println(`Uncaught Error In Test: ${event.message}`);
__finishTest();
},
{ signal: __testErrorHandlerController.signal }
);
function removeTestErrorHandler() {
__testErrorHandlerController.abort();
}
document.addEventListener("DOMContentLoaded", function () {
__outputElement = document.createElement("pre");
__outputElement.setAttribute("id", "out");
document.body.appendChild(__outputElement);
});
function test(f) {
__preventMultipleTestFunctions();
document.addEventListener("DOMContentLoaded", f);
window.addEventListener("load", () => {
__finishTest();
});
}
function asyncTest(f) {
const done = () => {
__preventMultipleTestFunctions();
__finishTest();
};
document.addEventListener("DOMContentLoaded", () => {
f(done);
});
}
function promiseTest(f) {
document.addEventListener("DOMContentLoaded", () => {
f().then(() => {
__preventMultipleTestFunctions();
__finishTest();
});
});
}