ruffle/web/packages/selfhosted/test/utils.js

141 lines
3.7 KiB
JavaScript

const path = require("path");
async function is_ruffle_loaded(browser) {
return await browser.execute(
() =>
window !== undefined &&
window.RufflePlayer !== undefined &&
window.RufflePlayer.invoked
);
}
async function wait_for_ruffle(browser) {
await browser.waitUntil(async () => await is_ruffle_loaded(browser), {
timeoutMsg: "Expected Ruffle to load",
});
await throw_if_error(browser);
}
async function setup_error_handler(browser) {
await browser.execute(() => {
window.ruffleErrors = [];
window.addEventListener("error", (error) => {
window.ruffleErrors.push(error);
});
});
}
async function has_error(browser) {
return await browser.execute(
() => window.ruffleErrors && window.ruffleErrors.length > 0
);
}
async function throw_if_error(browser) {
return await browser.execute(() => {
if (window.ruffleErrors && window.ruffleErrors.length > 0) {
throw window.ruffleErrors[0];
}
});
}
async function inject_ruffle(browser) {
await setup_error_handler(browser);
await browser.execute(() => {
const script = document.createElement("script");
script.type = "text/javascript";
script.src = "/dist/ruffle.js";
document.head.appendChild(script);
});
await throw_if_error(browser);
}
async function play_and_monitor(browser, player, expected_output) {
await throw_if_error(browser);
// TODO: better way to test for this in the API
await browser.waitUntil(
async () =>
(await has_error(browser)) ||
(await browser.execute((player) => player.instance, player)),
{
timeoutMsg: "Expected player to have initialized",
}
);
await browser.execute((player) => {
player.__ruffle_log__ = "";
player.traceObserver = (msg) => {
player.__ruffle_log__ += msg + "\n";
};
player.play();
}, player);
if (expected_output === undefined) {
expected_output = "Hello from Flash!\n";
}
await browser.waitUntil(
async () =>
(await browser.execute(
(player) => player.__ruffle_log__,
player
)) === expected_output,
{
timeoutMsg: "Expected Ruffle to trace a message",
}
);
}
async function inject_ruffle_and_wait(browser) {
await inject_ruffle(browser);
await wait_for_ruffle(browser);
}
async function open_test(browser, absolute_dir, file_name) {
const dir_name = path.basename(absolute_dir);
if (file_name === undefined) {
file_name = "index.html";
}
await browser.url(
`http://localhost:4567/test/polyfill/${dir_name}/${file_name}`
);
}
/** Test set-up for JS API testing. */
function js_api_before(swf) {
let player = null;
before("Loads the test", async () => {
await browser.url("http://localhost:4567/test_assets/js_api.html");
await inject_ruffle_and_wait(browser);
player = await browser.execute(() => {
const ruffle = window.RufflePlayer.newest();
const player = ruffle.createPlayer();
const container = document.getElementById("test-container");
container.appendChild(player);
return player;
});
if (swf) {
await browser.execute((player) => {
player.load("/test_assets/example.swf");
}, player);
await play_and_monitor(browser, player);
}
});
}
module.exports = {
is_ruffle_loaded,
wait_for_ruffle,
play_and_monitor,
inject_ruffle,
inject_ruffle_and_wait,
open_test,
setup_error_handler,
js_api_before,
};