task(A4.8): migrate delete/offset tools to v2

This commit is contained in:
Agent Zero
2026-08-27 01:09:51 +02:00
parent 7565016200
commit cf67635732
2 changed files with 174 additions and 3 deletions
+80
View File
@@ -513,6 +513,86 @@ describe('A4.7 pilot: transform tools', () => {
});
});
describe('A4.8 pilot: delete tool', () => {
it('löscht alle selektierten Elemente in EINER Transaktion; undo stellt her', () => {
const { ydoc } = createInMemoryDoc();
const doc = new CADDocument(ydoc);
doc.addElement(makeEl('d1'));
doc.addElement(makeEl('d2'));
doc.addElement(makeEl('keep'));
let selIds: string[] = ['d1', 'd2'];
const bridge = {
getIds: () => selIds,
setIds: (ids: string[]) => { selIds = ids; },
hitTest: () => null,
};
const ctx = makeCtx({ doc, selection: bridge });
const del = coreModifyPlugin.tools!.find((t) => t.manifest.id === 'delete')!;
del.handlers.down!(pe(0, 0), ctx);
const remaining = doc.getAllElements().map((e) => e.id);
expect(remaining).toEqual(['keep']);
expect(doc.undo()).toBe(true);
expect(doc.getAllElements().length).toBe(3);
});
it('Direktklick ohne Selektion löscht getroffenes Element', () => {
const { ydoc } = createInMemoryDoc();
const doc = new CADDocument(ydoc);
const el = makeEl('hitme');
el.x = 20;
el.y = 20;
doc.addElement(el);
const bridge = {
getIds: () => [] as string[],
setIds: () => {},
hitTest: () => el,
};
const ctx = makeCtx({ doc, selection: bridge });
const del = coreModifyPlugin.tools!.find((t) => t.manifest.id === 'delete')!;
del.handlers.down!(pe(20, 20), ctx);
expect(doc.getAllElements().length).toBe(0);
});
});
describe('A4.8 pilot: offset tool', () => {
it('erzeugt Versatz-Kopie mit Seitenparameter; Original bleibt', () => {
const { ydoc } = createInMemoryDoc();
const doc = new CADDocument(ydoc);
const line = {
id: 'src1', type: 'line', layerId: 'l', x: 50, y: 0,
width: 100, height: 0,
properties: { x1: 0, y1: 0, x2: 100, y2: 0 },
} as unknown as CADElement;
doc.addElement(line);
let selIds: string[] = [];
const bridge = {
getIds: () => selIds,
setIds: (ids: string[]) => { selIds = ids; },
hitTest: () => line,
};
const ctx = makeCtx({ doc, selection: bridge });
const off = coreModifyPlugin.tools!.find((t) => t.manifest.id === 'offset')!;
off.handlers.down!(pe(50, 0), ctx); // Klick1: Quelle wählen (Basis)
off.handlers.down!(pe(50, -30), ctx); // Klick2: Versatz nach oben (side=-1)
const all = doc.getAllElements();
expect(all.length).toBe(2); // Original + Kopie
expect(all[0].id).toBe('src1'); // Original unberührt
expect(all[1].id.startsWith('off_')).toBe(true);
// side=-1 bei Rechtslaufender Linie → nach OBEN (y kleiner):
expect(all[1].properties.y1).toBe(-30);
expect(all[1].properties.y2).toBe(-30);
expect(all[1].properties.x1).toBe(0); // x bleibt
expect(doc.undo()).toBe(true);
expect(doc.getAllElements().length).toBe(1);
});
});
describe('A3 pilot: select tool', () => {
function makeBridge(elements: CADElement[]) {
let ids: string[] = [];