task(C1): render adapter interface with headless mock adapter
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* 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();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user