Add tests for NPC dialogue serialization and migration
This commit is contained in:
@@ -13,6 +13,7 @@ import {
|
|||||||
DEFAULT_PROJECT_NAME,
|
DEFAULT_PROJECT_NAME,
|
||||||
DEFAULT_SCENE_EDITOR_SNAP_STEP,
|
DEFAULT_SCENE_EDITOR_SNAP_STEP,
|
||||||
NPC_COLLIDER_SCENE_DOCUMENT_VERSION,
|
NPC_COLLIDER_SCENE_DOCUMENT_VERSION,
|
||||||
|
PROJECT_DIALOGUE_LIBRARY_SCENE_DOCUMENT_VERSION,
|
||||||
SCHEDULER_ACTOR_ROUTINE_EFFECTS_SCENE_DOCUMENT_VERSION,
|
SCHEDULER_ACTOR_ROUTINE_EFFECTS_SCENE_DOCUMENT_VERSION,
|
||||||
NPC_PRESENCE_SCENE_DOCUMENT_VERSION,
|
NPC_PRESENCE_SCENE_DOCUMENT_VERSION,
|
||||||
PLAYER_START_GAMEPAD_CAMERA_LOOK_SCENE_DOCUMENT_VERSION,
|
PLAYER_START_GAMEPAD_CAMERA_LOOK_SCENE_DOCUMENT_VERSION,
|
||||||
@@ -69,6 +70,76 @@ describe("project document JSON", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("round-trips NPC dialogue references in project scenes", () => {
|
||||||
|
const document = createEmptyProjectDocument({
|
||||||
|
name: "NPC Dialogue Project"
|
||||||
|
});
|
||||||
|
const npc = createNpcEntity({
|
||||||
|
id: "entity-npc-merchant",
|
||||||
|
actorId: "actor-merchant",
|
||||||
|
dialogueId: "dialogue-market"
|
||||||
|
});
|
||||||
|
document.dialogues.dialogues["dialogue-market"] = {
|
||||||
|
id: "dialogue-market",
|
||||||
|
title: "Market",
|
||||||
|
lines: [
|
||||||
|
{
|
||||||
|
id: "dialogue-line-market-1",
|
||||||
|
speakerName: "Merchant",
|
||||||
|
text: "Fresh bread."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
document.scenes[document.activeSceneId]!.entities[npc.id] = npc;
|
||||||
|
|
||||||
|
expect(parseProjectDocumentJson(serializeProjectDocument(document))).toEqual(
|
||||||
|
document
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("migrates project NPCs without dialogue references from v50 to null dialogue ids", () => {
|
||||||
|
const document = createEmptyProjectDocument({
|
||||||
|
name: "Legacy NPC Dialogue Project"
|
||||||
|
});
|
||||||
|
const npc = createNpcEntity({
|
||||||
|
id: "entity-npc-guide",
|
||||||
|
actorId: "actor-guide"
|
||||||
|
});
|
||||||
|
document.scenes[document.activeSceneId]!.entities[npc.id] = npc;
|
||||||
|
|
||||||
|
const legacyDocument = JSON.parse(
|
||||||
|
serializeProjectDocument(document)
|
||||||
|
) as Record<string, unknown>;
|
||||||
|
legacyDocument.version = PROJECT_DIALOGUE_LIBRARY_SCENE_DOCUMENT_VERSION;
|
||||||
|
delete (legacyDocument.scenes as Record<string, unknown>)[
|
||||||
|
document.activeSceneId
|
||||||
|
];
|
||||||
|
legacyDocument.scenes = {
|
||||||
|
[document.activeSceneId]: {
|
||||||
|
...document.scenes[document.activeSceneId],
|
||||||
|
entities: {
|
||||||
|
[npc.id]: {
|
||||||
|
...document.scenes[document.activeSceneId]!.entities[npc.id],
|
||||||
|
dialogueId: undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const migratedDocument = parseProjectDocumentJson(
|
||||||
|
JSON.stringify(legacyDocument)
|
||||||
|
);
|
||||||
|
const migratedNpc = migratedDocument.scenes[migratedDocument.activeSceneId]!
|
||||||
|
.entities[npc.id];
|
||||||
|
|
||||||
|
expect(migratedNpc).toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
kind: "npc",
|
||||||
|
dialogueId: null
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it("round-trips the project name and authored scene loading overlay settings", () => {
|
it("round-trips the project name and authored scene loading overlay settings", () => {
|
||||||
const cellarEntry = createSceneEntryEntity({
|
const cellarEntry = createSceneEntryEntity({
|
||||||
id: "entity-scene-entry-cellar-stairs",
|
id: "entity-scene-entry-cellar-stairs",
|
||||||
|
|||||||
Reference in New Issue
Block a user