test(calendar): add Vim + Neovim integration harnesses
Add headless harnesses covering the calendar-vim integration, wired into CI alongside the existing keymap/config suites: - test-calendar-vim.sh/.vim (+ -optout.vim): pure-VimL diary hooks (calendar_sign markers, calendar_action path resolution from wiki root, calendar window close), plugin/nuwiki.vim hook auto-wiring that overrides calendar-vim's defaults, and opt-out via g:nuwiki_use_calendar and g:nuwiki_no_calendar. Uses a stub calendar-vim on the runtimepath. - test-calendar.sh/.lua: Neovim setup() wiring + window-close under the real window API, and opt-out via use_calendar = false. Fixes surfaced by the suite: - diary.vim: new diary entries set filetype 'vimwiki' (was the raw extension, e.g. 'wiki'); the stray FileType autocmd also blocked the calendar window from closing. - init.lua: drop the redundant Neovim FileType autocmd (plugin/nuwiki.vim already wires both editors) and translate use_calendar=false into g:nuwiki_no_calendar so the opt-out actually disables wiring.
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
" development/tests/test-calendar-vim.vim — driven by development/tests/test-calendar-vim.sh.
|
||||
"
|
||||
" Pure-VimL regression suite for the calendar-vim integration. The diary
|
||||
" hooks (nuwiki#diary#calendar_action / nuwiki#diary#calendar_sign) are
|
||||
" implemented entirely in VimL and shared verbatim by the Vim and Neovim
|
||||
" clients, so this harness is the canonical coverage for them. The Vim
|
||||
" plugin-side hook wiring (plugin/nuwiki.vim's FileType autocmd) is also
|
||||
" asserted here; the Neovim setup() wiring has its own harness in
|
||||
" development/tests/test-calendar.lua.
|
||||
"
|
||||
" A stub calendar-vim is placed on the runtimepath by the shell wrapper so
|
||||
" :Calendar exists and g:calendar_action/g:calendar_sign already hold
|
||||
" calendar-vim's own defaults ('calendar#diary'/'calendar#sign') — exactly
|
||||
" the state nuwiki must detect and override.
|
||||
|
||||
let s:results = []
|
||||
let s:pass = 0
|
||||
let s:fail = 0
|
||||
let s:out = $NUWIKI_CALENDAR_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
|
||||
|
||||
let s:wiki_root = $NUWIKI_CALENDAR_WIKI
|
||||
|
||||
" ===== Hook wiring: nuwiki overrides calendar-vim's defaults =====
|
||||
" The stub set g:calendar_action='calendar#diary' / g:calendar_sign='calendar#sign'
|
||||
" at load. Opening this .wiki buffer fired plugin/nuwiki.vim's FileType autocmd,
|
||||
" which must have rewired both to the nuwiki delegators.
|
||||
|
||||
call s:record(&filetype ==# 'vimwiki', 'ftplugin.attached',
|
||||
\ &filetype ==# 'vimwiki' ? '' : 'filetype=' . &filetype)
|
||||
call s:record(get(g:, 'calendar_action', '') ==# 'vimwiki#diary#calendar_action',
|
||||
\ 'hook.action_wired', 'g:calendar_action=' . get(g:, 'calendar_action', ''))
|
||||
call s:record(get(g:, 'calendar_sign', '') ==# 'vimwiki#diary#calendar_sign',
|
||||
\ 'hook.sign_wired', 'g:calendar_sign=' . get(g:, 'calendar_sign', ''))
|
||||
|
||||
" ===== calendar_sign: marker reflects diary-file existence =====
|
||||
" The shell seeded a diary entry for 2026-05-30 and left 2026-05-31 absent.
|
||||
|
||||
call s:record(nuwiki#diary#calendar_sign(30, 5, 2026) ==# '*',
|
||||
\ 'sign.existing_date_marked',
|
||||
\ 'got ' . string(nuwiki#diary#calendar_sign(30, 5, 2026)))
|
||||
call s:record(nuwiki#diary#calendar_sign(31, 5, 2026) ==# '',
|
||||
\ 'sign.absent_date_unmarked',
|
||||
\ 'got ' . string(nuwiki#diary#calendar_sign(31, 5, 2026)))
|
||||
" The vimwiki# alias must return the identical result.
|
||||
call s:record(vimwiki#diary#calendar_sign(30, 5, 2026) ==# '*',
|
||||
\ 'sign.alias_matches', '')
|
||||
|
||||
" ===== calendar_action: opens WIKI_ROOT/diary/<date>.wiki, not ~/diary =====
|
||||
" Set up two windows so the "previous window" branch runs and we can assert
|
||||
" the calendar window is closed afterwards.
|
||||
|
||||
" Window A: the seed wiki (already current). Open a fresh window to stand in
|
||||
" for the calendar, then invoke the action from it.
|
||||
new
|
||||
file [stub-calendar]
|
||||
let s:cal_winid = win_getid()
|
||||
let s:wins_before = winnr('$')
|
||||
call nuwiki#diary#calendar_action(31, 5, 2026, 0, '')
|
||||
|
||||
let s:opened = expand('%:p')
|
||||
let s:want = s:wiki_root . '/diary/2026-05-31.wiki'
|
||||
call s:record(s:opened ==# s:want, 'action.opens_wiki_diary_path',
|
||||
\ 'opened=' . s:opened)
|
||||
call s:record(s:opened !~# '/diary/2026-05-31.wiki$' ? 0 : 1,
|
||||
\ 'action.path_has_date_filename', 'opened=' . s:opened)
|
||||
call s:record(s:opened !~# expand('~') . '/diary',
|
||||
\ 'action.not_home_diary', 'opened=' . s:opened)
|
||||
|
||||
" The calendar window must be closed once the diary is open.
|
||||
call s:record(win_id2win(s:cal_winid) == 0, 'action.closes_calendar_window',
|
||||
\ 'cal still at win ' . win_id2win(s:cal_winid))
|
||||
call s:record(winnr('$') == s:wins_before - 1, 'action.window_count_decremented',
|
||||
\ 'before=' . s:wins_before . ' after=' . winnr('$'))
|
||||
|
||||
" ===== calendar_action sets the wiki filetype on a new entry =====
|
||||
call s:record(&filetype ==# 'vimwiki', 'action.sets_filetype',
|
||||
\ 'filetype=' . &filetype)
|
||||
|
||||
" ===== 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!')
|
||||
Reference in New Issue
Block a user