18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25c2af0affSBram Moolenaar  bwipe!
265d72ce69SBram Moolenaarenddef
275d72ce69SBram Moolenaar
28a6e67e4fSBram Moolenaarlet g:alist = [7]
29a6e67e4fSBram Moolenaarlet g:astring = 'text'
30f0b9f43cSBram Moolenaarlet g:anumber = 123
316e587dcbSBram Moolenaar
32d72c1bf0SBram Moolenaardef Test_unlet()
33d72c1bf0SBram Moolenaar  g:somevar = 'yes'
34d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
35d72c1bf0SBram Moolenaar  unlet g:somevar
36d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
37d72c1bf0SBram Moolenaar  unlet! g:somevar
38d72c1bf0SBram Moolenaar
398436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
408436773fSBram Moolenaar  s:somevar = 'legacy'
418436773fSBram Moolenaar  assert_true(exists('s:somevar'))
428436773fSBram Moolenaar  unlet s:somevar
438436773fSBram Moolenaar  assert_false(exists('s:somevar'))
448436773fSBram Moolenaar  unlet! s:somevar
458436773fSBram Moolenaar
46d2c61705SBram Moolenaar  CheckScriptFailure([
47d72c1bf0SBram Moolenaar   'vim9script',
48d72c1bf0SBram Moolenaar   'let svar = 123',
49d72c1bf0SBram Moolenaar   'unlet svar',
50d72c1bf0SBram Moolenaar   ], 'E1081:')
51d2c61705SBram Moolenaar  CheckScriptFailure([
52d72c1bf0SBram Moolenaar   'vim9script',
53d72c1bf0SBram Moolenaar   'let svar = 123',
54d72c1bf0SBram Moolenaar   'unlet s:svar',
55d72c1bf0SBram Moolenaar   ], 'E1081:')
56d2c61705SBram Moolenaar  CheckScriptFailure([
57d72c1bf0SBram Moolenaar   'vim9script',
58d72c1bf0SBram Moolenaar   'let svar = 123',
59d72c1bf0SBram Moolenaar   'def Func()',
60d72c1bf0SBram Moolenaar   '  unlet svar',
61d72c1bf0SBram Moolenaar   'enddef',
62822ba247SBram Moolenaar   'defcompile',
63d72c1bf0SBram Moolenaar   ], 'E1081:')
64d2c61705SBram Moolenaar  CheckScriptFailure([
65d72c1bf0SBram Moolenaar   'vim9script',
66d72c1bf0SBram Moolenaar   'let svar = 123',
67d72c1bf0SBram Moolenaar   'def Func()',
68d72c1bf0SBram Moolenaar   '  unlet s:svar',
69d72c1bf0SBram Moolenaar   'enddef',
70822ba247SBram Moolenaar   'defcompile',
71d72c1bf0SBram Moolenaar   ], 'E1081:')
727bdaea6eSBram Moolenaar
737bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
747bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
757bdaea6eSBram Moolenaar  unlet $ENVVAR
767bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
77d72c1bf0SBram Moolenaarenddef
78599c89c8SBram Moolenaar
794c17ad94SBram Moolenaardef Test_delfunction()
80f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
814c17ad94SBram Moolenaar  CheckScriptSuccess([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'func CheckMe()',
844c17ad94SBram Moolenaar      '  return 123',
854c17ad94SBram Moolenaar      'endfunc',
864c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
874c17ad94SBram Moolenaar      ])
884c17ad94SBram Moolenaar
89f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
904c17ad94SBram Moolenaar  CheckScriptFailure([
914c17ad94SBram Moolenaar      'vim9script',
924c17ad94SBram Moolenaar      'func DeleteMe1()',
934c17ad94SBram Moolenaar      'endfunc',
944c17ad94SBram Moolenaar      'delfunction DeleteMe1',
954c17ad94SBram Moolenaar      ], 'E1084:')
964c17ad94SBram Moolenaar  CheckScriptFailure([
974c17ad94SBram Moolenaar      'vim9script',
984c17ad94SBram Moolenaar      'func DeleteMe2()',
994c17ad94SBram Moolenaar      'endfunc',
1004c17ad94SBram Moolenaar      'def DoThat()',
1014c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
1024c17ad94SBram Moolenaar      'enddef',
1034c17ad94SBram Moolenaar      'DoThat()',
1044c17ad94SBram Moolenaar      ], 'E1084:')
1054c17ad94SBram Moolenaar  CheckScriptFailure([
1064c17ad94SBram Moolenaar      'vim9script',
1074c17ad94SBram Moolenaar      'def DeleteMe3()',
1084c17ad94SBram Moolenaar      'enddef',
1094c17ad94SBram Moolenaar      'delfunction DeleteMe3',
1104c17ad94SBram Moolenaar      ], 'E1084:')
1114c17ad94SBram Moolenaar  CheckScriptFailure([
1124c17ad94SBram Moolenaar      'vim9script',
1134c17ad94SBram Moolenaar      'def DeleteMe4()',
1144c17ad94SBram Moolenaar      'enddef',
1154c17ad94SBram Moolenaar      'def DoThat()',
1164c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
1174c17ad94SBram Moolenaar      'enddef',
1184c17ad94SBram Moolenaar      'DoThat()',
1194c17ad94SBram Moolenaar      ], 'E1084:')
120925e9fd6SBram Moolenaar
121925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
122925e9fd6SBram Moolenaar  let lines =<< trim END
123925e9fd6SBram Moolenaar      vim9script
124925e9fd6SBram Moolenaar      def g:Global(): string
125925e9fd6SBram Moolenaar        return "yes"
126925e9fd6SBram Moolenaar      enddef
127925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
128925e9fd6SBram Moolenaar      def! g:Global(): string
129925e9fd6SBram Moolenaar        return "no"
130925e9fd6SBram Moolenaar      enddef
131925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
132925e9fd6SBram Moolenaar      delfunc g:Global
133925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
134925e9fd6SBram Moolenaar  END
135925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
136925e9fd6SBram Moolenaar
137925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
138925e9fd6SBram Moolenaar  lines =<< trim END
139925e9fd6SBram Moolenaar      vim9script
140925e9fd6SBram Moolenaar      func g:Global()
141925e9fd6SBram Moolenaar        return "yes"
142925e9fd6SBram Moolenaar      endfunc
143925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
144925e9fd6SBram Moolenaar      def! g:Global(): string
145925e9fd6SBram Moolenaar        return "no"
146925e9fd6SBram Moolenaar      enddef
147925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
148925e9fd6SBram Moolenaar      delfunc g:Global
149925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
150925e9fd6SBram Moolenaar  END
151925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
152925e9fd6SBram Moolenaar
153925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
154925e9fd6SBram Moolenaar  lines =<< trim END
155925e9fd6SBram Moolenaar      vim9script
156925e9fd6SBram Moolenaar      def g:Global(): string
157925e9fd6SBram Moolenaar        return "yes"
158925e9fd6SBram Moolenaar      enddef
159925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
160925e9fd6SBram Moolenaar      func! g:Global()
161925e9fd6SBram Moolenaar        return "no"
162925e9fd6SBram Moolenaar      endfunc
163925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
164925e9fd6SBram Moolenaar      delfunc g:Global
165925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
166925e9fd6SBram Moolenaar  END
167925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1684c17ad94SBram Moolenaarenddef
1694c17ad94SBram Moolenaar
17008052228SBram Moolenaardef Test_wrong_type()
17108052228SBram Moolenaar  CheckDefFailure(['let var: list<nothing>'], 'E1010:')
17208052228SBram Moolenaar  CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
17308052228SBram Moolenaar  CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
17408052228SBram Moolenaar  CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
175599c89c8SBram Moolenaar
17608052228SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
17708052228SBram Moolenaar  CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
17842a480bfSBram Moolenaar
17908052228SBram Moolenaar  CheckDefFailure(['let var: ally'], 'E1010:')
18008052228SBram Moolenaar  CheckDefFailure(['let var: bram'], 'E1010:')
18108052228SBram Moolenaar  CheckDefFailure(['let var: cathy'], 'E1010:')
18208052228SBram Moolenaar  CheckDefFailure(['let var: dom'], 'E1010:')
18308052228SBram Moolenaar  CheckDefFailure(['let var: freddy'], 'E1010:')
18408052228SBram Moolenaar  CheckDefFailure(['let var: john'], 'E1010:')
18508052228SBram Moolenaar  CheckDefFailure(['let var: larry'], 'E1010:')
18608052228SBram Moolenaar  CheckDefFailure(['let var: ned'], 'E1010:')
18708052228SBram Moolenaar  CheckDefFailure(['let var: pam'], 'E1010:')
18808052228SBram Moolenaar  CheckDefFailure(['let var: sam'], 'E1010:')
18908052228SBram Moolenaar  CheckDefFailure(['let var: vim'], 'E1010:')
190a0a9f43aSBram Moolenaar
19108052228SBram Moolenaar  CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
19208052228SBram Moolenaar  CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
19308052228SBram Moolenaarenddef
1948a7d6542SBram Moolenaar
19508052228SBram Moolenaardef Test_const()
19608052228SBram Moolenaar  CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
19708052228SBram Moolenaar  CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
198dbeecb2bSBram Moolenaar  CheckDefFailure(['const list = [1, 2]', 'let list = [3, 4]'], 'E1017:')
19908052228SBram Moolenaar  CheckDefFailure(['const two'], 'E1021:')
20008052228SBram Moolenaar  CheckDefFailure(['const &option'], 'E996:')
201dbeecb2bSBram Moolenaar
202dbeecb2bSBram Moolenaar  let lines =<< trim END
203dbeecb2bSBram Moolenaar    const list = [1, 2, 3]
204dbeecb2bSBram Moolenaar    list[0] = 4
2050b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
2060b4c66c6SBram Moolenaar    const! other = [5, 6, 7]
2070b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
20871abe482SBram Moolenaar
20971abe482SBram Moolenaar    let varlist = [7, 8]
21071abe482SBram Moolenaar    const! constlist = [1, varlist, 3]
21171abe482SBram Moolenaar    varlist[0] = 77
21271abe482SBram Moolenaar    # TODO: does not work yet
21371abe482SBram Moolenaar    # constlist[1][1] = 88
21471abe482SBram Moolenaar    let cl = constlist[1]
21571abe482SBram Moolenaar    cl[1] = 88
21671abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
21771abe482SBram Moolenaar
21871abe482SBram Moolenaar    let vardict = #{five: 5, six: 6}
21971abe482SBram Moolenaar    const! constdict = #{one: 1, two: vardict, three: 3}
22071abe482SBram Moolenaar    vardict['five'] = 55
22171abe482SBram Moolenaar    # TODO: does not work yet
22271abe482SBram Moolenaar    # constdict['two']['six'] = 66
22371abe482SBram Moolenaar    let cd = constdict['two']
22471abe482SBram Moolenaar    cd['six'] = 66
22571abe482SBram Moolenaar    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
226dbeecb2bSBram Moolenaar  END
227dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
22808052228SBram Moolenaarenddef
2298a7d6542SBram Moolenaar
2300b4c66c6SBram Moolenaardef Test_const_bang()
2310b4c66c6SBram Moolenaar  let lines =<< trim END
2320b4c66c6SBram Moolenaar      const! var = 234
2330b4c66c6SBram Moolenaar      var = 99
2340b4c66c6SBram Moolenaar  END
2350b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2360b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2370b4c66c6SBram Moolenaar
2380b4c66c6SBram Moolenaar  lines =<< trim END
2390b4c66c6SBram Moolenaar      const! ll = [2, 3, 4]
2400b4c66c6SBram Moolenaar      ll[0] = 99
2410b4c66c6SBram Moolenaar  END
2420b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2430b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2440b4c66c6SBram Moolenaar
2450b4c66c6SBram Moolenaar  lines =<< trim END
2460b4c66c6SBram Moolenaar      const! ll = [2, 3, 4]
2470b4c66c6SBram Moolenaar      ll[3] = 99
2480b4c66c6SBram Moolenaar  END
2490b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2500b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2510b4c66c6SBram Moolenaar
2520b4c66c6SBram Moolenaar  lines =<< trim END
2530b4c66c6SBram Moolenaar      const! dd = #{one: 1, two: 2}
2540b4c66c6SBram Moolenaar      dd["one"] = 99
2550b4c66c6SBram Moolenaar  END
2560b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2570b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2580b4c66c6SBram Moolenaar
2590b4c66c6SBram Moolenaar  lines =<< trim END
2600b4c66c6SBram Moolenaar      const! dd = #{one: 1, two: 2}
2610b4c66c6SBram Moolenaar      dd["three"] = 99
2620b4c66c6SBram Moolenaar  END
2630b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2640b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2650b4c66c6SBram Moolenaarenddef
2660b4c66c6SBram Moolenaar
267df069eecSBram Moolenaardef Test_range_no_colon()
268d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
269d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
270d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
271d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
272df069eecSBram Moolenaarenddef
273df069eecSBram Moolenaar
274df069eecSBram Moolenaar
2758a7d6542SBram Moolenaardef Test_block()
2768a7d6542SBram Moolenaar  let outer = 1
2778a7d6542SBram Moolenaar  {
2788a7d6542SBram Moolenaar    let inner = 2
2798a7d6542SBram Moolenaar    assert_equal(1, outer)
2808a7d6542SBram Moolenaar    assert_equal(2, inner)
2818a7d6542SBram Moolenaar  }
2828a7d6542SBram Moolenaar  assert_equal(1, outer)
2838a7d6542SBram Moolenaarenddef
2848a7d6542SBram Moolenaar
28508052228SBram Moolenaardef Test_block_failure()
28608052228SBram Moolenaar  CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
28708052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
28808052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
28908052228SBram Moolenaarenddef
2908a7d6542SBram Moolenaar
291d032f34aSBram Moolenaarfunc g:NoSuchFunc()
292d032f34aSBram Moolenaar  echo 'none'
293d032f34aSBram Moolenaarendfunc
294d032f34aSBram Moolenaar
2958a7d6542SBram Moolenaardef Test_try_catch()
2968a7d6542SBram Moolenaar  let l = []
2977a092245SBram Moolenaar  try # comment
2988a7d6542SBram Moolenaar    add(l, '1')
2998a7d6542SBram Moolenaar    throw 'wrong'
3008a7d6542SBram Moolenaar    add(l, '2')
3017a092245SBram Moolenaar  catch # comment
3028a7d6542SBram Moolenaar    add(l, v:exception)
3037a092245SBram Moolenaar  finally # comment
3048a7d6542SBram Moolenaar    add(l, '3')
3057a092245SBram Moolenaar  endtry # comment
3068a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
30768d130c6SBram Moolenaar
308e859312eSBram Moolenaar  l = []
309e859312eSBram Moolenaar  try
310e859312eSBram Moolenaar    try
311e859312eSBram Moolenaar      add(l, '1')
312e859312eSBram Moolenaar      throw 'wrong'
313e859312eSBram Moolenaar      add(l, '2')
314e859312eSBram Moolenaar    catch /right/
315e859312eSBram Moolenaar      add(l, v:exception)
316e859312eSBram Moolenaar    endtry
317e859312eSBram Moolenaar  catch /wrong/
318e859312eSBram Moolenaar    add(l, 'caught')
319e859312eSBram Moolenaar  finally
320e859312eSBram Moolenaar    add(l, 'finally')
321e859312eSBram Moolenaar  endtry
322e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
323e859312eSBram Moolenaar
32468d130c6SBram Moolenaar  let n: number
32568d130c6SBram Moolenaar  try
32668d130c6SBram Moolenaar    n = l[3]
32768d130c6SBram Moolenaar  catch /E684:/
32868d130c6SBram Moolenaar    n = 99
32968d130c6SBram Moolenaar  endtry
33068d130c6SBram Moolenaar  assert_equal(99, n)
33168d130c6SBram Moolenaar
33268d130c6SBram Moolenaar  try
333cc673e74SBram Moolenaar    # string slice returns a string, not a number
33468d130c6SBram Moolenaar    n = g:astring[3]
3355e654230SBram Moolenaar  catch /E1012:/
33668d130c6SBram Moolenaar    n = 77
33768d130c6SBram Moolenaar  endtry
33868d130c6SBram Moolenaar  assert_equal(77, n)
33968d130c6SBram Moolenaar
34068d130c6SBram Moolenaar  try
34168d130c6SBram Moolenaar    n = l[g:astring]
3425e654230SBram Moolenaar  catch /E1012:/
34356acb094SBram Moolenaar    n = 88
34468d130c6SBram Moolenaar  endtry
34556acb094SBram Moolenaar  assert_equal(88, n)
34668d130c6SBram Moolenaar
34768d130c6SBram Moolenaar  try
34868d130c6SBram Moolenaar    n = s:does_not_exist
34968d130c6SBram Moolenaar  catch /E121:/
350f0b9f43cSBram Moolenaar    n = 111
351f0b9f43cSBram Moolenaar  endtry
352f0b9f43cSBram Moolenaar  assert_equal(111, n)
353f0b9f43cSBram Moolenaar
354f0b9f43cSBram Moolenaar  try
355f0b9f43cSBram Moolenaar    n = g:does_not_exist
356f0b9f43cSBram Moolenaar  catch /E121:/
35768d130c6SBram Moolenaar    n = 121
35868d130c6SBram Moolenaar  endtry
35968d130c6SBram Moolenaar  assert_equal(121, n)
36068d130c6SBram Moolenaar
36168d130c6SBram Moolenaar  let d = #{one: 1}
36268d130c6SBram Moolenaar  try
36368d130c6SBram Moolenaar    n = d[g:astring]
36468d130c6SBram Moolenaar  catch /E716:/
36568d130c6SBram Moolenaar    n = 222
36668d130c6SBram Moolenaar  endtry
36768d130c6SBram Moolenaar  assert_equal(222, n)
368f0b9f43cSBram Moolenaar
369f0b9f43cSBram Moolenaar  try
370f0b9f43cSBram Moolenaar    n = -g:astring
371f0b9f43cSBram Moolenaar  catch /E39:/
372f0b9f43cSBram Moolenaar    n = 233
373f0b9f43cSBram Moolenaar  endtry
374f0b9f43cSBram Moolenaar  assert_equal(233, n)
375f0b9f43cSBram Moolenaar
376f0b9f43cSBram Moolenaar  try
377f0b9f43cSBram Moolenaar    n = +g:astring
378f0b9f43cSBram Moolenaar  catch /E1030:/
379f0b9f43cSBram Moolenaar    n = 244
380f0b9f43cSBram Moolenaar  endtry
381f0b9f43cSBram Moolenaar  assert_equal(244, n)
382f0b9f43cSBram Moolenaar
383f0b9f43cSBram Moolenaar  try
384f0b9f43cSBram Moolenaar    n = +g:alist
385f0b9f43cSBram Moolenaar  catch /E745:/
386f0b9f43cSBram Moolenaar    n = 255
387f0b9f43cSBram Moolenaar  endtry
388f0b9f43cSBram Moolenaar  assert_equal(255, n)
389f0b9f43cSBram Moolenaar
390f0b9f43cSBram Moolenaar  let nd: dict<any>
391f0b9f43cSBram Moolenaar  try
392f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
3935e654230SBram Moolenaar  catch /E1012:/
394f0b9f43cSBram Moolenaar    n = 266
395f0b9f43cSBram Moolenaar  endtry
396f0b9f43cSBram Moolenaar  assert_equal(266, n)
397f0b9f43cSBram Moolenaar
398f0b9f43cSBram Moolenaar  try
399f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
400f0b9f43cSBram Moolenaar  catch /E1093:/
401f0b9f43cSBram Moolenaar    n = 277
402f0b9f43cSBram Moolenaar  endtry
403f0b9f43cSBram Moolenaar  assert_equal(277, n)
404f0b9f43cSBram Moolenaar
405e859312eSBram Moolenaar  try
406e859312eSBram Moolenaar    &ts = g:astring
4075e654230SBram Moolenaar  catch /E1012:/
408e859312eSBram Moolenaar    n = 288
409e859312eSBram Moolenaar  endtry
410e859312eSBram Moolenaar  assert_equal(288, n)
411e859312eSBram Moolenaar
412e859312eSBram Moolenaar  try
413e859312eSBram Moolenaar    &backspace = 'asdf'
414e859312eSBram Moolenaar  catch /E474:/
415e859312eSBram Moolenaar    n = 299
416e859312eSBram Moolenaar  endtry
417e859312eSBram Moolenaar  assert_equal(299, n)
418e859312eSBram Moolenaar
419e859312eSBram Moolenaar  l = [1]
420e859312eSBram Moolenaar  try
421e859312eSBram Moolenaar    l[3] = 3
422e859312eSBram Moolenaar  catch /E684:/
423e859312eSBram Moolenaar    n = 300
424e859312eSBram Moolenaar  endtry
425e859312eSBram Moolenaar  assert_equal(300, n)
426e859312eSBram Moolenaar
427e859312eSBram Moolenaar  try
428e859312eSBram Moolenaar    unlet g:does_not_exist
429e859312eSBram Moolenaar  catch /E108:/
430e859312eSBram Moolenaar    n = 322
431e859312eSBram Moolenaar  endtry
432e859312eSBram Moolenaar  assert_equal(322, n)
433e859312eSBram Moolenaar
434e859312eSBram Moolenaar  try
435e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
436e859312eSBram Moolenaar  catch /E721:/
437e859312eSBram Moolenaar    n = 333
438e859312eSBram Moolenaar  endtry
439e859312eSBram Moolenaar  assert_equal(333, n)
440e859312eSBram Moolenaar
441e859312eSBram Moolenaar  try
442e859312eSBram Moolenaar    l = DeletedFunc()
443e859312eSBram Moolenaar  catch /E933:/
444e859312eSBram Moolenaar    n = 344
445e859312eSBram Moolenaar  endtry
446e859312eSBram Moolenaar  assert_equal(344, n)
447d032f34aSBram Moolenaar
448d032f34aSBram Moolenaar  try
449d032f34aSBram Moolenaar    echo len(v:true)
450d032f34aSBram Moolenaar  catch /E701:/
451d032f34aSBram Moolenaar    n = 355
452d032f34aSBram Moolenaar  endtry
453d032f34aSBram Moolenaar  assert_equal(355, n)
454d032f34aSBram Moolenaar
455d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
456d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
457d032f34aSBram Moolenaar  try
458d032f34aSBram Moolenaar    echo P()
459d032f34aSBram Moolenaar  catch /E117:/
460d032f34aSBram Moolenaar    n = 366
461d032f34aSBram Moolenaar  endtry
462d032f34aSBram Moolenaar  assert_equal(366, n)
463d032f34aSBram Moolenaar
464d032f34aSBram Moolenaar  try
465d032f34aSBram Moolenaar    echo g:NoSuchFunc()
466d032f34aSBram Moolenaar  catch /E117:/
467d032f34aSBram Moolenaar    n = 377
468d032f34aSBram Moolenaar  endtry
469d032f34aSBram Moolenaar  assert_equal(377, n)
470d032f34aSBram Moolenaar
471d032f34aSBram Moolenaar  try
472d032f34aSBram Moolenaar    echo g:alist + 4
473d032f34aSBram Moolenaar  catch /E745:/
474d032f34aSBram Moolenaar    n = 388
475d032f34aSBram Moolenaar  endtry
476d032f34aSBram Moolenaar  assert_equal(388, n)
477d032f34aSBram Moolenaar
478d032f34aSBram Moolenaar  try
479d032f34aSBram Moolenaar    echo 4 + g:alist
480d032f34aSBram Moolenaar  catch /E745:/
481d032f34aSBram Moolenaar    n = 399
482d032f34aSBram Moolenaar  endtry
483d032f34aSBram Moolenaar  assert_equal(399, n)
484d032f34aSBram Moolenaar
485d032f34aSBram Moolenaar  try
486d032f34aSBram Moolenaar    echo g:alist.member
487d032f34aSBram Moolenaar  catch /E715:/
488d032f34aSBram Moolenaar    n = 400
489d032f34aSBram Moolenaar  endtry
490d032f34aSBram Moolenaar  assert_equal(400, n)
491d032f34aSBram Moolenaar
492d032f34aSBram Moolenaar  try
493d032f34aSBram Moolenaar    echo d.member
494d032f34aSBram Moolenaar  catch /E716:/
495d032f34aSBram Moolenaar    n = 411
496d032f34aSBram Moolenaar  endtry
497d032f34aSBram Moolenaar  assert_equal(411, n)
4988a7d6542SBram Moolenaarenddef
4998a7d6542SBram Moolenaar
500e859312eSBram Moolenaardef DeletedFunc(): list<any>
501e859312eSBram Moolenaar  return ['delete me']
502e859312eSBram Moolenaarenddef
503e859312eSBram Moolenaardefcompile
504e859312eSBram Moolenaardelfunc DeletedFunc
505e859312eSBram Moolenaar
506257cc5eeSBram Moolenaardef ThrowFromDef()
507a72cfb80SBram Moolenaar  throw "getout" # comment
508257cc5eeSBram Moolenaarenddef
509257cc5eeSBram Moolenaar
510257cc5eeSBram Moolenaarfunc CatchInFunc()
511257cc5eeSBram Moolenaar  try
512257cc5eeSBram Moolenaar    call ThrowFromDef()
513257cc5eeSBram Moolenaar  catch
514257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
515257cc5eeSBram Moolenaar  endtry
516257cc5eeSBram Moolenaarendfunc
517257cc5eeSBram Moolenaar
518257cc5eeSBram Moolenaardef CatchInDef()
519257cc5eeSBram Moolenaar  try
520257cc5eeSBram Moolenaar    ThrowFromDef()
521257cc5eeSBram Moolenaar  catch
522257cc5eeSBram Moolenaar    g:thrown_def = v:exception
523257cc5eeSBram Moolenaar  endtry
524257cc5eeSBram Moolenaarenddef
525257cc5eeSBram Moolenaar
526f575adffSBram Moolenaardef ReturnFinally(): string
527f575adffSBram Moolenaar  try
528f575adffSBram Moolenaar    return 'intry'
529f575adffSBram Moolenaar  finally
530f575adffSBram Moolenaar    g:in_finally = 'finally'
531f575adffSBram Moolenaar  endtry
532f575adffSBram Moolenaar  return 'end'
533f575adffSBram Moolenaarenddef
534f575adffSBram Moolenaar
535257cc5eeSBram Moolenaardef Test_try_catch_nested()
536257cc5eeSBram Moolenaar  CatchInFunc()
537257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
538257cc5eeSBram Moolenaar
539257cc5eeSBram Moolenaar  CatchInDef()
540257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
541f575adffSBram Moolenaar
542f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
543f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
544f575adffSBram Moolenaarenddef
545f575adffSBram Moolenaar
5469939f57bSBram Moolenaardef TryOne(): number
5479939f57bSBram Moolenaar  try
5489939f57bSBram Moolenaar    return 0
5499939f57bSBram Moolenaar  catch
5509939f57bSBram Moolenaar  endtry
5519939f57bSBram Moolenaar  return 0
5529939f57bSBram Moolenaarenddef
5539939f57bSBram Moolenaar
5549939f57bSBram Moolenaardef TryTwo(n: number): string
5559939f57bSBram Moolenaar  try
5569939f57bSBram Moolenaar    let x = {}
5579939f57bSBram Moolenaar  catch
5589939f57bSBram Moolenaar  endtry
5599939f57bSBram Moolenaar  return 'text'
5609939f57bSBram Moolenaarenddef
5619939f57bSBram Moolenaar
5629939f57bSBram Moolenaardef Test_try_catch_twice()
5639939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5649939f57bSBram Moolenaarenddef
5659939f57bSBram Moolenaar
566f575adffSBram Moolenaardef Test_try_catch_match()
567f575adffSBram Moolenaar  let seq = 'a'
568f575adffSBram Moolenaar  try
569f575adffSBram Moolenaar    throw 'something'
570f575adffSBram Moolenaar  catch /nothing/
571f575adffSBram Moolenaar    seq ..= 'x'
572f575adffSBram Moolenaar  catch /some/
573f575adffSBram Moolenaar    seq ..= 'b'
574f575adffSBram Moolenaar  catch /asdf/
575f575adffSBram Moolenaar    seq ..= 'x'
576e8c4abbbSBram Moolenaar  catch ?a\?sdf?
577e8c4abbbSBram Moolenaar    seq ..= 'y'
578f575adffSBram Moolenaar  finally
579f575adffSBram Moolenaar    seq ..= 'c'
580f575adffSBram Moolenaar  endtry
581f575adffSBram Moolenaar  assert_equal('abc', seq)
582257cc5eeSBram Moolenaarenddef
583257cc5eeSBram Moolenaar
584e8c4abbbSBram Moolenaardef Test_try_catch_fails()
585d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
586d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
587d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
588d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
589d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
590d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
591d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
592d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
593d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
594d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
595585fea7bSBram Moolenaar
596d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
597d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
598e8c4abbbSBram Moolenaarenddef
599e8c4abbbSBram Moolenaar
600006ad48bSBram Moolenaardef Test_throw_vimscript()
601f5be8cdbSBram Moolenaar  # only checks line continuation
602006ad48bSBram Moolenaar  let lines =<< trim END
603006ad48bSBram Moolenaar      vim9script
604006ad48bSBram Moolenaar      try
605006ad48bSBram Moolenaar        throw 'one'
606006ad48bSBram Moolenaar              .. 'two'
607006ad48bSBram Moolenaar      catch
608006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
609006ad48bSBram Moolenaar      endtry
610006ad48bSBram Moolenaar  END
611006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
612006ad48bSBram Moolenaarenddef
613006ad48bSBram Moolenaar
614ed677f55SBram Moolenaardef Test_error_in_nested_function()
615ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
616ed677f55SBram Moolenaar  let lines =<< trim END
617ed677f55SBram Moolenaar      vim9script
618ed677f55SBram Moolenaar      def Func()
619ed677f55SBram Moolenaar        Error()
620ed677f55SBram Moolenaar        g:test_var = 1
621ed677f55SBram Moolenaar      enddef
622ed677f55SBram Moolenaar      func Error() abort
623ed677f55SBram Moolenaar        eval [][0]
624ed677f55SBram Moolenaar      endfunc
625ed677f55SBram Moolenaar      Func()
626ed677f55SBram Moolenaar  END
627ed677f55SBram Moolenaar  g:test_var = 0
628ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
629ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
630ed677f55SBram Moolenaarenddef
631ed677f55SBram Moolenaar
63237c83711SBram Moolenaardef Test_cexpr_vimscript()
633f5be8cdbSBram Moolenaar  # only checks line continuation
63437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
63537c83711SBram Moolenaar  let lines =<< trim END
63637c83711SBram Moolenaar      vim9script
63737c83711SBram Moolenaar      cexpr 'File'
63837c83711SBram Moolenaar                .. ' someFile' ..
63937c83711SBram Moolenaar                   ' line 19'
64037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
64137c83711SBram Moolenaar  END
64237c83711SBram Moolenaar  CheckScriptSuccess(lines)
64337c83711SBram Moolenaar  set errorformat&
64437c83711SBram Moolenaarenddef
64537c83711SBram Moolenaar
646c9edd6b5SBram Moolenaardef Test_statusline_syntax()
647c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
648c9edd6b5SBram Moolenaar  let lines =<< trim END
649c9edd6b5SBram Moolenaar      vim9script
650c9edd6b5SBram Moolenaar      func g:Status()
651c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
652c9edd6b5SBram Moolenaar      endfunc
653c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
654c9edd6b5SBram Moolenaar      redrawstatus
655c9edd6b5SBram Moolenaar      set laststatus statusline=
656c9edd6b5SBram Moolenaar  END
657c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
658c9edd6b5SBram Moolenaarenddef
659c9edd6b5SBram Moolenaar
660b209750bSBram Moolenaardef Test_list_vimscript()
661b209750bSBram Moolenaar  # checks line continuation and comments
662b209750bSBram Moolenaar  let lines =<< trim END
663b209750bSBram Moolenaar      vim9script
664b209750bSBram Moolenaar      let mylist = [
665b209750bSBram Moolenaar            'one',
666b209750bSBram Moolenaar            # comment
667b209750bSBram Moolenaar            'two', # empty line follows
668b209750bSBram Moolenaar
669b209750bSBram Moolenaar            'three',
670b209750bSBram Moolenaar            ]
671b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
672b209750bSBram Moolenaar  END
673b209750bSBram Moolenaar  CheckScriptSuccess(lines)
67466250c93SBram Moolenaar
67566250c93SBram Moolenaar  # check all lines from heredoc are kept
67666250c93SBram Moolenaar  lines =<< trim END
67766250c93SBram Moolenaar      # comment 1
67866250c93SBram Moolenaar      two
67966250c93SBram Moolenaar      # comment 3
68066250c93SBram Moolenaar
68166250c93SBram Moolenaar      five
68266250c93SBram Moolenaar      # comment 6
68366250c93SBram Moolenaar  END
68466250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
685b209750bSBram Moolenaarenddef
686b209750bSBram Moolenaar
6872a1381c3SBram Moolenaarif has('channel')
68840ee466cSBram Moolenaar  let someJob = test_null_job()
68940ee466cSBram Moolenaar
69040ee466cSBram Moolenaar  def FuncWithError()
69140ee466cSBram Moolenaar    echomsg g:someJob
69240ee466cSBram Moolenaar  enddef
69340ee466cSBram Moolenaar
69440ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
69540ee466cSBram Moolenaar    try
69640ee466cSBram Moolenaar      call FuncWithError()
69740ee466cSBram Moolenaar    catch
69840ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
69940ee466cSBram Moolenaar    endtry
70040ee466cSBram Moolenaar  endfunc
7012a1381c3SBram Moolenaarendif
70240ee466cSBram Moolenaar
7038a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7048a7d6542SBram Moolenaar  vim9script
7058a7d6542SBram Moolenaar  let name: string = 'bob'
7068a7d6542SBram Moolenaar  def Concat(arg: string): string
7078a7d6542SBram Moolenaar    return name .. arg
7088a7d6542SBram Moolenaar  enddef
709227a69deSBram Moolenaar  g:result = Concat('bie')
710227a69deSBram Moolenaar  g:localname = name
7118a7d6542SBram Moolenaar
7128a7d6542SBram Moolenaar  export const CONST = 1234
7138a7d6542SBram Moolenaar  export let exported = 9876
7146e587dcbSBram Moolenaar  export let exp_name = 'John'
7158a7d6542SBram Moolenaar  export def Exported(): string
7168a7d6542SBram Moolenaar    return 'Exported'
7178a7d6542SBram Moolenaar  enddef
7188a7d6542SBram MoolenaarEND
7198a7d6542SBram Moolenaar
720b3ca9824SBram Moolenaardef Undo_export_script_lines()
721b3ca9824SBram Moolenaar  unlet g:result
722b3ca9824SBram Moolenaar  unlet g:localname
723b3ca9824SBram Moolenaarenddef
724b3ca9824SBram Moolenaar
7255269bd2aSBram Moolenaardef Test_vim9_import_export()
7268a7d6542SBram Moolenaar  let import_script_lines =<< trim END
7278a7d6542SBram Moolenaar    vim9script
7288a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7298a7d6542SBram Moolenaar    g:imported = exported
7306e587dcbSBram Moolenaar    exported += 3
7316e587dcbSBram Moolenaar    g:imported_added = exported
7328a7d6542SBram Moolenaar    g:imported_func = Exported()
7336e587dcbSBram Moolenaar
73440f4f7a4SBram Moolenaar    def GetExported(): string
73540f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
73640f4f7a4SBram Moolenaar      return local_dict.ref()
73740f4f7a4SBram Moolenaar    enddef
73840f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
73940f4f7a4SBram Moolenaar
7406e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7416e587dcbSBram Moolenaar    g:imported_name = exp_name
7426e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7436e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7445381c7a1SBram Moolenaar    g:imported_later = exported
7458a7d6542SBram Moolenaar  END
7468a7d6542SBram Moolenaar
7478a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7488a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7498a7d6542SBram Moolenaar
7508a7d6542SBram Moolenaar  source Ximport.vim
7518a7d6542SBram Moolenaar
7528a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7538a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7548a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7556e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7565381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
7578a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
75840f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
7596e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
7606e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
7618a7d6542SBram Moolenaar  assert_false(exists('g:name'))
7628a7d6542SBram Moolenaar
763b3ca9824SBram Moolenaar  Undo_export_script_lines()
7648a7d6542SBram Moolenaar  unlet g:imported
7656e587dcbSBram Moolenaar  unlet g:imported_added
7665381c7a1SBram Moolenaar  unlet g:imported_later
7678a7d6542SBram Moolenaar  unlet g:imported_func
7686e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
7698a7d6542SBram Moolenaar  delete('Ximport.vim')
770f2d5c240SBram Moolenaar
7711c991144SBram Moolenaar  # similar, with line breaks
7721c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
7731c991144SBram Moolenaar    vim9script
7741c991144SBram Moolenaar    import {
7751c991144SBram Moolenaar        exported,
7761c991144SBram Moolenaar        Exported,
7771c991144SBram Moolenaar        }
7781c991144SBram Moolenaar        from
7791c991144SBram Moolenaar        './Xexport.vim'
7801c991144SBram Moolenaar    g:imported = exported
7811c991144SBram Moolenaar    exported += 5
7821c991144SBram Moolenaar    g:imported_added = exported
7831c991144SBram Moolenaar    g:imported_func = Exported()
7841c991144SBram Moolenaar  END
7851c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
7861c991144SBram Moolenaar  source Ximport_lbr.vim
7871c991144SBram Moolenaar
7881c991144SBram Moolenaar  assert_equal(9876, g:imported)
7891c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
7901c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
7911c991144SBram Moolenaar
7921c991144SBram Moolenaar  # exported script not sourced again
7931c991144SBram Moolenaar  assert_false(exists('g:result'))
7941c991144SBram Moolenaar  unlet g:imported
7951c991144SBram Moolenaar  unlet g:imported_added
7961c991144SBram Moolenaar  unlet g:imported_func
7971c991144SBram Moolenaar  delete('Ximport_lbr.vim')
7981c991144SBram Moolenaar
7991c991144SBram Moolenaar  # import inside :def function
8005381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
8015381c7a1SBram Moolenaar    vim9script
8025381c7a1SBram Moolenaar    def ImportInDef()
8035381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8045381c7a1SBram Moolenaar      g:imported = exported
8055381c7a1SBram Moolenaar      exported += 7
8065381c7a1SBram Moolenaar      g:imported_added = exported
8075381c7a1SBram Moolenaar    enddef
8085381c7a1SBram Moolenaar    ImportInDef()
8095381c7a1SBram Moolenaar  END
8105381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8115381c7a1SBram Moolenaar  source Ximport2.vim
812f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8135381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8145381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8155381c7a1SBram Moolenaar  unlet g:imported
8165381c7a1SBram Moolenaar  unlet g:imported_added
8175381c7a1SBram Moolenaar  delete('Ximport2.vim')
8185381c7a1SBram Moolenaar
819f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
820f2d5c240SBram Moolenaar    vim9script
821f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
822f2d5c240SBram Moolenaar    def UseExport()
823f2d5c240SBram Moolenaar      g:imported = Export.exported
824f2d5c240SBram Moolenaar    enddef
825f2d5c240SBram Moolenaar    UseExport()
826f2d5c240SBram Moolenaar  END
827f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
828f2d5c240SBram Moolenaar  source Ximport.vim
8295381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
830f2d5c240SBram Moolenaar
831599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
832599c89c8SBram Moolenaar    vim9script
833599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
834599c89c8SBram Moolenaar    def Func()
835599c89c8SBram Moolenaar      let dummy = 1
836599c89c8SBram Moolenaar      let imported = Export + dummy
837599c89c8SBram Moolenaar    enddef
838822ba247SBram Moolenaar    defcompile
839599c89c8SBram Moolenaar  END
840599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
84144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
842599c89c8SBram Moolenaar
843599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
844599c89c8SBram Moolenaar    vim9script
845599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
846599c89c8SBram Moolenaar    def Func()
847599c89c8SBram Moolenaar      let imported = Export . exported
848599c89c8SBram Moolenaar    enddef
849822ba247SBram Moolenaar    defcompile
850599c89c8SBram Moolenaar  END
851599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
85244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
853599c89c8SBram Moolenaar
854599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
855599c89c8SBram Moolenaar    vim9script
856599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
857599c89c8SBram Moolenaar    def Func()
858599c89c8SBram Moolenaar      let imported = Export.
859599c89c8SBram Moolenaar    enddef
860822ba247SBram Moolenaar    defcompile
861599c89c8SBram Moolenaar  END
862599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
86344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
864599c89c8SBram Moolenaar
8651c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
8661c991144SBram Moolenaar    vim9script
8671c991144SBram Moolenaar    import *
8681c991144SBram Moolenaar        as Export
8691c991144SBram Moolenaar        from
8701c991144SBram Moolenaar        './Xexport.vim'
8711c991144SBram Moolenaar    def UseExport()
8721c991144SBram Moolenaar      g:imported = Export.exported
8731c991144SBram Moolenaar    enddef
8741c991144SBram Moolenaar    UseExport()
8751c991144SBram Moolenaar  END
8761c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
8771c991144SBram Moolenaar  source Ximport.vim
8781c991144SBram Moolenaar  assert_equal(9883, g:imported)
8791c991144SBram Moolenaar
880f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
881f2d5c240SBram Moolenaar    vim9script
882f2d5c240SBram Moolenaar    import * from './Xexport.vim'
883f2d5c240SBram Moolenaar  END
884f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
88544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
886f2d5c240SBram Moolenaar
887f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
888fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
889fa29c8abSBram Moolenaar    vim9script
890fa29c8abSBram Moolenaar    import name from './Xexport.vim'
891fa29c8abSBram Moolenaar  END
892fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
89344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
894fa29c8abSBram Moolenaar
895f5be8cdbSBram Moolenaar  # try to import something that is already defined
8965269bd2aSBram Moolenaar  let import_already_defined =<< trim END
8975269bd2aSBram Moolenaar    vim9script
8985269bd2aSBram Moolenaar    let exported = 'something'
8995269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9005269bd2aSBram Moolenaar  END
9015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
90244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9035269bd2aSBram Moolenaar
904f5be8cdbSBram Moolenaar  # try to import something that is already defined
9055269bd2aSBram Moolenaar  import_already_defined =<< trim END
9065269bd2aSBram Moolenaar    vim9script
9075269bd2aSBram Moolenaar    let exported = 'something'
9085269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9095269bd2aSBram Moolenaar  END
9105269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
91144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9125269bd2aSBram Moolenaar
913f5be8cdbSBram Moolenaar  # try to import something that is already defined
9145269bd2aSBram Moolenaar  import_already_defined =<< trim END
9155269bd2aSBram Moolenaar    vim9script
9165269bd2aSBram Moolenaar    let exported = 'something'
9175269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9185269bd2aSBram Moolenaar  END
9195269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
92044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9215269bd2aSBram Moolenaar
922f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
923fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
924fa29c8abSBram Moolenaar    vim9script
925fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
926fa29c8abSBram Moolenaar  END
927fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
92844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
929fa29c8abSBram Moolenaar
930fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
931fa29c8abSBram Moolenaar    vim9script
932fa29c8abSBram Moolenaar    import name './Xexport.vim'
933fa29c8abSBram Moolenaar  END
934fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
93544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
936fa29c8abSBram Moolenaar
937fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
938fa29c8abSBram Moolenaar    vim9script
939fa29c8abSBram Moolenaar    import name from Xexport.vim
940fa29c8abSBram Moolenaar  END
941fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
94244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
943fa29c8abSBram Moolenaar
944fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
945fa29c8abSBram Moolenaar    vim9script
946fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
947fa29c8abSBram Moolenaar  END
948fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
94944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
950fa29c8abSBram Moolenaar
951fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
952fa29c8abSBram Moolenaar    vim9script
953fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
954fa29c8abSBram Moolenaar  END
9555269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
95644d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
957fa29c8abSBram Moolenaar
958f2d5c240SBram Moolenaar  delete('Ximport.vim')
9595269bd2aSBram Moolenaar  delete('Ximport3.vim')
9608a7d6542SBram Moolenaar  delete('Xexport.vim')
9618a7d6542SBram Moolenaar
962f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
963750802b5SBram Moolenaar  set cpo&vi
964750802b5SBram Moolenaar  let cpo_before = &cpo
965750802b5SBram Moolenaar  let lines =<< trim END
966750802b5SBram Moolenaar    vim9script
967750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
968750802b5SBram Moolenaar  END
969750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
970750802b5SBram Moolenaar  source Xvim9_script
971750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
972750802b5SBram Moolenaar  set cpo&vim
973750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
974750802b5SBram Moolenaar  delete('Xvim9_script')
975750802b5SBram Moolenaarenddef
976750802b5SBram Moolenaar
977803af686SBram Moolenaarfunc g:Trigger()
978803af686SBram Moolenaar  source Ximport.vim
979803af686SBram Moolenaar  return "echo 'yes'\<CR>"
980803af686SBram Moolenaarendfunc
981803af686SBram Moolenaar
982803af686SBram Moolenaardef Test_import_export_expr_map()
983803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
984803af686SBram Moolenaar  let export_lines =<< trim END
985803af686SBram Moolenaar    vim9script
986803af686SBram Moolenaar    export def That(): string
987803af686SBram Moolenaar      return 'yes'
988803af686SBram Moolenaar    enddef
989803af686SBram Moolenaar  END
990803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
991803af686SBram Moolenaar
992803af686SBram Moolenaar  let import_lines =<< trim END
993803af686SBram Moolenaar    vim9script
994803af686SBram Moolenaar    import That from './Xexport_that.vim'
995803af686SBram Moolenaar    assert_equal('yes', That())
996803af686SBram Moolenaar  END
997803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
998803af686SBram Moolenaar
999803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1000803af686SBram Moolenaar  feedkeys('trigger', "xt")
1001803af686SBram Moolenaar
1002730b2483SBram Moolenaar  delete('Xexport_that.vim')
1003803af686SBram Moolenaar  delete('Ximport.vim')
1004803af686SBram Moolenaar  nunmap trigger
1005803af686SBram Moolenaarenddef
1006803af686SBram Moolenaar
10078e1986e3SBram Moolenaardef Test_import_in_filetype()
10088e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10098e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
10108e1986e3SBram Moolenaar  let export_lines =<< trim END
10118e1986e3SBram Moolenaar    vim9script
10128e1986e3SBram Moolenaar    export let That = 'yes'
10138e1986e3SBram Moolenaar  END
1014730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10158e1986e3SBram Moolenaar
10168e1986e3SBram Moolenaar  let import_lines =<< trim END
10178e1986e3SBram Moolenaar    vim9script
1018730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10198e1986e3SBram Moolenaar    assert_equal('yes', That)
10208e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10218e1986e3SBram Moolenaar  END
10228e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10238e1986e3SBram Moolenaar
10248e1986e3SBram Moolenaar  let save_rtp = &rtp
10258e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10268e1986e3SBram Moolenaar
10278e1986e3SBram Moolenaar  filetype plugin on
10288e1986e3SBram Moolenaar  copen
10298e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10308e1986e3SBram Moolenaar
10318e1986e3SBram Moolenaar  quit!
1032730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10338e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10348e1986e3SBram Moolenaar  &rtp = save_rtp
10358e1986e3SBram Moolenaarenddef
10368e1986e3SBram Moolenaar
1037efa94447SBram Moolenaardef Test_use_import_in_mapping()
1038efa94447SBram Moolenaar  let lines =<< trim END
1039efa94447SBram Moolenaar      vim9script
1040efa94447SBram Moolenaar      export def Funcx()
1041efa94447SBram Moolenaar        g:result = 42
1042efa94447SBram Moolenaar      enddef
1043efa94447SBram Moolenaar  END
1044efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1045efa94447SBram Moolenaar  lines =<< trim END
1046efa94447SBram Moolenaar      vim9script
1047efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1048b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1049efa94447SBram Moolenaar  END
1050efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1051efa94447SBram Moolenaar
1052efa94447SBram Moolenaar  source Xmapscript.vim
1053b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1054efa94447SBram Moolenaar  assert_equal(42, g:result)
1055efa94447SBram Moolenaar
1056efa94447SBram Moolenaar  unlet g:result
1057efa94447SBram Moolenaar  delete('XsomeExport.vim')
1058efa94447SBram Moolenaar  delete('Xmapscript.vim')
1059b3ca9824SBram Moolenaar  nunmap <F3>
1060efa94447SBram Moolenaarenddef
1061efa94447SBram Moolenaar
1062750802b5SBram Moolenaardef Test_vim9script_fails()
10638a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
10648a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1065750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
10669721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
10679b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1068750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1069750802b5SBram Moolenaar
1070451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1071c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1072c785b9a7SBram Moolenaar
1073e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1074e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
10758a7d6542SBram Moolenaarenddef
10768a7d6542SBram Moolenaar
1077f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1078101f4810SBram Moolenaar  CheckRunVimInTerminal
1079101f4810SBram Moolenaar
10809bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1081c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
10829bb3eb3eSBram Moolenaarendfunc
10839bb3eb3eSBram Moolenaar
1084c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1085101f4810SBram Moolenaar  let export =<< trim END
1086101f4810SBram Moolenaar    vim9script
1087101f4810SBram Moolenaar    export def Foo(): number
1088101f4810SBram Moolenaar        return 0
1089101f4810SBram Moolenaar    enddef
1090101f4810SBram Moolenaar  END
1091730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1092101f4810SBram Moolenaar
1093730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
10949bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
10959bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1096101f4810SBram Moolenaar
1097730b2483SBram Moolenaar  delete('XexportCmd.vim')
10989bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
10999bb3eb3eSBram Moolenaarenddef
1100101f4810SBram Moolenaar
11014c17ad94SBram Moolenaardef Test_vim9script_reload_import()
11028a7d6542SBram Moolenaar  let lines =<< trim END
11038a7d6542SBram Moolenaar    vim9script
11048a7d6542SBram Moolenaar    const var = ''
11058a7d6542SBram Moolenaar    let valone = 1234
11068a7d6542SBram Moolenaar    def MyFunc(arg: string)
11078a7d6542SBram Moolenaar       valone = 5678
11088a7d6542SBram Moolenaar    enddef
11098a7d6542SBram Moolenaar  END
11108a7d6542SBram Moolenaar  let morelines =<< trim END
11118a7d6542SBram Moolenaar    let valtwo = 222
11128a7d6542SBram Moolenaar    export def GetValtwo(): number
11138a7d6542SBram Moolenaar      return valtwo
11148a7d6542SBram Moolenaar    enddef
11158a7d6542SBram Moolenaar  END
111603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11178a7d6542SBram Moolenaar  source Xreload.vim
11188a7d6542SBram Moolenaar  source Xreload.vim
11198a7d6542SBram Moolenaar  source Xreload.vim
11208a7d6542SBram Moolenaar
11218a7d6542SBram Moolenaar  let testlines =<< trim END
11228a7d6542SBram Moolenaar    vim9script
11238a7d6542SBram Moolenaar    def TheFunc()
11248a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11258a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11268a7d6542SBram Moolenaar    enddef
11278a7d6542SBram Moolenaar    TheFunc()
11288a7d6542SBram Moolenaar  END
11298a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11308a7d6542SBram Moolenaar  source Ximport.vim
11318a7d6542SBram Moolenaar
1132f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1133f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11348a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11358a7d6542SBram Moolenaar  source Ximport.vim
11368a7d6542SBram Moolenaar
1137f5be8cdbSBram Moolenaar  # cannot declare a var twice
11388a7d6542SBram Moolenaar  lines =<< trim END
11398a7d6542SBram Moolenaar    vim9script
11408a7d6542SBram Moolenaar    let valone = 1234
11418a7d6542SBram Moolenaar    let valone = 5678
11428a7d6542SBram Moolenaar  END
11438a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
114444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
11458a7d6542SBram Moolenaar
11468a7d6542SBram Moolenaar  delete('Xreload.vim')
11478a7d6542SBram Moolenaar  delete('Ximport.vim')
11488a7d6542SBram Moolenaarenddef
11498a7d6542SBram Moolenaar
115095006e3dSBram Moolenaardef s:RetSome(): string
115195006e3dSBram Moolenaar  return 'some'
115295006e3dSBram Moolenaarenddef
115395006e3dSBram Moolenaar
1154fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1155fe465a01SBram Moolenaar" script-local name.
1156fe465a01SBram Moolenaardef Test_vim9script_funcref()
1157fe465a01SBram Moolenaar  let sortlines =<< trim END
1158fe465a01SBram Moolenaar      vim9script
1159fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1160bed36b93SBram Moolenaar        return i2 - i1
1161fe465a01SBram Moolenaar      enddef
1162fe465a01SBram Moolenaar
1163fe465a01SBram Moolenaar      export def FastSort(): list<number>
1164fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1165fe465a01SBram Moolenaar      enddef
1166fe465a01SBram Moolenaar  END
1167fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1168fe465a01SBram Moolenaar
1169fe465a01SBram Moolenaar  let lines =<< trim END
1170fe465a01SBram Moolenaar    vim9script
1171fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1172fe465a01SBram Moolenaar    def Test()
1173fe465a01SBram Moolenaar      g:result = FastSort()
1174fe465a01SBram Moolenaar    enddef
1175fe465a01SBram Moolenaar    Test()
1176fe465a01SBram Moolenaar  END
1177fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1178fe465a01SBram Moolenaar
1179fe465a01SBram Moolenaar  source Xscript.vim
1180fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1181fe465a01SBram Moolenaar
1182fe465a01SBram Moolenaar  unlet g:result
1183fe465a01SBram Moolenaar  delete('Xsort.vim')
1184fe465a01SBram Moolenaar  delete('Xscript.vim')
118595006e3dSBram Moolenaar
118695006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
118795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1188fe465a01SBram Moolenaarenddef
1189fe465a01SBram Moolenaar
1190601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1191601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1192601e76acSBram Moolenaar" function reference.
1193c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1194c620c055SBram Moolenaar  let filterLines =<< trim END
1195c620c055SBram Moolenaar    vim9script
1196c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1197c620c055SBram Moolenaar      return idx % 2 == 1
1198c620c055SBram Moolenaar    enddef
1199c620c055SBram Moolenaar    export def FastFilter(): list<number>
1200c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1201c620c055SBram Moolenaar    enddef
1202601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1203601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1204601e76acSBram Moolenaar    enddef
1205c620c055SBram Moolenaar  END
1206c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1207c620c055SBram Moolenaar
1208c620c055SBram Moolenaar  let lines =<< trim END
1209c620c055SBram Moolenaar    vim9script
1210601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1211c620c055SBram Moolenaar    def Test()
1212c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1213c620c055SBram Moolenaar    enddef
1214c620c055SBram Moolenaar    Test()
1215601e76acSBram Moolenaar    def TestDirect()
1216601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1217601e76acSBram Moolenaar    enddef
1218601e76acSBram Moolenaar    TestDirect()
1219c620c055SBram Moolenaar  END
1220601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1221c620c055SBram Moolenaar  delete('Xfilter.vim')
1222c620c055SBram Moolenaarenddef
1223c620c055SBram Moolenaar
12244c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
12254c17ad94SBram Moolenaar  let first_lines =<< trim END
12264c17ad94SBram Moolenaar    vim9script
12274c17ad94SBram Moolenaar    def FuncYes(): string
12284c17ad94SBram Moolenaar      return 'yes'
12294c17ad94SBram Moolenaar    enddef
12304c17ad94SBram Moolenaar  END
123103afdcf1SBram Moolenaar  let withno_lines =<< trim END
12324c17ad94SBram Moolenaar    def FuncNo(): string
12334c17ad94SBram Moolenaar      return 'no'
12344c17ad94SBram Moolenaar    enddef
12354c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12364c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12374c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
123803afdcf1SBram Moolenaar    enddef
123903afdcf1SBram Moolenaar  END
124003afdcf1SBram Moolenaar  let nono_lines =<< trim END
124103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
124203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
124344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12444c17ad94SBram Moolenaar    enddef
12454c17ad94SBram Moolenaar  END
12464c17ad94SBram Moolenaar
12474c17ad94SBram Moolenaar  # FuncNo() is defined
124803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12494c17ad94SBram Moolenaar  source Xreloaded.vim
12504c17ad94SBram Moolenaar  g:DoCheck(true)
12514c17ad94SBram Moolenaar
12524c17ad94SBram Moolenaar  # FuncNo() is not redefined
125303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12544c17ad94SBram Moolenaar  source Xreloaded.vim
125503afdcf1SBram Moolenaar  g:DoCheck()
12564c17ad94SBram Moolenaar
12574c17ad94SBram Moolenaar  # FuncNo() is back
125803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12594c17ad94SBram Moolenaar  source Xreloaded.vim
126003afdcf1SBram Moolenaar  g:DoCheck()
12614c17ad94SBram Moolenaar
12624c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12634c17ad94SBram Moolenaarenddef
12644c17ad94SBram Moolenaar
126589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
126689483d40SBram Moolenaar  # write the script with a script-local variable
126789483d40SBram Moolenaar  let lines =<< trim END
126889483d40SBram Moolenaar    vim9script
126989483d40SBram Moolenaar    let var = 'string'
127089483d40SBram Moolenaar  END
127189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
127289483d40SBram Moolenaar  source XreloadVar.vim
127389483d40SBram Moolenaar
127489483d40SBram Moolenaar  # now write the script using the same variable locally - works
127589483d40SBram Moolenaar  lines =<< trim END
127689483d40SBram Moolenaar    vim9script
127789483d40SBram Moolenaar    def Func()
127889483d40SBram Moolenaar      let var = 'string'
127989483d40SBram Moolenaar    enddef
128089483d40SBram Moolenaar  END
128189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
128289483d40SBram Moolenaar  source XreloadVar.vim
128389483d40SBram Moolenaar
128489483d40SBram Moolenaar  delete('XreloadVar.vim')
128589483d40SBram Moolenaarenddef
128689483d40SBram Moolenaar
12878a7d6542SBram Moolenaardef Test_import_absolute()
12888a7d6542SBram Moolenaar  let import_lines = [
1289e6085c53SBram Moolenaar        'vim9script',
1290e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1291e6085c53SBram Moolenaar        'def UseExported()',
1292e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1293e6085c53SBram Moolenaar        '  exported = 8888',
1294e6085c53SBram Moolenaar        '  g:imported_after = exported',
1295e6085c53SBram Moolenaar        'enddef',
1296e6085c53SBram Moolenaar        'UseExported()',
1297e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1298e6085c53SBram Moolenaar        ]
12998a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13008a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13018a7d6542SBram Moolenaar
13028a7d6542SBram Moolenaar  source Ximport_abs.vim
13038a7d6542SBram Moolenaar
13048a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13054e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1306675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1307675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1308675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1309675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1310675f716eSBram Moolenaar          'exported = 8888.*' ..
1311675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1312675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1313675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1314675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1315e6085c53SBram Moolenaar        g:import_disassembled)
1316b3ca9824SBram Moolenaar
1317b3ca9824SBram Moolenaar  Undo_export_script_lines()
13188a7d6542SBram Moolenaar  unlet g:imported_abs
13194e12a5dfSBram Moolenaar  unlet g:import_disassembled
13208a7d6542SBram Moolenaar
13218a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13228a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13238a7d6542SBram Moolenaarenddef
13248a7d6542SBram Moolenaar
13258a7d6542SBram Moolenaardef Test_import_rtp()
13268a7d6542SBram Moolenaar  let import_lines = [
1327e6085c53SBram Moolenaar        'vim9script',
1328e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1329e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1330e6085c53SBram Moolenaar        ]
13318a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13328a7d6542SBram Moolenaar  mkdir('import')
13338a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13348a7d6542SBram Moolenaar
13358a7d6542SBram Moolenaar  let save_rtp = &rtp
13368a7d6542SBram Moolenaar  &rtp = getcwd()
13378a7d6542SBram Moolenaar  source Ximport_rtp.vim
13388a7d6542SBram Moolenaar  &rtp = save_rtp
13398a7d6542SBram Moolenaar
13408a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13418a7d6542SBram Moolenaar
1342b3ca9824SBram Moolenaar  Undo_export_script_lines()
1343b3ca9824SBram Moolenaar  unlet g:imported_rtp
13448a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
134589483d40SBram Moolenaar  delete('import', 'rf')
13468a7d6542SBram Moolenaarenddef
13478a7d6542SBram Moolenaar
134825e0f586SBram Moolenaardef Test_import_compile_error()
134925e0f586SBram Moolenaar  let export_lines = [
135025e0f586SBram Moolenaar        'vim9script',
135125e0f586SBram Moolenaar        'export def ExpFunc(): string',
135225e0f586SBram Moolenaar        '  return notDefined',
135325e0f586SBram Moolenaar        'enddef',
135425e0f586SBram Moolenaar        ]
135525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
135625e0f586SBram Moolenaar
135725e0f586SBram Moolenaar  let import_lines = [
135825e0f586SBram Moolenaar        'vim9script',
135925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
136025e0f586SBram Moolenaar        'def ImpFunc()',
136125e0f586SBram Moolenaar        '  echo ExpFunc()',
136225e0f586SBram Moolenaar        'enddef',
136325e0f586SBram Moolenaar        'defcompile',
136425e0f586SBram Moolenaar        ]
136525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
136625e0f586SBram Moolenaar
136725e0f586SBram Moolenaar  try
136825e0f586SBram Moolenaar    source Ximport.vim
136925e0f586SBram Moolenaar  catch /E1001/
1370f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
13717707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
137225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
137325e0f586SBram Moolenaar  endtry
137425e0f586SBram Moolenaar
137525e0f586SBram Moolenaar  delete('Xexported.vim')
137625e0f586SBram Moolenaar  delete('Ximport.vim')
137725e0f586SBram Moolenaarenddef
137825e0f586SBram Moolenaar
1379c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1380c4ce36d4SBram Moolenaar  let lines = [
1381c4ce36d4SBram Moolenaar        'vim9script',
1382c4ce36d4SBram Moolenaar        'def Func()',
1383c4ce36d4SBram Moolenaar        '  eval [][0]',
1384c4ce36d4SBram Moolenaar        'enddef',
1385c4ce36d4SBram Moolenaar        'Func()',
1386c4ce36d4SBram Moolenaar        ]
1387c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1388c4ce36d4SBram Moolenaar
1389c4ce36d4SBram Moolenaar  for count in range(3)
1390c4ce36d4SBram Moolenaar    try
1391c4ce36d4SBram Moolenaar      source Xtestscript.vim
1392c4ce36d4SBram Moolenaar    catch /E684/
1393c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1394c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1395c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1396c4ce36d4SBram Moolenaar    endtry
1397c4ce36d4SBram Moolenaar  endfor
1398c4ce36d4SBram Moolenaar
1399c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1400c4ce36d4SBram Moolenaarenddef
1401c4ce36d4SBram Moolenaar
1402eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1403eef2102eSBram Moolenaar  let export_lines =<< trim END
1404eef2102eSBram Moolenaar      vim9script
1405eef2102eSBram Moolenaar      export def Func()
1406eef2102eSBram Moolenaar        echo 'imported'
1407eef2102eSBram Moolenaar      enddef
1408eef2102eSBram Moolenaar  END
1409eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1410eef2102eSBram Moolenaar
1411eef2102eSBram Moolenaar  let lines =<< trim END
1412eef2102eSBram Moolenaar    vim9script
1413eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1414eef2102eSBram Moolenaar    def Func()
1415eef2102eSBram Moolenaar      echo 'local to function'
1416eef2102eSBram Moolenaar    enddef
1417eef2102eSBram Moolenaar  END
1418eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1419eef2102eSBram Moolenaar
1420eef2102eSBram Moolenaar  lines =<< trim END
1421eef2102eSBram Moolenaar    vim9script
1422eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1423eef2102eSBram Moolenaar    def Outer()
1424eef2102eSBram Moolenaar      def Func()
1425eef2102eSBram Moolenaar        echo 'local to function'
1426eef2102eSBram Moolenaar      enddef
1427eef2102eSBram Moolenaar    enddef
1428eef2102eSBram Moolenaar    defcompile
1429eef2102eSBram Moolenaar  END
1430eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1431eef2102eSBram Moolenaar
1432eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1433eef2102eSBram Moolenaarenddef
1434eef2102eSBram Moolenaar
1435b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1436b9a2cac3SBram Moolenaar  let lines =<< trim END
1437b9a2cac3SBram Moolenaar    vim9script
1438b9a2cac3SBram Moolenaar    def Func()
1439b9a2cac3SBram Moolenaar      echo 'one'
1440b9a2cac3SBram Moolenaar    enddef
1441b9a2cac3SBram Moolenaar    def Func()
1442b9a2cac3SBram Moolenaar      echo 'two'
1443b9a2cac3SBram Moolenaar    enddef
1444b9a2cac3SBram Moolenaar  END
1445b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1446fa211f3cSBram Moolenaar
1447fa211f3cSBram Moolenaar  lines =<< trim END
1448fa211f3cSBram Moolenaar    vim9script
1449fa211f3cSBram Moolenaar    def Foo(): string
1450fa211f3cSBram Moolenaar      return 'foo'
1451fa211f3cSBram Moolenaar      enddef
1452fa211f3cSBram Moolenaar    def Func()
1453fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1454fa211f3cSBram Moolenaar    enddef
1455fa211f3cSBram Moolenaar    defcompile
1456fa211f3cSBram Moolenaar  END
1457fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1458b9a2cac3SBram Moolenaarenddef
1459b9a2cac3SBram Moolenaar
14608a7d6542SBram Moolenaardef Test_fixed_size_list()
1461f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
14628a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
14638a7d6542SBram Moolenaar  l->remove(0)
14648a7d6542SBram Moolenaar  l->add(5)
14658a7d6542SBram Moolenaar  l->insert(99, 1)
14660f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14678a7d6542SBram Moolenaarenddef
14688a7d6542SBram Moolenaar
1469ae616494SBram Moolenaardef Test_no_insert_xit()
1470d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1471d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1472d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1473d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1474d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1475ae616494SBram Moolenaar
1476ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1477ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1478ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1479ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1480f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1481f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1482f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1483f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1484f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1485ae616494SBram Moolenaarenddef
1486ae616494SBram Moolenaar
1487158906cfSBram Moolenaardef IfElse(what: number): string
1488158906cfSBram Moolenaar  let res = ''
1489158906cfSBram Moolenaar  if what == 1
1490158906cfSBram Moolenaar    res = "one"
1491158906cfSBram Moolenaar  elseif what == 2
1492158906cfSBram Moolenaar    res = "two"
1493a259d8d3SBram Moolenaar  else
1494158906cfSBram Moolenaar    res = "three"
1495a259d8d3SBram Moolenaar  endif
1496158906cfSBram Moolenaar  return res
1497a259d8d3SBram Moolenaarenddef
1498a259d8d3SBram Moolenaar
1499158906cfSBram Moolenaardef Test_if_elseif_else()
1500158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1501158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1502158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15030f18b6d1SBram Moolenaarenddef
15040f18b6d1SBram Moolenaar
1505e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1506d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1507d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1508d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1509d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1510d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1511e8c4abbbSBram Moolenaarenddef
1512e8c4abbbSBram Moolenaar
15136d69bf60SBram Moolenaarlet g:bool_true = v:true
15146d69bf60SBram Moolenaarlet g:bool_false = v:false
15156d69bf60SBram Moolenaar
15166d69bf60SBram Moolenaardef Test_if_const_expr()
15176d69bf60SBram Moolenaar  let res = false
15186d69bf60SBram Moolenaar  if true ? true : false
15196d69bf60SBram Moolenaar    res = true
15206d69bf60SBram Moolenaar  endif
15216d69bf60SBram Moolenaar  assert_equal(true, res)
15226d69bf60SBram Moolenaar
1523585fea7bSBram Moolenaar  g:glob = 2
1524585fea7bSBram Moolenaar  if false
15256797966dSBram Moolenaar    execute('g:glob = 3')
1526585fea7bSBram Moolenaar  endif
1527585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1528585fea7bSBram Moolenaar  if true
15296797966dSBram Moolenaar    execute('g:glob = 3')
1530585fea7bSBram Moolenaar  endif
1531585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1532585fea7bSBram Moolenaar
15336d69bf60SBram Moolenaar  res = false
15346d69bf60SBram Moolenaar  if g:bool_true ? true : false
15356d69bf60SBram Moolenaar    res = true
15366d69bf60SBram Moolenaar  endif
15376d69bf60SBram Moolenaar  assert_equal(true, res)
15386d69bf60SBram Moolenaar
15396d69bf60SBram Moolenaar  res = false
15406d69bf60SBram Moolenaar  if true ? g:bool_true : false
15416d69bf60SBram Moolenaar    res = true
15426d69bf60SBram Moolenaar  endif
15436d69bf60SBram Moolenaar  assert_equal(true, res)
15446d69bf60SBram Moolenaar
15456d69bf60SBram Moolenaar  res = false
15466d69bf60SBram Moolenaar  if true ? true : g:bool_false
15476d69bf60SBram Moolenaar    res = true
15486d69bf60SBram Moolenaar  endif
15496d69bf60SBram Moolenaar  assert_equal(true, res)
15506d69bf60SBram Moolenaar
15516d69bf60SBram Moolenaar  res = false
15526d69bf60SBram Moolenaar  if true ? false : true
15536d69bf60SBram Moolenaar    res = true
15546d69bf60SBram Moolenaar  endif
15556d69bf60SBram Moolenaar  assert_equal(false, res)
15566d69bf60SBram Moolenaar
15576d69bf60SBram Moolenaar  res = false
15586d69bf60SBram Moolenaar  if false ? false : true
15596d69bf60SBram Moolenaar    res = true
15606d69bf60SBram Moolenaar  endif
15616d69bf60SBram Moolenaar  assert_equal(true, res)
15626d69bf60SBram Moolenaar
15636d69bf60SBram Moolenaar  res = false
15646d69bf60SBram Moolenaar  if false ? true : false
15656d69bf60SBram Moolenaar    res = true
15666d69bf60SBram Moolenaar  endif
15676d69bf60SBram Moolenaar  assert_equal(false, res)
15686d69bf60SBram Moolenaar
15696d69bf60SBram Moolenaar  res = false
1570e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1571e8c4abbbSBram Moolenaar    res = true
1572e8c4abbbSBram Moolenaar  endif
1573e8c4abbbSBram Moolenaar  assert_equal(false, res)
1574e8c4abbbSBram Moolenaar
1575e8c4abbbSBram Moolenaar  res = false
15766d69bf60SBram Moolenaar  if true && true
15776d69bf60SBram Moolenaar    res = true
15786d69bf60SBram Moolenaar  endif
15796d69bf60SBram Moolenaar  assert_equal(true, res)
15806d69bf60SBram Moolenaar
15816d69bf60SBram Moolenaar  res = false
15826d69bf60SBram Moolenaar  if true && false
15836d69bf60SBram Moolenaar    res = true
15846d69bf60SBram Moolenaar  endif
15856d69bf60SBram Moolenaar  assert_equal(false, res)
15866d69bf60SBram Moolenaar
15876d69bf60SBram Moolenaar  res = false
15886d69bf60SBram Moolenaar  if g:bool_true && false
15896d69bf60SBram Moolenaar    res = true
15906d69bf60SBram Moolenaar  endif
15916d69bf60SBram Moolenaar  assert_equal(false, res)
15926d69bf60SBram Moolenaar
15936d69bf60SBram Moolenaar  res = false
15946d69bf60SBram Moolenaar  if true && g:bool_false
15956d69bf60SBram Moolenaar    res = true
15966d69bf60SBram Moolenaar  endif
15976d69bf60SBram Moolenaar  assert_equal(false, res)
15986d69bf60SBram Moolenaar
15996d69bf60SBram Moolenaar  res = false
16006d69bf60SBram Moolenaar  if false && false
16016d69bf60SBram Moolenaar    res = true
16026d69bf60SBram Moolenaar  endif
16036d69bf60SBram Moolenaar  assert_equal(false, res)
16046d69bf60SBram Moolenaar
16056d69bf60SBram Moolenaar  res = false
16066d69bf60SBram Moolenaar  if true || false
16076d69bf60SBram Moolenaar    res = true
16086d69bf60SBram Moolenaar  endif
16096d69bf60SBram Moolenaar  assert_equal(true, res)
16106d69bf60SBram Moolenaar
16116d69bf60SBram Moolenaar  res = false
16126d69bf60SBram Moolenaar  if g:bool_true || false
16136d69bf60SBram Moolenaar    res = true
16146d69bf60SBram Moolenaar  endif
16156d69bf60SBram Moolenaar  assert_equal(true, res)
16166d69bf60SBram Moolenaar
16176d69bf60SBram Moolenaar  res = false
16186d69bf60SBram Moolenaar  if true || g:bool_false
16196d69bf60SBram Moolenaar    res = true
16206d69bf60SBram Moolenaar  endif
16216d69bf60SBram Moolenaar  assert_equal(true, res)
16226d69bf60SBram Moolenaar
16236d69bf60SBram Moolenaar  res = false
16246d69bf60SBram Moolenaar  if false || false
16256d69bf60SBram Moolenaar    res = true
16266d69bf60SBram Moolenaar  endif
16276d69bf60SBram Moolenaar  assert_equal(false, res)
16283988f64fSBram Moolenaar
16293988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16303988f64fSBram Moolenaar  if false | eval 0 | endif
16313988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16323988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16333988f64fSBram Moolenaar  if false
16343988f64fSBram Moolenaar    burp
16353988f64fSBram Moolenaar  endif
163680c34ca3SBram Moolenaarenddef
16376d69bf60SBram Moolenaar
163880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1639d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1640d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1641d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1642d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16436d69bf60SBram Moolenaarenddef
16446d69bf60SBram Moolenaar
164572abcf42SBram Moolenaardef RunNested(i: number): number
164672abcf42SBram Moolenaar  let x: number = 0
164772abcf42SBram Moolenaar  if i % 2
164872abcf42SBram Moolenaar    if 1
1649f5be8cdbSBram Moolenaar      # comment
165072abcf42SBram Moolenaar    else
1651f5be8cdbSBram Moolenaar      # comment
165272abcf42SBram Moolenaar    endif
165372abcf42SBram Moolenaar    x += 1
165472abcf42SBram Moolenaar  else
165572abcf42SBram Moolenaar    x += 1000
165672abcf42SBram Moolenaar  endif
165772abcf42SBram Moolenaar  return x
165872abcf42SBram Moolenaarenddef
165972abcf42SBram Moolenaar
166072abcf42SBram Moolenaardef Test_nested_if()
166172abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
166272abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
166372abcf42SBram Moolenaarenddef
166472abcf42SBram Moolenaar
1665ad39c094SBram Moolenaardef Test_execute_cmd()
1666ad39c094SBram Moolenaar  new
1667ad39c094SBram Moolenaar  setline(1, 'default')
1668d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1669ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1670a72cfb80SBram Moolenaar
1671d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1672a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1673a72cfb80SBram Moolenaar
1674d2c61705SBram Moolenaar  let cmd1 = 'setline(1,'
1675ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1676a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1677ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1678a72cfb80SBram Moolenaar
1679d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1680ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1681a72cfb80SBram Moolenaar
1682ad39c094SBram Moolenaar  let cmd_first = 'call '
1683ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1684ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1685ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1686ad39c094SBram Moolenaar  bwipe!
1687585fea7bSBram Moolenaar
16882d6b20d6SBram Moolenaar  let n = true
16892d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
16902d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
16912d6b20d6SBram Moolenaar
1692e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
1693e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1694e5abf7afSBram Moolenaar
1695d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1696d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1697d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1698ad39c094SBram Moolenaarenddef
1699ad39c094SBram Moolenaar
170047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1701f5be8cdbSBram Moolenaar  # only checks line continuation
170247e880d6SBram Moolenaar  let lines =<< trim END
170347e880d6SBram Moolenaar      vim9script
170447e880d6SBram Moolenaar      execute 'g:someVar'
170547e880d6SBram Moolenaar                .. ' = ' ..
170647e880d6SBram Moolenaar                   '28'
170747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
170847e880d6SBram Moolenaar      unlet g:someVar
170947e880d6SBram Moolenaar  END
171047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
171147e880d6SBram Moolenaarenddef
171247e880d6SBram Moolenaar
1713ad39c094SBram Moolenaardef Test_echo_cmd()
1714a72cfb80SBram Moolenaar  echo 'some' # comment
1715585fea7bSBram Moolenaar  echon 'thing'
1716ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1717ad39c094SBram Moolenaar
1718a72cfb80SBram Moolenaar  echo "some" # comment
1719a72cfb80SBram Moolenaar  echon "thing"
1720a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1721a72cfb80SBram Moolenaar
1722ad39c094SBram Moolenaar  let str1 = 'some'
1723ad39c094SBram Moolenaar  let str2 = 'more'
1724ad39c094SBram Moolenaar  echo str1 str2
1725ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1726a72cfb80SBram Moolenaar
1727d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1728ad39c094SBram Moolenaarenddef
1729ad39c094SBram Moolenaar
1730f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1731f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1732f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1733f93c7feaSBram Moolenaar  echo 'clear'
1734df069eecSBram Moolenaar  :1messages
1735f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1736f93c7feaSBram Moolenaar
1737d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1738f93c7feaSBram Moolenaarenddef
1739f93c7feaSBram Moolenaar
174047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1741f5be8cdbSBram Moolenaar  # only checks line continuation
174247e880d6SBram Moolenaar  let lines =<< trim END
174347e880d6SBram Moolenaar      vim9script
174447e880d6SBram Moolenaar      echomsg 'here'
174547e880d6SBram Moolenaar                .. ' is ' ..
174647e880d6SBram Moolenaar                   'a message'
174747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
174847e880d6SBram Moolenaar  END
174947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
175047e880d6SBram Moolenaarenddef
175147e880d6SBram Moolenaar
1752f93c7feaSBram Moolenaardef Test_echoerr_cmd()
175340ee466cSBram Moolenaar  try
175440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
175540ee466cSBram Moolenaar  catch
175640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
175740ee466cSBram Moolenaar  endtry
1758f93c7feaSBram Moolenaarenddef
1759f93c7feaSBram Moolenaar
176047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1761f5be8cdbSBram Moolenaar  # only checks line continuation
176247e880d6SBram Moolenaar  let lines =<< trim END
176347e880d6SBram Moolenaar      vim9script
176447e880d6SBram Moolenaar      try
176547e880d6SBram Moolenaar        echoerr 'this'
176647e880d6SBram Moolenaar                .. ' is ' ..
176747e880d6SBram Moolenaar                   'wrong'
176847e880d6SBram Moolenaar      catch
176947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
177047e880d6SBram Moolenaar      endtry
177147e880d6SBram Moolenaar  END
177247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
177347e880d6SBram Moolenaarenddef
177447e880d6SBram Moolenaar
177541fe0617SBram Moolenaardef Test_for_outside_of_function()
177641fe0617SBram Moolenaar  let lines =<< trim END
177741fe0617SBram Moolenaar    vim9script
177841fe0617SBram Moolenaar    new
177941fe0617SBram Moolenaar    for var in range(0, 3)
178041fe0617SBram Moolenaar      append(line('$'), var)
178141fe0617SBram Moolenaar    endfor
178241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
178341fe0617SBram Moolenaar    bwipe!
178441fe0617SBram Moolenaar  END
178541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
178641fe0617SBram Moolenaar  source Xvim9for.vim
178741fe0617SBram Moolenaar  delete('Xvim9for.vim')
178841fe0617SBram Moolenaarenddef
17898a7d6542SBram Moolenaar
1790e8c4abbbSBram Moolenaardef Test_for_loop()
1791e8c4abbbSBram Moolenaar  let result = ''
1792e8c4abbbSBram Moolenaar  for cnt in range(7)
1793e8c4abbbSBram Moolenaar    if cnt == 4
1794e8c4abbbSBram Moolenaar      break
1795e8c4abbbSBram Moolenaar    endif
1796e8c4abbbSBram Moolenaar    if cnt == 2
1797e8c4abbbSBram Moolenaar      continue
1798e8c4abbbSBram Moolenaar    endif
1799e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1800e8c4abbbSBram Moolenaar  endfor
1801e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18020ad3e894SBram Moolenaar
18030ad3e894SBram Moolenaar  let concat = ''
18040ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18050ad3e894SBram Moolenaar    concat ..= str
18060ad3e894SBram Moolenaar  endfor
18070ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1808e8c4abbbSBram Moolenaarenddef
1809e8c4abbbSBram Moolenaar
1810e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1811675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1812675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1813451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
1814822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1815451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1816675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1817675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1818675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1819e8c4abbbSBram Moolenaarenddef
1820e8c4abbbSBram Moolenaar
1821d0df1aacSBram Moolenaardef Test_while_loop()
1822d0df1aacSBram Moolenaar  let result = ''
1823d0df1aacSBram Moolenaar  let cnt = 0
1824d0df1aacSBram Moolenaar  while cnt < 555
1825d0df1aacSBram Moolenaar    if cnt == 3
1826d0df1aacSBram Moolenaar      break
1827d0df1aacSBram Moolenaar    endif
1828d0df1aacSBram Moolenaar    cnt += 1
1829d0df1aacSBram Moolenaar    if cnt == 2
1830d0df1aacSBram Moolenaar      continue
1831d0df1aacSBram Moolenaar    endif
1832d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1833d0df1aacSBram Moolenaar  endwhile
1834d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1835d0df1aacSBram Moolenaarenddef
1836d0df1aacSBram Moolenaar
1837e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1838675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1839675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1840675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1841675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1842675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1843675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1844675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1845bd5da371SBram Moolenaarenddef
1846bd5da371SBram Moolenaar
18479645e2d9SBram Moolenaardef Test_interrupt_loop()
184897acfc78SBram Moolenaar  let caught = false
18499645e2d9SBram Moolenaar  let x = 0
185097acfc78SBram Moolenaar  try
18519645e2d9SBram Moolenaar    while 1
18529645e2d9SBram Moolenaar      x += 1
18539645e2d9SBram Moolenaar      if x == 100
18549645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18559645e2d9SBram Moolenaar      endif
18569645e2d9SBram Moolenaar    endwhile
185797acfc78SBram Moolenaar  catch
185897acfc78SBram Moolenaar    caught = true
185997acfc78SBram Moolenaar    assert_equal(100, x)
186097acfc78SBram Moolenaar  endtry
186197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
186225859dd7SBram Moolenaar  # consume the CTRL-C
186325859dd7SBram Moolenaar  getchar(0)
18649645e2d9SBram Moolenaarenddef
186520431c9dSBram Moolenaar
18664fdae999SBram Moolenaardef Test_automatic_line_continuation()
18674fdae999SBram Moolenaar  let mylist = [
18684fdae999SBram Moolenaar      'one',
18694fdae999SBram Moolenaar      'two',
18704fdae999SBram Moolenaar      'three',
1871f5be8cdbSBram Moolenaar      ] # comment
18724fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18734fdae999SBram Moolenaar
18744fdae999SBram Moolenaar  let mydict = {
18754fdae999SBram Moolenaar      'one': 1,
18764fdae999SBram Moolenaar      'two': 2,
18774fdae999SBram Moolenaar      'three':
18784fdae999SBram Moolenaar          3,
1879f5be8cdbSBram Moolenaar      } # comment
18804fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18814fdae999SBram Moolenaar  mydict = #{
18822c330432SBram Moolenaar      one: 1,  # comment
18832c330432SBram Moolenaar      two:     # comment
18842c330432SBram Moolenaar           2,  # comment
18852c330432SBram Moolenaar      three: 3 # comment
18862c330432SBram Moolenaar      }
18872c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18882c330432SBram Moolenaar  mydict = #{
18892c330432SBram Moolenaar      one: 1,
18904fdae999SBram Moolenaar      two:
18914fdae999SBram Moolenaar           2,
18922c330432SBram Moolenaar      three: 3
18934fdae999SBram Moolenaar      }
18944fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1895e6085c53SBram Moolenaar
1896e6085c53SBram Moolenaar  assert_equal(
1897e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1898e6085c53SBram Moolenaar        split('one two three')
1899e6085c53SBram Moolenaar        )
19004fdae999SBram Moolenaarenddef
19014fdae999SBram Moolenaar
19027a092245SBram Moolenaardef Test_vim9_comment()
19037a092245SBram Moolenaar  CheckScriptSuccess([
19047a092245SBram Moolenaar      'vim9script',
19057a092245SBram Moolenaar      '# something',
19067a092245SBram Moolenaar      ])
19077a092245SBram Moolenaar  CheckScriptFailure([
19087a092245SBram Moolenaar      'vim9script',
19097a092245SBram Moolenaar      ':# something',
19107a092245SBram Moolenaar      ], 'E488:')
19117a092245SBram Moolenaar  CheckScriptFailure([
19127a092245SBram Moolenaar      '# something',
19137a092245SBram Moolenaar      ], 'E488:')
19147a092245SBram Moolenaar  CheckScriptFailure([
19157a092245SBram Moolenaar      ':# something',
19167a092245SBram Moolenaar      ], 'E488:')
19177a092245SBram Moolenaar
19184a8d9f2eSBram Moolenaar  { # block start
19194a8d9f2eSBram Moolenaar  } # block end
19204a8d9f2eSBram Moolenaar  CheckDefFailure([
19214a8d9f2eSBram Moolenaar      '{# comment',
19224a8d9f2eSBram Moolenaar      ], 'E488:')
19234a8d9f2eSBram Moolenaar  CheckDefFailure([
19244a8d9f2eSBram Moolenaar      '{',
19254a8d9f2eSBram Moolenaar      '}# comment',
19264a8d9f2eSBram Moolenaar      ], 'E488:')
19274a8d9f2eSBram Moolenaar
19284a8d9f2eSBram Moolenaar  echo "yes" # comment
19294a8d9f2eSBram Moolenaar  CheckDefFailure([
19304a8d9f2eSBram Moolenaar      'echo "yes"# comment',
19314a8d9f2eSBram Moolenaar      ], 'E488:')
19327a092245SBram Moolenaar  CheckScriptSuccess([
19337a092245SBram Moolenaar      'vim9script',
19347a092245SBram Moolenaar      'echo "yes" # something',
19357a092245SBram Moolenaar      ])
19367a092245SBram Moolenaar  CheckScriptFailure([
19377a092245SBram Moolenaar      'vim9script',
19387a092245SBram Moolenaar      'echo "yes"# something',
19397a092245SBram Moolenaar      ], 'E121:')
19407a092245SBram Moolenaar  CheckScriptFailure([
19417a092245SBram Moolenaar      'vim9script',
19427a092245SBram Moolenaar      'echo# something',
19437a092245SBram Moolenaar      ], 'E121:')
19447a092245SBram Moolenaar  CheckScriptFailure([
19457a092245SBram Moolenaar      'echo "yes" # something',
19467a092245SBram Moolenaar      ], 'E121:')
19477a092245SBram Moolenaar
19484a8d9f2eSBram Moolenaar  exe "echo" # comment
19494a8d9f2eSBram Moolenaar  CheckDefFailure([
19504a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19514a8d9f2eSBram Moolenaar      ], 'E488:')
19524a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19534a8d9f2eSBram Moolenaar      'vim9script',
19544a8d9f2eSBram Moolenaar      'exe "echo" # something',
19554a8d9f2eSBram Moolenaar      ])
19564a8d9f2eSBram Moolenaar  CheckScriptFailure([
19574a8d9f2eSBram Moolenaar      'vim9script',
19584a8d9f2eSBram Moolenaar      'exe "echo"# something',
19594a8d9f2eSBram Moolenaar      ], 'E121:')
19604a8d9f2eSBram Moolenaar  CheckDefFailure([
19614a8d9f2eSBram Moolenaar      'exe # comment',
19624a8d9f2eSBram Moolenaar      ], 'E1015:')
19634a8d9f2eSBram Moolenaar  CheckScriptFailure([
19644a8d9f2eSBram Moolenaar      'vim9script',
19654a8d9f2eSBram Moolenaar      'exe# something',
19664a8d9f2eSBram Moolenaar      ], 'E121:')
19674a8d9f2eSBram Moolenaar  CheckScriptFailure([
19684a8d9f2eSBram Moolenaar      'exe "echo" # something',
19694a8d9f2eSBram Moolenaar      ], 'E121:')
19704a8d9f2eSBram Moolenaar
19717a092245SBram Moolenaar  CheckDefFailure([
19727a092245SBram Moolenaar      'try# comment',
19737a092245SBram Moolenaar      '  echo "yes"',
19747a092245SBram Moolenaar      'catch',
19757a092245SBram Moolenaar      'endtry',
19767a092245SBram Moolenaar      ], 'E488:')
19772c5ed4e3SBram Moolenaar  CheckScriptFailure([
19782c5ed4e3SBram Moolenaar      'vim9script',
19792c5ed4e3SBram Moolenaar      'try# comment',
19802c5ed4e3SBram Moolenaar      'echo "yes"',
19812c5ed4e3SBram Moolenaar      ], 'E488:')
19827a092245SBram Moolenaar  CheckDefFailure([
19837a092245SBram Moolenaar      'try',
1984a72cfb80SBram Moolenaar      '  throw#comment',
1985a72cfb80SBram Moolenaar      'catch',
1986a72cfb80SBram Moolenaar      'endtry',
1987a72cfb80SBram Moolenaar      ], 'E1015:')
1988a72cfb80SBram Moolenaar  CheckDefFailure([
1989a72cfb80SBram Moolenaar      'try',
1990a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1991a72cfb80SBram Moolenaar      'catch',
1992a72cfb80SBram Moolenaar      'endtry',
1993a72cfb80SBram Moolenaar      ], 'E488:')
1994a72cfb80SBram Moolenaar  CheckDefFailure([
1995a72cfb80SBram Moolenaar      'try',
19967a092245SBram Moolenaar      '  echo "yes"',
19977a092245SBram Moolenaar      'catch# comment',
19987a092245SBram Moolenaar      'endtry',
19997a092245SBram Moolenaar      ], 'E488:')
20002c5ed4e3SBram Moolenaar  CheckScriptFailure([
20012c5ed4e3SBram Moolenaar      'vim9script',
20022c5ed4e3SBram Moolenaar      'try',
20032c5ed4e3SBram Moolenaar      '  echo "yes"',
20042c5ed4e3SBram Moolenaar      'catch# comment',
20052c5ed4e3SBram Moolenaar      'endtry',
20062c5ed4e3SBram Moolenaar      ], 'E654:')
20072c5ed4e3SBram Moolenaar  CheckDefFailure([
20082c5ed4e3SBram Moolenaar      'try',
20092c5ed4e3SBram Moolenaar      '  echo "yes"',
20102c5ed4e3SBram Moolenaar      'catch /pat/# comment',
20112c5ed4e3SBram Moolenaar      'endtry',
20122c5ed4e3SBram Moolenaar      ], 'E488:')
20137a092245SBram Moolenaar  CheckDefFailure([
20147a092245SBram Moolenaar      'try',
20157a092245SBram Moolenaar      'echo "yes"',
20167a092245SBram Moolenaar      'catch',
20177a092245SBram Moolenaar      'endtry# comment',
20187a092245SBram Moolenaar      ], 'E488:')
20192c5ed4e3SBram Moolenaar  CheckScriptFailure([
20202c5ed4e3SBram Moolenaar      'vim9script',
20212c5ed4e3SBram Moolenaar      'try',
20222c5ed4e3SBram Moolenaar      '  echo "yes"',
20232c5ed4e3SBram Moolenaar      'catch',
20242c5ed4e3SBram Moolenaar      'endtry# comment',
20259b7bf9e9SBram Moolenaar      ], 'E488:')
20262c5ed4e3SBram Moolenaar
20272c5ed4e3SBram Moolenaar  CheckScriptSuccess([
20282c5ed4e3SBram Moolenaar      'vim9script',
20292c5ed4e3SBram Moolenaar      'hi # comment',
20302c5ed4e3SBram Moolenaar      ])
20312c5ed4e3SBram Moolenaar  CheckScriptFailure([
20322c5ed4e3SBram Moolenaar      'vim9script',
20332c5ed4e3SBram Moolenaar      'hi# comment',
20342c5ed4e3SBram Moolenaar      ], 'E416:')
20351966c248SBram Moolenaar  CheckScriptSuccess([
20361966c248SBram Moolenaar      'vim9script',
20371966c248SBram Moolenaar      'hi Search # comment',
20381966c248SBram Moolenaar      ])
20391966c248SBram Moolenaar  CheckScriptFailure([
20401966c248SBram Moolenaar      'vim9script',
20411966c248SBram Moolenaar      'hi Search# comment',
20421966c248SBram Moolenaar      ], 'E416:')
20431966c248SBram Moolenaar  CheckScriptSuccess([
20441966c248SBram Moolenaar      'vim9script',
20451966c248SBram Moolenaar      'hi link This Search # comment',
20461966c248SBram Moolenaar      ])
20471966c248SBram Moolenaar  CheckScriptFailure([
20481966c248SBram Moolenaar      'vim9script',
20491966c248SBram Moolenaar      'hi link This That# comment',
20501966c248SBram Moolenaar      ], 'E413:')
20511966c248SBram Moolenaar  CheckScriptSuccess([
20521966c248SBram Moolenaar      'vim9script',
20531966c248SBram Moolenaar      'hi clear This # comment',
20541966c248SBram Moolenaar      'hi clear # comment',
20551966c248SBram Moolenaar      ])
2056f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2057f5be8cdbSBram Moolenaar  # hi clear This# comment',
20581966c248SBram Moolenaar  CheckScriptFailure([
20591966c248SBram Moolenaar      'vim9script',
20601966c248SBram Moolenaar      'hi clear# comment',
20611966c248SBram Moolenaar      ], 'E416:')
20621966c248SBram Moolenaar
20631966c248SBram Moolenaar  CheckScriptSuccess([
20641966c248SBram Moolenaar      'vim9script',
20651966c248SBram Moolenaar      'hi Group term=bold',
20661966c248SBram Moolenaar      'match Group /todo/ # comment',
20671966c248SBram Moolenaar      ])
20681966c248SBram Moolenaar  CheckScriptFailure([
20691966c248SBram Moolenaar      'vim9script',
20701966c248SBram Moolenaar      'hi Group term=bold',
20711966c248SBram Moolenaar      'match Group /todo/# comment',
20721966c248SBram Moolenaar      ], 'E488:')
20731966c248SBram Moolenaar  CheckScriptSuccess([
20741966c248SBram Moolenaar      'vim9script',
20751966c248SBram Moolenaar      'match # comment',
20761966c248SBram Moolenaar      ])
20771966c248SBram Moolenaar  CheckScriptFailure([
20781966c248SBram Moolenaar      'vim9script',
20791966c248SBram Moolenaar      'match# comment',
20801966c248SBram Moolenaar      ], 'E475:')
20811966c248SBram Moolenaar  CheckScriptSuccess([
20821966c248SBram Moolenaar      'vim9script',
20831966c248SBram Moolenaar      'match none # comment',
20841966c248SBram Moolenaar      ])
20851966c248SBram Moolenaar  CheckScriptFailure([
20861966c248SBram Moolenaar      'vim9script',
20871966c248SBram Moolenaar      'match none# comment',
20881966c248SBram Moolenaar      ], 'E475:')
20891966c248SBram Moolenaar
20901966c248SBram Moolenaar  CheckScriptSuccess([
20911966c248SBram Moolenaar      'vim9script',
20921966c248SBram Moolenaar      'menutrans clear # comment',
20931966c248SBram Moolenaar      ])
20941966c248SBram Moolenaar  CheckScriptFailure([
20951966c248SBram Moolenaar      'vim9script',
20961966c248SBram Moolenaar      'menutrans clear# comment text',
20971966c248SBram Moolenaar      ], 'E474:')
20981966c248SBram Moolenaar
20991966c248SBram Moolenaar  CheckScriptSuccess([
21001966c248SBram Moolenaar      'vim9script',
21011966c248SBram Moolenaar      'syntax clear # comment',
21021966c248SBram Moolenaar      ])
21031966c248SBram Moolenaar  CheckScriptFailure([
21041966c248SBram Moolenaar      'vim9script',
21051966c248SBram Moolenaar      'syntax clear# comment text',
21061966c248SBram Moolenaar      ], 'E28:')
21071966c248SBram Moolenaar  CheckScriptSuccess([
21081966c248SBram Moolenaar      'vim9script',
21091966c248SBram Moolenaar      'syntax keyword Word some',
21101966c248SBram Moolenaar      'syntax clear Word # comment',
21111966c248SBram Moolenaar      ])
21121966c248SBram Moolenaar  CheckScriptFailure([
21131966c248SBram Moolenaar      'vim9script',
21141966c248SBram Moolenaar      'syntax keyword Word some',
21151966c248SBram Moolenaar      'syntax clear Word# comment text',
21161966c248SBram Moolenaar      ], 'E28:')
21171966c248SBram Moolenaar
21181966c248SBram Moolenaar  CheckScriptSuccess([
21191966c248SBram Moolenaar      'vim9script',
21201966c248SBram Moolenaar      'syntax list # comment',
21211966c248SBram Moolenaar      ])
21221966c248SBram Moolenaar  CheckScriptFailure([
21231966c248SBram Moolenaar      'vim9script',
21241966c248SBram Moolenaar      'syntax list# comment text',
21251966c248SBram Moolenaar      ], 'E28:')
21261966c248SBram Moolenaar
21271966c248SBram Moolenaar  CheckScriptSuccess([
21281966c248SBram Moolenaar      'vim9script',
21291966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
21301966c248SBram Moolenaar      ])
21311966c248SBram Moolenaar  CheckScriptFailure([
21321966c248SBram Moolenaar      'vim9script',
21331966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
21341966c248SBram Moolenaar      ], 'E475:')
21351966c248SBram Moolenaar
21361966c248SBram Moolenaar  CheckScriptSuccess([
21371966c248SBram Moolenaar      'vim9script',
21381966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21391966c248SBram Moolenaar      ])
21401966c248SBram Moolenaar  CheckScriptFailure([
21411966c248SBram Moolenaar      'vim9script',
21421966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21431966c248SBram Moolenaar      ], 'E789:')
21441966c248SBram Moolenaar
21451966c248SBram Moolenaar  CheckScriptSuccess([
21461966c248SBram Moolenaar      'vim9script',
21471966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21481966c248SBram Moolenaar      ])
21491966c248SBram Moolenaar  CheckScriptFailure([
21501966c248SBram Moolenaar      'vim9script',
21511966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21521966c248SBram Moolenaar      ], 'E402:')
21531966c248SBram Moolenaar
21541966c248SBram Moolenaar  CheckScriptSuccess([
21551966c248SBram Moolenaar      'vim9script',
21561966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21571966c248SBram Moolenaar      ])
21581966c248SBram Moolenaar  CheckScriptFailure([
21591966c248SBram Moolenaar      'vim9script',
21601966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21611966c248SBram Moolenaar      ], 'E475:')
21621966c248SBram Moolenaar  CheckScriptFailure([
21631966c248SBram Moolenaar      'vim9script',
21641966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21651966c248SBram Moolenaar      ], 'E406:')
21661966c248SBram Moolenaar  CheckScriptFailure([
21671966c248SBram Moolenaar      'vim9script',
21681966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21691966c248SBram Moolenaar      ], 'E475:')
21701966c248SBram Moolenaar
21711966c248SBram Moolenaar  CheckScriptSuccess([
21721966c248SBram Moolenaar      'vim9script',
21731966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21741966c248SBram Moolenaar      ])
21751966c248SBram Moolenaar  CheckScriptFailure([
21761966c248SBram Moolenaar      'vim9script',
21771966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2178d032f34aSBram Moolenaar      ], 'E402:')
21791966c248SBram Moolenaar
21801966c248SBram Moolenaar  CheckScriptSuccess([
21811966c248SBram Moolenaar      'vim9script',
21821966c248SBram Moolenaar      'syntax sync # comment',
21831966c248SBram Moolenaar      ])
21841966c248SBram Moolenaar  CheckScriptFailure([
21851966c248SBram Moolenaar      'vim9script',
21861966c248SBram Moolenaar      'syntax sync# comment',
21871966c248SBram Moolenaar      ], 'E404:')
21881966c248SBram Moolenaar  CheckScriptSuccess([
21891966c248SBram Moolenaar      'vim9script',
21901966c248SBram Moolenaar      'syntax sync ccomment # comment',
21911966c248SBram Moolenaar      ])
21921966c248SBram Moolenaar  CheckScriptFailure([
21931966c248SBram Moolenaar      'vim9script',
21941966c248SBram Moolenaar      'syntax sync ccomment# comment',
21951966c248SBram Moolenaar      ], 'E404:')
21961966c248SBram Moolenaar
21971966c248SBram Moolenaar  CheckScriptSuccess([
21981966c248SBram Moolenaar      'vim9script',
21991966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
22001966c248SBram Moolenaar      ])
22011966c248SBram Moolenaar  CheckScriptFailure([
22021966c248SBram Moolenaar      'vim9script',
22031966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
22041966c248SBram Moolenaar      ], 'E475:')
2205a72cfb80SBram Moolenaar
2206a72cfb80SBram Moolenaar  CheckScriptSuccess([
2207a72cfb80SBram Moolenaar      'vim9script',
2208a72cfb80SBram Moolenaar      'command Echo echo # comment',
2209a72cfb80SBram Moolenaar      'command Echo # comment',
2210a72cfb80SBram Moolenaar      ])
2211a72cfb80SBram Moolenaar  CheckScriptFailure([
2212a72cfb80SBram Moolenaar      'vim9script',
2213a72cfb80SBram Moolenaar      'command Echo echo# comment',
2214a72cfb80SBram Moolenaar      'Echo',
2215a72cfb80SBram Moolenaar      ], 'E121:')
2216a72cfb80SBram Moolenaar  CheckScriptFailure([
2217a72cfb80SBram Moolenaar      'vim9script',
2218a72cfb80SBram Moolenaar      'command Echo# comment',
2219a72cfb80SBram Moolenaar      ], 'E182:')
2220a72cfb80SBram Moolenaar  CheckScriptFailure([
2221a72cfb80SBram Moolenaar      'vim9script',
2222a72cfb80SBram Moolenaar      'command Echo echo',
2223a72cfb80SBram Moolenaar      'command Echo# comment',
2224a72cfb80SBram Moolenaar      ], 'E182:')
2225a72cfb80SBram Moolenaar
2226a72cfb80SBram Moolenaar  CheckScriptSuccess([
2227a72cfb80SBram Moolenaar      'vim9script',
2228a72cfb80SBram Moolenaar      'function # comment',
2229a72cfb80SBram Moolenaar      ])
2230a72cfb80SBram Moolenaar  CheckScriptFailure([
2231a72cfb80SBram Moolenaar      'vim9script',
22329898107fSBram Moolenaar      'function " comment',
22339898107fSBram Moolenaar      ], 'E129:')
22349898107fSBram Moolenaar  CheckScriptFailure([
22359898107fSBram Moolenaar      'vim9script',
2236a72cfb80SBram Moolenaar      'function# comment',
2237a72cfb80SBram Moolenaar      ], 'E129:')
2238a72cfb80SBram Moolenaar  CheckScriptSuccess([
2239a72cfb80SBram Moolenaar      'vim9script',
2240a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2241a72cfb80SBram Moolenaar      ])
2242a72cfb80SBram Moolenaar  CheckScriptFailure([
2243a72cfb80SBram Moolenaar      'vim9script',
2244a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2245a72cfb80SBram Moolenaar      ], 'E488:')
2246a72cfb80SBram Moolenaar
2247a72cfb80SBram Moolenaar  CheckScriptSuccess([
2248a72cfb80SBram Moolenaar      'vim9script',
22494c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2250a72cfb80SBram Moolenaar      'endfunc',
22514c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2252a72cfb80SBram Moolenaar      ])
2253a72cfb80SBram Moolenaar  CheckScriptFailure([
2254a72cfb80SBram Moolenaar      'vim9script',
22554c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2256a72cfb80SBram Moolenaar      'endfunc',
22574c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2258a72cfb80SBram Moolenaar      ], 'E488:')
2259a72cfb80SBram Moolenaar
2260a72cfb80SBram Moolenaar  CheckScriptSuccess([
2261a72cfb80SBram Moolenaar      'vim9script',
2262a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2263a72cfb80SBram Moolenaar      ])
2264a72cfb80SBram Moolenaar  CheckScriptFailure([
2265a72cfb80SBram Moolenaar      'vim9script',
2266a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2267a72cfb80SBram Moolenaar      ], 'E488:')
2268e7e4838fSBram Moolenaar
2269e7e4838fSBram Moolenaar  CheckScriptFailure([
2270e7e4838fSBram Moolenaar      'def Test() " comment',
2271e7e4838fSBram Moolenaar      'enddef',
2272e7e4838fSBram Moolenaar      ], 'E488:')
2273e7e4838fSBram Moolenaar  CheckScriptFailure([
2274e7e4838fSBram Moolenaar      'vim9script',
2275e7e4838fSBram Moolenaar      'def Test() " comment',
2276e7e4838fSBram Moolenaar      'enddef',
2277e7e4838fSBram Moolenaar      ], 'E488:')
2278e7e4838fSBram Moolenaar
2279e7e4838fSBram Moolenaar  CheckScriptSuccess([
2280e7e4838fSBram Moolenaar      'func Test() " comment',
2281e7e4838fSBram Moolenaar      'endfunc',
2282e7e4838fSBram Moolenaar      ])
22839898107fSBram Moolenaar  CheckScriptSuccess([
2284e7e4838fSBram Moolenaar      'vim9script',
2285e7e4838fSBram Moolenaar      'func Test() " comment',
2286e7e4838fSBram Moolenaar      'endfunc',
22879898107fSBram Moolenaar      ])
2288e7e4838fSBram Moolenaar
2289e7e4838fSBram Moolenaar  CheckScriptSuccess([
2290e7e4838fSBram Moolenaar      'def Test() # comment',
2291e7e4838fSBram Moolenaar      'enddef',
2292e7e4838fSBram Moolenaar      ])
2293e7e4838fSBram Moolenaar  CheckScriptFailure([
2294e7e4838fSBram Moolenaar      'func Test() # comment',
2295e7e4838fSBram Moolenaar      'endfunc',
2296e7e4838fSBram Moolenaar      ], 'E488:')
22972c5ed4e3SBram Moolenaarenddef
22982c5ed4e3SBram Moolenaar
22992c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
23002c5ed4e3SBram Moolenaar  CheckCanRunGui
23012c5ed4e3SBram Moolenaar
23022c5ed4e3SBram Moolenaar  CheckScriptFailure([
23032c5ed4e3SBram Moolenaar      'vim9script',
23042c5ed4e3SBram Moolenaar      'gui#comment'
23052c5ed4e3SBram Moolenaar      ], 'E499:')
23062c5ed4e3SBram Moolenaar  CheckScriptFailure([
23072c5ed4e3SBram Moolenaar      'vim9script',
23082c5ed4e3SBram Moolenaar      'gui -f#comment'
23092c5ed4e3SBram Moolenaar      ], 'E499:')
23107a092245SBram Moolenaarenddef
23117a092245SBram Moolenaar
2312a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
23136797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
23146797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2315a26b9700SBram Moolenaar
2316a26b9700SBram Moolenaar  edit test.vim
2317a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2318a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2319a26b9700SBram Moolenaar
2320a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2321a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2322a26b9700SBram Moolenaar
2323a26b9700SBram Moolenaar  g:entered = 0
2324a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2325a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2326a26b9700SBram Moolenaar
2327a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2328a26b9700SBram Moolenaar
2329a26b9700SBram Moolenaar  au! TabEnter
2330a26b9700SBram Moolenaar  unlet g:entered
2331d72c1bf0SBram Moolenaar
2332d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2333d72c1bf0SBram Moolenaar      'vim9script',
23346797966dSBram Moolenaar      'g:var = 123',
2335e55b1c09SBram Moolenaar      'b:var = 456',
2336e55b1c09SBram Moolenaar      'w:var = 777',
2337e55b1c09SBram Moolenaar      't:var = 888',
2338d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2339d72c1bf0SBram Moolenaar      ])
2340d72c1bf0SBram Moolenaar
2341d72c1bf0SBram Moolenaar  CheckScriptFailure([
2342d72c1bf0SBram Moolenaar      'vim9script',
2343d72c1bf0SBram Moolenaar      'let g:var = 123',
2344e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2345e55b1c09SBram Moolenaar
2346e55b1c09SBram Moolenaar  CheckScriptFailure([
2347e55b1c09SBram Moolenaar      'vim9script',
2348e55b1c09SBram Moolenaar      'let b:var = 123',
2349e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2350e55b1c09SBram Moolenaar
2351e55b1c09SBram Moolenaar  CheckScriptFailure([
2352e55b1c09SBram Moolenaar      'vim9script',
2353e55b1c09SBram Moolenaar      'let w:var = 123',
2354e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2355e55b1c09SBram Moolenaar
2356e55b1c09SBram Moolenaar  CheckScriptFailure([
2357e55b1c09SBram Moolenaar      'vim9script',
2358e55b1c09SBram Moolenaar      'let t:var = 123',
2359e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2360e55b1c09SBram Moolenaar
2361e55b1c09SBram Moolenaar  CheckScriptFailure([
2362e55b1c09SBram Moolenaar      'vim9script',
2363e55b1c09SBram Moolenaar      'let v:version = 123',
2364e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2365e55b1c09SBram Moolenaar
2366e55b1c09SBram Moolenaar  CheckScriptFailure([
2367e55b1c09SBram Moolenaar      'vim9script',
2368e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2369e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23706797966dSBram Moolenaar
23716797966dSBram Moolenaar  CheckScriptFailure([
23726797966dSBram Moolenaar      'vim9script',
23736797966dSBram Moolenaar      'g:var = 123',
237432e35117SBram Moolenaar      'unlet g:var# comment1',
2375d72c1bf0SBram Moolenaar      ], 'E108:')
2376d72c1bf0SBram Moolenaar
2377d72c1bf0SBram Moolenaar  CheckScriptFailure([
2378d72c1bf0SBram Moolenaar      'let g:var = 123',
2379d72c1bf0SBram Moolenaar      'unlet g:var # something',
2380d72c1bf0SBram Moolenaar      ], 'E488:')
2381faac4104SBram Moolenaar
2382faac4104SBram Moolenaar  CheckScriptSuccess([
2383faac4104SBram Moolenaar      'vim9script',
238432e35117SBram Moolenaar      'if 1 # comment2',
2385faac4104SBram Moolenaar      '  echo "yes"',
2386faac4104SBram Moolenaar      'elseif 2 #comment',
2387faac4104SBram Moolenaar      '  echo "no"',
2388faac4104SBram Moolenaar      'endif',
2389faac4104SBram Moolenaar      ])
2390faac4104SBram Moolenaar
2391faac4104SBram Moolenaar  CheckScriptFailure([
2392faac4104SBram Moolenaar      'vim9script',
239332e35117SBram Moolenaar      'if 1# comment3',
2394faac4104SBram Moolenaar      '  echo "yes"',
2395faac4104SBram Moolenaar      'endif',
2396faac4104SBram Moolenaar      ], 'E15:')
2397faac4104SBram Moolenaar
2398faac4104SBram Moolenaar  CheckScriptFailure([
2399faac4104SBram Moolenaar      'vim9script',
240032e35117SBram Moolenaar      'if 0 # comment4',
2401faac4104SBram Moolenaar      '  echo "yes"',
2402faac4104SBram Moolenaar      'elseif 2#comment',
2403faac4104SBram Moolenaar      '  echo "no"',
2404faac4104SBram Moolenaar      'endif',
2405faac4104SBram Moolenaar      ], 'E15:')
2406faac4104SBram Moolenaar
2407faac4104SBram Moolenaar  CheckScriptSuccess([
2408faac4104SBram Moolenaar      'vim9script',
240932e35117SBram Moolenaar      'let v = 1 # comment5',
2410faac4104SBram Moolenaar      ])
2411faac4104SBram Moolenaar
2412faac4104SBram Moolenaar  CheckScriptFailure([
2413faac4104SBram Moolenaar      'vim9script',
241432e35117SBram Moolenaar      'let v = 1# comment6',
241532e35117SBram Moolenaar      ], 'E15:')
2416faac4104SBram Moolenaar
2417faac4104SBram Moolenaar  CheckScriptSuccess([
2418faac4104SBram Moolenaar      'vim9script',
2419faac4104SBram Moolenaar      'new'
2420d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2421df069eecSBram Moolenaar      ':$',
2422faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2423faac4104SBram Moolenaar      'bwipe!',
2424faac4104SBram Moolenaar      ])
2425faac4104SBram Moolenaar
2426f5be8cdbSBram Moolenaar  CheckScriptFailure([
2427f5be8cdbSBram Moolenaar      'vim9script',
2428f5be8cdbSBram Moolenaar      'new'
2429d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2430f5be8cdbSBram Moolenaar      ':$',
2431f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2432f5be8cdbSBram Moolenaar      'bwipe!',
2433f5be8cdbSBram Moolenaar      ], 'E488:')
2434f5be8cdbSBram Moolenaar
2435f5be8cdbSBram Moolenaar  CheckScriptFailure([
2436f5be8cdbSBram Moolenaar      'vim9script',
2437f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2438f5be8cdbSBram Moolenaar      ], 'E477:')
2439a26b9700SBram Moolenaarenddef
2440a26b9700SBram Moolenaar
24417e5bd91dSBram Moolenaardef Test_finish()
24427e5bd91dSBram Moolenaar  let lines =<< trim END
24437e5bd91dSBram Moolenaar    vim9script
24446797966dSBram Moolenaar    g:res = 'one'
24457e5bd91dSBram Moolenaar    if v:false | finish | endif
24466797966dSBram Moolenaar    g:res = 'two'
24477e5bd91dSBram Moolenaar    finish
24486797966dSBram Moolenaar    g:res = 'three'
24497e5bd91dSBram Moolenaar  END
24507e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24517e5bd91dSBram Moolenaar  source Xfinished
24527e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24537e5bd91dSBram Moolenaar
24547e5bd91dSBram Moolenaar  unlet g:res
24557e5bd91dSBram Moolenaar  delete('Xfinished')
24567e5bd91dSBram Moolenaarenddef
24577e5bd91dSBram Moolenaar
245832e35117SBram Moolenaardef Test_let_func_call()
245932e35117SBram Moolenaar  let lines =<< trim END
246032e35117SBram Moolenaar    vim9script
246132e35117SBram Moolenaar    func GetValue()
246232e35117SBram Moolenaar      if exists('g:count')
246332e35117SBram Moolenaar        let g:count += 1
246432e35117SBram Moolenaar      else
246532e35117SBram Moolenaar        let g:count = 1
246632e35117SBram Moolenaar      endif
246732e35117SBram Moolenaar      return 'this'
246832e35117SBram Moolenaar    endfunc
246932e35117SBram Moolenaar    let val: string = GetValue()
2470f5be8cdbSBram Moolenaar    # env var is always a string
2471df671b46SBram Moolenaar    let env = $TERM
247232e35117SBram Moolenaar  END
247332e35117SBram Moolenaar  writefile(lines, 'Xfinished')
247432e35117SBram Moolenaar  source Xfinished
2475f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
247632e35117SBram Moolenaar  assert_equal(1, g:count)
247732e35117SBram Moolenaar
247832e35117SBram Moolenaar  unlet g:count
247932e35117SBram Moolenaar  delete('Xfinished')
248032e35117SBram Moolenaarenddef
248132e35117SBram Moolenaar
248232e35117SBram Moolenaardef Test_let_missing_type()
248332e35117SBram Moolenaar  let lines =<< trim END
248432e35117SBram Moolenaar    vim9script
2485df671b46SBram Moolenaar    let var = g:unknown
2486227a69deSBram Moolenaar  END
2487822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2488227a69deSBram Moolenaar
2489227a69deSBram Moolenaar  lines =<< trim END
2490227a69deSBram Moolenaar    vim9script
2491227a69deSBram Moolenaar    let nr: number = 123
2492227a69deSBram Moolenaar    let var = nr
2493227a69deSBram Moolenaar  END
2494822ba247SBram Moolenaar  CheckScriptSuccess(lines)
249532e35117SBram Moolenaarenddef
249632e35117SBram Moolenaar
2497c82a5b5dSBram Moolenaardef Test_let_declaration()
2498c82a5b5dSBram Moolenaar  let lines =<< trim END
2499c82a5b5dSBram Moolenaar    vim9script
2500c82a5b5dSBram Moolenaar    let var: string
2501c82a5b5dSBram Moolenaar    g:var_uninit = var
2502c82a5b5dSBram Moolenaar    var = 'text'
2503c82a5b5dSBram Moolenaar    g:var_test = var
2504f5be8cdbSBram Moolenaar    # prefixing s: is optional
2505984dddbeSBram Moolenaar    s:var = 'prefixed'
2506984dddbeSBram Moolenaar    g:var_prefixed = s:var
2507984dddbeSBram Moolenaar
2508984dddbeSBram Moolenaar    let s:other: number
2509984dddbeSBram Moolenaar    other = 1234
2510984dddbeSBram Moolenaar    g:other_var = other
251153b29e48SBram Moolenaar
251253b29e48SBram Moolenaar    # type is inferred
251353b29e48SBram Moolenaar    s:dict = {'a': 222}
251453b29e48SBram Moolenaar    def GetDictVal(key: any)
251553b29e48SBram Moolenaar      g:dict_val = s:dict[key]
251653b29e48SBram Moolenaar    enddef
251753b29e48SBram Moolenaar    GetDictVal('a')
2518c82a5b5dSBram Moolenaar  END
2519c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2520c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2521c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2522984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2523984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
252453b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
2525c82a5b5dSBram Moolenaar
2526c82a5b5dSBram Moolenaar  unlet g:var_uninit
2527c82a5b5dSBram Moolenaar  unlet g:var_test
2528984dddbeSBram Moolenaar  unlet g:var_prefixed
2529984dddbeSBram Moolenaar  unlet g:other_var
2530c82a5b5dSBram Moolenaarenddef
2531c82a5b5dSBram Moolenaar
2532c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2533c5b1c20bSBram Moolenaar  let lines =<< trim END
2534c5b1c20bSBram Moolenaar    vim9script
2535c5b1c20bSBram Moolenaar    const var: string
2536c5b1c20bSBram Moolenaar  END
2537c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2538c5b1c20bSBram Moolenaar
2539c5b1c20bSBram Moolenaar  lines =<< trim END
2540c5b1c20bSBram Moolenaar    vim9script
2541c5b1c20bSBram Moolenaar    let 9var: string
2542c5b1c20bSBram Moolenaar  END
2543c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2544c5b1c20bSBram Moolenaarenddef
2545c5b1c20bSBram Moolenaar
254634db91f7SBram Moolenaardef Test_let_type_check()
254734db91f7SBram Moolenaar  let lines =<< trim END
254834db91f7SBram Moolenaar    vim9script
254934db91f7SBram Moolenaar    let var: string
255034db91f7SBram Moolenaar    var = 1234
255134db91f7SBram Moolenaar  END
2552451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
2553984dddbeSBram Moolenaar
2554984dddbeSBram Moolenaar  lines =<< trim END
2555984dddbeSBram Moolenaar    vim9script
2556984dddbeSBram Moolenaar    let var:string
2557984dddbeSBram Moolenaar  END
2558984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2559c5b1c20bSBram Moolenaar
2560c5b1c20bSBram Moolenaar  lines =<< trim END
2561c5b1c20bSBram Moolenaar    vim9script
2562c5b1c20bSBram Moolenaar    let var: asdf
2563c5b1c20bSBram Moolenaar  END
2564c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2565a71e2633SBram Moolenaar
2566a71e2633SBram Moolenaar  lines =<< trim END
2567a71e2633SBram Moolenaar    vim9script
2568a71e2633SBram Moolenaar    let s:l: list<number>
2569a71e2633SBram Moolenaar    s:l = []
2570a71e2633SBram Moolenaar  END
2571a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2572a71e2633SBram Moolenaar
2573a71e2633SBram Moolenaar  lines =<< trim END
2574a71e2633SBram Moolenaar    vim9script
2575a71e2633SBram Moolenaar    let s:d: dict<number>
2576a71e2633SBram Moolenaar    s:d = {}
2577a71e2633SBram Moolenaar  END
2578a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
257934db91f7SBram Moolenaarenddef
258034db91f7SBram Moolenaar
25815e654230SBram Moolenaarlet g:dict_number = #{one: 1, two: 2}
25825e654230SBram Moolenaar
25835e654230SBram Moolenaardef Test_let_list_dict_type()
25845e654230SBram Moolenaar  let ll: list<number>
25855e654230SBram Moolenaar  ll = [1, 2, 2, 3, 3, 3]->uniq()
25865e654230SBram Moolenaar  ll->assert_equal([1, 2, 3])
25875e654230SBram Moolenaar
25885e654230SBram Moolenaar  let dd: dict<number>
25895e654230SBram Moolenaar  dd = g:dict_number
25905e654230SBram Moolenaar  dd->assert_equal(g:dict_number)
25915e654230SBram Moolenaar
25925e654230SBram Moolenaar  let lines =<< trim END
25935e654230SBram Moolenaar      let ll: list<number>
25945e654230SBram Moolenaar      ll = [1, 2, 3]->map('"one"')
25955e654230SBram Moolenaar  END
25965e654230SBram Moolenaar  CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>')
25975e654230SBram Moolenaarenddef
25985e654230SBram Moolenaar
2599a5d0077eSBram Moolenaardef Test_forward_declaration()
2600a5d0077eSBram Moolenaar  let lines =<< trim END
2601a5d0077eSBram Moolenaar    vim9script
2602a5d0077eSBram Moolenaar    def GetValue(): string
2603a5d0077eSBram Moolenaar      return theVal
2604a5d0077eSBram Moolenaar    enddef
2605a5d0077eSBram Moolenaar    let theVal = 'something'
2606822ba247SBram Moolenaar    g:initVal = GetValue()
2607a5d0077eSBram Moolenaar    theVal = 'else'
2608a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2609a5d0077eSBram Moolenaar  END
2610a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2611a5d0077eSBram Moolenaar  source Xforward
2612a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2613a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2614a5d0077eSBram Moolenaar
2615a5d0077eSBram Moolenaar  unlet g:initVal
2616a5d0077eSBram Moolenaar  unlet g:laterVal
2617a5d0077eSBram Moolenaar  delete('Xforward')
2618a5d0077eSBram Moolenaarenddef
2619a5d0077eSBram Moolenaar
26209721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
26219721fb4eSBram Moolenaar  let legacy_lines =<< trim END
26229721fb4eSBram Moolenaar    source Xvim9_script.vim
26239721fb4eSBram Moolenaar
26249721fb4eSBram Moolenaar    call assert_false(exists('local'))
26259721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26269721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
26279721fb4eSBram Moolenaar    call assert_equal('global', global)
26289721fb4eSBram Moolenaar    call assert_equal('global', g:global)
26299721fb4eSBram Moolenaar
26309721fb4eSBram Moolenaar    " imported variable becomes script-local
26319721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
26329721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
26339721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26349721fb4eSBram Moolenaar
26359721fb4eSBram Moolenaar    " imported function becomes script-local
26369721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
26379721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
26389721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
26399721fb4eSBram Moolenaar  END
26409721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
26419721fb4eSBram Moolenaar
26429721fb4eSBram Moolenaar  let vim9_lines =<< trim END
26439721fb4eSBram Moolenaar    vim9script
26449721fb4eSBram Moolenaar    let local = 'local'
26459721fb4eSBram Moolenaar    g:global = 'global'
26469721fb4eSBram Moolenaar    export let exported = 'exported'
26479721fb4eSBram Moolenaar    export def GetText(): string
26489721fb4eSBram Moolenaar       return 'text'
26499721fb4eSBram Moolenaar    enddef
26509721fb4eSBram Moolenaar  END
26519721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
26529721fb4eSBram Moolenaar
26539721fb4eSBram Moolenaar  source Xlegacy_script.vim
26549721fb4eSBram Moolenaar
26559721fb4eSBram Moolenaar  assert_equal('global', g:global)
2656f5be8cdbSBram Moolenaar  unlet g:global
26579721fb4eSBram Moolenaar
26589721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
26599721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
26609721fb4eSBram Moolenaarenddef
2661a5d0077eSBram Moolenaar
26627d699701SBram Moolenaarfunc Test_vim9script_not_global()
26637d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
26647d699701SBram Moolenaar  let vim9lines =<< trim END
26657d699701SBram Moolenaar    vim9script
26667d699701SBram Moolenaar    let var = 'local'
26677d699701SBram Moolenaar    func TheFunc()
26687d699701SBram Moolenaar      echo 'local'
26697d699701SBram Moolenaar    endfunc
26707d699701SBram Moolenaar    def DefFunc()
26717d699701SBram Moolenaar      echo 'local'
26727d699701SBram Moolenaar    enddef
26737d699701SBram Moolenaar  END
26747d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
26757d699701SBram Moolenaar  source Xvim9script.vim
26767d699701SBram Moolenaar  try
26777d699701SBram Moolenaar    echo g:var
26787d699701SBram Moolenaar    assert_report('did not fail')
26797d699701SBram Moolenaar  catch /E121:/
26807d699701SBram Moolenaar    " caught
26817d699701SBram Moolenaar  endtry
26827d699701SBram Moolenaar  try
26837d699701SBram Moolenaar    call TheFunc()
26847d699701SBram Moolenaar    assert_report('did not fail')
26857d699701SBram Moolenaar  catch /E117:/
26867d699701SBram Moolenaar    " caught
26877d699701SBram Moolenaar  endtry
26887d699701SBram Moolenaar  try
26897d699701SBram Moolenaar    call DefFunc()
26907d699701SBram Moolenaar    assert_report('did not fail')
26917d699701SBram Moolenaar  catch /E117:/
26927d699701SBram Moolenaar    " caught
26937d699701SBram Moolenaar  endtry
26947d699701SBram Moolenaar
269525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
26967d699701SBram Moolenaarendfunc
26977d699701SBram Moolenaar
2698eeb27bfeSBram Moolenaardef Test_vim9_copen()
2699eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2700eeb27bfeSBram Moolenaar  copen
2701eeb27bfeSBram Moolenaar  quit
2702eeb27bfeSBram Moolenaarenddef
2703eeb27bfeSBram Moolenaar
27042d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
27052d6b20d6SBram Moolenaardef Test_vim9_autoload()
27062d6b20d6SBram Moolenaar  let lines =<< trim END
27072d6b20d6SBram Moolenaar     vim9script
27082d6b20d6SBram Moolenaar     def foo#test()
27092d6b20d6SBram Moolenaar         echomsg getreg('"')
27102d6b20d6SBram Moolenaar     enddef
27112d6b20d6SBram Moolenaar  END
27122d6b20d6SBram Moolenaar
27132d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
27142d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
27152d6b20d6SBram Moolenaar  let save_rtp = &rtp
27162d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
27172d6b20d6SBram Moolenaar  augroup test
27182d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
27192d6b20d6SBram Moolenaar  augroup END
27202d6b20d6SBram Moolenaar
27212d6b20d6SBram Moolenaar  normal Y
27222d6b20d6SBram Moolenaar
27232d6b20d6SBram Moolenaar  augroup test
27242d6b20d6SBram Moolenaar    autocmd!
27252d6b20d6SBram Moolenaar  augroup END
27262d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
27272d6b20d6SBram Moolenaar  &rtp = save_rtp
27282d6b20d6SBram Moolenaarenddef
27292d6b20d6SBram Moolenaar
273077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
273177e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
273277e5dcc3SBram Moolenaar  let lines =<< trim END
273377e5dcc3SBram Moolenaar      vim9script
273477e5dcc3SBram Moolenaar      def crash#func()
273577e5dcc3SBram Moolenaar          try
273677e5dcc3SBram Moolenaar              for x in List()
273777e5dcc3SBram Moolenaar              endfor
273877e5dcc3SBram Moolenaar          catch
273977e5dcc3SBram Moolenaar          endtry
274077e5dcc3SBram Moolenaar          g:ok = true
274177e5dcc3SBram Moolenaar      enddef
274277e5dcc3SBram Moolenaar      fu List()
274377e5dcc3SBram Moolenaar          invalid
274477e5dcc3SBram Moolenaar      endfu
274577e5dcc3SBram Moolenaar      try
274677e5dcc3SBram Moolenaar          invalid
274777e5dcc3SBram Moolenaar      catch /wontmatch/
274877e5dcc3SBram Moolenaar      endtry
274977e5dcc3SBram Moolenaar  END
275077e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
275177e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
275277e5dcc3SBram Moolenaar
275377e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
275477e5dcc3SBram Moolenaar  lines =<< trim END
275577e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
275677e5dcc3SBram Moolenaar    call crash#func()
275777e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
27589c4f5520SBram Moolenaar    qall!
275977e5dcc3SBram Moolenaar  END
276077e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
276177e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
276277e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
276377e5dcc3SBram Moolenaar
276477e5dcc3SBram Moolenaar  delete('Xdidit')
276577e5dcc3SBram Moolenaar  delete('Xscript')
276677e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
276777e5dcc3SBram Moolenaarenddef
276877e5dcc3SBram Moolenaar
276981e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
277081e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
277181e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
277281e17fbeSBram Moolenaar  let lines =<< trim END
277381e17fbeSBram Moolenaar    let s:counter = 1
277481e17fbeSBram Moolenaar    def s:Func()
277581e17fbeSBram Moolenaar      au! CursorHold
277681e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
277781e17fbeSBram Moolenaar    enddef
277881e17fbeSBram Moolenaar    call s:Func()
277981e17fbeSBram Moolenaar    doau CursorHold
278081e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
278181e17fbeSBram Moolenaar    au! CursorHold
278281e17fbeSBram Moolenaar  END
278381e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
278481e17fbeSBram Moolenaarenddef
278581e17fbeSBram Moolenaar
27863896a105SBram Moolenaardef Test_cmdline_win()
27873896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
27883896a105SBram Moolenaar  # the command line window.
27893896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
27903896a105SBram Moolenaar  let export_lines =<< trim END
27913896a105SBram Moolenaar    vim9script
27923896a105SBram Moolenaar    export let That = 'yes'
27933896a105SBram Moolenaar  END
27943896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
27953896a105SBram Moolenaar  let import_lines =<< trim END
27963896a105SBram Moolenaar    vim9script
27973896a105SBram Moolenaar    import That from './Xexport.vim'
27983896a105SBram Moolenaar  END
27993896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
28003896a105SBram Moolenaar  let save_rtp = &rtp
28013896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
28023896a105SBram Moolenaar  syntax on
28033896a105SBram Moolenaar  augroup CmdWin
28043896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
28053896a105SBram Moolenaar  augroup END
28063896a105SBram Moolenaar  # this will open and also close the cmdline window
28073896a105SBram Moolenaar  feedkeys('q:', 'xt')
28083896a105SBram Moolenaar  assert_equal('yes', g:got_there)
28093896a105SBram Moolenaar
28103896a105SBram Moolenaar  augroup CmdWin
28113896a105SBram Moolenaar    au!
28123896a105SBram Moolenaar  augroup END
28133896a105SBram Moolenaar  &rtp = save_rtp
28143896a105SBram Moolenaar  delete('rtp', 'rf')
28153896a105SBram Moolenaarenddef
28163896a105SBram Moolenaar
2817e3d4685fSBram Moolenaardef Test_invalid_sid()
2818e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
281925859dd7SBram Moolenaar
28209c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2821d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2822e3d4685fSBram Moolenaar  endif
2823e3d4685fSBram Moolenaar  delete('Xdidit')
2824e3d4685fSBram Moolenaarenddef
2825e3d4685fSBram Moolenaar
2826f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2827f0afd9e1SBram Moolenaar  let lines =<< trim END
2828f0afd9e1SBram Moolenaar    let var: any
2829f0afd9e1SBram Moolenaar    assert_equal(0, var)
2830f0afd9e1SBram Moolenaar  END
2831f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2832f0afd9e1SBram Moolenaarenddef
2833f0afd9e1SBram Moolenaar
2834*7e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
283558dbef33SBram Moolenaar  CheckRunVimInTerminal
283658dbef33SBram Moolenaar
2837*7e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
2838*7e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
2839*7e9210eaSBram Moolenaarendfunc
2840*7e9210eaSBram Moolenaar
2841*7e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
28429c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
28439c4f5520SBram Moolenaar  let lines =<< trim END
28449c4f5520SBram Moolenaar    func CheckAndQuit()
28459c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
28469c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
28479c4f5520SBram Moolenaar    endfunc
28489c4f5520SBram Moolenaar  END
28499c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
28509c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
28519c4f5520SBram Moolenaar  let buf = RunVimInTerminal('-S XcallFunc', #{rows: 6})
28529c4f5520SBram Moolenaar  # define Afunc() on the command line
28539c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
28549c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
28559c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
28569c4f5520SBram Moolenaar
28579c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
28589c4f5520SBram Moolenaar  delete('XcallFunc')
28599c4f5520SBram Moolenaar  delete('Xdidcmd')
28609c4f5520SBram Moolenaarenddef
28619c4f5520SBram Moolenaar
2862585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2863585fea7bSBram Moolenaardef Test_substitute_cmd()
2864585fea7bSBram Moolenaar  new
2865585fea7bSBram Moolenaar  setline(1, 'something')
2866585fea7bSBram Moolenaar  :substitute(some(other(
2867585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2868585fea7bSBram Moolenaar  bwipe!
2869585fea7bSBram Moolenaar
2870f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2871585fea7bSBram Moolenaar  let lines =<< trim END
2872585fea7bSBram Moolenaar    vim9script
2873585fea7bSBram Moolenaar    new
2874585fea7bSBram Moolenaar    setline(1, 'something')
2875585fea7bSBram Moolenaar    :substitute(some(other(
2876585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2877585fea7bSBram Moolenaar    bwipe!
2878585fea7bSBram Moolenaar  END
2879585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2880585fea7bSBram Moolenaar  source Xvim9lines
2881585fea7bSBram Moolenaar
2882585fea7bSBram Moolenaar  delete('Xvim9lines')
2883585fea7bSBram Moolenaarenddef
2884585fea7bSBram Moolenaar
28858a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2886