@quake2ts/test-utils 0.0.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/README.md +454 -0
- package/dist/index.cjs +5432 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2150 -0
- package/dist/index.d.ts +2150 -0
- package/dist/index.js +5165 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
- package/src/client/helpers/hud.ts +114 -0
- package/src/client/helpers/prediction.ts +136 -0
- package/src/client/helpers/view.ts +201 -0
- package/src/client/mocks/console.ts +75 -0
- package/src/client/mocks/download.ts +48 -0
- package/src/client/mocks/input.ts +246 -0
- package/src/client/mocks/network.ts +148 -0
- package/src/client/mocks/state.ts +148 -0
- package/src/e2e/network.ts +47 -0
- package/src/e2e/playwright.ts +90 -0
- package/src/e2e/visual.ts +172 -0
- package/src/engine/helpers/pipeline-test-template.ts +113 -0
- package/src/engine/helpers/webgpu-rendering.ts +251 -0
- package/src/engine/mocks/assets.ts +129 -0
- package/src/engine/mocks/audio.ts +152 -0
- package/src/engine/mocks/buffers.ts +88 -0
- package/src/engine/mocks/lighting.ts +64 -0
- package/src/engine/mocks/particles.ts +76 -0
- package/src/engine/mocks/renderer.ts +218 -0
- package/src/engine/mocks/webgl.ts +267 -0
- package/src/engine/mocks/webgpu.ts +262 -0
- package/src/engine/rendering.ts +103 -0
- package/src/game/factories.ts +204 -0
- package/src/game/helpers/physics.ts +171 -0
- package/src/game/helpers/save.ts +232 -0
- package/src/game/helpers.ts +310 -0
- package/src/game/mocks/ai.ts +67 -0
- package/src/game/mocks/combat.ts +61 -0
- package/src/game/mocks/items.ts +166 -0
- package/src/game/mocks.ts +105 -0
- package/src/index.ts +93 -0
- package/src/server/helpers/bandwidth.ts +127 -0
- package/src/server/helpers/multiplayer.ts +158 -0
- package/src/server/helpers/snapshot.ts +241 -0
- package/src/server/mockNetDriver.ts +106 -0
- package/src/server/mockTransport.ts +50 -0
- package/src/server/mocks/commands.ts +93 -0
- package/src/server/mocks/connection.ts +139 -0
- package/src/server/mocks/master.ts +97 -0
- package/src/server/mocks/physics.ts +32 -0
- package/src/server/mocks/state.ts +162 -0
- package/src/server/mocks/transport.ts +161 -0
- package/src/setup/audio.ts +118 -0
- package/src/setup/browser.ts +249 -0
- package/src/setup/canvas.ts +142 -0
- package/src/setup/node.ts +21 -0
- package/src/setup/storage.ts +60 -0
- package/src/setup/timing.ts +142 -0
- package/src/setup/webgl.ts +8 -0
- package/src/setup/webgpu.ts +113 -0
- package/src/shared/bsp.ts +145 -0
- package/src/shared/collision.ts +64 -0
- package/src/shared/factories.ts +88 -0
- package/src/shared/math.ts +65 -0
- package/src/shared/mocks.ts +243 -0
- package/src/shared/pak-loader.ts +45 -0
- package/src/visual/snapshots.ts +292 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,2150 @@
|
|
|
1
|
+
import * as vitest from 'vitest';
|
|
2
|
+
import { Mock, vi } from 'vitest';
|
|
3
|
+
import { Vec3, CollisionPlane, CollisionBrush, CollisionNode, CollisionLeaf, CollisionModel, PlayerState, EntityState, createRandomGenerator, TraceResult as TraceResult$1, NetDriver, NetChan, UserCommand, ProtocolPlayerState } from '@quake2ts/shared';
|
|
4
|
+
export { intersects, ladderTrace, stairTrace } from '@quake2ts/shared';
|
|
5
|
+
import { Vec3 as Vec3$1, Bounds3 } from '@quake2ts/shared/math/vec3';
|
|
6
|
+
import { TraceResult, CollisionPlane as CollisionPlane$1 } from '@quake2ts/shared/bsp/collision';
|
|
7
|
+
import { ConfigStringEntry, Cvar, BspModel, AudioNodeLike, AudioBufferSourceNodeLike, AudioBufferLike, AudioParamLike, GainNodeLike, DynamicsCompressorNodeLike, PannerNodeLike, BiquadFilterNodeLike, AudioDestinationNodeLike, AudioContextLike, Renderer, FrameRenderer, BspSurfacePipeline, Md2Pipeline, Md3Pipeline, SpriteRenderer, SkyboxPipeline, AssetManager, PreparedTexture, Md2Model, Md3Model, BspMap, BufferUsage, VertexBuffer, IndexBuffer, ShaderProgram, DLight, DynamicLightManager, ParticleSystem, Camera, FrameRenderStats, EntityState as EntityState$1, ProtocolPlayerState as ProtocolPlayerState$1, FrameData, DamageIndicator, FogData } from '@quake2ts/engine';
|
|
8
|
+
export { ConfigStringEntry, Cvar, DLight, DynamicLightManager, IndexBuffer, ParticleSystem, ShaderProgram, VertexBuffer } from '@quake2ts/engine';
|
|
9
|
+
import { GameStateSnapshot, Entity, ScriptHookRegistry, SpawnContext, EntitySystem, SpawnRegistry, GameSaveFile, LevelState, MonsterMove, DamageMod, PlayerInventory, BaseItem, WeaponId, WeaponItem, HealthItem, ArmorItem, AmmoItemId, PowerupItem, GameExports, PlayerClient } from '@quake2ts/game';
|
|
10
|
+
import { NetworkTransport, Server, ServerStatic, Client, ClientState as ClientState$1, ClientFrame } from '@quake2ts/server';
|
|
11
|
+
import { ImageData, Canvas } from '@napi-rs/canvas';
|
|
12
|
+
import { vec3 } from 'gl-matrix';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Interface for the BinaryWriter mock.
|
|
16
|
+
*/
|
|
17
|
+
interface BinaryWriterMock {
|
|
18
|
+
writeByte: Mock<[number], void>;
|
|
19
|
+
writeShort: Mock<[number], void>;
|
|
20
|
+
writeLong: Mock<[number], void>;
|
|
21
|
+
writeString: Mock<[string], void>;
|
|
22
|
+
writeBytes: Mock<[Uint8Array], void>;
|
|
23
|
+
getBuffer: Mock<[], Uint8Array>;
|
|
24
|
+
reset: Mock<[], void>;
|
|
25
|
+
writeInt8: Mock<[number], void>;
|
|
26
|
+
writeUint8: Mock<[number], void>;
|
|
27
|
+
writeInt16: Mock<[number], void>;
|
|
28
|
+
writeUint16: Mock<[number], void>;
|
|
29
|
+
writeInt32: Mock<[number], void>;
|
|
30
|
+
writeUint32: Mock<[number], void>;
|
|
31
|
+
writeFloat: Mock<[number], void>;
|
|
32
|
+
getData: Mock<[], Uint8Array>;
|
|
33
|
+
writePos: Mock<[any], void>;
|
|
34
|
+
writeDir: Mock<[any], void>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Creates a mock BinaryWriter for testing binary data writing.
|
|
38
|
+
*
|
|
39
|
+
* @returns A BinaryWriterMock object with all methods mocked using vi.fn().
|
|
40
|
+
*/
|
|
41
|
+
declare const createBinaryWriterMock: () => BinaryWriterMock;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a mock NetChan (Network Channel) for testing network communication.
|
|
44
|
+
* Includes mocks for sequencing, reliable messaging, and fragmentation.
|
|
45
|
+
*
|
|
46
|
+
* @returns A mocked NetChan object.
|
|
47
|
+
*/
|
|
48
|
+
declare const createNetChanMock: () => {
|
|
49
|
+
qport: number;
|
|
50
|
+
incomingSequence: number;
|
|
51
|
+
outgoingSequence: number;
|
|
52
|
+
incomingAcknowledged: number;
|
|
53
|
+
incomingReliableAcknowledged: boolean;
|
|
54
|
+
incomingReliableSequence: number;
|
|
55
|
+
outgoingReliableSequence: number;
|
|
56
|
+
reliableMessage: BinaryWriterMock;
|
|
57
|
+
reliableLength: number;
|
|
58
|
+
fragmentSendOffset: number;
|
|
59
|
+
fragmentBuffer: null;
|
|
60
|
+
fragmentLength: number;
|
|
61
|
+
fragmentReceived: number;
|
|
62
|
+
lastReceived: number;
|
|
63
|
+
lastSent: number;
|
|
64
|
+
remoteAddress: {
|
|
65
|
+
type: string;
|
|
66
|
+
port: number;
|
|
67
|
+
};
|
|
68
|
+
setup: Mock<any, any>;
|
|
69
|
+
reset: Mock<any, any>;
|
|
70
|
+
transmit: Mock<any, any>;
|
|
71
|
+
process: Mock<any, any>;
|
|
72
|
+
canSendReliable: Mock<[], boolean>;
|
|
73
|
+
writeReliableByte: Mock<any, any>;
|
|
74
|
+
writeReliableShort: Mock<any, any>;
|
|
75
|
+
writeReliableLong: Mock<any, any>;
|
|
76
|
+
writeReliableString: Mock<any, any>;
|
|
77
|
+
getReliableData: Mock<[], Uint8Array<ArrayBufferLike>>;
|
|
78
|
+
needsKeepalive: Mock<[], boolean>;
|
|
79
|
+
isTimedOut: Mock<[], boolean>;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Interface for the BinaryStream mock.
|
|
83
|
+
*/
|
|
84
|
+
interface BinaryStreamMock {
|
|
85
|
+
getPosition: Mock<[], number>;
|
|
86
|
+
getReadPosition: Mock<[], number>;
|
|
87
|
+
getLength: Mock<[], number>;
|
|
88
|
+
getRemaining: Mock<[], number>;
|
|
89
|
+
seek: Mock<[number], void>;
|
|
90
|
+
setReadPosition: Mock<[number], void>;
|
|
91
|
+
hasMore: Mock<[], boolean>;
|
|
92
|
+
hasBytes: Mock<[number], boolean>;
|
|
93
|
+
readChar: Mock<[], number>;
|
|
94
|
+
readByte: Mock<[], number>;
|
|
95
|
+
readShort: Mock<[], number>;
|
|
96
|
+
readUShort: Mock<[], number>;
|
|
97
|
+
readLong: Mock<[], number>;
|
|
98
|
+
readULong: Mock<[], number>;
|
|
99
|
+
readFloat: Mock<[], number>;
|
|
100
|
+
readString: Mock<[], string>;
|
|
101
|
+
readStringLine: Mock<[], string>;
|
|
102
|
+
readCoord: Mock<[], number>;
|
|
103
|
+
readAngle: Mock<[], number>;
|
|
104
|
+
readAngle16: Mock<[], number>;
|
|
105
|
+
readData: Mock<[number], Uint8Array>;
|
|
106
|
+
readPos: Mock<[], any>;
|
|
107
|
+
readDir: Mock<[], any>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Creates a mock BinaryStream for testing binary data reading.
|
|
111
|
+
*
|
|
112
|
+
* @returns A BinaryStreamMock object with all methods mocked.
|
|
113
|
+
*/
|
|
114
|
+
declare const createBinaryStreamMock: () => BinaryStreamMock;
|
|
115
|
+
/**
|
|
116
|
+
* Interface for MessageWriter mock, extending BinaryWriterMock with additional message-specific methods.
|
|
117
|
+
*/
|
|
118
|
+
interface MessageWriterMock extends BinaryWriterMock {
|
|
119
|
+
writeInt: Mock<[number], void>;
|
|
120
|
+
writeVector: Mock<[any], void>;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Creates a mock MessageWriter, aliasing writeInt to writeInt32 and writeVector to writePos.
|
|
124
|
+
*
|
|
125
|
+
* @param overrides - Optional overrides for the mock.
|
|
126
|
+
* @returns A MessageWriterMock object.
|
|
127
|
+
*/
|
|
128
|
+
declare const createMessageWriterMock: (overrides?: Partial<MessageWriterMock>) => MessageWriterMock;
|
|
129
|
+
/**
|
|
130
|
+
* Interface for MessageReader mock, extending BinaryStreamMock with additional message-specific methods.
|
|
131
|
+
*/
|
|
132
|
+
interface MessageReaderMock extends BinaryStreamMock {
|
|
133
|
+
readInt: Mock<[], number>;
|
|
134
|
+
readVector: Mock<[], any>;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Creates a mock MessageReader, aliasing readInt to readLong and readVector to readPos.
|
|
138
|
+
*
|
|
139
|
+
* @param data - Optional initial data for the reader.
|
|
140
|
+
* @returns A MessageReaderMock object.
|
|
141
|
+
*/
|
|
142
|
+
declare const createMessageReaderMock: (data?: Uint8Array) => MessageReaderMock;
|
|
143
|
+
/**
|
|
144
|
+
* Interface for a generic network packet mock.
|
|
145
|
+
*/
|
|
146
|
+
interface PacketMock {
|
|
147
|
+
type: 'connection' | 'data' | 'ack' | 'disconnect';
|
|
148
|
+
sequence: number;
|
|
149
|
+
ack: number;
|
|
150
|
+
qport: number;
|
|
151
|
+
data: Uint8Array;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Creates a mock network packet.
|
|
155
|
+
*
|
|
156
|
+
* @param overrides - Optional overrides for packet properties.
|
|
157
|
+
* @returns A PacketMock object.
|
|
158
|
+
*/
|
|
159
|
+
declare const createPacketMock: (overrides?: Partial<PacketMock>) => PacketMock;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Creates a collision plane with the specified normal and distance.
|
|
163
|
+
* Automatically calculates the plane type and signbits.
|
|
164
|
+
*
|
|
165
|
+
* @param normal - The normal vector of the plane.
|
|
166
|
+
* @param dist - The distance from the origin.
|
|
167
|
+
* @returns A CollisionPlane object.
|
|
168
|
+
*/
|
|
169
|
+
declare function makePlane(normal: Vec3, dist: number): CollisionPlane;
|
|
170
|
+
/**
|
|
171
|
+
* Creates a simple axis-aligned cubic brush for testing.
|
|
172
|
+
*
|
|
173
|
+
* @param size - The size of the cube (width, height, depth).
|
|
174
|
+
* @param contents - The content flags for the brush (default: CONTENTS_SOLID).
|
|
175
|
+
* @returns A CollisionBrush object.
|
|
176
|
+
*/
|
|
177
|
+
declare function makeAxisBrush(size: number, contents?: number): CollisionBrush;
|
|
178
|
+
/**
|
|
179
|
+
* Creates a BSP node.
|
|
180
|
+
*
|
|
181
|
+
* @param plane - The splitting plane for this node.
|
|
182
|
+
* @param children - Indices of the children (positive for nodes, negative for leaves).
|
|
183
|
+
* @returns A CollisionNode object.
|
|
184
|
+
*/
|
|
185
|
+
declare function makeNode(plane: CollisionPlane, children: [number, number]): CollisionNode;
|
|
186
|
+
/**
|
|
187
|
+
* Constructs a full CollisionModel from components.
|
|
188
|
+
*
|
|
189
|
+
* @param planes - Array of planes.
|
|
190
|
+
* @param nodes - Array of nodes.
|
|
191
|
+
* @param leaves - Array of leaves.
|
|
192
|
+
* @param brushes - Array of brushes.
|
|
193
|
+
* @param leafBrushes - Array of leaf brush indices.
|
|
194
|
+
* @returns A CollisionModel object.
|
|
195
|
+
*/
|
|
196
|
+
declare function makeBspModel(planes: CollisionPlane[], nodes: CollisionNode[], leaves: CollisionLeaf[], brushes: CollisionBrush[], leafBrushes: number[]): CollisionModel;
|
|
197
|
+
/**
|
|
198
|
+
* Creates a BSP leaf.
|
|
199
|
+
*
|
|
200
|
+
* @param contents - The content flags for this leaf.
|
|
201
|
+
* @param firstLeafBrush - Index into the leafBrushes array.
|
|
202
|
+
* @param numLeafBrushes - Number of brushes in this leaf.
|
|
203
|
+
* @returns A CollisionLeaf object.
|
|
204
|
+
*/
|
|
205
|
+
declare function makeLeaf(contents: number, firstLeafBrush: number, numLeafBrushes: number): CollisionLeaf;
|
|
206
|
+
/**
|
|
207
|
+
* Creates a simplified CollisionModel consisting of a single leaf containing the provided brushes.
|
|
208
|
+
* Useful for testing collision against a set of brushes without full BSP tree traversal.
|
|
209
|
+
*
|
|
210
|
+
* @param brushes - Array of CollisionBrushes to include.
|
|
211
|
+
* @returns A CollisionModel object.
|
|
212
|
+
*/
|
|
213
|
+
declare function makeLeafModel(brushes: CollisionBrush[]): CollisionModel;
|
|
214
|
+
/**
|
|
215
|
+
* Creates a brush defined by min and max bounds.
|
|
216
|
+
*
|
|
217
|
+
* @param mins - Minimum coordinates (x, y, z).
|
|
218
|
+
* @param maxs - Maximum coordinates (x, y, z).
|
|
219
|
+
* @param contents - Content flags (default: CONTENTS_SOLID).
|
|
220
|
+
* @returns A CollisionBrush object.
|
|
221
|
+
*/
|
|
222
|
+
declare function makeBrushFromMinsMaxs(mins: Vec3, maxs: Vec3, contents?: number): CollisionBrush;
|
|
223
|
+
|
|
224
|
+
declare function findPakFile(): string | null;
|
|
225
|
+
declare function loadMapFromPak(mapName: string): ArrayBuffer | null;
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Creates a Vector3 object.
|
|
229
|
+
*
|
|
230
|
+
* @param x - The X coordinate (default: 0).
|
|
231
|
+
* @param y - The Y coordinate (default: 0).
|
|
232
|
+
* @param z - The Z coordinate (default: 0).
|
|
233
|
+
* @returns A Vec3 object.
|
|
234
|
+
*/
|
|
235
|
+
declare const createVector3: (x?: number, y?: number, z?: number) => Vec3$1;
|
|
236
|
+
/**
|
|
237
|
+
* Creates a bounds object (min/max vectors).
|
|
238
|
+
*
|
|
239
|
+
* @param mins - The minimum bounds vector (default: 0,0,0).
|
|
240
|
+
* @param maxs - The maximum bounds vector (default: 1,1,1).
|
|
241
|
+
* @returns A Bounds3 object.
|
|
242
|
+
*/
|
|
243
|
+
declare const createBounds: (mins?: Vec3$1, maxs?: Vec3$1) => Bounds3;
|
|
244
|
+
/**
|
|
245
|
+
* Interface representing a transformation (position, rotation, scale).
|
|
246
|
+
*/
|
|
247
|
+
interface Transform {
|
|
248
|
+
position: Vec3$1;
|
|
249
|
+
rotation: Vec3$1;
|
|
250
|
+
scale: Vec3$1;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Creates a Transform object.
|
|
254
|
+
*
|
|
255
|
+
* @param overrides - Optional overrides for transform properties.
|
|
256
|
+
* @returns A Transform object.
|
|
257
|
+
*/
|
|
258
|
+
declare const createTransform: (overrides?: Partial<Transform>) => Transform;
|
|
259
|
+
/**
|
|
260
|
+
* Generates a random Vector3 within the specified range.
|
|
261
|
+
*
|
|
262
|
+
* @param min - Minimum value for each component (default: -100).
|
|
263
|
+
* @param max - Maximum value for each component (default: 100).
|
|
264
|
+
* @returns A random Vec3 object.
|
|
265
|
+
*/
|
|
266
|
+
declare const randomVector3: (min?: number, max?: number) => Vec3$1;
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Interface for a TraceResult mock, including all standard properties.
|
|
270
|
+
*/
|
|
271
|
+
interface TraceMock extends Partial<TraceResult> {
|
|
272
|
+
fraction: number;
|
|
273
|
+
endpos: Vec3$1;
|
|
274
|
+
plane: CollisionPlane$1;
|
|
275
|
+
surface: {
|
|
276
|
+
flags: number;
|
|
277
|
+
name?: string;
|
|
278
|
+
value?: number;
|
|
279
|
+
};
|
|
280
|
+
contents: number;
|
|
281
|
+
ent: any;
|
|
282
|
+
allsolid: boolean;
|
|
283
|
+
startsolid: boolean;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Creates a mock TraceResult.
|
|
287
|
+
*
|
|
288
|
+
* @param overrides - Optional overrides for trace properties.
|
|
289
|
+
* @returns A TraceMock object.
|
|
290
|
+
*/
|
|
291
|
+
declare const createTraceMock: (overrides?: Partial<TraceMock>) => TraceMock;
|
|
292
|
+
/**
|
|
293
|
+
* Interface for a Surface mock.
|
|
294
|
+
*/
|
|
295
|
+
interface SurfaceMock {
|
|
296
|
+
flags: number;
|
|
297
|
+
name: string;
|
|
298
|
+
value: number;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Creates a mock Surface.
|
|
302
|
+
*
|
|
303
|
+
* @param overrides - Optional overrides for surface properties.
|
|
304
|
+
* @returns A SurfaceMock object.
|
|
305
|
+
*/
|
|
306
|
+
declare const createSurfaceMock: (overrides?: Partial<SurfaceMock>) => SurfaceMock;
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Creates a mock ConfigStringEntry.
|
|
310
|
+
*
|
|
311
|
+
* @param index - The config string index.
|
|
312
|
+
* @param value - The config string value.
|
|
313
|
+
* @returns A ConfigStringEntry object.
|
|
314
|
+
*/
|
|
315
|
+
declare function createConfigStringMock(index: number, value: string): ConfigStringEntry;
|
|
316
|
+
/**
|
|
317
|
+
* Creates an array of ConfigStringEntry objects from a record.
|
|
318
|
+
*
|
|
319
|
+
* @param entries - A record of index-value pairs (optional).
|
|
320
|
+
* @returns An array of ConfigStringEntry objects.
|
|
321
|
+
*/
|
|
322
|
+
declare function createConfigStringArrayMock(entries?: Record<number, string>): ConfigStringEntry[];
|
|
323
|
+
/**
|
|
324
|
+
* Creates a mock Cvar.
|
|
325
|
+
*
|
|
326
|
+
* @param name - The name of the cvar.
|
|
327
|
+
* @param value - The initial value of the cvar.
|
|
328
|
+
* @param flags - Cvar flags (default: CvarFlags.None).
|
|
329
|
+
* @returns A Cvar instance.
|
|
330
|
+
*/
|
|
331
|
+
declare function createCvarMock(name: string, value: string, flags?: number): Cvar;
|
|
332
|
+
/**
|
|
333
|
+
* Creates a mock PlayerState with sensible defaults.
|
|
334
|
+
* Corresponds to player_state_t in q_shared.h.
|
|
335
|
+
*
|
|
336
|
+
* @param overrides - Partial PlayerState to override defaults.
|
|
337
|
+
* @returns A complete PlayerState object.
|
|
338
|
+
*/
|
|
339
|
+
declare function createMockPlayerState(overrides?: Partial<PlayerState>): PlayerState;
|
|
340
|
+
|
|
341
|
+
declare const createPlayerStateFactory: (overrides?: Partial<PlayerState>) => PlayerState;
|
|
342
|
+
declare const createEntityStateFactory: (overrides?: Partial<EntityState>) => EntityState;
|
|
343
|
+
declare const createGameStateSnapshotFactory: (overrides?: Partial<GameStateSnapshot>) => GameStateSnapshot;
|
|
344
|
+
declare function createEntityFactory(overrides?: Partial<Entity>): Partial<Entity>;
|
|
345
|
+
declare function createPlayerEntityFactory(overrides?: Partial<Entity>): Partial<Entity>;
|
|
346
|
+
declare function createMonsterEntityFactory(classname: string, overrides?: Partial<Entity>): Partial<Entity>;
|
|
347
|
+
declare function createItemEntityFactory(classname: string, overrides?: Partial<Entity>): Partial<Entity>;
|
|
348
|
+
declare function createProjectileEntityFactory(classname: string, overrides?: Partial<Entity>): Partial<Entity>;
|
|
349
|
+
declare function createTriggerEntityFactory(classname: string, overrides?: Partial<Entity>): Partial<Entity>;
|
|
350
|
+
|
|
351
|
+
interface MockEngine {
|
|
352
|
+
sound: Mock<[Entity, number, string, number, number, number], void>;
|
|
353
|
+
soundIndex: Mock<[string], number>;
|
|
354
|
+
modelIndex: Mock<[string], number>;
|
|
355
|
+
centerprintf: Mock<[Entity, string], void>;
|
|
356
|
+
}
|
|
357
|
+
interface MockGame {
|
|
358
|
+
random: ReturnType<typeof createRandomGenerator>;
|
|
359
|
+
registerEntitySpawn: Mock<[string, (entity: Entity) => void], void>;
|
|
360
|
+
unregisterEntitySpawn: Mock<[string], void>;
|
|
361
|
+
getCustomEntities: Mock<[], string[]>;
|
|
362
|
+
hooks: ScriptHookRegistry;
|
|
363
|
+
registerHooks: Mock<[any], any>;
|
|
364
|
+
spawnWorld: Mock<[], void>;
|
|
365
|
+
clientBegin: Mock<[any], void>;
|
|
366
|
+
damage: Mock<[number], void>;
|
|
367
|
+
}
|
|
368
|
+
interface TestContext extends SpawnContext {
|
|
369
|
+
entities: EntitySystem;
|
|
370
|
+
game: MockGame;
|
|
371
|
+
engine: MockEngine;
|
|
372
|
+
}
|
|
373
|
+
declare const createMockEngine: () => MockEngine;
|
|
374
|
+
declare const createMockGame: (seed?: number) => {
|
|
375
|
+
game: MockGame;
|
|
376
|
+
spawnRegistry: SpawnRegistry;
|
|
377
|
+
};
|
|
378
|
+
declare function createTestContext(options?: {
|
|
379
|
+
seed?: number;
|
|
380
|
+
initialEntities?: Entity[];
|
|
381
|
+
}): TestContext;
|
|
382
|
+
declare function createSpawnTestContext(mapName?: string): TestContext;
|
|
383
|
+
declare function createCombatTestContext(): TestContext;
|
|
384
|
+
declare function createPhysicsTestContext(bspModel?: BspModel): TestContext;
|
|
385
|
+
declare function createEntity(): Entity;
|
|
386
|
+
/**
|
|
387
|
+
* Creates mock imports and engine for use with createGame() from @quake2ts/game.
|
|
388
|
+
* This is a convenience helper that provides all the commonly mocked functions
|
|
389
|
+
* needed to instantiate a real Game instance in tests.
|
|
390
|
+
*
|
|
391
|
+
* @param overrides Optional overrides for specific mock functions
|
|
392
|
+
* @returns An object containing both imports and engine mocks
|
|
393
|
+
*
|
|
394
|
+
* @example
|
|
395
|
+
* ```typescript
|
|
396
|
+
* import { createGame } from '@quake2ts/game';
|
|
397
|
+
* import { createGameImportsAndEngine } from '@quake2ts/test-utils';
|
|
398
|
+
*
|
|
399
|
+
* const { imports, engine } = createGameImportsAndEngine();
|
|
400
|
+
* const game = createGame(imports, engine, { gravity: { x: 0, y: 0, z: -800 } });
|
|
401
|
+
* ```
|
|
402
|
+
*/
|
|
403
|
+
declare function createGameImportsAndEngine(overrides?: {
|
|
404
|
+
imports?: Partial<{
|
|
405
|
+
trace: Mock;
|
|
406
|
+
pointcontents: Mock;
|
|
407
|
+
linkentity: Mock;
|
|
408
|
+
multicast: Mock;
|
|
409
|
+
unicast: Mock;
|
|
410
|
+
}>;
|
|
411
|
+
engine?: Partial<{
|
|
412
|
+
trace: Mock;
|
|
413
|
+
sound: Mock;
|
|
414
|
+
centerprintf: Mock;
|
|
415
|
+
modelIndex: Mock;
|
|
416
|
+
soundIndex: Mock;
|
|
417
|
+
}>;
|
|
418
|
+
}): {
|
|
419
|
+
imports: {
|
|
420
|
+
trace: Mock;
|
|
421
|
+
pointcontents: Mock;
|
|
422
|
+
linkentity: Mock;
|
|
423
|
+
multicast: Mock;
|
|
424
|
+
unicast: Mock;
|
|
425
|
+
};
|
|
426
|
+
engine: {
|
|
427
|
+
trace: Mock;
|
|
428
|
+
sound: Mock;
|
|
429
|
+
centerprintf: Mock;
|
|
430
|
+
modelIndex: Mock;
|
|
431
|
+
soundIndex: Mock;
|
|
432
|
+
};
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Creates a physics test scenario with pre-configured geometry.
|
|
437
|
+
* NOTE: Since real BSP loading is complex, this often uses block entities
|
|
438
|
+
* or mocked trace functions unless a real BSP is loaded in the context.
|
|
439
|
+
*/
|
|
440
|
+
interface PhysicsScenario {
|
|
441
|
+
ground: Entity;
|
|
442
|
+
walls: Entity[];
|
|
443
|
+
setup: (context: TestContext) => void;
|
|
444
|
+
}
|
|
445
|
+
declare function createPhysicsTestScenario(scenarioType: 'stairs' | 'ladder' | 'platform' | 'slope' | 'room', context: TestContext): PhysicsScenario;
|
|
446
|
+
/**
|
|
447
|
+
* Simulates a single physics step for an entity.
|
|
448
|
+
* Uses the game's runPmove logic or manually invokes similar steps.
|
|
449
|
+
* This is useful for testing specific movement mechanics in isolation.
|
|
450
|
+
*/
|
|
451
|
+
declare function simulateMovement(entity: Entity, destination: Vec3, context: TestContext): TraceResult$1;
|
|
452
|
+
/**
|
|
453
|
+
* Simulates gravity application on an entity.
|
|
454
|
+
*/
|
|
455
|
+
declare function simulateGravity(entity: Entity, deltaTime: number, context: TestContext): void;
|
|
456
|
+
/**
|
|
457
|
+
* Simulates a jump action.
|
|
458
|
+
*/
|
|
459
|
+
declare function simulateJump(entity: Entity, context: TestContext): void;
|
|
460
|
+
|
|
461
|
+
interface LevelFrameState {
|
|
462
|
+
readonly frameNumber: number;
|
|
463
|
+
readonly timeSeconds: number;
|
|
464
|
+
readonly previousTimeSeconds: number;
|
|
465
|
+
readonly deltaSeconds: number;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Interface for a mock save game object.
|
|
469
|
+
*/
|
|
470
|
+
interface MockSaveGame {
|
|
471
|
+
game: GameSaveFile;
|
|
472
|
+
entities: any[];
|
|
473
|
+
client: any;
|
|
474
|
+
level: LevelState;
|
|
475
|
+
timestamp: number;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Creates a mock SaveGame object.
|
|
479
|
+
*
|
|
480
|
+
* @param overrides - Optional overrides for save game properties.
|
|
481
|
+
* @returns A MockSaveGame object.
|
|
482
|
+
*/
|
|
483
|
+
declare function createMockSaveGame(overrides?: Partial<MockSaveGame>): MockSaveGame;
|
|
484
|
+
/**
|
|
485
|
+
* Captures the current test context state as a save game snapshot.
|
|
486
|
+
* Note: This is a simplified snapshot for testing, not a full serialization.
|
|
487
|
+
*
|
|
488
|
+
* @param context - The test context to snapshot.
|
|
489
|
+
* @returns A MockSaveGame representing the current state.
|
|
490
|
+
*/
|
|
491
|
+
declare function createSaveGameSnapshot(context: TestContext): MockSaveGame;
|
|
492
|
+
/**
|
|
493
|
+
* Restores a test context from a save game snapshot.
|
|
494
|
+
*
|
|
495
|
+
* @param saveGame - The save game to restore.
|
|
496
|
+
* @param context - The test context to update.
|
|
497
|
+
*/
|
|
498
|
+
declare function restoreSaveGameSnapshot(saveGame: MockSaveGame, context: TestContext): void;
|
|
499
|
+
/**
|
|
500
|
+
* Result of comparing two save games.
|
|
501
|
+
*/
|
|
502
|
+
interface SaveGameDiff {
|
|
503
|
+
entityCountDiff: number;
|
|
504
|
+
differentEntities: {
|
|
505
|
+
index: number;
|
|
506
|
+
field: string;
|
|
507
|
+
expected: any;
|
|
508
|
+
actual: any;
|
|
509
|
+
}[];
|
|
510
|
+
gameStateDiffs: string[];
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Compares two save games and returns the differences.
|
|
514
|
+
* Useful for testing save/load determinism.
|
|
515
|
+
*
|
|
516
|
+
* @param a - First save game.
|
|
517
|
+
* @param b - Second save game.
|
|
518
|
+
* @returns A SaveGameDiff object.
|
|
519
|
+
*/
|
|
520
|
+
declare function compareSaveGames(a: MockSaveGame, b: MockSaveGame): SaveGameDiff;
|
|
521
|
+
|
|
522
|
+
interface MockAI {
|
|
523
|
+
checkAttack: Mock;
|
|
524
|
+
findTarget: Mock;
|
|
525
|
+
visible: Mock;
|
|
526
|
+
infront: Mock;
|
|
527
|
+
}
|
|
528
|
+
interface MockMonsterAI {
|
|
529
|
+
stand: Mock;
|
|
530
|
+
walk: Mock;
|
|
531
|
+
run: Mock;
|
|
532
|
+
dodge: Mock;
|
|
533
|
+
attack: Mock;
|
|
534
|
+
melee: Mock;
|
|
535
|
+
sight: Mock;
|
|
536
|
+
idle: Mock;
|
|
537
|
+
}
|
|
538
|
+
declare function createMockAI(overrides?: Partial<MockAI>): MockAI;
|
|
539
|
+
declare function createMockMonsterAI(overrides?: Partial<MockMonsterAI>): MockMonsterAI;
|
|
540
|
+
declare function createMockMonsterMove(first: number, last: number, think: (self: Entity, context: EntitySystem) => void, action: (self: Entity, dist: number, context: EntitySystem) => void): MonsterMove;
|
|
541
|
+
|
|
542
|
+
interface MockDamageInfo {
|
|
543
|
+
damage: number;
|
|
544
|
+
mod: DamageMod;
|
|
545
|
+
knockback: number;
|
|
546
|
+
attacker: Entity | null;
|
|
547
|
+
inflictor: Entity | null;
|
|
548
|
+
dir: {
|
|
549
|
+
x: number;
|
|
550
|
+
y: number;
|
|
551
|
+
z: number;
|
|
552
|
+
} | null;
|
|
553
|
+
point: {
|
|
554
|
+
x: number;
|
|
555
|
+
y: number;
|
|
556
|
+
z: number;
|
|
557
|
+
} | null;
|
|
558
|
+
}
|
|
559
|
+
declare function createMockDamageInfo(overrides?: Partial<MockDamageInfo>): MockDamageInfo;
|
|
560
|
+
declare function createMockWeapon(name?: string): {
|
|
561
|
+
name: string;
|
|
562
|
+
ammoType: string;
|
|
563
|
+
ammoUse: number;
|
|
564
|
+
selection: Mock<any, any>;
|
|
565
|
+
think: Mock<any, any>;
|
|
566
|
+
command: Mock<any, any>;
|
|
567
|
+
};
|
|
568
|
+
declare const mockMonsterAttacks: {
|
|
569
|
+
fireBlaster: Mock<any, any>;
|
|
570
|
+
fireRocket: Mock<any, any>;
|
|
571
|
+
fireGrenade: Mock<any, any>;
|
|
572
|
+
fireHeat: Mock<any, any>;
|
|
573
|
+
fireBullet: Mock<any, any>;
|
|
574
|
+
fireShotgun: Mock<any, any>;
|
|
575
|
+
fireRailgun: Mock<any, any>;
|
|
576
|
+
fireBFG: Mock<any, any>;
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Creates a mock player inventory with default values suitable for testing.
|
|
581
|
+
* Can be customized with overrides.
|
|
582
|
+
*/
|
|
583
|
+
declare function createMockInventory(overrides?: Partial<PlayerInventory>): PlayerInventory;
|
|
584
|
+
/**
|
|
585
|
+
* Generic factory for any item type.
|
|
586
|
+
* Attempts to find a predefined item by ID first, then applies overrides.
|
|
587
|
+
*/
|
|
588
|
+
declare function createMockItem(id: string, overrides?: Partial<BaseItem>): BaseItem;
|
|
589
|
+
/**
|
|
590
|
+
* Creates a mock WeaponItem
|
|
591
|
+
*/
|
|
592
|
+
declare function createMockWeaponItem(weaponId: WeaponId, overrides?: Partial<WeaponItem>): WeaponItem;
|
|
593
|
+
/**
|
|
594
|
+
* Creates a mock HealthItem
|
|
595
|
+
*/
|
|
596
|
+
declare function createMockHealthItem(amount: number, overrides?: Partial<HealthItem>): HealthItem;
|
|
597
|
+
/**
|
|
598
|
+
* Creates a mock ArmorItem
|
|
599
|
+
*/
|
|
600
|
+
declare function createMockArmorItem(amount: number, overrides?: Partial<ArmorItem>): ArmorItem;
|
|
601
|
+
/**
|
|
602
|
+
* Creates a mock AmmoItem
|
|
603
|
+
*/
|
|
604
|
+
declare function createMockAmmoItem(ammoItemId: AmmoItemId, overrides?: Partial<BaseItem>): BaseItem;
|
|
605
|
+
/**
|
|
606
|
+
* Creates a mock PowerupItem
|
|
607
|
+
*/
|
|
608
|
+
declare function createMockPowerupItem(id: string, duration: number, overrides?: Partial<PowerupItem>): PowerupItem;
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* Interface for mock GameState.
|
|
612
|
+
*/
|
|
613
|
+
interface GameState {
|
|
614
|
+
levelName: string;
|
|
615
|
+
time: number;
|
|
616
|
+
entities: Entity[];
|
|
617
|
+
clients: any[];
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Creates a mock game state object.
|
|
621
|
+
* @param overrides Optional overrides for the game state.
|
|
622
|
+
*/
|
|
623
|
+
declare function createMockGameState(overrides?: Partial<GameState>): GameState;
|
|
624
|
+
/**
|
|
625
|
+
* Creates a mock GameExports object.
|
|
626
|
+
*/
|
|
627
|
+
declare function createMockGameExports(overrides?: Partial<GameExports>): GameExports;
|
|
628
|
+
|
|
629
|
+
/**
|
|
630
|
+
* Mock implementation of the NetworkTransport interface for server testing.
|
|
631
|
+
* Allows simulating connections and errors.
|
|
632
|
+
*/
|
|
633
|
+
declare class MockTransport implements NetworkTransport {
|
|
634
|
+
onConnectionCallback?: (driver: NetDriver, info?: any) => void;
|
|
635
|
+
onErrorCallback?: (error: Error) => void;
|
|
636
|
+
address: string;
|
|
637
|
+
port: number;
|
|
638
|
+
sentMessages: Uint8Array[];
|
|
639
|
+
receivedMessages: Uint8Array[];
|
|
640
|
+
listening: boolean;
|
|
641
|
+
listenSpy: vitest.Mock<any, any>;
|
|
642
|
+
closeSpy: vitest.Mock<any, any>;
|
|
643
|
+
/**
|
|
644
|
+
* Start listening on the specified port.
|
|
645
|
+
*/
|
|
646
|
+
listen(port: number): Promise<void>;
|
|
647
|
+
/**
|
|
648
|
+
* Close the transport.
|
|
649
|
+
*/
|
|
650
|
+
close(): void;
|
|
651
|
+
/**
|
|
652
|
+
* Register a callback for new connections.
|
|
653
|
+
*/
|
|
654
|
+
onConnection(callback: (driver: NetDriver, info?: any) => void): void;
|
|
655
|
+
/**
|
|
656
|
+
* Register a callback for errors.
|
|
657
|
+
*/
|
|
658
|
+
onError(callback: (error: Error) => void): void;
|
|
659
|
+
/**
|
|
660
|
+
* Check if the transport is currently listening.
|
|
661
|
+
*/
|
|
662
|
+
isListening(): boolean;
|
|
663
|
+
/**
|
|
664
|
+
* Helper to simulate a new connection.
|
|
665
|
+
* @param driver The network driver for the connection.
|
|
666
|
+
* @param info Optional connection info.
|
|
667
|
+
*/
|
|
668
|
+
simulateConnection(driver: NetDriver, info?: any): void;
|
|
669
|
+
/**
|
|
670
|
+
* Helper to simulate an error.
|
|
671
|
+
* @param error The error to simulate.
|
|
672
|
+
*/
|
|
673
|
+
simulateError(error: Error): void;
|
|
674
|
+
}
|
|
675
|
+
/**
|
|
676
|
+
* Interface for mock UDP socket.
|
|
677
|
+
* This is a partial mock of Node.js dgram.Socket or similar.
|
|
678
|
+
*/
|
|
679
|
+
interface MockUDPSocket {
|
|
680
|
+
send: (msg: Uint8Array, offset: number, length: number, port: number, address: string, callback?: (error: Error | null, bytes: number) => void) => void;
|
|
681
|
+
on: (event: string, callback: (...args: any[]) => void) => void;
|
|
682
|
+
close: () => void;
|
|
683
|
+
bind: (port: number, address?: string) => void;
|
|
684
|
+
address: () => {
|
|
685
|
+
address: string;
|
|
686
|
+
family: string;
|
|
687
|
+
port: number;
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Creates a mock UDP socket.
|
|
692
|
+
* @param overrides Optional overrides for the socket methods.
|
|
693
|
+
*/
|
|
694
|
+
declare function createMockUDPSocket(overrides?: Partial<MockUDPSocket>): MockUDPSocket;
|
|
695
|
+
/**
|
|
696
|
+
* Interface for network address.
|
|
697
|
+
*/
|
|
698
|
+
interface NetworkAddress {
|
|
699
|
+
ip: string;
|
|
700
|
+
port: number;
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
703
|
+
* Creates a mock network address.
|
|
704
|
+
* @param ip IP address (default: '127.0.0.1')
|
|
705
|
+
* @param port Port number (default: 27910)
|
|
706
|
+
*/
|
|
707
|
+
declare function createMockNetworkAddress(ip?: string, port?: number): NetworkAddress;
|
|
708
|
+
/**
|
|
709
|
+
* Creates a configured MockTransport instance.
|
|
710
|
+
* @param address Address to bind to (default: '127.0.0.1')
|
|
711
|
+
* @param port Port to listen on (default: 27910)
|
|
712
|
+
* @param overrides Optional overrides for the transport properties.
|
|
713
|
+
*/
|
|
714
|
+
declare function createMockTransport(address?: string, port?: number, overrides?: Partial<MockTransport>): MockTransport;
|
|
715
|
+
/**
|
|
716
|
+
* Creates a mock NetDriver instance.
|
|
717
|
+
* @param overrides Optional overrides for the NetDriver methods.
|
|
718
|
+
*/
|
|
719
|
+
declare function createMockNetDriver(overrides?: Partial<NetDriver>): NetDriver;
|
|
720
|
+
|
|
721
|
+
interface RecordedPacket {
|
|
722
|
+
type: 'sent' | 'received';
|
|
723
|
+
timestamp: number;
|
|
724
|
+
data: Uint8Array;
|
|
725
|
+
}
|
|
726
|
+
declare class MockNetworkTransport {
|
|
727
|
+
netchan: NetChan;
|
|
728
|
+
recordedPackets: RecordedPacket[];
|
|
729
|
+
sentPackets: Uint8Array[];
|
|
730
|
+
constructor();
|
|
731
|
+
reset(): void;
|
|
732
|
+
receive(data: Uint8Array): Uint8Array<ArrayBufferLike> | null;
|
|
733
|
+
transmit(unreliableData?: Uint8Array): Uint8Array<ArrayBufferLike>;
|
|
734
|
+
get lastSentPacket(): Uint8Array<ArrayBufferLike> | undefined;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
interface MockNetDriverState {
|
|
738
|
+
connected: boolean;
|
|
739
|
+
messagesSent: Uint8Array[];
|
|
740
|
+
messageHandlers: ((data: Uint8Array) => void)[];
|
|
741
|
+
closeHandlers: (() => void)[];
|
|
742
|
+
errorHandlers: ((err: Error) => void)[];
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* A mock implementation of NetDriver that provides testing hooks.
|
|
746
|
+
* Unlike the simple createMockNetDriver factory, this class maintains state
|
|
747
|
+
* and allows for stimulating events (receiving messages, triggering errors).
|
|
748
|
+
*/
|
|
749
|
+
declare class MockNetDriver implements NetDriver {
|
|
750
|
+
state: MockNetDriverState;
|
|
751
|
+
connectSpy: vitest.Mock<any, any>;
|
|
752
|
+
disconnectSpy: vitest.Mock<any, any>;
|
|
753
|
+
sendSpy: vitest.Mock<any, any>;
|
|
754
|
+
connect(url: string): Promise<void>;
|
|
755
|
+
disconnect(): void;
|
|
756
|
+
send(data: Uint8Array): void;
|
|
757
|
+
onMessage(cb: (data: Uint8Array) => void): void;
|
|
758
|
+
onClose(cb: () => void): void;
|
|
759
|
+
onError(cb: (err: Error) => void): void;
|
|
760
|
+
isConnected(): boolean;
|
|
761
|
+
/**
|
|
762
|
+
* Simulate receiving a message from the network.
|
|
763
|
+
*/
|
|
764
|
+
receiveMessage(data: Uint8Array): void;
|
|
765
|
+
/**
|
|
766
|
+
* Simulate a connection close event from the remote side.
|
|
767
|
+
*/
|
|
768
|
+
simulateClose(): void;
|
|
769
|
+
/**
|
|
770
|
+
* Simulate a connection error.
|
|
771
|
+
*/
|
|
772
|
+
simulateError(err: Error): void;
|
|
773
|
+
/**
|
|
774
|
+
* Get the last sent message.
|
|
775
|
+
*/
|
|
776
|
+
getLastSentMessage(): Uint8Array | undefined;
|
|
777
|
+
/**
|
|
778
|
+
* Clear recorded sent messages.
|
|
779
|
+
*/
|
|
780
|
+
clearSentMessages(): void;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Creates a mock server state object.
|
|
785
|
+
* @param overrides Optional overrides for the server state.
|
|
786
|
+
*/
|
|
787
|
+
declare function createMockServerState(overrides?: Partial<Server>): Server;
|
|
788
|
+
/**
|
|
789
|
+
* Creates a mock server static object.
|
|
790
|
+
* @param maxClients Maximum number of clients.
|
|
791
|
+
* @param overrides Optional overrides for the server static state.
|
|
792
|
+
*/
|
|
793
|
+
declare function createMockServerStatic(maxClients?: number, overrides?: Partial<ServerStatic>): ServerStatic;
|
|
794
|
+
/**
|
|
795
|
+
* Creates a mock server client.
|
|
796
|
+
* @param clientNum The client index.
|
|
797
|
+
* @param overrides Optional overrides for the client.
|
|
798
|
+
*/
|
|
799
|
+
declare function createMockServerClient(clientNum: number, overrides?: Partial<Client>): Client;
|
|
800
|
+
/**
|
|
801
|
+
* Mock interface for the Server class (DedicatedServer).
|
|
802
|
+
* This allows mocking the server instance itself.
|
|
803
|
+
*/
|
|
804
|
+
interface MockServer {
|
|
805
|
+
start(mapName: string): Promise<void>;
|
|
806
|
+
stop(): void;
|
|
807
|
+
multicast(origin: any, type: any, event: any, ...args: any[]): void;
|
|
808
|
+
unicast(ent: Entity, reliable: boolean, event: any, ...args: any[]): void;
|
|
809
|
+
configstring(index: number, value: string): void;
|
|
810
|
+
kickPlayer(clientId: number): void;
|
|
811
|
+
changeMap(mapName: string): Promise<void>;
|
|
812
|
+
getClient(clientNum: number): Client | null;
|
|
813
|
+
broadcast(message: string): void;
|
|
814
|
+
tick(): void;
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* Creates a mock server instance.
|
|
818
|
+
* @param overrides Optional overrides for server methods.
|
|
819
|
+
*/
|
|
820
|
+
declare function createMockServer(overrides?: Partial<MockServer>): MockServer;
|
|
821
|
+
|
|
822
|
+
/**
|
|
823
|
+
* Interface representing connection state for testing.
|
|
824
|
+
*/
|
|
825
|
+
interface Connection {
|
|
826
|
+
state: ClientState$1;
|
|
827
|
+
address: string;
|
|
828
|
+
challenge: number;
|
|
829
|
+
userInfo: UserInfo;
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* Stages of the client connection handshake.
|
|
833
|
+
*/
|
|
834
|
+
declare enum HandshakeStage {
|
|
835
|
+
None = 0,
|
|
836
|
+
Challenge = 1,
|
|
837
|
+
Connect = 2,
|
|
838
|
+
Info = 3,
|
|
839
|
+
Active = 4
|
|
840
|
+
}
|
|
841
|
+
/**
|
|
842
|
+
* Interface representing a handshake state.
|
|
843
|
+
*/
|
|
844
|
+
interface Handshake {
|
|
845
|
+
stage: HandshakeStage;
|
|
846
|
+
clientNum: number;
|
|
847
|
+
challenge: number;
|
|
848
|
+
qport: number;
|
|
849
|
+
}
|
|
850
|
+
/**
|
|
851
|
+
* Interface for UserInfo structure.
|
|
852
|
+
*/
|
|
853
|
+
interface UserInfo {
|
|
854
|
+
name: string;
|
|
855
|
+
skin: string;
|
|
856
|
+
model: string;
|
|
857
|
+
fov: number;
|
|
858
|
+
hand: number;
|
|
859
|
+
rate: number;
|
|
860
|
+
msg: number;
|
|
861
|
+
spectator?: number;
|
|
862
|
+
[key: string]: string | number | undefined;
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* Helper to serialize UserInfo to Quake 2 info string format.
|
|
866
|
+
* Format: \key\value\key2\value2
|
|
867
|
+
*/
|
|
868
|
+
declare function serializeUserInfo(info: UserInfo): string;
|
|
869
|
+
/**
|
|
870
|
+
* Creates a mock UserInfo object.
|
|
871
|
+
* @param overrides Optional overrides for the user info.
|
|
872
|
+
*/
|
|
873
|
+
declare function createMockUserInfo(overrides?: Partial<UserInfo>): UserInfo;
|
|
874
|
+
/**
|
|
875
|
+
* Creates a mock connection object (Client) with specific state.
|
|
876
|
+
* @param state The client state (default: Connected).
|
|
877
|
+
* @param overrides Optional overrides for the client.
|
|
878
|
+
*/
|
|
879
|
+
declare function createMockConnection(state?: ClientState$1, overrides?: Partial<Client>): Client;
|
|
880
|
+
/**
|
|
881
|
+
* Creates a mock handshake object.
|
|
882
|
+
* @param stage The stage of the handshake (default: None).
|
|
883
|
+
*/
|
|
884
|
+
declare function createMockHandshake(stage?: HandshakeStage): Handshake;
|
|
885
|
+
/**
|
|
886
|
+
* Simulates a handshake between a mock client and server.
|
|
887
|
+
* Note: This is a high-level simulation helper.
|
|
888
|
+
* @param client The mock client connection.
|
|
889
|
+
* @param server The mock server instance.
|
|
890
|
+
* @returns Promise that resolves to true if handshake succeeded.
|
|
891
|
+
*/
|
|
892
|
+
declare function simulateHandshake(client: Client, server: any): Promise<boolean>;
|
|
893
|
+
|
|
894
|
+
/**
|
|
895
|
+
* Interface for a mocked server console that can execute commands.
|
|
896
|
+
* Reference: quake2/server/sv_main.c (SV_ExecuteUserCommand)
|
|
897
|
+
*/
|
|
898
|
+
interface MockServerConsole {
|
|
899
|
+
exec(cmd: string): string;
|
|
900
|
+
print(text: string): void;
|
|
901
|
+
broadcast(text: string): void;
|
|
902
|
+
commandBuffer: string[];
|
|
903
|
+
outputBuffer: string[];
|
|
904
|
+
}
|
|
905
|
+
/**
|
|
906
|
+
* Creates a mock server console.
|
|
907
|
+
* @param overrides Optional overrides for the mock console.
|
|
908
|
+
*/
|
|
909
|
+
declare function createMockServerConsole(overrides?: Partial<MockServerConsole>): MockServerConsole;
|
|
910
|
+
/**
|
|
911
|
+
* Interface for a mocked RCON client.
|
|
912
|
+
* Reference: quake2/server/sv_user.c (SV_ExecuteUserCommand for RCON handling)
|
|
913
|
+
*/
|
|
914
|
+
interface MockRConClient {
|
|
915
|
+
connect(address: string, port: number, password?: string): Promise<boolean>;
|
|
916
|
+
sendCommand(cmd: string): Promise<string>;
|
|
917
|
+
disconnect(): void;
|
|
918
|
+
connected: boolean;
|
|
919
|
+
lastCommand: string;
|
|
920
|
+
lastResponse: string;
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Creates a mock RCON client.
|
|
924
|
+
* @param password Optional password for the client to use.
|
|
925
|
+
*/
|
|
926
|
+
declare function createMockRConClient(password?: string): MockRConClient;
|
|
927
|
+
/**
|
|
928
|
+
* Simulates a command execution on the server.
|
|
929
|
+
* @param server The mock server instance (assumed to have some command handling capability).
|
|
930
|
+
* @param command The command string to execute.
|
|
931
|
+
* @returns The output of the command.
|
|
932
|
+
*/
|
|
933
|
+
declare function simulateServerCommand(server: any, command: string): string;
|
|
934
|
+
|
|
935
|
+
interface MasterServer {
|
|
936
|
+
registerServer(info: ServerInfo): Promise<boolean>;
|
|
937
|
+
heartbeat(serverAddress: string): Promise<boolean>;
|
|
938
|
+
getServerList(filter?: ServerListFilter): Promise<ServerInfo[]>;
|
|
939
|
+
}
|
|
940
|
+
interface ServerInfo {
|
|
941
|
+
address: string;
|
|
942
|
+
name: string;
|
|
943
|
+
map: string;
|
|
944
|
+
players: number;
|
|
945
|
+
maxPlayers: number;
|
|
946
|
+
gametype: string;
|
|
947
|
+
version: string;
|
|
948
|
+
password?: boolean;
|
|
949
|
+
}
|
|
950
|
+
interface ServerListFilter {
|
|
951
|
+
gametype?: string;
|
|
952
|
+
map?: string;
|
|
953
|
+
notEmpty?: boolean;
|
|
954
|
+
notFull?: boolean;
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* Creates a mock master server for testing server registration and browsing
|
|
958
|
+
* @param overrides - Optional overrides for the master server behavior
|
|
959
|
+
*/
|
|
960
|
+
declare function createMockMasterServer(overrides?: Partial<MasterServer>): MasterServer;
|
|
961
|
+
/**
|
|
962
|
+
* Creates a mock server info object
|
|
963
|
+
* @param overrides - Optional overrides
|
|
964
|
+
*/
|
|
965
|
+
declare function createMockServerInfo(overrides?: Partial<ServerInfo>): ServerInfo;
|
|
966
|
+
/**
|
|
967
|
+
* Simulates the process of a game server registering with the master server
|
|
968
|
+
* @param server - The mock game server instance (typed as any to accept mock)
|
|
969
|
+
* @param master - The mock master server
|
|
970
|
+
*/
|
|
971
|
+
declare function simulateServerRegistration(server: any, master: MasterServer): Promise<boolean>;
|
|
972
|
+
|
|
973
|
+
/**
|
|
974
|
+
* Mock interface for CollisionEntityIndex.
|
|
975
|
+
*/
|
|
976
|
+
interface MockCollisionEntityIndex {
|
|
977
|
+
trace: (start: any, mins: any, maxs: any, end: any, passEntity: any, contentMask: number) => TraceResult$1;
|
|
978
|
+
link: (entity: any) => void;
|
|
979
|
+
unlink: (entity: any) => void;
|
|
980
|
+
gatherTriggerTouches: (entity: any) => any[];
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* Creates a mock CollisionEntityIndex.
|
|
984
|
+
* @param overrides Optional overrides for the mock methods.
|
|
985
|
+
*/
|
|
986
|
+
declare function createMockCollisionEntityIndex(overrides?: Partial<MockCollisionEntityIndex>): MockCollisionEntityIndex;
|
|
987
|
+
|
|
988
|
+
type MockServerContext = Server & {
|
|
989
|
+
clients: (Client | null)[];
|
|
990
|
+
entities?: Entity[];
|
|
991
|
+
};
|
|
992
|
+
interface MultiplayerScenario {
|
|
993
|
+
server: MockServerContext;
|
|
994
|
+
clients: Client[];
|
|
995
|
+
entities: Entity[];
|
|
996
|
+
}
|
|
997
|
+
/**
|
|
998
|
+
* Creates a multiplayer test scenario with a mock server and a number of clients.
|
|
999
|
+
* @param numPlayers Number of players to simulate.
|
|
1000
|
+
*/
|
|
1001
|
+
declare function createMultiplayerTestScenario(numPlayers?: number): MultiplayerScenario;
|
|
1002
|
+
/**
|
|
1003
|
+
* Simulates a player joining the server.
|
|
1004
|
+
* @param server The mock server instance.
|
|
1005
|
+
* @param userInfo Optional user info overrides.
|
|
1006
|
+
*/
|
|
1007
|
+
declare function simulatePlayerJoin(server: MockServerContext, userInfo?: Partial<UserInfo>): Promise<Client>;
|
|
1008
|
+
/**
|
|
1009
|
+
* Simulates a player leaving the server.
|
|
1010
|
+
* @param server The mock server instance.
|
|
1011
|
+
* @param clientNum The client number to disconnect.
|
|
1012
|
+
*/
|
|
1013
|
+
declare function simulatePlayerLeave(server: MockServerContext, clientNum: number): void;
|
|
1014
|
+
/**
|
|
1015
|
+
* Simulates a single server frame update.
|
|
1016
|
+
* @param server The mock server instance.
|
|
1017
|
+
* @param deltaTime Time step in seconds (default: 0.1).
|
|
1018
|
+
*/
|
|
1019
|
+
declare function simulateServerTick(server: MockServerContext, deltaTime?: number): void;
|
|
1020
|
+
/**
|
|
1021
|
+
* Simulates player input for a specific client.
|
|
1022
|
+
* @param client The server client.
|
|
1023
|
+
* @param input The input command.
|
|
1024
|
+
*/
|
|
1025
|
+
declare function simulatePlayerInput(client: Client, input: Partial<UserCommand>): void;
|
|
1026
|
+
|
|
1027
|
+
interface Snapshot {
|
|
1028
|
+
serverTime: number;
|
|
1029
|
+
playerState: any;
|
|
1030
|
+
entities: EntityState[];
|
|
1031
|
+
}
|
|
1032
|
+
interface DeltaSnapshot {
|
|
1033
|
+
snapshot: Snapshot;
|
|
1034
|
+
deltaEntities: EntityState[];
|
|
1035
|
+
removedEntities: number[];
|
|
1036
|
+
}
|
|
1037
|
+
interface ConsistencyReport {
|
|
1038
|
+
valid: boolean;
|
|
1039
|
+
errors: string[];
|
|
1040
|
+
}
|
|
1041
|
+
/**
|
|
1042
|
+
* Creates a client-specific snapshot from the server state.
|
|
1043
|
+
* @param serverState The current server state.
|
|
1044
|
+
* @param clientNum The client number to generate snapshot for.
|
|
1045
|
+
*/
|
|
1046
|
+
declare function createServerSnapshot(serverState: Server, clientNum: number): Snapshot;
|
|
1047
|
+
/**
|
|
1048
|
+
* Calculates the delta between two snapshots.
|
|
1049
|
+
* @param oldSnapshot The baseline snapshot.
|
|
1050
|
+
* @param newSnapshot The current snapshot.
|
|
1051
|
+
*/
|
|
1052
|
+
declare function createDeltaSnapshot(oldSnapshot: Snapshot, newSnapshot: Snapshot): DeltaSnapshot;
|
|
1053
|
+
/**
|
|
1054
|
+
* Verifies the consistency of a sequence of snapshots.
|
|
1055
|
+
* @param snapshots Array of snapshots ordered by time.
|
|
1056
|
+
*/
|
|
1057
|
+
declare function verifySnapshotConsistency(snapshots: Snapshot[]): ConsistencyReport;
|
|
1058
|
+
/**
|
|
1059
|
+
* Simulates network delivery of a snapshot with potential packet loss.
|
|
1060
|
+
* @param snapshot The snapshot to deliver.
|
|
1061
|
+
* @param reliability Probability of successful delivery (0.0 to 1.0).
|
|
1062
|
+
*/
|
|
1063
|
+
declare function simulateSnapshotDelivery(snapshot: Snapshot, reliability?: number): Promise<Snapshot | null>;
|
|
1064
|
+
/**
|
|
1065
|
+
* Parses a ProtocolPlayerState from a binary buffer.
|
|
1066
|
+
* Useful for testing player state serialization.
|
|
1067
|
+
* logic adapted from packages/engine/src/demo/parser.ts
|
|
1068
|
+
* @param data The binary data to parse.
|
|
1069
|
+
*/
|
|
1070
|
+
declare function parseProtocolPlayerState(data: Uint8Array): ProtocolPlayerState;
|
|
1071
|
+
|
|
1072
|
+
interface RateLimiter {
|
|
1073
|
+
bytesPerSecond: number;
|
|
1074
|
+
allow(bytes: number): boolean;
|
|
1075
|
+
update(deltaSeconds: number): void;
|
|
1076
|
+
reset(): void;
|
|
1077
|
+
getUsage(): number;
|
|
1078
|
+
}
|
|
1079
|
+
interface Message {
|
|
1080
|
+
data: Uint8Array;
|
|
1081
|
+
size: number;
|
|
1082
|
+
timestamp: number;
|
|
1083
|
+
}
|
|
1084
|
+
interface BandwidthScenario {
|
|
1085
|
+
bandwidth: number;
|
|
1086
|
+
clients: Client[];
|
|
1087
|
+
duration: number;
|
|
1088
|
+
totalBytesSent: number;
|
|
1089
|
+
totalBytesReceived: number;
|
|
1090
|
+
droppedPackets: number;
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Creates a mock rate limiter for bandwidth testing
|
|
1094
|
+
* @param bytesPerSecond - Maximum bytes per second allowed
|
|
1095
|
+
*/
|
|
1096
|
+
declare function createMockRateLimiter(bytesPerSecond: number): RateLimiter;
|
|
1097
|
+
/**
|
|
1098
|
+
* Simulates bandwidth limiting on a stream of messages
|
|
1099
|
+
* @param messages - Array of messages to process
|
|
1100
|
+
* @param bandwidth - Bandwidth limit in bytes per second
|
|
1101
|
+
* @returns Filtered array of messages that passed the bandwidth check
|
|
1102
|
+
*/
|
|
1103
|
+
declare function simulateBandwidthLimit(messages: Message[], bandwidth: number): Message[];
|
|
1104
|
+
/**
|
|
1105
|
+
* Calculates the size of a client snapshot in bytes
|
|
1106
|
+
* @param snapshot - The client frame snapshot
|
|
1107
|
+
*/
|
|
1108
|
+
declare function measureSnapshotSize(snapshot: ClientFrame): number;
|
|
1109
|
+
/**
|
|
1110
|
+
* Creates a scenario for testing bandwidth limits with multiple clients
|
|
1111
|
+
* @param bandwidth - Bandwidth limit per client or total
|
|
1112
|
+
* @param numClients - Number of clients to simulate
|
|
1113
|
+
*/
|
|
1114
|
+
declare function createBandwidthTestScenario(bandwidth: number, numClients: number): BandwidthScenario;
|
|
1115
|
+
|
|
1116
|
+
interface BrowserSetupOptions {
|
|
1117
|
+
url?: string;
|
|
1118
|
+
pretendToBeVisual?: boolean;
|
|
1119
|
+
resources?: "usable";
|
|
1120
|
+
enableWebGL2?: boolean;
|
|
1121
|
+
enablePointerLock?: boolean;
|
|
1122
|
+
}
|
|
1123
|
+
/**
|
|
1124
|
+
* Sets up a browser environment for testing using JSDOM and napi-rs/canvas.
|
|
1125
|
+
* This should be called in your vitest.setup.ts file.
|
|
1126
|
+
*/
|
|
1127
|
+
declare function setupBrowserEnvironment(options?: BrowserSetupOptions): void;
|
|
1128
|
+
/**
|
|
1129
|
+
* Cleans up the browser environment.
|
|
1130
|
+
*/
|
|
1131
|
+
declare function teardownBrowserEnvironment(): void;
|
|
1132
|
+
|
|
1133
|
+
/**
|
|
1134
|
+
* Creates a mock HTMLCanvasElement backed by napi-rs/canvas,
|
|
1135
|
+
* with support for both 2D and WebGL2 contexts.
|
|
1136
|
+
*/
|
|
1137
|
+
declare function createMockCanvas(width?: number, height?: number): HTMLCanvasElement;
|
|
1138
|
+
/**
|
|
1139
|
+
* Creates a mock CanvasRenderingContext2D.
|
|
1140
|
+
*/
|
|
1141
|
+
declare function createMockCanvasContext2D(canvas?: HTMLCanvasElement): CanvasRenderingContext2D;
|
|
1142
|
+
/**
|
|
1143
|
+
* Information about a captured draw call.
|
|
1144
|
+
*/
|
|
1145
|
+
interface DrawCall {
|
|
1146
|
+
method: string;
|
|
1147
|
+
args: any[];
|
|
1148
|
+
}
|
|
1149
|
+
/**
|
|
1150
|
+
* Wraps a CanvasRenderingContext2D to capture all method calls.
|
|
1151
|
+
*/
|
|
1152
|
+
declare function captureCanvasDrawCalls(context: CanvasRenderingContext2D): DrawCall[];
|
|
1153
|
+
/**
|
|
1154
|
+
* Creates a mock ImageData object.
|
|
1155
|
+
*/
|
|
1156
|
+
declare function createMockImageData(width: number, height: number, fillColor?: [number, number, number, number]): ImageData;
|
|
1157
|
+
/**
|
|
1158
|
+
* Creates a mock HTMLImageElement.
|
|
1159
|
+
*/
|
|
1160
|
+
declare function createMockImage(width?: number, height?: number, src?: string): HTMLImageElement;
|
|
1161
|
+
|
|
1162
|
+
interface HeadlessWebGPUSetup {
|
|
1163
|
+
adapter: GPUAdapter;
|
|
1164
|
+
device: GPUDevice;
|
|
1165
|
+
cleanup: () => Promise<void>;
|
|
1166
|
+
}
|
|
1167
|
+
interface WebGPUContextState {
|
|
1168
|
+
adapter: GPUAdapter;
|
|
1169
|
+
device: GPUDevice;
|
|
1170
|
+
queue: GPUQueue;
|
|
1171
|
+
format: GPUTextureFormat;
|
|
1172
|
+
}
|
|
1173
|
+
/**
|
|
1174
|
+
* Initialize WebGPU in a headless Node.js environment using @webgpu/dawn (via webgpu package)
|
|
1175
|
+
*/
|
|
1176
|
+
declare function initHeadlessWebGPU(options?: {
|
|
1177
|
+
powerPreference?: 'low-power' | 'high-performance';
|
|
1178
|
+
requiredFeatures?: GPUFeatureName[];
|
|
1179
|
+
}): Promise<HeadlessWebGPUSetup>;
|
|
1180
|
+
/**
|
|
1181
|
+
* Creates a complete context state for testing
|
|
1182
|
+
*/
|
|
1183
|
+
declare function createHeadlessTestContext(): Promise<WebGPUContextState>;
|
|
1184
|
+
|
|
1185
|
+
interface MockWebGPUContext {
|
|
1186
|
+
adapter: GPUAdapter;
|
|
1187
|
+
device: GPUDevice;
|
|
1188
|
+
queue: GPUQueue;
|
|
1189
|
+
}
|
|
1190
|
+
/**
|
|
1191
|
+
* Patches globalThis with WebGPU globals (GPUBufferUsage, etc.)
|
|
1192
|
+
* and optionally patches navigator.gpu.
|
|
1193
|
+
*/
|
|
1194
|
+
declare function setupWebGPUMocks(): {
|
|
1195
|
+
mockGpu: {
|
|
1196
|
+
requestAdapter: vitest.Mock<any, any>;
|
|
1197
|
+
getPreferredCanvasFormat: vitest.Mock<any, any>;
|
|
1198
|
+
};
|
|
1199
|
+
mockAdapter: GPUAdapter;
|
|
1200
|
+
mockDevice: GPUDevice;
|
|
1201
|
+
};
|
|
1202
|
+
declare function createMockGPUAdapter(options?: Partial<GPUAdapter>): GPUAdapter;
|
|
1203
|
+
declare function createMockGPUDevice(features?: Set<GPUFeatureName>): GPUDevice;
|
|
1204
|
+
declare function createMockQueue(): GPUQueue;
|
|
1205
|
+
declare function createMockGPUBuffer(descriptor: GPUBufferDescriptor): GPUBuffer;
|
|
1206
|
+
declare function createMockGPUTexture(descriptor: GPUTextureDescriptor): GPUTexture;
|
|
1207
|
+
declare function createMockTextureView(): GPUTextureView;
|
|
1208
|
+
declare function createMockSampler(): GPUSampler;
|
|
1209
|
+
declare function createMockShaderModule(descriptor: GPUShaderModuleDescriptor): GPUShaderModule;
|
|
1210
|
+
declare function createMockComputePipeline(): GPUComputePipeline;
|
|
1211
|
+
declare function createMockRenderPipeline(): GPURenderPipeline;
|
|
1212
|
+
declare function createMockCommandEncoder(): GPUCommandEncoder;
|
|
1213
|
+
declare function createMockRenderPassEncoder(): GPURenderPassEncoder;
|
|
1214
|
+
declare function createMockComputePassEncoder(): GPUComputePassEncoder;
|
|
1215
|
+
declare function createMockWebGPUContext(): MockWebGPUContext;
|
|
1216
|
+
|
|
1217
|
+
/**
|
|
1218
|
+
* Interface for the mock RequestAnimationFrame implementation.
|
|
1219
|
+
*/
|
|
1220
|
+
interface MockRAF {
|
|
1221
|
+
/**
|
|
1222
|
+
* Advances time by one tick (simulating one frame).
|
|
1223
|
+
* @param time Timestamp to pass to callbacks (default: calls Date.now())
|
|
1224
|
+
*/
|
|
1225
|
+
tick(time?: number): void;
|
|
1226
|
+
/**
|
|
1227
|
+
* Advances time by a specific amount, triggering multiple frames if necessary.
|
|
1228
|
+
* Not fully implemented in simple version, acts as alias to tick() with specific time.
|
|
1229
|
+
*/
|
|
1230
|
+
advance(ms: number): void;
|
|
1231
|
+
/**
|
|
1232
|
+
* Returns current pending callbacks.
|
|
1233
|
+
*/
|
|
1234
|
+
getCallbacks(): Array<{
|
|
1235
|
+
id: number;
|
|
1236
|
+
callback: FrameRequestCallback;
|
|
1237
|
+
}>;
|
|
1238
|
+
}
|
|
1239
|
+
/**
|
|
1240
|
+
* Creates a mock RequestAnimationFrame implementation.
|
|
1241
|
+
* Replaces global.requestAnimationFrame and cancelAnimationFrame.
|
|
1242
|
+
*/
|
|
1243
|
+
declare function createMockRAF(): MockRAF;
|
|
1244
|
+
/**
|
|
1245
|
+
* Creates a mock Performance object.
|
|
1246
|
+
*/
|
|
1247
|
+
declare function createMockPerformance(startTime?: number): Performance;
|
|
1248
|
+
interface ControlledTimer {
|
|
1249
|
+
/**
|
|
1250
|
+
* Advances virtual time by ms.
|
|
1251
|
+
*/
|
|
1252
|
+
advanceBy(ms: number): void;
|
|
1253
|
+
/**
|
|
1254
|
+
* Runs all pending timers.
|
|
1255
|
+
*/
|
|
1256
|
+
runAll(): void;
|
|
1257
|
+
/**
|
|
1258
|
+
* Restores original timer functions.
|
|
1259
|
+
*/
|
|
1260
|
+
clear(): void;
|
|
1261
|
+
}
|
|
1262
|
+
/**
|
|
1263
|
+
* Creates controlled timers (setTimeout/setInterval).
|
|
1264
|
+
* Note: Use verify's useFakeTimers() for better integration with test runner.
|
|
1265
|
+
* This is a lightweight alternative or specific helper.
|
|
1266
|
+
*/
|
|
1267
|
+
declare function createControlledTimer(): ControlledTimer;
|
|
1268
|
+
/**
|
|
1269
|
+
* Simulates multiple RAF frames.
|
|
1270
|
+
*/
|
|
1271
|
+
declare function simulateFrames(count: number, frameTime?: number, callback?: (frameIndex: number) => void): void;
|
|
1272
|
+
|
|
1273
|
+
/**
|
|
1274
|
+
* Setup helpers for Node.js environments.
|
|
1275
|
+
*/
|
|
1276
|
+
interface NodeSetupOptions {
|
|
1277
|
+
}
|
|
1278
|
+
/**
|
|
1279
|
+
* Sets up a Node.js environment for testing.
|
|
1280
|
+
* Currently a placeholder for future Node-specific setup.
|
|
1281
|
+
*/
|
|
1282
|
+
declare function setupNodeEnvironment(options?: NodeSetupOptions): void;
|
|
1283
|
+
/**
|
|
1284
|
+
* Teardown for Node.js environment.
|
|
1285
|
+
*/
|
|
1286
|
+
declare function teardownNodeEnvironment(): void;
|
|
1287
|
+
|
|
1288
|
+
interface ShaderRecord {
|
|
1289
|
+
readonly id: number;
|
|
1290
|
+
readonly type: GLenum;
|
|
1291
|
+
}
|
|
1292
|
+
interface ProgramRecord {
|
|
1293
|
+
readonly id: number;
|
|
1294
|
+
}
|
|
1295
|
+
declare class MockWebGL2RenderingContext {
|
|
1296
|
+
readonly ARRAY_BUFFER = 34962;
|
|
1297
|
+
readonly ELEMENT_ARRAY_BUFFER = 34963;
|
|
1298
|
+
readonly STATIC_DRAW = 35044;
|
|
1299
|
+
readonly DYNAMIC_DRAW = 35048;
|
|
1300
|
+
readonly FLOAT = 5126;
|
|
1301
|
+
readonly UNSIGNED_SHORT = 5123;
|
|
1302
|
+
readonly TEXTURE_2D = 3553;
|
|
1303
|
+
readonly TEXTURE_CUBE_MAP = 34067;
|
|
1304
|
+
readonly TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
|
|
1305
|
+
readonly TEXTURE0 = 33984;
|
|
1306
|
+
readonly TEXTURE_WRAP_S = 10242;
|
|
1307
|
+
readonly TEXTURE_WRAP_T = 10243;
|
|
1308
|
+
readonly TEXTURE_MIN_FILTER = 10241;
|
|
1309
|
+
readonly TEXTURE_MAG_FILTER = 10240;
|
|
1310
|
+
readonly LINEAR = 9729;
|
|
1311
|
+
readonly NEAREST = 9728;
|
|
1312
|
+
readonly CLAMP_TO_EDGE = 33071;
|
|
1313
|
+
readonly RGBA = 6408;
|
|
1314
|
+
readonly UNSIGNED_BYTE = 5121;
|
|
1315
|
+
readonly FRAMEBUFFER = 36160;
|
|
1316
|
+
readonly COLOR_ATTACHMENT0 = 36064;
|
|
1317
|
+
readonly DEPTH_ATTACHMENT = 36096;
|
|
1318
|
+
readonly RENDERBUFFER = 36161;
|
|
1319
|
+
readonly DEPTH_COMPONENT24 = 33190;
|
|
1320
|
+
readonly FRAMEBUFFER_COMPLETE = 36053;
|
|
1321
|
+
readonly TRIANGLES = 4;
|
|
1322
|
+
readonly DEPTH_TEST = 2929;
|
|
1323
|
+
readonly CULL_FACE = 2884;
|
|
1324
|
+
readonly BLEND = 3042;
|
|
1325
|
+
readonly SRC_ALPHA = 770;
|
|
1326
|
+
readonly ONE_MINUS_SRC_ALPHA = 771;
|
|
1327
|
+
readonly ONE = 1;
|
|
1328
|
+
readonly BACK = 1029;
|
|
1329
|
+
readonly LEQUAL = 515;
|
|
1330
|
+
readonly VERTEX_SHADER = 35633;
|
|
1331
|
+
readonly FRAGMENT_SHADER = 35632;
|
|
1332
|
+
readonly COMPILE_STATUS = 35713;
|
|
1333
|
+
readonly LINK_STATUS = 35714;
|
|
1334
|
+
readonly ONE_MINUS_SRC_COLOR = 769;
|
|
1335
|
+
readonly TRIANGLE_STRIP = 5;
|
|
1336
|
+
readonly QUERY_RESULT_AVAILABLE = 34919;
|
|
1337
|
+
readonly QUERY_RESULT = 34918;
|
|
1338
|
+
readonly TRIANGLE_FAN = 6;
|
|
1339
|
+
readonly COLOR_BUFFER_BIT = 16384;
|
|
1340
|
+
readonly DEPTH_BUFFER_BIT = 256;
|
|
1341
|
+
readonly canvas: HTMLCanvasElement | {
|
|
1342
|
+
width: number;
|
|
1343
|
+
height: number;
|
|
1344
|
+
};
|
|
1345
|
+
readonly drawingBufferWidth: number;
|
|
1346
|
+
readonly drawingBufferHeight: number;
|
|
1347
|
+
private shaderCounter;
|
|
1348
|
+
private programCounter;
|
|
1349
|
+
compileSucceeds: boolean;
|
|
1350
|
+
linkSucceeds: boolean;
|
|
1351
|
+
shaderInfoLog: string;
|
|
1352
|
+
programInfoLog: string;
|
|
1353
|
+
readonly extensions: Map<string, unknown>;
|
|
1354
|
+
readonly calls: string[];
|
|
1355
|
+
readonly uniformLocations: Map<string, WebGLUniformLocation | null>;
|
|
1356
|
+
readonly attributeLocations: Map<string, number>;
|
|
1357
|
+
constructor(canvas?: HTMLCanvasElement);
|
|
1358
|
+
enable: vitest.Mock<[cap: number], number>;
|
|
1359
|
+
disable: vitest.Mock<[cap: number], number>;
|
|
1360
|
+
depthFunc: vitest.Mock<[func: number], number>;
|
|
1361
|
+
cullFace: vitest.Mock<[mode: number], number>;
|
|
1362
|
+
depthMask: vitest.Mock<[flag: boolean], number>;
|
|
1363
|
+
blendFuncSeparate: vitest.Mock<[srcRGB: number, dstRGB: number, srcAlpha: number, dstAlpha: number], number>;
|
|
1364
|
+
blendFunc: vitest.Mock<[sfactor: number, dfactor: number], number>;
|
|
1365
|
+
getExtension: vitest.Mock<[name: string], {} | null>;
|
|
1366
|
+
viewport: vitest.Mock<[x: number, y: number, w: number, h: number], number>;
|
|
1367
|
+
clear: vitest.Mock<[mask: number], number>;
|
|
1368
|
+
clearColor: vitest.Mock<[r: number, g: number, b: number, a: number], number>;
|
|
1369
|
+
createShader: vitest.Mock<[type: number], WebGLShader>;
|
|
1370
|
+
shaderSource: vitest.Mock<[shader: ShaderRecord, source: string], number>;
|
|
1371
|
+
compileShader: vitest.Mock<[shader: ShaderRecord], number>;
|
|
1372
|
+
getShaderParameter: vitest.Mock<[shader: ShaderRecord, pname: number], boolean | null>;
|
|
1373
|
+
getShaderInfoLog: vitest.Mock<[], string>;
|
|
1374
|
+
deleteShader: vitest.Mock<[shader: ShaderRecord], number>;
|
|
1375
|
+
createProgram: vitest.Mock<[], WebGLProgram>;
|
|
1376
|
+
attachShader: vitest.Mock<[program: ProgramRecord, shader: ShaderRecord], number>;
|
|
1377
|
+
bindAttribLocation: vitest.Mock<[program: ProgramRecord, index: number, name: string], number>;
|
|
1378
|
+
linkProgram: vitest.Mock<[program: ProgramRecord], number>;
|
|
1379
|
+
getProgramParameter: vitest.Mock<[program: ProgramRecord, pname: number], boolean | null>;
|
|
1380
|
+
getProgramInfoLog: vitest.Mock<[], string>;
|
|
1381
|
+
deleteProgram: vitest.Mock<[program: ProgramRecord], number>;
|
|
1382
|
+
useProgram: vitest.Mock<[program: ProgramRecord | null], number>;
|
|
1383
|
+
getUniformLocation: vitest.Mock<[program: ProgramRecord, name: string], WebGLUniformLocation | null>;
|
|
1384
|
+
getAttribLocation: vitest.Mock<[program: ProgramRecord, name: string], number>;
|
|
1385
|
+
createBuffer: vitest.Mock<[], WebGLBuffer>;
|
|
1386
|
+
bindBuffer: vitest.Mock<[target: number, buffer: WebGLBuffer | null], number>;
|
|
1387
|
+
bufferData: vitest.Mock<[target: number, data: number | BufferSource, usage: number], number>;
|
|
1388
|
+
bufferSubData: vitest.Mock<[target: number, offset: number, data: BufferSource], number>;
|
|
1389
|
+
deleteBuffer: vitest.Mock<[buffer: WebGLBuffer], number>;
|
|
1390
|
+
createVertexArray: vitest.Mock<[], WebGLVertexArrayObject>;
|
|
1391
|
+
bindVertexArray: vitest.Mock<[vao: WebGLVertexArrayObject | null], number>;
|
|
1392
|
+
enableVertexAttribArray: vitest.Mock<[index: number], number>;
|
|
1393
|
+
vertexAttribPointer: vitest.Mock<[index: number, size: number, type: number, normalized: boolean, stride: number, offset: number], number>;
|
|
1394
|
+
vertexAttribDivisor: vitest.Mock<[index: number, divisor: number], number>;
|
|
1395
|
+
deleteVertexArray: vitest.Mock<[vao: WebGLVertexArrayObject], number>;
|
|
1396
|
+
createTexture: vitest.Mock<[], WebGLTexture>;
|
|
1397
|
+
activeTexture: vitest.Mock<[unit: number], number>;
|
|
1398
|
+
bindTexture: vitest.Mock<[target: number, texture: WebGLTexture | null], number>;
|
|
1399
|
+
texParameteri: vitest.Mock<[target: number, pname: number, param: number], number>;
|
|
1400
|
+
texImage2D: vitest.Mock<[target: number, level: number, internalFormat: number, width: number, height: number, border: number, format: number, type: number, pixels: ArrayBufferView<ArrayBufferLike> | null], number>;
|
|
1401
|
+
texImage3D: vitest.Mock<any, any>;
|
|
1402
|
+
deleteTexture: vitest.Mock<[texture: WebGLTexture], number>;
|
|
1403
|
+
createFramebuffer: vitest.Mock<[], WebGLFramebuffer>;
|
|
1404
|
+
bindFramebuffer: vitest.Mock<[target: number, framebuffer: WebGLFramebuffer | null], number>;
|
|
1405
|
+
framebufferTexture2D: vitest.Mock<[target: number, attachment: number, textarget: number, texture: WebGLTexture | null, level: number], number>;
|
|
1406
|
+
deleteFramebuffer: vitest.Mock<[fb: WebGLFramebuffer], number>;
|
|
1407
|
+
checkFramebufferStatus: vitest.Mock<[target: number], number>;
|
|
1408
|
+
createRenderbuffer: vitest.Mock<[], WebGLRenderbuffer>;
|
|
1409
|
+
bindRenderbuffer: vitest.Mock<[target: number, renderbuffer: WebGLRenderbuffer | null], number>;
|
|
1410
|
+
renderbufferStorage: vitest.Mock<[target: number, internalformat: number, width: number, height: number], number>;
|
|
1411
|
+
framebufferRenderbuffer: vitest.Mock<[target: number, attachment: number, renderbuffertarget: number, renderbuffer: WebGLRenderbuffer | null], number>;
|
|
1412
|
+
deleteRenderbuffer: vitest.Mock<[rb: WebGLRenderbuffer], number>;
|
|
1413
|
+
drawArrays: vitest.Mock<[mode: number, first: number, count: number], number>;
|
|
1414
|
+
drawElements: vitest.Mock<[mode: number, count: number, type: number, offset: number], number>;
|
|
1415
|
+
createQuery: vitest.Mock<[], WebGLQuery>;
|
|
1416
|
+
beginQuery: vitest.Mock<any, any>;
|
|
1417
|
+
endQuery: vitest.Mock<any, any>;
|
|
1418
|
+
deleteQuery: vitest.Mock<any, any>;
|
|
1419
|
+
getQueryParameter: vitest.Mock<any, any>;
|
|
1420
|
+
getParameter: vitest.Mock<any, any>;
|
|
1421
|
+
uniform1f: vitest.Mock<[location: WebGLUniformLocation | null, x: number], number>;
|
|
1422
|
+
uniform1i: vitest.Mock<[location: WebGLUniformLocation | null, x: number], number>;
|
|
1423
|
+
uniform4f: vitest.Mock<[location: WebGLUniformLocation | null, x: number, y: number, z: number, w: number], number>;
|
|
1424
|
+
uniform3fv: vitest.Mock<[location: WebGLUniformLocation | null, data: number[] | Float32List], number>;
|
|
1425
|
+
uniform3f: vitest.Mock<[location: WebGLUniformLocation | null, x: number, y: number, z: number], number>;
|
|
1426
|
+
uniform2f: vitest.Mock<[location: WebGLUniformLocation | null, x: number, y: number], number>;
|
|
1427
|
+
uniform4fv: vitest.Mock<[location: WebGLUniformLocation | null, data: Float32List], number>;
|
|
1428
|
+
uniformMatrix4fv: vitest.Mock<[location: WebGLUniformLocation | null, transpose: boolean, data: Iterable<number> | Float32List], number>;
|
|
1429
|
+
uniformBlockBinding: vitest.Mock<any, any>;
|
|
1430
|
+
isContextLost: vitest.Mock<[], boolean>;
|
|
1431
|
+
}
|
|
1432
|
+
declare function createMockWebGL2Context(overridesOrCanvas?: Partial<WebGL2RenderingContext> | HTMLCanvasElement): MockWebGL2RenderingContext;
|
|
1433
|
+
|
|
1434
|
+
declare class FakeAudioParam implements AudioParamLike {
|
|
1435
|
+
value: number;
|
|
1436
|
+
constructor(value: number);
|
|
1437
|
+
}
|
|
1438
|
+
declare class FakeAudioNode implements AudioNodeLike {
|
|
1439
|
+
readonly connections: AudioNodeLike[];
|
|
1440
|
+
connect(destination: AudioNodeLike): void;
|
|
1441
|
+
}
|
|
1442
|
+
declare class FakeGainNode extends FakeAudioNode implements GainNodeLike, DynamicsCompressorNodeLike {
|
|
1443
|
+
gain: FakeAudioParam;
|
|
1444
|
+
}
|
|
1445
|
+
declare class FakePannerNode extends FakeAudioNode implements PannerNodeLike {
|
|
1446
|
+
positionX: FakeAudioParam;
|
|
1447
|
+
positionY: FakeAudioParam;
|
|
1448
|
+
positionZ: FakeAudioParam;
|
|
1449
|
+
refDistance?: number;
|
|
1450
|
+
maxDistance?: number;
|
|
1451
|
+
rolloffFactor?: number;
|
|
1452
|
+
distanceModel?: string;
|
|
1453
|
+
}
|
|
1454
|
+
declare class FakeBiquadFilterNode extends FakeAudioNode implements BiquadFilterNodeLike {
|
|
1455
|
+
frequency: FakeAudioParam;
|
|
1456
|
+
Q: FakeAudioParam;
|
|
1457
|
+
type: string;
|
|
1458
|
+
}
|
|
1459
|
+
declare class FakeBufferSource extends FakeAudioNode implements AudioBufferSourceNodeLike {
|
|
1460
|
+
buffer: AudioBufferLike | null;
|
|
1461
|
+
loop: boolean;
|
|
1462
|
+
playbackRate: FakeAudioParam;
|
|
1463
|
+
onended: (() => void) | null;
|
|
1464
|
+
startedAt?: number;
|
|
1465
|
+
stoppedAt?: number;
|
|
1466
|
+
start(when?: number, offset?: number, duration?: number): void;
|
|
1467
|
+
stop(when?: number): void;
|
|
1468
|
+
offset?: number;
|
|
1469
|
+
duration?: number;
|
|
1470
|
+
}
|
|
1471
|
+
declare class FakeDestination extends FakeAudioNode implements AudioDestinationNodeLike {
|
|
1472
|
+
}
|
|
1473
|
+
declare class FakeAudioContext implements AudioContextLike {
|
|
1474
|
+
readonly destination: FakeDestination;
|
|
1475
|
+
state: AudioContextLike['state'];
|
|
1476
|
+
currentTime: number;
|
|
1477
|
+
resumeCalls: number;
|
|
1478
|
+
readonly gains: GainNodeLike[];
|
|
1479
|
+
readonly sources: FakeBufferSource[];
|
|
1480
|
+
readonly panners: PannerNodeLike[];
|
|
1481
|
+
readonly filters: BiquadFilterNodeLike[];
|
|
1482
|
+
lastDecoded?: ArrayBuffer;
|
|
1483
|
+
createPanner?: () => PannerNodeLike;
|
|
1484
|
+
constructor(enablePanner?: boolean);
|
|
1485
|
+
resume(): Promise<void>;
|
|
1486
|
+
suspend(): Promise<void>;
|
|
1487
|
+
createGain(): GainNodeLike;
|
|
1488
|
+
createDynamicsCompressor(): DynamicsCompressorNodeLike;
|
|
1489
|
+
createBufferSource(): AudioBufferSourceNodeLike;
|
|
1490
|
+
createBiquadFilter(): BiquadFilterNodeLike;
|
|
1491
|
+
decodeAudioData(data: ArrayBuffer): Promise<AudioBufferLike>;
|
|
1492
|
+
advanceTime(seconds: number): void;
|
|
1493
|
+
}
|
|
1494
|
+
declare const createMockAudioBuffer: (duration?: number, channels?: number, sampleRate?: number) => AudioBufferLike;
|
|
1495
|
+
declare const createMockAudioContext: (overrides?: Partial<AudioContext>) => FakeAudioContext;
|
|
1496
|
+
declare const createMockPannerNode: (overrides?: Partial<PannerNode>) => FakePannerNode;
|
|
1497
|
+
declare const createMockBufferSource: (buffer?: AudioBuffer) => FakeBufferSource;
|
|
1498
|
+
|
|
1499
|
+
declare function createMockRenderer(overrides?: Partial<Renderer>): Renderer;
|
|
1500
|
+
declare function createMockFrameRenderer(overrides?: Partial<FrameRenderer>): FrameRenderer;
|
|
1501
|
+
declare function createMockBspPipeline(overrides?: Partial<BspSurfacePipeline>): BspSurfacePipeline;
|
|
1502
|
+
declare function createMockMd2Pipeline(overrides?: Partial<Md2Pipeline>): Md2Pipeline;
|
|
1503
|
+
declare function createMockMd3Pipeline(overrides?: Partial<Md3Pipeline>): Md3Pipeline;
|
|
1504
|
+
declare function createMockSpritePipeline(overrides?: Partial<SpriteRenderer>): SpriteRenderer;
|
|
1505
|
+
declare function createMockSkyboxPipeline(overrides?: Partial<SkyboxPipeline>): SkyboxPipeline;
|
|
1506
|
+
|
|
1507
|
+
declare function createMockAssetManager(overrides?: Partial<AssetManager>): AssetManager;
|
|
1508
|
+
declare function createMockTexture(width?: number, height?: number, data?: Uint8Array): PreparedTexture;
|
|
1509
|
+
declare function createMockMd2Model(overrides?: Partial<Md2Model>): Md2Model;
|
|
1510
|
+
declare function createMockMd3Model(overrides?: Partial<Md3Model>): Md3Model;
|
|
1511
|
+
declare function createMockBspMap(overrides?: Partial<BspMap>): BspMap;
|
|
1512
|
+
|
|
1513
|
+
/**
|
|
1514
|
+
* Creates a mock VertexBuffer with an optional data array.
|
|
1515
|
+
*/
|
|
1516
|
+
declare function createMockVertexBuffer(data?: Float32Array, usage?: BufferUsage): VertexBuffer;
|
|
1517
|
+
/**
|
|
1518
|
+
* Creates a mock IndexBuffer with an optional data array.
|
|
1519
|
+
*/
|
|
1520
|
+
declare function createMockIndexBuffer(data?: Uint16Array, usage?: BufferUsage): IndexBuffer;
|
|
1521
|
+
/**
|
|
1522
|
+
* Creates a mock ShaderProgram with optional overrides.
|
|
1523
|
+
*/
|
|
1524
|
+
declare function createMockShaderProgram(overrides?: Partial<ShaderProgram>): ShaderProgram;
|
|
1525
|
+
/**
|
|
1526
|
+
* Helper to create a mock ShaderProgram with custom source code.
|
|
1527
|
+
*/
|
|
1528
|
+
declare function createMockShader(vertSource?: string, fragSource?: string): ShaderProgram;
|
|
1529
|
+
|
|
1530
|
+
interface Lightmap {
|
|
1531
|
+
width: number;
|
|
1532
|
+
height: number;
|
|
1533
|
+
data: Uint8Array;
|
|
1534
|
+
}
|
|
1535
|
+
/**
|
|
1536
|
+
* Creates a mock DLight with default values.
|
|
1537
|
+
*/
|
|
1538
|
+
declare function createMockDLight(position?: Vec3, color?: Vec3, intensity?: number): DLight;
|
|
1539
|
+
/**
|
|
1540
|
+
* Creates a mock DynamicLightManager with spy methods.
|
|
1541
|
+
*/
|
|
1542
|
+
declare function createMockDLightManager(overrides?: Partial<DynamicLightManager>): DynamicLightManager;
|
|
1543
|
+
/**
|
|
1544
|
+
* Creates a mock lightmap data structure.
|
|
1545
|
+
*/
|
|
1546
|
+
declare function createMockLightmap(width?: number, height?: number): Lightmap;
|
|
1547
|
+
|
|
1548
|
+
interface MockParticle {
|
|
1549
|
+
position: Vec3;
|
|
1550
|
+
velocity: Vec3;
|
|
1551
|
+
color: [number, number, number, number];
|
|
1552
|
+
size: number;
|
|
1553
|
+
lifetime: number;
|
|
1554
|
+
gravity: number;
|
|
1555
|
+
damping: number;
|
|
1556
|
+
bounce: number;
|
|
1557
|
+
blendMode: 'alpha' | 'additive';
|
|
1558
|
+
fade: boolean;
|
|
1559
|
+
}
|
|
1560
|
+
interface MockParticleEmitter {
|
|
1561
|
+
update: (dt: number) => void;
|
|
1562
|
+
emit: () => void;
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
/**
|
|
1566
|
+
* Creates a mock Particle with default values.
|
|
1567
|
+
*/
|
|
1568
|
+
declare function createMockParticle(overrides?: Partial<MockParticle>): MockParticle;
|
|
1569
|
+
/**
|
|
1570
|
+
* Creates a mock ParticleEmitter.
|
|
1571
|
+
*/
|
|
1572
|
+
declare function createMockParticleEmitter(overrides?: Partial<MockParticleEmitter>): MockParticleEmitter;
|
|
1573
|
+
/**
|
|
1574
|
+
* Creates a mock ParticleSystem.
|
|
1575
|
+
*/
|
|
1576
|
+
declare function createMockParticleSystem(overrides?: Partial<ParticleSystem>): ParticleSystem;
|
|
1577
|
+
|
|
1578
|
+
interface MockPipeline {
|
|
1579
|
+
render: ReturnType<typeof vi.fn>;
|
|
1580
|
+
init: ReturnType<typeof vi.fn>;
|
|
1581
|
+
resize: ReturnType<typeof vi.fn>;
|
|
1582
|
+
}
|
|
1583
|
+
interface MockCamera {
|
|
1584
|
+
update: ReturnType<typeof vi.fn>;
|
|
1585
|
+
getViewMatrix: ReturnType<typeof vi.fn>;
|
|
1586
|
+
getProjectionMatrix: ReturnType<typeof vi.fn>;
|
|
1587
|
+
getViewProjectionMatrix: ReturnType<typeof vi.fn>;
|
|
1588
|
+
getPosition: ReturnType<typeof vi.fn>;
|
|
1589
|
+
getForward: ReturnType<typeof vi.fn>;
|
|
1590
|
+
getRight: ReturnType<typeof vi.fn>;
|
|
1591
|
+
getUp: ReturnType<typeof vi.fn>;
|
|
1592
|
+
extractFrustumPlanes: ReturnType<typeof vi.fn>;
|
|
1593
|
+
transform: {
|
|
1594
|
+
origin: number[];
|
|
1595
|
+
angles: number[];
|
|
1596
|
+
fov: number;
|
|
1597
|
+
};
|
|
1598
|
+
}
|
|
1599
|
+
interface MockRenderingContext {
|
|
1600
|
+
gl: MockWebGL2RenderingContext;
|
|
1601
|
+
camera: MockCamera;
|
|
1602
|
+
pipelines: {
|
|
1603
|
+
md2: MockPipeline;
|
|
1604
|
+
bsp: MockPipeline;
|
|
1605
|
+
sprite: MockPipeline;
|
|
1606
|
+
poly: MockPipeline;
|
|
1607
|
+
particle: MockPipeline;
|
|
1608
|
+
};
|
|
1609
|
+
}
|
|
1610
|
+
declare function createMockRenderingContext(): MockRenderingContext;
|
|
1611
|
+
|
|
1612
|
+
/**
|
|
1613
|
+
* Creates a mock LocalStorage instance.
|
|
1614
|
+
*/
|
|
1615
|
+
declare function createMockLocalStorage(initialData?: Record<string, string>): Storage;
|
|
1616
|
+
/**
|
|
1617
|
+
* Creates a mock SessionStorage instance.
|
|
1618
|
+
*/
|
|
1619
|
+
declare function createMockSessionStorage(initialData?: Record<string, string>): Storage;
|
|
1620
|
+
/**
|
|
1621
|
+
* Creates a mock IndexedDB factory.
|
|
1622
|
+
* Wraps fake-indexeddb.
|
|
1623
|
+
*/
|
|
1624
|
+
declare function createMockIndexedDB(databases?: IDBDatabase[]): IDBFactory;
|
|
1625
|
+
interface StorageScenario {
|
|
1626
|
+
localStorage: Storage;
|
|
1627
|
+
sessionStorage: Storage;
|
|
1628
|
+
indexedDB: IDBFactory;
|
|
1629
|
+
}
|
|
1630
|
+
/**
|
|
1631
|
+
* Creates a complete storage test scenario.
|
|
1632
|
+
*/
|
|
1633
|
+
declare function createStorageTestScenario(storageType?: 'local' | 'session' | 'indexed'): StorageScenario;
|
|
1634
|
+
|
|
1635
|
+
/**
|
|
1636
|
+
* Mocks for Web Audio API.
|
|
1637
|
+
*/
|
|
1638
|
+
/**
|
|
1639
|
+
* Sets up a mock AudioContext globally.
|
|
1640
|
+
*/
|
|
1641
|
+
declare function setupMockAudioContext(): void;
|
|
1642
|
+
/**
|
|
1643
|
+
* Restores original AudioContext.
|
|
1644
|
+
*/
|
|
1645
|
+
declare function teardownMockAudioContext(): void;
|
|
1646
|
+
interface AudioEvent {
|
|
1647
|
+
type: string;
|
|
1648
|
+
data?: any;
|
|
1649
|
+
}
|
|
1650
|
+
/**
|
|
1651
|
+
* Captures audio events from a context.
|
|
1652
|
+
* Requires the context to be instrumented or mocked to emit events.
|
|
1653
|
+
* This helper currently works with the `setupMockAudioContext` mock if extended.
|
|
1654
|
+
*/
|
|
1655
|
+
declare function captureAudioEvents(context: AudioContext): AudioEvent[];
|
|
1656
|
+
|
|
1657
|
+
/**
|
|
1658
|
+
* Interface for render test setup
|
|
1659
|
+
*/
|
|
1660
|
+
interface RenderTestSetup {
|
|
1661
|
+
context: WebGPUContextState;
|
|
1662
|
+
renderTarget: GPUTexture;
|
|
1663
|
+
renderTargetView: GPUTextureView;
|
|
1664
|
+
commandEncoder: GPUCommandEncoder;
|
|
1665
|
+
cleanup: () => Promise<void>;
|
|
1666
|
+
width: number;
|
|
1667
|
+
height: number;
|
|
1668
|
+
}
|
|
1669
|
+
/**
|
|
1670
|
+
* Creates a setup for testing rendering pipelines.
|
|
1671
|
+
* Initializes a headless WebGPU context, a render target texture, and a command encoder.
|
|
1672
|
+
*/
|
|
1673
|
+
declare function createRenderTestSetup(width?: number, height?: number): Promise<RenderTestSetup>;
|
|
1674
|
+
/**
|
|
1675
|
+
* Captures texture content to Uint8ClampedArray (RGBA).
|
|
1676
|
+
* Creates its own CommandEncoder and submits immediately.
|
|
1677
|
+
*/
|
|
1678
|
+
declare function captureTexture(device: GPUDevice, texture: GPUTexture, width: number, height: number): Promise<Uint8ClampedArray>;
|
|
1679
|
+
/**
|
|
1680
|
+
* Helper to render and capture the output as pixel data.
|
|
1681
|
+
* It manages the render pass, submission, and buffer readback.
|
|
1682
|
+
*/
|
|
1683
|
+
declare function renderAndCapture(setup: RenderTestSetup, renderFn: (pass: GPURenderPassEncoder) => void): Promise<Uint8ClampedArray>;
|
|
1684
|
+
/**
|
|
1685
|
+
* Interface for compute test setup
|
|
1686
|
+
*/
|
|
1687
|
+
interface ComputeTestSetup {
|
|
1688
|
+
context: WebGPUContextState;
|
|
1689
|
+
outputBuffer: GPUBuffer;
|
|
1690
|
+
commandEncoder: GPUCommandEncoder;
|
|
1691
|
+
cleanup: () => Promise<void>;
|
|
1692
|
+
outputSize: number;
|
|
1693
|
+
}
|
|
1694
|
+
/**
|
|
1695
|
+
* Creates a setup for testing compute shaders.
|
|
1696
|
+
*/
|
|
1697
|
+
declare function createComputeTestSetup(outputSize: number): Promise<ComputeTestSetup>;
|
|
1698
|
+
/**
|
|
1699
|
+
* Helper to run a compute pass and read back the output buffer.
|
|
1700
|
+
*/
|
|
1701
|
+
declare function runComputeAndReadback(setup: ComputeTestSetup, computeFn: (pass: GPUComputePassEncoder) => void): Promise<ArrayBuffer>;
|
|
1702
|
+
|
|
1703
|
+
interface GeometryBuffers {
|
|
1704
|
+
vertexBuffer: GPUBuffer;
|
|
1705
|
+
indexBuffer?: GPUBuffer;
|
|
1706
|
+
vertexCount: number;
|
|
1707
|
+
indexCount?: number;
|
|
1708
|
+
}
|
|
1709
|
+
/**
|
|
1710
|
+
* Template for testing a rendering pipeline
|
|
1711
|
+
*/
|
|
1712
|
+
declare function testPipelineRendering(name: string, createPipeline: (device: GPUDevice) => GPURenderPipeline, setupGeometry: (device: GPUDevice) => GeometryBuffers, expectedOutput?: Uint8ClampedArray): Promise<void>;
|
|
1713
|
+
/**
|
|
1714
|
+
* Template for testing compute shaders
|
|
1715
|
+
*/
|
|
1716
|
+
declare function testComputeShader(name: string, createComputePipeline: (device: GPUDevice) => GPUComputePipeline, inputData: Float32Array, expectedOutput?: Float32Array): Promise<void>;
|
|
1717
|
+
|
|
1718
|
+
/**
|
|
1719
|
+
* Client Input System Mocks
|
|
1720
|
+
*
|
|
1721
|
+
* Provides utilities for simulating user input (keyboard, mouse, pointer lock)
|
|
1722
|
+
* in a test environment (JSDOM/Browser).
|
|
1723
|
+
*/
|
|
1724
|
+
interface KeyModifiers {
|
|
1725
|
+
ctrl?: boolean;
|
|
1726
|
+
alt?: boolean;
|
|
1727
|
+
shift?: boolean;
|
|
1728
|
+
meta?: boolean;
|
|
1729
|
+
}
|
|
1730
|
+
/**
|
|
1731
|
+
* Factory for creating a mock KeyboardEvent.
|
|
1732
|
+
*/
|
|
1733
|
+
declare function createMockKeyboardEvent(key: string, type?: 'keydown' | 'keyup', modifiers?: KeyModifiers): KeyboardEvent;
|
|
1734
|
+
/**
|
|
1735
|
+
* Factory for creating a mock MouseEvent with support for movementX/Y.
|
|
1736
|
+
*/
|
|
1737
|
+
declare function createMockMouseEvent(type: string, options?: MouseEventInit): MouseEvent;
|
|
1738
|
+
/**
|
|
1739
|
+
* Factory for creating a mock WheelEvent.
|
|
1740
|
+
*/
|
|
1741
|
+
declare function createMockWheelEvent(deltaX?: number, deltaY?: number): WheelEvent;
|
|
1742
|
+
/**
|
|
1743
|
+
* Class implementing a mock for the Pointer Lock API.
|
|
1744
|
+
* Handles patching the document and element prototypes to simulate pointer lock.
|
|
1745
|
+
*/
|
|
1746
|
+
declare class MockPointerLock {
|
|
1747
|
+
private _doc;
|
|
1748
|
+
constructor(doc?: Document);
|
|
1749
|
+
private setup;
|
|
1750
|
+
get element(): Element | null;
|
|
1751
|
+
get locked(): boolean;
|
|
1752
|
+
request(element: HTMLElement): void;
|
|
1753
|
+
exit(): void;
|
|
1754
|
+
isLocked(): boolean;
|
|
1755
|
+
}
|
|
1756
|
+
/**
|
|
1757
|
+
* Class for simulating input events.
|
|
1758
|
+
*/
|
|
1759
|
+
declare class InputInjector {
|
|
1760
|
+
private doc;
|
|
1761
|
+
private win;
|
|
1762
|
+
constructor(doc?: Document, win?: Window);
|
|
1763
|
+
keyDown(key: string, code?: string, modifiers?: KeyModifiers): void;
|
|
1764
|
+
keyUp(key: string, code?: string, modifiers?: KeyModifiers): void;
|
|
1765
|
+
mouseMove(movementX: number, movementY: number, clientX?: number, clientY?: number): void;
|
|
1766
|
+
mouseButton(button: number, state?: 'down' | 'up'): void;
|
|
1767
|
+
mouseDown(button?: number): void;
|
|
1768
|
+
mouseUp(button?: number): void;
|
|
1769
|
+
mouseWheel(deltaY: number): void;
|
|
1770
|
+
wheel(deltaY: number): void;
|
|
1771
|
+
private dispatchToTarget;
|
|
1772
|
+
}
|
|
1773
|
+
/**
|
|
1774
|
+
* An implementation of InputSource that listens to DOM events.
|
|
1775
|
+
* Useful for tests that want to verify interaction with real/mocked DOM events.
|
|
1776
|
+
*/
|
|
1777
|
+
declare class BrowserInputSource {
|
|
1778
|
+
private target;
|
|
1779
|
+
constructor(target?: EventTarget);
|
|
1780
|
+
on(event: string, handler: Function): void;
|
|
1781
|
+
}
|
|
1782
|
+
/**
|
|
1783
|
+
* Factory for creating a MockPointerLock instance.
|
|
1784
|
+
*/
|
|
1785
|
+
declare function createMockPointerLock(element?: HTMLElement): MockPointerLock;
|
|
1786
|
+
/**
|
|
1787
|
+
* Factory for creating an InputInjector.
|
|
1788
|
+
*/
|
|
1789
|
+
declare function createInputInjector(target?: EventTarget): InputInjector;
|
|
1790
|
+
|
|
1791
|
+
interface RefDef {
|
|
1792
|
+
x: number;
|
|
1793
|
+
y: number;
|
|
1794
|
+
width: number;
|
|
1795
|
+
height: number;
|
|
1796
|
+
fov_x: number;
|
|
1797
|
+
fov_y: number;
|
|
1798
|
+
vieworg: vec3;
|
|
1799
|
+
viewangles: vec3;
|
|
1800
|
+
time: number;
|
|
1801
|
+
rdflags: number;
|
|
1802
|
+
}
|
|
1803
|
+
interface ViewState {
|
|
1804
|
+
camera: Camera;
|
|
1805
|
+
viewport: {
|
|
1806
|
+
x: number;
|
|
1807
|
+
y: number;
|
|
1808
|
+
width: number;
|
|
1809
|
+
height: number;
|
|
1810
|
+
};
|
|
1811
|
+
refdef: RefDef;
|
|
1812
|
+
}
|
|
1813
|
+
interface ViewScenario {
|
|
1814
|
+
viewState: ViewState;
|
|
1815
|
+
cleanup: () => void;
|
|
1816
|
+
}
|
|
1817
|
+
interface CameraInput {
|
|
1818
|
+
forward?: number;
|
|
1819
|
+
right?: number;
|
|
1820
|
+
up?: number;
|
|
1821
|
+
pitchDelta?: number;
|
|
1822
|
+
yawDelta?: number;
|
|
1823
|
+
rollDelta?: number;
|
|
1824
|
+
}
|
|
1825
|
+
interface DemoCameraResult {
|
|
1826
|
+
origin: Vec3;
|
|
1827
|
+
angles: Vec3;
|
|
1828
|
+
fov: number;
|
|
1829
|
+
}
|
|
1830
|
+
/**
|
|
1831
|
+
* Creates a mock Camera instance with optional overrides.
|
|
1832
|
+
* Accepts partial Camera properties, where position/angles can be Vec3 objects or arrays.
|
|
1833
|
+
*/
|
|
1834
|
+
declare function createMockCamera(overrides?: Partial<Omit<Camera, 'position' | 'angles'> & {
|
|
1835
|
+
position: any;
|
|
1836
|
+
angles: any;
|
|
1837
|
+
}>): Camera;
|
|
1838
|
+
/**
|
|
1839
|
+
* Creates a mock Demo Camera state result (for getDemoCamera mock).
|
|
1840
|
+
* This returns a structure using Vec3 interface compatible with angleVectors, unlike Camera class.
|
|
1841
|
+
*/
|
|
1842
|
+
declare function createMockDemoCameraResult(overrides?: Partial<DemoCameraResult>): DemoCameraResult;
|
|
1843
|
+
/**
|
|
1844
|
+
* Creates a mock RefDef object.
|
|
1845
|
+
*/
|
|
1846
|
+
declare function createMockRefDef(overrides?: Partial<RefDef>): RefDef;
|
|
1847
|
+
/**
|
|
1848
|
+
* Creates a mock ViewState object.
|
|
1849
|
+
*/
|
|
1850
|
+
declare function createMockViewState(overrides?: Partial<ViewState>): ViewState;
|
|
1851
|
+
/**
|
|
1852
|
+
* Creates a pre-configured view test scenario.
|
|
1853
|
+
*/
|
|
1854
|
+
declare function createViewTestScenario(scenarioType: 'firstPerson' | 'thirdPerson' | 'spectator'): ViewScenario;
|
|
1855
|
+
/**
|
|
1856
|
+
* Simulates camera movement based on input delta.
|
|
1857
|
+
* This is a helper to verify camera logic, not a replacement for full physics.
|
|
1858
|
+
*/
|
|
1859
|
+
declare function simulateCameraMovement(camera: Camera, input: CameraInput, deltaTime: number): Camera;
|
|
1860
|
+
|
|
1861
|
+
interface HudState {
|
|
1862
|
+
ps: PlayerState;
|
|
1863
|
+
client: PlayerClient;
|
|
1864
|
+
health: number;
|
|
1865
|
+
armor: number;
|
|
1866
|
+
ammo: number;
|
|
1867
|
+
stats: number[];
|
|
1868
|
+
pickupIcon?: string;
|
|
1869
|
+
damageIndicators?: any[];
|
|
1870
|
+
renderStats?: FrameRenderStats;
|
|
1871
|
+
timeMs: number;
|
|
1872
|
+
messages: any;
|
|
1873
|
+
}
|
|
1874
|
+
declare function createMockHudState(overrides?: Partial<HudState>): HudState;
|
|
1875
|
+
declare function createMockScoreboard(players?: any[]): any;
|
|
1876
|
+
interface MockChatMessage {
|
|
1877
|
+
text: string;
|
|
1878
|
+
sender?: string;
|
|
1879
|
+
timestamp?: number;
|
|
1880
|
+
}
|
|
1881
|
+
declare function createMockChatMessage(text: string, sender?: string, timestamp?: number): MockChatMessage;
|
|
1882
|
+
interface MockNotification {
|
|
1883
|
+
type: string;
|
|
1884
|
+
message: string;
|
|
1885
|
+
duration?: number;
|
|
1886
|
+
}
|
|
1887
|
+
declare function createMockNotification(type: string, message: string, duration?: number): MockNotification;
|
|
1888
|
+
|
|
1889
|
+
/**
|
|
1890
|
+
* Mocks a server message by just providing the type and data buffer.
|
|
1891
|
+
* In a real scenario, this would be constructing a binary packet.
|
|
1892
|
+
*/
|
|
1893
|
+
interface MockServerMessage {
|
|
1894
|
+
type: number;
|
|
1895
|
+
data: Uint8Array;
|
|
1896
|
+
}
|
|
1897
|
+
declare function createMockServerMessage(type: number, data?: Uint8Array): MockServerMessage;
|
|
1898
|
+
/**
|
|
1899
|
+
* Creates a mock Snapshot (FrameData) for testing.
|
|
1900
|
+
*/
|
|
1901
|
+
declare function createMockSnapshot(serverFrame: number, entities?: EntityState$1[], playerState?: Partial<ProtocolPlayerState$1>, deltaFrame?: number): FrameData;
|
|
1902
|
+
/**
|
|
1903
|
+
* Creates a mock Delta Frame (FrameData with delta flag).
|
|
1904
|
+
*/
|
|
1905
|
+
declare function createMockDeltaFrame(serverFrame: number, deltaFrame: number, entities?: EntityState$1[], playerState?: Partial<ProtocolPlayerState$1>): FrameData;
|
|
1906
|
+
/**
|
|
1907
|
+
* Simulates network delay for a sequence of messages.
|
|
1908
|
+
*/
|
|
1909
|
+
declare function simulateNetworkDelay<T>(messages: T[], delayMs: number): Promise<T[]>;
|
|
1910
|
+
/**
|
|
1911
|
+
* Simulates packet loss by randomly filtering messages.
|
|
1912
|
+
* @param messages The messages to process
|
|
1913
|
+
* @param lossPercent Percentage of packet loss (0-100)
|
|
1914
|
+
*/
|
|
1915
|
+
declare function simulatePacketLoss<T>(messages: T[], lossPercent: number): T[];
|
|
1916
|
+
/**
|
|
1917
|
+
* Factory for creating a mock EntityState.
|
|
1918
|
+
*/
|
|
1919
|
+
declare function createMockEntityState(number: number, modelIndex?: number, origin?: Partial<Vec3>, overrides?: Partial<EntityState$1>): EntityState$1;
|
|
1920
|
+
declare function createMockDamageIndicator(damage: number, dir?: Vec3, health?: boolean, armor?: boolean, power?: boolean): DamageIndicator;
|
|
1921
|
+
declare function createMockFogData(overrides?: Partial<FogData>): FogData;
|
|
1922
|
+
|
|
1923
|
+
interface DownloadManager {
|
|
1924
|
+
download(url: string): Promise<ArrayBuffer>;
|
|
1925
|
+
cancel(url: string): void;
|
|
1926
|
+
getProgress(url: string): number;
|
|
1927
|
+
}
|
|
1928
|
+
declare function createMockDownloadManager(overrides?: Partial<DownloadManager>): DownloadManager;
|
|
1929
|
+
interface PrecacheList {
|
|
1930
|
+
models: string[];
|
|
1931
|
+
sounds: string[];
|
|
1932
|
+
images: string[];
|
|
1933
|
+
}
|
|
1934
|
+
declare function createMockPrecacheList(models?: string[], sounds?: string[], images?: string[]): PrecacheList;
|
|
1935
|
+
declare function simulateDownload(url: string, progressCallback?: (percent: number) => void): Promise<ArrayBuffer>;
|
|
1936
|
+
|
|
1937
|
+
declare class MockClientConfigStrings {
|
|
1938
|
+
private readonly strings;
|
|
1939
|
+
private readonly models;
|
|
1940
|
+
private readonly sounds;
|
|
1941
|
+
private readonly images;
|
|
1942
|
+
constructor();
|
|
1943
|
+
set(index: number, value: string): void;
|
|
1944
|
+
get(index: number): string | undefined;
|
|
1945
|
+
getModelName(index: number): string | undefined;
|
|
1946
|
+
getSoundName(index: number): string | undefined;
|
|
1947
|
+
getImageName(index: number): string | undefined;
|
|
1948
|
+
getPlayerName(playernum: number): string | undefined;
|
|
1949
|
+
clear(): void;
|
|
1950
|
+
}
|
|
1951
|
+
interface ClientStateProvider {
|
|
1952
|
+
tickRate: number;
|
|
1953
|
+
frameTimeMs: number;
|
|
1954
|
+
serverFrame: number;
|
|
1955
|
+
serverProtocol: number;
|
|
1956
|
+
configStrings: MockClientConfigStrings;
|
|
1957
|
+
getClientName(num: number): string;
|
|
1958
|
+
getKeyBinding(key: string): string;
|
|
1959
|
+
inAutoDemo: boolean;
|
|
1960
|
+
}
|
|
1961
|
+
interface ClientInfo {
|
|
1962
|
+
name: string;
|
|
1963
|
+
skin: string;
|
|
1964
|
+
model: string;
|
|
1965
|
+
icon: string;
|
|
1966
|
+
}
|
|
1967
|
+
interface ClientState extends ClientStateProvider {
|
|
1968
|
+
playerNum: number;
|
|
1969
|
+
serverTime: number;
|
|
1970
|
+
parseEntities: number;
|
|
1971
|
+
}
|
|
1972
|
+
interface Frame {
|
|
1973
|
+
serverFrame: number;
|
|
1974
|
+
deltaFrame: number;
|
|
1975
|
+
valid: boolean;
|
|
1976
|
+
entities: EntityState[];
|
|
1977
|
+
}
|
|
1978
|
+
interface ConnectionState {
|
|
1979
|
+
state: 'disconnected' | 'connecting' | 'connected' | 'active';
|
|
1980
|
+
}
|
|
1981
|
+
declare const createMockClientState: (overrides?: Partial<ClientState>) => ClientState;
|
|
1982
|
+
declare const createMockFrame: (overrides?: Partial<Frame>) => Frame;
|
|
1983
|
+
declare const createMockClientInfo: (overrides?: Partial<ClientInfo>) => ClientInfo;
|
|
1984
|
+
declare const createMockConnectionState: (state?: ConnectionState["state"]) => ConnectionState;
|
|
1985
|
+
|
|
1986
|
+
interface MockConsole {
|
|
1987
|
+
print: (text: string) => void;
|
|
1988
|
+
error: (text: string) => void;
|
|
1989
|
+
execute: (text: string) => void;
|
|
1990
|
+
addCommand: (name: string, handler: (args: string[]) => void) => void;
|
|
1991
|
+
getCvar: (name: string) => string | undefined;
|
|
1992
|
+
setCvar: (name: string, value: string) => void;
|
|
1993
|
+
getHistory: () => string[];
|
|
1994
|
+
clearHistory: () => void;
|
|
1995
|
+
getErrors: () => string[];
|
|
1996
|
+
}
|
|
1997
|
+
interface MockCommand {
|
|
1998
|
+
name: string;
|
|
1999
|
+
handler: (args: string[]) => void;
|
|
2000
|
+
}
|
|
2001
|
+
interface CvarRegistry {
|
|
2002
|
+
[key: string]: string;
|
|
2003
|
+
}
|
|
2004
|
+
declare function createMockConsole(overrides?: Partial<MockConsole>): MockConsole;
|
|
2005
|
+
declare function createMockCommand(name: string, handler: (args: string[]) => void): MockCommand;
|
|
2006
|
+
declare function createMockCvarRegistry(initialCvars?: Record<string, string>): CvarRegistry;
|
|
2007
|
+
|
|
2008
|
+
interface PredictionScenario {
|
|
2009
|
+
clientState: ClientState;
|
|
2010
|
+
snapshots: EntityState[][];
|
|
2011
|
+
lagMs: number;
|
|
2012
|
+
}
|
|
2013
|
+
interface SmoothingAnalysis {
|
|
2014
|
+
smooth: boolean;
|
|
2015
|
+
maxError: number;
|
|
2016
|
+
averageError: number;
|
|
2017
|
+
jumps: number[];
|
|
2018
|
+
}
|
|
2019
|
+
declare const createPredictionTestScenario: (lagMs?: number) => PredictionScenario;
|
|
2020
|
+
declare const simulateClientPrediction: (state: ClientState, input: UserCommand, deltaTime: number) => ClientState;
|
|
2021
|
+
declare const createInterpolationTestData: (startState: EntityState, endState: EntityState, steps?: number) => EntityState[];
|
|
2022
|
+
declare const verifySmoothing: (states: EntityState[]) => SmoothingAnalysis;
|
|
2023
|
+
|
|
2024
|
+
interface CaptureOptions {
|
|
2025
|
+
width: number;
|
|
2026
|
+
height: number;
|
|
2027
|
+
format?: GPUTextureFormat;
|
|
2028
|
+
}
|
|
2029
|
+
declare function captureFramebufferAsPNG(device: GPUDevice, texture: GPUTexture, options: CaptureOptions): Promise<Buffer>;
|
|
2030
|
+
declare function savePNG(pixels: Uint8ClampedArray, width: number, height: number, filepath: string): Promise<void>;
|
|
2031
|
+
declare function loadPNG(filepath: string): Promise<{
|
|
2032
|
+
data: Uint8ClampedArray;
|
|
2033
|
+
width: number;
|
|
2034
|
+
height: number;
|
|
2035
|
+
}>;
|
|
2036
|
+
interface ComparisonResult {
|
|
2037
|
+
pixelsDifferent: number;
|
|
2038
|
+
totalPixels: number;
|
|
2039
|
+
percentDifferent: number;
|
|
2040
|
+
passed: boolean;
|
|
2041
|
+
diffImage?: Uint8ClampedArray;
|
|
2042
|
+
}
|
|
2043
|
+
interface ComparisonOptions {
|
|
2044
|
+
threshold?: number;
|
|
2045
|
+
includeAA?: boolean;
|
|
2046
|
+
diffColor?: [number, number, number];
|
|
2047
|
+
maxDifferencePercent?: number;
|
|
2048
|
+
}
|
|
2049
|
+
declare function compareSnapshots(actual: Uint8ClampedArray, expected: Uint8ClampedArray, width: number, height: number, options?: ComparisonOptions): Promise<ComparisonResult>;
|
|
2050
|
+
interface SnapshotTestOptions extends ComparisonOptions {
|
|
2051
|
+
name: string;
|
|
2052
|
+
width?: number;
|
|
2053
|
+
height?: number;
|
|
2054
|
+
updateBaseline?: boolean;
|
|
2055
|
+
snapshotDir?: string;
|
|
2056
|
+
}
|
|
2057
|
+
declare function getSnapshotPath(name: string, type: 'baseline' | 'actual' | 'diff', snapshotDir?: string): string;
|
|
2058
|
+
declare function expectSnapshot(pixels: Uint8ClampedArray, options: SnapshotTestOptions): Promise<void>;
|
|
2059
|
+
declare function renderAndExpectSnapshot(setup: RenderTestSetup, renderFn: (pass: GPURenderPassEncoder) => void, options: Omit<SnapshotTestOptions, 'width' | 'height'>): Promise<void>;
|
|
2060
|
+
|
|
2061
|
+
interface PlaywrightOptions {
|
|
2062
|
+
headless?: boolean;
|
|
2063
|
+
viewport?: {
|
|
2064
|
+
width: number;
|
|
2065
|
+
height: number;
|
|
2066
|
+
};
|
|
2067
|
+
}
|
|
2068
|
+
interface PlaywrightTestClient {
|
|
2069
|
+
page: any;
|
|
2070
|
+
browser: any;
|
|
2071
|
+
navigate(url: string): Promise<void>;
|
|
2072
|
+
waitForGame(): Promise<void>;
|
|
2073
|
+
injectInput(type: string, data: any): Promise<void>;
|
|
2074
|
+
screenshot(name: string): Promise<Buffer>;
|
|
2075
|
+
close(): Promise<void>;
|
|
2076
|
+
}
|
|
2077
|
+
/**
|
|
2078
|
+
* Creates a Playwright test client.
|
|
2079
|
+
* Note: Requires playwright to be installed in the project.
|
|
2080
|
+
*/
|
|
2081
|
+
declare function createPlaywrightTestClient(options?: PlaywrightOptions): Promise<PlaywrightTestClient>;
|
|
2082
|
+
/**
|
|
2083
|
+
* Waits for the game to be ready.
|
|
2084
|
+
*/
|
|
2085
|
+
declare function waitForGameReady(page: any, timeout?: number): Promise<void>;
|
|
2086
|
+
interface GameStateCapture {
|
|
2087
|
+
time: number;
|
|
2088
|
+
entities: number;
|
|
2089
|
+
}
|
|
2090
|
+
/**
|
|
2091
|
+
* Captures current game state from the browser.
|
|
2092
|
+
*/
|
|
2093
|
+
declare function captureGameState(page: any): Promise<GameStateCapture>;
|
|
2094
|
+
|
|
2095
|
+
type NetworkCondition = 'good' | 'slow' | 'unstable' | 'offline' | 'custom';
|
|
2096
|
+
interface NetworkSimulator {
|
|
2097
|
+
latency: number;
|
|
2098
|
+
jitter: number;
|
|
2099
|
+
packetLoss: number;
|
|
2100
|
+
bandwidth: number;
|
|
2101
|
+
}
|
|
2102
|
+
/**
|
|
2103
|
+
* Simulates network conditions.
|
|
2104
|
+
*/
|
|
2105
|
+
declare function simulateNetworkCondition(condition: NetworkCondition): NetworkSimulator;
|
|
2106
|
+
/**
|
|
2107
|
+
* Creates a custom network condition.
|
|
2108
|
+
*/
|
|
2109
|
+
declare function createCustomNetworkCondition(latency: number, jitter: number, packetLoss: number): NetworkSimulator;
|
|
2110
|
+
/**
|
|
2111
|
+
* Helper to throttle bandwidth (e.g. for Playwright).
|
|
2112
|
+
*/
|
|
2113
|
+
declare function throttleBandwidth(bytesPerSecond: number): void;
|
|
2114
|
+
|
|
2115
|
+
interface VisualDiff {
|
|
2116
|
+
diffPercentage: number;
|
|
2117
|
+
diffImage?: Buffer;
|
|
2118
|
+
}
|
|
2119
|
+
/**
|
|
2120
|
+
* Captures a screenshot of the game using Playwright.
|
|
2121
|
+
* @param page Playwright Page object
|
|
2122
|
+
* @param name Output filename (without extension)
|
|
2123
|
+
*/
|
|
2124
|
+
declare function captureGameScreenshot(page: any, name: string): Promise<Buffer>;
|
|
2125
|
+
/**
|
|
2126
|
+
* Saves a canvas to a PNG file.
|
|
2127
|
+
* Compatible with both JSDOM/HTMLCanvasElement and @napi-rs/canvas.
|
|
2128
|
+
*/
|
|
2129
|
+
declare function takeScreenshot(canvas: Canvas | HTMLCanvasElement, filepath: string): Promise<void>;
|
|
2130
|
+
/**
|
|
2131
|
+
* Compares a canvas state against a baseline image file.
|
|
2132
|
+
* Returns true if they match (within optional threshold logic, currently strict pixel match).
|
|
2133
|
+
* If baseline does not exist, it saves the current state as baseline and returns true.
|
|
2134
|
+
*/
|
|
2135
|
+
declare function compareScreenshot(canvas: Canvas | HTMLCanvasElement, baselinePath: string): Promise<boolean>;
|
|
2136
|
+
/**
|
|
2137
|
+
* Compares two screenshots (Buffers).
|
|
2138
|
+
* Uses simple buffer check. Kept for backward compatibility or direct buffer comparison.
|
|
2139
|
+
*/
|
|
2140
|
+
declare function compareScreenshots(baseline: Buffer, current: Buffer, threshold?: number): VisualDiff;
|
|
2141
|
+
interface VisualScenario {
|
|
2142
|
+
sceneName: string;
|
|
2143
|
+
setup: () => Promise<void>;
|
|
2144
|
+
}
|
|
2145
|
+
/**
|
|
2146
|
+
* Creates a visual test scenario.
|
|
2147
|
+
*/
|
|
2148
|
+
declare function createVisualTestScenario(sceneName: string): VisualScenario;
|
|
2149
|
+
|
|
2150
|
+
export { type AudioEvent, type BandwidthScenario, type BinaryStreamMock, type BinaryWriterMock, BrowserInputSource, type BrowserSetupOptions, type CameraInput, type CaptureOptions, type ClientInfo, type ClientState, type ClientStateProvider, type ComparisonOptions, type ComparisonResult, type ComputeTestSetup, type Connection, type ConnectionState, type ConsistencyReport, type ControlledTimer, type CvarRegistry, type DeltaSnapshot, type DemoCameraResult, type DownloadManager, type DrawCall, FakeAudioContext, FakeAudioNode, FakeAudioParam, FakeBiquadFilterNode, FakeBufferSource, FakeDestination, FakeGainNode, FakePannerNode, type Frame, type GameState, type GameStateCapture, type GeometryBuffers, type Handshake, HandshakeStage, type HeadlessWebGPUSetup, type HudState, InputInjector, type KeyModifiers, type LevelFrameState, type Lightmap, type MasterServer, type Message, type MessageReaderMock, type MessageWriterMock, type MockAI, FakeBufferSource as MockAudioBufferSourceNode, type MockChatMessage, MockClientConfigStrings, type MockCollisionEntityIndex, type MockCommand, type MockConsole, type MockDamageInfo, type MockEngine, type MockGame, type MockMonsterAI, MockNetDriver, type MockNetDriverState, MockNetworkTransport, type MockNotification, type MockParticle, type MockParticleEmitter, MockPointerLock, type MockRAF, type MockRConClient, type MockRenderingContext, type MockSaveGame, type MockServer, type MockServerConsole, type MockServerContext, type MockServerMessage, MockTransport, type MockUDPSocket, MockWebGL2RenderingContext, type MockWebGPUContext, type MultiplayerScenario, type NetworkAddress, type NetworkCondition, type NetworkSimulator, type NodeSetupOptions, type PacketMock, type PhysicsScenario, type PlaywrightOptions, type PlaywrightTestClient, type PrecacheList, type PredictionScenario, type RateLimiter, type RecordedPacket, type RefDef, type RenderTestSetup, type SaveGameDiff, type ServerInfo, type ServerListFilter, type SmoothingAnalysis, type Snapshot, type SnapshotTestOptions, type StorageScenario, type SurfaceMock, type TestContext, type TraceMock, type Transform, type UserInfo, type ViewScenario, type ViewState, type VisualDiff, type VisualScenario, type WebGPUContextState, captureAudioEvents, captureCanvasDrawCalls, captureFramebufferAsPNG, captureGameScreenshot, captureGameState, captureTexture, compareSaveGames, compareScreenshot, compareScreenshots, compareSnapshots, createBandwidthTestScenario, createBinaryStreamMock, createBinaryWriterMock, createBounds, createCombatTestContext, createComputeTestSetup, createConfigStringArrayMock, createConfigStringMock, createControlledTimer, createCustomNetworkCondition, createCvarMock, createDeltaSnapshot, createEntity, createEntityFactory, createEntityStateFactory, createGameImportsAndEngine, createGameStateSnapshotFactory, createHeadlessTestContext, createInputInjector, createInterpolationTestData, createItemEntityFactory, createMessageReaderMock, createMessageWriterMock, createMockAI, createMockAmmoItem, createMockArmorItem, createMockAssetManager, createMockAudioBuffer, createMockAudioContext, createMockBspMap, createMockBspPipeline, createMockBufferSource, createMockCamera, createMockCanvas, createMockCanvasContext2D, createMockChatMessage, createMockClientInfo, createMockClientState, createMockCollisionEntityIndex, createMockCommand, createMockCommandEncoder, createMockComputePassEncoder, createMockComputePipeline, createMockConnection, createMockConnectionState, createMockConsole, createMockCvarRegistry, createMockDLight, createMockDLightManager, createMockDamageIndicator, createMockDamageInfo, createMockDeltaFrame, createMockDemoCameraResult, createMockDownloadManager, createMockEngine, createMockEntityState, createMockFogData, createMockFrame, createMockFrameRenderer, createMockGPUAdapter, createMockGPUBuffer, createMockGPUDevice, createMockGPUTexture, createMockGame, createMockGameExports, createMockGameState, createMockHandshake, createMockHealthItem, createMockHudState, createMockImage, createMockImageData, createMockIndexBuffer, createMockIndexedDB, createMockInventory, createMockItem, createMockKeyboardEvent, createMockLightmap, createMockLocalStorage, createMockMasterServer, createMockMd2Model, createMockMd2Pipeline, createMockMd3Model, createMockMd3Pipeline, createMockMonsterAI, createMockMonsterMove, createMockMouseEvent, createMockNetDriver, createMockNetworkAddress, createMockNotification, createMockPannerNode, createMockParticle, createMockParticleEmitter, createMockParticleSystem, createMockPerformance, createMockPlayerState, createMockPointerLock, createMockPowerupItem, createMockPrecacheList, createMockQueue, createMockRAF, createMockRConClient, createMockRateLimiter, createMockRefDef, createMockRenderPassEncoder, createMockRenderPipeline, createMockRenderer, createMockRenderingContext, createMockSampler, createMockSaveGame, createMockScoreboard, createMockServer, createMockServerClient, createMockServerConsole, createMockServerInfo, createMockServerMessage, createMockServerState, createMockServerStatic, createMockSessionStorage, createMockShader, createMockShaderModule, createMockShaderProgram, createMockSkyboxPipeline, createMockSnapshot, createMockSpritePipeline, createMockTexture, createMockTextureView, createMockTransport, createMockUDPSocket, createMockUserInfo, createMockVertexBuffer, createMockViewState, createMockWeapon, createMockWeaponItem, createMockWebGL2Context, createMockWebGPUContext, createMockWheelEvent, createMonsterEntityFactory, createMultiplayerTestScenario, createNetChanMock, createPacketMock, createPhysicsTestContext, createPhysicsTestScenario, createPlayerEntityFactory, createPlayerStateFactory, createPlaywrightTestClient, createPredictionTestScenario, createProjectileEntityFactory, createRenderTestSetup, createSaveGameSnapshot, createServerSnapshot, createSpawnTestContext, createStorageTestScenario, createSurfaceMock, createTestContext, createTraceMock, createTransform, createTriggerEntityFactory, createVector3, createViewTestScenario, createVisualTestScenario, expectSnapshot, findPakFile, getSnapshotPath, initHeadlessWebGPU, loadMapFromPak, loadPNG, makeAxisBrush, makeBrushFromMinsMaxs, makeBspModel, makeLeaf, makeLeafModel, makeNode, makePlane, measureSnapshotSize, mockMonsterAttacks, parseProtocolPlayerState, randomVector3, renderAndCapture, renderAndExpectSnapshot, restoreSaveGameSnapshot, runComputeAndReadback, savePNG, serializeUserInfo, setupBrowserEnvironment, setupMockAudioContext, setupNodeEnvironment, setupWebGPUMocks, simulateBandwidthLimit, simulateCameraMovement, simulateClientPrediction, simulateDownload, simulateFrames, simulateGravity, simulateHandshake, simulateJump, simulateMovement, simulateNetworkCondition, simulateNetworkDelay, simulatePacketLoss, simulatePlayerInput, simulatePlayerJoin, simulatePlayerLeave, simulateServerCommand, simulateServerRegistration, simulateServerTick, simulateSnapshotDelivery, takeScreenshot, teardownBrowserEnvironment, teardownMockAudioContext, teardownNodeEnvironment, testComputeShader, testPipelineRendering, throttleBandwidth, verifySmoothing, verifySnapshotConsistency, waitForGameReady };
|