138 lines
4.0 KiB
TypeScript
138 lines
4.0 KiB
TypeScript
import { Neovim } from '@chemzqm/neovim'
|
|
import { Disposable, DocumentLink, Range } from 'vscode-languageserver-protocol'
|
|
import LinksHandler from '../../handler/links'
|
|
import languages from '../../languages'
|
|
import workspace from '../../workspace'
|
|
import events from '../../events'
|
|
import { disposeAll } from '../../util'
|
|
import helper from '../helper'
|
|
|
|
let nvim: Neovim
|
|
let links: LinksHandler
|
|
let disposables: Disposable[] = []
|
|
beforeAll(async () => {
|
|
await helper.setup()
|
|
nvim = helper.nvim
|
|
links = helper.plugin.getHandler().links
|
|
})
|
|
|
|
afterAll(async () => {
|
|
await helper.shutdown()
|
|
})
|
|
|
|
afterEach(async () => {
|
|
disposeAll(disposables)
|
|
await helper.reset()
|
|
})
|
|
|
|
describe('Links', () => {
|
|
it('should get document links', async () => {
|
|
disposables.push(languages.registerDocumentLinkProvider([{ language: '*' }], {
|
|
provideDocumentLinks: (_doc, _token) => {
|
|
return [
|
|
DocumentLink.create(Range.create(0, 0, 0, 5), 'test:///foo'),
|
|
DocumentLink.create(Range.create(1, 0, 1, 5), 'test:///bar')
|
|
]
|
|
}
|
|
}))
|
|
let res = await links.getLinks()
|
|
expect(res.length).toBe(2)
|
|
})
|
|
|
|
it('should throw error when link target not resolved', async () => {
|
|
disposables.push(languages.registerDocumentLinkProvider([{ language: '*' }], {
|
|
provideDocumentLinks(_doc, _token) {
|
|
return [
|
|
DocumentLink.create(Range.create(0, 0, 0, 5))
|
|
]
|
|
},
|
|
resolveDocumentLink(link) {
|
|
return link
|
|
}
|
|
}))
|
|
let res = await links.getLinks()
|
|
let err
|
|
try {
|
|
await links.openLink(res[0])
|
|
} catch (e) {
|
|
err = e
|
|
}
|
|
expect(err).toBeDefined()
|
|
})
|
|
|
|
it('should open link at current position', async () => {
|
|
await nvim.setLine('foo')
|
|
await nvim.command('normal! 0')
|
|
disposables.push(workspace.registerTextDocumentContentProvider('test', {
|
|
provideTextDocumentContent: () => {
|
|
return 'test'
|
|
}
|
|
}))
|
|
disposables.push(languages.registerDocumentLinkProvider([{ language: '*' }], {
|
|
provideDocumentLinks(_doc, _token) {
|
|
return [
|
|
DocumentLink.create(Range.create(0, 0, 0, 5)),
|
|
]
|
|
},
|
|
resolveDocumentLink(link) {
|
|
link.target = 'test:///foo'
|
|
return link
|
|
}
|
|
}))
|
|
await links.openCurrentLink()
|
|
let bufname = await nvim.call('bufname', '%')
|
|
expect(bufname).toBe('test:///foo')
|
|
await nvim.call('setline', [1, ['a', 'b', 'c']])
|
|
await nvim.call('cursor', [3, 1])
|
|
let res = await links.openCurrentLink()
|
|
expect(res).toBe(false)
|
|
})
|
|
|
|
it('should return false when current links not found', async () => {
|
|
await nvim.setLine('foo')
|
|
await nvim.command('normal! 0')
|
|
disposables.push(languages.registerDocumentLinkProvider([{ language: '*' }], {
|
|
provideDocumentLinks(_doc, _token) {
|
|
return []
|
|
}
|
|
}))
|
|
let res = await links.openCurrentLink()
|
|
expect(res).toBe(false)
|
|
})
|
|
|
|
it('should show tooltip', async () => {
|
|
await nvim.setLine('foo')
|
|
await nvim.call('cursor', [1, 1])
|
|
disposables.push(languages.registerDocumentLinkProvider([{ language: '*' }], {
|
|
provideDocumentLinks(_doc, _token) {
|
|
let link = DocumentLink.create(Range.create(0, 0, 0, 5))
|
|
link.tooltip = 'test'
|
|
return [link]
|
|
},
|
|
resolveDocumentLink(link) {
|
|
link.target = 'http://example.com'
|
|
return link
|
|
}
|
|
}))
|
|
await links.showTooltip()
|
|
let win = await helper.getFloat()
|
|
let buf = await win.buffer
|
|
let lines = await buf.lines
|
|
expect(lines[0]).toMatch('test')
|
|
})
|
|
|
|
it('should enable tooltip on CursorHold', async () => {
|
|
let doc = await workspace.document
|
|
helper.updateConfiguration('links.tooltip', true)
|
|
await nvim.setLine('http://www.baidu.com')
|
|
await nvim.call('cursor', [1, 1])
|
|
let link = await links.getCurrentLink()
|
|
expect(link).toBeDefined()
|
|
await events.fire('CursorHold', [doc.bufnr])
|
|
let win = await helper.getFloat()
|
|
let buf = await win.buffer
|
|
let lines = await buf.lines
|
|
expect(lines[0]).toMatch('Press')
|
|
})
|
|
})
|