import { test, expect, type Page } from "@playwright/test"; import { existsSync } from "node:fs"; import { resolve } from "node:path"; const romPath = resolve( process.env.CRYSTAL_ROM_PATH ?? "Pokemon - Crystal Version (UE) (V1.1) [C][!].gbc", ); test.beforeEach(() => test.skip(!existsSync(romPath), "Requires the local user ROM.")); async function start(page: Page) { await page.route("**/src/game/runtime.ts", async (route) => { const response = await route.fetch(), source = await response.text(); const needle = "const world = new GameWorld(assets);"; expect(source).toContain(needle); await route.fulfill({ response, body: source.replace("this.world?.beginIntro();", "").replace( needle, `const { radioFixtureWorld } = await import('/tests/radio-fixture.ts'); const world = radioFixtureWorld(assets);`, ), }); }); await page.goto("/"); await page.locator("#rom-file").setInputFiles(romPath); await expect(page.locator("#status")).toContainText("verified"); await page.locator("#play").click(); } test("the Pokégear's radio card tunes in Oak's Pokémon Talk and plays it", async ({ page }) => { const errors: string[] = []; page.on("pageerror", (error) => errors.push(error.message)); await start(page); await page.keyboard.press("Enter"); await page.locator("#dialogue-choice").getByRole("option", { name: /^POKéGEAR/ }).click(); await expect(page.locator("#pokegear")).toBeVisible(); await page.keyboard.press("ArrowRight"); const radio = page.locator(".pokegear-radio"); await expect(radio).toBeVisible(); await expect(radio.locator(".pokegear-frequency")).toHaveText("FM 0.5"); for (let press = 0; press < 8; press++) await page.keyboard.press("ArrowUp"); await expect(radio.locator(".pokegear-frequency")).toHaveText("FM 4.5"); await expect(radio.locator("strong")).toContainText("Talk"); await expect(radio.locator(".pokegear-radio-text")).toContainText("MARY: PROF.OAK'S"); await expect(radio.locator(".pokegear-radio-text")).toContainText("TALK!", { timeout: 10_000 }); await page.keyboard.press("KeyZ"); await expect(page.locator("#pokegear")).toBeHidden(); expect(errors).toEqual([]); });