From 05f10237b4137b601b261e20ee2210e5e7d5b10a Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sun, 12 Apr 2026 03:51:20 +0200 Subject: [PATCH] Add test for migrating version 35 documents to default authored visible and enabled state --- .../serialization/scene-document-json.test.ts | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/tests/serialization/scene-document-json.test.ts b/tests/serialization/scene-document-json.test.ts index 7c6a9295..7511a109 100644 --- a/tests/serialization/scene-document-json.test.ts +++ b/tests/serialization/scene-document-json.test.ts @@ -10,6 +10,7 @@ import { LOCAL_LIGHTS_AND_SKYBOX_SCENE_DOCUMENT_VERSION, MODEL_ASSET_PIPELINE_SCENE_DOCUMENT_VERSION, PLAYER_START_AIR_CONTROL_SCENE_DOCUMENT_VERSION, + PLAYER_START_AIR_DIRECTION_CONTROL_SCENE_DOCUMENT_VERSION, PLAYER_START_COLLIDER_SETTINGS_SCENE_DOCUMENT_VERSION, PLAYER_START_INPUT_BINDINGS_SCENE_DOCUMENT_VERSION, PLAYER_START_MOVEMENT_TEMPLATE_SCENE_DOCUMENT_VERSION, @@ -30,6 +31,7 @@ import { createPointLightEntity, createInteractableEntity, createPlayerStartEntity, + createSceneExitEntity, createSoundEmitterEntity, createSpotLightEntity, createTeleportTargetEntity, @@ -1011,6 +1013,89 @@ describe("scene document JSON", () => { expect(migratedDocument.entities[playerStart.id]).toEqual(playerStart); }); + it("migrates version 35 documents to default authored visible and enabled state while preserving interaction enablement", () => { + const brush = createBoxBrush({ + id: "brush-authored-state-legacy" + }); + const modelInstance = createModelInstance({ + id: "model-instance-authored-state-legacy", + assetId: "asset-model-authored-state-legacy" + }); + const interactable = createInteractableEntity({ + id: "entity-interactable-authored-state-legacy", + interactionEnabled: false + }); + const sceneExit = createSceneExitEntity({ + id: "entity-scene-exit-authored-state-legacy", + interactionEnabled: false, + targetSceneId: "scene-target-legacy", + targetEntryEntityId: "entity-scene-entry-target-legacy" + }); + const { + visible: _legacyBrushVisible, + enabled: _legacyBrushEnabled, + ...legacyBrush + } = brush; + const { + visible: _legacyModelVisible, + enabled: _legacyModelEnabled, + ...legacyModelInstance + } = modelInstance; + const { + visible: _legacyInteractableVisible, + enabled: _legacyInteractableEnabled, + interactionEnabled: legacyInteractableInteractionEnabled, + ...legacyInteractable + } = interactable; + const { + visible: _legacySceneExitVisible, + enabled: _legacySceneExitEnabled, + interactionEnabled: legacySceneExitInteractionEnabled, + ...legacySceneExit + } = sceneExit; + + const migratedDocument = migrateSceneDocument({ + ...createEmptySceneDocument({ name: "Legacy Authored State Scene" }), + version: PLAYER_START_AIR_DIRECTION_CONTROL_SCENE_DOCUMENT_VERSION, + brushes: { + [brush.id]: legacyBrush + }, + modelInstances: { + [modelInstance.id]: legacyModelInstance + }, + entities: { + [interactable.id]: { + ...legacyInteractable, + enabled: legacyInteractableInteractionEnabled + }, + [sceneExit.id]: { + ...legacySceneExit, + enabled: legacySceneExitInteractionEnabled + } + } + }); + + expect(migratedDocument.version).toBe(SCENE_DOCUMENT_VERSION); + expect(migratedDocument.brushes[brush.id]).toMatchObject({ + visible: true, + enabled: true + }); + expect(migratedDocument.modelInstances[modelInstance.id]).toMatchObject({ + visible: true, + enabled: true + }); + expect(migratedDocument.entities[interactable.id]).toMatchObject({ + visible: true, + enabled: true, + interactionEnabled: false + }); + expect(migratedDocument.entities[sceneExit.id]).toMatchObject({ + visible: true, + enabled: true, + interactionEnabled: false + }); + }); + it("round-trips authored third-person Player Start navigation", () => { const playerStart = createPlayerStartEntity({ id: "entity-player-start-third-person",