Files
superwork/vscode/src/codeReader/editor/documentMessage.test.ts
T

55 lines
2.4 KiB
TypeScript

import type { Memento } from 'vscode'
import { describe, expect, it } from 'vitest'
import { createTypeScriptAdapter } from '../languages/typescript'
import { CodeReaderRegistry } from '../registry'
import { runtime, WASM_DIR } from '../testSupport'
import { typescriptZhTranslator } from '../translators/typescriptZh'
import { documentMessage } from './documentMessage'
function registryWithTypeScript(): CodeReaderRegistry {
const store: Record<string, unknown> = {}
const registry = new CodeReaderRegistry({
get: <T>(key: string): T | undefined => store[key] as T | undefined,
update: async (key: string, value: unknown) => {
store[key] = value
},
} as Pick<Memento, 'get' | 'update'>)
registry.registerLanguage(createTypeScriptAdapter(WASM_DIR))
registry.registerTranslator(typescriptZhTranslator)
return registry
}
function doc(languageId: string, text: string, version = 3): { languageId: string, version: number, getText: () => string } {
return { languageId, version, getText: () => text }
}
describe('预览的 document 消息', () => {
it('受支持的语言:带文档版本、代码块、可选翻译和选中的翻译', async () => {
const message = await documentMessage(doc('typescript', 'if (!folder)\n return []\n'), registryWithTypeScript(), runtime)
expect(message).toMatchObject({
type: 'document',
version: 3,
languageId: 'typescript',
translators: [{ id: typescriptZhTranslator.id, label: typescriptZhTranslator.label }],
translatorId: typescriptZhTranslator.id,
})
expect(message.error).toBeUndefined()
expect(message.blocks.map(b => b.kind)).toEqual(['if'])
expect(message.blocks[0].children.map(b => b.translation.map(s => s.text).join(''))).toEqual(['返回 空数组'])
})
it('没有语言插件的语言:带 error,不解析', async () => {
const message = await documentMessage(doc('rust', 'fn main() {}'), registryWithTypeScript(), runtime)
expect(message.blocks).toEqual([])
expect(message.translators).toEqual([])
expect(message.error).toContain('rust')
})
it('解析失败:把原因放进 error', async () => {
const failing = { parse: async () => Promise.reject(new Error('语法包加载失败')) }
const message = await documentMessage(doc('typescript', 'const a = 1'), registryWithTypeScript(), failing)
expect(message.blocks).toEqual([])
expect(message.error).toBe('语法包加载失败')
})
})