neovim

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

eval_spec.lua (28538B)


      1 -- Test for various eval features.
      2 
      3 local t = require('test.testutil')
      4 local n = require('test.functional.testnvim')()
      5 
      6 local assert_alive = n.assert_alive
      7 local feed, insert, source = n.feed, n.insert, n.source
      8 local clear, command, expect = n.clear, n.command, n.expect
      9 local eq, eval, write_file = t.eq, n.eval, t.write_file
     10 local poke_eventloop = n.poke_eventloop
     11 local exc_exec = n.exc_exec
     12 local dedent = t.dedent
     13 
     14 describe('eval', function()
     15  setup(function()
     16    write_file(
     17      'test_eval_setup.vim',
     18      [[
     19      set noswapfile
     20      lang C
     21 
     22      fun AppendRegContents(reg)
     23        call AppendRegParts(a:reg, getregtype(a:reg), getreg(a:reg), string(getreg(a:reg, 0, 1)), getreg(a:reg, 1), string(getreg(a:reg, 1, 1)))
     24      endfun
     25 
     26      fun AppendRegParts(reg, type, cont, strcont, cont1, strcont1)
     27        call append('$', printf('%s: type %s; value: %s (%s), expr: %s (%s)', a:reg, a:type, a:cont, a:strcont, a:cont1, a:strcont1))
     28      endfun
     29 
     30      command -nargs=? AR :call AppendRegContents(<q-args>)
     31 
     32      fun SetReg(...)
     33          call call('setreg', a:000)
     34          call append('$', printf('{{{2 setreg(%s)', string(a:000)[1:-2]))
     35          call AppendRegContents(a:1)
     36          if a:1 isnot# '='
     37              execute "silent normal! Go==\n==\e\"".a:1."P"
     38          endif
     39      endfun
     40      ]]
     41    )
     42  end)
     43  before_each(clear)
     44  teardown(function()
     45    os.remove('test_eval_setup.vim')
     46  end)
     47 
     48  it(':let', function()
     49    command('so test_eval_setup.vim')
     50    command([[let @" = 'abc']])
     51    command('AR "')
     52    command([[let @" = "abc\n"]])
     53    source('AR "')
     54    command([[let @" = "abc\<C-m>"]])
     55    command('AR "')
     56    command([[let @= = '"abc"']])
     57    command('AR =')
     58    expect([[
     59 
     60      ": type v; value: abc (['abc']), expr: abc (['abc'])
     61      ": type V; value: abc]] .. "\000 (['abc']), expr: abc\000" .. [[ (['abc'])
     62      ": type V; value: abc]] .. "\r\000 (['abc\r']), expr: abc\r\000 (['abc\r" .. [['])
     63      =: type v; value: abc (['abc']), expr: "abc" (['"abc"'])]])
     64  end)
     65 
     66  it('basic setreg() tests', function()
     67    command('so test_eval_setup.vim')
     68    insert('{{{1 Basic setreg tests')
     69    command([[call SetReg('a', 'abcA', 'c')]])
     70    command([[call SetReg('b', 'abcB', 'v')]])
     71    command([[call SetReg('c', 'abcC', 'l')]])
     72    command([[call SetReg('d', 'abcD', 'V')]])
     73    command([[call SetReg('e', 'abcE', 'b')]])
     74    command([[call SetReg('f', 'abcF', "\<C-v>")]])
     75    command([[call SetReg('g', 'abcG', 'b10')]])
     76    command([[call SetReg('h', 'abcH', "\<C-v>10")]])
     77    command([[call SetReg('I', 'abcI')]])
     78 
     79    feed('Go{{{1 Appending single lines with setreg()<esc>')
     80    poke_eventloop()
     81    command([[call SetReg('A', 'abcAc', 'c')]])
     82    command([[call SetReg('A', 'abcAl', 'l')]])
     83    command([[call SetReg('A', 'abcAc2','c')]])
     84    command([[call SetReg('b', 'abcBc', 'ca')]])
     85    command([[call SetReg('b', 'abcBb', 'ba')]])
     86    command([[call SetReg('b', 'abcBc2','ca')]])
     87    command([[call SetReg('b', 'abcBb2','b50a')]])
     88    command([[call SetReg('C', 'abcCl', 'l')]])
     89    command([[call SetReg('C', 'abcCc', 'c')]])
     90    command([[call SetReg('D', 'abcDb', 'b')]])
     91    command([[call SetReg('E', 'abcEb', 'b')]])
     92    command([[call SetReg('E', 'abcEl', 'l')]])
     93    command([[call SetReg('F', 'abcFc', 'c')]])
     94    expect([[
     95      {{{1 Basic setreg tests
     96      {{{2 setreg('a', 'abcA', 'c')
     97      a: type v; value: abcA (['abcA']), expr: abcA (['abcA'])
     98      ==
     99      =abcA=
    100      {{{2 setreg('b', 'abcB', 'v')
    101      b: type v; value: abcB (['abcB']), expr: abcB (['abcB'])
    102      ==
    103      =abcB=
    104      {{{2 setreg('c', 'abcC', 'l')
    105      c: type V; value: abcC]] .. "\000 (['abcC']), expr: abcC\000" .. [[ (['abcC'])
    106      ==
    107      abcC
    108      ==
    109      {{{2 setreg('d', 'abcD', 'V')
    110      d: type V; value: abcD]] .. "\000 (['abcD']), expr: abcD\000" .. [[ (['abcD'])
    111      ==
    112      abcD
    113      ==
    114      {{{2 setreg('e', 'abcE', 'b')
    115      e: type ]] .. '\022' .. [[4; value: abcE (['abcE']), expr: abcE (['abcE'])
    116      ==
    117      =abcE=
    118      {{{2 setreg('f', 'abcF', ']] .. '\022' .. [[')
    119      f: type ]] .. '\022' .. [[4; value: abcF (['abcF']), expr: abcF (['abcF'])
    120      ==
    121      =abcF=
    122      {{{2 setreg('g', 'abcG', 'b10')
    123      g: type ]] .. '\022' .. [[10; value: abcG (['abcG']), expr: abcG (['abcG'])
    124      ==
    125      =abcG      =
    126      {{{2 setreg('h', 'abcH', ']] .. '\022' .. [[10')
    127      h: type ]] .. '\022' .. [[10; value: abcH (['abcH']), expr: abcH (['abcH'])
    128      ==
    129      =abcH      =
    130      {{{2 setreg('I', 'abcI')
    131      I: type v; value: abcI (['abcI']), expr: abcI (['abcI'])
    132      ==
    133      =abcI=
    134      {{{1 Appending single lines with setreg()
    135      {{{2 setreg('A', 'abcAc', 'c')
    136      A: type v; value: abcAabcAc (['abcAabcAc']), expr: abcAabcAc (['abcAabcAc'])
    137      ==
    138      =abcAabcAc=
    139      {{{2 setreg('A', 'abcAl', 'l')
    140      A: type V; value: abcAabcAcabcAl]] .. "\000 (['abcAabcAcabcAl']), expr: abcAabcAcabcAl\000" .. [[ (['abcAabcAcabcAl'])
    141      ==
    142      abcAabcAcabcAl
    143      ==
    144      {{{2 setreg('A', 'abcAc2', 'c')
    145      A: type v; value: abcAabcAcabcAl]] .. "\000abcAc2 (['abcAabcAcabcAl', 'abcAc2']), expr: abcAabcAcabcAl\000" .. [[abcAc2 (['abcAabcAcabcAl', 'abcAc2'])
    146      ==
    147      =abcAabcAcabcAl
    148      abcAc2=
    149      {{{2 setreg('b', 'abcBc', 'ca')
    150      b: type v; value: abcBabcBc (['abcBabcBc']), expr: abcBabcBc (['abcBabcBc'])
    151      ==
    152      =abcBabcBc=
    153      {{{2 setreg('b', 'abcBb', 'ba')
    154      b: type ]] .. '\022' .. [[5; value: abcBabcBcabcBb (['abcBabcBcabcBb']), expr: abcBabcBcabcBb (['abcBabcBcabcBb'])
    155      ==
    156      =abcBabcBcabcBb=
    157      {{{2 setreg('b', 'abcBc2', 'ca')
    158      b: type v; value: abcBabcBcabcBb]] .. "\000abcBc2 (['abcBabcBcabcBb', 'abcBc2']), expr: abcBabcBcabcBb\000" .. [[abcBc2 (['abcBabcBcabcBb', 'abcBc2'])
    159      ==
    160      =abcBabcBcabcBb
    161      abcBc2=
    162      {{{2 setreg('b', 'abcBb2', 'b50a')
    163      b: type ]] .. "\02250; value: abcBabcBcabcBb\000abcBc2abcBb2 (['abcBabcBcabcBb', 'abcBc2abcBb2']), expr: abcBabcBcabcBb\000" .. [[abcBc2abcBb2 (['abcBabcBcabcBb', 'abcBc2abcBb2'])
    164      ==
    165      =abcBabcBcabcBb                                    =
    166       abcBc2abcBb2
    167      {{{2 setreg('C', 'abcCl', 'l')
    168      C: type V; value: abcC]] .. "\000abcCl\000 (['abcC', 'abcCl']), expr: abcC\000abcCl\000" .. [[ (['abcC', 'abcCl'])
    169      ==
    170      abcC
    171      abcCl
    172      ==
    173      {{{2 setreg('C', 'abcCc', 'c')
    174      C: type v; value: abcC]] .. "\000abcCl\000abcCc (['abcC', 'abcCl', 'abcCc']), expr: abcC\000abcCl\000" .. [[abcCc (['abcC', 'abcCl', 'abcCc'])
    175      ==
    176      =abcC
    177      abcCl
    178      abcCc=
    179      {{{2 setreg('D', 'abcDb', 'b')
    180      D: type ]] .. "\0225; value: abcD\000abcDb (['abcD', 'abcDb']), expr: abcD\000" .. [[abcDb (['abcD', 'abcDb'])
    181      ==
    182      =abcD =
    183       abcDb
    184      {{{2 setreg('E', 'abcEb', 'b')
    185      E: type ]] .. "\0225; value: abcE\000abcEb (['abcE', 'abcEb']), expr: abcE\000" .. [[abcEb (['abcE', 'abcEb'])
    186      ==
    187      =abcE =
    188       abcEb
    189      {{{2 setreg('E', 'abcEl', 'l')
    190      E: type V; value: abcE]] .. "\000abcEb\000abcEl\000 (['abcE', 'abcEb', 'abcEl']), expr: abcE\000abcEb\000abcEl\000" .. [[ (['abcE', 'abcEb', 'abcEl'])
    191      ==
    192      abcE
    193      abcEb
    194      abcEl
    195      ==
    196      {{{2 setreg('F', 'abcFc', 'c')
    197      F: type v; value: abcF]] .. "\000abcFc (['abcF', 'abcFc']), expr: abcF\000" .. [[abcFc (['abcF', 'abcFc'])
    198      ==
    199      =abcF
    200      abcFc=]])
    201  end)
    202 
    203  -- luacheck: ignore 611 (Line contains only whitespace)
    204  it('appending NL with setreg()', function()
    205    command('so test_eval_setup.vim')
    206 
    207    command([[call setreg('a', 'abcA2', 'c')]])
    208    command([[call setreg('b', 'abcB2', 'v')]])
    209    command([[call setreg('c', 'abcC2', 'l')]])
    210    command([[call setreg('d', 'abcD2', 'V')]])
    211    command([[call setreg('e', 'abcE2', 'b')]])
    212    command([[call setreg('f', 'abcF2', "\<C-v>")]])
    213    -- These registers where set like this in the old test_eval.in but never
    214    -- copied to the output buffer with SetReg().  They do not appear in
    215    -- test_eval.ok.  Therefore they are commented out.
    216    --execute([[call setreg('g', 'abcG2', 'b10')]])
    217    --execute([[call setreg('h', 'abcH2', "\<C-v>10")]])
    218    --execute([[call setreg('I', 'abcI2')]])
    219 
    220    command([[call SetReg('A', "\n")]])
    221    command([[call SetReg('B', "\n", 'c')]])
    222    command([[call SetReg('C', "\n")]])
    223    command([[call SetReg('D', "\n", 'l')]])
    224    command([[call SetReg('E', "\n")]])
    225    command([[call SetReg('F', "\n", 'b')]])
    226    command("$put ='.'")
    227    expect([[
    228 
    229      {{{2 setreg('A', ']] .. '\000' .. [[')
    230      A: type V; value: abcA2]] .. "\000 (['abcA2']), expr: abcA2\000" .. [[ (['abcA2'])
    231      ==
    232      abcA2
    233      ==
    234      {{{2 setreg('B', ']] .. '\000' .. [[', 'c')
    235      B: type v; value: abcB2]] .. "\000 (['abcB2', '']), expr: abcB2\000" .. [[ (['abcB2', ''])
    236      ==
    237      =abcB2
    238      =
    239      {{{2 setreg('C', ']] .. '\000' .. [[')
    240      C: type V; value: abcC2]] .. "\000\000 (['abcC2', '']), expr: abcC2\000\000" .. [[ (['abcC2', ''])
    241      ==
    242      abcC2
    243 
    244      ==
    245      {{{2 setreg('D', ']] .. '\000' .. [[', 'l')
    246      D: type V; value: abcD2]] .. "\000\000 (['abcD2', '']), expr: abcD2\000\000" .. [[ (['abcD2', ''])
    247      ==
    248      abcD2
    249 
    250      ==
    251      {{{2 setreg('E', ']] .. '\000' .. [[')
    252      E: type V; value: abcE2]] .. "\000\000 (['abcE2', '']), expr: abcE2\000\000" .. [[ (['abcE2', ''])
    253      ==
    254      abcE2
    255 
    256      ==
    257      {{{2 setreg('F', ']] .. '\000' .. [[', 'b')
    258      F: type ]] .. "\0220; value: abcF2\000 (['abcF2', '']), expr: abcF2\000" .. [[ (['abcF2', ''])
    259      ==
    260      =abcF2=
    261       
    262      .]])
    263  end)
    264 
    265  it('setting and appending list with setreg()', function()
    266    command('so test_eval_setup.vim')
    267 
    268    command([[$put ='{{{1 Setting lists with setreg()']])
    269    command([=[call SetReg('a', ['abcA3'], 'c')]=])
    270    command([=[call SetReg('b', ['abcB3'], 'l')]=])
    271    command([=[call SetReg('c', ['abcC3'], 'b')]=])
    272    command([=[call SetReg('d', ['abcD3'])]=])
    273    command([=[call SetReg('e', [1, 2, 'abc', 3])]=])
    274    command([=[call SetReg('f', [1, 2, 3])]=])
    275 
    276    command([[$put ='{{{1 Appending lists with setreg()']])
    277    command([=[call SetReg('A', ['abcA3c'], 'c')]=])
    278    command([=[call SetReg('b', ['abcB3l'], 'la')]=])
    279    command([=[call SetReg('C', ['abcC3b'], 'lb')]=])
    280    command([=[call SetReg('D', ['abcD32'])]=])
    281    command([=[call SetReg('A', ['abcA32'])]=])
    282    command([=[call SetReg('B', ['abcB3c'], 'c')]=])
    283    command([=[call SetReg('C', ['abcC3l'], 'l')]=])
    284    command([=[call SetReg('D', ['abcD3b'], 'b')]=])
    285    expect([[
    286 
    287      {{{1 Setting lists with setreg()
    288      {{{2 setreg('a', ['abcA3'], 'c')
    289      a: type v; value: abcA3 (['abcA3']), expr: abcA3 (['abcA3'])
    290      ==
    291      =abcA3=
    292      {{{2 setreg('b', ['abcB3'], 'l')
    293      b: type V; value: abcB3]] .. "\000 (['abcB3']), expr: abcB3\000" .. [[ (['abcB3'])
    294      ==
    295      abcB3
    296      ==
    297      {{{2 setreg('c', ['abcC3'], 'b')
    298      c: type ]] .. '\022' .. [[5; value: abcC3 (['abcC3']), expr: abcC3 (['abcC3'])
    299      ==
    300      =abcC3=
    301      {{{2 setreg('d', ['abcD3'])
    302      d: type V; value: abcD3]] .. "\000 (['abcD3']), expr: abcD3\000" .. [[ (['abcD3'])
    303      ==
    304      abcD3
    305      ==
    306      {{{2 setreg('e', [1, 2, 'abc', 3])
    307      e: type V; value: 1]] .. "\0002\000abc\0003\000 (['1', '2', 'abc', '3']), expr: 1\0002\000abc\0003\000" .. [[ (['1', '2', 'abc', '3'])
    308      ==
    309      1
    310      2
    311      abc
    312      3
    313      ==
    314      {{{2 setreg('f', [1, 2, 3])
    315      f: type V; value: 1]] .. "\0002\0003\000 (['1', '2', '3']), expr: 1\0002\0003\000" .. [[ (['1', '2', '3'])
    316      ==
    317      1
    318      2
    319      3
    320      ==
    321      {{{1 Appending lists with setreg()
    322      {{{2 setreg('A', ['abcA3c'], 'c')
    323      A: type v; value: abcA3]] .. "\000abcA3c (['abcA3', 'abcA3c']), expr: abcA3\000" .. [[abcA3c (['abcA3', 'abcA3c'])
    324      ==
    325      =abcA3
    326      abcA3c=
    327      {{{2 setreg('b', ['abcB3l'], 'la')
    328      b: type V; value: abcB3]] .. "\000abcB3l\000 (['abcB3', 'abcB3l']), expr: abcB3\000abcB3l\000" .. [[ (['abcB3', 'abcB3l'])
    329      ==
    330      abcB3
    331      abcB3l
    332      ==
    333      {{{2 setreg('C', ['abcC3b'], 'lb')
    334      C: type ]] .. "\0226; value: abcC3\000abcC3b (['abcC3', 'abcC3b']), expr: abcC3\000" .. [[abcC3b (['abcC3', 'abcC3b'])
    335      ==
    336      =abcC3 =
    337       abcC3b
    338      {{{2 setreg('D', ['abcD32'])
    339      D: type V; value: abcD3]] .. "\000abcD32\000 (['abcD3', 'abcD32']), expr: abcD3\000abcD32\000" .. [[ (['abcD3', 'abcD32'])
    340      ==
    341      abcD3
    342      abcD32
    343      ==
    344      {{{2 setreg('A', ['abcA32'])
    345      A: type V; value: abcA3]] .. "\000abcA3c\000abcA32\000 (['abcA3', 'abcA3c', 'abcA32']), expr: abcA3\000abcA3c\000abcA32\000" .. [[ (['abcA3', 'abcA3c', 'abcA32'])
    346      ==
    347      abcA3
    348      abcA3c
    349      abcA32
    350      ==
    351      {{{2 setreg('B', ['abcB3c'], 'c')
    352      B: type v; value: abcB3]] .. "\000abcB3l\000abcB3c (['abcB3', 'abcB3l', 'abcB3c']), expr: abcB3\000abcB3l\000" .. [[abcB3c (['abcB3', 'abcB3l', 'abcB3c'])
    353      ==
    354      =abcB3
    355      abcB3l
    356      abcB3c=
    357      {{{2 setreg('C', ['abcC3l'], 'l')
    358      C: type V; value: abcC3]] .. "\000abcC3b\000abcC3l\000 (['abcC3', 'abcC3b', 'abcC3l']), expr: abcC3\000abcC3b\000abcC3l\000" .. [[ (['abcC3', 'abcC3b', 'abcC3l'])
    359      ==
    360      abcC3
    361      abcC3b
    362      abcC3l
    363      ==
    364      {{{2 setreg('D', ['abcD3b'], 'b')
    365      D: type ]] .. "\0226; value: abcD3\000abcD32\000abcD3b (['abcD3', 'abcD32', 'abcD3b']), expr: abcD3\000abcD32\000" .. [[abcD3b (['abcD3', 'abcD32', 'abcD3b'])
    366      ==
    367      =abcD3 =
    368       abcD32
    369       abcD3b]])
    370 
    371    -- From now on we delete the buffer contents after each expect() to make
    372    -- the next expect() easier to write.  This is necessary because null
    373    -- bytes on a line by itself don't play well together with the dedent
    374    -- function used in expect().
    375    command('%delete')
    376    command([[$put ='{{{1 Appending lists with NL with setreg()']])
    377    command([=[call SetReg('A', ["\n", 'abcA3l2'], 'l')]=])
    378    expect(
    379      '\n'
    380        .. '{{{1 Appending lists with NL with setreg()\n'
    381        .. "{{{2 setreg('A', ['\000', 'abcA3l2'], 'l')\n"
    382        .. "A: type V; value: abcA3\000abcA3c\000abcA32\000\000\000abcA3l2\000 (['abcA3', 'abcA3c', 'abcA32', '\000', 'abcA3l2']), expr: abcA3\000abcA3c\000abcA32\000\000\000abcA3l2\000 (['abcA3', 'abcA3c', 'abcA32', '\000', 'abcA3l2'])\n"
    383        .. '==\n'
    384        .. 'abcA3\n'
    385        .. 'abcA3c\n'
    386        .. 'abcA32\n'
    387        .. '\000\n'
    388        .. 'abcA3l2\n'
    389        .. '=='
    390    )
    391    command('%delete')
    392    command([=[call SetReg('B', ["\n", 'abcB3c2'], 'c')]=])
    393    expect(
    394      '\n'
    395        .. "{{{2 setreg('B', ['\000', 'abcB3c2'], 'c')\n"
    396        .. "B: type v; value: abcB3\000abcB3l\000abcB3c\000\000\000abcB3c2 (['abcB3', 'abcB3l', 'abcB3c', '\000', 'abcB3c2']), expr: abcB3\000abcB3l\000abcB3c\000\000\000abcB3c2 (['abcB3', 'abcB3l', 'abcB3c', '\000', 'abcB3c2'])\n"
    397        .. '==\n'
    398        .. '=abcB3\n'
    399        .. 'abcB3l\n'
    400        .. 'abcB3c\n'
    401        .. '\000\n'
    402        .. 'abcB3c2='
    403    )
    404    command('%delete')
    405    command([=[call SetReg('C', ["\n", 'abcC3b2'], 'b')]=])
    406    expect(
    407      '\n'
    408        .. "{{{2 setreg('C', ['\000', 'abcC3b2'], 'b')\n"
    409        .. "C: type \0227; value: abcC3\000abcC3b\000abcC3l\000\000\000abcC3b2 (['abcC3', 'abcC3b', 'abcC3l', '\000', 'abcC3b2']), expr: abcC3\000abcC3b\000abcC3l\000\000\000abcC3b2 (['abcC3', 'abcC3b', 'abcC3l', '\000', 'abcC3b2'])\n"
    410        .. '==\n'
    411        .. '=abcC3  =\n'
    412        .. ' abcC3b\n'
    413        .. ' abcC3l\n'
    414        .. ' \000\n'
    415        .. ' abcC3b2'
    416    )
    417    command('%delete')
    418    command([=[call SetReg('D', ["\n", 'abcD3b50'],'b50')]=])
    419    expect(
    420      '\n'
    421        .. "{{{2 setreg('D', ['\000', 'abcD3b50'], 'b50')\n"
    422        .. "D: type \02250; value: abcD3\000abcD32\000abcD3b\000\000\000abcD3b50 (['abcD3', 'abcD32', 'abcD3b', '\000', 'abcD3b50']), expr: abcD3\000abcD32\000abcD3b\000\000\000abcD3b50 (['abcD3', 'abcD32', 'abcD3b', '\000', 'abcD3b50'])\n"
    423        .. '==\n'
    424        .. '=abcD3                                             =\n'
    425        .. ' abcD32\n'
    426        .. ' abcD3b\n'
    427        .. ' \000\n'
    428        .. ' abcD3b50'
    429    )
    430  end)
    431 
    432  -- The tests for setting lists with NLs are split into separate it() blocks
    433  -- to make the expect() calls easier to write.  Otherwise the null byte can
    434  -- make trouble on a line on its own.
    435  it('setting lists with NLs with setreg(), part 1', function()
    436    command('so test_eval_setup.vim')
    437    command(
    438      [=[call SetReg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])]=]
    439    )
    440    expect(
    441      '\n'
    442        .. "{{{2 setreg('a', ['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2'])\n"
    443        .. "a: type V; value: abcA4-0\000\000\000abcA4-2\000\000\000abcA4-3\000abcA4-4\000abcA4-4-2\000 (['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2']), expr: abcA4-0\000\000\000abcA4-2\000\000\000abcA4-3\000abcA4-4\000abcA4-4-2\000 (['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2'])\n"
    444        .. '==\n'
    445        .. 'abcA4-0\n'
    446        .. '\000\n'
    447        .. 'abcA4-2\000\n'
    448        .. '\000abcA4-3\n'
    449        .. 'abcA4-4\000abcA4-4-2\n'
    450        .. '=='
    451    )
    452  end)
    453 
    454  it('setting lists with NLs with setreg(), part 2', function()
    455    command('so test_eval_setup.vim')
    456    command(
    457      [=[call SetReg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')]=]
    458    )
    459    expect(
    460      '\n'
    461        .. "{{{2 setreg('b', ['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2'], 'c')\n"
    462        .. "b: type v; value: abcB4c-0\000\000\000abcB4c-2\000\000\000abcB4c-3\000abcB4c-4\000abcB4c-4-2 (['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2']), expr: abcB4c-0\000\000\000abcB4c-2\000\000\000abcB4c-3\000abcB4c-4\000abcB4c-4-2 (['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2'])\n"
    463        .. '==\n'
    464        .. '=abcB4c-0\n'
    465        .. '\000\n'
    466        .. 'abcB4c-2\000\n'
    467        .. '\000abcB4c-3\n'
    468        .. 'abcB4c-4\000abcB4c-4-2='
    469    )
    470  end)
    471 
    472  it('setting lists with NLs with setreg(), part 3', function()
    473    command('so test_eval_setup.vim')
    474    command(
    475      [=[call SetReg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')]=]
    476    )
    477    expect(
    478      '\n'
    479        .. "{{{2 setreg('c', ['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2'], 'l')\n"
    480        .. "c: type V; value: abcC4l-0\000\000\000abcC4l-2\000\000\000abcC4l-3\000abcC4l-4\000abcC4l-4-2\000 (['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2']), expr: abcC4l-0\000\000\000abcC4l-2\000\000\000abcC4l-3\000abcC4l-4\000abcC4l-4-2\000 (['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2'])\n"
    481        .. '==\n'
    482        .. 'abcC4l-0\n'
    483        .. '\000\n'
    484        .. 'abcC4l-2\000\n'
    485        .. '\000abcC4l-3\n'
    486        .. 'abcC4l-4\000abcC4l-4-2\n'
    487        .. '=='
    488    )
    489  end)
    490  it('setting lists with NLs with setreg(), part 4', function()
    491    command('so test_eval_setup.vim')
    492    command(
    493      [=[call SetReg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')]=]
    494    )
    495    expect(
    496      '\n'
    497        .. "{{{2 setreg('d', ['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2'], 'b')\n"
    498        .. "d: type \02219; value: abcD4b-0\000\000\000abcD4b-2\000\000\000abcD4b-3\000abcD4b-4\000abcD4b-4-2 (['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2']), expr: abcD4b-0\000\000\000abcD4b-2\000\000\000abcD4b-3\000abcD4b-4\000abcD4b-4-2 (['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2'])\n"
    499        .. '==\n'
    500        .. '=abcD4b-0           =\n'
    501        .. ' \000\n'
    502        .. ' abcD4b-2\000\n'
    503        .. ' \000abcD4b-3\n'
    504        .. ' abcD4b-4\000abcD4b-4-2'
    505    )
    506  end)
    507  it('setting lists with NLs with setreg(), part 5', function()
    508    command('so test_eval_setup.vim')
    509    command(
    510      [=[call SetReg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')]=]
    511    )
    512    expect(
    513      '\n'
    514        .. "{{{2 setreg('e', ['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2'], 'b10')\n"
    515        .. "e: type \02210; value: abcE4b10-0\000\000\000abcE4b10-2\000\000\000abcE4b10-3\000abcE4b10-4\000abcE4b10-4-2 (['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2']), expr: abcE4b10-0\000\000\000abcE4b10-2\000\000\000abcE4b10-3\000abcE4b10-4\000abcE4b10-4-2 (['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2'])\n"
    516        .. '==\n'
    517        .. '=abcE4b10-0=\n'
    518        .. ' \000\n'
    519        .. ' abcE4b10-2\000\n'
    520        .. ' \000abcE4b10-3\n'
    521        .. ' abcE4b10-4\000abcE4b10-4-2'
    522    )
    523  end)
    524 
    525  it('getreg("a",1,1) returns a valid list when "a is unset', function()
    526    -- Precondition: "a is actually unset and "0 is nonempty
    527    eq('', eval("getregtype('a')"))
    528    eq('', eval("getreg('a')"))
    529    command("call setreg('0','text')")
    530 
    531    -- This used to return a NULL list
    532    -- which setreg didn't handle
    533    command("let x = getreg('a',1,1)")
    534    command("call setreg('0',x)")
    535 
    536    -- nvim didn't crash and "0 was emptied
    537    assert_alive()
    538    eq({}, eval("getreg('0',1,1)"))
    539 
    540    -- x is a mutable list
    541    command('let y = x')
    542    eq({}, eval('y'))
    543    command("call add(x, 'item')")
    544    eq({ 'item' }, eval('y'))
    545  end)
    546 
    547  it('sets the unnamed register when the "u" option is passed to setreg', function()
    548    command("call setreg('a','a reg', 'cu')")
    549    eq('a reg', eval('@"'))
    550    command("call setreg('b','b reg', 'cu')")
    551    eq('b reg', eval('@"'))
    552    command("call setreg('c','c reg', 'c')")
    553    eq('b reg', eval('@"'))
    554  end)
    555 
    556  it('search and expressions', function()
    557    command('so test_eval_setup.vim')
    558    command([=[call SetReg('/', ['abc/'])]=])
    559    command([=[call SetReg('/', ["abc/\n"])]=])
    560    command([=[call SetReg('=', ['"abc/"'])]=])
    561    command([=[call SetReg('=', ["\"abc/\n\""])]=])
    562    expect(
    563      [[
    564 
    565      {{{2 setreg('/', ['abc/'])
    566      /: type v; value: abc/ (['abc/']), expr: abc/ (['abc/'])
    567      ==
    568      =abc/=
    569      {{{2 setreg('/', ['abc/]]
    570        .. '\000'
    571        .. [['])
    572      /: type v; value: abc/]]
    573        .. "\000 (['abc/\000']), expr: abc/\000 (['abc/\000"
    574        .. [['])
    575      ==
    576      =abc/]]
    577        .. '\000'
    578        .. [[=
    579      {{{2 setreg('=', ['"abc/"'])
    580      =: type v; value: abc/ (['abc/']), expr: "abc/" (['"abc/"'])
    581      {{{2 setreg('=', ['"abc/]]
    582        .. '\000'
    583        .. [["'])
    584      =: type v; value: abc/]]
    585        .. "\000 (['abc/\000"
    586        .. [[']), expr: "abc/]]
    587        .. '\000'
    588        .. [[" (['"abc/]]
    589        .. '\000'
    590        .. [["'])]]
    591    )
    592  end)
    593 
    594  describe('system clipboard', function()
    595    before_each(function()
    596      command('let &runtimepath = "test/functional/fixtures,".&runtimepath')
    597      command('call getreg("*")') -- force load of provider
    598    end)
    599 
    600    it('works', function()
    601      insert([[
    602 Some first line (this text was at the top of the old test_eval.in).
    603 
    604 Note: system clipboard is saved, changed and restored.
    605 
    606 clipboard contents
    607 something else]])
    608      command('so test_eval_setup.vim')
    609      -- Save and restore system clipboard.
    610      command("let _clipreg = ['*', getreg('*'), getregtype('*')]")
    611      command('let _clipopt = &cb')
    612      command("let &cb='unnamed'")
    613      command('5y')
    614      command('AR *')
    615      command('tabdo :windo :echo "hi"')
    616      command('6y')
    617      command('AR *')
    618      command('let &cb=_clipopt')
    619      command("call call('setreg', _clipreg)")
    620      expect(
    621        [[
    622 Some first line (this text was at the top of the old test_eval.in).
    623 
    624 Note: system clipboard is saved, changed and restored.
    625 
    626 clipboard contents
    627 something else
    628 *: type V; value: clipboard contents]]
    629          .. '\00'
    630          .. [[ (['clipboard contents']), expr: clipboard contents]]
    631          .. '\00'
    632          .. [[ (['clipboard contents'])
    633 *: type V; value: something else]]
    634          .. '\00'
    635          .. [[ (['something else']), expr: something else]]
    636          .. '\00'
    637          .. [[ (['something else'])]]
    638      )
    639    end)
    640  end)
    641 
    642  it('errors', function()
    643    source([[
    644      fun ErrExe(str)
    645 call append('$', 'Executing '.a:str)
    646 try
    647   execute a:str
    648 catch
    649   $put =v:exception
    650 endtry
    651      endfun]])
    652    command([[call ErrExe('call setreg()')]])
    653    command([[call ErrExe('call setreg(1)')]])
    654    command([[call ErrExe('call setreg(1, 2, 3, 4)')]])
    655    command([=[call ErrExe('call setreg([], 2)')]=])
    656    command([=[call ErrExe('call setreg(1, 2, [])')]=])
    657    command([=[call ErrExe('call setreg("/", ["1", "2"])')]=])
    658    command([=[call ErrExe('call setreg("=", ["1", "2"])')]=])
    659    command([=[call ErrExe('call setreg(1, ["", "", [], ""])')]=])
    660    expect([[
    661 
    662      Executing call setreg()
    663      Vim(call):E119: Not enough arguments for function: setreg
    664      Executing call setreg(1)
    665      Vim(call):E119: Not enough arguments for function: setreg
    666      Executing call setreg(1, 2, 3, 4)
    667      Vim(call):E118: Too many arguments for function: setreg
    668      Executing call setreg([], 2)
    669      Vim(call):E730: Using a List as a String
    670      Executing call setreg(1, 2, [])
    671      Vim(call):E730: Using a List as a String
    672      Executing call setreg("/", ["1", "2"])
    673      Vim(call):E883: Search pattern and expression register may not contain two or more lines
    674      Executing call setreg("=", ["1", "2"])
    675      Vim(call):E883: Search pattern and expression register may not contain two or more lines
    676      Executing call setreg(1, ["", "", [], ""])
    677      Vim(call):E730: Using a List as a String]])
    678  end)
    679 
    680  it('function name not starting with a capital', function()
    681    eq(
    682      'Vim(function):E128: Function name must start with a capital or "s:": g:test()\\nendfunction',
    683      exc_exec(dedent([[
    684        function! g:test()
    685        endfunction]]))
    686    )
    687  end)
    688 
    689  it('Function name followed by #', function()
    690    eq(
    691      'Vim(function):E128: Function name must start with a capital or "s:": test2() "#\\nendfunction',
    692      exc_exec(dedent([[
    693        function! test2() "#
    694        endfunction]]))
    695    )
    696  end)
    697 
    698  it('function name includes a colon', function()
    699    eq(
    700      'Vim(function):E884: Function name cannot contain a colon: b:test()\\nendfunction',
    701      exc_exec(dedent([[
    702        function! b:test()
    703        endfunction]]))
    704    )
    705  end)
    706 
    707  it('function name starting with/without "g:", buffer-local funcref', function()
    708    command([[
    709      function! g:Foo(n)
    710        $put ='called Foo(' . a:n . ')'
    711      endfunction
    712    ]])
    713    command("let b:my_func = function('Foo')")
    714    command('call b:my_func(1)')
    715    command('echo g:Foo(2)')
    716    command('echo Foo(3)')
    717    expect([[
    718 
    719      called Foo(1)
    720      called Foo(2)
    721      called Foo(3)]])
    722  end)
    723 
    724  it('script-local function used in Funcref must exist', function()
    725    source([[
    726      " Vim script used in test_eval.in.  Needed for script-local function.
    727 
    728      func s:Testje()
    729        return "foo"
    730      endfunc
    731 
    732      let Bar = function('s:Testje')
    733 
    734      $put ='s:Testje exists: ' . exists('s:Testje')
    735      $put ='func s:Testje exists: ' . exists('*s:Testje')
    736      $put ='Bar exists: ' . exists('Bar')
    737      $put ='func Bar exists: ' . exists('*Bar')
    738      ]])
    739    expect([[
    740 
    741      s:Testje exists: 0
    742      func s:Testje exists: 1
    743      Bar exists: 1
    744      func Bar exists: 1]])
    745  end)
    746 
    747  it("using $ instead of '$' must give an error", function()
    748    eq(
    749      'Vim(call):E116: Invalid arguments for function append',
    750      exc_exec('call append($, "foobar")')
    751    )
    752  end)
    753 
    754  it('getcurpos/setpos', function()
    755    insert([[
    756      012345678
    757      012345678
    758 
    759      start:]])
    760    command('/^012345678')
    761    feed('6l')
    762    poke_eventloop()
    763    command('let sp = getcurpos()')
    764    feed('0')
    765    poke_eventloop()
    766    command("call setpos('.', sp)")
    767    feed('jyl')
    768    poke_eventloop()
    769    command('$put')
    770    expect([[
    771      012345678
    772      012345678
    773 
    774      start:
    775      6]])
    776  end)
    777 
    778  it('substring and variable name', function()
    779    command("let str = 'abcdef'")
    780    command('let n = 3')
    781    eq('def', eval('str[n:]'))
    782    eq('abcd', eval('str[:n]'))
    783    eq('d', eval('str[n:n]'))
    784    command('unlet n')
    785    command('let nn = 3')
    786    eq('def', eval('str[nn:]'))
    787    eq('abcd', eval('str[:nn]'))
    788    eq('d', eval('str[nn:nn]'))
    789    command('unlet nn')
    790    command('let b:nn = 4')
    791    eq('ef', eval('str[b:nn:]'))
    792    eq('abcde', eval('str[:b:nn]'))
    793    eq('e', eval('str[b:nn:b:nn]'))
    794  end)
    795 end)