From 4ac3a1f0ee85af0d1cc8ec74dbe8120179ad9704 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 11 Apr 2026 20:19:11 +0200 Subject: [PATCH] Add tests for custom movement template persistence in player start inspector --- ...layer-start-inspector.integration.test.tsx | 104 +++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/tests/unit/player-start-inspector.integration.test.tsx b/tests/unit/player-start-inspector.integration.test.tsx index 0bdcd214..85c9faab 100644 --- a/tests/unit/player-start-inspector.integration.test.tsx +++ b/tests/unit/player-start-inspector.integration.test.tsx @@ -1,4 +1,4 @@ -import { render, screen, waitFor } from "@testing-library/react"; +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import { act } from "react"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; @@ -136,6 +136,108 @@ describe("Player Start inspector", () => { kind: "default" } }); + + expect(screen.getByTestId("player-start-movement-move-speed")).toHaveValue( + 4.5 + ); + expect(screen.getByTestId("player-start-movement-jump-enabled")).toBeChecked(); + }); + + it("lets the inspector switch to a custom movement template and persist authored settings", async () => { + const playerStart = createPlayerStartEntity({ + id: "entity-player-start-custom-template", + name: "Custom Template" + }); + const store = createEditorStore({ + initialDocument: { + ...createEmptySceneDocument({ name: "Custom Template Scene" }), + entities: { + [playerStart.id]: playerStart + } + } + }); + + render(); + + await waitFor(() => { + expect(viewportHostInstances.length).toBeGreaterThan(0); + }); + + act(() => { + store.setSelection({ + kind: "entities", + ids: [playerStart.id] + }); + }); + + const templateSelect = await screen.findByTestId( + "player-start-movement-template" + ); + const moveSpeedInput = screen.getByTestId( + "player-start-movement-move-speed" + ); + const variableJumpCheckbox = screen.getByTestId( + "player-start-movement-variable-jump-enabled" + ); + const jumpBufferInput = screen.getByTestId( + "player-start-movement-jump-buffer" + ); + + act(() => { + fireEvent.change(templateSelect, { + target: { + value: "responsive" + } + }); + }); + + await waitFor(() => { + expect(store.getState().document.entities[playerStart.id]).toMatchObject({ + movementTemplate: { + kind: "responsive", + jump: { + bufferMs: 120, + coyoteTimeMs: 120, + variableHeight: true + } + } + }); + }); + + act(() => { + fireEvent.change(moveSpeedInput, { + target: { + value: "5.7" + } + }); + fireEvent.blur(moveSpeedInput); + }); + + act(() => { + fireEvent.click(variableJumpCheckbox); + }); + + act(() => { + fireEvent.change(jumpBufferInput, { + target: { + value: "75" + } + }); + fireEvent.blur(jumpBufferInput); + }); + + await waitFor(() => { + expect(store.getState().document.entities[playerStart.id]).toMatchObject({ + movementTemplate: { + kind: "custom", + moveSpeed: 5.7, + jump: { + bufferMs: 75, + variableHeight: false + } + } + }); + }); }); it("shows authored jump, sprint, and crouch bindings for a selected Player Start", async () => {