2024-04-04 21:01:36 +00:00
|
|
|
import { expect } from "chai";
|
2024-05-27 19:47:55 +00:00
|
|
|
import { PublicAPI, RufflePlayer } from "ruffle-core";
|
2020-05-23 09:43:22 +00:00
|
|
|
|
2024-05-27 19:47:55 +00:00
|
|
|
declare global {
|
|
|
|
interface Window {
|
|
|
|
ruffleErrors: ErrorEvent[];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
declare module "ruffle-core" {
|
|
|
|
interface RufflePlayer {
|
|
|
|
__ruffle_log__: string;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function isRuffleLoaded(browser: WebdriverIO.Browser) {
|
2021-08-21 14:34:08 +00:00
|
|
|
return await browser.execute(
|
2020-05-23 09:43:22 +00:00
|
|
|
() =>
|
|
|
|
window !== undefined &&
|
|
|
|
window.RufflePlayer !== undefined &&
|
2023-07-20 11:19:39 +00:00
|
|
|
window.RufflePlayer.invoked,
|
2020-05-23 09:43:22 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-05-27 22:10:00 +00:00
|
|
|
export async function isRufflePlayerLoaded(
|
|
|
|
browser: WebdriverIO.Browser,
|
|
|
|
player: WebdriverIO.Element,
|
|
|
|
) {
|
|
|
|
return await browser.execute(
|
|
|
|
(player) =>
|
|
|
|
// https://github.com/webdriverio/webdriverio/issues/6486
|
|
|
|
// TODO: How can we import ReadyState enum?
|
|
|
|
(player as unknown as RufflePlayer).readyState === 2,
|
|
|
|
player,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function waitForRuffle(browser: WebdriverIO.Browser) {
|
2023-05-30 20:24:43 +00:00
|
|
|
await browser.waitUntil(async () => await isRuffleLoaded(browser), {
|
2020-05-23 09:43:22 +00:00
|
|
|
timeoutMsg: "Expected Ruffle to load",
|
|
|
|
});
|
2023-05-30 20:24:43 +00:00
|
|
|
await throwIfError(browser);
|
2020-09-14 17:10:35 +00:00
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function setupErrorHandler(browser: WebdriverIO.Browser) {
|
2021-08-21 14:34:08 +00:00
|
|
|
await browser.execute(() => {
|
2020-09-14 17:10:35 +00:00
|
|
|
window.ruffleErrors = [];
|
|
|
|
window.addEventListener("error", (error) => {
|
|
|
|
window.ruffleErrors.push(error);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function hasError(browser: WebdriverIO.Browser) {
|
2021-08-21 14:34:08 +00:00
|
|
|
return await browser.execute(
|
2023-07-20 11:19:39 +00:00
|
|
|
() => window.ruffleErrors && window.ruffleErrors.length > 0,
|
2020-09-14 17:10:35 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function throwIfError(browser: WebdriverIO.Browser) {
|
2021-08-21 14:34:08 +00:00
|
|
|
return await browser.execute(() => {
|
2020-09-14 17:10:35 +00:00
|
|
|
if (window.ruffleErrors && window.ruffleErrors.length > 0) {
|
|
|
|
throw window.ruffleErrors[0];
|
|
|
|
}
|
|
|
|
});
|
2020-05-23 09:43:22 +00:00
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function injectRuffle(browser: WebdriverIO.Browser) {
|
2023-05-30 20:24:43 +00:00
|
|
|
await setupErrorHandler(browser);
|
2021-08-21 14:34:08 +00:00
|
|
|
await browser.execute(() => {
|
2020-05-23 09:43:22 +00:00
|
|
|
const script = document.createElement("script");
|
|
|
|
script.type = "text/javascript";
|
|
|
|
script.src = "/dist/ruffle.js";
|
|
|
|
document.head.appendChild(script);
|
|
|
|
});
|
2023-05-30 20:24:43 +00:00
|
|
|
await throwIfError(browser);
|
2020-05-23 09:43:22 +00:00
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function playAndMonitor(
|
2024-05-27 19:47:55 +00:00
|
|
|
browser: WebdriverIO.Browser,
|
|
|
|
player: WebdriverIO.Element,
|
2024-05-27 20:03:41 +00:00
|
|
|
expectedOutput: string = "Hello from Flash!\n",
|
2024-05-27 19:47:55 +00:00
|
|
|
) {
|
2023-05-30 20:24:43 +00:00
|
|
|
await throwIfError(browser);
|
2024-05-27 22:10:00 +00:00
|
|
|
await waitForPlayerToLoad(browser, player);
|
|
|
|
await setupAndPlay(browser, player);
|
2020-09-14 17:10:35 +00:00
|
|
|
|
2024-05-27 22:10:00 +00:00
|
|
|
const actualOutput = await getTraceOutput(browser, player);
|
|
|
|
expect(actualOutput).to.eql(expectedOutput);
|
|
|
|
}
|
2020-09-05 23:39:17 +00:00
|
|
|
|
2024-05-27 22:10:00 +00:00
|
|
|
export async function setupAndPlay(
|
|
|
|
browser: WebdriverIO.Browser,
|
|
|
|
player: WebdriverIO.Element,
|
|
|
|
) {
|
2024-05-27 19:47:55 +00:00
|
|
|
await browser.execute((playerElement) => {
|
|
|
|
// https://github.com/webdriverio/webdriverio/issues/6486
|
|
|
|
const player = playerElement as unknown as RufflePlayer;
|
2020-09-05 23:39:17 +00:00
|
|
|
player.__ruffle_log__ = "";
|
2020-11-16 21:52:26 +00:00
|
|
|
player.traceObserver = (msg) => {
|
2020-09-05 23:39:17 +00:00
|
|
|
player.__ruffle_log__ += msg + "\n";
|
|
|
|
};
|
2021-07-09 07:53:48 +00:00
|
|
|
player.play();
|
2020-09-05 23:39:17 +00:00
|
|
|
}, player);
|
2023-11-13 16:37:00 +00:00
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function getTraceOutput(
|
2024-05-27 19:47:55 +00:00
|
|
|
browser: WebdriverIO.Browser,
|
|
|
|
player: WebdriverIO.Element,
|
|
|
|
) {
|
2023-11-13 16:37:00 +00:00
|
|
|
// Await any trace output
|
2021-08-21 14:34:08 +00:00
|
|
|
await browser.waitUntil(
|
2023-11-13 16:37:00 +00:00
|
|
|
async () => {
|
|
|
|
return (
|
2024-05-27 19:47:55 +00:00
|
|
|
(await browser.execute((player) => {
|
|
|
|
// https://github.com/webdriverio/webdriverio/issues/6486
|
|
|
|
return (player as unknown as RufflePlayer).__ruffle_log__;
|
|
|
|
}, player)) !== ""
|
2023-11-13 16:37:00 +00:00
|
|
|
);
|
|
|
|
},
|
2020-09-05 23:39:17 +00:00
|
|
|
{
|
|
|
|
timeoutMsg: "Expected Ruffle to trace a message",
|
2023-07-20 11:19:39 +00:00
|
|
|
},
|
2020-09-05 23:39:17 +00:00
|
|
|
);
|
2023-11-13 16:37:00 +00:00
|
|
|
|
|
|
|
// Get the output, and replace it with an empty string for any future test
|
2024-05-27 19:47:55 +00:00
|
|
|
return await browser.execute((playerElement) => {
|
|
|
|
// https://github.com/webdriverio/webdriverio/issues/6486
|
|
|
|
const player = playerElement as unknown as RufflePlayer;
|
2023-11-13 16:37:00 +00:00
|
|
|
const log = player.__ruffle_log__;
|
|
|
|
player.__ruffle_log__ = "";
|
|
|
|
return log;
|
|
|
|
}, player);
|
2020-09-05 23:39:17 +00:00
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function injectRuffleAndWait(browser: WebdriverIO.Browser) {
|
2023-05-30 20:24:43 +00:00
|
|
|
await injectRuffle(browser);
|
|
|
|
await waitForRuffle(browser);
|
2020-05-23 09:43:22 +00:00
|
|
|
}
|
|
|
|
|
2024-05-27 22:10:00 +00:00
|
|
|
export async function waitForPlayerToLoad(
|
|
|
|
browser: WebdriverIO.Browser,
|
|
|
|
player: WebdriverIO.Element,
|
|
|
|
) {
|
|
|
|
await browser.waitUntil(
|
|
|
|
async () => await isRufflePlayerLoaded(browser, player),
|
|
|
|
{
|
|
|
|
timeoutMsg: "Expected Ruffle to load",
|
|
|
|
},
|
|
|
|
);
|
|
|
|
await throwIfError(browser);
|
|
|
|
}
|
|
|
|
|
2024-05-27 20:03:41 +00:00
|
|
|
export async function openTest(
|
2024-05-27 19:47:55 +00:00
|
|
|
browser: WebdriverIO.Browser,
|
2024-05-27 20:19:52 +00:00
|
|
|
directory: string,
|
2024-05-27 20:03:41 +00:00
|
|
|
filename: string = "index.html",
|
2024-05-27 19:47:55 +00:00
|
|
|
) {
|
2024-05-27 20:19:52 +00:00
|
|
|
await browser.url(`http://localhost:4567/test/${directory}/${filename}`);
|
2020-05-23 09:43:22 +00:00
|
|
|
}
|
|
|
|
|
2021-04-21 23:48:50 +00:00
|
|
|
/** Test set-up for JS API testing. */
|
2024-05-27 20:03:41 +00:00
|
|
|
export function loadJsAPI(swf?: string) {
|
2021-04-21 23:33:00 +00:00
|
|
|
let player = null;
|
2021-07-09 07:53:48 +00:00
|
|
|
|
2021-08-21 14:34:08 +00:00
|
|
|
before("Loads the test", async () => {
|
|
|
|
await browser.url("http://localhost:4567/test_assets/js_api.html");
|
2021-04-21 23:33:00 +00:00
|
|
|
|
2023-05-30 20:24:43 +00:00
|
|
|
await injectRuffleAndWait(browser);
|
2021-04-21 23:33:00 +00:00
|
|
|
|
2024-05-27 19:47:55 +00:00
|
|
|
player = (await browser.execute(() => {
|
|
|
|
const ruffle = (window.RufflePlayer as PublicAPI).newest();
|
|
|
|
const player = ruffle!.createPlayer();
|
2021-04-21 23:33:00 +00:00
|
|
|
const container = document.getElementById("test-container");
|
2024-05-27 19:47:55 +00:00
|
|
|
container!.appendChild(player);
|
2021-04-21 23:33:00 +00:00
|
|
|
return player;
|
2024-05-27 19:47:55 +00:00
|
|
|
// https://github.com/webdriverio/webdriverio/issues/6486
|
|
|
|
})) as unknown as WebdriverIO.Element;
|
2021-04-21 23:33:00 +00:00
|
|
|
|
|
|
|
if (swf) {
|
2023-11-13 14:34:04 +00:00
|
|
|
await browser.execute(
|
2023-11-13 16:36:42 +00:00
|
|
|
async (player, swf) => {
|
2024-05-27 19:47:55 +00:00
|
|
|
// https://github.com/webdriverio/webdriverio/issues/6486
|
|
|
|
await (player as unknown as RufflePlayer).load(swf);
|
2023-11-13 14:34:04 +00:00
|
|
|
},
|
|
|
|
player,
|
|
|
|
swf,
|
|
|
|
);
|
2023-05-30 20:24:43 +00:00
|
|
|
await playAndMonitor(browser, player);
|
2021-04-21 23:33:00 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|