34 lines
1.4 KiB
TypeScript
34 lines
1.4 KiB
TypeScript
import type { LocalSymbol, SourceRange } from './contract'
|
||
import { describe, expect, it } from 'vitest'
|
||
import { definitionFor, symbolAt, symbolOccurrences } from './localSymbols'
|
||
|
||
function range(startIndex: number, endIndex: number): SourceRange {
|
||
return { startIndex, endIndex }
|
||
}
|
||
|
||
// out=1(0-3);echo $out(10-13);out=2(15-18);echo $out(25-28)
|
||
const OUT: LocalSymbol = { definitions: [range(0, 3), range(15, 18)], occurrences: [range(0, 3), range(10, 13), range(15, 18), range(25, 28)] }
|
||
const URL: LocalSymbol = { definitions: [range(40, 43)], occurrences: [range(30, 33), range(40, 43)] }
|
||
|
||
describe('语言插件认出的同一文件里的名字', () => {
|
||
it('找盖住位置的名字;名字外面没有', () => {
|
||
expect(symbolAt([URL, OUT], 11)).toBe(OUT)
|
||
expect(symbolAt([URL, OUT], 13)).toBeUndefined()
|
||
})
|
||
|
||
it('跳到之前最近的一处定义;前面没有定义就跳到第一处', () => {
|
||
expect(definitionFor(OUT, 11)).toEqual(range(0, 3))
|
||
expect(definitionFor(OUT, 26)).toEqual(range(15, 18))
|
||
expect(definitionFor(URL, 31)).toEqual(range(40, 43))
|
||
})
|
||
|
||
it('各处出现:定义处算写,别处算读', () => {
|
||
expect(symbolOccurrences(OUT)).toEqual([
|
||
{ start: 0, end: 3, kind: 'write' },
|
||
{ start: 10, end: 13, kind: 'read' },
|
||
{ start: 15, end: 18, kind: 'write' },
|
||
{ start: 25, end: 28, kind: 'read' },
|
||
])
|
||
})
|
||
})
|