@react-text-game/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +744 -0
- package/dist/baseGameObject.d.ts +90 -0
- package/dist/baseGameObject.d.ts.map +1 -0
- package/dist/baseGameObject.js +109 -0
- package/dist/baseGameObject.js.map +1 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +12 -0
- package/dist/constants.js.map +1 -0
- package/dist/game.d.ts +294 -0
- package/dist/game.d.ts.map +1 -0
- package/dist/game.js +489 -0
- package/dist/game.js.map +1 -0
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +6 -0
- package/dist/helpers.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useCurrentPassage.d.ts +10 -0
- package/dist/hooks/useCurrentPassage.d.ts.map +1 -0
- package/dist/hooks/useCurrentPassage.js +17 -0
- package/dist/hooks/useCurrentPassage.js.map +1 -0
- package/dist/hooks/useGameEntity.d.ts +21 -0
- package/dist/hooks/useGameEntity.d.ts.map +1 -0
- package/dist/hooks/useGameEntity.js +70 -0
- package/dist/hooks/useGameEntity.js.map +1 -0
- package/dist/hooks/useGameIsStarted.d.ts +12 -0
- package/dist/hooks/useGameIsStarted.d.ts.map +1 -0
- package/dist/hooks/useGameIsStarted.js +18 -0
- package/dist/hooks/useGameIsStarted.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +36 -0
- package/dist/logger.js.map +1 -0
- package/dist/options.d.ts +13 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +15 -0
- package/dist/options.js.map +1 -0
- package/dist/passages/interactiveMap/fabric.d.ts +4 -0
- package/dist/passages/interactiveMap/fabric.d.ts.map +1 -0
- package/dist/passages/interactiveMap/fabric.js +3 -0
- package/dist/passages/interactiveMap/fabric.js.map +1 -0
- package/dist/passages/interactiveMap/index.d.ts +4 -0
- package/dist/passages/interactiveMap/index.d.ts.map +1 -0
- package/dist/passages/interactiveMap/index.js +4 -0
- package/dist/passages/interactiveMap/index.js.map +1 -0
- package/dist/passages/interactiveMap/interactiveMap.d.ts +89 -0
- package/dist/passages/interactiveMap/interactiveMap.d.ts.map +1 -0
- package/dist/passages/interactiveMap/interactiveMap.js +103 -0
- package/dist/passages/interactiveMap/interactiveMap.js.map +1 -0
- package/dist/passages/interactiveMap/types.d.ts +822 -0
- package/dist/passages/interactiveMap/types.d.ts.map +1 -0
- package/dist/passages/interactiveMap/types.js +2 -0
- package/dist/passages/interactiveMap/types.js.map +1 -0
- package/dist/passages/passage.d.ts +57 -0
- package/dist/passages/passage.d.ts.map +1 -0
- package/dist/passages/passage.js +64 -0
- package/dist/passages/passage.js.map +1 -0
- package/dist/passages/story/fabric.d.ts +4 -0
- package/dist/passages/story/fabric.d.ts.map +1 -0
- package/dist/passages/story/fabric.js +3 -0
- package/dist/passages/story/fabric.js.map +1 -0
- package/dist/passages/story/index.d.ts +5 -0
- package/dist/passages/story/index.d.ts.map +1 -0
- package/dist/passages/story/index.js +5 -0
- package/dist/passages/story/index.js.map +1 -0
- package/dist/passages/story/start.d.ts +14 -0
- package/dist/passages/story/start.d.ts.map +1 -0
- package/dist/passages/story/start.js +22 -0
- package/dist/passages/story/start.js.map +1 -0
- package/dist/passages/story/story.d.ts +84 -0
- package/dist/passages/story/story.d.ts.map +1 -0
- package/dist/passages/story/story.js +88 -0
- package/dist/passages/story/story.js.map +1 -0
- package/dist/passages/story/types.d.ts +911 -0
- package/dist/passages/story/types.d.ts.map +1 -0
- package/dist/passages/story/types.js +2 -0
- package/dist/passages/story/types.js.map +1 -0
- package/dist/passages/types/index.d.ts +3 -0
- package/dist/passages/types/index.d.ts.map +1 -0
- package/dist/passages/types/index.js +2 -0
- package/dist/passages/types/index.js.map +1 -0
- package/dist/passages/widget.d.ts +62 -0
- package/dist/passages/widget.d.ts.map +1 -0
- package/dist/passages/widget.js +66 -0
- package/dist/passages/widget.js.map +1 -0
- package/dist/saves/constants.d.ts +17 -0
- package/dist/saves/constants.d.ts.map +1 -0
- package/dist/saves/constants.js +17 -0
- package/dist/saves/constants.js.map +1 -0
- package/dist/saves/db.d.ts +119 -0
- package/dist/saves/db.d.ts.map +1 -0
- package/dist/saves/db.js +231 -0
- package/dist/saves/db.js.map +1 -0
- package/dist/saves/helpers.d.ts +28 -0
- package/dist/saves/helpers.d.ts.map +1 -0
- package/dist/saves/helpers.js +84 -0
- package/dist/saves/helpers.js.map +1 -0
- package/dist/saves/hooks/index.d.ts +10 -0
- package/dist/saves/hooks/index.d.ts.map +1 -0
- package/dist/saves/hooks/index.js +10 -0
- package/dist/saves/hooks/index.js.map +1 -0
- package/dist/saves/hooks/useDeleteAllSlots.d.ts +18 -0
- package/dist/saves/hooks/useDeleteAllSlots.d.ts.map +1 -0
- package/dist/saves/hooks/useDeleteAllSlots.js +18 -0
- package/dist/saves/hooks/useDeleteAllSlots.js.map +1 -0
- package/dist/saves/hooks/useDeleteGame.d.ts +22 -0
- package/dist/saves/hooks/useDeleteGame.d.ts.map +1 -0
- package/dist/saves/hooks/useDeleteGame.js +33 -0
- package/dist/saves/hooks/useDeleteGame.js.map +1 -0
- package/dist/saves/hooks/useExportSaves.d.ts +27 -0
- package/dist/saves/hooks/useExportSaves.d.ts.map +1 -0
- package/dist/saves/hooks/useExportSaves.js +54 -0
- package/dist/saves/hooks/useExportSaves.js.map +1 -0
- package/dist/saves/hooks/useImportSaves.d.ts +29 -0
- package/dist/saves/hooks/useImportSaves.d.ts.map +1 -0
- package/dist/saves/hooks/useImportSaves.js +108 -0
- package/dist/saves/hooks/useImportSaves.js.map +1 -0
- package/dist/saves/hooks/useLastLoadGame.d.ts +39 -0
- package/dist/saves/hooks/useLastLoadGame.d.ts.map +1 -0
- package/dist/saves/hooks/useLastLoadGame.js +72 -0
- package/dist/saves/hooks/useLastLoadGame.js.map +1 -0
- package/dist/saves/hooks/useLoadGame.d.ts +22 -0
- package/dist/saves/hooks/useLoadGame.d.ts.map +1 -0
- package/dist/saves/hooks/useLoadGame.js +40 -0
- package/dist/saves/hooks/useLoadGame.js.map +1 -0
- package/dist/saves/hooks/useRestartGame.d.ts +20 -0
- package/dist/saves/hooks/useRestartGame.d.ts.map +1 -0
- package/dist/saves/hooks/useRestartGame.js +29 -0
- package/dist/saves/hooks/useRestartGame.js.map +1 -0
- package/dist/saves/hooks/useSaveGame.d.ts +22 -0
- package/dist/saves/hooks/useSaveGame.d.ts.map +1 -0
- package/dist/saves/hooks/useSaveGame.js +34 -0
- package/dist/saves/hooks/useSaveGame.js.map +1 -0
- package/dist/saves/hooks/useSaveSlots.d.ts +45 -0
- package/dist/saves/hooks/useSaveSlots.d.ts.map +1 -0
- package/dist/saves/hooks/useSaveSlots.js +42 -0
- package/dist/saves/hooks/useSaveSlots.js.map +1 -0
- package/dist/saves/index.d.ts +4 -0
- package/dist/saves/index.d.ts.map +1 -0
- package/dist/saves/index.js +3 -0
- package/dist/saves/index.js.map +1 -0
- package/dist/saves/types.d.ts +52 -0
- package/dist/saves/types.d.ts.map +1 -0
- package/dist/saves/types.js +2 -0
- package/dist/saves/types.js.map +1 -0
- package/dist/storage.d.ts +124 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +229 -0
- package/dist/storage.js.map +1 -0
- package/dist/tests/game.test.d.ts +2 -0
- package/dist/tests/game.test.d.ts.map +1 -0
- package/dist/tests/game.test.js +602 -0
- package/dist/tests/game.test.js.map +1 -0
- package/dist/tests/interactiveMap.test.d.ts +2 -0
- package/dist/tests/interactiveMap.test.d.ts.map +1 -0
- package/dist/tests/interactiveMap.test.js +1003 -0
- package/dist/tests/interactiveMap.test.js.map +1 -0
- package/dist/tests/storage.test.d.ts +2 -0
- package/dist/tests/storage.test.d.ts.map +1 -0
- package/dist/tests/storage.test.js +328 -0
- package/dist/tests/storage.test.js.map +1 -0
- package/dist/tests/story.test.d.ts +2 -0
- package/dist/tests/story.test.d.ts.map +1 -0
- package/dist/tests/story.test.js +698 -0
- package/dist/tests/story.test.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
+
import { BaseGameObject } from "../baseGameObject";
|
|
3
|
+
import { SYSTEM_PASSAGE_NAMES } from "../constants";
|
|
4
|
+
import { Game } from "../game";
|
|
5
|
+
import { Passage } from "../passages/passage";
|
|
6
|
+
import { Storage } from "../storage";
|
|
7
|
+
// Create a mock storage that properly handles setState/getState
|
|
8
|
+
class MockStorage {
|
|
9
|
+
static state = {};
|
|
10
|
+
static getValue(jsonPath) {
|
|
11
|
+
// Simple implementation that handles our test cases
|
|
12
|
+
const path = jsonPath.replace(/^\$\./, "").split(".");
|
|
13
|
+
let current = this.state;
|
|
14
|
+
for (const key of path) {
|
|
15
|
+
if (current && typeof current === "object" && key in current) {
|
|
16
|
+
current = current[key];
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return [current];
|
|
23
|
+
}
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
25
|
+
static setValue(jsonPath, value, _isSystem = false) {
|
|
26
|
+
const path = jsonPath.replace(/^\$\./, "").split(".");
|
|
27
|
+
let current = this.state;
|
|
28
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
29
|
+
const key = path[i];
|
|
30
|
+
if (!(key in current)) {
|
|
31
|
+
current[key] = {};
|
|
32
|
+
}
|
|
33
|
+
current = current[key];
|
|
34
|
+
}
|
|
35
|
+
current[path[path.length - 1]] = value;
|
|
36
|
+
}
|
|
37
|
+
static getState() {
|
|
38
|
+
// Return a deep clone to avoid reference issues
|
|
39
|
+
return JSON.parse(JSON.stringify(this.state));
|
|
40
|
+
}
|
|
41
|
+
static setState(state) {
|
|
42
|
+
// Deep clone the incoming state to avoid reference issues
|
|
43
|
+
this.state = JSON.parse(JSON.stringify(state));
|
|
44
|
+
}
|
|
45
|
+
static reset() {
|
|
46
|
+
this.state = {};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Test helper classes
|
|
50
|
+
class TestEntity extends BaseGameObject {
|
|
51
|
+
constructor(id, health = 100, name = "Test") {
|
|
52
|
+
super({
|
|
53
|
+
id,
|
|
54
|
+
variables: { health, name },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Provide methods to modify state for testing
|
|
58
|
+
setHealth(value) {
|
|
59
|
+
this._variables.health = value;
|
|
60
|
+
}
|
|
61
|
+
setName(value) {
|
|
62
|
+
this._variables.name = value;
|
|
63
|
+
}
|
|
64
|
+
getHealth() {
|
|
65
|
+
return this._variables.health;
|
|
66
|
+
}
|
|
67
|
+
getName() {
|
|
68
|
+
return this._variables.name;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
class TestPassage extends Passage {
|
|
72
|
+
constructor(id) {
|
|
73
|
+
super(id, "widget");
|
|
74
|
+
}
|
|
75
|
+
display() {
|
|
76
|
+
return { content: `Passage: ${this.id}` };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Counter for unique IDs
|
|
80
|
+
let testCounter = 0;
|
|
81
|
+
function uniqueId(prefix) {
|
|
82
|
+
return `${prefix}-${testCounter++}`;
|
|
83
|
+
}
|
|
84
|
+
// Store original Storage methods
|
|
85
|
+
const originalStorageMethods = {
|
|
86
|
+
getValue: Storage.getValue.bind(Storage),
|
|
87
|
+
setValue: Storage.setValue.bind(Storage),
|
|
88
|
+
getState: Storage.getState.bind(Storage),
|
|
89
|
+
setState: Storage.setState.bind(Storage),
|
|
90
|
+
};
|
|
91
|
+
describe("Game", () => {
|
|
92
|
+
beforeEach(async () => {
|
|
93
|
+
// Replace Storage methods with MockStorage
|
|
94
|
+
Storage.getValue = MockStorage.getValue.bind(MockStorage);
|
|
95
|
+
Storage.setValue = MockStorage.setValue.bind(MockStorage);
|
|
96
|
+
Storage.getState = MockStorage.getState.bind(MockStorage);
|
|
97
|
+
Storage.setState = MockStorage.setState.bind(MockStorage);
|
|
98
|
+
// Reset mock storage
|
|
99
|
+
MockStorage.reset();
|
|
100
|
+
// Clear session storage
|
|
101
|
+
sessionStorage.clear();
|
|
102
|
+
// Re-initialize the game for each test
|
|
103
|
+
await Game.init({ gameName: "Test Game", isDevMode: true });
|
|
104
|
+
});
|
|
105
|
+
afterEach(() => {
|
|
106
|
+
// Reset game state after each test to ensure clean state
|
|
107
|
+
Game._resetForTesting();
|
|
108
|
+
// Reset mock storage
|
|
109
|
+
MockStorage.reset();
|
|
110
|
+
// Restore original Storage methods
|
|
111
|
+
Storage.getValue = originalStorageMethods.getValue;
|
|
112
|
+
Storage.setValue = originalStorageMethods.setValue;
|
|
113
|
+
Storage.getState = originalStorageMethods.getState;
|
|
114
|
+
Storage.setState = originalStorageMethods.setState;
|
|
115
|
+
});
|
|
116
|
+
describe("Initialization", () => {
|
|
117
|
+
test("sets default options on init", () => {
|
|
118
|
+
expect(Game.options.gameName).toBe("Test Game");
|
|
119
|
+
expect(Game.options.gameVersion).toBe("1.0.0");
|
|
120
|
+
});
|
|
121
|
+
test("sets custom options on init", async () => {
|
|
122
|
+
await Game.init({
|
|
123
|
+
gameName: "Custom Game",
|
|
124
|
+
gameId: "custom-id",
|
|
125
|
+
description: "Test description",
|
|
126
|
+
gameVersion: "2.0.0",
|
|
127
|
+
author: "Test Author",
|
|
128
|
+
isDevMode: true,
|
|
129
|
+
});
|
|
130
|
+
expect(Game.options.gameName).toBe("Custom Game");
|
|
131
|
+
expect(Game.options.gameId).toBe("custom-id");
|
|
132
|
+
expect(Game.options.description).toBe("Test description");
|
|
133
|
+
expect(Game.options.gameVersion).toBe("2.0.0");
|
|
134
|
+
expect(Game.options.author).toBe("Test Author");
|
|
135
|
+
expect(Game.options.isDevMode).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
test("sets start menu as current passage on init", () => {
|
|
138
|
+
expect(Game.selfState.currentPassageId).toBe(SYSTEM_PASSAGE_NAMES.START_MENU);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("Entity Registration", () => {
|
|
142
|
+
test("registers a single entity", () => {
|
|
143
|
+
const entity = new TestEntity(uniqueId("player"));
|
|
144
|
+
// Entity should be registered (constructor calls registerEntity)
|
|
145
|
+
const proxied = Game._getProxiedObject(entity);
|
|
146
|
+
expect(proxied).toBeDefined();
|
|
147
|
+
expect(proxied.id).toBe(entity.id);
|
|
148
|
+
});
|
|
149
|
+
test("registers multiple entities", () => {
|
|
150
|
+
const player = new TestEntity(uniqueId("player"));
|
|
151
|
+
const enemy = new TestEntity(uniqueId("enemy"));
|
|
152
|
+
const allEntities = Game._getAllProxiedObjects();
|
|
153
|
+
expect(allEntities.length).toBeGreaterThanOrEqual(2);
|
|
154
|
+
const playerProxy = Game._getProxiedObject(player);
|
|
155
|
+
const enemyProxy = Game._getProxiedObject(enemy);
|
|
156
|
+
expect(playerProxy.id).toBe(player.id);
|
|
157
|
+
expect(enemyProxy.id).toBe(enemy.id);
|
|
158
|
+
});
|
|
159
|
+
test("throws error when registering duplicate entity", () => {
|
|
160
|
+
const id = uniqueId("duplicate");
|
|
161
|
+
new TestEntity(id);
|
|
162
|
+
expect(() => {
|
|
163
|
+
new TestEntity(id);
|
|
164
|
+
}).toThrow(`Object "${id}" is already registered`);
|
|
165
|
+
});
|
|
166
|
+
test("proxies entities with Valtio", () => {
|
|
167
|
+
const entity = new TestEntity(uniqueId("player"));
|
|
168
|
+
const proxied = Game._getProxiedObject(entity);
|
|
169
|
+
// Proxied object should be reactive
|
|
170
|
+
proxied.setHealth(50);
|
|
171
|
+
expect(entity.getHealth()).toBe(50);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe("Passage Registration", () => {
|
|
175
|
+
test("registers a single passage", () => {
|
|
176
|
+
const passageId = uniqueId("intro");
|
|
177
|
+
new TestPassage(passageId);
|
|
178
|
+
const retrieved = Game.getPassageById(passageId);
|
|
179
|
+
expect(retrieved).not.toBeNull();
|
|
180
|
+
expect(retrieved?.id).toBe(passageId);
|
|
181
|
+
});
|
|
182
|
+
test("registers multiple passages", () => {
|
|
183
|
+
const id1 = uniqueId("intro");
|
|
184
|
+
const id2 = uniqueId("chapter1");
|
|
185
|
+
const id3 = uniqueId("chapter2");
|
|
186
|
+
new TestPassage(id1);
|
|
187
|
+
new TestPassage(id2);
|
|
188
|
+
new TestPassage(id3);
|
|
189
|
+
const allPassages = Game.getAllPassages();
|
|
190
|
+
expect(allPassages.length).toBeGreaterThanOrEqual(3);
|
|
191
|
+
const intro = Game.getPassageById(id1);
|
|
192
|
+
const chapter1 = Game.getPassageById(id2);
|
|
193
|
+
expect(intro?.id).toBe(id1);
|
|
194
|
+
expect(chapter1?.id).toBe(id2);
|
|
195
|
+
});
|
|
196
|
+
test("throws error when registering duplicate non-system passage", () => {
|
|
197
|
+
const id = uniqueId("intro");
|
|
198
|
+
new TestPassage(id);
|
|
199
|
+
expect(() => {
|
|
200
|
+
new TestPassage(id);
|
|
201
|
+
}).toThrow(`Passage "${id}" is already registered`);
|
|
202
|
+
});
|
|
203
|
+
test("allows re-registration of system passages", () => {
|
|
204
|
+
const systemPassage1 = new TestPassage(SYSTEM_PASSAGE_NAMES.START_MENU);
|
|
205
|
+
const systemPassage2 = new TestPassage(SYSTEM_PASSAGE_NAMES.START_MENU);
|
|
206
|
+
// Should not throw
|
|
207
|
+
expect(systemPassage1.id).toBe(SYSTEM_PASSAGE_NAMES.START_MENU);
|
|
208
|
+
expect(systemPassage2.id).toBe(SYSTEM_PASSAGE_NAMES.START_MENU);
|
|
209
|
+
});
|
|
210
|
+
test("returns iterator of registered passages", () => {
|
|
211
|
+
// Create some passages first
|
|
212
|
+
new TestPassage(uniqueId("p1"));
|
|
213
|
+
new TestPassage(uniqueId("p2"));
|
|
214
|
+
const iterator = Game.registeredPassages;
|
|
215
|
+
const passages = Array.from(iterator);
|
|
216
|
+
expect(passages.length).toBeGreaterThanOrEqual(2);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
describe("Navigation", () => {
|
|
220
|
+
test("jumps to passage by string id", () => {
|
|
221
|
+
const passageId = uniqueId("intro");
|
|
222
|
+
new TestPassage(passageId);
|
|
223
|
+
Game.jumpTo(passageId);
|
|
224
|
+
expect(Game.selfState.currentPassageId).toBe(passageId);
|
|
225
|
+
});
|
|
226
|
+
test("jumps to passage by object", () => {
|
|
227
|
+
const passageId = uniqueId("intro");
|
|
228
|
+
const passage = new TestPassage(passageId);
|
|
229
|
+
Game.jumpTo(passage);
|
|
230
|
+
expect(Game.selfState.currentPassageId).toBe(passageId);
|
|
231
|
+
});
|
|
232
|
+
test("throws error when jumping to non-existent passage", () => {
|
|
233
|
+
expect(() => {
|
|
234
|
+
Game.jumpTo("nonexistent");
|
|
235
|
+
}).toThrow('Passage "nonexistent" not found');
|
|
236
|
+
});
|
|
237
|
+
test("sets current passage without validation", () => {
|
|
238
|
+
Game.setCurrent("any-passage-id");
|
|
239
|
+
expect(Game.selfState.currentPassageId).toBe("any-passage-id");
|
|
240
|
+
});
|
|
241
|
+
test("currentPassage returns null when no current passage exists", () => {
|
|
242
|
+
Game.setCurrent("nonexistent");
|
|
243
|
+
const current = Game.currentPassage;
|
|
244
|
+
expect(current).toBeNull();
|
|
245
|
+
});
|
|
246
|
+
test("currentPassage returns passage object when set", () => {
|
|
247
|
+
const passageId = uniqueId("intro");
|
|
248
|
+
const passage = new TestPassage(passageId);
|
|
249
|
+
Game.jumpTo(passage);
|
|
250
|
+
const current = Game.currentPassage;
|
|
251
|
+
expect(current).not.toBeNull();
|
|
252
|
+
expect(current?.id).toBe(passageId);
|
|
253
|
+
});
|
|
254
|
+
test("getPassageById returns null for non-existent passage", () => {
|
|
255
|
+
const passage = Game.getPassageById("nonexistent");
|
|
256
|
+
expect(passage).toBeNull();
|
|
257
|
+
});
|
|
258
|
+
test("getAllPassages returns array of all passages", () => {
|
|
259
|
+
// Create some passages first
|
|
260
|
+
new TestPassage(uniqueId("p1"));
|
|
261
|
+
new TestPassage(uniqueId("p2"));
|
|
262
|
+
new TestPassage(uniqueId("p3"));
|
|
263
|
+
const passages = Game.getAllPassages();
|
|
264
|
+
expect(Array.isArray(passages)).toBe(true);
|
|
265
|
+
expect(passages.length).toBeGreaterThanOrEqual(3);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe("State Management", () => {
|
|
269
|
+
test("getState captures complete game state", () => {
|
|
270
|
+
const passageId = uniqueId("intro");
|
|
271
|
+
new TestPassage(passageId);
|
|
272
|
+
Game.jumpTo(passageId);
|
|
273
|
+
const state = Game.getState();
|
|
274
|
+
expect(state).toBeDefined();
|
|
275
|
+
expect(typeof state).toBe("object");
|
|
276
|
+
});
|
|
277
|
+
test("getState includes Game's internal state", () => {
|
|
278
|
+
const passageId = uniqueId("intro");
|
|
279
|
+
new TestPassage(passageId);
|
|
280
|
+
Game.jumpTo(passageId);
|
|
281
|
+
const state = Game.getState();
|
|
282
|
+
// Should have system data
|
|
283
|
+
expect(state).toHaveProperty("_system");
|
|
284
|
+
expect(state._system).toHaveProperty("game");
|
|
285
|
+
// @ts-expect-error TS18046
|
|
286
|
+
expect(state._system.game.currentPassageId).toBe(passageId);
|
|
287
|
+
});
|
|
288
|
+
test("getState includes entity states", () => {
|
|
289
|
+
const entityId = uniqueId("player");
|
|
290
|
+
new TestEntity(entityId, 75, "Hero");
|
|
291
|
+
const state = Game.getState();
|
|
292
|
+
// Should have player data
|
|
293
|
+
expect(state).toHaveProperty(entityId);
|
|
294
|
+
expect(state[entityId]).toEqual({ health: 75, name: "Hero" });
|
|
295
|
+
});
|
|
296
|
+
test("setState restores complete game state", () => {
|
|
297
|
+
const entityId = uniqueId("player");
|
|
298
|
+
const passageId = uniqueId("intro");
|
|
299
|
+
const entity = new TestEntity(entityId, 100, "Hero");
|
|
300
|
+
new TestPassage(passageId);
|
|
301
|
+
Game.jumpTo(passageId);
|
|
302
|
+
const savedState = Game.getState();
|
|
303
|
+
// Change state
|
|
304
|
+
entity.setHealth(50);
|
|
305
|
+
Game.setCurrent(SYSTEM_PASSAGE_NAMES.START_MENU);
|
|
306
|
+
// Restore - NOTE: This may fail due to Storage system path handling issues
|
|
307
|
+
// when entity registries accumulate state from previous tests
|
|
308
|
+
Game.setState(savedState);
|
|
309
|
+
expect(entity.getHealth()).toBe(100);
|
|
310
|
+
expect(Game.selfState.currentPassageId).toBe(passageId);
|
|
311
|
+
});
|
|
312
|
+
test("setState restores entity variables", () => {
|
|
313
|
+
const playerId = uniqueId("player");
|
|
314
|
+
const enemyId = uniqueId("enemy");
|
|
315
|
+
const player = new TestEntity(playerId, 100, "Hero");
|
|
316
|
+
const enemy = new TestEntity(enemyId, 50, "Goblin");
|
|
317
|
+
const savedState = Game.getState();
|
|
318
|
+
// Modify entities
|
|
319
|
+
player.setHealth(25);
|
|
320
|
+
player.setName("Changed");
|
|
321
|
+
enemy.setHealth(10);
|
|
322
|
+
// Restore
|
|
323
|
+
Game.setState(savedState);
|
|
324
|
+
expect(player.getHealth()).toBe(100);
|
|
325
|
+
expect(player.getName()).toBe("Hero");
|
|
326
|
+
expect(enemy.getHealth()).toBe(50);
|
|
327
|
+
expect(enemy.getName()).toBe("Goblin");
|
|
328
|
+
});
|
|
329
|
+
test("state is serializable", () => {
|
|
330
|
+
const entityId = uniqueId("player");
|
|
331
|
+
const passageId = uniqueId("intro");
|
|
332
|
+
new TestEntity(entityId, 100, "Hero");
|
|
333
|
+
new TestPassage(passageId);
|
|
334
|
+
Game.jumpTo(passageId);
|
|
335
|
+
const state = Game.getState();
|
|
336
|
+
const serialized = JSON.stringify(state);
|
|
337
|
+
const deserialized = JSON.parse(serialized);
|
|
338
|
+
expect(deserialized).toEqual(state);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
describe("Auto-save", () => {
|
|
342
|
+
test("enableAutoSave enables auto-saving", async () => {
|
|
343
|
+
const entityId = uniqueId("player");
|
|
344
|
+
const entity = new TestEntity(entityId);
|
|
345
|
+
// Enable auto-save explicitly
|
|
346
|
+
Game.enableAutoSave();
|
|
347
|
+
// Clear session storage to test
|
|
348
|
+
sessionStorage.clear();
|
|
349
|
+
// Change state
|
|
350
|
+
entity.setHealth(50);
|
|
351
|
+
// Wait for debounce
|
|
352
|
+
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
353
|
+
const saved = sessionStorage.getItem("gameAutoSave");
|
|
354
|
+
// When explicitly enabled, auto-save should work even in dev mode
|
|
355
|
+
expect(saved).not.toBeNull();
|
|
356
|
+
});
|
|
357
|
+
test("disableAutoSave stops auto-saving", async () => {
|
|
358
|
+
const entityId = uniqueId("player");
|
|
359
|
+
const entity = new TestEntity(entityId);
|
|
360
|
+
// Disable auto-save
|
|
361
|
+
Game.disableAutoSave();
|
|
362
|
+
// Clear session storage
|
|
363
|
+
sessionStorage.clear();
|
|
364
|
+
// Change state
|
|
365
|
+
entity.setHealth(50);
|
|
366
|
+
// Wait for debounce
|
|
367
|
+
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
368
|
+
const saved = sessionStorage.getItem("gameAutoSave");
|
|
369
|
+
expect(saved).toBeNull();
|
|
370
|
+
});
|
|
371
|
+
test("loadFromSessionStorage loads saved state", async () => {
|
|
372
|
+
const entityId = uniqueId("player");
|
|
373
|
+
const passageId = uniqueId("intro");
|
|
374
|
+
const entity = new TestEntity(entityId, 100, "Hero");
|
|
375
|
+
new TestPassage(passageId);
|
|
376
|
+
Game.jumpTo(passageId);
|
|
377
|
+
const state = Game.getState();
|
|
378
|
+
sessionStorage.setItem("gameAutoSave", JSON.stringify(state));
|
|
379
|
+
// Change state
|
|
380
|
+
entity.setHealth(50);
|
|
381
|
+
Game.setCurrent("different");
|
|
382
|
+
// Load from session storage
|
|
383
|
+
const loaded = Game.loadFromSessionStorage();
|
|
384
|
+
expect(loaded).toBe(true);
|
|
385
|
+
expect(entity.getHealth()).toBe(100);
|
|
386
|
+
expect(Game.selfState.currentPassageId).toBe(passageId);
|
|
387
|
+
});
|
|
388
|
+
test("loadFromSessionStorage returns false when no saved state", () => {
|
|
389
|
+
sessionStorage.clear();
|
|
390
|
+
const loaded = Game.loadFromSessionStorage();
|
|
391
|
+
expect(loaded).toBe(false);
|
|
392
|
+
});
|
|
393
|
+
test("loadFromSessionStorage returns false on invalid JSON", () => {
|
|
394
|
+
sessionStorage.setItem("gameAutoSave", "invalid json");
|
|
395
|
+
const loaded = Game.loadFromSessionStorage();
|
|
396
|
+
expect(loaded).toBe(false);
|
|
397
|
+
});
|
|
398
|
+
test("clearAutoSave removes session storage", () => {
|
|
399
|
+
sessionStorage.setItem("gameAutoSave", "test data");
|
|
400
|
+
Game.clearAutoSave();
|
|
401
|
+
const saved = sessionStorage.getItem("gameAutoSave");
|
|
402
|
+
expect(saved).toBeNull();
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
describe("Options Management", () => {
|
|
406
|
+
test("updateOptions updates game options", () => {
|
|
407
|
+
Game.updateOptions({
|
|
408
|
+
gameName: "Updated Game",
|
|
409
|
+
gameVersion: "3.0.0",
|
|
410
|
+
});
|
|
411
|
+
expect(Game.options.gameName).toBe("Updated Game");
|
|
412
|
+
expect(Game.options.gameVersion).toBe("3.0.0");
|
|
413
|
+
});
|
|
414
|
+
test("updateOptions preserves existing options", () => {
|
|
415
|
+
const originalAuthor = Game.options.author;
|
|
416
|
+
Game.updateOptions({
|
|
417
|
+
gameName: "Updated Game",
|
|
418
|
+
});
|
|
419
|
+
expect(Game.options.gameName).toBe("Updated Game");
|
|
420
|
+
expect(Game.options.author).toBe(originalAuthor);
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
describe("Integration Tests", () => {
|
|
424
|
+
test("complete game flow: init, create entities, navigate, save, load", async () => {
|
|
425
|
+
await Game.init({
|
|
426
|
+
gameName: "Adventure Game",
|
|
427
|
+
gameVersion: "1.0.0",
|
|
428
|
+
author: "Test Author",
|
|
429
|
+
isDevMode: true,
|
|
430
|
+
});
|
|
431
|
+
// Create entities
|
|
432
|
+
const playerId = uniqueId("player");
|
|
433
|
+
const enemyId = uniqueId("enemy");
|
|
434
|
+
const player = new TestEntity(playerId, 100, "Hero");
|
|
435
|
+
const enemy = new TestEntity(enemyId, 50, "Goblin");
|
|
436
|
+
// Create passages
|
|
437
|
+
const introId = uniqueId("intro");
|
|
438
|
+
const battleId = uniqueId("battle");
|
|
439
|
+
const victoryId = uniqueId("victory");
|
|
440
|
+
new TestPassage(introId);
|
|
441
|
+
new TestPassage(battleId);
|
|
442
|
+
new TestPassage(victoryId);
|
|
443
|
+
// Navigate
|
|
444
|
+
Game.jumpTo(introId);
|
|
445
|
+
expect(Game.currentPassage?.id).toBe(introId);
|
|
446
|
+
// Simulate game progress
|
|
447
|
+
Game.jumpTo(battleId);
|
|
448
|
+
player.setHealth(75);
|
|
449
|
+
enemy.setHealth(25);
|
|
450
|
+
// Save state
|
|
451
|
+
const savedState = Game.getState();
|
|
452
|
+
// Continue playing
|
|
453
|
+
Game.jumpTo(victoryId);
|
|
454
|
+
player.setHealth(100);
|
|
455
|
+
enemy.setHealth(0);
|
|
456
|
+
// Load saved state
|
|
457
|
+
Game.setState(savedState);
|
|
458
|
+
// Verify restoration
|
|
459
|
+
expect(Game.currentPassage?.id).toBe(battleId);
|
|
460
|
+
expect(player.getHealth()).toBe(75);
|
|
461
|
+
expect(enemy.getHealth()).toBe(25);
|
|
462
|
+
});
|
|
463
|
+
test("multiple save slots simulation", () => {
|
|
464
|
+
const playerId = uniqueId("player");
|
|
465
|
+
const player = new TestEntity(playerId, 100, "Hero");
|
|
466
|
+
const chapter1Id = uniqueId("chapter1");
|
|
467
|
+
const chapter2Id = uniqueId("chapter2");
|
|
468
|
+
const chapter3Id = uniqueId("chapter3");
|
|
469
|
+
new TestPassage(chapter1Id);
|
|
470
|
+
new TestPassage(chapter2Id);
|
|
471
|
+
new TestPassage(chapter3Id);
|
|
472
|
+
// Save slot 1 - Chapter 1
|
|
473
|
+
Game.jumpTo(chapter1Id);
|
|
474
|
+
player.setHealth(100);
|
|
475
|
+
const save1 = Game.getState();
|
|
476
|
+
// Save slot 2 - Chapter 2
|
|
477
|
+
Game.jumpTo(chapter2Id);
|
|
478
|
+
player.setHealth(80);
|
|
479
|
+
const save2 = Game.getState();
|
|
480
|
+
// Save slot 3 - Chapter 3
|
|
481
|
+
Game.jumpTo(chapter3Id);
|
|
482
|
+
player.setHealth(60);
|
|
483
|
+
const save3 = Game.getState();
|
|
484
|
+
// Load save 1
|
|
485
|
+
Game.setState(save1);
|
|
486
|
+
expect(Game.currentPassage?.id).toBe(chapter1Id);
|
|
487
|
+
expect(player.getHealth()).toBe(100);
|
|
488
|
+
// Load save 3
|
|
489
|
+
Game.setState(save3);
|
|
490
|
+
expect(Game.currentPassage?.id).toBe(chapter3Id);
|
|
491
|
+
expect(player.getHealth()).toBe(60);
|
|
492
|
+
// Load save 2
|
|
493
|
+
Game.setState(save2);
|
|
494
|
+
expect(Game.currentPassage?.id).toBe(chapter2Id);
|
|
495
|
+
expect(player.getHealth()).toBe(80);
|
|
496
|
+
});
|
|
497
|
+
test("entity state persistence across multiple changes", () => {
|
|
498
|
+
const playerId = uniqueId("player");
|
|
499
|
+
const player = new TestEntity(playerId, 100, "Hero");
|
|
500
|
+
// Make multiple changes
|
|
501
|
+
player.setHealth(90);
|
|
502
|
+
player.save();
|
|
503
|
+
player.setHealth(80);
|
|
504
|
+
player.save();
|
|
505
|
+
player.setName("Veteran Hero");
|
|
506
|
+
player.save();
|
|
507
|
+
const state = Game.getState();
|
|
508
|
+
// Change values
|
|
509
|
+
player.setHealth(10);
|
|
510
|
+
player.setName("Defeated");
|
|
511
|
+
// Restore
|
|
512
|
+
Game.setState(state);
|
|
513
|
+
expect(player.getHealth()).toBe(80);
|
|
514
|
+
expect(player.getName()).toBe("Veteran Hero");
|
|
515
|
+
});
|
|
516
|
+
});
|
|
517
|
+
describe("Edge Cases", () => {
|
|
518
|
+
test("handles empty game state", () => {
|
|
519
|
+
const state = Game.getState();
|
|
520
|
+
expect(state).toBeDefined();
|
|
521
|
+
expect(typeof state).toBe("object");
|
|
522
|
+
});
|
|
523
|
+
test("handles setState with minimal state", () => {
|
|
524
|
+
const minimalState = {
|
|
525
|
+
_system: {
|
|
526
|
+
game: {
|
|
527
|
+
currentPassageId: null,
|
|
528
|
+
},
|
|
529
|
+
},
|
|
530
|
+
};
|
|
531
|
+
Game.setState(minimalState);
|
|
532
|
+
expect(Game.selfState.currentPassageId).toBeNull();
|
|
533
|
+
});
|
|
534
|
+
test("entity with no variables", () => {
|
|
535
|
+
const entityId = uniqueId("empty");
|
|
536
|
+
new BaseGameObject({ id: entityId });
|
|
537
|
+
const state = Game.getState();
|
|
538
|
+
expect(state).toHaveProperty(entityId);
|
|
539
|
+
});
|
|
540
|
+
test("passage display throws error if not implemented", () => {
|
|
541
|
+
class IncompletePassage extends Passage {
|
|
542
|
+
constructor() {
|
|
543
|
+
super(uniqueId("incomplete"), "widget");
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
const passage = new IncompletePassage();
|
|
547
|
+
expect(() => {
|
|
548
|
+
passage.display();
|
|
549
|
+
}).toThrow("Display method not implemented");
|
|
550
|
+
});
|
|
551
|
+
test("multiple consecutive jumpTo calls", () => {
|
|
552
|
+
const id1 = uniqueId("p1");
|
|
553
|
+
const id2 = uniqueId("p2");
|
|
554
|
+
const id3 = uniqueId("p3");
|
|
555
|
+
new TestPassage(id1);
|
|
556
|
+
new TestPassage(id2);
|
|
557
|
+
new TestPassage(id3);
|
|
558
|
+
Game.jumpTo(id1);
|
|
559
|
+
Game.jumpTo(id2);
|
|
560
|
+
Game.jumpTo(id3);
|
|
561
|
+
expect(Game.currentPassage?.id).toBe(id3);
|
|
562
|
+
});
|
|
563
|
+
test("selfState provides access to internal state", () => {
|
|
564
|
+
const state = Game.selfState;
|
|
565
|
+
expect(state).toBeDefined();
|
|
566
|
+
expect(state).toHaveProperty("currentPassageId");
|
|
567
|
+
});
|
|
568
|
+
test("registering entity with special characters in id", () => {
|
|
569
|
+
const entityId = uniqueId("player_123");
|
|
570
|
+
const entity = new TestEntity(entityId);
|
|
571
|
+
const proxied = Game._getProxiedObject(entity);
|
|
572
|
+
expect(proxied.id).toBe(entityId);
|
|
573
|
+
});
|
|
574
|
+
test("state serialization with special values", () => {
|
|
575
|
+
class SpecialEntity extends BaseGameObject {
|
|
576
|
+
constructor(id) {
|
|
577
|
+
super({
|
|
578
|
+
id,
|
|
579
|
+
variables: {
|
|
580
|
+
emptyString: "",
|
|
581
|
+
zero: 0,
|
|
582
|
+
falseValue: false,
|
|
583
|
+
nullValue: null,
|
|
584
|
+
},
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
const entityId = uniqueId("special");
|
|
589
|
+
new SpecialEntity(entityId);
|
|
590
|
+
const state = Game.getState();
|
|
591
|
+
const serialized = JSON.stringify(state);
|
|
592
|
+
const deserialized = JSON.parse(serialized);
|
|
593
|
+
expect(deserialized[entityId]).toEqual({
|
|
594
|
+
emptyString: "",
|
|
595
|
+
zero: 0,
|
|
596
|
+
falseValue: false,
|
|
597
|
+
nullValue: null,
|
|
598
|
+
});
|
|
599
|
+
});
|
|
600
|
+
});
|
|
601
|
+
});
|
|
602
|
+
//# sourceMappingURL=game.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game.test.js","sourceRoot":"","sources":["../../src/tests/game.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactiveMap.test.d.ts","sourceRoot":"","sources":["../../src/tests/interactiveMap.test.ts"],"names":[],"mappings":""}
|