openpencil/tests/engine/text/coverage.test.ts
Danila Poyarkov 4b3d97ce0d feat(text): add demand-driven font resolver
- Resolve exact faces through registered, local, cache, and remote sources with deduplicated state transitions\n- Use CanvasKit notdef glyphs to request script fallbacks and repaint after resolution\n- Make CJK coverage analysis codepoint-safe across supplementary characters and style runs
2026-07-17 13:00:09 +03:00

49 lines
1.6 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { SceneGraph } from '@open-pencil/core'
import { fontManager, textNeededFallbackScripts } from '@open-pencil/core/text'
function pageId(graph: SceneGraph): string {
return graph.getPages()[0].id
}
describe('font fallback coverage indexing', () => {
test('detects supplementary-plane Han code points', async () => {
const family = `SupplementaryHan_${Date.now()}`
const data = await Bun.file('public/Inter-Regular.ttf').arrayBuffer()
fontManager.markLoaded(family, 'Regular', data)
const graph = new SceneGraph()
const node = graph.createNode('TEXT', pageId(graph), {
text: 'A𠀀B',
fontFamily: family,
fontWeight: 400
})
expect(textNeededFallbackScripts(node)).toContain('cjk-sc')
})
test('uses UTF-16 style-run indices after a surrogate pair', async () => {
const cjkData = await Bun.file('tests/fixtures/fonts/NotoSansSC-Regular.ttf').arrayBuffer()
const latinData = await Bun.file('public/Inter-Regular.ttf').arrayBuffer()
const cjkFamily = `CJKRunBase_${Date.now()}`
const latinFamily = `CJKRunOverride_${Date.now()}`
fontManager.markLoaded(cjkFamily, 'Regular', cjkData)
fontManager.markLoaded(latinFamily, 'Regular', latinData)
const graph = new SceneGraph()
const node = graph.createNode('TEXT', pageId(graph), {
text: '😀你',
fontFamily: cjkFamily,
fontWeight: 400,
styleRuns: [
{
start: 2,
length: 1,
style: { fontFamily: latinFamily }
}
]
})
expect(textNeededFallbackScripts(node)).toContain('cjk-sc')
})
})