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
9*cfcd011fSBram Moolenaar" TODO: remove later
10*cfcd011fSBram Moolenaarlet v:disallow_let = 1
11*cfcd011fSBram Moolenaar
125d72ce69SBram Moolenaardef Test_range_only()
135d72ce69SBram Moolenaar  new
145d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
155d72ce69SBram Moolenaar  :/Blah/
165d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
17c2af0affSBram Moolenaar  bwipe!
18c2af0affSBram Moolenaar
19c2af0affSBram Moolenaar  # without range commands use current line
20c2af0affSBram Moolenaar  new
21c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
22c2af0affSBram Moolenaar  :2
23c2af0affSBram Moolenaar  print
24c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
25c2af0affSBram Moolenaar  :3
26c2af0affSBram Moolenaar  list
27c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
28c2af0affSBram Moolenaar  bwipe!
295d72ce69SBram Moolenaarenddef
305d72ce69SBram Moolenaar
31a6e67e4fSBram Moolenaarlet g:alist = [7]
32a6e67e4fSBram Moolenaarlet g:astring = 'text'
33f0b9f43cSBram Moolenaarlet g:anumber = 123
346e587dcbSBram Moolenaar
35d72c1bf0SBram Moolenaardef Test_unlet()
36d72c1bf0SBram Moolenaar  g:somevar = 'yes'
37d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
38d72c1bf0SBram Moolenaar  unlet g:somevar
39d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
40d72c1bf0SBram Moolenaar  unlet! g:somevar
41d72c1bf0SBram Moolenaar
428436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
438436773fSBram Moolenaar  s:somevar = 'legacy'
448436773fSBram Moolenaar  assert_true(exists('s:somevar'))
458436773fSBram Moolenaar  unlet s:somevar
468436773fSBram Moolenaar  assert_false(exists('s:somevar'))
478436773fSBram Moolenaar  unlet! s:somevar
488436773fSBram Moolenaar
49d2c61705SBram Moolenaar  CheckScriptFailure([
50d72c1bf0SBram Moolenaar   'vim9script',
51*cfcd011fSBram Moolenaar   'var svar = 123',
52d72c1bf0SBram Moolenaar   'unlet svar',
53d72c1bf0SBram Moolenaar   ], 'E1081:')
54d2c61705SBram Moolenaar  CheckScriptFailure([
55d72c1bf0SBram Moolenaar   'vim9script',
56*cfcd011fSBram Moolenaar   'var svar = 123',
57d72c1bf0SBram Moolenaar   'unlet s:svar',
58d72c1bf0SBram Moolenaar   ], 'E1081:')
59d2c61705SBram Moolenaar  CheckScriptFailure([
60d72c1bf0SBram Moolenaar   'vim9script',
61*cfcd011fSBram Moolenaar   'var svar = 123',
62d72c1bf0SBram Moolenaar   'def Func()',
63d72c1bf0SBram Moolenaar   '  unlet svar',
64d72c1bf0SBram Moolenaar   'enddef',
65822ba247SBram Moolenaar   'defcompile',
66d72c1bf0SBram Moolenaar   ], 'E1081:')
67d2c61705SBram Moolenaar  CheckScriptFailure([
68d72c1bf0SBram Moolenaar   'vim9script',
69*cfcd011fSBram Moolenaar   'var svar = 123',
70d72c1bf0SBram Moolenaar   'def Func()',
71d72c1bf0SBram Moolenaar   '  unlet s:svar',
72d72c1bf0SBram Moolenaar   'enddef',
73822ba247SBram Moolenaar   'defcompile',
74d72c1bf0SBram Moolenaar   ], 'E1081:')
757bdaea6eSBram Moolenaar
767bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
777bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
787bdaea6eSBram Moolenaar  unlet $ENVVAR
797bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
80d72c1bf0SBram Moolenaarenddef
81599c89c8SBram Moolenaar
824c17ad94SBram Moolenaardef Test_delfunction()
83f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
844c17ad94SBram Moolenaar  CheckScriptSuccess([
854c17ad94SBram Moolenaar      'vim9script',
864c17ad94SBram Moolenaar      'func CheckMe()',
874c17ad94SBram Moolenaar      '  return 123',
884c17ad94SBram Moolenaar      'endfunc',
894c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
904c17ad94SBram Moolenaar      ])
914c17ad94SBram Moolenaar
92f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
934c17ad94SBram Moolenaar  CheckScriptFailure([
944c17ad94SBram Moolenaar      'vim9script',
954c17ad94SBram Moolenaar      'func DeleteMe1()',
964c17ad94SBram Moolenaar      'endfunc',
974c17ad94SBram Moolenaar      'delfunction DeleteMe1',
984c17ad94SBram Moolenaar      ], 'E1084:')
994c17ad94SBram Moolenaar  CheckScriptFailure([
1004c17ad94SBram Moolenaar      'vim9script',
1014c17ad94SBram Moolenaar      'func DeleteMe2()',
1024c17ad94SBram Moolenaar      'endfunc',
1034c17ad94SBram Moolenaar      'def DoThat()',
1044c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
1054c17ad94SBram Moolenaar      'enddef',
1064c17ad94SBram Moolenaar      'DoThat()',
1074c17ad94SBram Moolenaar      ], 'E1084:')
1084c17ad94SBram Moolenaar  CheckScriptFailure([
1094c17ad94SBram Moolenaar      'vim9script',
1104c17ad94SBram Moolenaar      'def DeleteMe3()',
1114c17ad94SBram Moolenaar      'enddef',
1124c17ad94SBram Moolenaar      'delfunction DeleteMe3',
1134c17ad94SBram Moolenaar      ], 'E1084:')
1144c17ad94SBram Moolenaar  CheckScriptFailure([
1154c17ad94SBram Moolenaar      'vim9script',
1164c17ad94SBram Moolenaar      'def DeleteMe4()',
1174c17ad94SBram Moolenaar      'enddef',
1184c17ad94SBram Moolenaar      'def DoThat()',
1194c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
1204c17ad94SBram Moolenaar      'enddef',
1214c17ad94SBram Moolenaar      'DoThat()',
1224c17ad94SBram Moolenaar      ], 'E1084:')
123925e9fd6SBram Moolenaar
124925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
125*cfcd011fSBram Moolenaar  var lines =<< trim END
126925e9fd6SBram Moolenaar      vim9script
127925e9fd6SBram Moolenaar      def g:Global(): string
128925e9fd6SBram Moolenaar        return "yes"
129925e9fd6SBram Moolenaar      enddef
130925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
131925e9fd6SBram Moolenaar      def! g:Global(): string
132925e9fd6SBram Moolenaar        return "no"
133925e9fd6SBram Moolenaar      enddef
134925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
135925e9fd6SBram Moolenaar      delfunc g:Global
136925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
137925e9fd6SBram Moolenaar  END
138925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
139925e9fd6SBram Moolenaar
140925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
141925e9fd6SBram Moolenaar  lines =<< trim END
142925e9fd6SBram Moolenaar      vim9script
143925e9fd6SBram Moolenaar      func g:Global()
144925e9fd6SBram Moolenaar        return "yes"
145925e9fd6SBram Moolenaar      endfunc
146925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
147925e9fd6SBram Moolenaar      def! g:Global(): string
148925e9fd6SBram Moolenaar        return "no"
149925e9fd6SBram Moolenaar      enddef
150925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
151925e9fd6SBram Moolenaar      delfunc g:Global
152925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
153925e9fd6SBram Moolenaar  END
154925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
155925e9fd6SBram Moolenaar
156925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
157925e9fd6SBram Moolenaar  lines =<< trim END
158925e9fd6SBram Moolenaar      vim9script
159925e9fd6SBram Moolenaar      def g:Global(): string
160925e9fd6SBram Moolenaar        return "yes"
161925e9fd6SBram Moolenaar      enddef
162925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
163925e9fd6SBram Moolenaar      func! g:Global()
164925e9fd6SBram Moolenaar        return "no"
165925e9fd6SBram Moolenaar      endfunc
166925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
167925e9fd6SBram Moolenaar      delfunc g:Global
168925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
169925e9fd6SBram Moolenaar  END
170925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1714c17ad94SBram Moolenaarenddef
1724c17ad94SBram Moolenaar
17308052228SBram Moolenaardef Test_wrong_type()
174*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
175*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
176*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
177*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
178599c89c8SBram Moolenaar
179*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
180*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
18142a480bfSBram Moolenaar
182*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
183*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
184*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
185*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
186*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
187*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
188*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
189*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
190*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
191*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
192*cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
193a0a9f43aSBram Moolenaar
194*cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
195*cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
19608052228SBram Moolenaarenddef
1978a7d6542SBram Moolenaar
19808052228SBram Moolenaardef Test_const()
199*cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
200*cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
201*cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
20230fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
20330fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
204dbeecb2bSBram Moolenaar
205*cfcd011fSBram Moolenaar  var lines =<< trim END
20630fd8204SBram Moolenaar    final list = [1, 2, 3]
207dbeecb2bSBram Moolenaar    list[0] = 4
2080b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
20930fd8204SBram Moolenaar    const other = [5, 6, 7]
2100b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
21171abe482SBram Moolenaar
212*cfcd011fSBram Moolenaar    var varlist = [7, 8]
21330fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
21471abe482SBram Moolenaar    varlist[0] = 77
21571abe482SBram Moolenaar    # TODO: does not work yet
21671abe482SBram Moolenaar    # constlist[1][1] = 88
217*cfcd011fSBram Moolenaar    var cl = constlist[1]
21871abe482SBram Moolenaar    cl[1] = 88
21971abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
22071abe482SBram Moolenaar
221*cfcd011fSBram Moolenaar    var vardict = #{five: 5, six: 6}
22230fd8204SBram Moolenaar    const constdict = #{one: 1, two: vardict, three: 3}
22371abe482SBram Moolenaar    vardict['five'] = 55
22471abe482SBram Moolenaar    # TODO: does not work yet
22571abe482SBram Moolenaar    # constdict['two']['six'] = 66
226*cfcd011fSBram Moolenaar    var cd = constdict['two']
22771abe482SBram Moolenaar    cd['six'] = 66
22871abe482SBram Moolenaar    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
229dbeecb2bSBram Moolenaar  END
230dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
23108052228SBram Moolenaarenddef
2328a7d6542SBram Moolenaar
2330b4c66c6SBram Moolenaardef Test_const_bang()
234*cfcd011fSBram Moolenaar  var lines =<< trim END
23530fd8204SBram Moolenaar      const var = 234
2360b4c66c6SBram Moolenaar      var = 99
2370b4c66c6SBram Moolenaar  END
2380b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2390b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2400b4c66c6SBram Moolenaar
2410b4c66c6SBram Moolenaar  lines =<< trim END
24230fd8204SBram Moolenaar      const ll = [2, 3, 4]
2430b4c66c6SBram Moolenaar      ll[0] = 99
2440b4c66c6SBram Moolenaar  END
2450b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2460b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2470b4c66c6SBram Moolenaar
2480b4c66c6SBram Moolenaar  lines =<< trim END
24930fd8204SBram Moolenaar      const ll = [2, 3, 4]
2500b4c66c6SBram Moolenaar      ll[3] = 99
2510b4c66c6SBram Moolenaar  END
2520b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2530b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2540b4c66c6SBram Moolenaar
2550b4c66c6SBram Moolenaar  lines =<< trim END
25630fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2570b4c66c6SBram Moolenaar      dd["one"] = 99
2580b4c66c6SBram Moolenaar  END
2590b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2600b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2610b4c66c6SBram Moolenaar
2620b4c66c6SBram Moolenaar  lines =<< trim END
26330fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2640b4c66c6SBram Moolenaar      dd["three"] = 99
2650b4c66c6SBram Moolenaar  END
2660b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2670b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2680b4c66c6SBram Moolenaarenddef
2690b4c66c6SBram Moolenaar
270df069eecSBram Moolenaardef Test_range_no_colon()
271d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
272d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
273d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
274d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
275df069eecSBram Moolenaarenddef
276df069eecSBram Moolenaar
277df069eecSBram Moolenaar
2788a7d6542SBram Moolenaardef Test_block()
279*cfcd011fSBram Moolenaar  var outer = 1
2808a7d6542SBram Moolenaar  {
281*cfcd011fSBram Moolenaar    var inner = 2
2828a7d6542SBram Moolenaar    assert_equal(1, outer)
2838a7d6542SBram Moolenaar    assert_equal(2, inner)
2848a7d6542SBram Moolenaar  }
2858a7d6542SBram Moolenaar  assert_equal(1, outer)
2868a7d6542SBram Moolenaarenddef
2878a7d6542SBram Moolenaar
28808052228SBram Moolenaardef Test_block_failure()
289*cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
29008052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
29108052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
29208052228SBram Moolenaarenddef
2938a7d6542SBram Moolenaar
294d032f34aSBram Moolenaarfunc g:NoSuchFunc()
295d032f34aSBram Moolenaar  echo 'none'
296d032f34aSBram Moolenaarendfunc
297d032f34aSBram Moolenaar
2988a7d6542SBram Moolenaardef Test_try_catch()
299*cfcd011fSBram Moolenaar  var l = []
3007a092245SBram Moolenaar  try # comment
3018a7d6542SBram Moolenaar    add(l, '1')
3028a7d6542SBram Moolenaar    throw 'wrong'
3038a7d6542SBram Moolenaar    add(l, '2')
3047a092245SBram Moolenaar  catch # comment
3058a7d6542SBram Moolenaar    add(l, v:exception)
3067a092245SBram Moolenaar  finally # comment
3078a7d6542SBram Moolenaar    add(l, '3')
3087a092245SBram Moolenaar  endtry # comment
3098a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
31068d130c6SBram Moolenaar
311e859312eSBram Moolenaar  l = []
312e859312eSBram Moolenaar  try
313e859312eSBram Moolenaar    try
314e859312eSBram Moolenaar      add(l, '1')
315e859312eSBram Moolenaar      throw 'wrong'
316e859312eSBram Moolenaar      add(l, '2')
317e859312eSBram Moolenaar    catch /right/
318e859312eSBram Moolenaar      add(l, v:exception)
319e859312eSBram Moolenaar    endtry
320e859312eSBram Moolenaar  catch /wrong/
321e859312eSBram Moolenaar    add(l, 'caught')
322373863edSBram Moolenaar  fina
323e859312eSBram Moolenaar    add(l, 'finally')
324e859312eSBram Moolenaar  endtry
325e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
326e859312eSBram Moolenaar
327*cfcd011fSBram Moolenaar  var n: number
32868d130c6SBram Moolenaar  try
32968d130c6SBram Moolenaar    n = l[3]
33068d130c6SBram Moolenaar  catch /E684:/
33168d130c6SBram Moolenaar    n = 99
33268d130c6SBram Moolenaar  endtry
33368d130c6SBram Moolenaar  assert_equal(99, n)
33468d130c6SBram Moolenaar
33568d130c6SBram Moolenaar  try
336cc673e74SBram Moolenaar    # string slice returns a string, not a number
33768d130c6SBram Moolenaar    n = g:astring[3]
3385e654230SBram Moolenaar  catch /E1012:/
33968d130c6SBram Moolenaar    n = 77
34068d130c6SBram Moolenaar  endtry
34168d130c6SBram Moolenaar  assert_equal(77, n)
34268d130c6SBram Moolenaar
34368d130c6SBram Moolenaar  try
34468d130c6SBram Moolenaar    n = l[g:astring]
3455e654230SBram Moolenaar  catch /E1012:/
34656acb094SBram Moolenaar    n = 88
34768d130c6SBram Moolenaar  endtry
34856acb094SBram Moolenaar  assert_equal(88, n)
34968d130c6SBram Moolenaar
35068d130c6SBram Moolenaar  try
35168d130c6SBram Moolenaar    n = s:does_not_exist
35268d130c6SBram Moolenaar  catch /E121:/
353f0b9f43cSBram Moolenaar    n = 111
354f0b9f43cSBram Moolenaar  endtry
355f0b9f43cSBram Moolenaar  assert_equal(111, n)
356f0b9f43cSBram Moolenaar
357f0b9f43cSBram Moolenaar  try
358f0b9f43cSBram Moolenaar    n = g:does_not_exist
359f0b9f43cSBram Moolenaar  catch /E121:/
36068d130c6SBram Moolenaar    n = 121
36168d130c6SBram Moolenaar  endtry
36268d130c6SBram Moolenaar  assert_equal(121, n)
36368d130c6SBram Moolenaar
364*cfcd011fSBram Moolenaar  var d = #{one: 1}
36568d130c6SBram Moolenaar  try
36668d130c6SBram Moolenaar    n = d[g:astring]
36768d130c6SBram Moolenaar  catch /E716:/
36868d130c6SBram Moolenaar    n = 222
36968d130c6SBram Moolenaar  endtry
37068d130c6SBram Moolenaar  assert_equal(222, n)
371f0b9f43cSBram Moolenaar
372f0b9f43cSBram Moolenaar  try
373f0b9f43cSBram Moolenaar    n = -g:astring
374f0b9f43cSBram Moolenaar  catch /E39:/
375f0b9f43cSBram Moolenaar    n = 233
376f0b9f43cSBram Moolenaar  endtry
377f0b9f43cSBram Moolenaar  assert_equal(233, n)
378f0b9f43cSBram Moolenaar
379f0b9f43cSBram Moolenaar  try
380f0b9f43cSBram Moolenaar    n = +g:astring
381f0b9f43cSBram Moolenaar  catch /E1030:/
382f0b9f43cSBram Moolenaar    n = 244
383f0b9f43cSBram Moolenaar  endtry
384f0b9f43cSBram Moolenaar  assert_equal(244, n)
385f0b9f43cSBram Moolenaar
386f0b9f43cSBram Moolenaar  try
387f0b9f43cSBram Moolenaar    n = +g:alist
388f0b9f43cSBram Moolenaar  catch /E745:/
389f0b9f43cSBram Moolenaar    n = 255
390f0b9f43cSBram Moolenaar  endtry
391f0b9f43cSBram Moolenaar  assert_equal(255, n)
392f0b9f43cSBram Moolenaar
393*cfcd011fSBram Moolenaar  var nd: dict<any>
394f0b9f43cSBram Moolenaar  try
395f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
3965e654230SBram Moolenaar  catch /E1012:/
397f0b9f43cSBram Moolenaar    n = 266
398f0b9f43cSBram Moolenaar  endtry
399f0b9f43cSBram Moolenaar  assert_equal(266, n)
400f0b9f43cSBram Moolenaar
401f0b9f43cSBram Moolenaar  try
402f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
403f0b9f43cSBram Moolenaar  catch /E1093:/
404f0b9f43cSBram Moolenaar    n = 277
405f0b9f43cSBram Moolenaar  endtry
406f0b9f43cSBram Moolenaar  assert_equal(277, n)
407f0b9f43cSBram Moolenaar
408e859312eSBram Moolenaar  try
409e859312eSBram Moolenaar    &ts = g:astring
4105e654230SBram Moolenaar  catch /E1012:/
411e859312eSBram Moolenaar    n = 288
412e859312eSBram Moolenaar  endtry
413e859312eSBram Moolenaar  assert_equal(288, n)
414e859312eSBram Moolenaar
415e859312eSBram Moolenaar  try
416e859312eSBram Moolenaar    &backspace = 'asdf'
417e859312eSBram Moolenaar  catch /E474:/
418e859312eSBram Moolenaar    n = 299
419e859312eSBram Moolenaar  endtry
420e859312eSBram Moolenaar  assert_equal(299, n)
421e859312eSBram Moolenaar
422e859312eSBram Moolenaar  l = [1]
423e859312eSBram Moolenaar  try
424e859312eSBram Moolenaar    l[3] = 3
425e859312eSBram Moolenaar  catch /E684:/
426e859312eSBram Moolenaar    n = 300
427e859312eSBram Moolenaar  endtry
428e859312eSBram Moolenaar  assert_equal(300, n)
429e859312eSBram Moolenaar
430e859312eSBram Moolenaar  try
431e859312eSBram Moolenaar    unlet g:does_not_exist
432e859312eSBram Moolenaar  catch /E108:/
433e859312eSBram Moolenaar    n = 322
434e859312eSBram Moolenaar  endtry
435e859312eSBram Moolenaar  assert_equal(322, n)
436e859312eSBram Moolenaar
437e859312eSBram Moolenaar  try
438e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
439e859312eSBram Moolenaar  catch /E721:/
440e859312eSBram Moolenaar    n = 333
441e859312eSBram Moolenaar  endtry
442e859312eSBram Moolenaar  assert_equal(333, n)
443e859312eSBram Moolenaar
444e859312eSBram Moolenaar  try
445e859312eSBram Moolenaar    l = DeletedFunc()
446e859312eSBram Moolenaar  catch /E933:/
447e859312eSBram Moolenaar    n = 344
448e859312eSBram Moolenaar  endtry
449e859312eSBram Moolenaar  assert_equal(344, n)
450d032f34aSBram Moolenaar
451d032f34aSBram Moolenaar  try
452d032f34aSBram Moolenaar    echo len(v:true)
453d032f34aSBram Moolenaar  catch /E701:/
454d032f34aSBram Moolenaar    n = 355
455d032f34aSBram Moolenaar  endtry
456d032f34aSBram Moolenaar  assert_equal(355, n)
457d032f34aSBram Moolenaar
458*cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
459d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
460d032f34aSBram Moolenaar  try
461d032f34aSBram Moolenaar    echo P()
462d032f34aSBram Moolenaar  catch /E117:/
463d032f34aSBram Moolenaar    n = 366
464d032f34aSBram Moolenaar  endtry
465d032f34aSBram Moolenaar  assert_equal(366, n)
466d032f34aSBram Moolenaar
467d032f34aSBram Moolenaar  try
468d032f34aSBram Moolenaar    echo g:NoSuchFunc()
469d032f34aSBram Moolenaar  catch /E117:/
470d032f34aSBram Moolenaar    n = 377
471d032f34aSBram Moolenaar  endtry
472d032f34aSBram Moolenaar  assert_equal(377, n)
473d032f34aSBram Moolenaar
474d032f34aSBram Moolenaar  try
475d032f34aSBram Moolenaar    echo g:alist + 4
476d032f34aSBram Moolenaar  catch /E745:/
477d032f34aSBram Moolenaar    n = 388
478d032f34aSBram Moolenaar  endtry
479d032f34aSBram Moolenaar  assert_equal(388, n)
480d032f34aSBram Moolenaar
481d032f34aSBram Moolenaar  try
482d032f34aSBram Moolenaar    echo 4 + g:alist
483d032f34aSBram Moolenaar  catch /E745:/
484d032f34aSBram Moolenaar    n = 399
485d032f34aSBram Moolenaar  endtry
486d032f34aSBram Moolenaar  assert_equal(399, n)
487d032f34aSBram Moolenaar
488d032f34aSBram Moolenaar  try
489d032f34aSBram Moolenaar    echo g:alist.member
490d032f34aSBram Moolenaar  catch /E715:/
491d032f34aSBram Moolenaar    n = 400
492d032f34aSBram Moolenaar  endtry
493d032f34aSBram Moolenaar  assert_equal(400, n)
494d032f34aSBram Moolenaar
495d032f34aSBram Moolenaar  try
496d032f34aSBram Moolenaar    echo d.member
497d032f34aSBram Moolenaar  catch /E716:/
498d032f34aSBram Moolenaar    n = 411
499d032f34aSBram Moolenaar  endtry
500d032f34aSBram Moolenaar  assert_equal(411, n)
5018a7d6542SBram Moolenaarenddef
5028a7d6542SBram Moolenaar
503e859312eSBram Moolenaardef DeletedFunc(): list<any>
504e859312eSBram Moolenaar  return ['delete me']
505e859312eSBram Moolenaarenddef
506e859312eSBram Moolenaardefcompile
507e859312eSBram Moolenaardelfunc DeletedFunc
508e859312eSBram Moolenaar
509257cc5eeSBram Moolenaardef ThrowFromDef()
510a72cfb80SBram Moolenaar  throw "getout" # comment
511257cc5eeSBram Moolenaarenddef
512257cc5eeSBram Moolenaar
513257cc5eeSBram Moolenaarfunc CatchInFunc()
514257cc5eeSBram Moolenaar  try
515257cc5eeSBram Moolenaar    call ThrowFromDef()
516257cc5eeSBram Moolenaar  catch
517257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
518257cc5eeSBram Moolenaar  endtry
519257cc5eeSBram Moolenaarendfunc
520257cc5eeSBram Moolenaar
521257cc5eeSBram Moolenaardef CatchInDef()
522257cc5eeSBram Moolenaar  try
523257cc5eeSBram Moolenaar    ThrowFromDef()
524257cc5eeSBram Moolenaar  catch
525257cc5eeSBram Moolenaar    g:thrown_def = v:exception
526257cc5eeSBram Moolenaar  endtry
527257cc5eeSBram Moolenaarenddef
528257cc5eeSBram Moolenaar
529f575adffSBram Moolenaardef ReturnFinally(): string
530f575adffSBram Moolenaar  try
531f575adffSBram Moolenaar    return 'intry'
532373863edSBram Moolenaar  finall
533f575adffSBram Moolenaar    g:in_finally = 'finally'
534f575adffSBram Moolenaar  endtry
535f575adffSBram Moolenaar  return 'end'
536f575adffSBram Moolenaarenddef
537f575adffSBram Moolenaar
538257cc5eeSBram Moolenaardef Test_try_catch_nested()
539257cc5eeSBram Moolenaar  CatchInFunc()
540257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
541257cc5eeSBram Moolenaar
542257cc5eeSBram Moolenaar  CatchInDef()
543257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
544f575adffSBram Moolenaar
545f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
546f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
547f575adffSBram Moolenaarenddef
548f575adffSBram Moolenaar
5499939f57bSBram Moolenaardef TryOne(): number
5509939f57bSBram Moolenaar  try
5519939f57bSBram Moolenaar    return 0
5529939f57bSBram Moolenaar  catch
5539939f57bSBram Moolenaar  endtry
5549939f57bSBram Moolenaar  return 0
5559939f57bSBram Moolenaarenddef
5569939f57bSBram Moolenaar
5579939f57bSBram Moolenaardef TryTwo(n: number): string
5589939f57bSBram Moolenaar  try
559*cfcd011fSBram Moolenaar    var x = {}
5609939f57bSBram Moolenaar  catch
5619939f57bSBram Moolenaar  endtry
5629939f57bSBram Moolenaar  return 'text'
5639939f57bSBram Moolenaarenddef
5649939f57bSBram Moolenaar
5659939f57bSBram Moolenaardef Test_try_catch_twice()
5669939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5679939f57bSBram Moolenaarenddef
5689939f57bSBram Moolenaar
569f575adffSBram Moolenaardef Test_try_catch_match()
570*cfcd011fSBram Moolenaar  var seq = 'a'
571f575adffSBram Moolenaar  try
572f575adffSBram Moolenaar    throw 'something'
573f575adffSBram Moolenaar  catch /nothing/
574f575adffSBram Moolenaar    seq ..= 'x'
575f575adffSBram Moolenaar  catch /some/
576f575adffSBram Moolenaar    seq ..= 'b'
577f575adffSBram Moolenaar  catch /asdf/
578f575adffSBram Moolenaar    seq ..= 'x'
579e8c4abbbSBram Moolenaar  catch ?a\?sdf?
580e8c4abbbSBram Moolenaar    seq ..= 'y'
581f575adffSBram Moolenaar  finally
582f575adffSBram Moolenaar    seq ..= 'c'
583f575adffSBram Moolenaar  endtry
584f575adffSBram Moolenaar  assert_equal('abc', seq)
585257cc5eeSBram Moolenaarenddef
586257cc5eeSBram Moolenaar
587e8c4abbbSBram Moolenaardef Test_try_catch_fails()
588d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
589d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
590d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
591d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
592d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
593d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
594d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
595d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
596d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
597d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
598585fea7bSBram Moolenaar
599d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
600d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
601e8c4abbbSBram Moolenaarenddef
602e8c4abbbSBram Moolenaar
603006ad48bSBram Moolenaardef Test_throw_vimscript()
604f5be8cdbSBram Moolenaar  # only checks line continuation
605*cfcd011fSBram Moolenaar  var lines =<< trim END
606006ad48bSBram Moolenaar      vim9script
607006ad48bSBram Moolenaar      try
608006ad48bSBram Moolenaar        throw 'one'
609006ad48bSBram Moolenaar              .. 'two'
610006ad48bSBram Moolenaar      catch
611006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
612006ad48bSBram Moolenaar      endtry
613006ad48bSBram Moolenaar  END
614006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
615006ad48bSBram Moolenaarenddef
616006ad48bSBram Moolenaar
617ed677f55SBram Moolenaardef Test_error_in_nested_function()
618ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
619*cfcd011fSBram Moolenaar  var lines =<< trim END
620ed677f55SBram Moolenaar      vim9script
621ed677f55SBram Moolenaar      def Func()
622ed677f55SBram Moolenaar        Error()
623ed677f55SBram Moolenaar        g:test_var = 1
624ed677f55SBram Moolenaar      enddef
625ed677f55SBram Moolenaar      func Error() abort
626ed677f55SBram Moolenaar        eval [][0]
627ed677f55SBram Moolenaar      endfunc
628ed677f55SBram Moolenaar      Func()
629ed677f55SBram Moolenaar  END
630ed677f55SBram Moolenaar  g:test_var = 0
631ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
632ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
633ed677f55SBram Moolenaarenddef
634ed677f55SBram Moolenaar
63537c83711SBram Moolenaardef Test_cexpr_vimscript()
636f5be8cdbSBram Moolenaar  # only checks line continuation
63737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
638*cfcd011fSBram Moolenaar  var lines =<< trim END
63937c83711SBram Moolenaar      vim9script
64037c83711SBram Moolenaar      cexpr 'File'
64137c83711SBram Moolenaar                .. ' someFile' ..
64237c83711SBram Moolenaar                   ' line 19'
64337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
64437c83711SBram Moolenaar  END
64537c83711SBram Moolenaar  CheckScriptSuccess(lines)
64637c83711SBram Moolenaar  set errorformat&
64737c83711SBram Moolenaarenddef
64837c83711SBram Moolenaar
649c9edd6b5SBram Moolenaardef Test_statusline_syntax()
650c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
651*cfcd011fSBram Moolenaar  var lines =<< trim END
652c9edd6b5SBram Moolenaar      vim9script
653c9edd6b5SBram Moolenaar      func g:Status()
654c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
655c9edd6b5SBram Moolenaar      endfunc
656c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
657c9edd6b5SBram Moolenaar      redrawstatus
658c9edd6b5SBram Moolenaar      set laststatus statusline=
659c9edd6b5SBram Moolenaar  END
660c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
661c9edd6b5SBram Moolenaarenddef
662c9edd6b5SBram Moolenaar
663b209750bSBram Moolenaardef Test_list_vimscript()
664b209750bSBram Moolenaar  # checks line continuation and comments
665*cfcd011fSBram Moolenaar  var lines =<< trim END
666b209750bSBram Moolenaar      vim9script
667*cfcd011fSBram Moolenaar      var mylist = [
668b209750bSBram Moolenaar            'one',
669b209750bSBram Moolenaar            # comment
670b209750bSBram Moolenaar            'two', # empty line follows
671b209750bSBram Moolenaar
672b209750bSBram Moolenaar            'three',
673b209750bSBram Moolenaar            ]
674b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
675b209750bSBram Moolenaar  END
676b209750bSBram Moolenaar  CheckScriptSuccess(lines)
67766250c93SBram Moolenaar
67866250c93SBram Moolenaar  # check all lines from heredoc are kept
67966250c93SBram Moolenaar  lines =<< trim END
68066250c93SBram Moolenaar      # comment 1
68166250c93SBram Moolenaar      two
68266250c93SBram Moolenaar      # comment 3
68366250c93SBram Moolenaar
68466250c93SBram Moolenaar      five
68566250c93SBram Moolenaar      # comment 6
68666250c93SBram Moolenaar  END
68766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
688b209750bSBram Moolenaarenddef
689b209750bSBram Moolenaar
6902a1381c3SBram Moolenaarif has('channel')
69140ee466cSBram Moolenaar  let someJob = test_null_job()
69240ee466cSBram Moolenaar
69340ee466cSBram Moolenaar  def FuncWithError()
69440ee466cSBram Moolenaar    echomsg g:someJob
69540ee466cSBram Moolenaar  enddef
69640ee466cSBram Moolenaar
69740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
69840ee466cSBram Moolenaar    try
69940ee466cSBram Moolenaar      call FuncWithError()
70040ee466cSBram Moolenaar    catch
70140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
70240ee466cSBram Moolenaar    endtry
70340ee466cSBram Moolenaar  endfunc
7042a1381c3SBram Moolenaarendif
70540ee466cSBram Moolenaar
7068a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7078a7d6542SBram Moolenaar  vim9script
708*cfcd011fSBram Moolenaar  var name: string = 'bob'
7098a7d6542SBram Moolenaar  def Concat(arg: string): string
7108a7d6542SBram Moolenaar    return name .. arg
7118a7d6542SBram Moolenaar  enddef
712227a69deSBram Moolenaar  g:result = Concat('bie')
713227a69deSBram Moolenaar  g:localname = name
7148a7d6542SBram Moolenaar
7158a7d6542SBram Moolenaar  export const CONST = 1234
716*cfcd011fSBram Moolenaar  export var exported = 9876
717*cfcd011fSBram Moolenaar  export var exp_name = 'John'
7188a7d6542SBram Moolenaar  export def Exported(): string
7198a7d6542SBram Moolenaar    return 'Exported'
7208a7d6542SBram Moolenaar  enddef
7218a7d6542SBram MoolenaarEND
7228a7d6542SBram Moolenaar
723b3ca9824SBram Moolenaardef Undo_export_script_lines()
724b3ca9824SBram Moolenaar  unlet g:result
725b3ca9824SBram Moolenaar  unlet g:localname
726b3ca9824SBram Moolenaarenddef
727b3ca9824SBram Moolenaar
7285269bd2aSBram Moolenaardef Test_vim9_import_export()
729*cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7308a7d6542SBram Moolenaar    vim9script
7318a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7328a7d6542SBram Moolenaar    g:imported = exported
7336e587dcbSBram Moolenaar    exported += 3
7346e587dcbSBram Moolenaar    g:imported_added = exported
7358a7d6542SBram Moolenaar    g:imported_func = Exported()
7366e587dcbSBram Moolenaar
73740f4f7a4SBram Moolenaar    def GetExported(): string
738*cfcd011fSBram Moolenaar      var local_dict = #{ref: Exported}
73940f4f7a4SBram Moolenaar      return local_dict.ref()
74040f4f7a4SBram Moolenaar    enddef
74140f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
74240f4f7a4SBram Moolenaar
7436e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7446e587dcbSBram Moolenaar    g:imported_name = exp_name
7456e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7466e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7475381c7a1SBram Moolenaar    g:imported_later = exported
7488a7d6542SBram Moolenaar  END
7498a7d6542SBram Moolenaar
7508a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7528a7d6542SBram Moolenaar
7538a7d6542SBram Moolenaar  source Ximport.vim
7548a7d6542SBram Moolenaar
7558a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7568a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7578a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7586e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7595381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
7608a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
76140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
7626e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
7636e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
7648a7d6542SBram Moolenaar  assert_false(exists('g:name'))
7658a7d6542SBram Moolenaar
766b3ca9824SBram Moolenaar  Undo_export_script_lines()
7678a7d6542SBram Moolenaar  unlet g:imported
7686e587dcbSBram Moolenaar  unlet g:imported_added
7695381c7a1SBram Moolenaar  unlet g:imported_later
7708a7d6542SBram Moolenaar  unlet g:imported_func
7716e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
7728a7d6542SBram Moolenaar  delete('Ximport.vim')
773f2d5c240SBram Moolenaar
7741c991144SBram Moolenaar  # similar, with line breaks
775*cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
7761c991144SBram Moolenaar    vim9script
7771c991144SBram Moolenaar    import {
7781c991144SBram Moolenaar        exported,
7791c991144SBram Moolenaar        Exported,
7801c991144SBram Moolenaar        }
7811c991144SBram Moolenaar        from
7821c991144SBram Moolenaar        './Xexport.vim'
7831c991144SBram Moolenaar    g:imported = exported
7841c991144SBram Moolenaar    exported += 5
7851c991144SBram Moolenaar    g:imported_added = exported
7861c991144SBram Moolenaar    g:imported_func = Exported()
7871c991144SBram Moolenaar  END
7881c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
7891c991144SBram Moolenaar  source Ximport_lbr.vim
7901c991144SBram Moolenaar
7911c991144SBram Moolenaar  assert_equal(9876, g:imported)
7921c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
7931c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
7941c991144SBram Moolenaar
7951c991144SBram Moolenaar  # exported script not sourced again
7961c991144SBram Moolenaar  assert_false(exists('g:result'))
7971c991144SBram Moolenaar  unlet g:imported
7981c991144SBram Moolenaar  unlet g:imported_added
7991c991144SBram Moolenaar  unlet g:imported_func
8001c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8011c991144SBram Moolenaar
8021c991144SBram Moolenaar  # import inside :def function
803*cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8045381c7a1SBram Moolenaar    vim9script
8055381c7a1SBram Moolenaar    def ImportInDef()
8065381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8075381c7a1SBram Moolenaar      g:imported = exported
8085381c7a1SBram Moolenaar      exported += 7
8095381c7a1SBram Moolenaar      g:imported_added = exported
8105381c7a1SBram Moolenaar    enddef
8115381c7a1SBram Moolenaar    ImportInDef()
8125381c7a1SBram Moolenaar  END
8135381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8145381c7a1SBram Moolenaar  source Ximport2.vim
815f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8165381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8175381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8185381c7a1SBram Moolenaar  unlet g:imported
8195381c7a1SBram Moolenaar  unlet g:imported_added
8205381c7a1SBram Moolenaar  delete('Ximport2.vim')
8215381c7a1SBram Moolenaar
822*cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
823f2d5c240SBram Moolenaar    vim9script
824f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
825f2d5c240SBram Moolenaar    def UseExport()
826f2d5c240SBram Moolenaar      g:imported = Export.exported
827f2d5c240SBram Moolenaar    enddef
828f2d5c240SBram Moolenaar    UseExport()
829f2d5c240SBram Moolenaar  END
830f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
831f2d5c240SBram Moolenaar  source Ximport.vim
8325381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
833f2d5c240SBram Moolenaar
834*cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
835599c89c8SBram Moolenaar    vim9script
836599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
837599c89c8SBram Moolenaar    def Func()
838*cfcd011fSBram Moolenaar      var dummy = 1
839*cfcd011fSBram Moolenaar      var imported = Export + dummy
840599c89c8SBram Moolenaar    enddef
841822ba247SBram Moolenaar    defcompile
842599c89c8SBram Moolenaar  END
843599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
84444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
845599c89c8SBram Moolenaar
846*cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
847599c89c8SBram Moolenaar    vim9script
848599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
849599c89c8SBram Moolenaar    def Func()
850*cfcd011fSBram Moolenaar      var imported = Export . exported
851599c89c8SBram Moolenaar    enddef
852822ba247SBram Moolenaar    defcompile
853599c89c8SBram Moolenaar  END
854599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
85544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
856599c89c8SBram Moolenaar
857*cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
858599c89c8SBram Moolenaar    vim9script
859599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
860599c89c8SBram Moolenaar    def Func()
861*cfcd011fSBram Moolenaar      var imported = Export.
862599c89c8SBram Moolenaar    enddef
863822ba247SBram Moolenaar    defcompile
864599c89c8SBram Moolenaar  END
865599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
86644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
867599c89c8SBram Moolenaar
868*cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
8691c991144SBram Moolenaar    vim9script
8701c991144SBram Moolenaar    import *
8711c991144SBram Moolenaar        as Export
8721c991144SBram Moolenaar        from
8731c991144SBram Moolenaar        './Xexport.vim'
8741c991144SBram Moolenaar    def UseExport()
8751c991144SBram Moolenaar      g:imported = Export.exported
8761c991144SBram Moolenaar    enddef
8771c991144SBram Moolenaar    UseExport()
8781c991144SBram Moolenaar  END
8791c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
8801c991144SBram Moolenaar  source Ximport.vim
8811c991144SBram Moolenaar  assert_equal(9883, g:imported)
8821c991144SBram Moolenaar
883*cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
884f2d5c240SBram Moolenaar    vim9script
885f2d5c240SBram Moolenaar    import * from './Xexport.vim'
886f2d5c240SBram Moolenaar  END
887f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
88844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
889f2d5c240SBram Moolenaar
890f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
891*cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
892fa29c8abSBram Moolenaar    vim9script
893fa29c8abSBram Moolenaar    import name from './Xexport.vim'
894fa29c8abSBram Moolenaar  END
895fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
89644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
897fa29c8abSBram Moolenaar
898f5be8cdbSBram Moolenaar  # try to import something that is already defined
899*cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9005269bd2aSBram Moolenaar    vim9script
901*cfcd011fSBram Moolenaar    var exported = 'something'
9025269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9035269bd2aSBram Moolenaar  END
9045269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
90544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9065269bd2aSBram Moolenaar
907f5be8cdbSBram Moolenaar  # try to import something that is already defined
9085269bd2aSBram Moolenaar  import_already_defined =<< trim END
9095269bd2aSBram Moolenaar    vim9script
910*cfcd011fSBram Moolenaar    var exported = 'something'
9115269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9125269bd2aSBram Moolenaar  END
9135269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
91444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9155269bd2aSBram Moolenaar
916f5be8cdbSBram Moolenaar  # try to import something that is already defined
9175269bd2aSBram Moolenaar  import_already_defined =<< trim END
9185269bd2aSBram Moolenaar    vim9script
919*cfcd011fSBram Moolenaar    var exported = 'something'
9205269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9215269bd2aSBram Moolenaar  END
9225269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
92344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9245269bd2aSBram Moolenaar
925f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
926*cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
927fa29c8abSBram Moolenaar    vim9script
928fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
929fa29c8abSBram Moolenaar  END
930fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
93144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
932fa29c8abSBram Moolenaar
933*cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
934fa29c8abSBram Moolenaar    vim9script
935fa29c8abSBram Moolenaar    import name './Xexport.vim'
936fa29c8abSBram Moolenaar  END
937fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
93844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
939fa29c8abSBram Moolenaar
940*cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
941fa29c8abSBram Moolenaar    vim9script
942fa29c8abSBram Moolenaar    import name from Xexport.vim
943fa29c8abSBram Moolenaar  END
944fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
94544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
946fa29c8abSBram Moolenaar
947*cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
948fa29c8abSBram Moolenaar    vim9script
949fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
950fa29c8abSBram Moolenaar  END
951fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
95244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
953fa29c8abSBram Moolenaar
954*cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
955fa29c8abSBram Moolenaar    vim9script
956fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
957fa29c8abSBram Moolenaar  END
9585269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
95944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
960fa29c8abSBram Moolenaar
961f2d5c240SBram Moolenaar  delete('Ximport.vim')
9625269bd2aSBram Moolenaar  delete('Ximport3.vim')
9638a7d6542SBram Moolenaar  delete('Xexport.vim')
9648a7d6542SBram Moolenaar
965f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
966750802b5SBram Moolenaar  set cpo&vi
967*cfcd011fSBram Moolenaar  var cpo_before = &cpo
968*cfcd011fSBram Moolenaar  var lines =<< trim END
969750802b5SBram Moolenaar    vim9script
970750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
971750802b5SBram Moolenaar  END
972750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
973750802b5SBram Moolenaar  source Xvim9_script
974750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
975750802b5SBram Moolenaar  set cpo&vim
976750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
977750802b5SBram Moolenaar  delete('Xvim9_script')
978750802b5SBram Moolenaarenddef
979750802b5SBram Moolenaar
980803af686SBram Moolenaarfunc g:Trigger()
981803af686SBram Moolenaar  source Ximport.vim
982803af686SBram Moolenaar  return "echo 'yes'\<CR>"
983803af686SBram Moolenaarendfunc
984803af686SBram Moolenaar
985803af686SBram Moolenaardef Test_import_export_expr_map()
986803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
987*cfcd011fSBram Moolenaar  var export_lines =<< trim END
988803af686SBram Moolenaar    vim9script
989803af686SBram Moolenaar    export def That(): string
990803af686SBram Moolenaar      return 'yes'
991803af686SBram Moolenaar    enddef
992803af686SBram Moolenaar  END
993803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
994803af686SBram Moolenaar
995*cfcd011fSBram Moolenaar  var import_lines =<< trim END
996803af686SBram Moolenaar    vim9script
997803af686SBram Moolenaar    import That from './Xexport_that.vim'
998803af686SBram Moolenaar    assert_equal('yes', That())
999803af686SBram Moolenaar  END
1000803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1001803af686SBram Moolenaar
1002803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1003803af686SBram Moolenaar  feedkeys('trigger', "xt")
1004803af686SBram Moolenaar
1005730b2483SBram Moolenaar  delete('Xexport_that.vim')
1006803af686SBram Moolenaar  delete('Ximport.vim')
1007803af686SBram Moolenaar  nunmap trigger
1008803af686SBram Moolenaarenddef
1009803af686SBram Moolenaar
10108e1986e3SBram Moolenaardef Test_import_in_filetype()
10118e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10128e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1013*cfcd011fSBram Moolenaar  var export_lines =<< trim END
10148e1986e3SBram Moolenaar    vim9script
1015*cfcd011fSBram Moolenaar    export var That = 'yes'
10168e1986e3SBram Moolenaar  END
1017730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10188e1986e3SBram Moolenaar
1019*cfcd011fSBram Moolenaar  var import_lines =<< trim END
10208e1986e3SBram Moolenaar    vim9script
1021730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10228e1986e3SBram Moolenaar    assert_equal('yes', That)
10238e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10248e1986e3SBram Moolenaar  END
10258e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10268e1986e3SBram Moolenaar
1027*cfcd011fSBram Moolenaar  var save_rtp = &rtp
10288e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10298e1986e3SBram Moolenaar
10308e1986e3SBram Moolenaar  filetype plugin on
10318e1986e3SBram Moolenaar  copen
10328e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10338e1986e3SBram Moolenaar
10348e1986e3SBram Moolenaar  quit!
1035730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10368e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10378e1986e3SBram Moolenaar  &rtp = save_rtp
10388e1986e3SBram Moolenaarenddef
10398e1986e3SBram Moolenaar
1040efa94447SBram Moolenaardef Test_use_import_in_mapping()
1041*cfcd011fSBram Moolenaar  var lines =<< trim END
1042efa94447SBram Moolenaar      vim9script
1043efa94447SBram Moolenaar      export def Funcx()
1044efa94447SBram Moolenaar        g:result = 42
1045efa94447SBram Moolenaar      enddef
1046efa94447SBram Moolenaar  END
1047efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1048efa94447SBram Moolenaar  lines =<< trim END
1049efa94447SBram Moolenaar      vim9script
1050efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1051b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1052efa94447SBram Moolenaar  END
1053efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1054efa94447SBram Moolenaar
1055efa94447SBram Moolenaar  source Xmapscript.vim
1056b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1057efa94447SBram Moolenaar  assert_equal(42, g:result)
1058efa94447SBram Moolenaar
1059efa94447SBram Moolenaar  unlet g:result
1060efa94447SBram Moolenaar  delete('XsomeExport.vim')
1061efa94447SBram Moolenaar  delete('Xmapscript.vim')
1062b3ca9824SBram Moolenaar  nunmap <F3>
1063efa94447SBram Moolenaarenddef
1064efa94447SBram Moolenaar
1065750802b5SBram Moolenaardef Test_vim9script_fails()
10668a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
10678a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1068*cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
10699721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1070*cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1071750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1072750802b5SBram Moolenaar
1073*cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1074c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1075c785b9a7SBram Moolenaar
1076e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1077e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
10788a7d6542SBram Moolenaarenddef
10798a7d6542SBram Moolenaar
1080f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1081101f4810SBram Moolenaar  CheckRunVimInTerminal
1082101f4810SBram Moolenaar
10839bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1084c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
10859bb3eb3eSBram Moolenaarendfunc
10869bb3eb3eSBram Moolenaar
1087c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1088*cfcd011fSBram Moolenaar  var export =<< trim END
1089101f4810SBram Moolenaar    vim9script
1090101f4810SBram Moolenaar    export def Foo(): number
1091101f4810SBram Moolenaar        return 0
1092101f4810SBram Moolenaar    enddef
1093101f4810SBram Moolenaar  END
1094730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1095101f4810SBram Moolenaar
1096*cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
10979bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
10989bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1099101f4810SBram Moolenaar
1100730b2483SBram Moolenaar  delete('XexportCmd.vim')
11019bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11029bb3eb3eSBram Moolenaarenddef
1103101f4810SBram Moolenaar
11044c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1105*cfcd011fSBram Moolenaar  var lines =<< trim END
11068a7d6542SBram Moolenaar    vim9script
11078a7d6542SBram Moolenaar    const var = ''
1108*cfcd011fSBram Moolenaar    var valone = 1234
11098a7d6542SBram Moolenaar    def MyFunc(arg: string)
11108a7d6542SBram Moolenaar       valone = 5678
11118a7d6542SBram Moolenaar    enddef
11128a7d6542SBram Moolenaar  END
1113*cfcd011fSBram Moolenaar  var morelines =<< trim END
1114*cfcd011fSBram Moolenaar    var valtwo = 222
11158a7d6542SBram Moolenaar    export def GetValtwo(): number
11168a7d6542SBram Moolenaar      return valtwo
11178a7d6542SBram Moolenaar    enddef
11188a7d6542SBram Moolenaar  END
111903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11208a7d6542SBram Moolenaar  source Xreload.vim
11218a7d6542SBram Moolenaar  source Xreload.vim
11228a7d6542SBram Moolenaar  source Xreload.vim
11238a7d6542SBram Moolenaar
1124*cfcd011fSBram Moolenaar  var testlines =<< trim END
11258a7d6542SBram Moolenaar    vim9script
11268a7d6542SBram Moolenaar    def TheFunc()
11278a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11288a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11298a7d6542SBram Moolenaar    enddef
11308a7d6542SBram Moolenaar    TheFunc()
11318a7d6542SBram Moolenaar  END
11328a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11338a7d6542SBram Moolenaar  source Ximport.vim
11348a7d6542SBram Moolenaar
1135f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1136f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11378a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11388a7d6542SBram Moolenaar  source Ximport.vim
11398a7d6542SBram Moolenaar
1140f5be8cdbSBram Moolenaar  # cannot declare a var twice
11418a7d6542SBram Moolenaar  lines =<< trim END
11428a7d6542SBram Moolenaar    vim9script
1143*cfcd011fSBram Moolenaar    var valone = 1234
1144*cfcd011fSBram Moolenaar    var valone = 5678
11458a7d6542SBram Moolenaar  END
11468a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
114744d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
11488a7d6542SBram Moolenaar
11498a7d6542SBram Moolenaar  delete('Xreload.vim')
11508a7d6542SBram Moolenaar  delete('Ximport.vim')
11518a7d6542SBram Moolenaarenddef
11528a7d6542SBram Moolenaar
115395006e3dSBram Moolenaardef s:RetSome(): string
115495006e3dSBram Moolenaar  return 'some'
115595006e3dSBram Moolenaarenddef
115695006e3dSBram Moolenaar
1157fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1158fe465a01SBram Moolenaar" script-local name.
1159fe465a01SBram Moolenaardef Test_vim9script_funcref()
1160*cfcd011fSBram Moolenaar  var sortlines =<< trim END
1161fe465a01SBram Moolenaar      vim9script
1162fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1163bed36b93SBram Moolenaar        return i2 - i1
1164fe465a01SBram Moolenaar      enddef
1165fe465a01SBram Moolenaar
1166fe465a01SBram Moolenaar      export def FastSort(): list<number>
1167fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1168fe465a01SBram Moolenaar      enddef
1169fe465a01SBram Moolenaar  END
1170fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1171fe465a01SBram Moolenaar
1172*cfcd011fSBram Moolenaar  var lines =<< trim END
1173fe465a01SBram Moolenaar    vim9script
1174fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1175fe465a01SBram Moolenaar    def Test()
1176fe465a01SBram Moolenaar      g:result = FastSort()
1177fe465a01SBram Moolenaar    enddef
1178fe465a01SBram Moolenaar    Test()
1179fe465a01SBram Moolenaar  END
1180fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1181fe465a01SBram Moolenaar
1182fe465a01SBram Moolenaar  source Xscript.vim
1183fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1184fe465a01SBram Moolenaar
1185fe465a01SBram Moolenaar  unlet g:result
1186fe465a01SBram Moolenaar  delete('Xsort.vim')
1187fe465a01SBram Moolenaar  delete('Xscript.vim')
118895006e3dSBram Moolenaar
1189*cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
119095006e3dSBram Moolenaar  assert_equal('some', Funcref())
1191fe465a01SBram Moolenaarenddef
1192fe465a01SBram Moolenaar
1193601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1194601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1195601e76acSBram Moolenaar" function reference.
1196c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1197*cfcd011fSBram Moolenaar  var filterLines =<< trim END
1198c620c055SBram Moolenaar    vim9script
1199c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1200c620c055SBram Moolenaar      return idx % 2 == 1
1201c620c055SBram Moolenaar    enddef
1202c620c055SBram Moolenaar    export def FastFilter(): list<number>
1203c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1204c620c055SBram Moolenaar    enddef
1205601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1206601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1207601e76acSBram Moolenaar    enddef
1208c620c055SBram Moolenaar  END
1209c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1210c620c055SBram Moolenaar
1211*cfcd011fSBram Moolenaar  var lines =<< trim END
1212c620c055SBram Moolenaar    vim9script
1213601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1214c620c055SBram Moolenaar    def Test()
1215*cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1216c620c055SBram Moolenaar    enddef
1217c620c055SBram Moolenaar    Test()
1218601e76acSBram Moolenaar    def TestDirect()
1219*cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1220601e76acSBram Moolenaar    enddef
1221601e76acSBram Moolenaar    TestDirect()
1222c620c055SBram Moolenaar  END
1223601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1224c620c055SBram Moolenaar  delete('Xfilter.vim')
1225c620c055SBram Moolenaarenddef
1226c620c055SBram Moolenaar
12274c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1228*cfcd011fSBram Moolenaar  var first_lines =<< trim END
12294c17ad94SBram Moolenaar    vim9script
12304c17ad94SBram Moolenaar    def FuncYes(): string
12314c17ad94SBram Moolenaar      return 'yes'
12324c17ad94SBram Moolenaar    enddef
12334c17ad94SBram Moolenaar  END
1234*cfcd011fSBram Moolenaar  var withno_lines =<< trim END
12354c17ad94SBram Moolenaar    def FuncNo(): string
12364c17ad94SBram Moolenaar      return 'no'
12374c17ad94SBram Moolenaar    enddef
12384c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12394c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12404c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
124103afdcf1SBram Moolenaar    enddef
124203afdcf1SBram Moolenaar  END
1243*cfcd011fSBram Moolenaar  var nono_lines =<< trim END
124403afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
124503afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
124644d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12474c17ad94SBram Moolenaar    enddef
12484c17ad94SBram Moolenaar  END
12494c17ad94SBram Moolenaar
12504c17ad94SBram Moolenaar  # FuncNo() is defined
125103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12524c17ad94SBram Moolenaar  source Xreloaded.vim
12534c17ad94SBram Moolenaar  g:DoCheck(true)
12544c17ad94SBram Moolenaar
12554c17ad94SBram Moolenaar  # FuncNo() is not redefined
125603afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12574c17ad94SBram Moolenaar  source Xreloaded.vim
125803afdcf1SBram Moolenaar  g:DoCheck()
12594c17ad94SBram Moolenaar
12604c17ad94SBram Moolenaar  # FuncNo() is back
126103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12624c17ad94SBram Moolenaar  source Xreloaded.vim
126303afdcf1SBram Moolenaar  g:DoCheck()
12644c17ad94SBram Moolenaar
12654c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12664c17ad94SBram Moolenaarenddef
12674c17ad94SBram Moolenaar
126889483d40SBram Moolenaardef Test_vim9script_reload_delvar()
126989483d40SBram Moolenaar  # write the script with a script-local variable
1270*cfcd011fSBram Moolenaar  var lines =<< trim END
127189483d40SBram Moolenaar    vim9script
1272*cfcd011fSBram Moolenaar    var name = 'string'
127389483d40SBram Moolenaar  END
127489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
127589483d40SBram Moolenaar  source XreloadVar.vim
127689483d40SBram Moolenaar
127789483d40SBram Moolenaar  # now write the script using the same variable locally - works
127889483d40SBram Moolenaar  lines =<< trim END
127989483d40SBram Moolenaar    vim9script
128089483d40SBram Moolenaar    def Func()
1281*cfcd011fSBram Moolenaar      var name = 'string'
128289483d40SBram Moolenaar    enddef
128389483d40SBram Moolenaar  END
128489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
128589483d40SBram Moolenaar  source XreloadVar.vim
128689483d40SBram Moolenaar
128789483d40SBram Moolenaar  delete('XreloadVar.vim')
128889483d40SBram Moolenaarenddef
128989483d40SBram Moolenaar
12908a7d6542SBram Moolenaardef Test_import_absolute()
1291*cfcd011fSBram Moolenaar  var import_lines = [
1292e6085c53SBram Moolenaar        'vim9script',
1293e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1294e6085c53SBram Moolenaar        'def UseExported()',
1295e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1296e6085c53SBram Moolenaar        '  exported = 8888',
1297e6085c53SBram Moolenaar        '  g:imported_after = exported',
1298e6085c53SBram Moolenaar        'enddef',
1299e6085c53SBram Moolenaar        'UseExported()',
1300e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1301e6085c53SBram Moolenaar        ]
13028a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13038a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13048a7d6542SBram Moolenaar
13058a7d6542SBram Moolenaar  source Ximport_abs.vim
13068a7d6542SBram Moolenaar
13078a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13084e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1309675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1310675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1311675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1312675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1313675f716eSBram Moolenaar          'exported = 8888.*' ..
1314675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1315675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1316675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1317675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1318e6085c53SBram Moolenaar        g:import_disassembled)
1319b3ca9824SBram Moolenaar
1320b3ca9824SBram Moolenaar  Undo_export_script_lines()
13218a7d6542SBram Moolenaar  unlet g:imported_abs
13224e12a5dfSBram Moolenaar  unlet g:import_disassembled
13238a7d6542SBram Moolenaar
13248a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13258a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13268a7d6542SBram Moolenaarenddef
13278a7d6542SBram Moolenaar
13288a7d6542SBram Moolenaardef Test_import_rtp()
1329*cfcd011fSBram Moolenaar  var import_lines = [
1330e6085c53SBram Moolenaar        'vim9script',
1331e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1332e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1333e6085c53SBram Moolenaar        ]
13348a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13358a7d6542SBram Moolenaar  mkdir('import')
13368a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13378a7d6542SBram Moolenaar
1338*cfcd011fSBram Moolenaar  var save_rtp = &rtp
13398a7d6542SBram Moolenaar  &rtp = getcwd()
13408a7d6542SBram Moolenaar  source Ximport_rtp.vim
13418a7d6542SBram Moolenaar  &rtp = save_rtp
13428a7d6542SBram Moolenaar
13438a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13448a7d6542SBram Moolenaar
1345b3ca9824SBram Moolenaar  Undo_export_script_lines()
1346b3ca9824SBram Moolenaar  unlet g:imported_rtp
13478a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
134889483d40SBram Moolenaar  delete('import', 'rf')
13498a7d6542SBram Moolenaarenddef
13508a7d6542SBram Moolenaar
135125e0f586SBram Moolenaardef Test_import_compile_error()
1352*cfcd011fSBram Moolenaar  var export_lines = [
135325e0f586SBram Moolenaar        'vim9script',
135425e0f586SBram Moolenaar        'export def ExpFunc(): string',
135525e0f586SBram Moolenaar        '  return notDefined',
135625e0f586SBram Moolenaar        'enddef',
135725e0f586SBram Moolenaar        ]
135825e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
135925e0f586SBram Moolenaar
1360*cfcd011fSBram Moolenaar  var import_lines = [
136125e0f586SBram Moolenaar        'vim9script',
136225e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
136325e0f586SBram Moolenaar        'def ImpFunc()',
136425e0f586SBram Moolenaar        '  echo ExpFunc()',
136525e0f586SBram Moolenaar        'enddef',
136625e0f586SBram Moolenaar        'defcompile',
136725e0f586SBram Moolenaar        ]
136825e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
136925e0f586SBram Moolenaar
137025e0f586SBram Moolenaar  try
137125e0f586SBram Moolenaar    source Ximport.vim
137225e0f586SBram Moolenaar  catch /E1001/
1373f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
13747707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
137525e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
137625e0f586SBram Moolenaar  endtry
137725e0f586SBram Moolenaar
137825e0f586SBram Moolenaar  delete('Xexported.vim')
137925e0f586SBram Moolenaar  delete('Ximport.vim')
138025e0f586SBram Moolenaarenddef
138125e0f586SBram Moolenaar
1382c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1383*cfcd011fSBram Moolenaar  var lines = [
1384c4ce36d4SBram Moolenaar        'vim9script',
1385c4ce36d4SBram Moolenaar        'def Func()',
1386c4ce36d4SBram Moolenaar        '  eval [][0]',
1387c4ce36d4SBram Moolenaar        'enddef',
1388c4ce36d4SBram Moolenaar        'Func()',
1389c4ce36d4SBram Moolenaar        ]
1390c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1391c4ce36d4SBram Moolenaar
1392c4ce36d4SBram Moolenaar  for count in range(3)
1393c4ce36d4SBram Moolenaar    try
1394c4ce36d4SBram Moolenaar      source Xtestscript.vim
1395c4ce36d4SBram Moolenaar    catch /E684/
1396c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1397c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1398c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1399c4ce36d4SBram Moolenaar    endtry
1400c4ce36d4SBram Moolenaar  endfor
1401c4ce36d4SBram Moolenaar
1402c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1403c4ce36d4SBram Moolenaarenddef
1404c4ce36d4SBram Moolenaar
1405eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1406*cfcd011fSBram Moolenaar  var export_lines =<< trim END
1407eef2102eSBram Moolenaar      vim9script
1408eef2102eSBram Moolenaar      export def Func()
1409eef2102eSBram Moolenaar        echo 'imported'
1410eef2102eSBram Moolenaar      enddef
1411eef2102eSBram Moolenaar  END
1412eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1413eef2102eSBram Moolenaar
1414*cfcd011fSBram Moolenaar  var lines =<< trim END
1415eef2102eSBram Moolenaar    vim9script
1416eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1417eef2102eSBram Moolenaar    def Func()
1418eef2102eSBram Moolenaar      echo 'local to function'
1419eef2102eSBram Moolenaar    enddef
1420eef2102eSBram Moolenaar  END
1421eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1422eef2102eSBram Moolenaar
1423eef2102eSBram Moolenaar  lines =<< trim END
1424eef2102eSBram Moolenaar    vim9script
1425eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1426eef2102eSBram Moolenaar    def Outer()
1427eef2102eSBram Moolenaar      def Func()
1428eef2102eSBram Moolenaar        echo 'local to function'
1429eef2102eSBram Moolenaar      enddef
1430eef2102eSBram Moolenaar    enddef
1431eef2102eSBram Moolenaar    defcompile
1432eef2102eSBram Moolenaar  END
1433eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1434eef2102eSBram Moolenaar
1435eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1436eef2102eSBram Moolenaarenddef
1437eef2102eSBram Moolenaar
1438b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1439*cfcd011fSBram Moolenaar  var lines =<< trim END
1440b9a2cac3SBram Moolenaar    vim9script
1441b9a2cac3SBram Moolenaar    def Func()
1442b9a2cac3SBram Moolenaar      echo 'one'
1443b9a2cac3SBram Moolenaar    enddef
1444b9a2cac3SBram Moolenaar    def Func()
1445b9a2cac3SBram Moolenaar      echo 'two'
1446b9a2cac3SBram Moolenaar    enddef
1447b9a2cac3SBram Moolenaar  END
1448b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1449fa211f3cSBram Moolenaar
1450fa211f3cSBram Moolenaar  lines =<< trim END
1451fa211f3cSBram Moolenaar    vim9script
1452fa211f3cSBram Moolenaar    def Foo(): string
1453fa211f3cSBram Moolenaar      return 'foo'
1454fa211f3cSBram Moolenaar      enddef
1455fa211f3cSBram Moolenaar    def Func()
1456*cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1457fa211f3cSBram Moolenaar    enddef
1458fa211f3cSBram Moolenaar    defcompile
1459fa211f3cSBram Moolenaar  END
1460fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1461b9a2cac3SBram Moolenaarenddef
1462b9a2cac3SBram Moolenaar
14638a7d6542SBram Moolenaardef Test_fixed_size_list()
1464f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1465*cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
14668a7d6542SBram Moolenaar  l->remove(0)
14678a7d6542SBram Moolenaar  l->add(5)
14688a7d6542SBram Moolenaar  l->insert(99, 1)
14690f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14708a7d6542SBram Moolenaarenddef
14718a7d6542SBram Moolenaar
1472ae616494SBram Moolenaardef Test_no_insert_xit()
1473d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1474d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1475d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1476d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1477d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1478ae616494SBram Moolenaar
1479ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1480ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1481ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1482ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1483f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1484f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1485f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1486f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1487f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1488ae616494SBram Moolenaarenddef
1489ae616494SBram Moolenaar
1490158906cfSBram Moolenaardef IfElse(what: number): string
1491*cfcd011fSBram Moolenaar  var res = ''
1492158906cfSBram Moolenaar  if what == 1
1493158906cfSBram Moolenaar    res = "one"
1494158906cfSBram Moolenaar  elseif what == 2
1495158906cfSBram Moolenaar    res = "two"
1496a259d8d3SBram Moolenaar  else
1497158906cfSBram Moolenaar    res = "three"
1498a259d8d3SBram Moolenaar  endif
1499158906cfSBram Moolenaar  return res
1500a259d8d3SBram Moolenaarenddef
1501a259d8d3SBram Moolenaar
1502158906cfSBram Moolenaardef Test_if_elseif_else()
1503158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1504158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1505158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15060f18b6d1SBram Moolenaarenddef
15070f18b6d1SBram Moolenaar
1508e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1509d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1510d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1511d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1512d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1513d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1514e8c4abbbSBram Moolenaarenddef
1515e8c4abbbSBram Moolenaar
15166d69bf60SBram Moolenaarlet g:bool_true = v:true
15176d69bf60SBram Moolenaarlet g:bool_false = v:false
15186d69bf60SBram Moolenaar
15196d69bf60SBram Moolenaardef Test_if_const_expr()
1520*cfcd011fSBram Moolenaar  var res = false
15216d69bf60SBram Moolenaar  if true ? true : false
15226d69bf60SBram Moolenaar    res = true
15236d69bf60SBram Moolenaar  endif
15246d69bf60SBram Moolenaar  assert_equal(true, res)
15256d69bf60SBram Moolenaar
1526585fea7bSBram Moolenaar  g:glob = 2
1527585fea7bSBram Moolenaar  if false
15286797966dSBram Moolenaar    execute('g:glob = 3')
1529585fea7bSBram Moolenaar  endif
1530585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1531585fea7bSBram Moolenaar  if true
15326797966dSBram Moolenaar    execute('g:glob = 3')
1533585fea7bSBram Moolenaar  endif
1534585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1535585fea7bSBram Moolenaar
15366d69bf60SBram Moolenaar  res = false
15376d69bf60SBram Moolenaar  if g:bool_true ? true : false
15386d69bf60SBram Moolenaar    res = true
15396d69bf60SBram Moolenaar  endif
15406d69bf60SBram Moolenaar  assert_equal(true, res)
15416d69bf60SBram Moolenaar
15426d69bf60SBram Moolenaar  res = false
15436d69bf60SBram Moolenaar  if true ? g:bool_true : false
15446d69bf60SBram Moolenaar    res = true
15456d69bf60SBram Moolenaar  endif
15466d69bf60SBram Moolenaar  assert_equal(true, res)
15476d69bf60SBram Moolenaar
15486d69bf60SBram Moolenaar  res = false
15496d69bf60SBram Moolenaar  if true ? true : g:bool_false
15506d69bf60SBram Moolenaar    res = true
15516d69bf60SBram Moolenaar  endif
15526d69bf60SBram Moolenaar  assert_equal(true, res)
15536d69bf60SBram Moolenaar
15546d69bf60SBram Moolenaar  res = false
15556d69bf60SBram Moolenaar  if true ? false : true
15566d69bf60SBram Moolenaar    res = true
15576d69bf60SBram Moolenaar  endif
15586d69bf60SBram Moolenaar  assert_equal(false, res)
15596d69bf60SBram Moolenaar
15606d69bf60SBram Moolenaar  res = false
15616d69bf60SBram Moolenaar  if false ? false : true
15626d69bf60SBram Moolenaar    res = true
15636d69bf60SBram Moolenaar  endif
15646d69bf60SBram Moolenaar  assert_equal(true, res)
15656d69bf60SBram Moolenaar
15666d69bf60SBram Moolenaar  res = false
15676d69bf60SBram Moolenaar  if false ? true : false
15686d69bf60SBram Moolenaar    res = true
15696d69bf60SBram Moolenaar  endif
15706d69bf60SBram Moolenaar  assert_equal(false, res)
15716d69bf60SBram Moolenaar
15726d69bf60SBram Moolenaar  res = false
1573e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1574e8c4abbbSBram Moolenaar    res = true
1575e8c4abbbSBram Moolenaar  endif
1576e8c4abbbSBram Moolenaar  assert_equal(false, res)
1577e8c4abbbSBram Moolenaar
1578e8c4abbbSBram Moolenaar  res = false
15796d69bf60SBram Moolenaar  if true && true
15806d69bf60SBram Moolenaar    res = true
15816d69bf60SBram Moolenaar  endif
15826d69bf60SBram Moolenaar  assert_equal(true, res)
15836d69bf60SBram Moolenaar
15846d69bf60SBram Moolenaar  res = false
15856d69bf60SBram Moolenaar  if true && false
15866d69bf60SBram Moolenaar    res = true
15876d69bf60SBram Moolenaar  endif
15886d69bf60SBram Moolenaar  assert_equal(false, res)
15896d69bf60SBram Moolenaar
15906d69bf60SBram Moolenaar  res = false
15916d69bf60SBram Moolenaar  if g:bool_true && false
15926d69bf60SBram Moolenaar    res = true
15936d69bf60SBram Moolenaar  endif
15946d69bf60SBram Moolenaar  assert_equal(false, res)
15956d69bf60SBram Moolenaar
15966d69bf60SBram Moolenaar  res = false
15976d69bf60SBram Moolenaar  if true && g:bool_false
15986d69bf60SBram Moolenaar    res = true
15996d69bf60SBram Moolenaar  endif
16006d69bf60SBram Moolenaar  assert_equal(false, res)
16016d69bf60SBram Moolenaar
16026d69bf60SBram Moolenaar  res = false
16036d69bf60SBram Moolenaar  if false && false
16046d69bf60SBram Moolenaar    res = true
16056d69bf60SBram Moolenaar  endif
16066d69bf60SBram Moolenaar  assert_equal(false, res)
16076d69bf60SBram Moolenaar
16086d69bf60SBram Moolenaar  res = false
16096d69bf60SBram Moolenaar  if true || false
16106d69bf60SBram Moolenaar    res = true
16116d69bf60SBram Moolenaar  endif
16126d69bf60SBram Moolenaar  assert_equal(true, res)
16136d69bf60SBram Moolenaar
16146d69bf60SBram Moolenaar  res = false
16156d69bf60SBram Moolenaar  if g:bool_true || false
16166d69bf60SBram Moolenaar    res = true
16176d69bf60SBram Moolenaar  endif
16186d69bf60SBram Moolenaar  assert_equal(true, res)
16196d69bf60SBram Moolenaar
16206d69bf60SBram Moolenaar  res = false
16216d69bf60SBram Moolenaar  if true || g:bool_false
16226d69bf60SBram Moolenaar    res = true
16236d69bf60SBram Moolenaar  endif
16246d69bf60SBram Moolenaar  assert_equal(true, res)
16256d69bf60SBram Moolenaar
16266d69bf60SBram Moolenaar  res = false
16276d69bf60SBram Moolenaar  if false || false
16286d69bf60SBram Moolenaar    res = true
16296d69bf60SBram Moolenaar  endif
16306d69bf60SBram Moolenaar  assert_equal(false, res)
16313988f64fSBram Moolenaar
16323988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16333988f64fSBram Moolenaar  if false | eval 0 | endif
16343988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16353988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16363988f64fSBram Moolenaar  if false
16373988f64fSBram Moolenaar    burp
16383988f64fSBram Moolenaar  endif
163980c34ca3SBram Moolenaarenddef
16406d69bf60SBram Moolenaar
164180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1642d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1643d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1644d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1645d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16466d69bf60SBram Moolenaarenddef
16476d69bf60SBram Moolenaar
164872abcf42SBram Moolenaardef RunNested(i: number): number
1649*cfcd011fSBram Moolenaar  var x: number = 0
165072abcf42SBram Moolenaar  if i % 2
165172abcf42SBram Moolenaar    if 1
1652f5be8cdbSBram Moolenaar      # comment
165372abcf42SBram Moolenaar    else
1654f5be8cdbSBram Moolenaar      # comment
165572abcf42SBram Moolenaar    endif
165672abcf42SBram Moolenaar    x += 1
165772abcf42SBram Moolenaar  else
165872abcf42SBram Moolenaar    x += 1000
165972abcf42SBram Moolenaar  endif
166072abcf42SBram Moolenaar  return x
166172abcf42SBram Moolenaarenddef
166272abcf42SBram Moolenaar
166372abcf42SBram Moolenaardef Test_nested_if()
166472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
166572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
166672abcf42SBram Moolenaarenddef
166772abcf42SBram Moolenaar
1668ad39c094SBram Moolenaardef Test_execute_cmd()
1669ad39c094SBram Moolenaar  new
1670ad39c094SBram Moolenaar  setline(1, 'default')
1671d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1672ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1673a72cfb80SBram Moolenaar
1674d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1675a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1676a72cfb80SBram Moolenaar
1677*cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1678*cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1679a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1680ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1681a72cfb80SBram Moolenaar
1682d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1683ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1684a72cfb80SBram Moolenaar
1685*cfcd011fSBram Moolenaar  var cmd_first = 'call '
1686*cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1687ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1688ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1689ad39c094SBram Moolenaar  bwipe!
1690585fea7bSBram Moolenaar
1691*cfcd011fSBram Moolenaar  var n = true
16922d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
16932d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
16942d6b20d6SBram Moolenaar
1695e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
1696e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1697e5abf7afSBram Moolenaar
1698d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1699d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1700d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1701ad39c094SBram Moolenaarenddef
1702ad39c094SBram Moolenaar
170347e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1704f5be8cdbSBram Moolenaar  # only checks line continuation
1705*cfcd011fSBram Moolenaar  var lines =<< trim END
170647e880d6SBram Moolenaar      vim9script
170747e880d6SBram Moolenaar      execute 'g:someVar'
170847e880d6SBram Moolenaar                .. ' = ' ..
170947e880d6SBram Moolenaar                   '28'
171047e880d6SBram Moolenaar      assert_equal(28, g:someVar)
171147e880d6SBram Moolenaar      unlet g:someVar
171247e880d6SBram Moolenaar  END
171347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
171447e880d6SBram Moolenaarenddef
171547e880d6SBram Moolenaar
1716ad39c094SBram Moolenaardef Test_echo_cmd()
1717a72cfb80SBram Moolenaar  echo 'some' # comment
1718585fea7bSBram Moolenaar  echon 'thing'
1719ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1720ad39c094SBram Moolenaar
1721a72cfb80SBram Moolenaar  echo "some" # comment
1722a72cfb80SBram Moolenaar  echon "thing"
1723a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1724a72cfb80SBram Moolenaar
1725*cfcd011fSBram Moolenaar  var str1 = 'some'
1726*cfcd011fSBram Moolenaar  var str2 = 'more'
1727ad39c094SBram Moolenaar  echo str1 str2
1728ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1729a72cfb80SBram Moolenaar
1730d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1731ad39c094SBram Moolenaarenddef
1732ad39c094SBram Moolenaar
1733f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1734f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1735f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1736f93c7feaSBram Moolenaar  echo 'clear'
1737df069eecSBram Moolenaar  :1messages
1738f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1739f93c7feaSBram Moolenaar
1740d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1741f93c7feaSBram Moolenaarenddef
1742f93c7feaSBram Moolenaar
174347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1744f5be8cdbSBram Moolenaar  # only checks line continuation
1745*cfcd011fSBram Moolenaar  var lines =<< trim END
174647e880d6SBram Moolenaar      vim9script
174747e880d6SBram Moolenaar      echomsg 'here'
174847e880d6SBram Moolenaar                .. ' is ' ..
174947e880d6SBram Moolenaar                   'a message'
175047e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
175147e880d6SBram Moolenaar  END
175247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
175347e880d6SBram Moolenaarenddef
175447e880d6SBram Moolenaar
1755f93c7feaSBram Moolenaardef Test_echoerr_cmd()
175640ee466cSBram Moolenaar  try
175740ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
175840ee466cSBram Moolenaar  catch
175940ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
176040ee466cSBram Moolenaar  endtry
1761f93c7feaSBram Moolenaarenddef
1762f93c7feaSBram Moolenaar
176347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1764f5be8cdbSBram Moolenaar  # only checks line continuation
1765*cfcd011fSBram Moolenaar  var lines =<< trim END
176647e880d6SBram Moolenaar      vim9script
176747e880d6SBram Moolenaar      try
176847e880d6SBram Moolenaar        echoerr 'this'
176947e880d6SBram Moolenaar                .. ' is ' ..
177047e880d6SBram Moolenaar                   'wrong'
177147e880d6SBram Moolenaar      catch
177247e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
177347e880d6SBram Moolenaar      endtry
177447e880d6SBram Moolenaar  END
177547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
177647e880d6SBram Moolenaarenddef
177747e880d6SBram Moolenaar
177841fe0617SBram Moolenaardef Test_for_outside_of_function()
1779*cfcd011fSBram Moolenaar  var lines =<< trim END
178041fe0617SBram Moolenaar    vim9script
178141fe0617SBram Moolenaar    new
178241fe0617SBram Moolenaar    for var in range(0, 3)
178341fe0617SBram Moolenaar      append(line('$'), var)
178441fe0617SBram Moolenaar    endfor
178541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
178641fe0617SBram Moolenaar    bwipe!
178741fe0617SBram Moolenaar  END
178841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
178941fe0617SBram Moolenaar  source Xvim9for.vim
179041fe0617SBram Moolenaar  delete('Xvim9for.vim')
179141fe0617SBram Moolenaarenddef
17928a7d6542SBram Moolenaar
1793e8c4abbbSBram Moolenaardef Test_for_loop()
1794*cfcd011fSBram Moolenaar  var result = ''
1795e8c4abbbSBram Moolenaar  for cnt in range(7)
1796e8c4abbbSBram Moolenaar    if cnt == 4
1797e8c4abbbSBram Moolenaar      break
1798e8c4abbbSBram Moolenaar    endif
1799e8c4abbbSBram Moolenaar    if cnt == 2
1800e8c4abbbSBram Moolenaar      continue
1801e8c4abbbSBram Moolenaar    endif
1802e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1803e8c4abbbSBram Moolenaar  endfor
1804e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18050ad3e894SBram Moolenaar
1806*cfcd011fSBram Moolenaar  var concat = ''
18070ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18080ad3e894SBram Moolenaar    concat ..= str
18090ad3e894SBram Moolenaar  endfor
18100ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1811e8c4abbbSBram Moolenaarenddef
1812e8c4abbbSBram Moolenaar
1813e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1814675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1815675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1816*cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1817822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1818451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1819675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1820675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1821675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1822e8c4abbbSBram Moolenaarenddef
1823e8c4abbbSBram Moolenaar
1824d0df1aacSBram Moolenaardef Test_while_loop()
1825*cfcd011fSBram Moolenaar  var result = ''
1826*cfcd011fSBram Moolenaar  var cnt = 0
1827d0df1aacSBram Moolenaar  while cnt < 555
1828d0df1aacSBram Moolenaar    if cnt == 3
1829d0df1aacSBram Moolenaar      break
1830d0df1aacSBram Moolenaar    endif
1831d0df1aacSBram Moolenaar    cnt += 1
1832d0df1aacSBram Moolenaar    if cnt == 2
1833d0df1aacSBram Moolenaar      continue
1834d0df1aacSBram Moolenaar    endif
1835d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1836d0df1aacSBram Moolenaar  endwhile
1837d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1838d0df1aacSBram Moolenaarenddef
1839d0df1aacSBram Moolenaar
1840e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1841675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1842675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1843675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1844675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1845675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1846675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1847675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1848bd5da371SBram Moolenaarenddef
1849bd5da371SBram Moolenaar
18509645e2d9SBram Moolenaardef Test_interrupt_loop()
1851*cfcd011fSBram Moolenaar  var caught = false
1852*cfcd011fSBram Moolenaar  var x = 0
185397acfc78SBram Moolenaar  try
18549645e2d9SBram Moolenaar    while 1
18559645e2d9SBram Moolenaar      x += 1
18569645e2d9SBram Moolenaar      if x == 100
18579645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18589645e2d9SBram Moolenaar      endif
18599645e2d9SBram Moolenaar    endwhile
186097acfc78SBram Moolenaar  catch
186197acfc78SBram Moolenaar    caught = true
186297acfc78SBram Moolenaar    assert_equal(100, x)
186397acfc78SBram Moolenaar  endtry
186497acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
186525859dd7SBram Moolenaar  # consume the CTRL-C
186625859dd7SBram Moolenaar  getchar(0)
18679645e2d9SBram Moolenaarenddef
186820431c9dSBram Moolenaar
18694fdae999SBram Moolenaardef Test_automatic_line_continuation()
1870*cfcd011fSBram Moolenaar  var mylist = [
18714fdae999SBram Moolenaar      'one',
18724fdae999SBram Moolenaar      'two',
18734fdae999SBram Moolenaar      'three',
1874f5be8cdbSBram Moolenaar      ] # comment
18754fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18764fdae999SBram Moolenaar
1877*cfcd011fSBram Moolenaar  var mydict = {
18784fdae999SBram Moolenaar      'one': 1,
18794fdae999SBram Moolenaar      'two': 2,
18804fdae999SBram Moolenaar      'three':
18814fdae999SBram Moolenaar          3,
1882f5be8cdbSBram Moolenaar      } # comment
18834fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18844fdae999SBram Moolenaar  mydict = #{
18852c330432SBram Moolenaar      one: 1,  # comment
18862c330432SBram Moolenaar      two:     # comment
18872c330432SBram Moolenaar           2,  # comment
18882c330432SBram Moolenaar      three: 3 # comment
18892c330432SBram Moolenaar      }
18902c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18912c330432SBram Moolenaar  mydict = #{
18922c330432SBram Moolenaar      one: 1,
18934fdae999SBram Moolenaar      two:
18944fdae999SBram Moolenaar           2,
18952c330432SBram Moolenaar      three: 3
18964fdae999SBram Moolenaar      }
18974fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1898e6085c53SBram Moolenaar
1899e6085c53SBram Moolenaar  assert_equal(
1900e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1901e6085c53SBram Moolenaar        split('one two three')
1902e6085c53SBram Moolenaar        )
19034fdae999SBram Moolenaarenddef
19044fdae999SBram Moolenaar
19057a092245SBram Moolenaardef Test_vim9_comment()
19067a092245SBram Moolenaar  CheckScriptSuccess([
19077a092245SBram Moolenaar      'vim9script',
19087a092245SBram Moolenaar      '# something',
19097a092245SBram Moolenaar      ])
19107a092245SBram Moolenaar  CheckScriptFailure([
19117a092245SBram Moolenaar      'vim9script',
19127a092245SBram Moolenaar      ':# something',
19137a092245SBram Moolenaar      ], 'E488:')
19147a092245SBram Moolenaar  CheckScriptFailure([
19157a092245SBram Moolenaar      '# something',
19167a092245SBram Moolenaar      ], 'E488:')
19177a092245SBram Moolenaar  CheckScriptFailure([
19187a092245SBram Moolenaar      ':# something',
19197a092245SBram Moolenaar      ], 'E488:')
19207a092245SBram Moolenaar
19214a8d9f2eSBram Moolenaar  { # block start
19224a8d9f2eSBram Moolenaar  } # block end
19234a8d9f2eSBram Moolenaar  CheckDefFailure([
19244a8d9f2eSBram Moolenaar      '{# comment',
19254a8d9f2eSBram Moolenaar      ], 'E488:')
19264a8d9f2eSBram Moolenaar  CheckDefFailure([
19274a8d9f2eSBram Moolenaar      '{',
19284a8d9f2eSBram Moolenaar      '}# comment',
19294a8d9f2eSBram Moolenaar      ], 'E488:')
19304a8d9f2eSBram Moolenaar
19314a8d9f2eSBram Moolenaar  echo "yes" # comment
19324a8d9f2eSBram Moolenaar  CheckDefFailure([
19334a8d9f2eSBram Moolenaar      'echo "yes"# comment',
19344a8d9f2eSBram Moolenaar      ], 'E488:')
19357a092245SBram Moolenaar  CheckScriptSuccess([
19367a092245SBram Moolenaar      'vim9script',
19377a092245SBram Moolenaar      'echo "yes" # something',
19387a092245SBram Moolenaar      ])
19397a092245SBram Moolenaar  CheckScriptFailure([
19407a092245SBram Moolenaar      'vim9script',
19417a092245SBram Moolenaar      'echo "yes"# something',
19427a092245SBram Moolenaar      ], 'E121:')
19437a092245SBram Moolenaar  CheckScriptFailure([
19447a092245SBram Moolenaar      'vim9script',
19457a092245SBram Moolenaar      'echo# something',
19467a092245SBram Moolenaar      ], 'E121:')
19477a092245SBram Moolenaar  CheckScriptFailure([
19487a092245SBram Moolenaar      'echo "yes" # something',
19497a092245SBram Moolenaar      ], 'E121:')
19507a092245SBram Moolenaar
19514a8d9f2eSBram Moolenaar  exe "echo" # comment
19524a8d9f2eSBram Moolenaar  CheckDefFailure([
19534a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19544a8d9f2eSBram Moolenaar      ], 'E488:')
19554a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19564a8d9f2eSBram Moolenaar      'vim9script',
19574a8d9f2eSBram Moolenaar      'exe "echo" # something',
19584a8d9f2eSBram Moolenaar      ])
19594a8d9f2eSBram Moolenaar  CheckScriptFailure([
19604a8d9f2eSBram Moolenaar      'vim9script',
19614a8d9f2eSBram Moolenaar      'exe "echo"# something',
19624a8d9f2eSBram Moolenaar      ], 'E121:')
19634a8d9f2eSBram Moolenaar  CheckDefFailure([
19644a8d9f2eSBram Moolenaar      'exe # comment',
19654a8d9f2eSBram Moolenaar      ], 'E1015:')
19664a8d9f2eSBram Moolenaar  CheckScriptFailure([
19674a8d9f2eSBram Moolenaar      'vim9script',
19684a8d9f2eSBram Moolenaar      'exe# something',
19694a8d9f2eSBram Moolenaar      ], 'E121:')
19704a8d9f2eSBram Moolenaar  CheckScriptFailure([
19714a8d9f2eSBram Moolenaar      'exe "echo" # something',
19724a8d9f2eSBram Moolenaar      ], 'E121:')
19734a8d9f2eSBram Moolenaar
19747a092245SBram Moolenaar  CheckDefFailure([
19757a092245SBram Moolenaar      'try# comment',
19767a092245SBram Moolenaar      '  echo "yes"',
19777a092245SBram Moolenaar      'catch',
19787a092245SBram Moolenaar      'endtry',
19797a092245SBram Moolenaar      ], 'E488:')
19802c5ed4e3SBram Moolenaar  CheckScriptFailure([
19812c5ed4e3SBram Moolenaar      'vim9script',
19822c5ed4e3SBram Moolenaar      'try# comment',
19832c5ed4e3SBram Moolenaar      'echo "yes"',
19842c5ed4e3SBram Moolenaar      ], 'E488:')
19857a092245SBram Moolenaar  CheckDefFailure([
19867a092245SBram Moolenaar      'try',
1987a72cfb80SBram Moolenaar      '  throw#comment',
1988a72cfb80SBram Moolenaar      'catch',
1989a72cfb80SBram Moolenaar      'endtry',
1990a72cfb80SBram Moolenaar      ], 'E1015:')
1991a72cfb80SBram Moolenaar  CheckDefFailure([
1992a72cfb80SBram Moolenaar      'try',
1993a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1994a72cfb80SBram Moolenaar      'catch',
1995a72cfb80SBram Moolenaar      'endtry',
1996a72cfb80SBram Moolenaar      ], 'E488:')
1997a72cfb80SBram Moolenaar  CheckDefFailure([
1998a72cfb80SBram Moolenaar      'try',
19997a092245SBram Moolenaar      '  echo "yes"',
20007a092245SBram Moolenaar      'catch# comment',
20017a092245SBram Moolenaar      'endtry',
20027a092245SBram Moolenaar      ], 'E488:')
20032c5ed4e3SBram Moolenaar  CheckScriptFailure([
20042c5ed4e3SBram Moolenaar      'vim9script',
20052c5ed4e3SBram Moolenaar      'try',
20062c5ed4e3SBram Moolenaar      '  echo "yes"',
20072c5ed4e3SBram Moolenaar      'catch# comment',
20082c5ed4e3SBram Moolenaar      'endtry',
20092c5ed4e3SBram Moolenaar      ], 'E654:')
20102c5ed4e3SBram Moolenaar  CheckDefFailure([
20112c5ed4e3SBram Moolenaar      'try',
20122c5ed4e3SBram Moolenaar      '  echo "yes"',
20132c5ed4e3SBram Moolenaar      'catch /pat/# comment',
20142c5ed4e3SBram Moolenaar      'endtry',
20152c5ed4e3SBram Moolenaar      ], 'E488:')
20167a092245SBram Moolenaar  CheckDefFailure([
20177a092245SBram Moolenaar      'try',
20187a092245SBram Moolenaar      'echo "yes"',
20197a092245SBram Moolenaar      'catch',
20207a092245SBram Moolenaar      'endtry# comment',
20217a092245SBram Moolenaar      ], 'E488:')
20222c5ed4e3SBram Moolenaar  CheckScriptFailure([
20232c5ed4e3SBram Moolenaar      'vim9script',
20242c5ed4e3SBram Moolenaar      'try',
20252c5ed4e3SBram Moolenaar      '  echo "yes"',
20262c5ed4e3SBram Moolenaar      'catch',
20272c5ed4e3SBram Moolenaar      'endtry# comment',
20289b7bf9e9SBram Moolenaar      ], 'E488:')
20292c5ed4e3SBram Moolenaar
20302c5ed4e3SBram Moolenaar  CheckScriptSuccess([
20312c5ed4e3SBram Moolenaar      'vim9script',
20322c5ed4e3SBram Moolenaar      'hi # comment',
20332c5ed4e3SBram Moolenaar      ])
20342c5ed4e3SBram Moolenaar  CheckScriptFailure([
20352c5ed4e3SBram Moolenaar      'vim9script',
20362c5ed4e3SBram Moolenaar      'hi# comment',
20372c5ed4e3SBram Moolenaar      ], 'E416:')
20381966c248SBram Moolenaar  CheckScriptSuccess([
20391966c248SBram Moolenaar      'vim9script',
20401966c248SBram Moolenaar      'hi Search # comment',
20411966c248SBram Moolenaar      ])
20421966c248SBram Moolenaar  CheckScriptFailure([
20431966c248SBram Moolenaar      'vim9script',
20441966c248SBram Moolenaar      'hi Search# comment',
20451966c248SBram Moolenaar      ], 'E416:')
20461966c248SBram Moolenaar  CheckScriptSuccess([
20471966c248SBram Moolenaar      'vim9script',
20481966c248SBram Moolenaar      'hi link This Search # comment',
20491966c248SBram Moolenaar      ])
20501966c248SBram Moolenaar  CheckScriptFailure([
20511966c248SBram Moolenaar      'vim9script',
20521966c248SBram Moolenaar      'hi link This That# comment',
20531966c248SBram Moolenaar      ], 'E413:')
20541966c248SBram Moolenaar  CheckScriptSuccess([
20551966c248SBram Moolenaar      'vim9script',
20561966c248SBram Moolenaar      'hi clear This # comment',
20571966c248SBram Moolenaar      'hi clear # comment',
20581966c248SBram Moolenaar      ])
2059f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2060f5be8cdbSBram Moolenaar  # hi clear This# comment',
20611966c248SBram Moolenaar  CheckScriptFailure([
20621966c248SBram Moolenaar      'vim9script',
20631966c248SBram Moolenaar      'hi clear# comment',
20641966c248SBram Moolenaar      ], 'E416:')
20651966c248SBram Moolenaar
20661966c248SBram Moolenaar  CheckScriptSuccess([
20671966c248SBram Moolenaar      'vim9script',
20681966c248SBram Moolenaar      'hi Group term=bold',
20691966c248SBram Moolenaar      'match Group /todo/ # comment',
20701966c248SBram Moolenaar      ])
20711966c248SBram Moolenaar  CheckScriptFailure([
20721966c248SBram Moolenaar      'vim9script',
20731966c248SBram Moolenaar      'hi Group term=bold',
20741966c248SBram Moolenaar      'match Group /todo/# comment',
20751966c248SBram Moolenaar      ], 'E488:')
20761966c248SBram Moolenaar  CheckScriptSuccess([
20771966c248SBram Moolenaar      'vim9script',
20781966c248SBram Moolenaar      'match # comment',
20791966c248SBram Moolenaar      ])
20801966c248SBram Moolenaar  CheckScriptFailure([
20811966c248SBram Moolenaar      'vim9script',
20821966c248SBram Moolenaar      'match# comment',
20831966c248SBram Moolenaar      ], 'E475:')
20841966c248SBram Moolenaar  CheckScriptSuccess([
20851966c248SBram Moolenaar      'vim9script',
20861966c248SBram Moolenaar      'match none # comment',
20871966c248SBram Moolenaar      ])
20881966c248SBram Moolenaar  CheckScriptFailure([
20891966c248SBram Moolenaar      'vim9script',
20901966c248SBram Moolenaar      'match none# comment',
20911966c248SBram Moolenaar      ], 'E475:')
20921966c248SBram Moolenaar
20931966c248SBram Moolenaar  CheckScriptSuccess([
20941966c248SBram Moolenaar      'vim9script',
20951966c248SBram Moolenaar      'menutrans clear # comment',
20961966c248SBram Moolenaar      ])
20971966c248SBram Moolenaar  CheckScriptFailure([
20981966c248SBram Moolenaar      'vim9script',
20991966c248SBram Moolenaar      'menutrans clear# comment text',
21001966c248SBram Moolenaar      ], 'E474:')
21011966c248SBram Moolenaar
21021966c248SBram Moolenaar  CheckScriptSuccess([
21031966c248SBram Moolenaar      'vim9script',
21041966c248SBram Moolenaar      'syntax clear # comment',
21051966c248SBram Moolenaar      ])
21061966c248SBram Moolenaar  CheckScriptFailure([
21071966c248SBram Moolenaar      'vim9script',
21081966c248SBram Moolenaar      'syntax clear# comment text',
21091966c248SBram Moolenaar      ], 'E28:')
21101966c248SBram Moolenaar  CheckScriptSuccess([
21111966c248SBram Moolenaar      'vim9script',
21121966c248SBram Moolenaar      'syntax keyword Word some',
21131966c248SBram Moolenaar      'syntax clear Word # comment',
21141966c248SBram Moolenaar      ])
21151966c248SBram Moolenaar  CheckScriptFailure([
21161966c248SBram Moolenaar      'vim9script',
21171966c248SBram Moolenaar      'syntax keyword Word some',
21181966c248SBram Moolenaar      'syntax clear Word# comment text',
21191966c248SBram Moolenaar      ], 'E28:')
21201966c248SBram Moolenaar
21211966c248SBram Moolenaar  CheckScriptSuccess([
21221966c248SBram Moolenaar      'vim9script',
21231966c248SBram Moolenaar      'syntax list # comment',
21241966c248SBram Moolenaar      ])
21251966c248SBram Moolenaar  CheckScriptFailure([
21261966c248SBram Moolenaar      'vim9script',
21271966c248SBram Moolenaar      'syntax list# comment text',
21281966c248SBram Moolenaar      ], 'E28:')
21291966c248SBram Moolenaar
21301966c248SBram Moolenaar  CheckScriptSuccess([
21311966c248SBram Moolenaar      'vim9script',
21321966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
21331966c248SBram Moolenaar      ])
21341966c248SBram Moolenaar  CheckScriptFailure([
21351966c248SBram Moolenaar      'vim9script',
21361966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
21371966c248SBram Moolenaar      ], 'E475:')
21381966c248SBram Moolenaar
21391966c248SBram Moolenaar  CheckScriptSuccess([
21401966c248SBram Moolenaar      'vim9script',
21411966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21421966c248SBram Moolenaar      ])
21431966c248SBram Moolenaar  CheckScriptFailure([
21441966c248SBram Moolenaar      'vim9script',
21451966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21461966c248SBram Moolenaar      ], 'E789:')
21471966c248SBram Moolenaar
21481966c248SBram Moolenaar  CheckScriptSuccess([
21491966c248SBram Moolenaar      'vim9script',
21501966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21511966c248SBram Moolenaar      ])
21521966c248SBram Moolenaar  CheckScriptFailure([
21531966c248SBram Moolenaar      'vim9script',
21541966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21551966c248SBram Moolenaar      ], 'E402:')
21561966c248SBram Moolenaar
21571966c248SBram Moolenaar  CheckScriptSuccess([
21581966c248SBram Moolenaar      'vim9script',
21591966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21601966c248SBram Moolenaar      ])
21611966c248SBram Moolenaar  CheckScriptFailure([
21621966c248SBram Moolenaar      'vim9script',
21631966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21641966c248SBram Moolenaar      ], 'E475:')
21651966c248SBram Moolenaar  CheckScriptFailure([
21661966c248SBram Moolenaar      'vim9script',
21671966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21681966c248SBram Moolenaar      ], 'E406:')
21691966c248SBram Moolenaar  CheckScriptFailure([
21701966c248SBram Moolenaar      'vim9script',
21711966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21721966c248SBram Moolenaar      ], 'E475:')
21731966c248SBram Moolenaar
21741966c248SBram Moolenaar  CheckScriptSuccess([
21751966c248SBram Moolenaar      'vim9script',
21761966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21771966c248SBram Moolenaar      ])
21781966c248SBram Moolenaar  CheckScriptFailure([
21791966c248SBram Moolenaar      'vim9script',
21801966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2181d032f34aSBram Moolenaar      ], 'E402:')
21821966c248SBram Moolenaar
21831966c248SBram Moolenaar  CheckScriptSuccess([
21841966c248SBram Moolenaar      'vim9script',
21851966c248SBram Moolenaar      'syntax sync # comment',
21861966c248SBram Moolenaar      ])
21871966c248SBram Moolenaar  CheckScriptFailure([
21881966c248SBram Moolenaar      'vim9script',
21891966c248SBram Moolenaar      'syntax sync# comment',
21901966c248SBram Moolenaar      ], 'E404:')
21911966c248SBram Moolenaar  CheckScriptSuccess([
21921966c248SBram Moolenaar      'vim9script',
21931966c248SBram Moolenaar      'syntax sync ccomment # comment',
21941966c248SBram Moolenaar      ])
21951966c248SBram Moolenaar  CheckScriptFailure([
21961966c248SBram Moolenaar      'vim9script',
21971966c248SBram Moolenaar      'syntax sync ccomment# comment',
21981966c248SBram Moolenaar      ], 'E404:')
21991966c248SBram Moolenaar
22001966c248SBram Moolenaar  CheckScriptSuccess([
22011966c248SBram Moolenaar      'vim9script',
22021966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
22031966c248SBram Moolenaar      ])
22041966c248SBram Moolenaar  CheckScriptFailure([
22051966c248SBram Moolenaar      'vim9script',
22061966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
22071966c248SBram Moolenaar      ], 'E475:')
2208a72cfb80SBram Moolenaar
2209a72cfb80SBram Moolenaar  CheckScriptSuccess([
2210a72cfb80SBram Moolenaar      'vim9script',
2211a72cfb80SBram Moolenaar      'command Echo echo # comment',
2212a72cfb80SBram Moolenaar      'command Echo # comment',
2213a72cfb80SBram Moolenaar      ])
2214a72cfb80SBram Moolenaar  CheckScriptFailure([
2215a72cfb80SBram Moolenaar      'vim9script',
2216a72cfb80SBram Moolenaar      'command Echo echo# comment',
2217a72cfb80SBram Moolenaar      'Echo',
2218a72cfb80SBram Moolenaar      ], 'E121:')
2219a72cfb80SBram Moolenaar  CheckScriptFailure([
2220a72cfb80SBram Moolenaar      'vim9script',
2221a72cfb80SBram Moolenaar      'command Echo# comment',
2222a72cfb80SBram Moolenaar      ], 'E182:')
2223a72cfb80SBram Moolenaar  CheckScriptFailure([
2224a72cfb80SBram Moolenaar      'vim9script',
2225a72cfb80SBram Moolenaar      'command Echo echo',
2226a72cfb80SBram Moolenaar      'command Echo# comment',
2227a72cfb80SBram Moolenaar      ], 'E182:')
2228a72cfb80SBram Moolenaar
2229a72cfb80SBram Moolenaar  CheckScriptSuccess([
2230a72cfb80SBram Moolenaar      'vim9script',
2231a72cfb80SBram Moolenaar      'function # comment',
2232a72cfb80SBram Moolenaar      ])
2233a72cfb80SBram Moolenaar  CheckScriptFailure([
2234a72cfb80SBram Moolenaar      'vim9script',
22359898107fSBram Moolenaar      'function " comment',
22369898107fSBram Moolenaar      ], 'E129:')
22379898107fSBram Moolenaar  CheckScriptFailure([
22389898107fSBram Moolenaar      'vim9script',
2239a72cfb80SBram Moolenaar      'function# comment',
2240a72cfb80SBram Moolenaar      ], 'E129:')
2241a72cfb80SBram Moolenaar  CheckScriptSuccess([
2242a72cfb80SBram Moolenaar      'vim9script',
2243a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2244a72cfb80SBram Moolenaar      ])
2245a72cfb80SBram Moolenaar  CheckScriptFailure([
2246a72cfb80SBram Moolenaar      'vim9script',
2247a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2248a72cfb80SBram Moolenaar      ], 'E488:')
2249a72cfb80SBram Moolenaar
2250a72cfb80SBram Moolenaar  CheckScriptSuccess([
2251a72cfb80SBram Moolenaar      'vim9script',
22524c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2253a72cfb80SBram Moolenaar      'endfunc',
22544c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2255a72cfb80SBram Moolenaar      ])
2256a72cfb80SBram Moolenaar  CheckScriptFailure([
2257a72cfb80SBram Moolenaar      'vim9script',
22584c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2259a72cfb80SBram Moolenaar      'endfunc',
22604c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2261a72cfb80SBram Moolenaar      ], 'E488:')
2262a72cfb80SBram Moolenaar
2263a72cfb80SBram Moolenaar  CheckScriptSuccess([
2264a72cfb80SBram Moolenaar      'vim9script',
2265a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2266a72cfb80SBram Moolenaar      ])
2267a72cfb80SBram Moolenaar  CheckScriptFailure([
2268a72cfb80SBram Moolenaar      'vim9script',
2269a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2270a72cfb80SBram Moolenaar      ], 'E488:')
2271e7e4838fSBram Moolenaar
2272e7e4838fSBram Moolenaar  CheckScriptFailure([
2273e7e4838fSBram Moolenaar      'def Test() " comment',
2274e7e4838fSBram Moolenaar      'enddef',
2275e7e4838fSBram Moolenaar      ], 'E488:')
2276e7e4838fSBram Moolenaar  CheckScriptFailure([
2277e7e4838fSBram Moolenaar      'vim9script',
2278e7e4838fSBram Moolenaar      'def Test() " comment',
2279e7e4838fSBram Moolenaar      'enddef',
2280e7e4838fSBram Moolenaar      ], 'E488:')
2281e7e4838fSBram Moolenaar
2282e7e4838fSBram Moolenaar  CheckScriptSuccess([
2283e7e4838fSBram Moolenaar      'func Test() " comment',
2284e7e4838fSBram Moolenaar      'endfunc',
2285e7e4838fSBram Moolenaar      ])
22869898107fSBram Moolenaar  CheckScriptSuccess([
2287e7e4838fSBram Moolenaar      'vim9script',
2288e7e4838fSBram Moolenaar      'func Test() " comment',
2289e7e4838fSBram Moolenaar      'endfunc',
22909898107fSBram Moolenaar      ])
2291e7e4838fSBram Moolenaar
2292e7e4838fSBram Moolenaar  CheckScriptSuccess([
2293e7e4838fSBram Moolenaar      'def Test() # comment',
2294e7e4838fSBram Moolenaar      'enddef',
2295e7e4838fSBram Moolenaar      ])
2296e7e4838fSBram Moolenaar  CheckScriptFailure([
2297e7e4838fSBram Moolenaar      'func Test() # comment',
2298e7e4838fSBram Moolenaar      'endfunc',
2299e7e4838fSBram Moolenaar      ], 'E488:')
23002c5ed4e3SBram Moolenaarenddef
23012c5ed4e3SBram Moolenaar
23022c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
23032c5ed4e3SBram Moolenaar  CheckCanRunGui
23042c5ed4e3SBram Moolenaar
23052c5ed4e3SBram Moolenaar  CheckScriptFailure([
23062c5ed4e3SBram Moolenaar      'vim9script',
23072c5ed4e3SBram Moolenaar      'gui#comment'
23082c5ed4e3SBram Moolenaar      ], 'E499:')
23092c5ed4e3SBram Moolenaar  CheckScriptFailure([
23102c5ed4e3SBram Moolenaar      'vim9script',
23112c5ed4e3SBram Moolenaar      'gui -f#comment'
23122c5ed4e3SBram Moolenaar      ], 'E499:')
23137a092245SBram Moolenaarenddef
23147a092245SBram Moolenaar
2315a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
23166797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
23176797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2318a26b9700SBram Moolenaar
2319a26b9700SBram Moolenaar  edit test.vim
2320a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2321a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2322a26b9700SBram Moolenaar
2323a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2324a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2325a26b9700SBram Moolenaar
2326a26b9700SBram Moolenaar  g:entered = 0
2327a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2328a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2329a26b9700SBram Moolenaar
2330a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2331a26b9700SBram Moolenaar
2332a26b9700SBram Moolenaar  au! TabEnter
2333a26b9700SBram Moolenaar  unlet g:entered
2334d72c1bf0SBram Moolenaar
2335d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2336d72c1bf0SBram Moolenaar      'vim9script',
23376797966dSBram Moolenaar      'g:var = 123',
2338e55b1c09SBram Moolenaar      'b:var = 456',
2339e55b1c09SBram Moolenaar      'w:var = 777',
2340e55b1c09SBram Moolenaar      't:var = 888',
2341d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2342d72c1bf0SBram Moolenaar      ])
2343d72c1bf0SBram Moolenaar
2344d72c1bf0SBram Moolenaar  CheckScriptFailure([
2345d72c1bf0SBram Moolenaar      'vim9script',
2346*cfcd011fSBram Moolenaar      'let var = 123',
2347*cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2348*cfcd011fSBram Moolenaar
2349*cfcd011fSBram Moolenaar  CheckScriptFailure([
2350*cfcd011fSBram Moolenaar      'vim9script',
2351*cfcd011fSBram Moolenaar      'var g:var = 123',
2352e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2353e55b1c09SBram Moolenaar
2354e55b1c09SBram Moolenaar  CheckScriptFailure([
2355e55b1c09SBram Moolenaar      'vim9script',
2356*cfcd011fSBram Moolenaar      'var b:var = 123',
2357e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2358e55b1c09SBram Moolenaar
2359e55b1c09SBram Moolenaar  CheckScriptFailure([
2360e55b1c09SBram Moolenaar      'vim9script',
2361*cfcd011fSBram Moolenaar      'var w:var = 123',
2362e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2363e55b1c09SBram Moolenaar
2364e55b1c09SBram Moolenaar  CheckScriptFailure([
2365e55b1c09SBram Moolenaar      'vim9script',
2366*cfcd011fSBram Moolenaar      'var t:var = 123',
2367e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2368e55b1c09SBram Moolenaar
2369e55b1c09SBram Moolenaar  CheckScriptFailure([
2370e55b1c09SBram Moolenaar      'vim9script',
2371*cfcd011fSBram Moolenaar      'var v:version = 123',
2372e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2373e55b1c09SBram Moolenaar
2374e55b1c09SBram Moolenaar  CheckScriptFailure([
2375e55b1c09SBram Moolenaar      'vim9script',
2376*cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2377e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23786797966dSBram Moolenaar
23796797966dSBram Moolenaar  CheckScriptFailure([
23806797966dSBram Moolenaar      'vim9script',
23816797966dSBram Moolenaar      'g:var = 123',
238232e35117SBram Moolenaar      'unlet g:var# comment1',
2383d72c1bf0SBram Moolenaar      ], 'E108:')
2384d72c1bf0SBram Moolenaar
2385d72c1bf0SBram Moolenaar  CheckScriptFailure([
2386d72c1bf0SBram Moolenaar      'let g:var = 123',
2387d72c1bf0SBram Moolenaar      'unlet g:var # something',
2388d72c1bf0SBram Moolenaar      ], 'E488:')
2389faac4104SBram Moolenaar
2390faac4104SBram Moolenaar  CheckScriptSuccess([
2391faac4104SBram Moolenaar      'vim9script',
239232e35117SBram Moolenaar      'if 1 # comment2',
2393faac4104SBram Moolenaar      '  echo "yes"',
2394faac4104SBram Moolenaar      'elseif 2 #comment',
2395faac4104SBram Moolenaar      '  echo "no"',
2396faac4104SBram Moolenaar      'endif',
2397faac4104SBram Moolenaar      ])
2398faac4104SBram Moolenaar
2399faac4104SBram Moolenaar  CheckScriptFailure([
2400faac4104SBram Moolenaar      'vim9script',
240132e35117SBram Moolenaar      'if 1# comment3',
2402faac4104SBram Moolenaar      '  echo "yes"',
2403faac4104SBram Moolenaar      'endif',
2404faac4104SBram Moolenaar      ], 'E15:')
2405faac4104SBram Moolenaar
2406faac4104SBram Moolenaar  CheckScriptFailure([
2407faac4104SBram Moolenaar      'vim9script',
240832e35117SBram Moolenaar      'if 0 # comment4',
2409faac4104SBram Moolenaar      '  echo "yes"',
2410faac4104SBram Moolenaar      'elseif 2#comment',
2411faac4104SBram Moolenaar      '  echo "no"',
2412faac4104SBram Moolenaar      'endif',
2413faac4104SBram Moolenaar      ], 'E15:')
2414faac4104SBram Moolenaar
2415faac4104SBram Moolenaar  CheckScriptSuccess([
2416faac4104SBram Moolenaar      'vim9script',
2417*cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2418faac4104SBram Moolenaar      ])
2419faac4104SBram Moolenaar
2420faac4104SBram Moolenaar  CheckScriptFailure([
2421faac4104SBram Moolenaar      'vim9script',
2422*cfcd011fSBram Moolenaar      'var v = 1# comment6',
242332e35117SBram Moolenaar      ], 'E15:')
2424faac4104SBram Moolenaar
2425faac4104SBram Moolenaar  CheckScriptSuccess([
2426faac4104SBram Moolenaar      'vim9script',
2427faac4104SBram Moolenaar      'new'
2428d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2429df069eecSBram Moolenaar      ':$',
2430faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2431faac4104SBram Moolenaar      'bwipe!',
2432faac4104SBram Moolenaar      ])
2433faac4104SBram Moolenaar
2434f5be8cdbSBram Moolenaar  CheckScriptFailure([
2435f5be8cdbSBram Moolenaar      'vim9script',
2436f5be8cdbSBram Moolenaar      'new'
2437d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2438f5be8cdbSBram Moolenaar      ':$',
2439f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2440f5be8cdbSBram Moolenaar      'bwipe!',
2441f5be8cdbSBram Moolenaar      ], 'E488:')
2442f5be8cdbSBram Moolenaar
2443f5be8cdbSBram Moolenaar  CheckScriptFailure([
2444f5be8cdbSBram Moolenaar      'vim9script',
2445f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2446f5be8cdbSBram Moolenaar      ], 'E477:')
2447a26b9700SBram Moolenaarenddef
2448a26b9700SBram Moolenaar
24497e5bd91dSBram Moolenaardef Test_finish()
2450*cfcd011fSBram Moolenaar  var lines =<< trim END
24517e5bd91dSBram Moolenaar    vim9script
24526797966dSBram Moolenaar    g:res = 'one'
24537e5bd91dSBram Moolenaar    if v:false | finish | endif
24546797966dSBram Moolenaar    g:res = 'two'
24557e5bd91dSBram Moolenaar    finish
24566797966dSBram Moolenaar    g:res = 'three'
24577e5bd91dSBram Moolenaar  END
24587e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24597e5bd91dSBram Moolenaar  source Xfinished
24607e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24617e5bd91dSBram Moolenaar
24627e5bd91dSBram Moolenaar  unlet g:res
24637e5bd91dSBram Moolenaar  delete('Xfinished')
24647e5bd91dSBram Moolenaarenddef
24657e5bd91dSBram Moolenaar
246632e35117SBram Moolenaardef Test_let_func_call()
2467*cfcd011fSBram Moolenaar  var lines =<< trim END
246832e35117SBram Moolenaar    vim9script
246932e35117SBram Moolenaar    func GetValue()
247032e35117SBram Moolenaar      if exists('g:count')
247132e35117SBram Moolenaar        let g:count += 1
247232e35117SBram Moolenaar      else
247332e35117SBram Moolenaar        let g:count = 1
247432e35117SBram Moolenaar      endif
247532e35117SBram Moolenaar      return 'this'
247632e35117SBram Moolenaar    endfunc
2477*cfcd011fSBram Moolenaar    var val: string = GetValue()
2478f5be8cdbSBram Moolenaar    # env var is always a string
2479*cfcd011fSBram Moolenaar    var env = $TERM
248032e35117SBram Moolenaar  END
248132e35117SBram Moolenaar  writefile(lines, 'Xfinished')
248232e35117SBram Moolenaar  source Xfinished
2483f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
248432e35117SBram Moolenaar  assert_equal(1, g:count)
248532e35117SBram Moolenaar
248632e35117SBram Moolenaar  unlet g:count
248732e35117SBram Moolenaar  delete('Xfinished')
248832e35117SBram Moolenaarenddef
248932e35117SBram Moolenaar
249032e35117SBram Moolenaardef Test_let_missing_type()
2491*cfcd011fSBram Moolenaar  var lines =<< trim END
249232e35117SBram Moolenaar    vim9script
2493*cfcd011fSBram Moolenaar    var name = g:unknown
2494227a69deSBram Moolenaar  END
2495822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2496227a69deSBram Moolenaar
2497227a69deSBram Moolenaar  lines =<< trim END
2498227a69deSBram Moolenaar    vim9script
2499*cfcd011fSBram Moolenaar    var nr: number = 123
2500*cfcd011fSBram Moolenaar    var name = nr
2501227a69deSBram Moolenaar  END
2502822ba247SBram Moolenaar  CheckScriptSuccess(lines)
250332e35117SBram Moolenaarenddef
250432e35117SBram Moolenaar
2505c82a5b5dSBram Moolenaardef Test_let_declaration()
2506*cfcd011fSBram Moolenaar  var lines =<< trim END
2507c82a5b5dSBram Moolenaar    vim9script
2508*cfcd011fSBram Moolenaar    var name: string
2509*cfcd011fSBram Moolenaar    g:var_uninit = name
2510*cfcd011fSBram Moolenaar    name = 'text'
2511*cfcd011fSBram Moolenaar    g:var_test = name
2512f5be8cdbSBram Moolenaar    # prefixing s: is optional
2513*cfcd011fSBram Moolenaar    s:name = 'prefixed'
2514*cfcd011fSBram Moolenaar    g:var_prefixed = s:name
2515984dddbeSBram Moolenaar
2516*cfcd011fSBram Moolenaar    var s:other: number
2517984dddbeSBram Moolenaar    other = 1234
2518984dddbeSBram Moolenaar    g:other_var = other
251953b29e48SBram Moolenaar
252053b29e48SBram Moolenaar    # type is inferred
252153b29e48SBram Moolenaar    s:dict = {'a': 222}
252253b29e48SBram Moolenaar    def GetDictVal(key: any)
252353b29e48SBram Moolenaar      g:dict_val = s:dict[key]
252453b29e48SBram Moolenaar    enddef
252553b29e48SBram Moolenaar    GetDictVal('a')
2526c82a5b5dSBram Moolenaar  END
2527c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2528c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2529c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2530984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2531984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
253253b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
2533c82a5b5dSBram Moolenaar
2534c82a5b5dSBram Moolenaar  unlet g:var_uninit
2535c82a5b5dSBram Moolenaar  unlet g:var_test
2536984dddbeSBram Moolenaar  unlet g:var_prefixed
2537984dddbeSBram Moolenaar  unlet g:other_var
2538c82a5b5dSBram Moolenaarenddef
2539c82a5b5dSBram Moolenaar
2540c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2541*cfcd011fSBram Moolenaar  var lines =<< trim END
2542c5b1c20bSBram Moolenaar    vim9script
254330fd8204SBram Moolenaar    final var: string
254430fd8204SBram Moolenaar  END
254530fd8204SBram Moolenaar  CheckScriptFailure(lines, 'E1125:')
254630fd8204SBram Moolenaar
254730fd8204SBram Moolenaar  lines =<< trim END
254830fd8204SBram Moolenaar    vim9script
2549c5b1c20bSBram Moolenaar    const var: string
2550c5b1c20bSBram Moolenaar  END
2551c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2552c5b1c20bSBram Moolenaar
2553c5b1c20bSBram Moolenaar  lines =<< trim END
2554c5b1c20bSBram Moolenaar    vim9script
2555*cfcd011fSBram Moolenaar    var 9var: string
2556c5b1c20bSBram Moolenaar  END
2557c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2558c5b1c20bSBram Moolenaarenddef
2559c5b1c20bSBram Moolenaar
256034db91f7SBram Moolenaardef Test_let_type_check()
2561*cfcd011fSBram Moolenaar  var lines =<< trim END
256234db91f7SBram Moolenaar    vim9script
2563*cfcd011fSBram Moolenaar    var name: string
2564*cfcd011fSBram Moolenaar    name = 1234
256534db91f7SBram Moolenaar  END
2566451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
2567984dddbeSBram Moolenaar
2568984dddbeSBram Moolenaar  lines =<< trim END
2569984dddbeSBram Moolenaar    vim9script
2570*cfcd011fSBram Moolenaar    var name:string
2571984dddbeSBram Moolenaar  END
2572984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2573c5b1c20bSBram Moolenaar
2574c5b1c20bSBram Moolenaar  lines =<< trim END
2575c5b1c20bSBram Moolenaar    vim9script
2576*cfcd011fSBram Moolenaar    var name: asdf
2577c5b1c20bSBram Moolenaar  END
2578c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2579a71e2633SBram Moolenaar
2580a71e2633SBram Moolenaar  lines =<< trim END
2581a71e2633SBram Moolenaar    vim9script
2582*cfcd011fSBram Moolenaar    var s:l: list<number>
2583a71e2633SBram Moolenaar    s:l = []
2584a71e2633SBram Moolenaar  END
2585a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2586a71e2633SBram Moolenaar
2587a71e2633SBram Moolenaar  lines =<< trim END
2588a71e2633SBram Moolenaar    vim9script
2589*cfcd011fSBram Moolenaar    var s:d: dict<number>
2590a71e2633SBram Moolenaar    s:d = {}
2591a71e2633SBram Moolenaar  END
2592a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
259334db91f7SBram Moolenaarenddef
259434db91f7SBram Moolenaar
25955e654230SBram Moolenaarlet g:dict_number = #{one: 1, two: 2}
25965e654230SBram Moolenaar
25975e654230SBram Moolenaardef Test_let_list_dict_type()
2598*cfcd011fSBram Moolenaar  var ll: list<number>
25995e654230SBram Moolenaar  ll = [1, 2, 2, 3, 3, 3]->uniq()
26005e654230SBram Moolenaar  ll->assert_equal([1, 2, 3])
26015e654230SBram Moolenaar
2602*cfcd011fSBram Moolenaar  var dd: dict<number>
26035e654230SBram Moolenaar  dd = g:dict_number
26045e654230SBram Moolenaar  dd->assert_equal(g:dict_number)
26055e654230SBram Moolenaar
2606*cfcd011fSBram Moolenaar  var lines =<< trim END
2607*cfcd011fSBram Moolenaar      var ll: list<number>
26085e654230SBram Moolenaar      ll = [1, 2, 3]->map('"one"')
26095e654230SBram Moolenaar  END
26105e654230SBram Moolenaar  CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>')
26115e654230SBram Moolenaarenddef
26125e654230SBram Moolenaar
2613a5d0077eSBram Moolenaardef Test_forward_declaration()
2614*cfcd011fSBram Moolenaar  var lines =<< trim END
2615a5d0077eSBram Moolenaar    vim9script
2616a5d0077eSBram Moolenaar    def GetValue(): string
2617a5d0077eSBram Moolenaar      return theVal
2618a5d0077eSBram Moolenaar    enddef
2619*cfcd011fSBram Moolenaar    var theVal = 'something'
2620822ba247SBram Moolenaar    g:initVal = GetValue()
2621a5d0077eSBram Moolenaar    theVal = 'else'
2622a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2623a5d0077eSBram Moolenaar  END
2624a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2625a5d0077eSBram Moolenaar  source Xforward
2626a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2627a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2628a5d0077eSBram Moolenaar
2629a5d0077eSBram Moolenaar  unlet g:initVal
2630a5d0077eSBram Moolenaar  unlet g:laterVal
2631a5d0077eSBram Moolenaar  delete('Xforward')
2632a5d0077eSBram Moolenaarenddef
2633a5d0077eSBram Moolenaar
26349721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2635*cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
26369721fb4eSBram Moolenaar    source Xvim9_script.vim
26379721fb4eSBram Moolenaar
26389721fb4eSBram Moolenaar    call assert_false(exists('local'))
26399721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26409721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
26419721fb4eSBram Moolenaar    call assert_equal('global', global)
26429721fb4eSBram Moolenaar    call assert_equal('global', g:global)
26439721fb4eSBram Moolenaar
26449721fb4eSBram Moolenaar    " imported variable becomes script-local
26459721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
26469721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
26479721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26489721fb4eSBram Moolenaar
26499721fb4eSBram Moolenaar    " imported function becomes script-local
26509721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
26519721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
26529721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
26539721fb4eSBram Moolenaar  END
26549721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
26559721fb4eSBram Moolenaar
2656*cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
26579721fb4eSBram Moolenaar    vim9script
2658*cfcd011fSBram Moolenaar    var local = 'local'
26599721fb4eSBram Moolenaar    g:global = 'global'
2660*cfcd011fSBram Moolenaar    export var exported = 'exported'
26619721fb4eSBram Moolenaar    export def GetText(): string
26629721fb4eSBram Moolenaar       return 'text'
26639721fb4eSBram Moolenaar    enddef
26649721fb4eSBram Moolenaar  END
26659721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
26669721fb4eSBram Moolenaar
26679721fb4eSBram Moolenaar  source Xlegacy_script.vim
26689721fb4eSBram Moolenaar
26699721fb4eSBram Moolenaar  assert_equal('global', g:global)
2670f5be8cdbSBram Moolenaar  unlet g:global
26719721fb4eSBram Moolenaar
26729721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
26739721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
26749721fb4eSBram Moolenaarenddef
2675a5d0077eSBram Moolenaar
26767d699701SBram Moolenaarfunc Test_vim9script_not_global()
26777d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
26787d699701SBram Moolenaar  let vim9lines =<< trim END
26797d699701SBram Moolenaar    vim9script
2680*cfcd011fSBram Moolenaar    var name = 'local'
26817d699701SBram Moolenaar    func TheFunc()
26827d699701SBram Moolenaar      echo 'local'
26837d699701SBram Moolenaar    endfunc
26847d699701SBram Moolenaar    def DefFunc()
26857d699701SBram Moolenaar      echo 'local'
26867d699701SBram Moolenaar    enddef
26877d699701SBram Moolenaar  END
26887d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
26897d699701SBram Moolenaar  source Xvim9script.vim
26907d699701SBram Moolenaar  try
26917d699701SBram Moolenaar    echo g:var
26927d699701SBram Moolenaar    assert_report('did not fail')
26937d699701SBram Moolenaar  catch /E121:/
26947d699701SBram Moolenaar    " caught
26957d699701SBram Moolenaar  endtry
26967d699701SBram Moolenaar  try
26977d699701SBram Moolenaar    call TheFunc()
26987d699701SBram Moolenaar    assert_report('did not fail')
26997d699701SBram Moolenaar  catch /E117:/
27007d699701SBram Moolenaar    " caught
27017d699701SBram Moolenaar  endtry
27027d699701SBram Moolenaar  try
27037d699701SBram Moolenaar    call DefFunc()
27047d699701SBram Moolenaar    assert_report('did not fail')
27057d699701SBram Moolenaar  catch /E117:/
27067d699701SBram Moolenaar    " caught
27077d699701SBram Moolenaar  endtry
27087d699701SBram Moolenaar
270925859dd7SBram Moolenaar  call delete('Xvim9script.vim')
27107d699701SBram Moolenaarendfunc
27117d699701SBram Moolenaar
2712eeb27bfeSBram Moolenaardef Test_vim9_copen()
2713eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2714eeb27bfeSBram Moolenaar  copen
2715eeb27bfeSBram Moolenaar  quit
2716eeb27bfeSBram Moolenaarenddef
2717eeb27bfeSBram Moolenaar
27182d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
27192d6b20d6SBram Moolenaardef Test_vim9_autoload()
2720*cfcd011fSBram Moolenaar  var lines =<< trim END
27212d6b20d6SBram Moolenaar     vim9script
27222d6b20d6SBram Moolenaar     def foo#test()
27232d6b20d6SBram Moolenaar         echomsg getreg('"')
27242d6b20d6SBram Moolenaar     enddef
27252d6b20d6SBram Moolenaar  END
27262d6b20d6SBram Moolenaar
27272d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
27282d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2729*cfcd011fSBram Moolenaar  var save_rtp = &rtp
27302d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
27312d6b20d6SBram Moolenaar  augroup test
27322d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
27332d6b20d6SBram Moolenaar  augroup END
27342d6b20d6SBram Moolenaar
27352d6b20d6SBram Moolenaar  normal Y
27362d6b20d6SBram Moolenaar
27372d6b20d6SBram Moolenaar  augroup test
27382d6b20d6SBram Moolenaar    autocmd!
27392d6b20d6SBram Moolenaar  augroup END
27402d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
27412d6b20d6SBram Moolenaar  &rtp = save_rtp
27422d6b20d6SBram Moolenaarenddef
27432d6b20d6SBram Moolenaar
274477e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
274577e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2746*cfcd011fSBram Moolenaar  var lines =<< trim END
274777e5dcc3SBram Moolenaar      vim9script
274877e5dcc3SBram Moolenaar      def crash#func()
274977e5dcc3SBram Moolenaar          try
275077e5dcc3SBram Moolenaar              for x in List()
275177e5dcc3SBram Moolenaar              endfor
275277e5dcc3SBram Moolenaar          catch
275377e5dcc3SBram Moolenaar          endtry
275477e5dcc3SBram Moolenaar          g:ok = true
275577e5dcc3SBram Moolenaar      enddef
275677e5dcc3SBram Moolenaar      fu List()
275777e5dcc3SBram Moolenaar          invalid
275877e5dcc3SBram Moolenaar      endfu
275977e5dcc3SBram Moolenaar      try
276077e5dcc3SBram Moolenaar          invalid
276177e5dcc3SBram Moolenaar      catch /wontmatch/
276277e5dcc3SBram Moolenaar      endtry
276377e5dcc3SBram Moolenaar  END
276477e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
276577e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
276677e5dcc3SBram Moolenaar
276777e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
276877e5dcc3SBram Moolenaar  lines =<< trim END
276977e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
277077e5dcc3SBram Moolenaar    call crash#func()
277177e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
27729c4f5520SBram Moolenaar    qall!
277377e5dcc3SBram Moolenaar  END
277477e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
277577e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
277677e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
277777e5dcc3SBram Moolenaar
277877e5dcc3SBram Moolenaar  delete('Xdidit')
277977e5dcc3SBram Moolenaar  delete('Xscript')
278077e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
278177e5dcc3SBram Moolenaarenddef
278277e5dcc3SBram Moolenaar
278381e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
278481e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
278581e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2786*cfcd011fSBram Moolenaar  var lines =<< trim END
278781e17fbeSBram Moolenaar    let s:counter = 1
278881e17fbeSBram Moolenaar    def s:Func()
278981e17fbeSBram Moolenaar      au! CursorHold
279081e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
279181e17fbeSBram Moolenaar    enddef
279281e17fbeSBram Moolenaar    call s:Func()
279381e17fbeSBram Moolenaar    doau CursorHold
279481e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
279581e17fbeSBram Moolenaar    au! CursorHold
279681e17fbeSBram Moolenaar  END
279781e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
279881e17fbeSBram Moolenaarenddef
279981e17fbeSBram Moolenaar
28003896a105SBram Moolenaardef Test_cmdline_win()
28013896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
28023896a105SBram Moolenaar  # the command line window.
28033896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2804*cfcd011fSBram Moolenaar  var export_lines =<< trim END
28053896a105SBram Moolenaar    vim9script
2806*cfcd011fSBram Moolenaar    export var That = 'yes'
28073896a105SBram Moolenaar  END
28083896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2809*cfcd011fSBram Moolenaar  var import_lines =<< trim END
28103896a105SBram Moolenaar    vim9script
28113896a105SBram Moolenaar    import That from './Xexport.vim'
28123896a105SBram Moolenaar  END
28133896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2814*cfcd011fSBram Moolenaar  var save_rtp = &rtp
28153896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
28163896a105SBram Moolenaar  syntax on
28173896a105SBram Moolenaar  augroup CmdWin
28183896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
28193896a105SBram Moolenaar  augroup END
28203896a105SBram Moolenaar  # this will open and also close the cmdline window
28213896a105SBram Moolenaar  feedkeys('q:', 'xt')
28223896a105SBram Moolenaar  assert_equal('yes', g:got_there)
28233896a105SBram Moolenaar
28243896a105SBram Moolenaar  augroup CmdWin
28253896a105SBram Moolenaar    au!
28263896a105SBram Moolenaar  augroup END
28273896a105SBram Moolenaar  &rtp = save_rtp
28283896a105SBram Moolenaar  delete('rtp', 'rf')
28293896a105SBram Moolenaarenddef
28303896a105SBram Moolenaar
2831e3d4685fSBram Moolenaardef Test_invalid_sid()
2832e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
283325859dd7SBram Moolenaar
28349c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2835d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2836e3d4685fSBram Moolenaar  endif
2837e3d4685fSBram Moolenaar  delete('Xdidit')
2838e3d4685fSBram Moolenaarenddef
2839e3d4685fSBram Moolenaar
2840f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2841*cfcd011fSBram Moolenaar  var lines =<< trim END
2842*cfcd011fSBram Moolenaar    var name: any
2843*cfcd011fSBram Moolenaar    assert_equal(0, name)
2844f0afd9e1SBram Moolenaar  END
2845f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2846f0afd9e1SBram Moolenaarenddef
2847f0afd9e1SBram Moolenaar
28487e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
284958dbef33SBram Moolenaar  CheckRunVimInTerminal
285058dbef33SBram Moolenaar
28517e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
28527e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
28537e9210eaSBram Moolenaarendfunc
28547e9210eaSBram Moolenaar
28557e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
28569c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2857*cfcd011fSBram Moolenaar  var lines =<< trim END
28589c4f5520SBram Moolenaar    func CheckAndQuit()
28599c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
28609c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
28619c4f5520SBram Moolenaar    endfunc
28629c4f5520SBram Moolenaar  END
28639c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
28649c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2865*cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6})
28669c4f5520SBram Moolenaar  # define Afunc() on the command line
28679c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
28689c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
28699c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
28709c4f5520SBram Moolenaar
28719c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
28729c4f5520SBram Moolenaar  delete('XcallFunc')
28739c4f5520SBram Moolenaar  delete('Xdidcmd')
28749c4f5520SBram Moolenaarenddef
28759c4f5520SBram Moolenaar
2876585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2877585fea7bSBram Moolenaardef Test_substitute_cmd()
2878585fea7bSBram Moolenaar  new
2879585fea7bSBram Moolenaar  setline(1, 'something')
2880585fea7bSBram Moolenaar  :substitute(some(other(
2881585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2882585fea7bSBram Moolenaar  bwipe!
2883585fea7bSBram Moolenaar
2884f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2885*cfcd011fSBram Moolenaar  var lines =<< trim END
2886585fea7bSBram Moolenaar    vim9script
2887585fea7bSBram Moolenaar    new
2888585fea7bSBram Moolenaar    setline(1, 'something')
2889585fea7bSBram Moolenaar    :substitute(some(other(
2890585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2891585fea7bSBram Moolenaar    bwipe!
2892585fea7bSBram Moolenaar  END
2893585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2894585fea7bSBram Moolenaar  source Xvim9lines
2895585fea7bSBram Moolenaar
2896585fea7bSBram Moolenaar  delete('Xvim9lines')
2897585fea7bSBram Moolenaarenddef
2898585fea7bSBram Moolenaar
28998a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2900