neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

test_stacktrace.vim (3905B)


      1 " Test for getstacktrace() and v:stacktrace
      2 
      3 source vim9.vim
      4 
      5 let s:thisfile = expand('%:p')
      6 let s:testdir = s:thisfile->fnamemodify(':h')
      7 
      8 func Filepath(name)
      9  return s:testdir .. '/' .. a:name
     10 endfunc
     11 
     12 func AssertStacktrace(expect, actual)
     13  call assert_equal(Filepath('runtest.vim'), a:actual[0]['filepath'])
     14  call assert_equal(a:expect, a:actual[-len(a:expect):])
     15 endfunc
     16 
     17 func Test_getstacktrace()
     18  let g:stacktrace = []
     19  let lines1 =<< trim [SCRIPT]
     20  " Xscript1
     21  source Xscript2
     22  func Xfunc1()
     23    " Xfunc1
     24    call Xfunc2()
     25  endfunc
     26  [SCRIPT]
     27  let lines2 =<< trim [SCRIPT]
     28  " Xscript2
     29  func Xfunc2()
     30    " Xfunc2
     31    let g:stacktrace = getstacktrace()
     32  endfunc
     33  [SCRIPT]
     34  call writefile(lines1, 'Xscript1', 'D')
     35  call writefile(lines2, 'Xscript2', 'D')
     36  source Xscript1
     37  call Xfunc1()
     38  call AssertStacktrace([
     39        \ #{funcref: funcref('Test_getstacktrace'), lnum: 37, filepath: s:thisfile},
     40        \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
     41        \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
     42        \ ], g:stacktrace)
     43  unlet g:stacktrace
     44 endfunc
     45 
     46 func Test_getstacktrace_event()
     47  let g:stacktrace = []
     48  let lines1 =<< trim [SCRIPT]
     49  " Xscript1
     50  func Xfunc()
     51    " Xfunc
     52    let g:stacktrace = getstacktrace()
     53  endfunc
     54  augroup test_stacktrace
     55    autocmd SourcePre * call Xfunc()
     56  augroup END
     57  [SCRIPT]
     58  let lines2 =<< trim [SCRIPT]
     59  " Xscript2
     60  [SCRIPT]
     61  call writefile(lines1, 'Xscript1', 'D')
     62  call writefile(lines2, 'Xscript2', 'D')
     63  source Xscript1
     64  source Xscript2
     65  call AssertStacktrace([
     66       \ #{funcref: funcref('Test_getstacktrace_event'), lnum: 64, filepath: s:thisfile},
     67       \ #{event: 'SourcePre Autocommands for "*"', lnum: 7, filepath: Filepath('Xscript1')},
     68       \ #{funcref: funcref('Xfunc'), lnum: 4, filepath: Filepath('Xscript1')},
     69       \ ], g:stacktrace)
     70  augroup test_stacktrace
     71    autocmd!
     72  augroup END
     73  unlet g:stacktrace
     74 endfunc
     75 
     76 func Test_vstacktrace()
     77  let lines1 =<< trim [SCRIPT]
     78  " Xscript1
     79  source Xscript2
     80  func Xfunc1()
     81    " Xfunc1
     82    call Xfunc2()
     83  endfunc
     84  [SCRIPT]
     85  let lines2 =<< trim [SCRIPT]
     86  " Xscript2
     87  func Xfunc2()
     88    " Xfunc2
     89    throw 'Exception from Xfunc2'
     90  endfunc
     91  [SCRIPT]
     92  call writefile(lines1, 'Xscript1', 'D')
     93  call writefile(lines2, 'Xscript2', 'D')
     94  source Xscript1
     95  call assert_equal([], v:stacktrace)
     96  try
     97    call Xfunc1()
     98  catch
     99    let stacktrace = v:stacktrace
    100    try
    101      call Xfunc1()
    102    catch
    103      let stacktrace_inner = v:stacktrace
    104    endtry
    105    let stacktrace_after = v:stacktrace " should be restored by the exception stack to the previous one
    106  endtry
    107  call assert_equal([], v:stacktrace)
    108  call AssertStacktrace([
    109       \ #{funcref: funcref('Test_vstacktrace'), lnum: 97, filepath: s:thisfile},
    110       \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
    111       \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
    112       \ ], stacktrace)
    113  call AssertStacktrace([
    114       \ #{funcref: funcref('Test_vstacktrace'), lnum: 101, filepath: s:thisfile},
    115       \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
    116       \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
    117       \ ], stacktrace_inner)
    118  call assert_equal(stacktrace, stacktrace_after)
    119 endfunc
    120 
    121 func Test_stacktrace_vim9()
    122  let lines =<< trim [SCRIPT]
    123  var stacktrace = getstacktrace()
    124  assert_notequal([], stacktrace)
    125  for d in stacktrace
    126    assert_true(has_key(d, 'lnum'))
    127  endfor
    128  try
    129    throw 'Exception from s:Func'
    130  catch
    131    assert_notequal([], v:stacktrace)
    132    assert_equal(len(stacktrace), len(v:stacktrace))
    133    for d in v:stacktrace
    134      assert_true(has_key(d, 'lnum'))
    135    endfor
    136  endtry
    137  call assert_equal([], v:stacktrace)
    138  [SCRIPT]
    139  call CheckDefSuccess(lines)
    140 endfunc
    141 
    142 " vim: shiftwidth=2 sts=2 expandtab