18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25c2af0affSBram Moolenaar  bwipe!
265d72ce69SBram Moolenaarenddef
275d72ce69SBram Moolenaar
28a6e67e4fSBram Moolenaarlet g:alist = [7]
29a6e67e4fSBram Moolenaarlet g:astring = 'text'
30f0b9f43cSBram Moolenaarlet g:anumber = 123
316e587dcbSBram Moolenaar
324c17ad94SBram Moolenaardef Test_delfunction()
33f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
344c17ad94SBram Moolenaar  CheckScriptSuccess([
354c17ad94SBram Moolenaar      'vim9script',
364c17ad94SBram Moolenaar      'func CheckMe()',
374c17ad94SBram Moolenaar      '  return 123',
384c17ad94SBram Moolenaar      'endfunc',
394c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
404c17ad94SBram Moolenaar      ])
414c17ad94SBram Moolenaar
42f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
434c17ad94SBram Moolenaar  CheckScriptFailure([
444c17ad94SBram Moolenaar      'vim9script',
454c17ad94SBram Moolenaar      'func DeleteMe1()',
464c17ad94SBram Moolenaar      'endfunc',
474c17ad94SBram Moolenaar      'delfunction DeleteMe1',
484c17ad94SBram Moolenaar      ], 'E1084:')
494c17ad94SBram Moolenaar  CheckScriptFailure([
504c17ad94SBram Moolenaar      'vim9script',
514c17ad94SBram Moolenaar      'func DeleteMe2()',
524c17ad94SBram Moolenaar      'endfunc',
534c17ad94SBram Moolenaar      'def DoThat()',
544c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
554c17ad94SBram Moolenaar      'enddef',
564c17ad94SBram Moolenaar      'DoThat()',
574c17ad94SBram Moolenaar      ], 'E1084:')
584c17ad94SBram Moolenaar  CheckScriptFailure([
594c17ad94SBram Moolenaar      'vim9script',
604c17ad94SBram Moolenaar      'def DeleteMe3()',
614c17ad94SBram Moolenaar      'enddef',
624c17ad94SBram Moolenaar      'delfunction DeleteMe3',
634c17ad94SBram Moolenaar      ], 'E1084:')
644c17ad94SBram Moolenaar  CheckScriptFailure([
654c17ad94SBram Moolenaar      'vim9script',
664c17ad94SBram Moolenaar      'def DeleteMe4()',
674c17ad94SBram Moolenaar      'enddef',
684c17ad94SBram Moolenaar      'def DoThat()',
694c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
704c17ad94SBram Moolenaar      'enddef',
714c17ad94SBram Moolenaar      'DoThat()',
724c17ad94SBram Moolenaar      ], 'E1084:')
73925e9fd6SBram Moolenaar
74925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
75cfcd011fSBram Moolenaar  var lines =<< trim END
76925e9fd6SBram Moolenaar      vim9script
77925e9fd6SBram Moolenaar      def g:Global(): string
78925e9fd6SBram Moolenaar        return "yes"
79925e9fd6SBram Moolenaar      enddef
80925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
81925e9fd6SBram Moolenaar      def! g:Global(): string
82925e9fd6SBram Moolenaar        return "no"
83925e9fd6SBram Moolenaar      enddef
84925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
85925e9fd6SBram Moolenaar      delfunc g:Global
86925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
87925e9fd6SBram Moolenaar  END
88925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
91925e9fd6SBram Moolenaar  lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      func g:Global()
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      endfunc
96925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
97925e9fd6SBram Moolenaar      def! g:Global(): string
98925e9fd6SBram Moolenaar        return "no"
99925e9fd6SBram Moolenaar      enddef
100925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
101925e9fd6SBram Moolenaar      delfunc g:Global
102925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
103925e9fd6SBram Moolenaar  END
104925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
105925e9fd6SBram Moolenaar
106925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      def g:Global(): string
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      enddef
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      func! g:Global()
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      endfunc
116925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
117925e9fd6SBram Moolenaar      delfunc g:Global
118925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
119925e9fd6SBram Moolenaar  END
120925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1214c17ad94SBram Moolenaarenddef
1224c17ad94SBram Moolenaar
12308052228SBram Moolenaardef Test_wrong_type()
124cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
125cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
126cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
127cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
128599c89c8SBram Moolenaar
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13142a480bfSBram Moolenaar
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
133cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
136cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
143a0a9f43aSBram Moolenaar
144cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
14608052228SBram Moolenaarenddef
1478a7d6542SBram Moolenaar
14810c65860SBram Moolenaardef Test_script_wrong_type()
14910c65860SBram Moolenaar  var lines =<< trim END
15010c65860SBram Moolenaar      vim9script
15110c65860SBram Moolenaar      var s:dict: dict<string>
15210c65860SBram Moolenaar      s:dict['a'] = ['x']
15310c65860SBram Moolenaar  END
15410c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
15510c65860SBram Moolenaarenddef
15610c65860SBram Moolenaar
15708052228SBram Moolenaardef Test_const()
158cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
160cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16130fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16230fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
163dbeecb2bSBram Moolenaar
164cfcd011fSBram Moolenaar  var lines =<< trim END
16530fd8204SBram Moolenaar    final list = [1, 2, 3]
166dbeecb2bSBram Moolenaar    list[0] = 4
1670b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
16830fd8204SBram Moolenaar    const other = [5, 6, 7]
1690b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17071abe482SBram Moolenaar
171cfcd011fSBram Moolenaar    var varlist = [7, 8]
17230fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17371abe482SBram Moolenaar    varlist[0] = 77
17471abe482SBram Moolenaar    # TODO: does not work yet
17571abe482SBram Moolenaar    # constlist[1][1] = 88
176cfcd011fSBram Moolenaar    var cl = constlist[1]
17771abe482SBram Moolenaar    cl[1] = 88
17871abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
17971abe482SBram Moolenaar
180cfcd011fSBram Moolenaar    var vardict = #{five: 5, six: 6}
18130fd8204SBram Moolenaar    const constdict = #{one: 1, two: vardict, three: 3}
18271abe482SBram Moolenaar    vardict['five'] = 55
18371abe482SBram Moolenaar    # TODO: does not work yet
18471abe482SBram Moolenaar    # constdict['two']['six'] = 66
185cfcd011fSBram Moolenaar    var cd = constdict['two']
18671abe482SBram Moolenaar    cd['six'] = 66
18771abe482SBram Moolenaar    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
188dbeecb2bSBram Moolenaar  END
189dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19008052228SBram Moolenaarenddef
1918a7d6542SBram Moolenaar
1920b4c66c6SBram Moolenaardef Test_const_bang()
193cfcd011fSBram Moolenaar  var lines =<< trim END
19430fd8204SBram Moolenaar      const var = 234
1950b4c66c6SBram Moolenaar      var = 99
1960b4c66c6SBram Moolenaar  END
1970b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
1980b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
1990b4c66c6SBram Moolenaar
2000b4c66c6SBram Moolenaar  lines =<< trim END
20130fd8204SBram Moolenaar      const ll = [2, 3, 4]
2020b4c66c6SBram Moolenaar      ll[0] = 99
2030b4c66c6SBram Moolenaar  END
2040b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2050b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2060b4c66c6SBram Moolenaar
2070b4c66c6SBram Moolenaar  lines =<< trim END
20830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2090b4c66c6SBram Moolenaar      ll[3] = 99
2100b4c66c6SBram Moolenaar  END
2110b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2120b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2130b4c66c6SBram Moolenaar
2140b4c66c6SBram Moolenaar  lines =<< trim END
21530fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2160b4c66c6SBram Moolenaar      dd["one"] = 99
2170b4c66c6SBram Moolenaar  END
2180b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2190b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2200b4c66c6SBram Moolenaar
2210b4c66c6SBram Moolenaar  lines =<< trim END
22230fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2230b4c66c6SBram Moolenaar      dd["three"] = 99
2240b4c66c6SBram Moolenaar  END
2250b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2260b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2270b4c66c6SBram Moolenaarenddef
2280b4c66c6SBram Moolenaar
229df069eecSBram Moolenaardef Test_range_no_colon()
230d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
231d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
232d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
233d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
234df069eecSBram Moolenaarenddef
235df069eecSBram Moolenaar
236df069eecSBram Moolenaar
2378a7d6542SBram Moolenaardef Test_block()
238cfcd011fSBram Moolenaar  var outer = 1
2398a7d6542SBram Moolenaar  {
240cfcd011fSBram Moolenaar    var inner = 2
2418a7d6542SBram Moolenaar    assert_equal(1, outer)
2428a7d6542SBram Moolenaar    assert_equal(2, inner)
2438a7d6542SBram Moolenaar  }
2448a7d6542SBram Moolenaar  assert_equal(1, outer)
2458a7d6542SBram Moolenaarenddef
2468a7d6542SBram Moolenaar
24708052228SBram Moolenaardef Test_block_failure()
248cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
24908052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25008052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25108052228SBram Moolenaarenddef
2528a7d6542SBram Moolenaar
253fbbcd003SBram Moolenaardef Test_block_local_vars()
254fbbcd003SBram Moolenaar  var lines =<< trim END
255fbbcd003SBram Moolenaar      vim9script
256ed234f24SBram Moolenaar      v:testing = 1
257fbbcd003SBram Moolenaar      if true
258ed234f24SBram Moolenaar        var text = ['hello']
259ed234f24SBram Moolenaar        def SayHello(): list<string>
260fbbcd003SBram Moolenaar          return text
261fbbcd003SBram Moolenaar        enddef
262fbbcd003SBram Moolenaar        def SetText(v: string)
263ed234f24SBram Moolenaar          text = [v]
264fbbcd003SBram Moolenaar        enddef
265fbbcd003SBram Moolenaar      endif
266fbbcd003SBram Moolenaar
267fbbcd003SBram Moolenaar      if true
268ed234f24SBram Moolenaar        var text = ['again']
269ed234f24SBram Moolenaar        def SayAgain(): list<string>
270fbbcd003SBram Moolenaar          return text
271fbbcd003SBram Moolenaar        enddef
272fbbcd003SBram Moolenaar      endif
273ed234f24SBram Moolenaar
274ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
275ed234f24SBram Moolenaar      test_garbagecollect_now()
276ed234f24SBram Moolenaar
277fbbcd003SBram Moolenaar      defcompile
278fbbcd003SBram Moolenaar
279ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
280ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
281fbbcd003SBram Moolenaar
282fbbcd003SBram Moolenaar      SetText('foobar')
283ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
284ed234f24SBram Moolenaar
285ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
286ed234f24SBram Moolenaar      qall!
287fbbcd003SBram Moolenaar  END
288ed234f24SBram Moolenaar
289ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
290ed234f24SBram Moolenaar  # context gets garbage collected.
291ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
292ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
293ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
294ed234f24SBram Moolenaar
295ed234f24SBram Moolenaar  delete('Xscript')
296ed234f24SBram Moolenaar  delete('Xdidit')
297fbbcd003SBram Moolenaarenddef
298fbbcd003SBram Moolenaar
299d032f34aSBram Moolenaarfunc g:NoSuchFunc()
300d032f34aSBram Moolenaar  echo 'none'
301d032f34aSBram Moolenaarendfunc
302d032f34aSBram Moolenaar
3038a7d6542SBram Moolenaardef Test_try_catch()
304cfcd011fSBram Moolenaar  var l = []
3057a092245SBram Moolenaar  try # comment
3068a7d6542SBram Moolenaar    add(l, '1')
3078a7d6542SBram Moolenaar    throw 'wrong'
3088a7d6542SBram Moolenaar    add(l, '2')
3097a092245SBram Moolenaar  catch # comment
3108a7d6542SBram Moolenaar    add(l, v:exception)
3117a092245SBram Moolenaar  finally # comment
3128a7d6542SBram Moolenaar    add(l, '3')
3137a092245SBram Moolenaar  endtry # comment
3148a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
31568d130c6SBram Moolenaar
316e859312eSBram Moolenaar  l = []
317e859312eSBram Moolenaar  try
318e859312eSBram Moolenaar    try
319e859312eSBram Moolenaar      add(l, '1')
320e859312eSBram Moolenaar      throw 'wrong'
321e859312eSBram Moolenaar      add(l, '2')
322e859312eSBram Moolenaar    catch /right/
323e859312eSBram Moolenaar      add(l, v:exception)
324e859312eSBram Moolenaar    endtry
325e859312eSBram Moolenaar  catch /wrong/
326e859312eSBram Moolenaar    add(l, 'caught')
327373863edSBram Moolenaar  fina
328e859312eSBram Moolenaar    add(l, 'finally')
329e859312eSBram Moolenaar  endtry
330e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
331e859312eSBram Moolenaar
332cfcd011fSBram Moolenaar  var n: number
33368d130c6SBram Moolenaar  try
33468d130c6SBram Moolenaar    n = l[3]
33568d130c6SBram Moolenaar  catch /E684:/
33668d130c6SBram Moolenaar    n = 99
33768d130c6SBram Moolenaar  endtry
33868d130c6SBram Moolenaar  assert_equal(99, n)
33968d130c6SBram Moolenaar
34068d130c6SBram Moolenaar  try
341cc673e74SBram Moolenaar    # string slice returns a string, not a number
34268d130c6SBram Moolenaar    n = g:astring[3]
3435e654230SBram Moolenaar  catch /E1012:/
34468d130c6SBram Moolenaar    n = 77
34568d130c6SBram Moolenaar  endtry
34668d130c6SBram Moolenaar  assert_equal(77, n)
34768d130c6SBram Moolenaar
34868d130c6SBram Moolenaar  try
34968d130c6SBram Moolenaar    n = l[g:astring]
3505e654230SBram Moolenaar  catch /E1012:/
35156acb094SBram Moolenaar    n = 88
35268d130c6SBram Moolenaar  endtry
35356acb094SBram Moolenaar  assert_equal(88, n)
35468d130c6SBram Moolenaar
35568d130c6SBram Moolenaar  try
35668d130c6SBram Moolenaar    n = s:does_not_exist
35768d130c6SBram Moolenaar  catch /E121:/
358f0b9f43cSBram Moolenaar    n = 111
359f0b9f43cSBram Moolenaar  endtry
360f0b9f43cSBram Moolenaar  assert_equal(111, n)
361f0b9f43cSBram Moolenaar
362f0b9f43cSBram Moolenaar  try
363f0b9f43cSBram Moolenaar    n = g:does_not_exist
364f0b9f43cSBram Moolenaar  catch /E121:/
36568d130c6SBram Moolenaar    n = 121
36668d130c6SBram Moolenaar  endtry
36768d130c6SBram Moolenaar  assert_equal(121, n)
36868d130c6SBram Moolenaar
369cfcd011fSBram Moolenaar  var d = #{one: 1}
37068d130c6SBram Moolenaar  try
37168d130c6SBram Moolenaar    n = d[g:astring]
37268d130c6SBram Moolenaar  catch /E716:/
37368d130c6SBram Moolenaar    n = 222
37468d130c6SBram Moolenaar  endtry
37568d130c6SBram Moolenaar  assert_equal(222, n)
376f0b9f43cSBram Moolenaar
377f0b9f43cSBram Moolenaar  try
378f0b9f43cSBram Moolenaar    n = -g:astring
379f0b9f43cSBram Moolenaar  catch /E39:/
380f0b9f43cSBram Moolenaar    n = 233
381f0b9f43cSBram Moolenaar  endtry
382f0b9f43cSBram Moolenaar  assert_equal(233, n)
383f0b9f43cSBram Moolenaar
384f0b9f43cSBram Moolenaar  try
385f0b9f43cSBram Moolenaar    n = +g:astring
386f0b9f43cSBram Moolenaar  catch /E1030:/
387f0b9f43cSBram Moolenaar    n = 244
388f0b9f43cSBram Moolenaar  endtry
389f0b9f43cSBram Moolenaar  assert_equal(244, n)
390f0b9f43cSBram Moolenaar
391f0b9f43cSBram Moolenaar  try
392f0b9f43cSBram Moolenaar    n = +g:alist
393f0b9f43cSBram Moolenaar  catch /E745:/
394f0b9f43cSBram Moolenaar    n = 255
395f0b9f43cSBram Moolenaar  endtry
396f0b9f43cSBram Moolenaar  assert_equal(255, n)
397f0b9f43cSBram Moolenaar
398cfcd011fSBram Moolenaar  var nd: dict<any>
399f0b9f43cSBram Moolenaar  try
400f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
4015e654230SBram Moolenaar  catch /E1012:/
402f0b9f43cSBram Moolenaar    n = 266
403f0b9f43cSBram Moolenaar  endtry
404f0b9f43cSBram Moolenaar  assert_equal(266, n)
405f0b9f43cSBram Moolenaar
406f0b9f43cSBram Moolenaar  try
407f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
408f0b9f43cSBram Moolenaar  catch /E1093:/
409f0b9f43cSBram Moolenaar    n = 277
410f0b9f43cSBram Moolenaar  endtry
411f0b9f43cSBram Moolenaar  assert_equal(277, n)
412f0b9f43cSBram Moolenaar
413e859312eSBram Moolenaar  try
414e859312eSBram Moolenaar    &ts = g:astring
4155e654230SBram Moolenaar  catch /E1012:/
416e859312eSBram Moolenaar    n = 288
417e859312eSBram Moolenaar  endtry
418e859312eSBram Moolenaar  assert_equal(288, n)
419e859312eSBram Moolenaar
420e859312eSBram Moolenaar  try
421e859312eSBram Moolenaar    &backspace = 'asdf'
422e859312eSBram Moolenaar  catch /E474:/
423e859312eSBram Moolenaar    n = 299
424e859312eSBram Moolenaar  endtry
425e859312eSBram Moolenaar  assert_equal(299, n)
426e859312eSBram Moolenaar
427e859312eSBram Moolenaar  l = [1]
428e859312eSBram Moolenaar  try
429e859312eSBram Moolenaar    l[3] = 3
430e859312eSBram Moolenaar  catch /E684:/
431e859312eSBram Moolenaar    n = 300
432e859312eSBram Moolenaar  endtry
433e859312eSBram Moolenaar  assert_equal(300, n)
434e859312eSBram Moolenaar
435e859312eSBram Moolenaar  try
436e859312eSBram Moolenaar    unlet g:does_not_exist
437e859312eSBram Moolenaar  catch /E108:/
438e859312eSBram Moolenaar    n = 322
439e859312eSBram Moolenaar  endtry
440e859312eSBram Moolenaar  assert_equal(322, n)
441e859312eSBram Moolenaar
442e859312eSBram Moolenaar  try
443e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
444e859312eSBram Moolenaar  catch /E721:/
445e859312eSBram Moolenaar    n = 333
446e859312eSBram Moolenaar  endtry
447e859312eSBram Moolenaar  assert_equal(333, n)
448e859312eSBram Moolenaar
449e859312eSBram Moolenaar  try
450e859312eSBram Moolenaar    l = DeletedFunc()
451e859312eSBram Moolenaar  catch /E933:/
452e859312eSBram Moolenaar    n = 344
453e859312eSBram Moolenaar  endtry
454e859312eSBram Moolenaar  assert_equal(344, n)
455d032f34aSBram Moolenaar
456d032f34aSBram Moolenaar  try
457d032f34aSBram Moolenaar    echo len(v:true)
458d032f34aSBram Moolenaar  catch /E701:/
459d032f34aSBram Moolenaar    n = 355
460d032f34aSBram Moolenaar  endtry
461d032f34aSBram Moolenaar  assert_equal(355, n)
462d032f34aSBram Moolenaar
463cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
464d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
465d032f34aSBram Moolenaar  try
466d032f34aSBram Moolenaar    echo P()
467d032f34aSBram Moolenaar  catch /E117:/
468d032f34aSBram Moolenaar    n = 366
469d032f34aSBram Moolenaar  endtry
470d032f34aSBram Moolenaar  assert_equal(366, n)
471d032f34aSBram Moolenaar
472d032f34aSBram Moolenaar  try
473d032f34aSBram Moolenaar    echo g:NoSuchFunc()
474d032f34aSBram Moolenaar  catch /E117:/
475d032f34aSBram Moolenaar    n = 377
476d032f34aSBram Moolenaar  endtry
477d032f34aSBram Moolenaar  assert_equal(377, n)
478d032f34aSBram Moolenaar
479d032f34aSBram Moolenaar  try
480d032f34aSBram Moolenaar    echo g:alist + 4
481d032f34aSBram Moolenaar  catch /E745:/
482d032f34aSBram Moolenaar    n = 388
483d032f34aSBram Moolenaar  endtry
484d032f34aSBram Moolenaar  assert_equal(388, n)
485d032f34aSBram Moolenaar
486d032f34aSBram Moolenaar  try
487d032f34aSBram Moolenaar    echo 4 + g:alist
488d032f34aSBram Moolenaar  catch /E745:/
489d032f34aSBram Moolenaar    n = 399
490d032f34aSBram Moolenaar  endtry
491d032f34aSBram Moolenaar  assert_equal(399, n)
492d032f34aSBram Moolenaar
493d032f34aSBram Moolenaar  try
494d032f34aSBram Moolenaar    echo g:alist.member
495d032f34aSBram Moolenaar  catch /E715:/
496d032f34aSBram Moolenaar    n = 400
497d032f34aSBram Moolenaar  endtry
498d032f34aSBram Moolenaar  assert_equal(400, n)
499d032f34aSBram Moolenaar
500d032f34aSBram Moolenaar  try
501d032f34aSBram Moolenaar    echo d.member
502d032f34aSBram Moolenaar  catch /E716:/
503d032f34aSBram Moolenaar    n = 411
504d032f34aSBram Moolenaar  endtry
505d032f34aSBram Moolenaar  assert_equal(411, n)
5068a7d6542SBram Moolenaarenddef
5078a7d6542SBram Moolenaar
508e859312eSBram Moolenaardef DeletedFunc(): list<any>
509e859312eSBram Moolenaar  return ['delete me']
510e859312eSBram Moolenaarenddef
511e859312eSBram Moolenaardefcompile
512e859312eSBram Moolenaardelfunc DeletedFunc
513e859312eSBram Moolenaar
514257cc5eeSBram Moolenaardef ThrowFromDef()
515a72cfb80SBram Moolenaar  throw "getout" # comment
516257cc5eeSBram Moolenaarenddef
517257cc5eeSBram Moolenaar
518257cc5eeSBram Moolenaarfunc CatchInFunc()
519257cc5eeSBram Moolenaar  try
520257cc5eeSBram Moolenaar    call ThrowFromDef()
521257cc5eeSBram Moolenaar  catch
522257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
523257cc5eeSBram Moolenaar  endtry
524257cc5eeSBram Moolenaarendfunc
525257cc5eeSBram Moolenaar
526257cc5eeSBram Moolenaardef CatchInDef()
527257cc5eeSBram Moolenaar  try
528257cc5eeSBram Moolenaar    ThrowFromDef()
529257cc5eeSBram Moolenaar  catch
530257cc5eeSBram Moolenaar    g:thrown_def = v:exception
531257cc5eeSBram Moolenaar  endtry
532257cc5eeSBram Moolenaarenddef
533257cc5eeSBram Moolenaar
534f575adffSBram Moolenaardef ReturnFinally(): string
535f575adffSBram Moolenaar  try
536f575adffSBram Moolenaar    return 'intry'
537373863edSBram Moolenaar  finall
538f575adffSBram Moolenaar    g:in_finally = 'finally'
539f575adffSBram Moolenaar  endtry
540f575adffSBram Moolenaar  return 'end'
541f575adffSBram Moolenaarenddef
542f575adffSBram Moolenaar
543257cc5eeSBram Moolenaardef Test_try_catch_nested()
544257cc5eeSBram Moolenaar  CatchInFunc()
545257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
546257cc5eeSBram Moolenaar
547257cc5eeSBram Moolenaar  CatchInDef()
548257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
549f575adffSBram Moolenaar
550f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
551f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
552f575adffSBram Moolenaarenddef
553f575adffSBram Moolenaar
5549939f57bSBram Moolenaardef TryOne(): number
5559939f57bSBram Moolenaar  try
5569939f57bSBram Moolenaar    return 0
5579939f57bSBram Moolenaar  catch
5589939f57bSBram Moolenaar  endtry
5599939f57bSBram Moolenaar  return 0
5609939f57bSBram Moolenaarenddef
5619939f57bSBram Moolenaar
5629939f57bSBram Moolenaardef TryTwo(n: number): string
5639939f57bSBram Moolenaar  try
564cfcd011fSBram Moolenaar    var x = {}
5659939f57bSBram Moolenaar  catch
5669939f57bSBram Moolenaar  endtry
5679939f57bSBram Moolenaar  return 'text'
5689939f57bSBram Moolenaarenddef
5699939f57bSBram Moolenaar
5709939f57bSBram Moolenaardef Test_try_catch_twice()
5719939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5729939f57bSBram Moolenaarenddef
5739939f57bSBram Moolenaar
574f575adffSBram Moolenaardef Test_try_catch_match()
575cfcd011fSBram Moolenaar  var seq = 'a'
576f575adffSBram Moolenaar  try
577f575adffSBram Moolenaar    throw 'something'
578f575adffSBram Moolenaar  catch /nothing/
579f575adffSBram Moolenaar    seq ..= 'x'
580f575adffSBram Moolenaar  catch /some/
581f575adffSBram Moolenaar    seq ..= 'b'
582f575adffSBram Moolenaar  catch /asdf/
583f575adffSBram Moolenaar    seq ..= 'x'
584e8c4abbbSBram Moolenaar  catch ?a\?sdf?
585e8c4abbbSBram Moolenaar    seq ..= 'y'
586f575adffSBram Moolenaar  finally
587f575adffSBram Moolenaar    seq ..= 'c'
588f575adffSBram Moolenaar  endtry
589f575adffSBram Moolenaar  assert_equal('abc', seq)
590257cc5eeSBram Moolenaarenddef
591257cc5eeSBram Moolenaar
592e8c4abbbSBram Moolenaardef Test_try_catch_fails()
593d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
594d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
595d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
596d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
597d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
598d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
599d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
600d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
60113106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
602d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
603585fea7bSBram Moolenaar
604d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
605d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
606e8c4abbbSBram Moolenaarenddef
607e8c4abbbSBram Moolenaar
608006ad48bSBram Moolenaardef Test_throw_vimscript()
609f5be8cdbSBram Moolenaar  # only checks line continuation
610cfcd011fSBram Moolenaar  var lines =<< trim END
611006ad48bSBram Moolenaar      vim9script
612006ad48bSBram Moolenaar      try
613006ad48bSBram Moolenaar        throw 'one'
614006ad48bSBram Moolenaar              .. 'two'
615006ad48bSBram Moolenaar      catch
616006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
617006ad48bSBram Moolenaar      endtry
618006ad48bSBram Moolenaar  END
619006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
620*1e021e63SBram Moolenaar
621*1e021e63SBram Moolenaar  lines =<< trim END
622*1e021e63SBram Moolenaar    vim9script
623*1e021e63SBram Moolenaar    def Func()
624*1e021e63SBram Moolenaar      throw @r
625*1e021e63SBram Moolenaar    enddef
626*1e021e63SBram Moolenaar    var result = ''
627*1e021e63SBram Moolenaar    try
628*1e021e63SBram Moolenaar      Func()
629*1e021e63SBram Moolenaar    catch /E1129:/
630*1e021e63SBram Moolenaar      result = 'caught'
631*1e021e63SBram Moolenaar    endtry
632*1e021e63SBram Moolenaar    assert_equal('caught', result)
633*1e021e63SBram Moolenaar  END
634*1e021e63SBram Moolenaar  CheckScriptSuccess(lines)
635006ad48bSBram Moolenaarenddef
636006ad48bSBram Moolenaar
637ed677f55SBram Moolenaardef Test_error_in_nested_function()
638ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
639cfcd011fSBram Moolenaar  var lines =<< trim END
640ed677f55SBram Moolenaar      vim9script
641ed677f55SBram Moolenaar      def Func()
642ed677f55SBram Moolenaar        Error()
643ed677f55SBram Moolenaar        g:test_var = 1
644ed677f55SBram Moolenaar      enddef
645ed677f55SBram Moolenaar      func Error() abort
646ed677f55SBram Moolenaar        eval [][0]
647ed677f55SBram Moolenaar      endfunc
648ed677f55SBram Moolenaar      Func()
649ed677f55SBram Moolenaar  END
650ed677f55SBram Moolenaar  g:test_var = 0
651ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
652ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
653ed677f55SBram Moolenaarenddef
654ed677f55SBram Moolenaar
65537c83711SBram Moolenaardef Test_cexpr_vimscript()
656f5be8cdbSBram Moolenaar  # only checks line continuation
65737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
658cfcd011fSBram Moolenaar  var lines =<< trim END
65937c83711SBram Moolenaar      vim9script
66037c83711SBram Moolenaar      cexpr 'File'
66137c83711SBram Moolenaar                .. ' someFile' ..
66237c83711SBram Moolenaar                   ' line 19'
66337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
66437c83711SBram Moolenaar  END
66537c83711SBram Moolenaar  CheckScriptSuccess(lines)
66637c83711SBram Moolenaar  set errorformat&
66737c83711SBram Moolenaarenddef
66837c83711SBram Moolenaar
669c9edd6b5SBram Moolenaardef Test_statusline_syntax()
670c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
671cfcd011fSBram Moolenaar  var lines =<< trim END
672c9edd6b5SBram Moolenaar      vim9script
673c9edd6b5SBram Moolenaar      func g:Status()
674c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
675c9edd6b5SBram Moolenaar      endfunc
676c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
677c9edd6b5SBram Moolenaar      redrawstatus
678c9edd6b5SBram Moolenaar      set laststatus statusline=
679c9edd6b5SBram Moolenaar  END
680c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
681c9edd6b5SBram Moolenaarenddef
682c9edd6b5SBram Moolenaar
683b209750bSBram Moolenaardef Test_list_vimscript()
684b209750bSBram Moolenaar  # checks line continuation and comments
685cfcd011fSBram Moolenaar  var lines =<< trim END
686b209750bSBram Moolenaar      vim9script
687cfcd011fSBram Moolenaar      var mylist = [
688b209750bSBram Moolenaar            'one',
689b209750bSBram Moolenaar            # comment
690b209750bSBram Moolenaar            'two', # empty line follows
691b209750bSBram Moolenaar
692b209750bSBram Moolenaar            'three',
693b209750bSBram Moolenaar            ]
694b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
695b209750bSBram Moolenaar  END
696b209750bSBram Moolenaar  CheckScriptSuccess(lines)
69766250c93SBram Moolenaar
69866250c93SBram Moolenaar  # check all lines from heredoc are kept
69966250c93SBram Moolenaar  lines =<< trim END
70066250c93SBram Moolenaar      # comment 1
70166250c93SBram Moolenaar      two
70266250c93SBram Moolenaar      # comment 3
70366250c93SBram Moolenaar
70466250c93SBram Moolenaar      five
70566250c93SBram Moolenaar      # comment 6
70666250c93SBram Moolenaar  END
70766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
708b209750bSBram Moolenaarenddef
709b209750bSBram Moolenaar
7102a1381c3SBram Moolenaarif has('channel')
71140ee466cSBram Moolenaar  let someJob = test_null_job()
71240ee466cSBram Moolenaar
71340ee466cSBram Moolenaar  def FuncWithError()
71440ee466cSBram Moolenaar    echomsg g:someJob
71540ee466cSBram Moolenaar  enddef
71640ee466cSBram Moolenaar
71740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
71840ee466cSBram Moolenaar    try
71940ee466cSBram Moolenaar      call FuncWithError()
72040ee466cSBram Moolenaar    catch
72140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
72240ee466cSBram Moolenaar    endtry
72340ee466cSBram Moolenaar  endfunc
7242a1381c3SBram Moolenaarendif
72540ee466cSBram Moolenaar
7268a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7278a7d6542SBram Moolenaar  vim9script
728cfcd011fSBram Moolenaar  var name: string = 'bob'
7298a7d6542SBram Moolenaar  def Concat(arg: string): string
7308a7d6542SBram Moolenaar    return name .. arg
7318a7d6542SBram Moolenaar  enddef
732227a69deSBram Moolenaar  g:result = Concat('bie')
733227a69deSBram Moolenaar  g:localname = name
7348a7d6542SBram Moolenaar
7358a7d6542SBram Moolenaar  export const CONST = 1234
736cfcd011fSBram Moolenaar  export var exported = 9876
737cfcd011fSBram Moolenaar  export var exp_name = 'John'
7388a7d6542SBram Moolenaar  export def Exported(): string
7398a7d6542SBram Moolenaar    return 'Exported'
7408a7d6542SBram Moolenaar  enddef
7418a7d6542SBram MoolenaarEND
7428a7d6542SBram Moolenaar
743b3ca9824SBram Moolenaardef Undo_export_script_lines()
744b3ca9824SBram Moolenaar  unlet g:result
745b3ca9824SBram Moolenaar  unlet g:localname
746b3ca9824SBram Moolenaarenddef
747b3ca9824SBram Moolenaar
7485269bd2aSBram Moolenaardef Test_vim9_import_export()
749cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7508a7d6542SBram Moolenaar    vim9script
7518a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7528a7d6542SBram Moolenaar    g:imported = exported
7536e587dcbSBram Moolenaar    exported += 3
7546e587dcbSBram Moolenaar    g:imported_added = exported
7558a7d6542SBram Moolenaar    g:imported_func = Exported()
7566e587dcbSBram Moolenaar
75740f4f7a4SBram Moolenaar    def GetExported(): string
758cfcd011fSBram Moolenaar      var local_dict = #{ref: Exported}
75940f4f7a4SBram Moolenaar      return local_dict.ref()
76040f4f7a4SBram Moolenaar    enddef
76140f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
76240f4f7a4SBram Moolenaar
7636e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7646e587dcbSBram Moolenaar    g:imported_name = exp_name
7656e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7666e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7675381c7a1SBram Moolenaar    g:imported_later = exported
7688a7d6542SBram Moolenaar  END
7698a7d6542SBram Moolenaar
7708a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7718a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7728a7d6542SBram Moolenaar
7738a7d6542SBram Moolenaar  source Ximport.vim
7748a7d6542SBram Moolenaar
7758a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7768a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7778a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7786e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7795381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
7808a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
78140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
7826e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
7836e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
7848a7d6542SBram Moolenaar  assert_false(exists('g:name'))
7858a7d6542SBram Moolenaar
786b3ca9824SBram Moolenaar  Undo_export_script_lines()
7878a7d6542SBram Moolenaar  unlet g:imported
7886e587dcbSBram Moolenaar  unlet g:imported_added
7895381c7a1SBram Moolenaar  unlet g:imported_later
7908a7d6542SBram Moolenaar  unlet g:imported_func
7916e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
7928a7d6542SBram Moolenaar  delete('Ximport.vim')
793f2d5c240SBram Moolenaar
7941c991144SBram Moolenaar  # similar, with line breaks
795cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
7961c991144SBram Moolenaar    vim9script
7971c991144SBram Moolenaar    import {
7981c991144SBram Moolenaar        exported,
7991c991144SBram Moolenaar        Exported,
8001c991144SBram Moolenaar        }
8011c991144SBram Moolenaar        from
8021c991144SBram Moolenaar        './Xexport.vim'
8031c991144SBram Moolenaar    g:imported = exported
8041c991144SBram Moolenaar    exported += 5
8051c991144SBram Moolenaar    g:imported_added = exported
8061c991144SBram Moolenaar    g:imported_func = Exported()
8071c991144SBram Moolenaar  END
8081c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8091c991144SBram Moolenaar  source Ximport_lbr.vim
8101c991144SBram Moolenaar
8111c991144SBram Moolenaar  assert_equal(9876, g:imported)
8121c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8131c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8141c991144SBram Moolenaar
8151c991144SBram Moolenaar  # exported script not sourced again
8161c991144SBram Moolenaar  assert_false(exists('g:result'))
8171c991144SBram Moolenaar  unlet g:imported
8181c991144SBram Moolenaar  unlet g:imported_added
8191c991144SBram Moolenaar  unlet g:imported_func
8201c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8211c991144SBram Moolenaar
8221c991144SBram Moolenaar  # import inside :def function
823cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8245381c7a1SBram Moolenaar    vim9script
8255381c7a1SBram Moolenaar    def ImportInDef()
8265381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8275381c7a1SBram Moolenaar      g:imported = exported
8285381c7a1SBram Moolenaar      exported += 7
8295381c7a1SBram Moolenaar      g:imported_added = exported
8305381c7a1SBram Moolenaar    enddef
8315381c7a1SBram Moolenaar    ImportInDef()
8325381c7a1SBram Moolenaar  END
8335381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8345381c7a1SBram Moolenaar  source Ximport2.vim
835f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8365381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8375381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8385381c7a1SBram Moolenaar  unlet g:imported
8395381c7a1SBram Moolenaar  unlet g:imported_added
8405381c7a1SBram Moolenaar  delete('Ximport2.vim')
8415381c7a1SBram Moolenaar
842cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
843f2d5c240SBram Moolenaar    vim9script
844f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
845f2d5c240SBram Moolenaar    def UseExport()
846f2d5c240SBram Moolenaar      g:imported = Export.exported
847f2d5c240SBram Moolenaar    enddef
848f2d5c240SBram Moolenaar    UseExport()
849f2d5c240SBram Moolenaar  END
850f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
851f2d5c240SBram Moolenaar  source Ximport.vim
8525381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
853f2d5c240SBram Moolenaar
854cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
855599c89c8SBram Moolenaar    vim9script
856599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
857599c89c8SBram Moolenaar    def Func()
858cfcd011fSBram Moolenaar      var dummy = 1
859cfcd011fSBram Moolenaar      var imported = Export + dummy
860599c89c8SBram Moolenaar    enddef
861822ba247SBram Moolenaar    defcompile
862599c89c8SBram Moolenaar  END
863599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
86444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
865599c89c8SBram Moolenaar
866cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
867599c89c8SBram Moolenaar    vim9script
868599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
869599c89c8SBram Moolenaar    def Func()
870cfcd011fSBram Moolenaar      var imported = Export . exported
871599c89c8SBram Moolenaar    enddef
872822ba247SBram Moolenaar    defcompile
873599c89c8SBram Moolenaar  END
874599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
87544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
876599c89c8SBram Moolenaar
877cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
878599c89c8SBram Moolenaar    vim9script
879599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
880599c89c8SBram Moolenaar    def Func()
881cfcd011fSBram Moolenaar      var imported = Export.
882599c89c8SBram Moolenaar    enddef
883822ba247SBram Moolenaar    defcompile
884599c89c8SBram Moolenaar  END
885599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
88644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
887599c89c8SBram Moolenaar
888cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
8891c991144SBram Moolenaar    vim9script
8901c991144SBram Moolenaar    import *
8911c991144SBram Moolenaar        as Export
8921c991144SBram Moolenaar        from
8931c991144SBram Moolenaar        './Xexport.vim'
8941c991144SBram Moolenaar    def UseExport()
8951c991144SBram Moolenaar      g:imported = Export.exported
8961c991144SBram Moolenaar    enddef
8971c991144SBram Moolenaar    UseExport()
8981c991144SBram Moolenaar  END
8991c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9001c991144SBram Moolenaar  source Ximport.vim
9011c991144SBram Moolenaar  assert_equal(9883, g:imported)
9021c991144SBram Moolenaar
903cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
904f2d5c240SBram Moolenaar    vim9script
905f2d5c240SBram Moolenaar    import * from './Xexport.vim'
906f2d5c240SBram Moolenaar  END
907f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
90844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
909f2d5c240SBram Moolenaar
910f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
911cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
912fa29c8abSBram Moolenaar    vim9script
913fa29c8abSBram Moolenaar    import name from './Xexport.vim'
914fa29c8abSBram Moolenaar  END
915fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
91644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
917fa29c8abSBram Moolenaar
918f5be8cdbSBram Moolenaar  # try to import something that is already defined
919cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9205269bd2aSBram Moolenaar    vim9script
921cfcd011fSBram Moolenaar    var exported = 'something'
9225269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9235269bd2aSBram Moolenaar  END
9245269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
92544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9265269bd2aSBram Moolenaar
927f5be8cdbSBram Moolenaar  # try to import something that is already defined
9285269bd2aSBram Moolenaar  import_already_defined =<< trim END
9295269bd2aSBram Moolenaar    vim9script
930cfcd011fSBram Moolenaar    var exported = 'something'
9315269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9325269bd2aSBram Moolenaar  END
9335269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
93444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9355269bd2aSBram Moolenaar
936f5be8cdbSBram Moolenaar  # try to import something that is already defined
9375269bd2aSBram Moolenaar  import_already_defined =<< trim END
9385269bd2aSBram Moolenaar    vim9script
939cfcd011fSBram Moolenaar    var exported = 'something'
9405269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9415269bd2aSBram Moolenaar  END
9425269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
94344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9445269bd2aSBram Moolenaar
945f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
946cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
947fa29c8abSBram Moolenaar    vim9script
948fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
949fa29c8abSBram Moolenaar  END
950fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
95144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
952fa29c8abSBram Moolenaar
953cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
954fa29c8abSBram Moolenaar    vim9script
955fa29c8abSBram Moolenaar    import name './Xexport.vim'
956fa29c8abSBram Moolenaar  END
957fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
95844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
959fa29c8abSBram Moolenaar
960cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
961fa29c8abSBram Moolenaar    vim9script
962fa29c8abSBram Moolenaar    import name from Xexport.vim
963fa29c8abSBram Moolenaar  END
964fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
96544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
966fa29c8abSBram Moolenaar
967cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
968fa29c8abSBram Moolenaar    vim9script
969fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
970fa29c8abSBram Moolenaar  END
971fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
97244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
973fa29c8abSBram Moolenaar
974cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
975fa29c8abSBram Moolenaar    vim9script
976fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
977fa29c8abSBram Moolenaar  END
9785269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
97944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
980fa29c8abSBram Moolenaar
981f2d5c240SBram Moolenaar  delete('Ximport.vim')
9825269bd2aSBram Moolenaar  delete('Ximport3.vim')
9838a7d6542SBram Moolenaar  delete('Xexport.vim')
9848a7d6542SBram Moolenaar
985f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
986750802b5SBram Moolenaar  set cpo&vi
987cfcd011fSBram Moolenaar  var cpo_before = &cpo
988cfcd011fSBram Moolenaar  var lines =<< trim END
989750802b5SBram Moolenaar    vim9script
990750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
991750802b5SBram Moolenaar  END
992750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
993750802b5SBram Moolenaar  source Xvim9_script
994750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
995750802b5SBram Moolenaar  set cpo&vim
996750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
997750802b5SBram Moolenaar  delete('Xvim9_script')
998750802b5SBram Moolenaarenddef
999750802b5SBram Moolenaar
1000803af686SBram Moolenaarfunc g:Trigger()
1001803af686SBram Moolenaar  source Ximport.vim
1002803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1003803af686SBram Moolenaarendfunc
1004803af686SBram Moolenaar
1005803af686SBram Moolenaardef Test_import_export_expr_map()
1006803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1007cfcd011fSBram Moolenaar  var export_lines =<< trim END
1008803af686SBram Moolenaar    vim9script
1009803af686SBram Moolenaar    export def That(): string
1010803af686SBram Moolenaar      return 'yes'
1011803af686SBram Moolenaar    enddef
1012803af686SBram Moolenaar  END
1013803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1014803af686SBram Moolenaar
1015cfcd011fSBram Moolenaar  var import_lines =<< trim END
1016803af686SBram Moolenaar    vim9script
1017803af686SBram Moolenaar    import That from './Xexport_that.vim'
1018803af686SBram Moolenaar    assert_equal('yes', That())
1019803af686SBram Moolenaar  END
1020803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1021803af686SBram Moolenaar
1022803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1023803af686SBram Moolenaar  feedkeys('trigger', "xt")
1024803af686SBram Moolenaar
1025730b2483SBram Moolenaar  delete('Xexport_that.vim')
1026803af686SBram Moolenaar  delete('Ximport.vim')
1027803af686SBram Moolenaar  nunmap trigger
1028803af686SBram Moolenaarenddef
1029803af686SBram Moolenaar
10308e1986e3SBram Moolenaardef Test_import_in_filetype()
10318e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10328e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1033cfcd011fSBram Moolenaar  var export_lines =<< trim END
10348e1986e3SBram Moolenaar    vim9script
1035cfcd011fSBram Moolenaar    export var That = 'yes'
10368e1986e3SBram Moolenaar  END
1037730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10388e1986e3SBram Moolenaar
1039cfcd011fSBram Moolenaar  var import_lines =<< trim END
10408e1986e3SBram Moolenaar    vim9script
1041730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10428e1986e3SBram Moolenaar    assert_equal('yes', That)
10438e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10448e1986e3SBram Moolenaar  END
10458e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10468e1986e3SBram Moolenaar
1047cfcd011fSBram Moolenaar  var save_rtp = &rtp
10488e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10498e1986e3SBram Moolenaar
10508e1986e3SBram Moolenaar  filetype plugin on
10518e1986e3SBram Moolenaar  copen
10528e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10538e1986e3SBram Moolenaar
10548e1986e3SBram Moolenaar  quit!
1055730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10568e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10578e1986e3SBram Moolenaar  &rtp = save_rtp
10588e1986e3SBram Moolenaarenddef
10598e1986e3SBram Moolenaar
1060efa94447SBram Moolenaardef Test_use_import_in_mapping()
1061cfcd011fSBram Moolenaar  var lines =<< trim END
1062efa94447SBram Moolenaar      vim9script
1063efa94447SBram Moolenaar      export def Funcx()
1064efa94447SBram Moolenaar        g:result = 42
1065efa94447SBram Moolenaar      enddef
1066efa94447SBram Moolenaar  END
1067efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1068efa94447SBram Moolenaar  lines =<< trim END
1069efa94447SBram Moolenaar      vim9script
1070efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1071b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1072efa94447SBram Moolenaar  END
1073efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1074efa94447SBram Moolenaar
1075efa94447SBram Moolenaar  source Xmapscript.vim
1076b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1077efa94447SBram Moolenaar  assert_equal(42, g:result)
1078efa94447SBram Moolenaar
1079efa94447SBram Moolenaar  unlet g:result
1080efa94447SBram Moolenaar  delete('XsomeExport.vim')
1081efa94447SBram Moolenaar  delete('Xmapscript.vim')
1082b3ca9824SBram Moolenaar  nunmap <F3>
1083efa94447SBram Moolenaarenddef
1084efa94447SBram Moolenaar
1085750802b5SBram Moolenaardef Test_vim9script_fails()
10868a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
10878a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1088cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
10899721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1090cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1091750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1092750802b5SBram Moolenaar
1093cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1094c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1095c785b9a7SBram Moolenaar
1096e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1097e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
10988a7d6542SBram Moolenaarenddef
10998a7d6542SBram Moolenaar
1100f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1101101f4810SBram Moolenaar  CheckRunVimInTerminal
1102101f4810SBram Moolenaar
11039bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1104c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11059bb3eb3eSBram Moolenaarendfunc
11069bb3eb3eSBram Moolenaar
1107c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1108cfcd011fSBram Moolenaar  var export =<< trim END
1109101f4810SBram Moolenaar    vim9script
1110101f4810SBram Moolenaar    export def Foo(): number
1111101f4810SBram Moolenaar        return 0
1112101f4810SBram Moolenaar    enddef
1113101f4810SBram Moolenaar  END
1114730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1115101f4810SBram Moolenaar
1116cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
11179bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11189bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1119101f4810SBram Moolenaar
1120730b2483SBram Moolenaar  delete('XexportCmd.vim')
11219bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11229bb3eb3eSBram Moolenaarenddef
1123101f4810SBram Moolenaar
11244c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1125cfcd011fSBram Moolenaar  var lines =<< trim END
11268a7d6542SBram Moolenaar    vim9script
11278a7d6542SBram Moolenaar    const var = ''
1128cfcd011fSBram Moolenaar    var valone = 1234
11298a7d6542SBram Moolenaar    def MyFunc(arg: string)
11308a7d6542SBram Moolenaar       valone = 5678
11318a7d6542SBram Moolenaar    enddef
11328a7d6542SBram Moolenaar  END
1133cfcd011fSBram Moolenaar  var morelines =<< trim END
1134cfcd011fSBram Moolenaar    var valtwo = 222
11358a7d6542SBram Moolenaar    export def GetValtwo(): number
11368a7d6542SBram Moolenaar      return valtwo
11378a7d6542SBram Moolenaar    enddef
11388a7d6542SBram Moolenaar  END
113903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11408a7d6542SBram Moolenaar  source Xreload.vim
11418a7d6542SBram Moolenaar  source Xreload.vim
11428a7d6542SBram Moolenaar  source Xreload.vim
11438a7d6542SBram Moolenaar
1144cfcd011fSBram Moolenaar  var testlines =<< trim END
11458a7d6542SBram Moolenaar    vim9script
11468a7d6542SBram Moolenaar    def TheFunc()
11478a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11488a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11498a7d6542SBram Moolenaar    enddef
11508a7d6542SBram Moolenaar    TheFunc()
11518a7d6542SBram Moolenaar  END
11528a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11538a7d6542SBram Moolenaar  source Ximport.vim
11548a7d6542SBram Moolenaar
1155f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1156f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11578a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11588a7d6542SBram Moolenaar  source Ximport.vim
11598a7d6542SBram Moolenaar
1160f5be8cdbSBram Moolenaar  # cannot declare a var twice
11618a7d6542SBram Moolenaar  lines =<< trim END
11628a7d6542SBram Moolenaar    vim9script
1163cfcd011fSBram Moolenaar    var valone = 1234
1164cfcd011fSBram Moolenaar    var valone = 5678
11658a7d6542SBram Moolenaar  END
11668a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
116744d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
11688a7d6542SBram Moolenaar
11698a7d6542SBram Moolenaar  delete('Xreload.vim')
11708a7d6542SBram Moolenaar  delete('Ximport.vim')
11718a7d6542SBram Moolenaarenddef
11728a7d6542SBram Moolenaar
117395006e3dSBram Moolenaardef s:RetSome(): string
117495006e3dSBram Moolenaar  return 'some'
117595006e3dSBram Moolenaarenddef
117695006e3dSBram Moolenaar
1177fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1178fe465a01SBram Moolenaar" script-local name.
1179fe465a01SBram Moolenaardef Test_vim9script_funcref()
1180cfcd011fSBram Moolenaar  var sortlines =<< trim END
1181fe465a01SBram Moolenaar      vim9script
1182fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1183bed36b93SBram Moolenaar        return i2 - i1
1184fe465a01SBram Moolenaar      enddef
1185fe465a01SBram Moolenaar
1186fe465a01SBram Moolenaar      export def FastSort(): list<number>
1187fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1188fe465a01SBram Moolenaar      enddef
1189fe465a01SBram Moolenaar  END
1190fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1191fe465a01SBram Moolenaar
1192cfcd011fSBram Moolenaar  var lines =<< trim END
1193fe465a01SBram Moolenaar    vim9script
1194fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1195fe465a01SBram Moolenaar    def Test()
1196fe465a01SBram Moolenaar      g:result = FastSort()
1197fe465a01SBram Moolenaar    enddef
1198fe465a01SBram Moolenaar    Test()
1199fe465a01SBram Moolenaar  END
1200fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1201fe465a01SBram Moolenaar
1202fe465a01SBram Moolenaar  source Xscript.vim
1203fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1204fe465a01SBram Moolenaar
1205fe465a01SBram Moolenaar  unlet g:result
1206fe465a01SBram Moolenaar  delete('Xsort.vim')
1207fe465a01SBram Moolenaar  delete('Xscript.vim')
120895006e3dSBram Moolenaar
1209cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
121095006e3dSBram Moolenaar  assert_equal('some', Funcref())
1211fe465a01SBram Moolenaarenddef
1212fe465a01SBram Moolenaar
1213601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1214601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1215601e76acSBram Moolenaar" function reference.
1216c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1217cfcd011fSBram Moolenaar  var filterLines =<< trim END
1218c620c055SBram Moolenaar    vim9script
1219c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1220c620c055SBram Moolenaar      return idx % 2 == 1
1221c620c055SBram Moolenaar    enddef
1222c620c055SBram Moolenaar    export def FastFilter(): list<number>
1223c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1224c620c055SBram Moolenaar    enddef
1225601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1226601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1227601e76acSBram Moolenaar    enddef
1228c620c055SBram Moolenaar  END
1229c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1230c620c055SBram Moolenaar
1231cfcd011fSBram Moolenaar  var lines =<< trim END
1232c620c055SBram Moolenaar    vim9script
1233601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1234c620c055SBram Moolenaar    def Test()
1235cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1236c620c055SBram Moolenaar    enddef
1237c620c055SBram Moolenaar    Test()
1238601e76acSBram Moolenaar    def TestDirect()
1239cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1240601e76acSBram Moolenaar    enddef
1241601e76acSBram Moolenaar    TestDirect()
1242c620c055SBram Moolenaar  END
1243601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1244c620c055SBram Moolenaar  delete('Xfilter.vim')
1245c620c055SBram Moolenaarenddef
1246c620c055SBram Moolenaar
12474c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1248cfcd011fSBram Moolenaar  var first_lines =<< trim END
12494c17ad94SBram Moolenaar    vim9script
12504c17ad94SBram Moolenaar    def FuncYes(): string
12514c17ad94SBram Moolenaar      return 'yes'
12524c17ad94SBram Moolenaar    enddef
12534c17ad94SBram Moolenaar  END
1254cfcd011fSBram Moolenaar  var withno_lines =<< trim END
12554c17ad94SBram Moolenaar    def FuncNo(): string
12564c17ad94SBram Moolenaar      return 'no'
12574c17ad94SBram Moolenaar    enddef
12584c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12594c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12604c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
126103afdcf1SBram Moolenaar    enddef
126203afdcf1SBram Moolenaar  END
1263cfcd011fSBram Moolenaar  var nono_lines =<< trim END
126403afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
126503afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
126644d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12674c17ad94SBram Moolenaar    enddef
12684c17ad94SBram Moolenaar  END
12694c17ad94SBram Moolenaar
12704c17ad94SBram Moolenaar  # FuncNo() is defined
127103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12724c17ad94SBram Moolenaar  source Xreloaded.vim
12734c17ad94SBram Moolenaar  g:DoCheck(true)
12744c17ad94SBram Moolenaar
12754c17ad94SBram Moolenaar  # FuncNo() is not redefined
127603afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12774c17ad94SBram Moolenaar  source Xreloaded.vim
127803afdcf1SBram Moolenaar  g:DoCheck()
12794c17ad94SBram Moolenaar
12804c17ad94SBram Moolenaar  # FuncNo() is back
128103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12824c17ad94SBram Moolenaar  source Xreloaded.vim
128303afdcf1SBram Moolenaar  g:DoCheck()
12844c17ad94SBram Moolenaar
12854c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12864c17ad94SBram Moolenaarenddef
12874c17ad94SBram Moolenaar
128889483d40SBram Moolenaardef Test_vim9script_reload_delvar()
128989483d40SBram Moolenaar  # write the script with a script-local variable
1290cfcd011fSBram Moolenaar  var lines =<< trim END
129189483d40SBram Moolenaar    vim9script
1292cfcd011fSBram Moolenaar    var name = 'string'
129389483d40SBram Moolenaar  END
129489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
129589483d40SBram Moolenaar  source XreloadVar.vim
129689483d40SBram Moolenaar
129789483d40SBram Moolenaar  # now write the script using the same variable locally - works
129889483d40SBram Moolenaar  lines =<< trim END
129989483d40SBram Moolenaar    vim9script
130089483d40SBram Moolenaar    def Func()
1301cfcd011fSBram Moolenaar      var name = 'string'
130289483d40SBram Moolenaar    enddef
130389483d40SBram Moolenaar  END
130489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
130589483d40SBram Moolenaar  source XreloadVar.vim
130689483d40SBram Moolenaar
130789483d40SBram Moolenaar  delete('XreloadVar.vim')
130889483d40SBram Moolenaarenddef
130989483d40SBram Moolenaar
13108a7d6542SBram Moolenaardef Test_import_absolute()
1311cfcd011fSBram Moolenaar  var import_lines = [
1312e6085c53SBram Moolenaar        'vim9script',
1313e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1314e6085c53SBram Moolenaar        'def UseExported()',
1315e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1316e6085c53SBram Moolenaar        '  exported = 8888',
1317e6085c53SBram Moolenaar        '  g:imported_after = exported',
1318e6085c53SBram Moolenaar        'enddef',
1319e6085c53SBram Moolenaar        'UseExported()',
1320e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1321e6085c53SBram Moolenaar        ]
13228a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13238a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13248a7d6542SBram Moolenaar
13258a7d6542SBram Moolenaar  source Ximport_abs.vim
13268a7d6542SBram Moolenaar
13278a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13284e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1329fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1330fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1331fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1332fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1333fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1334fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1335fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1336fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1337fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1338fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1339e6085c53SBram Moolenaar        g:import_disassembled)
1340b3ca9824SBram Moolenaar
1341b3ca9824SBram Moolenaar  Undo_export_script_lines()
13428a7d6542SBram Moolenaar  unlet g:imported_abs
13434e12a5dfSBram Moolenaar  unlet g:import_disassembled
13448a7d6542SBram Moolenaar
13458a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13468a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13478a7d6542SBram Moolenaarenddef
13488a7d6542SBram Moolenaar
13498a7d6542SBram Moolenaardef Test_import_rtp()
1350cfcd011fSBram Moolenaar  var import_lines = [
1351e6085c53SBram Moolenaar        'vim9script',
1352e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1353e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1354e6085c53SBram Moolenaar        ]
13558a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13568a7d6542SBram Moolenaar  mkdir('import')
13578a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13588a7d6542SBram Moolenaar
1359cfcd011fSBram Moolenaar  var save_rtp = &rtp
13608a7d6542SBram Moolenaar  &rtp = getcwd()
13618a7d6542SBram Moolenaar  source Ximport_rtp.vim
13628a7d6542SBram Moolenaar  &rtp = save_rtp
13638a7d6542SBram Moolenaar
13648a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13658a7d6542SBram Moolenaar
1366b3ca9824SBram Moolenaar  Undo_export_script_lines()
1367b3ca9824SBram Moolenaar  unlet g:imported_rtp
13688a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
136989483d40SBram Moolenaar  delete('import', 'rf')
13708a7d6542SBram Moolenaarenddef
13718a7d6542SBram Moolenaar
137225e0f586SBram Moolenaardef Test_import_compile_error()
1373cfcd011fSBram Moolenaar  var export_lines = [
137425e0f586SBram Moolenaar        'vim9script',
137525e0f586SBram Moolenaar        'export def ExpFunc(): string',
137625e0f586SBram Moolenaar        '  return notDefined',
137725e0f586SBram Moolenaar        'enddef',
137825e0f586SBram Moolenaar        ]
137925e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
138025e0f586SBram Moolenaar
1381cfcd011fSBram Moolenaar  var import_lines = [
138225e0f586SBram Moolenaar        'vim9script',
138325e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
138425e0f586SBram Moolenaar        'def ImpFunc()',
138525e0f586SBram Moolenaar        '  echo ExpFunc()',
138625e0f586SBram Moolenaar        'enddef',
138725e0f586SBram Moolenaar        'defcompile',
138825e0f586SBram Moolenaar        ]
138925e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
139025e0f586SBram Moolenaar
139125e0f586SBram Moolenaar  try
139225e0f586SBram Moolenaar    source Ximport.vim
139325e0f586SBram Moolenaar  catch /E1001/
1394f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
13957707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
139625e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
139725e0f586SBram Moolenaar  endtry
139825e0f586SBram Moolenaar
139925e0f586SBram Moolenaar  delete('Xexported.vim')
140025e0f586SBram Moolenaar  delete('Ximport.vim')
140125e0f586SBram Moolenaarenddef
140225e0f586SBram Moolenaar
1403c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1404cfcd011fSBram Moolenaar  var lines = [
1405c4ce36d4SBram Moolenaar        'vim9script',
1406c4ce36d4SBram Moolenaar        'def Func()',
1407c4ce36d4SBram Moolenaar        '  eval [][0]',
1408c4ce36d4SBram Moolenaar        'enddef',
1409c4ce36d4SBram Moolenaar        'Func()',
1410c4ce36d4SBram Moolenaar        ]
1411c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1412c4ce36d4SBram Moolenaar
1413c4ce36d4SBram Moolenaar  for count in range(3)
1414c4ce36d4SBram Moolenaar    try
1415c4ce36d4SBram Moolenaar      source Xtestscript.vim
1416c4ce36d4SBram Moolenaar    catch /E684/
1417c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1418c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1419c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1420c4ce36d4SBram Moolenaar    endtry
1421c4ce36d4SBram Moolenaar  endfor
1422c4ce36d4SBram Moolenaar
1423c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1424c4ce36d4SBram Moolenaarenddef
1425c4ce36d4SBram Moolenaar
1426eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1427cfcd011fSBram Moolenaar  var export_lines =<< trim END
1428eef2102eSBram Moolenaar      vim9script
1429eef2102eSBram Moolenaar      export def Func()
1430eef2102eSBram Moolenaar        echo 'imported'
1431eef2102eSBram Moolenaar      enddef
1432eef2102eSBram Moolenaar  END
1433eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1434eef2102eSBram Moolenaar
1435cfcd011fSBram Moolenaar  var lines =<< trim END
1436eef2102eSBram Moolenaar    vim9script
1437eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1438eef2102eSBram Moolenaar    def Func()
1439eef2102eSBram Moolenaar      echo 'local to function'
1440eef2102eSBram Moolenaar    enddef
1441eef2102eSBram Moolenaar  END
1442eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1443eef2102eSBram Moolenaar
1444eef2102eSBram Moolenaar  lines =<< trim END
1445eef2102eSBram Moolenaar    vim9script
1446eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1447eef2102eSBram Moolenaar    def Outer()
1448eef2102eSBram Moolenaar      def Func()
1449eef2102eSBram Moolenaar        echo 'local to function'
1450eef2102eSBram Moolenaar      enddef
1451eef2102eSBram Moolenaar    enddef
1452eef2102eSBram Moolenaar    defcompile
1453eef2102eSBram Moolenaar  END
1454eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1455eef2102eSBram Moolenaar
1456eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1457eef2102eSBram Moolenaarenddef
1458eef2102eSBram Moolenaar
1459b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1460cfcd011fSBram Moolenaar  var lines =<< trim END
1461b9a2cac3SBram Moolenaar    vim9script
1462b9a2cac3SBram Moolenaar    def Func()
1463b9a2cac3SBram Moolenaar      echo 'one'
1464b9a2cac3SBram Moolenaar    enddef
1465b9a2cac3SBram Moolenaar    def Func()
1466b9a2cac3SBram Moolenaar      echo 'two'
1467b9a2cac3SBram Moolenaar    enddef
1468b9a2cac3SBram Moolenaar  END
1469b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1470fa211f3cSBram Moolenaar
1471fa211f3cSBram Moolenaar  lines =<< trim END
1472fa211f3cSBram Moolenaar    vim9script
1473fa211f3cSBram Moolenaar    def Foo(): string
1474fa211f3cSBram Moolenaar      return 'foo'
1475fa211f3cSBram Moolenaar      enddef
1476fa211f3cSBram Moolenaar    def Func()
1477cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1478fa211f3cSBram Moolenaar    enddef
1479fa211f3cSBram Moolenaar    defcompile
1480fa211f3cSBram Moolenaar  END
1481fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1482b9a2cac3SBram Moolenaarenddef
1483b9a2cac3SBram Moolenaar
14848a7d6542SBram Moolenaardef Test_fixed_size_list()
1485f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1486cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
14878a7d6542SBram Moolenaar  l->remove(0)
14888a7d6542SBram Moolenaar  l->add(5)
14898a7d6542SBram Moolenaar  l->insert(99, 1)
14900f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14918a7d6542SBram Moolenaarenddef
14928a7d6542SBram Moolenaar
1493ae616494SBram Moolenaardef Test_no_insert_xit()
1494d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1495d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1496d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1497d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1498d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1499ae616494SBram Moolenaar
1500ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1501ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1502ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1503ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1504f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1505f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1506f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1507f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1508f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1509ae616494SBram Moolenaarenddef
1510ae616494SBram Moolenaar
1511158906cfSBram Moolenaardef IfElse(what: number): string
1512cfcd011fSBram Moolenaar  var res = ''
1513158906cfSBram Moolenaar  if what == 1
1514158906cfSBram Moolenaar    res = "one"
1515158906cfSBram Moolenaar  elseif what == 2
1516158906cfSBram Moolenaar    res = "two"
1517a259d8d3SBram Moolenaar  else
1518158906cfSBram Moolenaar    res = "three"
1519a259d8d3SBram Moolenaar  endif
1520158906cfSBram Moolenaar  return res
1521a259d8d3SBram Moolenaarenddef
1522a259d8d3SBram Moolenaar
1523158906cfSBram Moolenaardef Test_if_elseif_else()
1524158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1525158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1526158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15270f18b6d1SBram Moolenaarenddef
15280f18b6d1SBram Moolenaar
1529e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1530d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1531d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1532d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1533d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1534d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1535e8c4abbbSBram Moolenaarenddef
1536e8c4abbbSBram Moolenaar
15376d69bf60SBram Moolenaarlet g:bool_true = v:true
15386d69bf60SBram Moolenaarlet g:bool_false = v:false
15396d69bf60SBram Moolenaar
15406d69bf60SBram Moolenaardef Test_if_const_expr()
1541cfcd011fSBram Moolenaar  var res = false
15426d69bf60SBram Moolenaar  if true ? true : false
15436d69bf60SBram Moolenaar    res = true
15446d69bf60SBram Moolenaar  endif
15456d69bf60SBram Moolenaar  assert_equal(true, res)
15466d69bf60SBram Moolenaar
1547585fea7bSBram Moolenaar  g:glob = 2
1548585fea7bSBram Moolenaar  if false
15496797966dSBram Moolenaar    execute('g:glob = 3')
1550585fea7bSBram Moolenaar  endif
1551585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1552585fea7bSBram Moolenaar  if true
15536797966dSBram Moolenaar    execute('g:glob = 3')
1554585fea7bSBram Moolenaar  endif
1555585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1556585fea7bSBram Moolenaar
15576d69bf60SBram Moolenaar  res = false
15586d69bf60SBram Moolenaar  if g:bool_true ? true : false
15596d69bf60SBram Moolenaar    res = true
15606d69bf60SBram Moolenaar  endif
15616d69bf60SBram Moolenaar  assert_equal(true, res)
15626d69bf60SBram Moolenaar
15636d69bf60SBram Moolenaar  res = false
15646d69bf60SBram Moolenaar  if true ? g:bool_true : false
15656d69bf60SBram Moolenaar    res = true
15666d69bf60SBram Moolenaar  endif
15676d69bf60SBram Moolenaar  assert_equal(true, res)
15686d69bf60SBram Moolenaar
15696d69bf60SBram Moolenaar  res = false
15706d69bf60SBram Moolenaar  if true ? true : g:bool_false
15716d69bf60SBram Moolenaar    res = true
15726d69bf60SBram Moolenaar  endif
15736d69bf60SBram Moolenaar  assert_equal(true, res)
15746d69bf60SBram Moolenaar
15756d69bf60SBram Moolenaar  res = false
15766d69bf60SBram Moolenaar  if true ? false : true
15776d69bf60SBram Moolenaar    res = true
15786d69bf60SBram Moolenaar  endif
15796d69bf60SBram Moolenaar  assert_equal(false, res)
15806d69bf60SBram Moolenaar
15816d69bf60SBram Moolenaar  res = false
15826d69bf60SBram Moolenaar  if false ? false : true
15836d69bf60SBram Moolenaar    res = true
15846d69bf60SBram Moolenaar  endif
15856d69bf60SBram Moolenaar  assert_equal(true, res)
15866d69bf60SBram Moolenaar
15876d69bf60SBram Moolenaar  res = false
15886d69bf60SBram Moolenaar  if false ? true : false
15896d69bf60SBram Moolenaar    res = true
15906d69bf60SBram Moolenaar  endif
15916d69bf60SBram Moolenaar  assert_equal(false, res)
15926d69bf60SBram Moolenaar
15936d69bf60SBram Moolenaar  res = false
1594e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1595e8c4abbbSBram Moolenaar    res = true
1596e8c4abbbSBram Moolenaar  endif
1597e8c4abbbSBram Moolenaar  assert_equal(false, res)
1598e8c4abbbSBram Moolenaar
1599e8c4abbbSBram Moolenaar  res = false
16006d69bf60SBram Moolenaar  if true && true
16016d69bf60SBram Moolenaar    res = true
16026d69bf60SBram Moolenaar  endif
16036d69bf60SBram Moolenaar  assert_equal(true, res)
16046d69bf60SBram Moolenaar
16056d69bf60SBram Moolenaar  res = false
16066d69bf60SBram Moolenaar  if true && false
16076d69bf60SBram Moolenaar    res = true
16086d69bf60SBram Moolenaar  endif
16096d69bf60SBram Moolenaar  assert_equal(false, res)
16106d69bf60SBram Moolenaar
16116d69bf60SBram Moolenaar  res = false
16126d69bf60SBram Moolenaar  if g:bool_true && false
16136d69bf60SBram Moolenaar    res = true
16146d69bf60SBram Moolenaar  endif
16156d69bf60SBram Moolenaar  assert_equal(false, res)
16166d69bf60SBram Moolenaar
16176d69bf60SBram Moolenaar  res = false
16186d69bf60SBram Moolenaar  if true && g:bool_false
16196d69bf60SBram Moolenaar    res = true
16206d69bf60SBram Moolenaar  endif
16216d69bf60SBram Moolenaar  assert_equal(false, res)
16226d69bf60SBram Moolenaar
16236d69bf60SBram Moolenaar  res = false
16246d69bf60SBram Moolenaar  if false && false
16256d69bf60SBram Moolenaar    res = true
16266d69bf60SBram Moolenaar  endif
16276d69bf60SBram Moolenaar  assert_equal(false, res)
16286d69bf60SBram Moolenaar
16296d69bf60SBram Moolenaar  res = false
16306d69bf60SBram Moolenaar  if true || false
16316d69bf60SBram Moolenaar    res = true
16326d69bf60SBram Moolenaar  endif
16336d69bf60SBram Moolenaar  assert_equal(true, res)
16346d69bf60SBram Moolenaar
16356d69bf60SBram Moolenaar  res = false
16366d69bf60SBram Moolenaar  if g:bool_true || false
16376d69bf60SBram Moolenaar    res = true
16386d69bf60SBram Moolenaar  endif
16396d69bf60SBram Moolenaar  assert_equal(true, res)
16406d69bf60SBram Moolenaar
16416d69bf60SBram Moolenaar  res = false
16426d69bf60SBram Moolenaar  if true || g:bool_false
16436d69bf60SBram Moolenaar    res = true
16446d69bf60SBram Moolenaar  endif
16456d69bf60SBram Moolenaar  assert_equal(true, res)
16466d69bf60SBram Moolenaar
16476d69bf60SBram Moolenaar  res = false
16486d69bf60SBram Moolenaar  if false || false
16496d69bf60SBram Moolenaar    res = true
16506d69bf60SBram Moolenaar  endif
16516d69bf60SBram Moolenaar  assert_equal(false, res)
16523988f64fSBram Moolenaar
16533988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16543988f64fSBram Moolenaar  if false | eval 0 | endif
16553988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16563988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16573988f64fSBram Moolenaar  if false
16583988f64fSBram Moolenaar    burp
16593988f64fSBram Moolenaar  endif
166080c34ca3SBram Moolenaarenddef
16616d69bf60SBram Moolenaar
166280c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1663d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1664d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1665d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1666d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16676d69bf60SBram Moolenaarenddef
16686d69bf60SBram Moolenaar
166972abcf42SBram Moolenaardef RunNested(i: number): number
1670cfcd011fSBram Moolenaar  var x: number = 0
167172abcf42SBram Moolenaar  if i % 2
167272abcf42SBram Moolenaar    if 1
1673f5be8cdbSBram Moolenaar      # comment
167472abcf42SBram Moolenaar    else
1675f5be8cdbSBram Moolenaar      # comment
167672abcf42SBram Moolenaar    endif
167772abcf42SBram Moolenaar    x += 1
167872abcf42SBram Moolenaar  else
167972abcf42SBram Moolenaar    x += 1000
168072abcf42SBram Moolenaar  endif
168172abcf42SBram Moolenaar  return x
168272abcf42SBram Moolenaarenddef
168372abcf42SBram Moolenaar
168472abcf42SBram Moolenaardef Test_nested_if()
168572abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
168672abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
168772abcf42SBram Moolenaarenddef
168872abcf42SBram Moolenaar
1689ad39c094SBram Moolenaardef Test_execute_cmd()
1690ad39c094SBram Moolenaar  new
1691ad39c094SBram Moolenaar  setline(1, 'default')
1692d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1693ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1694a72cfb80SBram Moolenaar
1695d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1696a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1697a72cfb80SBram Moolenaar
1698cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1699cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1700a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1701ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1702a72cfb80SBram Moolenaar
1703d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1704ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1705a72cfb80SBram Moolenaar
1706cfcd011fSBram Moolenaar  var cmd_first = 'call '
1707cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1708ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1709ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1710ad39c094SBram Moolenaar  bwipe!
1711585fea7bSBram Moolenaar
1712cfcd011fSBram Moolenaar  var n = true
17132d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
17142d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
17152d6b20d6SBram Moolenaar
1716e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
1717e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1718e5abf7afSBram Moolenaar
1719d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1720d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1721d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1722ad39c094SBram Moolenaarenddef
1723ad39c094SBram Moolenaar
172447e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1725f5be8cdbSBram Moolenaar  # only checks line continuation
1726cfcd011fSBram Moolenaar  var lines =<< trim END
172747e880d6SBram Moolenaar      vim9script
172847e880d6SBram Moolenaar      execute 'g:someVar'
172947e880d6SBram Moolenaar                .. ' = ' ..
173047e880d6SBram Moolenaar                   '28'
173147e880d6SBram Moolenaar      assert_equal(28, g:someVar)
173247e880d6SBram Moolenaar      unlet g:someVar
173347e880d6SBram Moolenaar  END
173447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
173547e880d6SBram Moolenaarenddef
173647e880d6SBram Moolenaar
1737ad39c094SBram Moolenaardef Test_echo_cmd()
1738a72cfb80SBram Moolenaar  echo 'some' # comment
1739585fea7bSBram Moolenaar  echon 'thing'
1740ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1741ad39c094SBram Moolenaar
1742a72cfb80SBram Moolenaar  echo "some" # comment
1743a72cfb80SBram Moolenaar  echon "thing"
1744a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1745a72cfb80SBram Moolenaar
1746cfcd011fSBram Moolenaar  var str1 = 'some'
1747cfcd011fSBram Moolenaar  var str2 = 'more'
1748ad39c094SBram Moolenaar  echo str1 str2
1749ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1750a72cfb80SBram Moolenaar
1751d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1752ad39c094SBram Moolenaarenddef
1753ad39c094SBram Moolenaar
1754f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1755f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1756f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1757f93c7feaSBram Moolenaar  echo 'clear'
1758df069eecSBram Moolenaar  :1messages
1759f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1760f93c7feaSBram Moolenaar
1761d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1762f93c7feaSBram Moolenaarenddef
1763f93c7feaSBram Moolenaar
176447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1765f5be8cdbSBram Moolenaar  # only checks line continuation
1766cfcd011fSBram Moolenaar  var lines =<< trim END
176747e880d6SBram Moolenaar      vim9script
176847e880d6SBram Moolenaar      echomsg 'here'
176947e880d6SBram Moolenaar                .. ' is ' ..
177047e880d6SBram Moolenaar                   'a message'
177147e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
177247e880d6SBram Moolenaar  END
177347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
177447e880d6SBram Moolenaarenddef
177547e880d6SBram Moolenaar
1776f93c7feaSBram Moolenaardef Test_echoerr_cmd()
177740ee466cSBram Moolenaar  try
177840ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
177940ee466cSBram Moolenaar  catch
178040ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
178140ee466cSBram Moolenaar  endtry
1782f93c7feaSBram Moolenaarenddef
1783f93c7feaSBram Moolenaar
178447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1785f5be8cdbSBram Moolenaar  # only checks line continuation
1786cfcd011fSBram Moolenaar  var lines =<< trim END
178747e880d6SBram Moolenaar      vim9script
178847e880d6SBram Moolenaar      try
178947e880d6SBram Moolenaar        echoerr 'this'
179047e880d6SBram Moolenaar                .. ' is ' ..
179147e880d6SBram Moolenaar                   'wrong'
179247e880d6SBram Moolenaar      catch
179347e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
179447e880d6SBram Moolenaar      endtry
179547e880d6SBram Moolenaar  END
179647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
179747e880d6SBram Moolenaarenddef
179847e880d6SBram Moolenaar
179941fe0617SBram Moolenaardef Test_for_outside_of_function()
1800cfcd011fSBram Moolenaar  var lines =<< trim END
180141fe0617SBram Moolenaar    vim9script
180241fe0617SBram Moolenaar    new
180341fe0617SBram Moolenaar    for var in range(0, 3)
180441fe0617SBram Moolenaar      append(line('$'), var)
180541fe0617SBram Moolenaar    endfor
180641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
180741fe0617SBram Moolenaar    bwipe!
180841fe0617SBram Moolenaar  END
180941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
181041fe0617SBram Moolenaar  source Xvim9for.vim
181141fe0617SBram Moolenaar  delete('Xvim9for.vim')
181241fe0617SBram Moolenaarenddef
18138a7d6542SBram Moolenaar
1814e8c4abbbSBram Moolenaardef Test_for_loop()
1815cfcd011fSBram Moolenaar  var result = ''
1816e8c4abbbSBram Moolenaar  for cnt in range(7)
1817e8c4abbbSBram Moolenaar    if cnt == 4
1818e8c4abbbSBram Moolenaar      break
1819e8c4abbbSBram Moolenaar    endif
1820e8c4abbbSBram Moolenaar    if cnt == 2
1821e8c4abbbSBram Moolenaar      continue
1822e8c4abbbSBram Moolenaar    endif
1823e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1824e8c4abbbSBram Moolenaar  endfor
1825e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18260ad3e894SBram Moolenaar
1827cfcd011fSBram Moolenaar  var concat = ''
18280ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18290ad3e894SBram Moolenaar    concat ..= str
18300ad3e894SBram Moolenaar  endfor
18310ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1832e8c4abbbSBram Moolenaarenddef
1833e8c4abbbSBram Moolenaar
1834e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1835675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1836675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1837cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1838822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1839451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1840675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1841675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1842675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1843e8c4abbbSBram Moolenaarenddef
1844e8c4abbbSBram Moolenaar
1845d0df1aacSBram Moolenaardef Test_while_loop()
1846cfcd011fSBram Moolenaar  var result = ''
1847cfcd011fSBram Moolenaar  var cnt = 0
1848d0df1aacSBram Moolenaar  while cnt < 555
1849d0df1aacSBram Moolenaar    if cnt == 3
1850d0df1aacSBram Moolenaar      break
1851d0df1aacSBram Moolenaar    endif
1852d0df1aacSBram Moolenaar    cnt += 1
1853d0df1aacSBram Moolenaar    if cnt == 2
1854d0df1aacSBram Moolenaar      continue
1855d0df1aacSBram Moolenaar    endif
1856d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1857d0df1aacSBram Moolenaar  endwhile
1858d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1859d0df1aacSBram Moolenaarenddef
1860d0df1aacSBram Moolenaar
1861e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1862675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1863675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1864675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1865675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1866675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1867675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1868675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1869bd5da371SBram Moolenaarenddef
1870bd5da371SBram Moolenaar
18719645e2d9SBram Moolenaardef Test_interrupt_loop()
1872cfcd011fSBram Moolenaar  var caught = false
1873cfcd011fSBram Moolenaar  var x = 0
187497acfc78SBram Moolenaar  try
18759645e2d9SBram Moolenaar    while 1
18769645e2d9SBram Moolenaar      x += 1
18779645e2d9SBram Moolenaar      if x == 100
18789645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18799645e2d9SBram Moolenaar      endif
18809645e2d9SBram Moolenaar    endwhile
188197acfc78SBram Moolenaar  catch
188297acfc78SBram Moolenaar    caught = true
188397acfc78SBram Moolenaar    assert_equal(100, x)
188497acfc78SBram Moolenaar  endtry
188597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
188625859dd7SBram Moolenaar  # consume the CTRL-C
188725859dd7SBram Moolenaar  getchar(0)
18889645e2d9SBram Moolenaarenddef
188920431c9dSBram Moolenaar
18904fdae999SBram Moolenaardef Test_automatic_line_continuation()
1891cfcd011fSBram Moolenaar  var mylist = [
18924fdae999SBram Moolenaar      'one',
18934fdae999SBram Moolenaar      'two',
18944fdae999SBram Moolenaar      'three',
1895f5be8cdbSBram Moolenaar      ] # comment
18964fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18974fdae999SBram Moolenaar
1898cfcd011fSBram Moolenaar  var mydict = {
18994fdae999SBram Moolenaar      'one': 1,
19004fdae999SBram Moolenaar      'two': 2,
19014fdae999SBram Moolenaar      'three':
19024fdae999SBram Moolenaar          3,
1903f5be8cdbSBram Moolenaar      } # comment
19044fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
19054fdae999SBram Moolenaar  mydict = #{
19062c330432SBram Moolenaar      one: 1,  # comment
19072c330432SBram Moolenaar      two:     # comment
19082c330432SBram Moolenaar           2,  # comment
19092c330432SBram Moolenaar      three: 3 # comment
19102c330432SBram Moolenaar      }
19112c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
19122c330432SBram Moolenaar  mydict = #{
19132c330432SBram Moolenaar      one: 1,
19144fdae999SBram Moolenaar      two:
19154fdae999SBram Moolenaar           2,
19162c330432SBram Moolenaar      three: 3
19174fdae999SBram Moolenaar      }
19184fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1919e6085c53SBram Moolenaar
1920e6085c53SBram Moolenaar  assert_equal(
1921e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1922e6085c53SBram Moolenaar        split('one two three')
1923e6085c53SBram Moolenaar        )
19244fdae999SBram Moolenaarenddef
19254fdae999SBram Moolenaar
19267a092245SBram Moolenaardef Test_vim9_comment()
19277a092245SBram Moolenaar  CheckScriptSuccess([
19287a092245SBram Moolenaar      'vim9script',
19297a092245SBram Moolenaar      '# something',
19307a092245SBram Moolenaar      ])
19317a092245SBram Moolenaar  CheckScriptFailure([
19327a092245SBram Moolenaar      'vim9script',
19337a092245SBram Moolenaar      ':# something',
19347a092245SBram Moolenaar      ], 'E488:')
19357a092245SBram Moolenaar  CheckScriptFailure([
19367a092245SBram Moolenaar      '# something',
19377a092245SBram Moolenaar      ], 'E488:')
19387a092245SBram Moolenaar  CheckScriptFailure([
19397a092245SBram Moolenaar      ':# something',
19407a092245SBram Moolenaar      ], 'E488:')
19417a092245SBram Moolenaar
19424a8d9f2eSBram Moolenaar  { # block start
19434a8d9f2eSBram Moolenaar  } # block end
19444a8d9f2eSBram Moolenaar  CheckDefFailure([
19454a8d9f2eSBram Moolenaar      '{# comment',
19464a8d9f2eSBram Moolenaar      ], 'E488:')
19474a8d9f2eSBram Moolenaar  CheckDefFailure([
19484a8d9f2eSBram Moolenaar      '{',
19494a8d9f2eSBram Moolenaar      '}# comment',
19504a8d9f2eSBram Moolenaar      ], 'E488:')
19514a8d9f2eSBram Moolenaar
19524a8d9f2eSBram Moolenaar  echo "yes" # comment
19534a8d9f2eSBram Moolenaar  CheckDefFailure([
19544a8d9f2eSBram Moolenaar      'echo "yes"# comment',
19554a8d9f2eSBram Moolenaar      ], 'E488:')
19567a092245SBram Moolenaar  CheckScriptSuccess([
19577a092245SBram Moolenaar      'vim9script',
19587a092245SBram Moolenaar      'echo "yes" # something',
19597a092245SBram Moolenaar      ])
19607a092245SBram Moolenaar  CheckScriptFailure([
19617a092245SBram Moolenaar      'vim9script',
19627a092245SBram Moolenaar      'echo "yes"# something',
19637a092245SBram Moolenaar      ], 'E121:')
19647a092245SBram Moolenaar  CheckScriptFailure([
19657a092245SBram Moolenaar      'vim9script',
19667a092245SBram Moolenaar      'echo# something',
19677a092245SBram Moolenaar      ], 'E121:')
19687a092245SBram Moolenaar  CheckScriptFailure([
19697a092245SBram Moolenaar      'echo "yes" # something',
19707a092245SBram Moolenaar      ], 'E121:')
19717a092245SBram Moolenaar
19724a8d9f2eSBram Moolenaar  exe "echo" # comment
19734a8d9f2eSBram Moolenaar  CheckDefFailure([
19744a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19754a8d9f2eSBram Moolenaar      ], 'E488:')
19764a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19774a8d9f2eSBram Moolenaar      'vim9script',
19784a8d9f2eSBram Moolenaar      'exe "echo" # something',
19794a8d9f2eSBram Moolenaar      ])
19804a8d9f2eSBram Moolenaar  CheckScriptFailure([
19814a8d9f2eSBram Moolenaar      'vim9script',
19824a8d9f2eSBram Moolenaar      'exe "echo"# something',
19834a8d9f2eSBram Moolenaar      ], 'E121:')
19844a8d9f2eSBram Moolenaar  CheckDefFailure([
19854a8d9f2eSBram Moolenaar      'exe # comment',
19864a8d9f2eSBram Moolenaar      ], 'E1015:')
19874a8d9f2eSBram Moolenaar  CheckScriptFailure([
19884a8d9f2eSBram Moolenaar      'vim9script',
19894a8d9f2eSBram Moolenaar      'exe# something',
19904a8d9f2eSBram Moolenaar      ], 'E121:')
19914a8d9f2eSBram Moolenaar  CheckScriptFailure([
19924a8d9f2eSBram Moolenaar      'exe "echo" # something',
19934a8d9f2eSBram Moolenaar      ], 'E121:')
19944a8d9f2eSBram Moolenaar
19957a092245SBram Moolenaar  CheckDefFailure([
19967a092245SBram Moolenaar      'try# comment',
19977a092245SBram Moolenaar      '  echo "yes"',
19987a092245SBram Moolenaar      'catch',
19997a092245SBram Moolenaar      'endtry',
20007a092245SBram Moolenaar      ], 'E488:')
20012c5ed4e3SBram Moolenaar  CheckScriptFailure([
20022c5ed4e3SBram Moolenaar      'vim9script',
20032c5ed4e3SBram Moolenaar      'try# comment',
20042c5ed4e3SBram Moolenaar      'echo "yes"',
20052c5ed4e3SBram Moolenaar      ], 'E488:')
20067a092245SBram Moolenaar  CheckDefFailure([
20077a092245SBram Moolenaar      'try',
2008a72cfb80SBram Moolenaar      '  throw#comment',
2009a72cfb80SBram Moolenaar      'catch',
2010a72cfb80SBram Moolenaar      'endtry',
2011a72cfb80SBram Moolenaar      ], 'E1015:')
2012a72cfb80SBram Moolenaar  CheckDefFailure([
2013a72cfb80SBram Moolenaar      'try',
2014a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2015a72cfb80SBram Moolenaar      'catch',
2016a72cfb80SBram Moolenaar      'endtry',
2017a72cfb80SBram Moolenaar      ], 'E488:')
2018a72cfb80SBram Moolenaar  CheckDefFailure([
2019a72cfb80SBram Moolenaar      'try',
20207a092245SBram Moolenaar      '  echo "yes"',
20217a092245SBram Moolenaar      'catch# comment',
20227a092245SBram Moolenaar      'endtry',
20237a092245SBram Moolenaar      ], 'E488:')
20242c5ed4e3SBram Moolenaar  CheckScriptFailure([
20252c5ed4e3SBram Moolenaar      'vim9script',
20262c5ed4e3SBram Moolenaar      'try',
20272c5ed4e3SBram Moolenaar      '  echo "yes"',
20282c5ed4e3SBram Moolenaar      'catch# comment',
20292c5ed4e3SBram Moolenaar      'endtry',
20302c5ed4e3SBram Moolenaar      ], 'E654:')
20312c5ed4e3SBram Moolenaar  CheckDefFailure([
20322c5ed4e3SBram Moolenaar      'try',
20332c5ed4e3SBram Moolenaar      '  echo "yes"',
20342c5ed4e3SBram Moolenaar      'catch /pat/# comment',
20352c5ed4e3SBram Moolenaar      'endtry',
20362c5ed4e3SBram Moolenaar      ], 'E488:')
20377a092245SBram Moolenaar  CheckDefFailure([
20387a092245SBram Moolenaar      'try',
20397a092245SBram Moolenaar      'echo "yes"',
20407a092245SBram Moolenaar      'catch',
20417a092245SBram Moolenaar      'endtry# comment',
20427a092245SBram Moolenaar      ], 'E488:')
20432c5ed4e3SBram Moolenaar  CheckScriptFailure([
20442c5ed4e3SBram Moolenaar      'vim9script',
20452c5ed4e3SBram Moolenaar      'try',
20462c5ed4e3SBram Moolenaar      '  echo "yes"',
20472c5ed4e3SBram Moolenaar      'catch',
20482c5ed4e3SBram Moolenaar      'endtry# comment',
20499b7bf9e9SBram Moolenaar      ], 'E488:')
20502c5ed4e3SBram Moolenaar
20512c5ed4e3SBram Moolenaar  CheckScriptSuccess([
20522c5ed4e3SBram Moolenaar      'vim9script',
20532c5ed4e3SBram Moolenaar      'hi # comment',
20542c5ed4e3SBram Moolenaar      ])
20552c5ed4e3SBram Moolenaar  CheckScriptFailure([
20562c5ed4e3SBram Moolenaar      'vim9script',
20572c5ed4e3SBram Moolenaar      'hi# comment',
20582c5ed4e3SBram Moolenaar      ], 'E416:')
20591966c248SBram Moolenaar  CheckScriptSuccess([
20601966c248SBram Moolenaar      'vim9script',
20611966c248SBram Moolenaar      'hi Search # comment',
20621966c248SBram Moolenaar      ])
20631966c248SBram Moolenaar  CheckScriptFailure([
20641966c248SBram Moolenaar      'vim9script',
20651966c248SBram Moolenaar      'hi Search# comment',
20661966c248SBram Moolenaar      ], 'E416:')
20671966c248SBram Moolenaar  CheckScriptSuccess([
20681966c248SBram Moolenaar      'vim9script',
20691966c248SBram Moolenaar      'hi link This Search # comment',
20701966c248SBram Moolenaar      ])
20711966c248SBram Moolenaar  CheckScriptFailure([
20721966c248SBram Moolenaar      'vim9script',
20731966c248SBram Moolenaar      'hi link This That# comment',
20741966c248SBram Moolenaar      ], 'E413:')
20751966c248SBram Moolenaar  CheckScriptSuccess([
20761966c248SBram Moolenaar      'vim9script',
20771966c248SBram Moolenaar      'hi clear This # comment',
20781966c248SBram Moolenaar      'hi clear # comment',
20791966c248SBram Moolenaar      ])
2080f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2081f5be8cdbSBram Moolenaar  # hi clear This# comment',
20821966c248SBram Moolenaar  CheckScriptFailure([
20831966c248SBram Moolenaar      'vim9script',
20841966c248SBram Moolenaar      'hi clear# comment',
20851966c248SBram Moolenaar      ], 'E416:')
20861966c248SBram Moolenaar
20871966c248SBram Moolenaar  CheckScriptSuccess([
20881966c248SBram Moolenaar      'vim9script',
20891966c248SBram Moolenaar      'hi Group term=bold',
20901966c248SBram Moolenaar      'match Group /todo/ # comment',
20911966c248SBram Moolenaar      ])
20921966c248SBram Moolenaar  CheckScriptFailure([
20931966c248SBram Moolenaar      'vim9script',
20941966c248SBram Moolenaar      'hi Group term=bold',
20951966c248SBram Moolenaar      'match Group /todo/# comment',
20961966c248SBram Moolenaar      ], 'E488:')
20971966c248SBram Moolenaar  CheckScriptSuccess([
20981966c248SBram Moolenaar      'vim9script',
20991966c248SBram Moolenaar      'match # comment',
21001966c248SBram Moolenaar      ])
21011966c248SBram Moolenaar  CheckScriptFailure([
21021966c248SBram Moolenaar      'vim9script',
21031966c248SBram Moolenaar      'match# comment',
21041966c248SBram Moolenaar      ], 'E475:')
21051966c248SBram Moolenaar  CheckScriptSuccess([
21061966c248SBram Moolenaar      'vim9script',
21071966c248SBram Moolenaar      'match none # comment',
21081966c248SBram Moolenaar      ])
21091966c248SBram Moolenaar  CheckScriptFailure([
21101966c248SBram Moolenaar      'vim9script',
21111966c248SBram Moolenaar      'match none# comment',
21121966c248SBram Moolenaar      ], 'E475:')
21131966c248SBram Moolenaar
21141966c248SBram Moolenaar  CheckScriptSuccess([
21151966c248SBram Moolenaar      'vim9script',
21161966c248SBram Moolenaar      'menutrans clear # comment',
21171966c248SBram Moolenaar      ])
21181966c248SBram Moolenaar  CheckScriptFailure([
21191966c248SBram Moolenaar      'vim9script',
21201966c248SBram Moolenaar      'menutrans clear# comment text',
21211966c248SBram Moolenaar      ], 'E474:')
21221966c248SBram Moolenaar
21231966c248SBram Moolenaar  CheckScriptSuccess([
21241966c248SBram Moolenaar      'vim9script',
21251966c248SBram Moolenaar      'syntax clear # comment',
21261966c248SBram Moolenaar      ])
21271966c248SBram Moolenaar  CheckScriptFailure([
21281966c248SBram Moolenaar      'vim9script',
21291966c248SBram Moolenaar      'syntax clear# comment text',
21301966c248SBram Moolenaar      ], 'E28:')
21311966c248SBram Moolenaar  CheckScriptSuccess([
21321966c248SBram Moolenaar      'vim9script',
21331966c248SBram Moolenaar      'syntax keyword Word some',
21341966c248SBram Moolenaar      'syntax clear Word # comment',
21351966c248SBram Moolenaar      ])
21361966c248SBram Moolenaar  CheckScriptFailure([
21371966c248SBram Moolenaar      'vim9script',
21381966c248SBram Moolenaar      'syntax keyword Word some',
21391966c248SBram Moolenaar      'syntax clear Word# comment text',
21401966c248SBram Moolenaar      ], 'E28:')
21411966c248SBram Moolenaar
21421966c248SBram Moolenaar  CheckScriptSuccess([
21431966c248SBram Moolenaar      'vim9script',
21441966c248SBram Moolenaar      'syntax list # comment',
21451966c248SBram Moolenaar      ])
21461966c248SBram Moolenaar  CheckScriptFailure([
21471966c248SBram Moolenaar      'vim9script',
21481966c248SBram Moolenaar      'syntax list# comment text',
21491966c248SBram Moolenaar      ], 'E28:')
21501966c248SBram Moolenaar
21511966c248SBram Moolenaar  CheckScriptSuccess([
21521966c248SBram Moolenaar      'vim9script',
21531966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
21541966c248SBram Moolenaar      ])
21551966c248SBram Moolenaar  CheckScriptFailure([
21561966c248SBram Moolenaar      'vim9script',
21571966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
21581966c248SBram Moolenaar      ], 'E475:')
21591966c248SBram Moolenaar
21601966c248SBram Moolenaar  CheckScriptSuccess([
21611966c248SBram Moolenaar      'vim9script',
21621966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21631966c248SBram Moolenaar      ])
21641966c248SBram Moolenaar  CheckScriptFailure([
21651966c248SBram Moolenaar      'vim9script',
21661966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21671966c248SBram Moolenaar      ], 'E789:')
21681966c248SBram Moolenaar
21691966c248SBram Moolenaar  CheckScriptSuccess([
21701966c248SBram Moolenaar      'vim9script',
21711966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21721966c248SBram Moolenaar      ])
21731966c248SBram Moolenaar  CheckScriptFailure([
21741966c248SBram Moolenaar      'vim9script',
21751966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21761966c248SBram Moolenaar      ], 'E402:')
21771966c248SBram Moolenaar
21781966c248SBram Moolenaar  CheckScriptSuccess([
21791966c248SBram Moolenaar      'vim9script',
21801966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21811966c248SBram Moolenaar      ])
21821966c248SBram Moolenaar  CheckScriptFailure([
21831966c248SBram Moolenaar      'vim9script',
21841966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21851966c248SBram Moolenaar      ], 'E475:')
21861966c248SBram Moolenaar  CheckScriptFailure([
21871966c248SBram Moolenaar      'vim9script',
21881966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21891966c248SBram Moolenaar      ], 'E406:')
21901966c248SBram Moolenaar  CheckScriptFailure([
21911966c248SBram Moolenaar      'vim9script',
21921966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21931966c248SBram Moolenaar      ], 'E475:')
21941966c248SBram Moolenaar
21951966c248SBram Moolenaar  CheckScriptSuccess([
21961966c248SBram Moolenaar      'vim9script',
21971966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21981966c248SBram Moolenaar      ])
21991966c248SBram Moolenaar  CheckScriptFailure([
22001966c248SBram Moolenaar      'vim9script',
22011966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2202d032f34aSBram Moolenaar      ], 'E402:')
22031966c248SBram Moolenaar
22041966c248SBram Moolenaar  CheckScriptSuccess([
22051966c248SBram Moolenaar      'vim9script',
22061966c248SBram Moolenaar      'syntax sync # comment',
22071966c248SBram Moolenaar      ])
22081966c248SBram Moolenaar  CheckScriptFailure([
22091966c248SBram Moolenaar      'vim9script',
22101966c248SBram Moolenaar      'syntax sync# comment',
22111966c248SBram Moolenaar      ], 'E404:')
22121966c248SBram Moolenaar  CheckScriptSuccess([
22131966c248SBram Moolenaar      'vim9script',
22141966c248SBram Moolenaar      'syntax sync ccomment # comment',
22151966c248SBram Moolenaar      ])
22161966c248SBram Moolenaar  CheckScriptFailure([
22171966c248SBram Moolenaar      'vim9script',
22181966c248SBram Moolenaar      'syntax sync ccomment# comment',
22191966c248SBram Moolenaar      ], 'E404:')
22201966c248SBram Moolenaar
22211966c248SBram Moolenaar  CheckScriptSuccess([
22221966c248SBram Moolenaar      'vim9script',
22231966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
22241966c248SBram Moolenaar      ])
22251966c248SBram Moolenaar  CheckScriptFailure([
22261966c248SBram Moolenaar      'vim9script',
22271966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
22281966c248SBram Moolenaar      ], 'E475:')
2229a72cfb80SBram Moolenaar
2230a72cfb80SBram Moolenaar  CheckScriptSuccess([
2231a72cfb80SBram Moolenaar      'vim9script',
2232a72cfb80SBram Moolenaar      'command Echo echo # comment',
2233a72cfb80SBram Moolenaar      'command Echo # comment',
2234a72cfb80SBram Moolenaar      ])
2235a72cfb80SBram Moolenaar  CheckScriptFailure([
2236a72cfb80SBram Moolenaar      'vim9script',
2237a72cfb80SBram Moolenaar      'command Echo echo# comment',
2238a72cfb80SBram Moolenaar      'Echo',
2239a72cfb80SBram Moolenaar      ], 'E121:')
2240a72cfb80SBram Moolenaar  CheckScriptFailure([
2241a72cfb80SBram Moolenaar      'vim9script',
2242a72cfb80SBram Moolenaar      'command Echo# comment',
2243a72cfb80SBram Moolenaar      ], 'E182:')
2244a72cfb80SBram Moolenaar  CheckScriptFailure([
2245a72cfb80SBram Moolenaar      'vim9script',
2246a72cfb80SBram Moolenaar      'command Echo echo',
2247a72cfb80SBram Moolenaar      'command Echo# comment',
2248a72cfb80SBram Moolenaar      ], 'E182:')
2249a72cfb80SBram Moolenaar
2250a72cfb80SBram Moolenaar  CheckScriptSuccess([
2251a72cfb80SBram Moolenaar      'vim9script',
2252a72cfb80SBram Moolenaar      'function # comment',
2253a72cfb80SBram Moolenaar      ])
2254a72cfb80SBram Moolenaar  CheckScriptFailure([
2255a72cfb80SBram Moolenaar      'vim9script',
22569898107fSBram Moolenaar      'function " comment',
22579898107fSBram Moolenaar      ], 'E129:')
22589898107fSBram Moolenaar  CheckScriptFailure([
22599898107fSBram Moolenaar      'vim9script',
2260a72cfb80SBram Moolenaar      'function# comment',
2261a72cfb80SBram Moolenaar      ], 'E129:')
2262a72cfb80SBram Moolenaar  CheckScriptSuccess([
2263a72cfb80SBram Moolenaar      'vim9script',
2264a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2265a72cfb80SBram Moolenaar      ])
2266a72cfb80SBram Moolenaar  CheckScriptFailure([
2267a72cfb80SBram Moolenaar      'vim9script',
2268a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2269a72cfb80SBram Moolenaar      ], 'E488:')
2270a72cfb80SBram Moolenaar
2271a72cfb80SBram Moolenaar  CheckScriptSuccess([
2272a72cfb80SBram Moolenaar      'vim9script',
22734c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2274a72cfb80SBram Moolenaar      'endfunc',
22754c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2276a72cfb80SBram Moolenaar      ])
2277a72cfb80SBram Moolenaar  CheckScriptFailure([
2278a72cfb80SBram Moolenaar      'vim9script',
22794c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2280a72cfb80SBram Moolenaar      'endfunc',
22814c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2282a72cfb80SBram Moolenaar      ], 'E488:')
2283a72cfb80SBram Moolenaar
2284a72cfb80SBram Moolenaar  CheckScriptSuccess([
2285a72cfb80SBram Moolenaar      'vim9script',
2286a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2287a72cfb80SBram Moolenaar      ])
2288a72cfb80SBram Moolenaar  CheckScriptFailure([
2289a72cfb80SBram Moolenaar      'vim9script',
2290a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2291a72cfb80SBram Moolenaar      ], 'E488:')
2292e7e4838fSBram Moolenaar
2293e7e4838fSBram Moolenaar  CheckScriptFailure([
2294e7e4838fSBram Moolenaar      'def Test() " comment',
2295e7e4838fSBram Moolenaar      'enddef',
2296e7e4838fSBram Moolenaar      ], 'E488:')
2297e7e4838fSBram Moolenaar  CheckScriptFailure([
2298e7e4838fSBram Moolenaar      'vim9script',
2299e7e4838fSBram Moolenaar      'def Test() " comment',
2300e7e4838fSBram Moolenaar      'enddef',
2301e7e4838fSBram Moolenaar      ], 'E488:')
2302e7e4838fSBram Moolenaar
2303e7e4838fSBram Moolenaar  CheckScriptSuccess([
2304e7e4838fSBram Moolenaar      'func Test() " comment',
2305e7e4838fSBram Moolenaar      'endfunc',
2306e7e4838fSBram Moolenaar      ])
23079898107fSBram Moolenaar  CheckScriptSuccess([
2308e7e4838fSBram Moolenaar      'vim9script',
2309e7e4838fSBram Moolenaar      'func Test() " comment',
2310e7e4838fSBram Moolenaar      'endfunc',
23119898107fSBram Moolenaar      ])
2312e7e4838fSBram Moolenaar
2313e7e4838fSBram Moolenaar  CheckScriptSuccess([
2314e7e4838fSBram Moolenaar      'def Test() # comment',
2315e7e4838fSBram Moolenaar      'enddef',
2316e7e4838fSBram Moolenaar      ])
2317e7e4838fSBram Moolenaar  CheckScriptFailure([
2318e7e4838fSBram Moolenaar      'func Test() # comment',
2319e7e4838fSBram Moolenaar      'endfunc',
2320e7e4838fSBram Moolenaar      ], 'E488:')
23212c5ed4e3SBram Moolenaarenddef
23222c5ed4e3SBram Moolenaar
23232c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
23242c5ed4e3SBram Moolenaar  CheckCanRunGui
23252c5ed4e3SBram Moolenaar
23262c5ed4e3SBram Moolenaar  CheckScriptFailure([
23272c5ed4e3SBram Moolenaar      'vim9script',
23282c5ed4e3SBram Moolenaar      'gui#comment'
23292c5ed4e3SBram Moolenaar      ], 'E499:')
23302c5ed4e3SBram Moolenaar  CheckScriptFailure([
23312c5ed4e3SBram Moolenaar      'vim9script',
23322c5ed4e3SBram Moolenaar      'gui -f#comment'
23332c5ed4e3SBram Moolenaar      ], 'E499:')
23347a092245SBram Moolenaarenddef
23357a092245SBram Moolenaar
2336a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
23376797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
23386797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2339a26b9700SBram Moolenaar
2340a26b9700SBram Moolenaar  edit test.vim
2341a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2342a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2343a26b9700SBram Moolenaar
2344a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2345a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2346a26b9700SBram Moolenaar
2347a26b9700SBram Moolenaar  g:entered = 0
2348a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2349a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2350a26b9700SBram Moolenaar
2351a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2352a26b9700SBram Moolenaar
2353a26b9700SBram Moolenaar  au! TabEnter
2354a26b9700SBram Moolenaar  unlet g:entered
2355d72c1bf0SBram Moolenaar
2356d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2357d72c1bf0SBram Moolenaar      'vim9script',
23586797966dSBram Moolenaar      'g:var = 123',
2359e55b1c09SBram Moolenaar      'b:var = 456',
2360e55b1c09SBram Moolenaar      'w:var = 777',
2361e55b1c09SBram Moolenaar      't:var = 888',
2362d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2363d72c1bf0SBram Moolenaar      ])
2364d72c1bf0SBram Moolenaar
2365d72c1bf0SBram Moolenaar  CheckScriptFailure([
2366d72c1bf0SBram Moolenaar      'vim9script',
2367cfcd011fSBram Moolenaar      'let var = 123',
2368cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2369cfcd011fSBram Moolenaar
2370cfcd011fSBram Moolenaar  CheckScriptFailure([
2371cfcd011fSBram Moolenaar      'vim9script',
2372cfcd011fSBram Moolenaar      'var g:var = 123',
2373e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2374e55b1c09SBram Moolenaar
2375e55b1c09SBram Moolenaar  CheckScriptFailure([
2376e55b1c09SBram Moolenaar      'vim9script',
2377cfcd011fSBram Moolenaar      'var b:var = 123',
2378e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2379e55b1c09SBram Moolenaar
2380e55b1c09SBram Moolenaar  CheckScriptFailure([
2381e55b1c09SBram Moolenaar      'vim9script',
2382cfcd011fSBram Moolenaar      'var w:var = 123',
2383e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2384e55b1c09SBram Moolenaar
2385e55b1c09SBram Moolenaar  CheckScriptFailure([
2386e55b1c09SBram Moolenaar      'vim9script',
2387cfcd011fSBram Moolenaar      'var t:var = 123',
2388e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2389e55b1c09SBram Moolenaar
2390e55b1c09SBram Moolenaar  CheckScriptFailure([
2391e55b1c09SBram Moolenaar      'vim9script',
2392cfcd011fSBram Moolenaar      'var v:version = 123',
2393e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2394e55b1c09SBram Moolenaar
2395e55b1c09SBram Moolenaar  CheckScriptFailure([
2396e55b1c09SBram Moolenaar      'vim9script',
2397cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2398e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23996797966dSBram Moolenaar
24006797966dSBram Moolenaar  CheckScriptFailure([
24016797966dSBram Moolenaar      'vim9script',
24026797966dSBram Moolenaar      'g:var = 123',
240332e35117SBram Moolenaar      'unlet g:var# comment1',
2404d72c1bf0SBram Moolenaar      ], 'E108:')
2405d72c1bf0SBram Moolenaar
2406d72c1bf0SBram Moolenaar  CheckScriptFailure([
2407d72c1bf0SBram Moolenaar      'let g:var = 123',
2408d72c1bf0SBram Moolenaar      'unlet g:var # something',
2409d72c1bf0SBram Moolenaar      ], 'E488:')
2410faac4104SBram Moolenaar
2411faac4104SBram Moolenaar  CheckScriptSuccess([
2412faac4104SBram Moolenaar      'vim9script',
241332e35117SBram Moolenaar      'if 1 # comment2',
2414faac4104SBram Moolenaar      '  echo "yes"',
2415faac4104SBram Moolenaar      'elseif 2 #comment',
2416faac4104SBram Moolenaar      '  echo "no"',
2417faac4104SBram Moolenaar      'endif',
2418faac4104SBram Moolenaar      ])
2419faac4104SBram Moolenaar
2420faac4104SBram Moolenaar  CheckScriptFailure([
2421faac4104SBram Moolenaar      'vim9script',
242232e35117SBram Moolenaar      'if 1# comment3',
2423faac4104SBram Moolenaar      '  echo "yes"',
2424faac4104SBram Moolenaar      'endif',
2425faac4104SBram Moolenaar      ], 'E15:')
2426faac4104SBram Moolenaar
2427faac4104SBram Moolenaar  CheckScriptFailure([
2428faac4104SBram Moolenaar      'vim9script',
242932e35117SBram Moolenaar      'if 0 # comment4',
2430faac4104SBram Moolenaar      '  echo "yes"',
2431faac4104SBram Moolenaar      'elseif 2#comment',
2432faac4104SBram Moolenaar      '  echo "no"',
2433faac4104SBram Moolenaar      'endif',
2434faac4104SBram Moolenaar      ], 'E15:')
2435faac4104SBram Moolenaar
2436faac4104SBram Moolenaar  CheckScriptSuccess([
2437faac4104SBram Moolenaar      'vim9script',
2438cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2439faac4104SBram Moolenaar      ])
2440faac4104SBram Moolenaar
2441faac4104SBram Moolenaar  CheckScriptFailure([
2442faac4104SBram Moolenaar      'vim9script',
2443cfcd011fSBram Moolenaar      'var v = 1# comment6',
244432e35117SBram Moolenaar      ], 'E15:')
2445faac4104SBram Moolenaar
2446faac4104SBram Moolenaar  CheckScriptSuccess([
2447faac4104SBram Moolenaar      'vim9script',
2448faac4104SBram Moolenaar      'new'
2449d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2450df069eecSBram Moolenaar      ':$',
2451faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2452faac4104SBram Moolenaar      'bwipe!',
2453faac4104SBram Moolenaar      ])
2454faac4104SBram Moolenaar
2455f5be8cdbSBram Moolenaar  CheckScriptFailure([
2456f5be8cdbSBram Moolenaar      'vim9script',
2457f5be8cdbSBram Moolenaar      'new'
2458d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2459f5be8cdbSBram Moolenaar      ':$',
2460f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2461f5be8cdbSBram Moolenaar      'bwipe!',
2462f5be8cdbSBram Moolenaar      ], 'E488:')
2463f5be8cdbSBram Moolenaar
2464f5be8cdbSBram Moolenaar  CheckScriptFailure([
2465f5be8cdbSBram Moolenaar      'vim9script',
2466f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2467f5be8cdbSBram Moolenaar      ], 'E477:')
2468a26b9700SBram Moolenaarenddef
2469a26b9700SBram Moolenaar
24707e5bd91dSBram Moolenaardef Test_finish()
2471cfcd011fSBram Moolenaar  var lines =<< trim END
24727e5bd91dSBram Moolenaar    vim9script
24736797966dSBram Moolenaar    g:res = 'one'
24747e5bd91dSBram Moolenaar    if v:false | finish | endif
24756797966dSBram Moolenaar    g:res = 'two'
24767e5bd91dSBram Moolenaar    finish
24776797966dSBram Moolenaar    g:res = 'three'
24787e5bd91dSBram Moolenaar  END
24797e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24807e5bd91dSBram Moolenaar  source Xfinished
24817e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24827e5bd91dSBram Moolenaar
24837e5bd91dSBram Moolenaar  unlet g:res
24847e5bd91dSBram Moolenaar  delete('Xfinished')
24857e5bd91dSBram Moolenaarenddef
24867e5bd91dSBram Moolenaar
2487a5d0077eSBram Moolenaardef Test_forward_declaration()
2488cfcd011fSBram Moolenaar  var lines =<< trim END
2489a5d0077eSBram Moolenaar    vim9script
2490a5d0077eSBram Moolenaar    def GetValue(): string
2491a5d0077eSBram Moolenaar      return theVal
2492a5d0077eSBram Moolenaar    enddef
2493cfcd011fSBram Moolenaar    var theVal = 'something'
2494822ba247SBram Moolenaar    g:initVal = GetValue()
2495a5d0077eSBram Moolenaar    theVal = 'else'
2496a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2497a5d0077eSBram Moolenaar  END
2498a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2499a5d0077eSBram Moolenaar  source Xforward
2500a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2501a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2502a5d0077eSBram Moolenaar
2503a5d0077eSBram Moolenaar  unlet g:initVal
2504a5d0077eSBram Moolenaar  unlet g:laterVal
2505a5d0077eSBram Moolenaar  delete('Xforward')
2506a5d0077eSBram Moolenaarenddef
2507a5d0077eSBram Moolenaar
25089721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2509cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
25109721fb4eSBram Moolenaar    source Xvim9_script.vim
25119721fb4eSBram Moolenaar
25129721fb4eSBram Moolenaar    call assert_false(exists('local'))
25139721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25149721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
25159721fb4eSBram Moolenaar    call assert_equal('global', global)
25169721fb4eSBram Moolenaar    call assert_equal('global', g:global)
25179721fb4eSBram Moolenaar
25189721fb4eSBram Moolenaar    " imported variable becomes script-local
25199721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
25209721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
25219721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25229721fb4eSBram Moolenaar
25239721fb4eSBram Moolenaar    " imported function becomes script-local
25249721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
25259721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
25269721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
25279721fb4eSBram Moolenaar  END
25289721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
25299721fb4eSBram Moolenaar
2530cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
25319721fb4eSBram Moolenaar    vim9script
2532cfcd011fSBram Moolenaar    var local = 'local'
25339721fb4eSBram Moolenaar    g:global = 'global'
2534cfcd011fSBram Moolenaar    export var exported = 'exported'
25359721fb4eSBram Moolenaar    export def GetText(): string
25369721fb4eSBram Moolenaar       return 'text'
25379721fb4eSBram Moolenaar    enddef
25389721fb4eSBram Moolenaar  END
25399721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25409721fb4eSBram Moolenaar
25419721fb4eSBram Moolenaar  source Xlegacy_script.vim
25429721fb4eSBram Moolenaar
25439721fb4eSBram Moolenaar  assert_equal('global', g:global)
2544f5be8cdbSBram Moolenaar  unlet g:global
25459721fb4eSBram Moolenaar
25469721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25479721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25489721fb4eSBram Moolenaarenddef
2549a5d0077eSBram Moolenaar
25507d699701SBram Moolenaarfunc Test_vim9script_not_global()
25517d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
25527d699701SBram Moolenaar  let vim9lines =<< trim END
25537d699701SBram Moolenaar    vim9script
2554cfcd011fSBram Moolenaar    var name = 'local'
25557d699701SBram Moolenaar    func TheFunc()
25567d699701SBram Moolenaar      echo 'local'
25577d699701SBram Moolenaar    endfunc
25587d699701SBram Moolenaar    def DefFunc()
25597d699701SBram Moolenaar      echo 'local'
25607d699701SBram Moolenaar    enddef
25617d699701SBram Moolenaar  END
25627d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
25637d699701SBram Moolenaar  source Xvim9script.vim
25647d699701SBram Moolenaar  try
25657d699701SBram Moolenaar    echo g:var
25667d699701SBram Moolenaar    assert_report('did not fail')
25677d699701SBram Moolenaar  catch /E121:/
25687d699701SBram Moolenaar    " caught
25697d699701SBram Moolenaar  endtry
25707d699701SBram Moolenaar  try
25717d699701SBram Moolenaar    call TheFunc()
25727d699701SBram Moolenaar    assert_report('did not fail')
25737d699701SBram Moolenaar  catch /E117:/
25747d699701SBram Moolenaar    " caught
25757d699701SBram Moolenaar  endtry
25767d699701SBram Moolenaar  try
25777d699701SBram Moolenaar    call DefFunc()
25787d699701SBram Moolenaar    assert_report('did not fail')
25797d699701SBram Moolenaar  catch /E117:/
25807d699701SBram Moolenaar    " caught
25817d699701SBram Moolenaar  endtry
25827d699701SBram Moolenaar
258325859dd7SBram Moolenaar  call delete('Xvim9script.vim')
25847d699701SBram Moolenaarendfunc
25857d699701SBram Moolenaar
2586eeb27bfeSBram Moolenaardef Test_vim9_copen()
2587eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2588eeb27bfeSBram Moolenaar  copen
2589eeb27bfeSBram Moolenaar  quit
2590eeb27bfeSBram Moolenaarenddef
2591eeb27bfeSBram Moolenaar
25922d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
25932d6b20d6SBram Moolenaardef Test_vim9_autoload()
2594cfcd011fSBram Moolenaar  var lines =<< trim END
25952d6b20d6SBram Moolenaar     vim9script
25962d6b20d6SBram Moolenaar     def foo#test()
25972d6b20d6SBram Moolenaar         echomsg getreg('"')
25982d6b20d6SBram Moolenaar     enddef
25992d6b20d6SBram Moolenaar  END
26002d6b20d6SBram Moolenaar
26012d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
26022d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2603cfcd011fSBram Moolenaar  var save_rtp = &rtp
26042d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
26052d6b20d6SBram Moolenaar  augroup test
26062d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
26072d6b20d6SBram Moolenaar  augroup END
26082d6b20d6SBram Moolenaar
26092d6b20d6SBram Moolenaar  normal Y
26102d6b20d6SBram Moolenaar
26112d6b20d6SBram Moolenaar  augroup test
26122d6b20d6SBram Moolenaar    autocmd!
26132d6b20d6SBram Moolenaar  augroup END
26142d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
26152d6b20d6SBram Moolenaar  &rtp = save_rtp
26162d6b20d6SBram Moolenaarenddef
26172d6b20d6SBram Moolenaar
261877e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
261977e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2620cfcd011fSBram Moolenaar  var lines =<< trim END
262177e5dcc3SBram Moolenaar      vim9script
262277e5dcc3SBram Moolenaar      def crash#func()
262377e5dcc3SBram Moolenaar          try
262477e5dcc3SBram Moolenaar              for x in List()
262577e5dcc3SBram Moolenaar              endfor
262677e5dcc3SBram Moolenaar          catch
262777e5dcc3SBram Moolenaar          endtry
262877e5dcc3SBram Moolenaar          g:ok = true
262977e5dcc3SBram Moolenaar      enddef
263077e5dcc3SBram Moolenaar      fu List()
263177e5dcc3SBram Moolenaar          invalid
263277e5dcc3SBram Moolenaar      endfu
263377e5dcc3SBram Moolenaar      try
263477e5dcc3SBram Moolenaar          invalid
263577e5dcc3SBram Moolenaar      catch /wontmatch/
263677e5dcc3SBram Moolenaar      endtry
263777e5dcc3SBram Moolenaar  END
263877e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
263977e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
264077e5dcc3SBram Moolenaar
264177e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
264277e5dcc3SBram Moolenaar  lines =<< trim END
264377e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
264477e5dcc3SBram Moolenaar    call crash#func()
264577e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
26469c4f5520SBram Moolenaar    qall!
264777e5dcc3SBram Moolenaar  END
264877e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
264977e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
265077e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
265177e5dcc3SBram Moolenaar
265277e5dcc3SBram Moolenaar  delete('Xdidit')
265377e5dcc3SBram Moolenaar  delete('Xscript')
265477e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
265577e5dcc3SBram Moolenaarenddef
265677e5dcc3SBram Moolenaar
265781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
265881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
265981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2660cfcd011fSBram Moolenaar  var lines =<< trim END
266181e17fbeSBram Moolenaar    let s:counter = 1
266281e17fbeSBram Moolenaar    def s:Func()
266381e17fbeSBram Moolenaar      au! CursorHold
266481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
266581e17fbeSBram Moolenaar    enddef
266681e17fbeSBram Moolenaar    call s:Func()
266781e17fbeSBram Moolenaar    doau CursorHold
266881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
266981e17fbeSBram Moolenaar    au! CursorHold
267081e17fbeSBram Moolenaar  END
267181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
267281e17fbeSBram Moolenaarenddef
267381e17fbeSBram Moolenaar
26743896a105SBram Moolenaardef Test_cmdline_win()
26753896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
26763896a105SBram Moolenaar  # the command line window.
26773896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2678cfcd011fSBram Moolenaar  var export_lines =<< trim END
26793896a105SBram Moolenaar    vim9script
2680cfcd011fSBram Moolenaar    export var That = 'yes'
26813896a105SBram Moolenaar  END
26823896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2683cfcd011fSBram Moolenaar  var import_lines =<< trim END
26843896a105SBram Moolenaar    vim9script
26853896a105SBram Moolenaar    import That from './Xexport.vim'
26863896a105SBram Moolenaar  END
26873896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2688cfcd011fSBram Moolenaar  var save_rtp = &rtp
26893896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
26903896a105SBram Moolenaar  syntax on
26913896a105SBram Moolenaar  augroup CmdWin
26923896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
26933896a105SBram Moolenaar  augroup END
26943896a105SBram Moolenaar  # this will open and also close the cmdline window
26953896a105SBram Moolenaar  feedkeys('q:', 'xt')
26963896a105SBram Moolenaar  assert_equal('yes', g:got_there)
26973896a105SBram Moolenaar
26983896a105SBram Moolenaar  augroup CmdWin
26993896a105SBram Moolenaar    au!
27003896a105SBram Moolenaar  augroup END
27013896a105SBram Moolenaar  &rtp = save_rtp
27023896a105SBram Moolenaar  delete('rtp', 'rf')
27033896a105SBram Moolenaarenddef
27043896a105SBram Moolenaar
2705e3d4685fSBram Moolenaardef Test_invalid_sid()
2706e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
270725859dd7SBram Moolenaar
27089c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2709d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2710e3d4685fSBram Moolenaar  endif
2711e3d4685fSBram Moolenaar  delete('Xdidit')
2712e3d4685fSBram Moolenaarenddef
2713e3d4685fSBram Moolenaar
2714f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2715cfcd011fSBram Moolenaar  var lines =<< trim END
2716cfcd011fSBram Moolenaar    var name: any
2717cfcd011fSBram Moolenaar    assert_equal(0, name)
2718f0afd9e1SBram Moolenaar  END
2719f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2720f0afd9e1SBram Moolenaarenddef
2721f0afd9e1SBram Moolenaar
27227e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
272358dbef33SBram Moolenaar  CheckRunVimInTerminal
272458dbef33SBram Moolenaar
27257e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
27267e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
27277e9210eaSBram Moolenaarendfunc
27287e9210eaSBram Moolenaar
27297e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
27309c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2731cfcd011fSBram Moolenaar  var lines =<< trim END
27329c4f5520SBram Moolenaar    func CheckAndQuit()
27339c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
27349c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
27359c4f5520SBram Moolenaar    endfunc
27369c4f5520SBram Moolenaar  END
27379c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
27389c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2739cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6})
27409c4f5520SBram Moolenaar  # define Afunc() on the command line
27419c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
27429c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
27439c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
27449c4f5520SBram Moolenaar
27459c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
27469c4f5520SBram Moolenaar  delete('XcallFunc')
27479c4f5520SBram Moolenaar  delete('Xdidcmd')
27489c4f5520SBram Moolenaarenddef
27499c4f5520SBram Moolenaar
2750fcdc5d83SBram Moolenaardef Test_script_var_scope()
2751fcdc5d83SBram Moolenaar  var lines =<< trim END
2752fcdc5d83SBram Moolenaar      vim9script
2753fcdc5d83SBram Moolenaar      if true
2754fcdc5d83SBram Moolenaar        if true
2755fcdc5d83SBram Moolenaar          var one = 'one'
2756fcdc5d83SBram Moolenaar          echo one
2757fcdc5d83SBram Moolenaar        endif
2758fcdc5d83SBram Moolenaar        echo one
2759fcdc5d83SBram Moolenaar      endif
2760fcdc5d83SBram Moolenaar  END
2761fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2762fcdc5d83SBram Moolenaar
2763fcdc5d83SBram Moolenaar  lines =<< trim END
2764fcdc5d83SBram Moolenaar      vim9script
2765fcdc5d83SBram Moolenaar      if true
2766fcdc5d83SBram Moolenaar        if false
2767fcdc5d83SBram Moolenaar          var one = 'one'
2768fcdc5d83SBram Moolenaar          echo one
2769fcdc5d83SBram Moolenaar        else
2770fcdc5d83SBram Moolenaar          var one = 'one'
2771fcdc5d83SBram Moolenaar          echo one
2772fcdc5d83SBram Moolenaar        endif
2773fcdc5d83SBram Moolenaar        echo one
2774fcdc5d83SBram Moolenaar      endif
2775fcdc5d83SBram Moolenaar  END
2776fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
2777fcdc5d83SBram Moolenaar
2778fcdc5d83SBram Moolenaar  lines =<< trim END
2779fcdc5d83SBram Moolenaar      vim9script
2780fcdc5d83SBram Moolenaar      while true
2781fcdc5d83SBram Moolenaar        var one = 'one'
2782fcdc5d83SBram Moolenaar        echo one
2783fcdc5d83SBram Moolenaar        break
2784fcdc5d83SBram Moolenaar      endwhile
2785fcdc5d83SBram Moolenaar      echo one
2786fcdc5d83SBram Moolenaar  END
2787fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2788fcdc5d83SBram Moolenaar
2789fcdc5d83SBram Moolenaar  lines =<< trim END
2790fcdc5d83SBram Moolenaar      vim9script
2791fcdc5d83SBram Moolenaar      for i in range(1)
2792fcdc5d83SBram Moolenaar        var one = 'one'
2793fcdc5d83SBram Moolenaar        echo one
2794fcdc5d83SBram Moolenaar      endfor
2795fcdc5d83SBram Moolenaar      echo one
2796fcdc5d83SBram Moolenaar  END
2797fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
27989becdf2bSBram Moolenaar
27999becdf2bSBram Moolenaar  lines =<< trim END
28009becdf2bSBram Moolenaar      vim9script
28019becdf2bSBram Moolenaar      {
28029becdf2bSBram Moolenaar        var one = 'one'
28039becdf2bSBram Moolenaar        assert_equal('one', one)
28049becdf2bSBram Moolenaar      }
28059becdf2bSBram Moolenaar      assert_false(exists('one'))
28069becdf2bSBram Moolenaar      assert_false(exists('s:one'))
28079becdf2bSBram Moolenaar  END
28089becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
28099becdf2bSBram Moolenaar
28109becdf2bSBram Moolenaar  lines =<< trim END
28119becdf2bSBram Moolenaar      vim9script
28129becdf2bSBram Moolenaar      {
28139becdf2bSBram Moolenaar        var one = 'one'
28149becdf2bSBram Moolenaar        echo one
28159becdf2bSBram Moolenaar      }
28169becdf2bSBram Moolenaar      echo one
28179becdf2bSBram Moolenaar  END
28189becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
2819fcdc5d83SBram Moolenaarenddef
2820fcdc5d83SBram Moolenaar
2821585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2822585fea7bSBram Moolenaardef Test_substitute_cmd()
2823585fea7bSBram Moolenaar  new
2824585fea7bSBram Moolenaar  setline(1, 'something')
2825585fea7bSBram Moolenaar  :substitute(some(other(
2826585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2827585fea7bSBram Moolenaar  bwipe!
2828585fea7bSBram Moolenaar
2829f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2830cfcd011fSBram Moolenaar  var lines =<< trim END
2831585fea7bSBram Moolenaar    vim9script
2832585fea7bSBram Moolenaar    new
2833585fea7bSBram Moolenaar    setline(1, 'something')
2834585fea7bSBram Moolenaar    :substitute(some(other(
2835585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2836585fea7bSBram Moolenaar    bwipe!
2837585fea7bSBram Moolenaar  END
2838585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2839585fea7bSBram Moolenaar  source Xvim9lines
2840585fea7bSBram Moolenaar
2841585fea7bSBram Moolenaar  delete('Xvim9lines')
2842585fea7bSBram Moolenaarenddef
2843585fea7bSBram Moolenaar
28448a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2845