55 lines
2.4 KiB
TypeScript
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('语法包加载失败')
|
|
})
|
|
})
|