@rpgjs/server 5.0.0-alpha.9 → 5.0.0-beta.1
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/dist/Gui/DialogGui.d.ts +5 -0
- package/dist/Gui/GameoverGui.d.ts +23 -0
- package/dist/Gui/Gui.d.ts +6 -0
- package/dist/Gui/MenuGui.d.ts +22 -3
- package/dist/Gui/NotificationGui.d.ts +1 -2
- package/dist/Gui/SaveLoadGui.d.ts +13 -0
- package/dist/Gui/ShopGui.d.ts +28 -3
- package/dist/Gui/TitleGui.d.ts +23 -0
- package/dist/Gui/index.d.ts +10 -1
- package/dist/Player/BattleManager.d.ts +44 -32
- package/dist/Player/ClassManager.d.ts +24 -4
- package/dist/Player/ComponentManager.d.ts +95 -32
- package/dist/Player/Components.d.ts +345 -0
- package/dist/Player/EffectManager.d.ts +50 -4
- package/dist/Player/ElementManager.d.ts +77 -4
- package/dist/Player/GoldManager.d.ts +1 -1
- package/dist/Player/GuiManager.d.ts +87 -4
- package/dist/Player/ItemFixture.d.ts +1 -1
- package/dist/Player/ItemManager.d.ts +431 -4
- package/dist/Player/MoveManager.d.ts +301 -34
- package/dist/Player/ParameterManager.d.ts +364 -28
- package/dist/Player/Player.d.ts +558 -14
- package/dist/Player/SkillManager.d.ts +187 -13
- package/dist/Player/StateManager.d.ts +75 -4
- package/dist/Player/VariableManager.d.ts +62 -4
- package/dist/RpgServer.d.ts +278 -63
- package/dist/RpgServerEngine.d.ts +2 -1
- package/dist/decorators/event.d.ts +46 -0
- package/dist/decorators/map.d.ts +299 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +17920 -29711
- package/dist/index.js.map +1 -1
- package/dist/logs/log.d.ts +2 -3
- package/dist/module-CaCW1SDh.js +11018 -0
- package/dist/module-CaCW1SDh.js.map +1 -0
- package/dist/module.d.ts +43 -1
- package/dist/node/connection.d.ts +51 -0
- package/dist/node/index.d.ts +5 -0
- package/dist/node/index.js +551 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/map.d.ts +16 -0
- package/dist/node/room.d.ts +21 -0
- package/dist/node/transport.d.ts +28 -0
- package/dist/node/types.d.ts +47 -0
- package/dist/presets/index.d.ts +0 -9
- package/dist/rooms/BaseRoom.d.ts +132 -0
- package/dist/rooms/lobby.d.ts +10 -2
- package/dist/rooms/map.d.ts +1359 -32
- package/dist/services/save.d.ts +43 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/localStorage.d.ts +23 -0
- package/package.json +25 -10
- package/src/Gui/DialogGui.ts +19 -4
- package/src/Gui/GameoverGui.ts +39 -0
- package/src/Gui/Gui.ts +23 -1
- package/src/Gui/MenuGui.ts +155 -6
- package/src/Gui/NotificationGui.ts +1 -2
- package/src/Gui/SaveLoadGui.ts +60 -0
- package/src/Gui/ShopGui.ts +146 -16
- package/src/Gui/TitleGui.ts +39 -0
- package/src/Gui/index.ts +15 -2
- package/src/Player/BattleManager.ts +39 -56
- package/src/Player/ClassManager.ts +82 -74
- package/src/Player/ComponentManager.ts +394 -32
- package/src/Player/Components.ts +380 -0
- package/src/Player/EffectManager.ts +50 -96
- package/src/Player/ElementManager.ts +74 -152
- package/src/Player/GuiManager.ts +125 -14
- package/src/Player/ItemManager.ts +747 -341
- package/src/Player/MoveManager.ts +1532 -750
- package/src/Player/ParameterManager.ts +636 -106
- package/src/Player/Player.ts +1273 -79
- package/src/Player/SkillManager.ts +558 -197
- package/src/Player/StateManager.ts +131 -258
- package/src/Player/VariableManager.ts +85 -157
- package/src/RpgServer.ts +293 -62
- package/src/decorators/event.ts +61 -0
- package/src/decorators/map.ts +343 -0
- package/src/index.ts +11 -1
- package/src/logs/log.ts +10 -3
- package/src/module.ts +126 -3
- package/src/node/connection.ts +254 -0
- package/src/node/index.ts +22 -0
- package/src/node/map.ts +328 -0
- package/src/node/room.ts +63 -0
- package/src/node/transport.ts +532 -0
- package/src/node/types.ts +61 -0
- package/src/presets/index.ts +1 -10
- package/src/rooms/BaseRoom.ts +232 -0
- package/src/rooms/lobby.ts +25 -7
- package/src/rooms/map.ts +2682 -206
- package/src/services/save.ts +147 -0
- package/src/storage/index.ts +1 -0
- package/src/storage/localStorage.ts +76 -0
- package/tests/battle.spec.ts +375 -0
- package/tests/change-map.spec.ts +72 -0
- package/tests/class.spec.ts +274 -0
- package/tests/custom-websocket.spec.ts +127 -0
- package/tests/effect.spec.ts +219 -0
- package/tests/element.spec.ts +221 -0
- package/tests/event.spec.ts +80 -0
- package/tests/gold.spec.ts +99 -0
- package/tests/item.spec.ts +609 -0
- package/tests/module.spec.ts +38 -0
- package/tests/move.spec.ts +601 -0
- package/tests/node-transport.spec.ts +223 -0
- package/tests/player-param.spec.ts +45 -0
- package/tests/prediction-reconciliation.spec.ts +182 -0
- package/tests/random-move.spec.ts +65 -0
- package/tests/skill.spec.ts +658 -0
- package/tests/state.spec.ts +467 -0
- package/tests/variable.spec.ts +185 -0
- package/tests/world-maps.spec.ts +896 -0
- package/vite.config.ts +36 -3
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { beforeEach, test, expect, afterEach, describe } from "vitest";
|
|
2
|
+
import { testing, TestingFixture } from "@rpgjs/testing";
|
|
3
|
+
import { defineModule, createModule } from "@rpgjs/common";
|
|
4
|
+
import { RpgPlayer } from "../src";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Test weapon with fire element
|
|
8
|
+
*/
|
|
9
|
+
const FireSword = {
|
|
10
|
+
id: "fire-sword",
|
|
11
|
+
name: "Fire Sword",
|
|
12
|
+
atk: 20,
|
|
13
|
+
elements: [{ rate: 1.5, element: "fire" }],
|
|
14
|
+
_type: "weapon" as const,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Test weapon with ice element
|
|
19
|
+
*/
|
|
20
|
+
const IceStaff = {
|
|
21
|
+
id: "ice-staff",
|
|
22
|
+
name: "Ice Staff",
|
|
23
|
+
atk: 15,
|
|
24
|
+
elements: [{ rate: 1.3, element: "ice" }],
|
|
25
|
+
_type: "weapon" as const,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Test armor with fire defense
|
|
30
|
+
*/
|
|
31
|
+
const FireShield = {
|
|
32
|
+
id: "fire-shield",
|
|
33
|
+
name: "Fire Shield",
|
|
34
|
+
pdef: 10,
|
|
35
|
+
elementsDefense: [{ rate: 0.5, element: "fire" }],
|
|
36
|
+
_type: "armor" as const,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Test class with element efficiency
|
|
41
|
+
*/
|
|
42
|
+
class IceMageClass {
|
|
43
|
+
static id = "ice-mage";
|
|
44
|
+
id = "ice-mage";
|
|
45
|
+
name = "Ice Mage";
|
|
46
|
+
elementsEfficiency = [
|
|
47
|
+
{ rate: 0.5, element: "ice" }, // Resistant to ice
|
|
48
|
+
{ rate: 1.5, element: "fire" }, // Vulnerable to fire
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let player: RpgPlayer;
|
|
53
|
+
let fixture: TestingFixture;
|
|
54
|
+
|
|
55
|
+
const serverModule = defineModule({
|
|
56
|
+
maps: [{ id: "test-map", file: "" }],
|
|
57
|
+
database: {
|
|
58
|
+
"fire-sword": FireSword,
|
|
59
|
+
"ice-staff": IceStaff,
|
|
60
|
+
"fire-shield": FireShield,
|
|
61
|
+
"ice-mage": IceMageClass,
|
|
62
|
+
},
|
|
63
|
+
player: {
|
|
64
|
+
async onConnected(player) {
|
|
65
|
+
await player.changeMap("test-map", { x: 100, y: 100 });
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const clientModule = defineModule({});
|
|
71
|
+
|
|
72
|
+
beforeEach(async () => {
|
|
73
|
+
const myModule = createModule("TestModule", [
|
|
74
|
+
{ server: serverModule, client: clientModule },
|
|
75
|
+
]);
|
|
76
|
+
fixture = await testing(myModule);
|
|
77
|
+
const clientTesting = await fixture.createClient();
|
|
78
|
+
player = await clientTesting.waitForMapChange("test-map");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
afterEach(async () => {
|
|
82
|
+
await fixture.clear();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe("Element Manager - Elements from Equipment", () => {
|
|
86
|
+
test("should have no elements without equipment", () => {
|
|
87
|
+
expect(player.elements).toEqual([]);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Note: Equipment elements require items to have an elements property that
|
|
91
|
+
// is accessible after equipping. This depends on how Item class stores data.
|
|
92
|
+
test.skip("should get elements from equipped weapon", () => {
|
|
93
|
+
player.addItem(FireSword, 1);
|
|
94
|
+
player.equip("fire-sword", true);
|
|
95
|
+
|
|
96
|
+
expect(player.elements.length).toBe(1);
|
|
97
|
+
expect(player.elements[0].element).toBe("fire");
|
|
98
|
+
expect(player.elements[0].rate).toBe(1.5);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test.skip("should get multiple elements from multiple equipment", () => {
|
|
102
|
+
player.addItem(FireSword, 1);
|
|
103
|
+
player.addItem(IceStaff, 1);
|
|
104
|
+
player.equip("fire-sword", true);
|
|
105
|
+
player.equip("ice-staff", true);
|
|
106
|
+
|
|
107
|
+
const elementNames = player.elements.map(e => e.element);
|
|
108
|
+
expect(elementNames).toContain("fire");
|
|
109
|
+
expect(elementNames).toContain("ice");
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test.skip("should lose elements when equipment is unequipped", () => {
|
|
113
|
+
player.addItem(FireSword, 1);
|
|
114
|
+
player.equip("fire-sword", true);
|
|
115
|
+
expect(player.elements.length).toBe(1);
|
|
116
|
+
|
|
117
|
+
player.equip("fire-sword", false);
|
|
118
|
+
expect(player.elements).toEqual([]);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe("Element Manager - Elements Efficiency", () => {
|
|
123
|
+
test("should have empty elementsEfficiency by default", () => {
|
|
124
|
+
expect(player.elementsEfficiency).toEqual([]);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("should set elementsEfficiency directly", () => {
|
|
128
|
+
player.elementsEfficiency = [{ rate: 0.5, element: "fire" }];
|
|
129
|
+
expect(player.elementsEfficiency.length).toBe(1);
|
|
130
|
+
expect(player.elementsEfficiency[0].element).toBe("fire");
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Note: Class elementsEfficiency requires _class() to return class data
|
|
134
|
+
// which depends on how setClass stores the class instance
|
|
135
|
+
test.skip("should get elementsEfficiency from class", () => {
|
|
136
|
+
player.setClass(IceMageClass);
|
|
137
|
+
|
|
138
|
+
const iceEfficiency = player.elementsEfficiency.find(e => e.element === "ice");
|
|
139
|
+
const fireEfficiency = player.elementsEfficiency.find(e => e.element === "fire");
|
|
140
|
+
|
|
141
|
+
expect(iceEfficiency?.rate).toBe(0.5);
|
|
142
|
+
expect(fireEfficiency?.rate).toBe(1.5);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test.skip("should combine player and class efficiency", () => {
|
|
146
|
+
// Set class efficiency
|
|
147
|
+
player.setClass(IceMageClass);
|
|
148
|
+
|
|
149
|
+
// Add player-specific efficiency
|
|
150
|
+
player._elementsEfficiency = [{ rate: 2.0, element: "lightning" }];
|
|
151
|
+
|
|
152
|
+
const lightningEfficiency = player.elementsEfficiency.find(e => e.element === "lightning");
|
|
153
|
+
expect(lightningEfficiency?.rate).toBe(2.0);
|
|
154
|
+
|
|
155
|
+
// Class efficiency should still be there
|
|
156
|
+
const iceEfficiency = player.elementsEfficiency.find(e => e.element === "ice");
|
|
157
|
+
expect(iceEfficiency).toBeDefined();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe("Element Manager - Elements Defense", () => {
|
|
162
|
+
test("should have no elementsDefense without equipment", () => {
|
|
163
|
+
// elementsDefense depends on getFeature implementation
|
|
164
|
+
// This test may need adjustment based on actual behavior
|
|
165
|
+
expect(player.elementsDefense).toBeDefined();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test("should get elementsDefense from equipped armor", () => {
|
|
169
|
+
player.addItem(FireShield, 1);
|
|
170
|
+
player.equip("fire-shield", true);
|
|
171
|
+
|
|
172
|
+
// Check if fire defense is present
|
|
173
|
+
const fireDefense = player.elementsDefense.find(e => e.element === "fire");
|
|
174
|
+
if (fireDefense) {
|
|
175
|
+
expect(fireDefense.rate).toBe(0.5);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
describe("Element Manager - Coefficient Elements", () => {
|
|
181
|
+
let attackerPlayer: RpgPlayer;
|
|
182
|
+
|
|
183
|
+
beforeEach(async () => {
|
|
184
|
+
const clientTesting2 = await fixture.createClient();
|
|
185
|
+
attackerPlayer = await clientTesting2.waitForMapChange("test-map");
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test("should return 1 as default coefficient with no elements", () => {
|
|
189
|
+
const coefficient = player.coefficientElements(attackerPlayer);
|
|
190
|
+
expect(coefficient).toBe(1);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("should calculate coefficient when attacker has elements", () => {
|
|
194
|
+
// Give attacker fire element
|
|
195
|
+
attackerPlayer.addItem(FireSword, 1);
|
|
196
|
+
attackerPlayer.equip("fire-sword", true);
|
|
197
|
+
|
|
198
|
+
// Give defender fire vulnerability
|
|
199
|
+
player.elementsEfficiency = [{ rate: 1.5, element: "fire" }];
|
|
200
|
+
|
|
201
|
+
// Coefficient calculation depends on formula
|
|
202
|
+
const coefficient = player.coefficientElements(attackerPlayer);
|
|
203
|
+
expect(coefficient).toBeGreaterThanOrEqual(1);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
describe("Element Manager - Edge Cases", () => {
|
|
208
|
+
test("should handle empty elements array", () => {
|
|
209
|
+
expect(player.elements).toEqual([]);
|
|
210
|
+
expect(player.elements.length).toBe(0);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test("should handle overwriting elementsEfficiency", () => {
|
|
214
|
+
player.elementsEfficiency = [{ rate: 0.5, element: "fire" }];
|
|
215
|
+
player.elementsEfficiency = [{ rate: 2.0, element: "ice" }];
|
|
216
|
+
|
|
217
|
+
expect(player._elementsEfficiency.length).toBe(1);
|
|
218
|
+
expect(player._elementsEfficiency[0].element).toBe("ice");
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { beforeEach, test, expect, afterEach } from 'vitest'
|
|
2
|
+
import { testing, TestingFixture } from '@rpgjs/testing'
|
|
3
|
+
import { defineModule, createModule } from '@rpgjs/common'
|
|
4
|
+
import { RpgPlayer, RpgServer, Move } from '../src'
|
|
5
|
+
import { RpgClient } from '../../client/src'
|
|
6
|
+
|
|
7
|
+
const Event = () => {
|
|
8
|
+
return {
|
|
9
|
+
name: "EV-1",
|
|
10
|
+
onInit() {
|
|
11
|
+
this.setGraphic("hero");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Define server module with two maps
|
|
17
|
+
const serverModule = defineModule<RpgServer>({
|
|
18
|
+
maps: [
|
|
19
|
+
{
|
|
20
|
+
id: 'map1',
|
|
21
|
+
events: [{ event: Event(), x: 100, y: 150 }]
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
player: {
|
|
25
|
+
async onConnected(player) {
|
|
26
|
+
await player.changeMap('map1', { x: 100, y: 126 })
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Define client module
|
|
32
|
+
const clientModule = defineModule<RpgClient>({
|
|
33
|
+
// Client-side logic
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
let player: RpgPlayer
|
|
37
|
+
let client: any
|
|
38
|
+
let fixture: TestingFixture
|
|
39
|
+
|
|
40
|
+
beforeEach(async () => {
|
|
41
|
+
const myModule = createModule('TestModule', [{
|
|
42
|
+
server: serverModule,
|
|
43
|
+
client: clientModule
|
|
44
|
+
}])
|
|
45
|
+
|
|
46
|
+
fixture = await testing(myModule)
|
|
47
|
+
client = await fixture.createClient()
|
|
48
|
+
player = client.player
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
fixture.clear()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
test.skip('Player to touch event', async () => {
|
|
56
|
+
player = await client.waitForMapChange('map1')
|
|
57
|
+
const map = player.getCurrentMap()
|
|
58
|
+
const event = map?.getEvents()[0]
|
|
59
|
+
expect(event).toBeDefined()
|
|
60
|
+
expect(event?.name()).toBe("EV-1")
|
|
61
|
+
expect(event?.x()).toBe(100)
|
|
62
|
+
expect(event?.y()).toBe(150)
|
|
63
|
+
await fixture.waitUntil(
|
|
64
|
+
player.moveRoutes([
|
|
65
|
+
Move.tileDown(2),
|
|
66
|
+
], {
|
|
67
|
+
onStuck: () => false
|
|
68
|
+
})
|
|
69
|
+
)
|
|
70
|
+
expect(event?.x()).toBe(100)
|
|
71
|
+
expect(event?.y()).toBe(150)
|
|
72
|
+
await fixture.waitUntil(
|
|
73
|
+
event!.moveRoutes([
|
|
74
|
+
Move.down()
|
|
75
|
+
])
|
|
76
|
+
)
|
|
77
|
+
expect(event?.x()).toBe(100)
|
|
78
|
+
expect(event?.y()).toBe(150 + event!.speed())
|
|
79
|
+
|
|
80
|
+
})
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { beforeEach, test, expect, afterEach, describe } from "vitest";
|
|
2
|
+
import { testing, TestingFixture } from "@rpgjs/testing";
|
|
3
|
+
import { defineModule, createModule } from "@rpgjs/common";
|
|
4
|
+
import { RpgPlayer } from "../src";
|
|
5
|
+
|
|
6
|
+
let player: RpgPlayer;
|
|
7
|
+
let fixture: TestingFixture;
|
|
8
|
+
|
|
9
|
+
const serverModule = defineModule({
|
|
10
|
+
maps: [{ id: "test-map", file: "" }],
|
|
11
|
+
player: {
|
|
12
|
+
async onConnected(player) {
|
|
13
|
+
await player.changeMap("test-map", { x: 100, y: 100 });
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const clientModule = defineModule({});
|
|
19
|
+
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
const myModule = createModule("TestModule", [
|
|
22
|
+
{ server: serverModule, client: clientModule },
|
|
23
|
+
]);
|
|
24
|
+
fixture = await testing(myModule);
|
|
25
|
+
const clientTesting = await fixture.createClient();
|
|
26
|
+
player = await clientTesting.waitForMapChange("test-map");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
afterEach(async () => {
|
|
30
|
+
await fixture.clear();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("Gold Manager - Basic Operations", () => {
|
|
34
|
+
test("should have 0 gold by default", () => {
|
|
35
|
+
expect(player.gold).toBe(0);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("should set gold to a positive value", () => {
|
|
39
|
+
player.gold = 100;
|
|
40
|
+
expect(player.gold).toBe(100);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("should add gold", () => {
|
|
44
|
+
player.gold = 50;
|
|
45
|
+
player.gold += 30;
|
|
46
|
+
expect(player.gold).toBe(80);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("should subtract gold", () => {
|
|
50
|
+
player.gold = 100;
|
|
51
|
+
player.gold -= 40;
|
|
52
|
+
expect(player.gold).toBe(60);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("should not allow negative gold (clamp to 0)", () => {
|
|
56
|
+
player.gold = 50;
|
|
57
|
+
player.gold -= 100; // Try to go negative
|
|
58
|
+
expect(player.gold).toBe(0);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("should set to 0 when setting negative value directly", () => {
|
|
62
|
+
player.gold = -50;
|
|
63
|
+
expect(player.gold).toBe(0);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("should handle large gold values", () => {
|
|
67
|
+
player.gold = 999999999;
|
|
68
|
+
expect(player.gold).toBe(999999999);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("should handle gold = 0", () => {
|
|
72
|
+
player.gold = 100;
|
|
73
|
+
player.gold = 0;
|
|
74
|
+
expect(player.gold).toBe(0);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("Gold Manager - Edge Cases", () => {
|
|
79
|
+
test("should handle multiple consecutive operations", () => {
|
|
80
|
+
player.gold = 100;
|
|
81
|
+
player.gold += 50;
|
|
82
|
+
player.gold -= 30;
|
|
83
|
+
player.gold += 20;
|
|
84
|
+
expect(player.gold).toBe(140);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("should handle subtracting exactly to 0", () => {
|
|
88
|
+
player.gold = 100;
|
|
89
|
+
player.gold -= 100;
|
|
90
|
+
expect(player.gold).toBe(0);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("should handle decimal values (floored)", () => {
|
|
94
|
+
player.gold = 10.5;
|
|
95
|
+
// Note: behavior depends on implementation
|
|
96
|
+
expect(player.gold).toBeGreaterThanOrEqual(10);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|