import { describe, expect, it, vi } from 'vitest'; import { detectWebGLSupport, getWebGLFailureMessage } from './webgl'; describe('webgl detection', () => { it('reports unsupported when no context can be created', () => { const canvas = { getContext: vi.fn(() => null), } as unknown as HTMLCanvasElement; const result = detectWebGLSupport({ canvas }); expect(result.supported).toBe(false); expect(result.reason).toBe('context-unavailable'); expect(getWebGLFailureMessage(result)).toContain('WebGL is unavailable'); }); it('returns renderer details when a WebGL context is available', () => { const context = { VERSION: 0x1f02, VENDOR: 0x1f00, RENDERER: 0x1f01, MAX_TEXTURE_SIZE: 0x0d33, MAX_VERTEX_UNIFORM_VECTORS: 0x8dfb, getExtension: vi.fn(() => null), getParameter: vi.fn((parameter: number) => { const values: Record = { 0x1f02: 'WebGL 2.0 test', 0x1f00: 'Mechanica GPU Vendor', 0x1f01: 'Mechanica GPU Renderer', 0x0d33: 8192, 0x8dfb: 1024, }; return values[parameter]; }), }; const canvas = { getContext: vi.fn((name: string) => (name === 'webgl2' ? context : null)), } as unknown as HTMLCanvasElement; const result = detectWebGLSupport({ canvas }); expect(result.supported).toBe(true); expect(result.renderer).toBe('webgl2'); expect(result.details.version).toBe('WebGL 2.0 test'); expect(result.details.maxTextureSize).toBe(8192); }); });