86 lines
2.5 KiB
TypeScript
86 lines
2.5 KiB
TypeScript
import { afterEach, describe, expect, test, vi } from 'bun:test'
|
|
|
|
import { fontManager } from '@open-pencil/core/text'
|
|
|
|
import { clearTauriMocks, mockTauriIPC } from '#tests/helpers/tauri/mocks'
|
|
|
|
class MockFontFace {
|
|
family: string
|
|
|
|
constructor(family: string) {
|
|
this.family = family
|
|
}
|
|
|
|
async load() {
|
|
return this
|
|
}
|
|
}
|
|
|
|
function installFontFaceMocks() {
|
|
const addedFaces: MockFontFace[] = []
|
|
Object.assign(globalThis, {
|
|
FontFace: MockFontFace,
|
|
document: {
|
|
fonts: {
|
|
add(face: MockFontFace) {
|
|
addedFaces.push(face)
|
|
}
|
|
}
|
|
}
|
|
})
|
|
return addedFaces
|
|
}
|
|
|
|
afterEach(async () => {
|
|
await clearTauriMocks()
|
|
vi.restoreAllMocks()
|
|
Reflect.deleteProperty(globalThis, 'document')
|
|
Reflect.deleteProperty(globalThis, 'FontFace')
|
|
})
|
|
|
|
describe('Tauri font helpers', () => {
|
|
test('lists system font families through mocked Tauri IPC', async () => {
|
|
await mockTauriIPC((cmd) => {
|
|
expect(cmd).toBe('list_system_fonts')
|
|
return [{ family: 'System UI', styles: ['Regular', 'Bold'] }]
|
|
})
|
|
|
|
const { listFamilies, listFonts } = await import('@/app/editor/fonts')
|
|
|
|
await expect(listFamilies()).resolves.toEqual([{ family: 'System UI', source: 'local' }])
|
|
await expect(listFonts()).resolves.toEqual([
|
|
{ family: 'System UI', styles: ['Regular', 'Bold'] }
|
|
])
|
|
})
|
|
|
|
test('loads system font bytes and registers the face', async () => {
|
|
const addedFaces = installFontFaceMocks()
|
|
await mockTauriIPC((cmd, args) => {
|
|
expect(cmd).toBe('load_system_font')
|
|
expect(args).toEqual({ family: 'System UI', style: 'Bold Italic' })
|
|
return [1, 2, 3, 4]
|
|
})
|
|
|
|
const { loadFont } = await import('@/app/editor/fonts')
|
|
const buffer = await loadFont('System UI', 'Bold Italic')
|
|
|
|
expect([...new Uint8Array(buffer ?? new ArrayBuffer(0))]).toEqual([1, 2, 3, 4])
|
|
expect(fontManager.isLoaded('System UI', 'Bold Italic')).toBe(true)
|
|
expect(addedFaces.map((face) => face.family)).toEqual(['System UI'])
|
|
})
|
|
|
|
test('falls back to font manager loading when the system font command fails', async () => {
|
|
await mockTauriIPC((cmd) => {
|
|
expect(cmd).toBe('load_system_font')
|
|
throw new Error('missing system font')
|
|
})
|
|
const fallback = new Uint8Array([9, 8, 7]).buffer
|
|
const loadFontSpy = vi.spyOn(fontManager, 'loadFont').mockResolvedValue(fallback)
|
|
|
|
const { loadFont } = await import('@/app/editor/fonts')
|
|
|
|
await expect(loadFont('Missing Family', 'Regular')).resolves.toBe(fallback)
|
|
expect(loadFontSpy).toHaveBeenCalledWith('Missing Family', 'Regular')
|
|
})
|
|
})
|