import { expect, mock, test } from 'bun:test' import type { Font, Paint, Surface } from 'canvaskit-wasm' import type { SkiaRenderer } from '#core/canvas/renderer' import { destroyRenderer } from '#core/canvas/renderer/lifecycle' function deletable() { return { delete: mock() } as T & { delete: ReturnType } } function createRenderer() { const renderer: Partial = { destroyed: false, imageCache: new Map(), vectorPathCache: new Map(), vectorStrokePathCache: new Map(), vectorStrokeOutlineCache: new Map(), fillGeometryCache: new Map(), strokeGeometryCache: new Map(), fillPaint: deletable(), strokePaint: deletable(), selectionPaint: deletable(), parentOutlinePaint: deletable(), snapPaint: deletable(), auxFill: deletable(), auxStroke: deletable(), opacityPaint: deletable(), effectLayerPaint: deletable(), textFont: deletable(), labelFont: deletable(), sizeFont: deletable(), sectionTitleFont: deletable(), componentLabelFont: deletable(), fontMgr: null, fontProvider: null, fontsLoaded: true, rulerBgPaint: deletable(), rulerTickPaint: deletable(), rulerTextPaint: deletable(), rulerHlPaint: deletable(), rulerBadgePaint: deletable(), rulerLabelPaint: deletable(), penPathPaint: deletable(), penLiveStrokePaint: deletable(), penHandlePaint: deletable(), penVertexFill: deletable(), penVertexStroke: deletable(), imageFilterCache: new Map(), maskFilterCache: new Map(), nodePictureCache: new Map(), subtreePictureCache: new Map(), scenePicture: null, sceneBacking: null, sceneBackingBuild: null, _flashPaint: null, profiler: { destroy: mock() } as Partial as SkiaRenderer['profiler'], surface: deletable() } return renderer as SkiaRenderer } test('destroyRenderer deletes all renderer-owned paints and label fonts', () => { const renderer = createRenderer() const parentOutlinePaint = renderer.parentOutlinePaint const sectionTitleFont = renderer.sectionTitleFont const componentLabelFont = renderer.componentLabelFont destroyRenderer(renderer) expect(parentOutlinePaint.delete).toHaveBeenCalled() expect(sectionTitleFont?.delete).toHaveBeenCalled() expect(componentLabelFont?.delete).toHaveBeenCalled() })