171 lines
5.1 KiB
VimL
171 lines
5.1 KiB
VimL
|
|
" scripts/test-keymaps-vim.vim — driven by scripts/test-keymaps-vim.sh.
|
||
|
|
"
|
||
|
|
" Pure-VimL keymap regression suite. Plain Vim's LSP path
|
||
|
|
" (vim-lsp + async.vim) talks to the server via timers, which won't
|
||
|
|
" reliably fire inside `vim -e -s` headless mode — so the cases here
|
||
|
|
" are restricted to the bindings whose RHS is implemented entirely in
|
||
|
|
" VimL (header/link nav, `o`/`O` bullet continuation, the wrap step
|
||
|
|
" of `<CR>`). LSP-roundtrip bindings (`<C-Space>`, `=`, `-`, …) get
|
||
|
|
" their coverage from the Neovim harness in scripts/test-keymaps.lua
|
||
|
|
" — same Lua codepath, same server.
|
||
|
|
|
||
|
|
let s:results = []
|
||
|
|
let s:pass = 0
|
||
|
|
let s:fail = 0
|
||
|
|
let s:out = $NUWIKI_KEYMAP_RESULTS
|
||
|
|
|
||
|
|
function! s:record(ok, name, detail) abort
|
||
|
|
let l:line = (a:ok ? 'PASS' : 'FAIL') . ' ' . a:name
|
||
|
|
if a:detail !=# ''
|
||
|
|
let l:line .= ' — ' . a:detail
|
||
|
|
endif
|
||
|
|
call add(s:results, l:line)
|
||
|
|
if a:ok
|
||
|
|
let s:pass += 1
|
||
|
|
else
|
||
|
|
let s:fail += 1
|
||
|
|
endif
|
||
|
|
endfunction
|
||
|
|
|
||
|
|
function! s:set_buf(lines) abort
|
||
|
|
silent %delete _
|
||
|
|
call setline(1, a:lines)
|
||
|
|
endfunction
|
||
|
|
|
||
|
|
function! s:lines() abort
|
||
|
|
return getline(1, '$')
|
||
|
|
endfunction
|
||
|
|
|
||
|
|
function! s:run(name, opts) abort
|
||
|
|
try
|
||
|
|
call s:set_buf(a:opts.lines)
|
||
|
|
let l:cursor = get(a:opts, 'cursor', [1, 1])
|
||
|
|
call cursor(l:cursor[0], l:cursor[1])
|
||
|
|
" feedkeys with 'tx' — t: typed (respects maps), x: execute now.
|
||
|
|
let l:keys = a:opts.keys
|
||
|
|
call feedkeys(l:keys, 'tx')
|
||
|
|
let l:detail = ''
|
||
|
|
if has_key(a:opts, 'expect_lines')
|
||
|
|
if s:lines() !=# a:opts.expect_lines
|
||
|
|
let l:detail = 'lines mismatch — expected ' . string(a:opts.expect_lines)
|
||
|
|
\ . ', actual ' . string(s:lines())
|
||
|
|
call s:record(0, a:name, l:detail)
|
||
|
|
return
|
||
|
|
endif
|
||
|
|
endif
|
||
|
|
if has_key(a:opts, 'expect_line') && has_key(a:opts, 'expect_at')
|
||
|
|
let l:got = getline(a:opts.expect_at)
|
||
|
|
if l:got !=# a:opts.expect_line
|
||
|
|
let l:detail = 'line ' . a:opts.expect_at . ' — expected ' . string(a:opts.expect_line)
|
||
|
|
\ . ', got ' . string(l:got)
|
||
|
|
call s:record(0, a:name, l:detail)
|
||
|
|
return
|
||
|
|
endif
|
||
|
|
endif
|
||
|
|
if has_key(a:opts, 'expect_cursor_line')
|
||
|
|
let l:lnum = line('.')
|
||
|
|
if l:lnum != a:opts.expect_cursor_line
|
||
|
|
let l:detail = 'cursor line — expected ' . a:opts.expect_cursor_line
|
||
|
|
\ . ', got ' . l:lnum
|
||
|
|
call s:record(0, a:name, l:detail)
|
||
|
|
return
|
||
|
|
endif
|
||
|
|
endif
|
||
|
|
call s:record(1, a:name, '')
|
||
|
|
catch
|
||
|
|
call s:record(0, a:name, v:exception)
|
||
|
|
endtry
|
||
|
|
endfunction
|
||
|
|
|
||
|
|
" ===== Smoke: ftplugin loaded + commands defined =====
|
||
|
|
|
||
|
|
if &filetype !=# 'vimwiki'
|
||
|
|
call s:record(0, 'ftplugin.attached', 'filetype is ' . &filetype . ' (expected vimwiki)')
|
||
|
|
else
|
||
|
|
call s:record(1, 'ftplugin.attached', '')
|
||
|
|
endif
|
||
|
|
if exists(':VimwikiTOC') == 2
|
||
|
|
call s:record(1, 'cmd.VimwikiTOC_defined', '')
|
||
|
|
else
|
||
|
|
call s:record(0, 'cmd.VimwikiTOC_defined', ':VimwikiTOC not registered')
|
||
|
|
endif
|
||
|
|
if exists(':NuwikiIndex') == 2
|
||
|
|
call s:record(1, 'cmd.NuwikiIndex_defined', '')
|
||
|
|
else
|
||
|
|
call s:record(0, 'cmd.NuwikiIndex_defined', ':NuwikiIndex not registered')
|
||
|
|
endif
|
||
|
|
|
||
|
|
" ===== Header nav (pure VimL) =====
|
||
|
|
|
||
|
|
call s:run('headers.]]_jumps_to_next', {
|
||
|
|
\ 'lines': ['= One =', 'body', '== Two ==', 'body', '= Three ='],
|
||
|
|
\ 'cursor': [1, 1],
|
||
|
|
\ 'keys': ']]',
|
||
|
|
\ 'expect_cursor_line': 3,
|
||
|
|
\ })
|
||
|
|
call s:run('headers.[[_jumps_to_prev', {
|
||
|
|
\ 'lines': ['= One =', 'body', '== Two ==', 'body', '= Three ='],
|
||
|
|
\ 'cursor': [5, 1],
|
||
|
|
\ 'keys': '[[',
|
||
|
|
\ 'expect_cursor_line': 3,
|
||
|
|
\ })
|
||
|
|
call s:run('headers.]u_jumps_to_parent', {
|
||
|
|
\ 'lines': ['= Parent =', '== Child ==', 'body'],
|
||
|
|
\ 'cursor': [3, 1],
|
||
|
|
\ 'keys': ']u',
|
||
|
|
\ 'expect_cursor_line': 1,
|
||
|
|
\ })
|
||
|
|
call s:run('headers.]=_jumps_to_next_sibling', {
|
||
|
|
\ 'lines': ['= A =', '== child ==', 'body', '= B ='],
|
||
|
|
\ 'cursor': [1, 1],
|
||
|
|
\ 'keys': ']=',
|
||
|
|
\ 'expect_cursor_line': 4,
|
||
|
|
\ })
|
||
|
|
|
||
|
|
" ===== Link nav (pure VimL) =====
|
||
|
|
|
||
|
|
call s:run('links.<Tab>_finds_next_wikilink', {
|
||
|
|
\ 'lines': ['intro [[A]] more [[B]] end'],
|
||
|
|
\ 'cursor': [1, 1],
|
||
|
|
\ 'keys': "\<Tab>",
|
||
|
|
\ 'expect_cursor_line': 1,
|
||
|
|
\ })
|
||
|
|
|
||
|
|
" ===== <CR> first press wraps bare word =====
|
||
|
|
|
||
|
|
call s:run('cr.wraps_bare_word_first_press', {
|
||
|
|
\ 'lines': ['MyPage rest'],
|
||
|
|
\ 'cursor': [1, 3],
|
||
|
|
\ 'keys': "\<CR>",
|
||
|
|
\ 'expect_line': '[[MyPage]] rest',
|
||
|
|
\ 'expect_at': 1,
|
||
|
|
\ })
|
||
|
|
|
||
|
|
" ===== Bullet continuation =====
|
||
|
|
|
||
|
|
call s:run('lists.o_continues_list_marker', {
|
||
|
|
\ 'lines': ['- first'],
|
||
|
|
\ 'cursor': [1, 1],
|
||
|
|
\ 'keys': "o\<Esc>",
|
||
|
|
\ 'expect_lines': ['- first', '- '],
|
||
|
|
\ })
|
||
|
|
call s:run('lists.o_continues_checkbox', {
|
||
|
|
\ 'lines': ['- [ ] first'],
|
||
|
|
\ 'cursor': [1, 1],
|
||
|
|
\ 'keys': "o\<Esc>",
|
||
|
|
\ 'expect_lines': ['- [ ] first', '- [ ] '],
|
||
|
|
\ })
|
||
|
|
call s:run('lists.O_continues_above', {
|
||
|
|
\ 'lines': ['- second'],
|
||
|
|
\ 'cursor': [1, 1],
|
||
|
|
\ 'keys': "O\<Esc>",
|
||
|
|
\ 'expect_lines': ['- ', '- second'],
|
||
|
|
\ })
|
||
|
|
|
||
|
|
" ===== Wrap up =====
|
||
|
|
|
||
|
|
call add(s:results, '')
|
||
|
|
call add(s:results, printf('SUMMARY: %d passed, %d failed', s:pass, s:fail))
|
||
|
|
call writefile(s:results, s:out)
|
||
|
|
execute (s:fail == 0 ? 'qall!' : 'cquit!')
|