@quake2ts/test-utils 0.0.776 → 0.0.778

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -9,8 +9,8 @@ export { ConfigStringEntry, Cvar, DLight, DynamicLightManager, IndexBuffer, Part
9
9
  import { GameStateSnapshot, Entity, ScriptHookRegistry, SpawnContext, EntitySystem, SpawnRegistry, GameSaveFile, LevelState, MonsterMove, DamageMod, PlayerInventory, BaseItem, WeaponId, WeaponItem, HealthItem, ArmorItem, AmmoItemId, PowerupItem, PlayerClient } from '@quake2ts/game';
10
10
  import { NetworkTransport, Server, ServerStatic, Client, ClientState as ClientState$1, ClientFrame } from '@quake2ts/server';
11
11
  import { ImageData, Canvas } from '@napi-rs/canvas';
12
+ import { Browser, BrowserContext, Page } from 'playwright';
12
13
  import { vec3 } from 'gl-matrix';
13
- import { Page } from 'playwright';
14
14
 
15
15
  /**
16
16
  * Interface for the BinaryWriter mock.
@@ -1759,6 +1759,104 @@ declare function createWebGLRenderTestSetup(width?: number, height?: number): Pr
1759
1759
  */
1760
1760
  declare function renderAndCaptureWebGL(setup: WebGLRenderTestSetup, renderFn: (gl: WebGL2RenderingContext) => void): Promise<Uint8ClampedArray>;
1761
1761
 
1762
+ interface CaptureOptions {
1763
+ width: number;
1764
+ height: number;
1765
+ format?: GPUTextureFormat;
1766
+ }
1767
+ declare function captureFramebufferAsPNG(device: GPUDevice, texture: GPUTexture, options: CaptureOptions): Promise<Buffer>;
1768
+ declare function savePNG(pixels: Uint8ClampedArray, width: number, height: number, filepath: string): Promise<void>;
1769
+ declare function loadPNG(filepath: string): Promise<{
1770
+ data: Uint8ClampedArray;
1771
+ width: number;
1772
+ height: number;
1773
+ }>;
1774
+ interface ComparisonResult {
1775
+ pixelsDifferent: number;
1776
+ totalPixels: number;
1777
+ percentDifferent: number;
1778
+ passed: boolean;
1779
+ diffImage?: Uint8ClampedArray;
1780
+ }
1781
+ interface ComparisonOptions {
1782
+ threshold?: number;
1783
+ includeAA?: boolean;
1784
+ diffColor?: [number, number, number];
1785
+ maxDifferencePercent?: number;
1786
+ }
1787
+ declare function compareSnapshots(actual: Uint8ClampedArray, expected: Uint8ClampedArray, width: number, height: number, options?: ComparisonOptions): Promise<ComparisonResult>;
1788
+ interface SnapshotTestOptions extends ComparisonOptions {
1789
+ name: string;
1790
+ description?: string;
1791
+ width?: number;
1792
+ height?: number;
1793
+ updateBaseline?: boolean;
1794
+ snapshotDir?: string;
1795
+ }
1796
+ declare function getSnapshotPath(name: string, type: 'baseline' | 'actual' | 'diff', snapshotDir?: string): string;
1797
+ declare function expectSnapshot(pixels: Uint8ClampedArray, options: SnapshotTestOptions): Promise<void>;
1798
+ declare function renderAndExpectSnapshot(setup: RenderTestSetup, renderFn: (pass: GPURenderPassEncoder) => void, options: Omit<SnapshotTestOptions, 'width' | 'height'>): Promise<void>;
1799
+
1800
+ /**
1801
+ * Playwright-based WebGL testing utilities for quake2ts renderer
1802
+ *
1803
+ * Provides helpers for running WebGL visual tests in a real browser using Playwright.
1804
+ * Loads the actual built renderer code via a static server, similar to e2e-tests.
1805
+ */
1806
+
1807
+ interface WebGLPlaywrightSetup {
1808
+ browser: Browser;
1809
+ context: BrowserContext;
1810
+ page: Page;
1811
+ width: number;
1812
+ height: number;
1813
+ server?: any;
1814
+ cleanup: () => Promise<void>;
1815
+ }
1816
+ interface WebGLPlaywrightOptions {
1817
+ width?: number;
1818
+ height?: number;
1819
+ headless?: boolean;
1820
+ }
1821
+ /**
1822
+ * Creates a Playwright-based WebGL test setup with the actual quake2ts renderer.
1823
+ * Starts a static server, loads the built renderer bundle, and provides a clean testing environment.
1824
+ */
1825
+ declare function createWebGLPlaywrightSetup(options?: WebGLPlaywrightOptions): Promise<WebGLPlaywrightSetup>;
1826
+ /**
1827
+ * Executes a rendering function using the actual quake2ts renderer and captures the result.
1828
+ * This must happen in a single page.evaluate() call to preserve WebGL state.
1829
+ *
1830
+ * @param page - Playwright page
1831
+ * @param renderFn - Function code as string that uses window.testRenderer
1832
+ * @returns Captured pixel data
1833
+ */
1834
+ declare function renderAndCaptureWebGLPlaywright(page: Page, renderFn: string): Promise<Uint8ClampedArray>;
1835
+ /**
1836
+ * Runs a WebGL visual test with the actual quake2ts renderer.
1837
+ *
1838
+ * Usage:
1839
+ * ```ts
1840
+ * await testWebGLRenderer(`
1841
+ * // Clear background
1842
+ * gl.clearColor(0, 0, 0, 1);
1843
+ * gl.clear(gl.COLOR_BUFFER_BIT);
1844
+ *
1845
+ * // Use renderer API
1846
+ * renderer.begin2D();
1847
+ * renderer.drawfillRect(64, 64, 128, 128, [0, 0, 1, 1]);
1848
+ * renderer.end2D();
1849
+ * `, {
1850
+ * name: 'blue-rect',
1851
+ * description: 'Blue rectangle test',
1852
+ * width: 256,
1853
+ * height: 256,
1854
+ * snapshotDir: __dirname
1855
+ * });
1856
+ * ```
1857
+ */
1858
+ declare function testWebGLRenderer(renderCode: string, options: SnapshotTestOptions & WebGLPlaywrightOptions): Promise<void>;
1859
+
1762
1860
  interface GeometryBuffers {
1763
1861
  vertexBuffer: GPUBuffer;
1764
1862
  indexBuffer?: GPUBuffer;
@@ -2089,43 +2187,18 @@ declare const simulateClientPrediction: (state: ClientState, input: UserCommand,
2089
2187
  declare const createInterpolationTestData: (startState: EntityState, endState: EntityState, steps?: number) => EntityState[];
2090
2188
  declare const verifySmoothing: (states: EntityState[]) => SmoothingAnalysis;
2091
2189
 
2092
- interface CaptureOptions {
2093
- width: number;
2094
- height: number;
2095
- format?: GPUTextureFormat;
2190
+ interface AnimationSnapshotOptions extends SnapshotTestOptions {
2191
+ frameCount: number;
2192
+ fps?: number;
2096
2193
  }
2097
- declare function captureFramebufferAsPNG(device: GPUDevice, texture: GPUTexture, options: CaptureOptions): Promise<Buffer>;
2098
- declare function savePNG(pixels: Uint8ClampedArray, width: number, height: number, filepath: string): Promise<void>;
2099
- declare function loadPNG(filepath: string): Promise<{
2100
- data: Uint8ClampedArray;
2101
- width: number;
2102
- height: number;
2103
- }>;
2104
- interface ComparisonResult {
2105
- pixelsDifferent: number;
2194
+ interface AnimationSnapshotResult {
2195
+ passed: boolean;
2106
2196
  totalPixels: number;
2197
+ totalDiffPixels: number;
2107
2198
  percentDifferent: number;
2108
- passed: boolean;
2109
- diffImage?: Uint8ClampedArray;
2110
- }
2111
- interface ComparisonOptions {
2112
- threshold?: number;
2113
- includeAA?: boolean;
2114
- diffColor?: [number, number, number];
2115
- maxDifferencePercent?: number;
2199
+ frameStats: ComparisonResult[];
2116
2200
  }
2117
- declare function compareSnapshots(actual: Uint8ClampedArray, expected: Uint8ClampedArray, width: number, height: number, options?: ComparisonOptions): Promise<ComparisonResult>;
2118
- interface SnapshotTestOptions extends ComparisonOptions {
2119
- name: string;
2120
- description?: string;
2121
- width?: number;
2122
- height?: number;
2123
- updateBaseline?: boolean;
2124
- snapshotDir?: string;
2125
- }
2126
- declare function getSnapshotPath(name: string, type: 'baseline' | 'actual' | 'diff', snapshotDir?: string): string;
2127
- declare function expectSnapshot(pixels: Uint8ClampedArray, options: SnapshotTestOptions): Promise<void>;
2128
- declare function renderAndExpectSnapshot(setup: RenderTestSetup, renderFn: (pass: GPURenderPassEncoder) => void, options: Omit<SnapshotTestOptions, 'width' | 'height'>): Promise<void>;
2201
+ declare function expectAnimationSnapshot(renderAndCaptureFrame: (frameIndex: number) => Promise<Uint8ClampedArray>, options: AnimationSnapshotOptions): Promise<void>;
2129
2202
 
2130
2203
  interface PlaywrightOptions {
2131
2204
  headless?: boolean;
@@ -2208,4 +2281,4 @@ declare function compareScreenshots(baseline: Buffer, current: Buffer, threshold
2208
2281
  */
2209
2282
  declare function createVisualTestScenario(sceneName: string): VisualScenario;
2210
2283
 
2211
- 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 HeadlessWebGLContext, type HeadlessWebGLOptions, 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 WebGLRenderTestSetup, type WebGPUContextState, captureAudioEvents, captureCanvasDrawCalls, captureFramebufferAsPNG, captureGameScreenshot, captureGameState, captureTexture, captureWebGLFramebuffer, compareSaveGames, compareScreenshots, compareSnapshots, createBandwidthTestScenario, createBinaryStreamMock, createBinaryWriterMock, createBounds, createCheckerboardTexture, createCombatTestContext, createComputeTestSetup, createConfigStringArrayMock, createConfigStringMock, createControlledTimer, createCustomNetworkCondition, createCvarMock, createDeltaSnapshot, createEntity, createEntityFactory, createEntityStateFactory, createGameImportsAndEngine, createGameStateSnapshotFactory, createHeadlessTestContext, createHeadlessWebGL, 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, createSolidTexture, createSpawnTestContext, createStorageTestScenario, createSurfaceMock, createTestContext, createTraceMock, createTransform, createTriggerEntityFactory, createVector3, createViewTestScenario, createVisualTestScenario, createWebGLRenderTestSetup, expectSnapshot, findPakFile, flipPixelsVertically, getSnapshotPath, initHeadlessWebGPU, loadMapFromPak, loadPNG, makeAxisBrush, makeBrushFromMinsMaxs, makeBspModel, makeLeaf, makeLeafModel, makeNode, makePlane, measureSnapshotSize, mockMonsterAttacks, parseProtocolPlayerState, randomVector3, renderAndCapture, renderAndCaptureWebGL, 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, spawnEntity, takeScreenshot, teardownBrowserEnvironment, teardownMockAudioContext, teardownNodeEnvironment, testComputeShader, testPipelineRendering, throttleBandwidth, verifySmoothing, verifySnapshotConsistency, waitForGameReady };
2284
+ export { type AnimationSnapshotOptions, type AnimationSnapshotResult, 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 HeadlessWebGLContext, type HeadlessWebGLOptions, 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 WebGLPlaywrightOptions, type WebGLPlaywrightSetup, type WebGLRenderTestSetup, type WebGPUContextState, captureAudioEvents, captureCanvasDrawCalls, captureFramebufferAsPNG, captureGameScreenshot, captureGameState, captureTexture, captureWebGLFramebuffer, compareSaveGames, compareScreenshots, compareSnapshots, createBandwidthTestScenario, createBinaryStreamMock, createBinaryWriterMock, createBounds, createCheckerboardTexture, createCombatTestContext, createComputeTestSetup, createConfigStringArrayMock, createConfigStringMock, createControlledTimer, createCustomNetworkCondition, createCvarMock, createDeltaSnapshot, createEntity, createEntityFactory, createEntityStateFactory, createGameImportsAndEngine, createGameStateSnapshotFactory, createHeadlessTestContext, createHeadlessWebGL, 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, createSolidTexture, createSpawnTestContext, createStorageTestScenario, createSurfaceMock, createTestContext, createTraceMock, createTransform, createTriggerEntityFactory, createVector3, createViewTestScenario, createVisualTestScenario, createWebGLPlaywrightSetup, createWebGLRenderTestSetup, expectAnimationSnapshot, expectSnapshot, findPakFile, flipPixelsVertically, getSnapshotPath, initHeadlessWebGPU, loadMapFromPak, loadPNG, makeAxisBrush, makeBrushFromMinsMaxs, makeBspModel, makeLeaf, makeLeafModel, makeNode, makePlane, measureSnapshotSize, mockMonsterAttacks, parseProtocolPlayerState, randomVector3, renderAndCapture, renderAndCaptureWebGL, renderAndCaptureWebGLPlaywright, 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, spawnEntity, takeScreenshot, teardownBrowserEnvironment, teardownMockAudioContext, teardownNodeEnvironment, testComputeShader, testPipelineRendering, testWebGLRenderer, throttleBandwidth, verifySmoothing, verifySnapshotConsistency, waitForGameReady };
package/dist/index.d.ts CHANGED
@@ -9,8 +9,8 @@ export { ConfigStringEntry, Cvar, DLight, DynamicLightManager, IndexBuffer, Part
9
9
  import { GameStateSnapshot, Entity, ScriptHookRegistry, SpawnContext, EntitySystem, SpawnRegistry, GameSaveFile, LevelState, MonsterMove, DamageMod, PlayerInventory, BaseItem, WeaponId, WeaponItem, HealthItem, ArmorItem, AmmoItemId, PowerupItem, PlayerClient } from '@quake2ts/game';
10
10
  import { NetworkTransport, Server, ServerStatic, Client, ClientState as ClientState$1, ClientFrame } from '@quake2ts/server';
11
11
  import { ImageData, Canvas } from '@napi-rs/canvas';
12
+ import { Browser, BrowserContext, Page } from 'playwright';
12
13
  import { vec3 } from 'gl-matrix';
13
- import { Page } from 'playwright';
14
14
 
15
15
  /**
16
16
  * Interface for the BinaryWriter mock.
@@ -1759,6 +1759,104 @@ declare function createWebGLRenderTestSetup(width?: number, height?: number): Pr
1759
1759
  */
1760
1760
  declare function renderAndCaptureWebGL(setup: WebGLRenderTestSetup, renderFn: (gl: WebGL2RenderingContext) => void): Promise<Uint8ClampedArray>;
1761
1761
 
1762
+ interface CaptureOptions {
1763
+ width: number;
1764
+ height: number;
1765
+ format?: GPUTextureFormat;
1766
+ }
1767
+ declare function captureFramebufferAsPNG(device: GPUDevice, texture: GPUTexture, options: CaptureOptions): Promise<Buffer>;
1768
+ declare function savePNG(pixels: Uint8ClampedArray, width: number, height: number, filepath: string): Promise<void>;
1769
+ declare function loadPNG(filepath: string): Promise<{
1770
+ data: Uint8ClampedArray;
1771
+ width: number;
1772
+ height: number;
1773
+ }>;
1774
+ interface ComparisonResult {
1775
+ pixelsDifferent: number;
1776
+ totalPixels: number;
1777
+ percentDifferent: number;
1778
+ passed: boolean;
1779
+ diffImage?: Uint8ClampedArray;
1780
+ }
1781
+ interface ComparisonOptions {
1782
+ threshold?: number;
1783
+ includeAA?: boolean;
1784
+ diffColor?: [number, number, number];
1785
+ maxDifferencePercent?: number;
1786
+ }
1787
+ declare function compareSnapshots(actual: Uint8ClampedArray, expected: Uint8ClampedArray, width: number, height: number, options?: ComparisonOptions): Promise<ComparisonResult>;
1788
+ interface SnapshotTestOptions extends ComparisonOptions {
1789
+ name: string;
1790
+ description?: string;
1791
+ width?: number;
1792
+ height?: number;
1793
+ updateBaseline?: boolean;
1794
+ snapshotDir?: string;
1795
+ }
1796
+ declare function getSnapshotPath(name: string, type: 'baseline' | 'actual' | 'diff', snapshotDir?: string): string;
1797
+ declare function expectSnapshot(pixels: Uint8ClampedArray, options: SnapshotTestOptions): Promise<void>;
1798
+ declare function renderAndExpectSnapshot(setup: RenderTestSetup, renderFn: (pass: GPURenderPassEncoder) => void, options: Omit<SnapshotTestOptions, 'width' | 'height'>): Promise<void>;
1799
+
1800
+ /**
1801
+ * Playwright-based WebGL testing utilities for quake2ts renderer
1802
+ *
1803
+ * Provides helpers for running WebGL visual tests in a real browser using Playwright.
1804
+ * Loads the actual built renderer code via a static server, similar to e2e-tests.
1805
+ */
1806
+
1807
+ interface WebGLPlaywrightSetup {
1808
+ browser: Browser;
1809
+ context: BrowserContext;
1810
+ page: Page;
1811
+ width: number;
1812
+ height: number;
1813
+ server?: any;
1814
+ cleanup: () => Promise<void>;
1815
+ }
1816
+ interface WebGLPlaywrightOptions {
1817
+ width?: number;
1818
+ height?: number;
1819
+ headless?: boolean;
1820
+ }
1821
+ /**
1822
+ * Creates a Playwright-based WebGL test setup with the actual quake2ts renderer.
1823
+ * Starts a static server, loads the built renderer bundle, and provides a clean testing environment.
1824
+ */
1825
+ declare function createWebGLPlaywrightSetup(options?: WebGLPlaywrightOptions): Promise<WebGLPlaywrightSetup>;
1826
+ /**
1827
+ * Executes a rendering function using the actual quake2ts renderer and captures the result.
1828
+ * This must happen in a single page.evaluate() call to preserve WebGL state.
1829
+ *
1830
+ * @param page - Playwright page
1831
+ * @param renderFn - Function code as string that uses window.testRenderer
1832
+ * @returns Captured pixel data
1833
+ */
1834
+ declare function renderAndCaptureWebGLPlaywright(page: Page, renderFn: string): Promise<Uint8ClampedArray>;
1835
+ /**
1836
+ * Runs a WebGL visual test with the actual quake2ts renderer.
1837
+ *
1838
+ * Usage:
1839
+ * ```ts
1840
+ * await testWebGLRenderer(`
1841
+ * // Clear background
1842
+ * gl.clearColor(0, 0, 0, 1);
1843
+ * gl.clear(gl.COLOR_BUFFER_BIT);
1844
+ *
1845
+ * // Use renderer API
1846
+ * renderer.begin2D();
1847
+ * renderer.drawfillRect(64, 64, 128, 128, [0, 0, 1, 1]);
1848
+ * renderer.end2D();
1849
+ * `, {
1850
+ * name: 'blue-rect',
1851
+ * description: 'Blue rectangle test',
1852
+ * width: 256,
1853
+ * height: 256,
1854
+ * snapshotDir: __dirname
1855
+ * });
1856
+ * ```
1857
+ */
1858
+ declare function testWebGLRenderer(renderCode: string, options: SnapshotTestOptions & WebGLPlaywrightOptions): Promise<void>;
1859
+
1762
1860
  interface GeometryBuffers {
1763
1861
  vertexBuffer: GPUBuffer;
1764
1862
  indexBuffer?: GPUBuffer;
@@ -2089,43 +2187,18 @@ declare const simulateClientPrediction: (state: ClientState, input: UserCommand,
2089
2187
  declare const createInterpolationTestData: (startState: EntityState, endState: EntityState, steps?: number) => EntityState[];
2090
2188
  declare const verifySmoothing: (states: EntityState[]) => SmoothingAnalysis;
2091
2189
 
2092
- interface CaptureOptions {
2093
- width: number;
2094
- height: number;
2095
- format?: GPUTextureFormat;
2190
+ interface AnimationSnapshotOptions extends SnapshotTestOptions {
2191
+ frameCount: number;
2192
+ fps?: number;
2096
2193
  }
2097
- declare function captureFramebufferAsPNG(device: GPUDevice, texture: GPUTexture, options: CaptureOptions): Promise<Buffer>;
2098
- declare function savePNG(pixels: Uint8ClampedArray, width: number, height: number, filepath: string): Promise<void>;
2099
- declare function loadPNG(filepath: string): Promise<{
2100
- data: Uint8ClampedArray;
2101
- width: number;
2102
- height: number;
2103
- }>;
2104
- interface ComparisonResult {
2105
- pixelsDifferent: number;
2194
+ interface AnimationSnapshotResult {
2195
+ passed: boolean;
2106
2196
  totalPixels: number;
2197
+ totalDiffPixels: number;
2107
2198
  percentDifferent: number;
2108
- passed: boolean;
2109
- diffImage?: Uint8ClampedArray;
2110
- }
2111
- interface ComparisonOptions {
2112
- threshold?: number;
2113
- includeAA?: boolean;
2114
- diffColor?: [number, number, number];
2115
- maxDifferencePercent?: number;
2199
+ frameStats: ComparisonResult[];
2116
2200
  }
2117
- declare function compareSnapshots(actual: Uint8ClampedArray, expected: Uint8ClampedArray, width: number, height: number, options?: ComparisonOptions): Promise<ComparisonResult>;
2118
- interface SnapshotTestOptions extends ComparisonOptions {
2119
- name: string;
2120
- description?: string;
2121
- width?: number;
2122
- height?: number;
2123
- updateBaseline?: boolean;
2124
- snapshotDir?: string;
2125
- }
2126
- declare function getSnapshotPath(name: string, type: 'baseline' | 'actual' | 'diff', snapshotDir?: string): string;
2127
- declare function expectSnapshot(pixels: Uint8ClampedArray, options: SnapshotTestOptions): Promise<void>;
2128
- declare function renderAndExpectSnapshot(setup: RenderTestSetup, renderFn: (pass: GPURenderPassEncoder) => void, options: Omit<SnapshotTestOptions, 'width' | 'height'>): Promise<void>;
2201
+ declare function expectAnimationSnapshot(renderAndCaptureFrame: (frameIndex: number) => Promise<Uint8ClampedArray>, options: AnimationSnapshotOptions): Promise<void>;
2129
2202
 
2130
2203
  interface PlaywrightOptions {
2131
2204
  headless?: boolean;
@@ -2208,4 +2281,4 @@ declare function compareScreenshots(baseline: Buffer, current: Buffer, threshold
2208
2281
  */
2209
2282
  declare function createVisualTestScenario(sceneName: string): VisualScenario;
2210
2283
 
2211
- 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 HeadlessWebGLContext, type HeadlessWebGLOptions, 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 WebGLRenderTestSetup, type WebGPUContextState, captureAudioEvents, captureCanvasDrawCalls, captureFramebufferAsPNG, captureGameScreenshot, captureGameState, captureTexture, captureWebGLFramebuffer, compareSaveGames, compareScreenshots, compareSnapshots, createBandwidthTestScenario, createBinaryStreamMock, createBinaryWriterMock, createBounds, createCheckerboardTexture, createCombatTestContext, createComputeTestSetup, createConfigStringArrayMock, createConfigStringMock, createControlledTimer, createCustomNetworkCondition, createCvarMock, createDeltaSnapshot, createEntity, createEntityFactory, createEntityStateFactory, createGameImportsAndEngine, createGameStateSnapshotFactory, createHeadlessTestContext, createHeadlessWebGL, 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, createSolidTexture, createSpawnTestContext, createStorageTestScenario, createSurfaceMock, createTestContext, createTraceMock, createTransform, createTriggerEntityFactory, createVector3, createViewTestScenario, createVisualTestScenario, createWebGLRenderTestSetup, expectSnapshot, findPakFile, flipPixelsVertically, getSnapshotPath, initHeadlessWebGPU, loadMapFromPak, loadPNG, makeAxisBrush, makeBrushFromMinsMaxs, makeBspModel, makeLeaf, makeLeafModel, makeNode, makePlane, measureSnapshotSize, mockMonsterAttacks, parseProtocolPlayerState, randomVector3, renderAndCapture, renderAndCaptureWebGL, 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, spawnEntity, takeScreenshot, teardownBrowserEnvironment, teardownMockAudioContext, teardownNodeEnvironment, testComputeShader, testPipelineRendering, throttleBandwidth, verifySmoothing, verifySnapshotConsistency, waitForGameReady };
2284
+ export { type AnimationSnapshotOptions, type AnimationSnapshotResult, 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 HeadlessWebGLContext, type HeadlessWebGLOptions, 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 WebGLPlaywrightOptions, type WebGLPlaywrightSetup, type WebGLRenderTestSetup, type WebGPUContextState, captureAudioEvents, captureCanvasDrawCalls, captureFramebufferAsPNG, captureGameScreenshot, captureGameState, captureTexture, captureWebGLFramebuffer, compareSaveGames, compareScreenshots, compareSnapshots, createBandwidthTestScenario, createBinaryStreamMock, createBinaryWriterMock, createBounds, createCheckerboardTexture, createCombatTestContext, createComputeTestSetup, createConfigStringArrayMock, createConfigStringMock, createControlledTimer, createCustomNetworkCondition, createCvarMock, createDeltaSnapshot, createEntity, createEntityFactory, createEntityStateFactory, createGameImportsAndEngine, createGameStateSnapshotFactory, createHeadlessTestContext, createHeadlessWebGL, 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, createSolidTexture, createSpawnTestContext, createStorageTestScenario, createSurfaceMock, createTestContext, createTraceMock, createTransform, createTriggerEntityFactory, createVector3, createViewTestScenario, createVisualTestScenario, createWebGLPlaywrightSetup, createWebGLRenderTestSetup, expectAnimationSnapshot, expectSnapshot, findPakFile, flipPixelsVertically, getSnapshotPath, initHeadlessWebGPU, loadMapFromPak, loadPNG, makeAxisBrush, makeBrushFromMinsMaxs, makeBspModel, makeLeaf, makeLeafModel, makeNode, makePlane, measureSnapshotSize, mockMonsterAttacks, parseProtocolPlayerState, randomVector3, renderAndCapture, renderAndCaptureWebGL, renderAndCaptureWebGLPlaywright, 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, spawnEntity, takeScreenshot, teardownBrowserEnvironment, teardownMockAudioContext, teardownNodeEnvironment, testComputeShader, testPipelineRendering, testWebGLRenderer, throttleBandwidth, verifySmoothing, verifySnapshotConsistency, waitForGameReady };