From a2a24c02576189b9673e7cf761c1a2857ca0325a Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 31 Mar 2026 06:20:35 +0200 Subject: [PATCH] Add E2E test for teleport trigger and update build-runtime-scene test --- tests/domain/build-runtime-scene.test.ts | 38 +++++++++++++++++++ tests/e2e/runtime-trigger-teleport.e2e.ts | 45 +++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 tests/e2e/runtime-trigger-teleport.e2e.ts diff --git a/tests/domain/build-runtime-scene.test.ts b/tests/domain/build-runtime-scene.test.ts index 0e7b5db4..71c3a486 100644 --- a/tests/domain/build-runtime-scene.test.ts +++ b/tests/domain/build-runtime-scene.test.ts @@ -9,6 +9,7 @@ import { createTeleportTargetEntity, createTriggerVolumeEntity } from "../../src/entities/entity-instances"; +import { createTeleportPlayerInteractionLink, createToggleVisibilityInteractionLink } from "../../src/interactions/interaction-links"; import { buildRuntimeSceneFromDocument } from "../../src/runtime-three/runtime-scene-build"; describe("buildRuntimeSceneFromDocument", () => { @@ -96,6 +97,21 @@ describe("buildRuntimeSceneFromDocument", () => { [triggerVolume.id]: triggerVolume, [teleportTarget.id]: teleportTarget, [interactable.id]: interactable + }, + interactionLinks: { + "link-teleport": createTeleportPlayerInteractionLink({ + id: "link-teleport", + sourceEntityId: triggerVolume.id, + trigger: "enter", + targetEntityId: teleportTarget.id + }), + "link-hide-brush": createToggleVisibilityInteractionLink({ + id: "link-hide-brush", + sourceEntityId: triggerVolume.id, + trigger: "exit", + targetBrushId: brush.id, + visible: false + }) } }; document.world.background = { @@ -223,6 +239,27 @@ describe("buildRuntimeSceneFromDocument", () => { } ] }); + expect(runtimeScene.interactionLinks).toEqual([ + { + id: "link-teleport", + sourceEntityId: "entity-trigger-door", + trigger: "enter", + action: { + type: "teleportPlayer", + targetEntityId: "entity-teleport-target-main" + } + }, + { + id: "link-hide-brush", + sourceEntityId: "entity-trigger-door", + trigger: "exit", + action: { + type: "toggleVisibility", + targetBrushId: "brush-room-floor", + visible: false + } + } + ]); expect(runtimeScene.playerStart).toEqual({ entityId: "entity-player-start-main", position: { @@ -274,6 +311,7 @@ describe("buildRuntimeSceneFromDocument", () => { teleportTargets: [], interactables: [] }); + expect(runtimeScene.interactionLinks).toEqual([]); expect(runtimeScene.spawn).toEqual({ source: "fallback", entityId: null, diff --git a/tests/e2e/runtime-trigger-teleport.e2e.ts b/tests/e2e/runtime-trigger-teleport.e2e.ts new file mode 100644 index 00000000..d044526e --- /dev/null +++ b/tests/e2e/runtime-trigger-teleport.e2e.ts @@ -0,0 +1,45 @@ +import { expect, test } from "@playwright/test"; + +test("Trigger Volume enter can teleport the player to a Teleport Target", async ({ page }) => { + const pageErrors: string[] = []; + const consoleErrors: string[] = []; + + page.on("pageerror", (error) => { + pageErrors.push(error.message); + }); + + page.on("console", (message) => { + if (message.type() === "error") { + consoleErrors.push(message.text()); + } + }); + + await page.goto("/"); + await page.evaluate((storageKey) => { + window.localStorage.removeItem(storageKey); + }, "webeditor3d.scene-document-draft"); + await page.reload(); + + await page.getByTestId("place-player-start").click(); + await page.getByTestId("add-entity-triggerVolume").click(); + await page.getByTestId("add-entity-teleportTarget").click(); + + await page.getByTestId("teleportTarget-position-x").fill("6"); + await page.getByTestId("teleportTarget-position-x").press("Tab"); + + await page + .locator('[data-testid^="outliner-entity-"]') + .filter({ hasText: "Trigger Volume" }) + .first() + .click(); + + await page.getByTestId("add-trigger-teleport-link").click(); + + await page.getByTestId("enter-run-mode").click(); + + await expect(page.getByTestId("runner-shell")).toBeVisible(); + await expect(page.getByTestId("runner-player-position")).toContainText("6.00, 0.00, 0.00"); + + expect(pageErrors).toEqual([]); + expect(consoleErrors).toEqual([]); +});