import { test } from 'node:test'; import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { parseScene } from '../../tools/svg/parse.ts'; import { refineScene, serializeScene, extractPart, listGroupIds } from '../../tools/svg/refine.ts'; const doc = parseScene(readFileSync(new URL('../fixtures/mini-scene.svg', import.meta.url), 'utf8')); test('refineScene drops speckle, keeps ids and fills, reports stats', () => { const { doc: refined, stats } = refineScene(doc); assert.equal(stats.before.rings, 4); assert.equal(stats.dropped.rings, 1); // the 0.36 px² speck assert.equal(stats.after.paths, 3); assert.deepEqual(listGroupIds(refined), ['cleanplates', 'door_it', 'door_it_leaf']); const leaf = (refined.children[1] as any).children[0]; assert.equal(leaf.children[0].id, 'door_it_leaf__p00001'); assert.equal(leaf.children[0].fill, '#3b2a6e'); assert.equal(leaf.children[0].contours.length, 1); }); test('serializeScene writes cubic path data with ids and no raster/filter/text', () => { const svg = serializeScene(refineScene(doc).doc); assert.match(svg, /^/); assert.match(svg, //); assert.match(svg, /