neovim

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

test_let.vim (21531B)


      1 " Tests for the :let command.
      2 
      3 source vim9.vim
      4 
      5 func Test_let()
      6  " Test to not autoload when assigning.  It causes internal error.
      7  set runtimepath+=./sautest
      8  let Test104#numvar = function('tr')
      9  call assert_equal("function('tr')", string(Test104#numvar))
     10 
     11  let foo#tr = function('tr')
     12  call assert_equal("function('tr')", string(foo#tr))
     13  unlet foo#tr
     14 
     15  let a = 1
     16  let b = 2
     17 
     18  let out = execute('let a b')
     19  let s = "\na                     #1\nb                     #2"
     20  call assert_equal(s, out)
     21 
     22  let out = execute('let {0 == 1 ? "a" : "b"}')
     23  let s = "\nb                     #2"
     24  call assert_equal(s, out)
     25 
     26  let out = execute('let {0 == 1 ? "a" : "b"} a')
     27  let s = "\nb                     #2\na                     #1"
     28  call assert_equal(s, out)
     29 
     30  let out = execute('let a {0 == 1 ? "a" : "b"}')
     31  let s = "\na                     #1\nb                     #2"
     32  call assert_equal(s, out)
     33 
     34  " Test for displaying a string variable
     35  let s = 'vim'
     36  let out = execute('let s')
     37  let s = "\ns                      vim"
     38  call assert_equal(s, out)
     39 
     40  " Test for displaying a list variable
     41  let l = [1, 2]
     42  let out = execute('let l')
     43  let s = "\nl                     [1, 2]"
     44  call assert_equal(s, out)
     45 
     46  " Test for displaying a dict variable
     47  let d = {'k' : 'v'}
     48  let out = execute('let d')
     49  let s = "\nd                     {'k': 'v'}"
     50  call assert_equal(s, out)
     51 
     52  " Test for displaying a function reference variable
     53  let F = function('min')
     54  let out = execute('let F')
     55  let s = "\nF                     *min()"
     56  call assert_equal(s, out)
     57 
     58  let x = 0
     59  if 0 | let x = 1 | endif
     60  call assert_equal(0, x)
     61 
     62  " Display a list item using an out of range index
     63  let l = [10]
     64  call assert_fails('let l[1]', 'E684:')
     65 
     66  " List special variable dictionaries
     67  let g:Test_Global_Var = 5
     68  call assert_match("\nTest_Global_Var       #5", execute('let g:'))
     69  unlet g:Test_Global_Var
     70 
     71  let b:Test_Buf_Var = 8
     72  call assert_match("\nb:Test_Buf_Var        #8", execute('let b:'))
     73  unlet b:Test_Buf_Var
     74 
     75  let w:Test_Win_Var = 'foo'
     76  call assert_equal("\nw:Test_Win_Var         foo", execute('let w:'))
     77  unlet w:Test_Win_Var
     78 
     79  let t:Test_Tab_Var = 'bar'
     80  call assert_equal("\nt:Test_Tab_Var         bar", execute('let t:'))
     81  unlet t:Test_Tab_Var
     82 
     83  let s:Test_Script_Var = [7]
     84  call assert_match("\ns:Test_Script_Var     \\[7]", execute('let s:'))
     85  unlet s:Test_Script_Var
     86 
     87  let l:Test_Local_Var = {'k' : 5}
     88  call assert_match("\nl:Test_Local_Var      {'k': 5}", execute('let l:'))
     89  call assert_match("v:errors              []", execute('let v:'))
     90 
     91  " Test for assigning multiple list items
     92  let l = [1, 2, 3]
     93  let [l[0], l[1]] = [10, 20]
     94  call assert_equal([10, 20, 3], l)
     95 
     96  " Test for using curly brace name in the LHS of an assignment
     97  let listvar = [1, 2]
     98  let s = 'listvar'
     99  let {s} = [3, 4]
    100  call assert_equal([3, 4], listvar)
    101 
    102  " Test for using curly brace name as a list and as list index in the LHS of
    103  " an assignment
    104  let listvar = [1, 2]
    105  let idx = 1
    106  let s = 'listvar'
    107  let {s}[0] = 10
    108  let s = 'idx'
    109  let listvar[{s}] = 20
    110  call assert_equal([10, 20], listvar)
    111  let s1 = 'listvar'
    112  let s2 = 'idx'
    113  let {s1}[{s2}] = 30
    114  call assert_equal([10, 30], listvar)
    115 
    116  " Test for errors in conditional expression
    117  call assert_fails('let val = [] ? 1 : 2', 'E745:')
    118  call assert_fails('let val = 1 ? 5+ : 6', 'E121:')
    119  call assert_fails('let val = 1 ? 0 : 5+', 'E15:')
    120  call assert_false(exists('val'))
    121 
    122  " Test for errors in logical operators
    123  let @a = 'if [] || 0 | let val = 2 | endif'
    124  call assert_fails('exe @a', 'E745:')
    125  call assert_fails('call feedkeys(":let val = 0 || []\<cr>", "xt")', 'E745:')
    126  call assert_fails('exe "let val = [] && 5"', 'E745:')
    127  call assert_fails('exe "let val = 6 && []"', 'E745:')
    128 endfunc
    129 
    130 func s:set_arg1(a) abort
    131  let a:a = 1
    132 endfunction
    133 
    134 func s:set_arg2(a) abort
    135  let a:b = 1
    136 endfunction
    137 
    138 func s:set_arg3(a) abort
    139  let b = a:
    140  let b['a'] = 1
    141 endfunction
    142 
    143 func s:set_arg4(a) abort
    144  let b = a:
    145  let b['a'] = 1
    146 endfunction
    147 
    148 func s:set_arg5(a) abort
    149  let b = a:
    150  let b['a'][0] = 1
    151 endfunction
    152 
    153 func s:set_arg6(a) abort
    154  let a:a[0] = 1
    155 endfunction
    156 
    157 func s:set_arg7(a) abort
    158  call extend(a:, {'a': 1})
    159 endfunction
    160 
    161 func s:set_arg8(a) abort
    162  call extend(a:, {'b': 1})
    163 endfunction
    164 
    165 func s:set_arg9(a) abort
    166  let a:['b'] = 1
    167 endfunction
    168 
    169 func s:set_arg10(a) abort
    170  let b = a:
    171  call extend(b, {'a': 1})
    172 endfunction
    173 
    174 func s:set_arg11(a) abort
    175  let b = a:
    176  call extend(b, {'b': 1})
    177 endfunction
    178 
    179 func s:set_arg12(a) abort
    180  let b = a:
    181  let b['b'] = 1
    182 endfunction
    183 
    184 func Test_let_arg_fail()
    185  call assert_fails('call s:set_arg1(1)', 'E46:')
    186  call assert_fails('call s:set_arg2(1)', 'E461:')
    187  call assert_fails('call s:set_arg3(1)', 'E46:')
    188  call assert_fails('call s:set_arg4(1)', 'E46:')
    189  call assert_fails('call s:set_arg5(1)', 'E46:')
    190  call s:set_arg6([0])
    191  call assert_fails('call s:set_arg7(1)', 'E742:')
    192  call assert_fails('call s:set_arg8(1)', 'E742:')
    193  call assert_fails('call s:set_arg9(1)', 'E461:')
    194  call assert_fails('call s:set_arg10(1)', 'E742:')
    195  call assert_fails('call s:set_arg11(1)', 'E742:')
    196  call assert_fails('call s:set_arg12(1)', 'E461:')
    197 endfunction
    198 
    199 func s:set_varg1(...) abort
    200  let a:000 = []
    201 endfunction
    202 
    203 func s:set_varg2(...) abort
    204  let a:000[0] = 1
    205 endfunction
    206 
    207 func s:set_varg3(...) abort
    208  let a:000 += [1]
    209 endfunction
    210 
    211 func s:set_varg4(...) abort
    212  call add(a:000, 1)
    213 endfunction
    214 
    215 func s:set_varg5(...) abort
    216  let a:000[0][0] = 1
    217 endfunction
    218 
    219 func s:set_varg6(...) abort
    220  let b = a:000
    221  let b[0] = 1
    222 endfunction
    223 
    224 func s:set_varg7(...) abort
    225  let b = a:000
    226  let b += [1]
    227 endfunction
    228 
    229 func s:set_varg8(...) abort
    230  let b = a:000
    231  call add(b, 1)
    232 endfunction
    233 
    234 func s:set_varg9(...) abort
    235  let b = a:000
    236  let b[0][0] = 1
    237 endfunction
    238 
    239 func Test_let_varg_fail()
    240  call assert_fails('call s:set_varg1(1)', 'E46:')
    241  call assert_fails('call s:set_varg2(1)', 'E742:')
    242  call assert_fails('call s:set_varg3(1)', 'E46:')
    243  call assert_fails('call s:set_varg4(1)', 'E742:')
    244  call s:set_varg5([0])
    245  call assert_fails('call s:set_varg6(1)', 'E742:')
    246  call assert_fails('call s:set_varg7(1)', 'E742:')
    247  call assert_fails('call s:set_varg8(1)', 'E742:')
    248  call s:set_varg9([0])
    249 endfunction
    250 
    251 func Test_let_utf8_environment()
    252  let $a = 'ĀĒĪŌŪあいうえお'
    253  call assert_equal('ĀĒĪŌŪあいうえお', $a)
    254 endfunc
    255 
    256 func Test_let_no_type_checking()
    257  let v = 1
    258  let v = [1,2,3]
    259  let v = {'a': 1, 'b': 2}
    260  let v = 3.4
    261  let v = 'hello'
    262 endfunc
    263 
    264 func Test_let_termcap()
    265  throw 'Skipped: Nvim does not support termcap options'
    266  " Terminal code
    267  let old_t_te = &t_te
    268  let &t_te = "\<Esc>[yes;"
    269  call assert_match('t_te.*^[[yes;', execute("set termcap"))
    270  let &t_te = old_t_te
    271 
    272  if exists("+t_k1")
    273    " Key code
    274    let old_t_k1 = &t_k1
    275    let &t_k1 = "that"
    276    call assert_match('t_k1.*that', execute("set termcap"))
    277    let &t_k1 = old_t_k1
    278  endif
    279 
    280  call assert_fails('let x = &t_xx', 'E113:')
    281  let &t_xx = "yes"
    282  call assert_equal("yes", &t_xx)
    283  let &t_xx = ""
    284  call assert_fails('let x = &t_xx', 'E113:')
    285 endfunc
    286 
    287 func Test_let_option_error()
    288  let _w = &tw
    289  let &tw = 80
    290  call assert_fails('let &tw .= 1', ['E734:', 'E734:'])
    291  call assert_fails('let &tw .= []', ['E734:', 'E734:'])
    292  call assert_fails('let &tw = []', ['E745:', 'E745:'])
    293  call assert_fails('let &tw += []', ['E745:', 'E745:'])
    294  call assert_equal(80, &tw)
    295  let &tw = _w
    296 
    297  let _w = &autoread
    298  let &autoread = 1
    299  call assert_fails('let &autoread .= 1', ['E734:', 'E734:'])
    300  call assert_fails('let &autoread .= []', ['E734:', 'E734:'])
    301  call assert_fails('let &autoread = []', ['E745:', 'E745:'])
    302  call assert_fails('let &autoread += []', ['E745:', 'E745:'])
    303  call assert_equal(1, &autoread)
    304  let &autoread = _w
    305 
    306  let _w = &fillchars
    307  let &fillchars = "vert:|"
    308  call assert_fails('let &fillchars += "diff:-"', ['E734:', 'E734:'])
    309  call assert_fails('let &fillchars += []', ['E734:', 'E734:'])
    310  call assert_fails('let &fillchars = []', ['E730:', 'E730:'])
    311  call assert_fails('let &fillchars .= []', ['E730:', 'E730:'])
    312  call assert_equal("vert:|", &fillchars)
    313  let &fillchars = _w
    314 
    315  call assert_fails('let &nosuchoption = 1', ['E355:', 'E355:'])
    316  call assert_fails('let &nosuchoption = ""', ['E355:', 'E355:'])
    317  call assert_fails('let &nosuchoption = []', ['E355:', 'E355:'])
    318  call assert_fails('let &t_xx = []', ['E730:', 'E730:'])
    319 endfunc
    320 
    321 " Errors with the :let statement
    322 func Test_let_errors()
    323  let s = 'abcd'
    324  call assert_fails('let s[1] = 5', 'E689:')
    325 
    326  let l = [1, 2, 3]
    327  call assert_fails('let l[:] = 5', 'E709:')
    328 
    329  call assert_fails('let x:lnum=5', ['E121:', 'E488:'])
    330  call assert_fails('let v:=5', 'E461:')
    331  call assert_fails('let [a]', 'E474:')
    332  call assert_fails('let [a, b] = [', 'E697:')
    333  call assert_fails('let [a, b] = [10, 20', 'E696:')
    334  call assert_fails('let [a, b] = 10', 'E714:')
    335  call assert_fails('let [a, , b] = [10, 20]', 'E475:')
    336  call assert_fails('let [a, b&] = [10, 20]', 'E475:')
    337  call assert_fails('let $ = 10', 'E475:')
    338  call assert_fails('let $FOO[1] = "abc"', 'E18:')
    339  call assert_fails('let &buftype[1] = "nofile"', 'E18:')
    340  let s = "var"
    341  let var = 1
    342  call assert_fails('let var += [1,2]', 'E734:')
    343  call assert_fails('let {s}.1 = 2', 'E1203:')
    344  call assert_fails('let a[1] = 5', 'E121:')
    345  let l = [[1,2]]
    346  call assert_fails('let l[:][0] = [5]', 'E708:')
    347  let d = {'k' : 4}
    348  call assert_fails('let d.# = 5', 'E488:')
    349  call assert_fails('let d.m += 5', 'E716:')
    350  call assert_fails('let m = d[{]', 'E15:')
    351  let l = [1, 2]
    352  call assert_fails('let l[2] = 0', 'E684:')
    353  call assert_fails('let l[0:1] = [1, 2, 3]', 'E710:')
    354  call assert_fails('let l[-2:-3] = [3, 4]', 'E684:')
    355  call assert_fails('let l[0:4] = [5, 6]', 'E711:')
    356  call assert_fails('let l -= 2', 'E734:')
    357  call assert_fails('let l += 2', 'E734:')
    358  call assert_fails('let g:["a;b"] = 10', 'E461:')
    359  call assert_fails('let g:.min = function("max")', 'E704:')
    360  call assert_fails('let g:cos = "" | let g:.cos = {-> 42}', 'E704:')
    361  if has('channel')
    362    let ch = test_null_channel()
    363    call assert_fails('let ch += 1', 'E734:')
    364  endif
    365  call assert_fails('let name = "a" .. "b",', 'E488: Trailing characters: ,')
    366 
    367  " This test works only when the language is English
    368  if v:lang == "C" || v:lang =~ '^[Ee]n'
    369    call assert_fails('let [a ; b;] = [10, 20]',
    370          \ 'Double ; in list of variables')
    371  endif
    372 endfunc
    373 
    374 func Test_let_heredoc_fails()
    375  call assert_fails('let v =<< marker', 'E991:')
    376  try
    377    exe "let v =<< TEXT | abc | TEXT"
    378    call assert_report('No exception thrown')
    379  catch /E488:/
    380  catch
    381    call assert_report('Caught exception: ' .. v:exception)
    382  endtry
    383 
    384  try
    385    let &commentstring =<< trim TEXT
    386      change
    387      insert
    388      append
    389    TEXT
    390    call assert_report('No exception thrown')
    391  catch /E730:/
    392  catch
    393    call assert_report('Caught exception: ' .. v:exception)
    394  endtry
    395 
    396  try
    397    let $SOME_ENV_VAR =<< trim TEXT
    398      change
    399      insert
    400      append
    401    TEXT
    402    call assert_report('No exception thrown')
    403  catch /E730:/
    404  catch
    405    call assert_report('Caught exception: ' .. v:exception)
    406  endtry
    407 
    408  try
    409    let @r =<< trim TEXT
    410      change
    411      insert
    412      append
    413    TEXT
    414    call assert_report('No exception thrown')
    415  catch /E730:/
    416  catch
    417    call assert_report('Caught exception: ' .. v:exception)
    418  endtry
    419 
    420  try
    421    let @- =<< trim TEXT
    422      change
    423      insert
    424      append
    425    TEXT
    426    call assert_report('No exception thrown')
    427  catch /E730:/
    428  catch
    429    call assert_report('Caught exception: ' .. v:exception)
    430  endtry
    431 
    432  try
    433    let [] =<< trim TEXT
    434    TEXT
    435    call assert_report('No exception thrown')
    436  catch /E475:/
    437  catch
    438    call assert_report('Caught exception: ' .. v:exception)
    439  endtry
    440 
    441  try
    442    let [a b c] =<< trim TEXT
    443    TEXT
    444    call assert_report('No exception thrown')
    445  catch /E475:/
    446  catch
    447    call assert_report('Caught exception: ' .. v:exception)
    448  endtry
    449 
    450  try
    451    let [a; b; c] =<< trim TEXT
    452    TEXT
    453    call assert_report('No exception thrown')
    454  catch /E452:/
    455  catch
    456    call assert_report('Caught exception: ' .. v:exception)
    457  endtry
    458 
    459  try
    460    let v =<< trim trimm
    461    trimm
    462    call assert_report('No exception thrown')
    463  catch /E221:/
    464  catch
    465    call assert_report('Caught exception: ' .. v:exception)
    466  endtry
    467 
    468  try
    469    let v =<< trim trim evall
    470    evall
    471    call assert_report('No exception thrown')
    472  catch /E221:/
    473  catch
    474    call assert_report('Caught exception: ' .. v:exception)
    475  endtry
    476 
    477  let text =<< trim END
    478  func WrongSyntax()
    479    let v =<< that there
    480  endfunc
    481  END
    482  call writefile(text, 'XheredocFail')
    483  call assert_fails('source XheredocFail', 'E1145:')
    484  call delete('XheredocFail')
    485 
    486  let text =<< trim CodeEnd
    487  func MissingEnd()
    488    let v =<< END
    489  endfunc
    490  CodeEnd
    491  call writefile(text, 'XheredocWrong')
    492  call assert_fails('source XheredocWrong', 'E1145:')
    493  call delete('XheredocWrong')
    494 
    495  let text =<< trim TEXTend
    496    let v =<< " comment
    497  TEXTend
    498  call writefile(text, 'XheredocNoMarker')
    499  call assert_fails('source XheredocNoMarker', 'E172:')
    500  call delete('XheredocNoMarker')
    501 
    502  let text =<< trim TEXTend
    503    let v =<< text
    504  TEXTend
    505  call writefile(text, 'XheredocBadMarker')
    506  call assert_fails('source XheredocBadMarker', 'E221:')
    507  call delete('XheredocBadMarker')
    508 
    509  call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker')
    510  call assert_fails('source XheredocMissingMarker', 'E990:')
    511  call delete('XheredocMissingMarker')
    512 endfunc
    513 
    514 func Test_let_heredoc_trim_no_indent_marker()
    515  let text =<< trim END
    516  Text
    517  with
    518  indent
    519 END
    520  call assert_equal(['Text', 'with', 'indent'], text)
    521 endfunc
    522 
    523 func Test_let_interpolated()
    524  call assert_equal('{text}', $'{{text}}')
    525  call assert_equal('{{text}}', $'{{{{text}}}}')
    526  let text = 'text'
    527  call assert_equal('text{{', $'{text .. "{{"}')
    528  call assert_equal('text{{', $"{text .. '{{'}")
    529  call assert_equal('text{{', $'{text .. '{{'}')
    530  call assert_equal('text{{', $"{text .. "{{"}")
    531 endfunc
    532 
    533 " Test for the setting a variable using the heredoc syntax.
    534 " Keep near the end, this messes up highlighting.
    535 func Test_let_heredoc()
    536  let var1 =<< END
    537 Some sample text
    538 Text with indent
    539  !@#$%^&*()-+_={}|[]\~`:";'<>?,./
    540 END
    541 
    542  call assert_equal(["Some sample text", "\tText with indent", "  !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1)
    543 
    544  let var2 =<< XXX
    545 Editor
    546 XXX
    547  call assert_equal(['Editor'], var2)
    548 
    549  let var3 =<<END
    550 END
    551  call assert_equal([], var3)
    552 
    553  let var3 =<<END
    554 vim
    555 
    556 end
    557  END
    558 END 
    559 END
    560  call assert_equal(['vim', '', 'end', '  END', 'END '], var3)
    561 
    562 let var1 =<< trim END
    563 Line1
    564   Line2
    565 	Line3
    566  END
    567 END
    568  call assert_equal(['Line1', '  Line2', "\tLine3", ' END'], var1)
    569 
    570  let var1 =<< trim !!!
    571 Line1
    572  line2
    573 	Line3
    574 !!!
    575  !!!
    576  call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
    577 
    578  let var1 =<< trim XX
    579    Line1
    580  XX
    581  call assert_equal(['Line1'], var1)
    582 
    583  let var1 =<< trim XX " comment
    584    Line1
    585      Line2
    586    Line3
    587  XX
    588  call assert_equal(['Line1', '  Line2', 'Line3'], var1)
    589 
    590  " ignore "endfunc"
    591  let var1 =<< END
    592 something
    593 endfunc
    594 END
    595  call assert_equal(['something', 'endfunc'], var1)
    596 
    597  " ignore "endfunc" with trim
    598  let var1 =<< trim END
    599  something
    600  endfunc
    601  END
    602  call assert_equal(['something', 'endfunc'], var1)
    603 
    604  " not concatenate lines
    605  let var1 =<< END
    606 some
    607  \thing
    608  \ else
    609 END
    610  call assert_equal(['some', '  \thing', '  \ else'], var1)
    611 
    612  " ignore "python << xx"
    613  let var1 =<<END
    614 something
    615 python << xx
    616 END
    617  call assert_equal(['something', 'python << xx'], var1)
    618 
    619  " ignore "python << xx" with trim
    620  let var1 =<< trim END
    621  something
    622  python << xx
    623  END
    624  call assert_equal(['something', 'python << xx'], var1)
    625 
    626  " ignore "append"
    627  let var1 =<< E
    628 something
    629 app
    630 E
    631  call assert_equal(['something', 'app'], var1)
    632 
    633  " ignore "append" with trim
    634  let var1 =<< trim END
    635  something
    636  app
    637  END
    638  call assert_equal(['something', 'app'], var1)
    639 
    640  let check = []
    641  if 0
    642     let check =<< trim END
    643       from heredoc
    644     END
    645  endif
    646  call assert_equal([], check)
    647 
    648  " unpack assignment
    649  let [a, b, c] =<< END
    650     x
    651     \y
    652     z
    653 END
    654  call assert_equal(['     x', '     \y', '     z'], [a, b, c])
    655 
    656  " unpack assignment without whitespace
    657  let[a,b,c]=<<END
    658 change
    659 insert
    660 append
    661 END
    662  call assert_equal(['change', 'insert', 'append'], [a, b, c])
    663 
    664  " unpack assignment with semicolon
    665  let [a; b] =<< END
    666 change
    667 insert
    668 append
    669 END
    670  call assert_equal(['change', ['insert', 'append']], [a, b])
    671 
    672  " unpack assignment with registers
    673  let [@/, @", @-] =<< END
    674 change
    675 insert
    676 append
    677 END
    678  call assert_equal(['change', 'insert', 'append'], [@/, @", @-])
    679 
    680  " curly braces name and list slice assignment
    681  let foo_3_bar = ['', '', '']
    682  let foo_{1 + 2}_bar[ : ] =<< END
    683 change
    684 insert
    685 append
    686 END
    687  call assert_equal(['change', 'insert', 'append'], foo_3_bar)
    688 
    689  " dictionary key containing brackets and spaces
    690  let d = {'abc] 123': 'baz'}
    691  let d[d['abc] 123'] .. '{'] =<< END
    692 change
    693 insert
    694 append
    695 END
    696  call assert_equal(['change', 'insert', 'append'], d['baz{'])
    697 endfunc
    698 
    699 " Test for evaluating Vim expressions in a heredoc using {expr}
    700 " Keep near the end, this messes up highlighting.
    701 func Test_let_heredoc_eval()
    702  let str = ''
    703  let code =<< trim eval END
    704    let a = {5 + 10}
    705    let b = {min([10, 6])} + {max([4, 6])}
    706    {str}
    707    let c = "abc{str}d"
    708  END
    709  call assert_equal(['let a = 15', 'let b = 6 + 6', '', 'let c = "abcd"'], code)
    710 
    711  let $TESTVAR = "Hello"
    712  let code =<< eval trim END
    713    let s = "{$TESTVAR}"
    714  END
    715  call assert_equal(['let s = "Hello"'], code)
    716 
    717  let code =<< eval END
    718    let s = "{$TESTVAR}"
    719 END
    720  call assert_equal(['    let s = "Hello"'], code)
    721 
    722  let a = 10
    723  let data =<< eval END
    724 {a}
    725 END
    726  call assert_equal(['10'], data)
    727 
    728  let x = 'X'
    729  let code =<< eval trim END
    730    let a = {{abc}}
    731    let b = {x}
    732    let c = {{
    733  END
    734  call assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code)
    735 
    736  " Evaluate a dictionary
    737  let d1 = #{a: 10, b: 'ss', c: {}}
    738  let code =<< eval trim END
    739    let d2 = {d1}
    740  END
    741  call assert_equal(["let d2 = {'a': 10, 'b': 'ss', 'c': {}}"], code)
    742 
    743  " Empty dictionary
    744  let d1 = {}
    745  let code =<< eval trim END
    746    let d2 = {d1}
    747  END
    748  call assert_equal(["let d2 = {}"], code)
    749 
    750  " null dictionary
    751  let d1 = v:_null_dict
    752  let code =<< eval trim END
    753    let d2 = {d1}
    754  END
    755  call assert_equal(["let d2 = {}"], code)
    756 
    757  " Evaluate a List
    758  let l1 = ['a', 'b', 'c']
    759  let code =<< eval trim END
    760    let l2 = {l1}
    761  END
    762  call assert_equal(["let l2 = ['a', 'b', 'c']"], code)
    763 
    764  " Empty List
    765  let l1 = []
    766  let code =<< eval trim END
    767    let l2 = {l1}
    768  END
    769  call assert_equal(["let l2 = []"], code)
    770 
    771  " Null List
    772  let l1 = v:_null_list
    773  let code =<< eval trim END
    774    let l2 = {l1}
    775  END
    776  call assert_equal(["let l2 = []"], code)
    777 
    778  let code = 'xxx'
    779  let code =<< eval trim END
    780    let n = {5 +
    781    6}
    782  END
    783  call assert_equal('xxx', code)
    784 
    785  let code =<< eval trim END
    786     let n = {min([1, 2]} + {max([3, 4])}
    787  END
    788  call assert_equal('xxx', code)
    789 
    790  let lines =<< trim LINES
    791      let text =<< eval trim END
    792        let b = {
    793      END
    794  LINES
    795  call CheckScriptFailure(lines, 'E1279:')
    796 
    797  let lines =<< trim LINES
    798      let text =<< eval trim END
    799        let b = {abc
    800      END
    801  LINES
    802  call CheckScriptFailure(lines, 'E1279:')
    803 
    804  let lines =<< trim LINES
    805      let text =<< eval trim END
    806        let b = {}
    807      END
    808  LINES
    809  call CheckScriptFailure(lines, 'E15:')
    810 
    811  " Test for using heredoc in a single string using :execute or execute()
    812  for [cmd, res] in items({
    813      \ "let x =<< trim END\n  one\n  two\nEND": ['one', 'two'],
    814      \ "let x =<< trim END\n  one\n    two\nEND": ['one', '  two'],
    815      \ "  let x =<< trim END\n    one\n    two\n  END": ['one', 'two'],
    816      \ "  let x =<< trim END\n    one\n      two\n  END": ['one', '  two'],
    817      \ "let x =<< END\n  one\n  two\nEND": ['  one', '  two'],
    818      \ "let x =<< END\none\ntwo\nEND": ['one', 'two'],
    819      \ "let x =<< END \" comment\none\ntwo\nEND": ['one', 'two'],
    820      \ })
    821    execute cmd
    822    call assert_equal(res, x)
    823    unlet x
    824    call assert_equal($"\n{string(res)}", execute($"{cmd}\necho x"))
    825    unlet x
    826  endfor
    827  for [cmd, err] in items({
    828      \ "let x =<<\none\ntwo": "E172:",
    829      \ "let x =<< trim\n  one\n  two": "E172:",
    830      \ "let x =<< end\none\ntwo\nend": "E221:",
    831      \ "let x =<< END\none\ntwo": "E990: Missing end marker 'END'",
    832      \ "let x =<< END !\none\ntwo\nEND": "E488: Trailing characters:  !",
    833      \ "let x =<< eval END\none\ntwo{y}\nEND": "E121: Undefined variable: y",
    834      \ })
    835    call assert_fails('execute cmd', err)
    836    call assert_fails('call execute(cmd)', err)
    837  endfor
    838 
    839  " skipped heredoc
    840  if 0
    841    let msg =<< trim eval END
    842        n is: {n}
    843    END
    844  endif
    845 
    846  " Test for sourcing a script containing a heredoc with invalid expression.
    847  " Variable assignment should fail, if expression evaluation fails
    848  new
    849  let g:Xvar = 'test'
    850  let g:b = 10
    851  let lines =<< trim END
    852    let Xvar =<< eval CODE
    853    let a = 1
    854    let b = {5+}
    855    let c = 2
    856    CODE
    857    let g:Count += 1
    858  END
    859  call setline(1, lines)
    860  let g:Count = 0
    861  call assert_fails('source', 'E15:')
    862  call assert_equal(1, g:Count)
    863  call setline(3, 'let b = {abc}')
    864  call assert_fails('source', 'E121:')
    865  call assert_equal(2, g:Count)
    866  call setline(3, 'let b = {abc} + {min([9, 4])} + 2')
    867  call assert_fails('source', 'E121:')
    868  call assert_equal(3, g:Count)
    869  call assert_equal('test', g:Xvar)
    870  call assert_equal(10, g:b)
    871  bw!
    872 endfunc
    873 
    874 " vim: shiftwidth=2 sts=2 expandtab