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(); }); }); } class HTTPTestServer { constructor(baseURL) { this.baseURL = baseURL; } async createEcho(method, path, options) { const result = await fetch(`${this.baseURL}/create`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ ...options, method, path }), }); if (!result.ok) { throw new Error("Error creating echo: " + result.statusText); } return `${this.baseURL}${path}`; } getStaticURL(path) { return `${this.baseURL}/static/${path}`; } } // FIXME: Get the port from internals const __httpTestServer = new HTTPTestServer("http://localhost:8123"); function httpTestServer() { return __httpTestServer; }