/** * MockAdapter Smoke-Tests (Task C1). * Headless-Mock erfüllt RenderAdapter-Vertrag und protokolliert Aufrufe — * Grundlage für zukünftige Renderer-/Tool-Unit-Tests. */ import { describe, it, expect } from 'vitest'; import { MockAdapter } from '../src/render/mock/MockAdapter'; import type { RenderAdapter, Viewport } from '../src/render/types'; import type { CADElement, CADLayer } from '../src/types/cad.types'; import type { Pt } from '../src/tools/modification/geometry'; function makeLayer(): CADLayer { return { id: 'layer-1', name: 'L1', visible: true, locked: false, color: '#ffffff', lineType: 'solid', transparency: 0, sortOrder: 0, parentId: null, } as unknown as CADLayer; } function makeEl(id = 'e1'): CADElement { return { id, type: 'line', layerId: 'layer-1', x: 10, y: 10, width: 20, height: 20, properties: {}, } as unknown as CADElement; } describe('MockAdapter implements RenderAdapter', () => { it('ist einem RenderAdapter zuweisbar (Compile-proof)', () => { const adapter = new MockAdapter(); const asAdapter: RenderAdapter = adapter; expect(asAdapter).toBeDefined(); }); it('protokolliert init/resize/clear/drawElement in Reihenfolge', () => { const adapter = new MockAdapter(); const canvas = document.createElement('canvas'); adapter.init(canvas); adapter.resize(800, 600, 2); const vp: Viewport = { x: 0, y: 0, scale: 1, width: 800, height: 600 }; adapter.setViewport(vp); adapter.clear('#101018'); adapter.drawElement(makeEl(), makeLayer(), { color: '#fff', lineType: 'solid', transparency: 0, visible: true, }); expect(adapter.calls.map((c) => c.method)).toEqual([ 'init', 'resize', 'setViewport', 'clear', 'drawElement', ]); expect(adapter.countCalls('drawElement')).toBe(1); }); it('hitTest liefert konfigurierbaren Treffer; overlay-Callback wird ausgefuehrt', () => { const adapter = new MockAdapter(); const el = makeEl('target'); adapter.nextHitTestResult = el; let drewRect = false; adapter.overlay(() => { drewRect = true; }); const pt: Pt = { x: 5, y: 5 }; const hit = adapter.hitTest(pt, 3); expect(hit?.id).toBe('target'); expect(drewRect).toBe(true); }); it('reset leert Protokoll und Treffer-Konfiguration', () => { const adapter = new MockAdapter(); adapter.nextHitTestResult = makeEl('tmp'); adapter.overlay(() => {}); adapter.reset(); expect(adapter.calls.length).toBe(0); const pt: Pt = { x: 0, y: 0 }; expect(adapter.hitTest(pt, 1)).toBeNull(); }); });