🐛 fix(vscode): 代码阅读 ⌘ 悬停每次现问定义,语言扩展启动后就能链上、点击总去跳
This commit is contained in:
1 parent
d412f4f01e
commit
ea5935135b
7 files changed
+204
-71
No files matched your search
@@ -0,0 +1,94 @@
|
||||
import type { WebviewToExtension } from './types'
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { DefinitionLinks } from './definitionLinks'
|
||||
|
||||
function setup(version: number | undefined): { links: DefinitionLinks, sent: WebviewToExtension[], probes: () => { id: number, version: number, offset: number }[] } {
|
||||
const sent: WebviewToExtension[] = []
|
||||
const links = new DefinitionLinks(msg => sent.push(msg))
|
||||
links.setVersion(version)
|
||||
const probes = (): { id: number, version: number, offset: number }[] => sent.flatMap(msg => msg.type === 'probeDefinition' ? [{ id: msg.id, version: msg.version, offset: msg.offset }] : [])
|
||||
return { links, sent, probes }
|
||||
}
|
||||
|
||||
describe('definitionLinks', () => {
|
||||
it('问到「没有」后移开再指回来会重新问,语言扩展启动好了就能链上', () => {
|
||||
const { links, probes } = setup(1)
|
||||
links.point(54)
|
||||
links.answer(probes()[0].id, false)
|
||||
expect(links.linked).toBeUndefined()
|
||||
|
||||
links.point(undefined)
|
||||
links.point(54)
|
||||
const [first, second] = probes()
|
||||
expect(second).toEqual({ id: second.id, version: 1, offset: 54 })
|
||||
expect(second.id).not.toBe(first.id)
|
||||
|
||||
links.answer(second.id, true)
|
||||
expect(links.linked).toBe(54)
|
||||
})
|
||||
|
||||
it('修饰键 + 点击名字总交给扩展端去跳,问到过「没有」也一样', () => {
|
||||
const { links, sent, probes } = setup(1)
|
||||
links.point(54)
|
||||
links.answer(probes()[0].id, false)
|
||||
|
||||
expect(links.click(54)).toBe(true)
|
||||
expect(sent.at(-1)).toEqual({ type: 'goToDefinition', version: 1, offset: 54 })
|
||||
})
|
||||
|
||||
it('还指着同一个名字不重问', () => {
|
||||
const { links, probes } = setup(1)
|
||||
links.point(54)
|
||||
links.point(54)
|
||||
expect(probes()).toHaveLength(1)
|
||||
})
|
||||
|
||||
it('迟到的旧回答丢掉,只认最近一次询问的回答', () => {
|
||||
const { links, probes } = setup(1)
|
||||
links.point(54)
|
||||
links.point(79)
|
||||
links.point(54)
|
||||
const [stale, , latest] = probes()
|
||||
links.answer(latest.id, true)
|
||||
links.answer(stale.id, false)
|
||||
expect(links.linked).toBe(54)
|
||||
})
|
||||
|
||||
it('松开修饰键或移开就不链接,之后到的回答也不再挂上', () => {
|
||||
const { links, probes } = setup(1)
|
||||
links.point(54)
|
||||
const [probe] = probes()
|
||||
links.answer(probe.id, true)
|
||||
expect(links.linked).toBe(54)
|
||||
|
||||
links.point(undefined)
|
||||
expect(links.linked).toBeUndefined()
|
||||
links.answer(probe.id, true)
|
||||
expect(links.linked).toBeUndefined()
|
||||
})
|
||||
|
||||
it('换了文档版本:正指着的名字按新版本重问,旧版本的回答丢掉', () => {
|
||||
const { links, probes } = setup(1)
|
||||
links.point(54)
|
||||
links.setVersion(2)
|
||||
const [old, renewed] = probes()
|
||||
expect(renewed).toEqual({ id: renewed.id, version: 2, offset: 54 })
|
||||
|
||||
links.answer(old.id, true)
|
||||
expect(links.linked).toBeUndefined()
|
||||
links.answer(renewed.id, true)
|
||||
expect(links.linked).toBe(54)
|
||||
})
|
||||
|
||||
it('还没收到文档时不问,点击也不拦', () => {
|
||||
const { links, sent } = setup(undefined)
|
||||
links.point(54)
|
||||
expect(links.click(54)).toBe(false)
|
||||
expect(sent).toEqual([])
|
||||
})
|
||||
|
||||
it('没指着名字的点击不拦', () => {
|
||||
const { links } = setup(1)
|
||||
expect(links.click(undefined)).toBe(false)
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user