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!
26*025cb1caSBram Moolenaar
27*025cb1caSBram Moolenaar  # won't generate anything
28*025cb1caSBram Moolenaar  if false
29*025cb1caSBram Moolenaar    :123
30*025cb1caSBram Moolenaar  endif
315d72ce69SBram Moolenaarenddef
325d72ce69SBram Moolenaar
33a6e67e4fSBram Moolenaarlet g:alist = [7]
34a6e67e4fSBram Moolenaarlet g:astring = 'text'
35f0b9f43cSBram Moolenaarlet g:anumber = 123
366e587dcbSBram Moolenaar
374c17ad94SBram Moolenaardef Test_delfunction()
38f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
394c17ad94SBram Moolenaar  CheckScriptSuccess([
404c17ad94SBram Moolenaar      'vim9script',
414c17ad94SBram Moolenaar      'func CheckMe()',
424c17ad94SBram Moolenaar      '  return 123',
434c17ad94SBram Moolenaar      'endfunc',
444c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
454c17ad94SBram Moolenaar      ])
464c17ad94SBram Moolenaar
47f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
484c17ad94SBram Moolenaar  CheckScriptFailure([
494c17ad94SBram Moolenaar      'vim9script',
504c17ad94SBram Moolenaar      'func DeleteMe1()',
514c17ad94SBram Moolenaar      'endfunc',
524c17ad94SBram Moolenaar      'delfunction DeleteMe1',
534c17ad94SBram Moolenaar      ], 'E1084:')
544c17ad94SBram Moolenaar  CheckScriptFailure([
554c17ad94SBram Moolenaar      'vim9script',
564c17ad94SBram Moolenaar      'func DeleteMe2()',
574c17ad94SBram Moolenaar      'endfunc',
584c17ad94SBram Moolenaar      'def DoThat()',
594c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
604c17ad94SBram Moolenaar      'enddef',
614c17ad94SBram Moolenaar      'DoThat()',
624c17ad94SBram Moolenaar      ], 'E1084:')
634c17ad94SBram Moolenaar  CheckScriptFailure([
644c17ad94SBram Moolenaar      'vim9script',
654c17ad94SBram Moolenaar      'def DeleteMe3()',
664c17ad94SBram Moolenaar      'enddef',
674c17ad94SBram Moolenaar      'delfunction DeleteMe3',
684c17ad94SBram Moolenaar      ], 'E1084:')
694c17ad94SBram Moolenaar  CheckScriptFailure([
704c17ad94SBram Moolenaar      'vim9script',
714c17ad94SBram Moolenaar      'def DeleteMe4()',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'def DoThat()',
744c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
754c17ad94SBram Moolenaar      'enddef',
764c17ad94SBram Moolenaar      'DoThat()',
774c17ad94SBram Moolenaar      ], 'E1084:')
78925e9fd6SBram Moolenaar
79925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
80cfcd011fSBram Moolenaar  var lines =<< trim END
81925e9fd6SBram Moolenaar      vim9script
82925e9fd6SBram Moolenaar      def g:Global(): string
83925e9fd6SBram Moolenaar        return "yes"
84925e9fd6SBram Moolenaar      enddef
85925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
86925e9fd6SBram Moolenaar      def! g:Global(): string
87925e9fd6SBram Moolenaar        return "no"
88925e9fd6SBram Moolenaar      enddef
89925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
90925e9fd6SBram Moolenaar      delfunc g:Global
91925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
92925e9fd6SBram Moolenaar  END
93925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
94925e9fd6SBram Moolenaar
95925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
96925e9fd6SBram Moolenaar  lines =<< trim END
97925e9fd6SBram Moolenaar      vim9script
98925e9fd6SBram Moolenaar      func g:Global()
99925e9fd6SBram Moolenaar        return "yes"
100925e9fd6SBram Moolenaar      endfunc
101925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
102925e9fd6SBram Moolenaar      def! g:Global(): string
103925e9fd6SBram Moolenaar        return "no"
104925e9fd6SBram Moolenaar      enddef
105925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
106925e9fd6SBram Moolenaar      delfunc g:Global
107925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
108925e9fd6SBram Moolenaar  END
109925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
110925e9fd6SBram Moolenaar
111925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
112925e9fd6SBram Moolenaar  lines =<< trim END
113925e9fd6SBram Moolenaar      vim9script
114925e9fd6SBram Moolenaar      def g:Global(): string
115925e9fd6SBram Moolenaar        return "yes"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
118925e9fd6SBram Moolenaar      func! g:Global()
119925e9fd6SBram Moolenaar        return "no"
120925e9fd6SBram Moolenaar      endfunc
121925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
122925e9fd6SBram Moolenaar      delfunc g:Global
123925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
124925e9fd6SBram Moolenaar  END
125925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1264c17ad94SBram Moolenaarenddef
1274c17ad94SBram Moolenaar
12808052228SBram Moolenaardef Test_wrong_type()
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
131cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
133599c89c8SBram Moolenaar
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13642a480bfSBram Moolenaar
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
148a0a9f43aSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
15108052228SBram Moolenaarenddef
1528a7d6542SBram Moolenaar
15310c65860SBram Moolenaardef Test_script_wrong_type()
15410c65860SBram Moolenaar  var lines =<< trim END
15510c65860SBram Moolenaar      vim9script
15610c65860SBram Moolenaar      var s:dict: dict<string>
15710c65860SBram Moolenaar      s:dict['a'] = ['x']
15810c65860SBram Moolenaar  END
15910c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
16010c65860SBram Moolenaarenddef
16110c65860SBram Moolenaar
16208052228SBram Moolenaardef Test_const()
163cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
164cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
165cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16630fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16730fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
168dbeecb2bSBram Moolenaar
169cfcd011fSBram Moolenaar  var lines =<< trim END
17030fd8204SBram Moolenaar    final list = [1, 2, 3]
171dbeecb2bSBram Moolenaar    list[0] = 4
1720b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
17330fd8204SBram Moolenaar    const other = [5, 6, 7]
1740b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17571abe482SBram Moolenaar
176cfcd011fSBram Moolenaar    var varlist = [7, 8]
17730fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17871abe482SBram Moolenaar    varlist[0] = 77
17971abe482SBram Moolenaar    # TODO: does not work yet
18071abe482SBram Moolenaar    # constlist[1][1] = 88
181cfcd011fSBram Moolenaar    var cl = constlist[1]
18271abe482SBram Moolenaar    cl[1] = 88
18371abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
18471abe482SBram Moolenaar
185e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
186e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
18771abe482SBram Moolenaar    vardict['five'] = 55
18871abe482SBram Moolenaar    # TODO: does not work yet
18971abe482SBram Moolenaar    # constdict['two']['six'] = 66
190cfcd011fSBram Moolenaar    var cd = constdict['two']
19171abe482SBram Moolenaar    cd['six'] = 66
192e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
193dbeecb2bSBram Moolenaar  END
194dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19508052228SBram Moolenaarenddef
1968a7d6542SBram Moolenaar
1970b4c66c6SBram Moolenaardef Test_const_bang()
198cfcd011fSBram Moolenaar  var lines =<< trim END
19930fd8204SBram Moolenaar      const var = 234
2000b4c66c6SBram Moolenaar      var = 99
2010b4c66c6SBram Moolenaar  END
2020b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2030b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2040b4c66c6SBram Moolenaar
2050b4c66c6SBram Moolenaar  lines =<< trim END
20630fd8204SBram Moolenaar      const ll = [2, 3, 4]
2070b4c66c6SBram Moolenaar      ll[0] = 99
2080b4c66c6SBram Moolenaar  END
2090b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2100b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2110b4c66c6SBram Moolenaar
2120b4c66c6SBram Moolenaar  lines =<< trim END
21330fd8204SBram Moolenaar      const ll = [2, 3, 4]
2140b4c66c6SBram Moolenaar      ll[3] = 99
2150b4c66c6SBram Moolenaar  END
2160b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2170b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2180b4c66c6SBram Moolenaar
2190b4c66c6SBram Moolenaar  lines =<< trim END
220e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2210b4c66c6SBram Moolenaar      dd["one"] = 99
2220b4c66c6SBram Moolenaar  END
2230b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2240b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2250b4c66c6SBram Moolenaar
2260b4c66c6SBram Moolenaar  lines =<< trim END
227e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2280b4c66c6SBram Moolenaar      dd["three"] = 99
2290b4c66c6SBram Moolenaar  END
2300b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2310b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2320b4c66c6SBram Moolenaarenddef
2330b4c66c6SBram Moolenaar
234df069eecSBram Moolenaardef Test_range_no_colon()
235d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
236d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
237d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
238d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
239df069eecSBram Moolenaarenddef
240df069eecSBram Moolenaar
241df069eecSBram Moolenaar
2428a7d6542SBram Moolenaardef Test_block()
243cfcd011fSBram Moolenaar  var outer = 1
2448a7d6542SBram Moolenaar  {
245cfcd011fSBram Moolenaar    var inner = 2
2468a7d6542SBram Moolenaar    assert_equal(1, outer)
2478a7d6542SBram Moolenaar    assert_equal(2, inner)
2488a7d6542SBram Moolenaar  }
2498a7d6542SBram Moolenaar  assert_equal(1, outer)
2508a7d6542SBram Moolenaarenddef
2518a7d6542SBram Moolenaar
25208052228SBram Moolenaardef Test_block_failure()
253cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
25408052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25508052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25608052228SBram Moolenaarenddef
2578a7d6542SBram Moolenaar
258fbbcd003SBram Moolenaardef Test_block_local_vars()
259fbbcd003SBram Moolenaar  var lines =<< trim END
260fbbcd003SBram Moolenaar      vim9script
261ed234f24SBram Moolenaar      v:testing = 1
262fbbcd003SBram Moolenaar      if true
263ed234f24SBram Moolenaar        var text = ['hello']
264ed234f24SBram Moolenaar        def SayHello(): list<string>
265fbbcd003SBram Moolenaar          return text
266fbbcd003SBram Moolenaar        enddef
267fbbcd003SBram Moolenaar        def SetText(v: string)
268ed234f24SBram Moolenaar          text = [v]
269fbbcd003SBram Moolenaar        enddef
270fbbcd003SBram Moolenaar      endif
271fbbcd003SBram Moolenaar
272fbbcd003SBram Moolenaar      if true
273ed234f24SBram Moolenaar        var text = ['again']
274ed234f24SBram Moolenaar        def SayAgain(): list<string>
275fbbcd003SBram Moolenaar          return text
276fbbcd003SBram Moolenaar        enddef
277fbbcd003SBram Moolenaar      endif
278ed234f24SBram Moolenaar
279ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
280ed234f24SBram Moolenaar      test_garbagecollect_now()
281ed234f24SBram Moolenaar
282fbbcd003SBram Moolenaar      defcompile
283fbbcd003SBram Moolenaar
284ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
285ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
286fbbcd003SBram Moolenaar
287fbbcd003SBram Moolenaar      SetText('foobar')
288ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
289ed234f24SBram Moolenaar
290ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
291ed234f24SBram Moolenaar      qall!
292fbbcd003SBram Moolenaar  END
293ed234f24SBram Moolenaar
294ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
295ed234f24SBram Moolenaar  # context gets garbage collected.
296ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
297ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
298ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
299ed234f24SBram Moolenaar
300ed234f24SBram Moolenaar  delete('Xscript')
301ed234f24SBram Moolenaar  delete('Xdidit')
302fbbcd003SBram Moolenaarenddef
303fbbcd003SBram Moolenaar
30439ca4127SBram Moolenaardef Test_block_local_vars_with_func()
30539ca4127SBram Moolenaar  var lines =<< trim END
30639ca4127SBram Moolenaar      vim9script
30739ca4127SBram Moolenaar      if true
30839ca4127SBram Moolenaar        var foo = 'foo'
30939ca4127SBram Moolenaar        if true
31039ca4127SBram Moolenaar          var bar = 'bar'
31139ca4127SBram Moolenaar          def Func(): list<string>
31239ca4127SBram Moolenaar            return [foo, bar]
31339ca4127SBram Moolenaar          enddef
31439ca4127SBram Moolenaar        endif
31539ca4127SBram Moolenaar      endif
31639ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
31739ca4127SBram Moolenaar      # "foo" and "bar"
31839ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
31939ca4127SBram Moolenaar  END
32039ca4127SBram Moolenaar  CheckScriptSuccess(lines)
32139ca4127SBram Moolenaarenddef
32239ca4127SBram Moolenaar
323d032f34aSBram Moolenaarfunc g:NoSuchFunc()
324d032f34aSBram Moolenaar  echo 'none'
325d032f34aSBram Moolenaarendfunc
326d032f34aSBram Moolenaar
3278a7d6542SBram Moolenaardef Test_try_catch()
328cfcd011fSBram Moolenaar  var l = []
3297a092245SBram Moolenaar  try # comment
3308a7d6542SBram Moolenaar    add(l, '1')
3318a7d6542SBram Moolenaar    throw 'wrong'
3328a7d6542SBram Moolenaar    add(l, '2')
3337a092245SBram Moolenaar  catch # comment
3348a7d6542SBram Moolenaar    add(l, v:exception)
3357a092245SBram Moolenaar  finally # comment
3368a7d6542SBram Moolenaar    add(l, '3')
3377a092245SBram Moolenaar  endtry # comment
3388a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
33968d130c6SBram Moolenaar
340e859312eSBram Moolenaar  l = []
341e859312eSBram Moolenaar  try
342e859312eSBram Moolenaar    try
343e859312eSBram Moolenaar      add(l, '1')
344e859312eSBram Moolenaar      throw 'wrong'
345e859312eSBram Moolenaar      add(l, '2')
346e859312eSBram Moolenaar    catch /right/
347e859312eSBram Moolenaar      add(l, v:exception)
348e859312eSBram Moolenaar    endtry
349e859312eSBram Moolenaar  catch /wrong/
350e859312eSBram Moolenaar    add(l, 'caught')
351373863edSBram Moolenaar  fina
352e859312eSBram Moolenaar    add(l, 'finally')
353e859312eSBram Moolenaar  endtry
354e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
355e859312eSBram Moolenaar
356cfcd011fSBram Moolenaar  var n: number
35768d130c6SBram Moolenaar  try
35868d130c6SBram Moolenaar    n = l[3]
35968d130c6SBram Moolenaar  catch /E684:/
36068d130c6SBram Moolenaar    n = 99
36168d130c6SBram Moolenaar  endtry
36268d130c6SBram Moolenaar  assert_equal(99, n)
36368d130c6SBram Moolenaar
36468d130c6SBram Moolenaar  try
365cc673e74SBram Moolenaar    # string slice returns a string, not a number
36668d130c6SBram Moolenaar    n = g:astring[3]
3675e654230SBram Moolenaar  catch /E1012:/
36868d130c6SBram Moolenaar    n = 77
36968d130c6SBram Moolenaar  endtry
37068d130c6SBram Moolenaar  assert_equal(77, n)
37168d130c6SBram Moolenaar
37268d130c6SBram Moolenaar  try
37368d130c6SBram Moolenaar    n = l[g:astring]
3745e654230SBram Moolenaar  catch /E1012:/
37556acb094SBram Moolenaar    n = 88
37668d130c6SBram Moolenaar  endtry
37756acb094SBram Moolenaar  assert_equal(88, n)
37868d130c6SBram Moolenaar
37968d130c6SBram Moolenaar  try
38068d130c6SBram Moolenaar    n = s:does_not_exist
38168d130c6SBram Moolenaar  catch /E121:/
382f0b9f43cSBram Moolenaar    n = 111
383f0b9f43cSBram Moolenaar  endtry
384f0b9f43cSBram Moolenaar  assert_equal(111, n)
385f0b9f43cSBram Moolenaar
386f0b9f43cSBram Moolenaar  try
387f0b9f43cSBram Moolenaar    n = g:does_not_exist
388f0b9f43cSBram Moolenaar  catch /E121:/
38968d130c6SBram Moolenaar    n = 121
39068d130c6SBram Moolenaar  endtry
39168d130c6SBram Moolenaar  assert_equal(121, n)
39268d130c6SBram Moolenaar
393e0de171eSBram Moolenaar  var d = {one: 1}
39468d130c6SBram Moolenaar  try
39568d130c6SBram Moolenaar    n = d[g:astring]
39668d130c6SBram Moolenaar  catch /E716:/
39768d130c6SBram Moolenaar    n = 222
39868d130c6SBram Moolenaar  endtry
39968d130c6SBram Moolenaar  assert_equal(222, n)
400f0b9f43cSBram Moolenaar
401f0b9f43cSBram Moolenaar  try
402f0b9f43cSBram Moolenaar    n = -g:astring
403f0b9f43cSBram Moolenaar  catch /E39:/
404f0b9f43cSBram Moolenaar    n = 233
405f0b9f43cSBram Moolenaar  endtry
406f0b9f43cSBram Moolenaar  assert_equal(233, n)
407f0b9f43cSBram Moolenaar
408f0b9f43cSBram Moolenaar  try
409f0b9f43cSBram Moolenaar    n = +g:astring
410f0b9f43cSBram Moolenaar  catch /E1030:/
411f0b9f43cSBram Moolenaar    n = 244
412f0b9f43cSBram Moolenaar  endtry
413f0b9f43cSBram Moolenaar  assert_equal(244, n)
414f0b9f43cSBram Moolenaar
415f0b9f43cSBram Moolenaar  try
416f0b9f43cSBram Moolenaar    n = +g:alist
417f0b9f43cSBram Moolenaar  catch /E745:/
418f0b9f43cSBram Moolenaar    n = 255
419f0b9f43cSBram Moolenaar  endtry
420f0b9f43cSBram Moolenaar  assert_equal(255, n)
421f0b9f43cSBram Moolenaar
422cfcd011fSBram Moolenaar  var nd: dict<any>
423f0b9f43cSBram Moolenaar  try
4242bede173SBram Moolenaar    nd = {[g:anumber]: 1}
4255e654230SBram Moolenaar  catch /E1012:/
426f0b9f43cSBram Moolenaar    n = 266
427f0b9f43cSBram Moolenaar  endtry
428f0b9f43cSBram Moolenaar  assert_equal(266, n)
429f0b9f43cSBram Moolenaar
430f0b9f43cSBram Moolenaar  try
431f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
432f0b9f43cSBram Moolenaar  catch /E1093:/
433f0b9f43cSBram Moolenaar    n = 277
434f0b9f43cSBram Moolenaar  endtry
435f0b9f43cSBram Moolenaar  assert_equal(277, n)
436f0b9f43cSBram Moolenaar
437e859312eSBram Moolenaar  try
438e859312eSBram Moolenaar    &ts = g:astring
4395e654230SBram Moolenaar  catch /E1012:/
440e859312eSBram Moolenaar    n = 288
441e859312eSBram Moolenaar  endtry
442e859312eSBram Moolenaar  assert_equal(288, n)
443e859312eSBram Moolenaar
444e859312eSBram Moolenaar  try
445e859312eSBram Moolenaar    &backspace = 'asdf'
446e859312eSBram Moolenaar  catch /E474:/
447e859312eSBram Moolenaar    n = 299
448e859312eSBram Moolenaar  endtry
449e859312eSBram Moolenaar  assert_equal(299, n)
450e859312eSBram Moolenaar
451e859312eSBram Moolenaar  l = [1]
452e859312eSBram Moolenaar  try
453e859312eSBram Moolenaar    l[3] = 3
454e859312eSBram Moolenaar  catch /E684:/
455e859312eSBram Moolenaar    n = 300
456e859312eSBram Moolenaar  endtry
457e859312eSBram Moolenaar  assert_equal(300, n)
458e859312eSBram Moolenaar
459e859312eSBram Moolenaar  try
460e859312eSBram Moolenaar    unlet g:does_not_exist
461e859312eSBram Moolenaar  catch /E108:/
462e859312eSBram Moolenaar    n = 322
463e859312eSBram Moolenaar  endtry
464e859312eSBram Moolenaar  assert_equal(322, n)
465e859312eSBram Moolenaar
466e859312eSBram Moolenaar  try
4672bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
468e859312eSBram Moolenaar  catch /E721:/
469e859312eSBram Moolenaar    n = 333
470e859312eSBram Moolenaar  endtry
471e859312eSBram Moolenaar  assert_equal(333, n)
472e859312eSBram Moolenaar
473e859312eSBram Moolenaar  try
474e859312eSBram Moolenaar    l = DeletedFunc()
475e859312eSBram Moolenaar  catch /E933:/
476e859312eSBram Moolenaar    n = 344
477e859312eSBram Moolenaar  endtry
478e859312eSBram Moolenaar  assert_equal(344, n)
479d032f34aSBram Moolenaar
480d032f34aSBram Moolenaar  try
481d032f34aSBram Moolenaar    echo len(v:true)
482d032f34aSBram Moolenaar  catch /E701:/
483d032f34aSBram Moolenaar    n = 355
484d032f34aSBram Moolenaar  endtry
485d032f34aSBram Moolenaar  assert_equal(355, n)
486d032f34aSBram Moolenaar
487cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
488d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
489d032f34aSBram Moolenaar  try
490d032f34aSBram Moolenaar    echo P()
491d032f34aSBram Moolenaar  catch /E117:/
492d032f34aSBram Moolenaar    n = 366
493d032f34aSBram Moolenaar  endtry
494d032f34aSBram Moolenaar  assert_equal(366, n)
495d032f34aSBram Moolenaar
496d032f34aSBram Moolenaar  try
497d032f34aSBram Moolenaar    echo g:NoSuchFunc()
498d032f34aSBram Moolenaar  catch /E117:/
499d032f34aSBram Moolenaar    n = 377
500d032f34aSBram Moolenaar  endtry
501d032f34aSBram Moolenaar  assert_equal(377, n)
502d032f34aSBram Moolenaar
503d032f34aSBram Moolenaar  try
504d032f34aSBram Moolenaar    echo g:alist + 4
505d032f34aSBram Moolenaar  catch /E745:/
506d032f34aSBram Moolenaar    n = 388
507d032f34aSBram Moolenaar  endtry
508d032f34aSBram Moolenaar  assert_equal(388, n)
509d032f34aSBram Moolenaar
510d032f34aSBram Moolenaar  try
511d032f34aSBram Moolenaar    echo 4 + g:alist
512d032f34aSBram Moolenaar  catch /E745:/
513d032f34aSBram Moolenaar    n = 399
514d032f34aSBram Moolenaar  endtry
515d032f34aSBram Moolenaar  assert_equal(399, n)
516d032f34aSBram Moolenaar
517d032f34aSBram Moolenaar  try
518d032f34aSBram Moolenaar    echo g:alist.member
519d032f34aSBram Moolenaar  catch /E715:/
520d032f34aSBram Moolenaar    n = 400
521d032f34aSBram Moolenaar  endtry
522d032f34aSBram Moolenaar  assert_equal(400, n)
523d032f34aSBram Moolenaar
524d032f34aSBram Moolenaar  try
525d032f34aSBram Moolenaar    echo d.member
526d032f34aSBram Moolenaar  catch /E716:/
527d032f34aSBram Moolenaar    n = 411
528d032f34aSBram Moolenaar  endtry
529d032f34aSBram Moolenaar  assert_equal(411, n)
5308a7d6542SBram Moolenaarenddef
5318a7d6542SBram Moolenaar
532e859312eSBram Moolenaardef DeletedFunc(): list<any>
533e859312eSBram Moolenaar  return ['delete me']
534e859312eSBram Moolenaarenddef
535e859312eSBram Moolenaardefcompile
536e859312eSBram Moolenaardelfunc DeletedFunc
537e859312eSBram Moolenaar
538257cc5eeSBram Moolenaardef ThrowFromDef()
539a72cfb80SBram Moolenaar  throw "getout" # comment
540257cc5eeSBram Moolenaarenddef
541257cc5eeSBram Moolenaar
542257cc5eeSBram Moolenaarfunc CatchInFunc()
543257cc5eeSBram Moolenaar  try
544257cc5eeSBram Moolenaar    call ThrowFromDef()
545257cc5eeSBram Moolenaar  catch
546257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
547257cc5eeSBram Moolenaar  endtry
548257cc5eeSBram Moolenaarendfunc
549257cc5eeSBram Moolenaar
550257cc5eeSBram Moolenaardef CatchInDef()
551257cc5eeSBram Moolenaar  try
552257cc5eeSBram Moolenaar    ThrowFromDef()
553257cc5eeSBram Moolenaar  catch
554257cc5eeSBram Moolenaar    g:thrown_def = v:exception
555257cc5eeSBram Moolenaar  endtry
556257cc5eeSBram Moolenaarenddef
557257cc5eeSBram Moolenaar
558f575adffSBram Moolenaardef ReturnFinally(): string
559f575adffSBram Moolenaar  try
560f575adffSBram Moolenaar    return 'intry'
561373863edSBram Moolenaar  finall
562f575adffSBram Moolenaar    g:in_finally = 'finally'
563f575adffSBram Moolenaar  endtry
564f575adffSBram Moolenaar  return 'end'
565f575adffSBram Moolenaarenddef
566f575adffSBram Moolenaar
567257cc5eeSBram Moolenaardef Test_try_catch_nested()
568257cc5eeSBram Moolenaar  CatchInFunc()
569257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
570257cc5eeSBram Moolenaar
571257cc5eeSBram Moolenaar  CatchInDef()
572257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
573f575adffSBram Moolenaar
574f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
575f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
576f575adffSBram Moolenaarenddef
577f575adffSBram Moolenaar
5789939f57bSBram Moolenaardef TryOne(): number
5799939f57bSBram Moolenaar  try
5809939f57bSBram Moolenaar    return 0
5819939f57bSBram Moolenaar  catch
5829939f57bSBram Moolenaar  endtry
5839939f57bSBram Moolenaar  return 0
5849939f57bSBram Moolenaarenddef
5859939f57bSBram Moolenaar
5869939f57bSBram Moolenaardef TryTwo(n: number): string
5879939f57bSBram Moolenaar  try
588cfcd011fSBram Moolenaar    var x = {}
5899939f57bSBram Moolenaar  catch
5909939f57bSBram Moolenaar  endtry
5919939f57bSBram Moolenaar  return 'text'
5929939f57bSBram Moolenaarenddef
5939939f57bSBram Moolenaar
5949939f57bSBram Moolenaardef Test_try_catch_twice()
5959939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5969939f57bSBram Moolenaarenddef
5979939f57bSBram Moolenaar
598f575adffSBram Moolenaardef Test_try_catch_match()
599cfcd011fSBram Moolenaar  var seq = 'a'
600f575adffSBram Moolenaar  try
601f575adffSBram Moolenaar    throw 'something'
602f575adffSBram Moolenaar  catch /nothing/
603f575adffSBram Moolenaar    seq ..= 'x'
604f575adffSBram Moolenaar  catch /some/
605f575adffSBram Moolenaar    seq ..= 'b'
606f575adffSBram Moolenaar  catch /asdf/
607f575adffSBram Moolenaar    seq ..= 'x'
608e8c4abbbSBram Moolenaar  catch ?a\?sdf?
609e8c4abbbSBram Moolenaar    seq ..= 'y'
610f575adffSBram Moolenaar  finally
611f575adffSBram Moolenaar    seq ..= 'c'
612f575adffSBram Moolenaar  endtry
613f575adffSBram Moolenaar  assert_equal('abc', seq)
614257cc5eeSBram Moolenaarenddef
615257cc5eeSBram Moolenaar
616e8c4abbbSBram Moolenaardef Test_try_catch_fails()
617d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
618d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
619d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
620d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
621d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
622d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
623d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
624d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
62513106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
626d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
627585fea7bSBram Moolenaar
628e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
629d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
630e8c4abbbSBram Moolenaarenddef
631e8c4abbbSBram Moolenaar
632006ad48bSBram Moolenaardef Test_throw_vimscript()
633f5be8cdbSBram Moolenaar  # only checks line continuation
634cfcd011fSBram Moolenaar  var lines =<< trim END
635006ad48bSBram Moolenaar      vim9script
636006ad48bSBram Moolenaar      try
637006ad48bSBram Moolenaar        throw 'one'
638006ad48bSBram Moolenaar              .. 'two'
639006ad48bSBram Moolenaar      catch
640006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
641006ad48bSBram Moolenaar      endtry
642006ad48bSBram Moolenaar  END
643006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
6441e021e63SBram Moolenaar
6451e021e63SBram Moolenaar  lines =<< trim END
6461e021e63SBram Moolenaar    vim9script
647352134bbSBram Moolenaar    @r = ''
6481e021e63SBram Moolenaar    def Func()
6491e021e63SBram Moolenaar      throw @r
6501e021e63SBram Moolenaar    enddef
6511e021e63SBram Moolenaar    var result = ''
6521e021e63SBram Moolenaar    try
6531e021e63SBram Moolenaar      Func()
6541e021e63SBram Moolenaar    catch /E1129:/
6551e021e63SBram Moolenaar      result = 'caught'
6561e021e63SBram Moolenaar    endtry
6571e021e63SBram Moolenaar    assert_equal('caught', result)
6581e021e63SBram Moolenaar  END
6591e021e63SBram Moolenaar  CheckScriptSuccess(lines)
660006ad48bSBram Moolenaarenddef
661006ad48bSBram Moolenaar
662ed677f55SBram Moolenaardef Test_error_in_nested_function()
663ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
664cfcd011fSBram Moolenaar  var lines =<< trim END
665ed677f55SBram Moolenaar      vim9script
666ed677f55SBram Moolenaar      def Func()
667ed677f55SBram Moolenaar        Error()
668ed677f55SBram Moolenaar        g:test_var = 1
669ed677f55SBram Moolenaar      enddef
670ed677f55SBram Moolenaar      func Error() abort
671ed677f55SBram Moolenaar        eval [][0]
672ed677f55SBram Moolenaar      endfunc
673ed677f55SBram Moolenaar      Func()
674ed677f55SBram Moolenaar  END
675ed677f55SBram Moolenaar  g:test_var = 0
676ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
677ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
678ed677f55SBram Moolenaarenddef
679ed677f55SBram Moolenaar
68037c83711SBram Moolenaardef Test_cexpr_vimscript()
681f5be8cdbSBram Moolenaar  # only checks line continuation
68237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
683cfcd011fSBram Moolenaar  var lines =<< trim END
68437c83711SBram Moolenaar      vim9script
68537c83711SBram Moolenaar      cexpr 'File'
68637c83711SBram Moolenaar                .. ' someFile' ..
68737c83711SBram Moolenaar                   ' line 19'
68837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
68937c83711SBram Moolenaar  END
69037c83711SBram Moolenaar  CheckScriptSuccess(lines)
69137c83711SBram Moolenaar  set errorformat&
69237c83711SBram Moolenaarenddef
69337c83711SBram Moolenaar
694c9edd6b5SBram Moolenaardef Test_statusline_syntax()
695c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
696cfcd011fSBram Moolenaar  var lines =<< trim END
697c9edd6b5SBram Moolenaar      vim9script
698c9edd6b5SBram Moolenaar      func g:Status()
699c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
700c9edd6b5SBram Moolenaar      endfunc
701c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
702c9edd6b5SBram Moolenaar      redrawstatus
703c9edd6b5SBram Moolenaar      set laststatus statusline=
704c9edd6b5SBram Moolenaar  END
705c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
706c9edd6b5SBram Moolenaarenddef
707c9edd6b5SBram Moolenaar
708b209750bSBram Moolenaardef Test_list_vimscript()
709b209750bSBram Moolenaar  # checks line continuation and comments
710cfcd011fSBram Moolenaar  var lines =<< trim END
711b209750bSBram Moolenaar      vim9script
712cfcd011fSBram Moolenaar      var mylist = [
713b209750bSBram Moolenaar            'one',
714b209750bSBram Moolenaar            # comment
715b209750bSBram Moolenaar            'two', # empty line follows
716b209750bSBram Moolenaar
717b209750bSBram Moolenaar            'three',
718b209750bSBram Moolenaar            ]
719b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
720b209750bSBram Moolenaar  END
721b209750bSBram Moolenaar  CheckScriptSuccess(lines)
72266250c93SBram Moolenaar
72366250c93SBram Moolenaar  # check all lines from heredoc are kept
72466250c93SBram Moolenaar  lines =<< trim END
72566250c93SBram Moolenaar      # comment 1
72666250c93SBram Moolenaar      two
72766250c93SBram Moolenaar      # comment 3
72866250c93SBram Moolenaar
72966250c93SBram Moolenaar      five
73066250c93SBram Moolenaar      # comment 6
73166250c93SBram Moolenaar  END
73266250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
733b209750bSBram Moolenaarenddef
734b209750bSBram Moolenaar
7352a1381c3SBram Moolenaarif has('channel')
73640ee466cSBram Moolenaar  let someJob = test_null_job()
73740ee466cSBram Moolenaar
73840ee466cSBram Moolenaar  def FuncWithError()
73940ee466cSBram Moolenaar    echomsg g:someJob
74040ee466cSBram Moolenaar  enddef
74140ee466cSBram Moolenaar
74240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
74340ee466cSBram Moolenaar    try
74440ee466cSBram Moolenaar      call FuncWithError()
74540ee466cSBram Moolenaar    catch
74640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
74740ee466cSBram Moolenaar    endtry
74840ee466cSBram Moolenaar  endfunc
7492a1381c3SBram Moolenaarendif
75040ee466cSBram Moolenaar
7518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7528a7d6542SBram Moolenaar  vim9script
753cfcd011fSBram Moolenaar  var name: string = 'bob'
7548a7d6542SBram Moolenaar  def Concat(arg: string): string
7558a7d6542SBram Moolenaar    return name .. arg
7568a7d6542SBram Moolenaar  enddef
757227a69deSBram Moolenaar  g:result = Concat('bie')
758227a69deSBram Moolenaar  g:localname = name
7598a7d6542SBram Moolenaar
7608a7d6542SBram Moolenaar  export const CONST = 1234
761cfcd011fSBram Moolenaar  export var exported = 9876
762cfcd011fSBram Moolenaar  export var exp_name = 'John'
7638a7d6542SBram Moolenaar  export def Exported(): string
7648a7d6542SBram Moolenaar    return 'Exported'
7658a7d6542SBram Moolenaar  enddef
7668a7d6542SBram MoolenaarEND
7678a7d6542SBram Moolenaar
768b3ca9824SBram Moolenaardef Undo_export_script_lines()
769b3ca9824SBram Moolenaar  unlet g:result
770b3ca9824SBram Moolenaar  unlet g:localname
771b3ca9824SBram Moolenaarenddef
772b3ca9824SBram Moolenaar
7735269bd2aSBram Moolenaardef Test_vim9_import_export()
774cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7758a7d6542SBram Moolenaar    vim9script
7768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7778a7d6542SBram Moolenaar    g:imported = exported
7786e587dcbSBram Moolenaar    exported += 3
7796e587dcbSBram Moolenaar    g:imported_added = exported
7808a7d6542SBram Moolenaar    g:imported_func = Exported()
7816e587dcbSBram Moolenaar
78240f4f7a4SBram Moolenaar    def GetExported(): string
783e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
78440f4f7a4SBram Moolenaar      return local_dict.ref()
78540f4f7a4SBram Moolenaar    enddef
78640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
78740f4f7a4SBram Moolenaar
7886e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7896e587dcbSBram Moolenaar    g:imported_name = exp_name
7906e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7916e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7925381c7a1SBram Moolenaar    g:imported_later = exported
7938a7d6542SBram Moolenaar  END
7948a7d6542SBram Moolenaar
7958a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7968a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7978a7d6542SBram Moolenaar
7988a7d6542SBram Moolenaar  source Ximport.vim
7998a7d6542SBram Moolenaar
8008a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8018a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8028a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8036e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8045381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8058a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
80640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
8076e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8086e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8098a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8108a7d6542SBram Moolenaar
811b3ca9824SBram Moolenaar  Undo_export_script_lines()
8128a7d6542SBram Moolenaar  unlet g:imported
8136e587dcbSBram Moolenaar  unlet g:imported_added
8145381c7a1SBram Moolenaar  unlet g:imported_later
8158a7d6542SBram Moolenaar  unlet g:imported_func
8166e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
8178a7d6542SBram Moolenaar  delete('Ximport.vim')
818f2d5c240SBram Moolenaar
8191c991144SBram Moolenaar  # similar, with line breaks
820cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
8211c991144SBram Moolenaar    vim9script
8221c991144SBram Moolenaar    import {
8231c991144SBram Moolenaar        exported,
8241c991144SBram Moolenaar        Exported,
8251c991144SBram Moolenaar        }
8261c991144SBram Moolenaar        from
8271c991144SBram Moolenaar        './Xexport.vim'
8281c991144SBram Moolenaar    g:imported = exported
8291c991144SBram Moolenaar    exported += 5
8301c991144SBram Moolenaar    g:imported_added = exported
8311c991144SBram Moolenaar    g:imported_func = Exported()
8321c991144SBram Moolenaar  END
8331c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8341c991144SBram Moolenaar  source Ximport_lbr.vim
8351c991144SBram Moolenaar
8361c991144SBram Moolenaar  assert_equal(9876, g:imported)
8371c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8381c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8391c991144SBram Moolenaar
8401c991144SBram Moolenaar  # exported script not sourced again
8411c991144SBram Moolenaar  assert_false(exists('g:result'))
8421c991144SBram Moolenaar  unlet g:imported
8431c991144SBram Moolenaar  unlet g:imported_added
8441c991144SBram Moolenaar  unlet g:imported_func
8451c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8461c991144SBram Moolenaar
8471c991144SBram Moolenaar  # import inside :def function
848cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8495381c7a1SBram Moolenaar    vim9script
8505381c7a1SBram Moolenaar    def ImportInDef()
8515381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8525381c7a1SBram Moolenaar      g:imported = exported
8535381c7a1SBram Moolenaar      exported += 7
8545381c7a1SBram Moolenaar      g:imported_added = exported
8555381c7a1SBram Moolenaar    enddef
8565381c7a1SBram Moolenaar    ImportInDef()
8575381c7a1SBram Moolenaar  END
8585381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8595381c7a1SBram Moolenaar  source Ximport2.vim
860f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8615381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8625381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8635381c7a1SBram Moolenaar  unlet g:imported
8645381c7a1SBram Moolenaar  unlet g:imported_added
8655381c7a1SBram Moolenaar  delete('Ximport2.vim')
8665381c7a1SBram Moolenaar
867cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
868f2d5c240SBram Moolenaar    vim9script
869f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
870f2d5c240SBram Moolenaar    def UseExport()
871f2d5c240SBram Moolenaar      g:imported = Export.exported
872f2d5c240SBram Moolenaar    enddef
873f2d5c240SBram Moolenaar    UseExport()
874f2d5c240SBram Moolenaar  END
875f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
876f2d5c240SBram Moolenaar  source Ximport.vim
8775381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
878f2d5c240SBram Moolenaar
879cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
880599c89c8SBram Moolenaar    vim9script
881599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
882599c89c8SBram Moolenaar    def Func()
883cfcd011fSBram Moolenaar      var dummy = 1
884cfcd011fSBram Moolenaar      var imported = Export + dummy
885599c89c8SBram Moolenaar    enddef
886822ba247SBram Moolenaar    defcompile
887599c89c8SBram Moolenaar  END
888599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
88944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
890599c89c8SBram Moolenaar
891cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
892599c89c8SBram Moolenaar    vim9script
893599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
894599c89c8SBram Moolenaar    def Func()
895cfcd011fSBram Moolenaar      var imported = Export . exported
896599c89c8SBram Moolenaar    enddef
897822ba247SBram Moolenaar    defcompile
898599c89c8SBram Moolenaar  END
899599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
90044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
901599c89c8SBram Moolenaar
902cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
903599c89c8SBram Moolenaar    vim9script
904599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
905599c89c8SBram Moolenaar    def Func()
906cfcd011fSBram Moolenaar      var imported = Export.
907599c89c8SBram Moolenaar    enddef
908822ba247SBram Moolenaar    defcompile
909599c89c8SBram Moolenaar  END
910599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
91144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
912599c89c8SBram Moolenaar
913cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
9141c991144SBram Moolenaar    vim9script
9151c991144SBram Moolenaar    import *
9161c991144SBram Moolenaar        as Export
9171c991144SBram Moolenaar        from
9181c991144SBram Moolenaar        './Xexport.vim'
9191c991144SBram Moolenaar    def UseExport()
9201c991144SBram Moolenaar      g:imported = Export.exported
9211c991144SBram Moolenaar    enddef
9221c991144SBram Moolenaar    UseExport()
9231c991144SBram Moolenaar  END
9241c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9251c991144SBram Moolenaar  source Ximport.vim
9261c991144SBram Moolenaar  assert_equal(9883, g:imported)
9271c991144SBram Moolenaar
928cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
929f2d5c240SBram Moolenaar    vim9script
930f2d5c240SBram Moolenaar    import * from './Xexport.vim'
931f2d5c240SBram Moolenaar  END
932f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
93344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
934f2d5c240SBram Moolenaar
935f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
936cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
937fa29c8abSBram Moolenaar    vim9script
938fa29c8abSBram Moolenaar    import name from './Xexport.vim'
939fa29c8abSBram Moolenaar  END
940fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
94144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
942fa29c8abSBram Moolenaar
943f5be8cdbSBram Moolenaar  # try to import something that is already defined
944cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9455269bd2aSBram Moolenaar    vim9script
946cfcd011fSBram Moolenaar    var exported = 'something'
9475269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9485269bd2aSBram Moolenaar  END
9495269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
95044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9515269bd2aSBram Moolenaar
952f5be8cdbSBram Moolenaar  # try to import something that is already defined
9535269bd2aSBram Moolenaar  import_already_defined =<< trim END
9545269bd2aSBram Moolenaar    vim9script
955cfcd011fSBram Moolenaar    var exported = 'something'
9565269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9575269bd2aSBram Moolenaar  END
9585269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
95944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9605269bd2aSBram Moolenaar
961f5be8cdbSBram Moolenaar  # try to import something that is already defined
9625269bd2aSBram Moolenaar  import_already_defined =<< trim END
9635269bd2aSBram Moolenaar    vim9script
964cfcd011fSBram Moolenaar    var exported = 'something'
9655269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9665269bd2aSBram Moolenaar  END
9675269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
96844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9695269bd2aSBram Moolenaar
970918a4249SBram Moolenaar  # try changing an imported const
971918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
972918a4249SBram Moolenaar    vim9script
973918a4249SBram Moolenaar    import CONST from './Xexport.vim'
974918a4249SBram Moolenaar    def Assign()
975918a4249SBram Moolenaar      CONST = 987
976918a4249SBram Moolenaar    enddef
977918a4249SBram Moolenaar    defcompile
978918a4249SBram Moolenaar  END
979918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
980918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
981918a4249SBram Moolenaar
982f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
983cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
984fa29c8abSBram Moolenaar    vim9script
985fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
986fa29c8abSBram Moolenaar  END
987fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
98844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
989fa29c8abSBram Moolenaar
990cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
991fa29c8abSBram Moolenaar    vim9script
992fa29c8abSBram Moolenaar    import name './Xexport.vim'
993fa29c8abSBram Moolenaar  END
994fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
99544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
996fa29c8abSBram Moolenaar
997cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
998fa29c8abSBram Moolenaar    vim9script
999fa29c8abSBram Moolenaar    import name from Xexport.vim
1000fa29c8abSBram Moolenaar  END
1001fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
100244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1003fa29c8abSBram Moolenaar
1004cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1005fa29c8abSBram Moolenaar    vim9script
1006fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1007fa29c8abSBram Moolenaar  END
1008fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
100944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1010fa29c8abSBram Moolenaar
1011cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1012fa29c8abSBram Moolenaar    vim9script
1013fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1014fa29c8abSBram Moolenaar  END
10155269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
101644d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1017fa29c8abSBram Moolenaar
1018f2d5c240SBram Moolenaar  delete('Ximport.vim')
10195269bd2aSBram Moolenaar  delete('Ximport3.vim')
10208a7d6542SBram Moolenaar  delete('Xexport.vim')
10218a7d6542SBram Moolenaar
1022f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1023750802b5SBram Moolenaar  set cpo&vi
1024cfcd011fSBram Moolenaar  var cpo_before = &cpo
1025cfcd011fSBram Moolenaar  var lines =<< trim END
1026750802b5SBram Moolenaar    vim9script
1027750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1028750802b5SBram Moolenaar  END
1029750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1030750802b5SBram Moolenaar  source Xvim9_script
1031750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1032750802b5SBram Moolenaar  set cpo&vim
1033750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1034750802b5SBram Moolenaar  delete('Xvim9_script')
1035750802b5SBram Moolenaarenddef
1036750802b5SBram Moolenaar
1037803af686SBram Moolenaarfunc g:Trigger()
1038803af686SBram Moolenaar  source Ximport.vim
1039803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1040803af686SBram Moolenaarendfunc
1041803af686SBram Moolenaar
1042803af686SBram Moolenaardef Test_import_export_expr_map()
1043803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1044cfcd011fSBram Moolenaar  var export_lines =<< trim END
1045803af686SBram Moolenaar    vim9script
1046803af686SBram Moolenaar    export def That(): string
1047803af686SBram Moolenaar      return 'yes'
1048803af686SBram Moolenaar    enddef
1049803af686SBram Moolenaar  END
1050803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1051803af686SBram Moolenaar
1052cfcd011fSBram Moolenaar  var import_lines =<< trim END
1053803af686SBram Moolenaar    vim9script
1054803af686SBram Moolenaar    import That from './Xexport_that.vim'
1055803af686SBram Moolenaar    assert_equal('yes', That())
1056803af686SBram Moolenaar  END
1057803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1058803af686SBram Moolenaar
1059803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1060803af686SBram Moolenaar  feedkeys('trigger', "xt")
1061803af686SBram Moolenaar
1062730b2483SBram Moolenaar  delete('Xexport_that.vim')
1063803af686SBram Moolenaar  delete('Ximport.vim')
1064803af686SBram Moolenaar  nunmap trigger
1065803af686SBram Moolenaarenddef
1066803af686SBram Moolenaar
10678e1986e3SBram Moolenaardef Test_import_in_filetype()
10688e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10698e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1070cfcd011fSBram Moolenaar  var export_lines =<< trim END
10718e1986e3SBram Moolenaar    vim9script
1072cfcd011fSBram Moolenaar    export var That = 'yes'
10738e1986e3SBram Moolenaar  END
1074730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10758e1986e3SBram Moolenaar
1076cfcd011fSBram Moolenaar  var import_lines =<< trim END
10778e1986e3SBram Moolenaar    vim9script
1078730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10798e1986e3SBram Moolenaar    assert_equal('yes', That)
10808e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10818e1986e3SBram Moolenaar  END
10828e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10838e1986e3SBram Moolenaar
1084cfcd011fSBram Moolenaar  var save_rtp = &rtp
10858e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10868e1986e3SBram Moolenaar
10878e1986e3SBram Moolenaar  filetype plugin on
10888e1986e3SBram Moolenaar  copen
10898e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10908e1986e3SBram Moolenaar
10918e1986e3SBram Moolenaar  quit!
1092730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10938e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10948e1986e3SBram Moolenaar  &rtp = save_rtp
10958e1986e3SBram Moolenaarenddef
10968e1986e3SBram Moolenaar
1097efa94447SBram Moolenaardef Test_use_import_in_mapping()
1098cfcd011fSBram Moolenaar  var lines =<< trim END
1099efa94447SBram Moolenaar      vim9script
1100efa94447SBram Moolenaar      export def Funcx()
1101efa94447SBram Moolenaar        g:result = 42
1102efa94447SBram Moolenaar      enddef
1103efa94447SBram Moolenaar  END
1104efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1105efa94447SBram Moolenaar  lines =<< trim END
1106efa94447SBram Moolenaar      vim9script
1107efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1108b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1109efa94447SBram Moolenaar  END
1110efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1111efa94447SBram Moolenaar
1112efa94447SBram Moolenaar  source Xmapscript.vim
1113b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1114efa94447SBram Moolenaar  assert_equal(42, g:result)
1115efa94447SBram Moolenaar
1116efa94447SBram Moolenaar  unlet g:result
1117efa94447SBram Moolenaar  delete('XsomeExport.vim')
1118efa94447SBram Moolenaar  delete('Xmapscript.vim')
1119b3ca9824SBram Moolenaar  nunmap <F3>
1120efa94447SBram Moolenaarenddef
1121efa94447SBram Moolenaar
1122750802b5SBram Moolenaardef Test_vim9script_fails()
11238a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11248a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1125cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
11269721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1127cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1128750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1129750802b5SBram Moolenaar
1130cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1131c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1132c785b9a7SBram Moolenaar
1133e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1134e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
11358a7d6542SBram Moolenaarenddef
11368a7d6542SBram Moolenaar
1137f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1138101f4810SBram Moolenaar  CheckRunVimInTerminal
1139101f4810SBram Moolenaar
11409bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1141c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11429bb3eb3eSBram Moolenaarendfunc
11439bb3eb3eSBram Moolenaar
1144c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1145cfcd011fSBram Moolenaar  var export =<< trim END
1146101f4810SBram Moolenaar    vim9script
1147101f4810SBram Moolenaar    export def Foo(): number
1148101f4810SBram Moolenaar        return 0
1149101f4810SBram Moolenaar    enddef
1150101f4810SBram Moolenaar  END
1151730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1152101f4810SBram Moolenaar
1153e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
11549bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11559bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1156101f4810SBram Moolenaar
1157730b2483SBram Moolenaar  delete('XexportCmd.vim')
11589bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11599bb3eb3eSBram Moolenaarenddef
1160101f4810SBram Moolenaar
11614c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1162cfcd011fSBram Moolenaar  var lines =<< trim END
11638a7d6542SBram Moolenaar    vim9script
11648a7d6542SBram Moolenaar    const var = ''
1165cfcd011fSBram Moolenaar    var valone = 1234
11668a7d6542SBram Moolenaar    def MyFunc(arg: string)
11678a7d6542SBram Moolenaar       valone = 5678
11688a7d6542SBram Moolenaar    enddef
11698a7d6542SBram Moolenaar  END
1170cfcd011fSBram Moolenaar  var morelines =<< trim END
1171cfcd011fSBram Moolenaar    var valtwo = 222
11728a7d6542SBram Moolenaar    export def GetValtwo(): number
11738a7d6542SBram Moolenaar      return valtwo
11748a7d6542SBram Moolenaar    enddef
11758a7d6542SBram Moolenaar  END
117603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11778a7d6542SBram Moolenaar  source Xreload.vim
11788a7d6542SBram Moolenaar  source Xreload.vim
11798a7d6542SBram Moolenaar  source Xreload.vim
11808a7d6542SBram Moolenaar
1181cfcd011fSBram Moolenaar  var testlines =<< trim END
11828a7d6542SBram Moolenaar    vim9script
11838a7d6542SBram Moolenaar    def TheFunc()
11848a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11858a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11868a7d6542SBram Moolenaar    enddef
11878a7d6542SBram Moolenaar    TheFunc()
11888a7d6542SBram Moolenaar  END
11898a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11908a7d6542SBram Moolenaar  source Ximport.vim
11918a7d6542SBram Moolenaar
1192f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1193f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11948a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11958a7d6542SBram Moolenaar  source Ximport.vim
11968a7d6542SBram Moolenaar
1197f5be8cdbSBram Moolenaar  # cannot declare a var twice
11988a7d6542SBram Moolenaar  lines =<< trim END
11998a7d6542SBram Moolenaar    vim9script
1200cfcd011fSBram Moolenaar    var valone = 1234
1201cfcd011fSBram Moolenaar    var valone = 5678
12028a7d6542SBram Moolenaar  END
12038a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
120444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
12058a7d6542SBram Moolenaar
12068a7d6542SBram Moolenaar  delete('Xreload.vim')
12078a7d6542SBram Moolenaar  delete('Ximport.vim')
12088a7d6542SBram Moolenaarenddef
12098a7d6542SBram Moolenaar
121095006e3dSBram Moolenaardef s:RetSome(): string
121195006e3dSBram Moolenaar  return 'some'
121295006e3dSBram Moolenaarenddef
121395006e3dSBram Moolenaar
1214fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1215fe465a01SBram Moolenaar" script-local name.
1216fe465a01SBram Moolenaardef Test_vim9script_funcref()
1217cfcd011fSBram Moolenaar  var sortlines =<< trim END
1218fe465a01SBram Moolenaar      vim9script
1219fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1220bed36b93SBram Moolenaar        return i2 - i1
1221fe465a01SBram Moolenaar      enddef
1222fe465a01SBram Moolenaar
1223fe465a01SBram Moolenaar      export def FastSort(): list<number>
1224fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1225fe465a01SBram Moolenaar      enddef
1226fe465a01SBram Moolenaar  END
1227fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1228fe465a01SBram Moolenaar
1229cfcd011fSBram Moolenaar  var lines =<< trim END
1230fe465a01SBram Moolenaar    vim9script
1231fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1232fe465a01SBram Moolenaar    def Test()
1233fe465a01SBram Moolenaar      g:result = FastSort()
1234fe465a01SBram Moolenaar    enddef
1235fe465a01SBram Moolenaar    Test()
1236fe465a01SBram Moolenaar  END
1237fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1238fe465a01SBram Moolenaar
1239fe465a01SBram Moolenaar  source Xscript.vim
1240fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1241fe465a01SBram Moolenaar
1242fe465a01SBram Moolenaar  unlet g:result
1243fe465a01SBram Moolenaar  delete('Xsort.vim')
1244fe465a01SBram Moolenaar  delete('Xscript.vim')
124595006e3dSBram Moolenaar
1246cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
124795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1248fe465a01SBram Moolenaarenddef
1249fe465a01SBram Moolenaar
1250601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1251601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1252601e76acSBram Moolenaar" function reference.
1253c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1254cfcd011fSBram Moolenaar  var filterLines =<< trim END
1255c620c055SBram Moolenaar    vim9script
1256c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1257c620c055SBram Moolenaar      return idx % 2 == 1
1258c620c055SBram Moolenaar    enddef
1259c620c055SBram Moolenaar    export def FastFilter(): list<number>
1260c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1261c620c055SBram Moolenaar    enddef
1262601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1263601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1264601e76acSBram Moolenaar    enddef
1265c620c055SBram Moolenaar  END
1266c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1267c620c055SBram Moolenaar
1268cfcd011fSBram Moolenaar  var lines =<< trim END
1269c620c055SBram Moolenaar    vim9script
1270601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1271c620c055SBram Moolenaar    def Test()
1272cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1273c620c055SBram Moolenaar    enddef
1274c620c055SBram Moolenaar    Test()
1275601e76acSBram Moolenaar    def TestDirect()
1276cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1277601e76acSBram Moolenaar    enddef
1278601e76acSBram Moolenaar    TestDirect()
1279c620c055SBram Moolenaar  END
1280601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1281c620c055SBram Moolenaar  delete('Xfilter.vim')
1282c620c055SBram Moolenaarenddef
1283c620c055SBram Moolenaar
12844c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1285cfcd011fSBram Moolenaar  var first_lines =<< trim END
12864c17ad94SBram Moolenaar    vim9script
12874c17ad94SBram Moolenaar    def FuncYes(): string
12884c17ad94SBram Moolenaar      return 'yes'
12894c17ad94SBram Moolenaar    enddef
12904c17ad94SBram Moolenaar  END
1291cfcd011fSBram Moolenaar  var withno_lines =<< trim END
12924c17ad94SBram Moolenaar    def FuncNo(): string
12934c17ad94SBram Moolenaar      return 'no'
12944c17ad94SBram Moolenaar    enddef
12954c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12964c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12974c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
129803afdcf1SBram Moolenaar    enddef
129903afdcf1SBram Moolenaar  END
1300cfcd011fSBram Moolenaar  var nono_lines =<< trim END
130103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
130203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
130344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
13044c17ad94SBram Moolenaar    enddef
13054c17ad94SBram Moolenaar  END
13064c17ad94SBram Moolenaar
13074c17ad94SBram Moolenaar  # FuncNo() is defined
130803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13094c17ad94SBram Moolenaar  source Xreloaded.vim
13104c17ad94SBram Moolenaar  g:DoCheck(true)
13114c17ad94SBram Moolenaar
13124c17ad94SBram Moolenaar  # FuncNo() is not redefined
131303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13144c17ad94SBram Moolenaar  source Xreloaded.vim
131503afdcf1SBram Moolenaar  g:DoCheck()
13164c17ad94SBram Moolenaar
13174c17ad94SBram Moolenaar  # FuncNo() is back
131803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13194c17ad94SBram Moolenaar  source Xreloaded.vim
132003afdcf1SBram Moolenaar  g:DoCheck()
13214c17ad94SBram Moolenaar
13224c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13234c17ad94SBram Moolenaarenddef
13244c17ad94SBram Moolenaar
132589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
132689483d40SBram Moolenaar  # write the script with a script-local variable
1327cfcd011fSBram Moolenaar  var lines =<< trim END
132889483d40SBram Moolenaar    vim9script
1329cfcd011fSBram Moolenaar    var name = 'string'
133089483d40SBram Moolenaar  END
133189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
133289483d40SBram Moolenaar  source XreloadVar.vim
133389483d40SBram Moolenaar
133489483d40SBram Moolenaar  # now write the script using the same variable locally - works
133589483d40SBram Moolenaar  lines =<< trim END
133689483d40SBram Moolenaar    vim9script
133789483d40SBram Moolenaar    def Func()
1338cfcd011fSBram Moolenaar      var name = 'string'
133989483d40SBram Moolenaar    enddef
134089483d40SBram Moolenaar  END
134189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
134289483d40SBram Moolenaar  source XreloadVar.vim
134389483d40SBram Moolenaar
134489483d40SBram Moolenaar  delete('XreloadVar.vim')
134589483d40SBram Moolenaarenddef
134689483d40SBram Moolenaar
13478a7d6542SBram Moolenaardef Test_import_absolute()
1348cfcd011fSBram Moolenaar  var import_lines = [
1349e6085c53SBram Moolenaar        'vim9script',
1350e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1351e6085c53SBram Moolenaar        'def UseExported()',
1352e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1353e6085c53SBram Moolenaar        '  exported = 8888',
1354e6085c53SBram Moolenaar        '  g:imported_after = exported',
1355e6085c53SBram Moolenaar        'enddef',
1356e6085c53SBram Moolenaar        'UseExported()',
1357e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1358e6085c53SBram Moolenaar        ]
13598a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13608a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13618a7d6542SBram Moolenaar
13628a7d6542SBram Moolenaar  source Ximport_abs.vim
13638a7d6542SBram Moolenaar
13648a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13654e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1366fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1367fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1368fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1369fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1370fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1371fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1372fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1373fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1374fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1375fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1376e6085c53SBram Moolenaar        g:import_disassembled)
1377b3ca9824SBram Moolenaar
1378b3ca9824SBram Moolenaar  Undo_export_script_lines()
13798a7d6542SBram Moolenaar  unlet g:imported_abs
13804e12a5dfSBram Moolenaar  unlet g:import_disassembled
13818a7d6542SBram Moolenaar
13828a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13838a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13848a7d6542SBram Moolenaarenddef
13858a7d6542SBram Moolenaar
13868a7d6542SBram Moolenaardef Test_import_rtp()
1387cfcd011fSBram Moolenaar  var import_lines = [
1388e6085c53SBram Moolenaar        'vim9script',
1389e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1390e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1391e6085c53SBram Moolenaar        ]
13928a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13938a7d6542SBram Moolenaar  mkdir('import')
13948a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13958a7d6542SBram Moolenaar
1396cfcd011fSBram Moolenaar  var save_rtp = &rtp
13978a7d6542SBram Moolenaar  &rtp = getcwd()
13988a7d6542SBram Moolenaar  source Ximport_rtp.vim
13998a7d6542SBram Moolenaar  &rtp = save_rtp
14008a7d6542SBram Moolenaar
14018a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
14028a7d6542SBram Moolenaar
1403b3ca9824SBram Moolenaar  Undo_export_script_lines()
1404b3ca9824SBram Moolenaar  unlet g:imported_rtp
14058a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
140689483d40SBram Moolenaar  delete('import', 'rf')
14078a7d6542SBram Moolenaarenddef
14088a7d6542SBram Moolenaar
140925e0f586SBram Moolenaardef Test_import_compile_error()
1410cfcd011fSBram Moolenaar  var export_lines = [
141125e0f586SBram Moolenaar        'vim9script',
141225e0f586SBram Moolenaar        'export def ExpFunc(): string',
141325e0f586SBram Moolenaar        '  return notDefined',
141425e0f586SBram Moolenaar        'enddef',
141525e0f586SBram Moolenaar        ]
141625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
141725e0f586SBram Moolenaar
1418cfcd011fSBram Moolenaar  var import_lines = [
141925e0f586SBram Moolenaar        'vim9script',
142025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
142125e0f586SBram Moolenaar        'def ImpFunc()',
142225e0f586SBram Moolenaar        '  echo ExpFunc()',
142325e0f586SBram Moolenaar        'enddef',
142425e0f586SBram Moolenaar        'defcompile',
142525e0f586SBram Moolenaar        ]
142625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
142725e0f586SBram Moolenaar
142825e0f586SBram Moolenaar  try
142925e0f586SBram Moolenaar    source Ximport.vim
143025e0f586SBram Moolenaar  catch /E1001/
1431f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
14327707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
143325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
143425e0f586SBram Moolenaar  endtry
143525e0f586SBram Moolenaar
143625e0f586SBram Moolenaar  delete('Xexported.vim')
143725e0f586SBram Moolenaar  delete('Ximport.vim')
143825e0f586SBram Moolenaarenddef
143925e0f586SBram Moolenaar
1440c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1441cfcd011fSBram Moolenaar  var lines = [
1442c4ce36d4SBram Moolenaar        'vim9script',
1443c4ce36d4SBram Moolenaar        'def Func()',
1444c4ce36d4SBram Moolenaar        '  eval [][0]',
1445c4ce36d4SBram Moolenaar        'enddef',
1446c4ce36d4SBram Moolenaar        'Func()',
1447c4ce36d4SBram Moolenaar        ]
1448c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1449c4ce36d4SBram Moolenaar
1450c4ce36d4SBram Moolenaar  for count in range(3)
1451c4ce36d4SBram Moolenaar    try
1452c4ce36d4SBram Moolenaar      source Xtestscript.vim
1453c4ce36d4SBram Moolenaar    catch /E684/
1454c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1455c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1456c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1457c4ce36d4SBram Moolenaar    endtry
1458c4ce36d4SBram Moolenaar  endfor
1459c4ce36d4SBram Moolenaar
1460c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1461c4ce36d4SBram Moolenaarenddef
1462c4ce36d4SBram Moolenaar
1463eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1464cfcd011fSBram Moolenaar  var export_lines =<< trim END
1465eef2102eSBram Moolenaar      vim9script
1466eef2102eSBram Moolenaar      export def Func()
1467eef2102eSBram Moolenaar        echo 'imported'
1468eef2102eSBram Moolenaar      enddef
1469eef2102eSBram Moolenaar  END
1470eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1471eef2102eSBram Moolenaar
1472cfcd011fSBram Moolenaar  var lines =<< trim END
1473eef2102eSBram Moolenaar    vim9script
1474eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1475eef2102eSBram Moolenaar    def Func()
1476eef2102eSBram Moolenaar      echo 'local to function'
1477eef2102eSBram Moolenaar    enddef
1478eef2102eSBram Moolenaar  END
1479eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1480eef2102eSBram Moolenaar
1481eef2102eSBram Moolenaar  lines =<< trim END
1482eef2102eSBram Moolenaar    vim9script
1483eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1484eef2102eSBram Moolenaar    def Outer()
1485eef2102eSBram Moolenaar      def Func()
1486eef2102eSBram Moolenaar        echo 'local to function'
1487eef2102eSBram Moolenaar      enddef
1488eef2102eSBram Moolenaar    enddef
1489eef2102eSBram Moolenaar    defcompile
1490eef2102eSBram Moolenaar  END
1491eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1492eef2102eSBram Moolenaar
1493eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1494eef2102eSBram Moolenaarenddef
1495eef2102eSBram Moolenaar
1496b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1497cfcd011fSBram Moolenaar  var lines =<< trim END
1498b9a2cac3SBram Moolenaar    vim9script
1499b9a2cac3SBram Moolenaar    def Func()
1500b9a2cac3SBram Moolenaar      echo 'one'
1501b9a2cac3SBram Moolenaar    enddef
1502b9a2cac3SBram Moolenaar    def Func()
1503b9a2cac3SBram Moolenaar      echo 'two'
1504b9a2cac3SBram Moolenaar    enddef
1505b9a2cac3SBram Moolenaar  END
1506b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1507fa211f3cSBram Moolenaar
1508fa211f3cSBram Moolenaar  lines =<< trim END
1509fa211f3cSBram Moolenaar    vim9script
1510fa211f3cSBram Moolenaar    def Foo(): string
1511fa211f3cSBram Moolenaar      return 'foo'
1512fa211f3cSBram Moolenaar      enddef
1513fa211f3cSBram Moolenaar    def Func()
1514cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1515fa211f3cSBram Moolenaar    enddef
1516fa211f3cSBram Moolenaar    defcompile
1517fa211f3cSBram Moolenaar  END
1518fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1519b9a2cac3SBram Moolenaarenddef
1520b9a2cac3SBram Moolenaar
15218a7d6542SBram Moolenaardef Test_fixed_size_list()
1522f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1523cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
15248a7d6542SBram Moolenaar  l->remove(0)
15258a7d6542SBram Moolenaar  l->add(5)
15268a7d6542SBram Moolenaar  l->insert(99, 1)
15270f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
15288a7d6542SBram Moolenaarenddef
15298a7d6542SBram Moolenaar
1530ae616494SBram Moolenaardef Test_no_insert_xit()
1531d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1532d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1533d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1534d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1535d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1536ae616494SBram Moolenaar
1537ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1538ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1539ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1540ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1541f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1542f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1543f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1544f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1545f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1546ae616494SBram Moolenaarenddef
1547ae616494SBram Moolenaar
1548158906cfSBram Moolenaardef IfElse(what: number): string
1549cfcd011fSBram Moolenaar  var res = ''
1550158906cfSBram Moolenaar  if what == 1
1551158906cfSBram Moolenaar    res = "one"
1552158906cfSBram Moolenaar  elseif what == 2
1553158906cfSBram Moolenaar    res = "two"
1554a259d8d3SBram Moolenaar  else
1555158906cfSBram Moolenaar    res = "three"
1556a259d8d3SBram Moolenaar  endif
1557158906cfSBram Moolenaar  return res
1558a259d8d3SBram Moolenaarenddef
1559a259d8d3SBram Moolenaar
1560158906cfSBram Moolenaardef Test_if_elseif_else()
1561158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1562158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1563158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15640f18b6d1SBram Moolenaarenddef
15650f18b6d1SBram Moolenaar
1566e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1567d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1568d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1569d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1570d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1571d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1572e8c4abbbSBram Moolenaarenddef
1573e8c4abbbSBram Moolenaar
15746d69bf60SBram Moolenaarlet g:bool_true = v:true
15756d69bf60SBram Moolenaarlet g:bool_false = v:false
15766d69bf60SBram Moolenaar
15776d69bf60SBram Moolenaardef Test_if_const_expr()
1578cfcd011fSBram Moolenaar  var res = false
15796d69bf60SBram Moolenaar  if true ? true : false
15806d69bf60SBram Moolenaar    res = true
15816d69bf60SBram Moolenaar  endif
15826d69bf60SBram Moolenaar  assert_equal(true, res)
15836d69bf60SBram Moolenaar
1584585fea7bSBram Moolenaar  g:glob = 2
1585585fea7bSBram Moolenaar  if false
15866797966dSBram Moolenaar    execute('g:glob = 3')
1587585fea7bSBram Moolenaar  endif
1588585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1589585fea7bSBram Moolenaar  if true
15906797966dSBram Moolenaar    execute('g:glob = 3')
1591585fea7bSBram Moolenaar  endif
1592585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1593585fea7bSBram Moolenaar
15946d69bf60SBram Moolenaar  res = false
15956d69bf60SBram Moolenaar  if g:bool_true ? true : false
15966d69bf60SBram Moolenaar    res = true
15976d69bf60SBram Moolenaar  endif
15986d69bf60SBram Moolenaar  assert_equal(true, res)
15996d69bf60SBram Moolenaar
16006d69bf60SBram Moolenaar  res = false
16016d69bf60SBram Moolenaar  if true ? g:bool_true : false
16026d69bf60SBram Moolenaar    res = true
16036d69bf60SBram Moolenaar  endif
16046d69bf60SBram Moolenaar  assert_equal(true, res)
16056d69bf60SBram Moolenaar
16066d69bf60SBram Moolenaar  res = false
16076d69bf60SBram Moolenaar  if true ? true : g:bool_false
16086d69bf60SBram Moolenaar    res = true
16096d69bf60SBram Moolenaar  endif
16106d69bf60SBram Moolenaar  assert_equal(true, res)
16116d69bf60SBram Moolenaar
16126d69bf60SBram Moolenaar  res = false
16136d69bf60SBram Moolenaar  if true ? false : true
16146d69bf60SBram Moolenaar    res = true
16156d69bf60SBram Moolenaar  endif
16166d69bf60SBram Moolenaar  assert_equal(false, res)
16176d69bf60SBram Moolenaar
16186d69bf60SBram Moolenaar  res = false
16196d69bf60SBram Moolenaar  if false ? false : true
16206d69bf60SBram Moolenaar    res = true
16216d69bf60SBram Moolenaar  endif
16226d69bf60SBram Moolenaar  assert_equal(true, res)
16236d69bf60SBram Moolenaar
16246d69bf60SBram Moolenaar  res = false
16256d69bf60SBram Moolenaar  if false ? true : false
16266d69bf60SBram Moolenaar    res = true
16276d69bf60SBram Moolenaar  endif
16286d69bf60SBram Moolenaar  assert_equal(false, res)
16296d69bf60SBram Moolenaar
16306d69bf60SBram Moolenaar  res = false
1631e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1632e8c4abbbSBram Moolenaar    res = true
1633e8c4abbbSBram Moolenaar  endif
1634e8c4abbbSBram Moolenaar  assert_equal(false, res)
1635e8c4abbbSBram Moolenaar
1636e8c4abbbSBram Moolenaar  res = false
16376d69bf60SBram Moolenaar  if true && true
16386d69bf60SBram Moolenaar    res = true
16396d69bf60SBram Moolenaar  endif
16406d69bf60SBram Moolenaar  assert_equal(true, res)
16416d69bf60SBram Moolenaar
16426d69bf60SBram Moolenaar  res = false
16436d69bf60SBram Moolenaar  if true && false
16446d69bf60SBram Moolenaar    res = true
16456d69bf60SBram Moolenaar  endif
16466d69bf60SBram Moolenaar  assert_equal(false, res)
16476d69bf60SBram Moolenaar
16486d69bf60SBram Moolenaar  res = false
16496d69bf60SBram Moolenaar  if g:bool_true && false
16506d69bf60SBram Moolenaar    res = true
16516d69bf60SBram Moolenaar  endif
16526d69bf60SBram Moolenaar  assert_equal(false, res)
16536d69bf60SBram Moolenaar
16546d69bf60SBram Moolenaar  res = false
16556d69bf60SBram Moolenaar  if true && g:bool_false
16566d69bf60SBram Moolenaar    res = true
16576d69bf60SBram Moolenaar  endif
16586d69bf60SBram Moolenaar  assert_equal(false, res)
16596d69bf60SBram Moolenaar
16606d69bf60SBram Moolenaar  res = false
16616d69bf60SBram Moolenaar  if false && false
16626d69bf60SBram Moolenaar    res = true
16636d69bf60SBram Moolenaar  endif
16646d69bf60SBram Moolenaar  assert_equal(false, res)
16656d69bf60SBram Moolenaar
16666d69bf60SBram Moolenaar  res = false
16676d69bf60SBram Moolenaar  if true || false
16686d69bf60SBram Moolenaar    res = true
16696d69bf60SBram Moolenaar  endif
16706d69bf60SBram Moolenaar  assert_equal(true, res)
16716d69bf60SBram Moolenaar
16726d69bf60SBram Moolenaar  res = false
16736d69bf60SBram Moolenaar  if g:bool_true || false
16746d69bf60SBram Moolenaar    res = true
16756d69bf60SBram Moolenaar  endif
16766d69bf60SBram Moolenaar  assert_equal(true, res)
16776d69bf60SBram Moolenaar
16786d69bf60SBram Moolenaar  res = false
16796d69bf60SBram Moolenaar  if true || g:bool_false
16806d69bf60SBram Moolenaar    res = true
16816d69bf60SBram Moolenaar  endif
16826d69bf60SBram Moolenaar  assert_equal(true, res)
16836d69bf60SBram Moolenaar
16846d69bf60SBram Moolenaar  res = false
16856d69bf60SBram Moolenaar  if false || false
16866d69bf60SBram Moolenaar    res = true
16876d69bf60SBram Moolenaar  endif
16886d69bf60SBram Moolenaar  assert_equal(false, res)
16893988f64fSBram Moolenaar
16903988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16913988f64fSBram Moolenaar  if false | eval 0 | endif
16923988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16933988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16943988f64fSBram Moolenaar  if false
16953988f64fSBram Moolenaar    burp
16963988f64fSBram Moolenaar  endif
169780c34ca3SBram Moolenaarenddef
16986d69bf60SBram Moolenaar
169980c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1700d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1701d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1702d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1703d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
17046d69bf60SBram Moolenaarenddef
17056d69bf60SBram Moolenaar
170672abcf42SBram Moolenaardef RunNested(i: number): number
1707cfcd011fSBram Moolenaar  var x: number = 0
170872abcf42SBram Moolenaar  if i % 2
170972abcf42SBram Moolenaar    if 1
1710f5be8cdbSBram Moolenaar      # comment
171172abcf42SBram Moolenaar    else
1712f5be8cdbSBram Moolenaar      # comment
171372abcf42SBram Moolenaar    endif
171472abcf42SBram Moolenaar    x += 1
171572abcf42SBram Moolenaar  else
171672abcf42SBram Moolenaar    x += 1000
171772abcf42SBram Moolenaar  endif
171872abcf42SBram Moolenaar  return x
171972abcf42SBram Moolenaarenddef
172072abcf42SBram Moolenaar
172172abcf42SBram Moolenaardef Test_nested_if()
172272abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
172372abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
172472abcf42SBram Moolenaarenddef
172572abcf42SBram Moolenaar
1726ad39c094SBram Moolenaardef Test_execute_cmd()
1727e4984290SBram Moolenaar  # missing argument is ignored
1728e4984290SBram Moolenaar  execute
1729e4984290SBram Moolenaar  execute # comment
1730e4984290SBram Moolenaar
1731ad39c094SBram Moolenaar  new
1732ad39c094SBram Moolenaar  setline(1, 'default')
1733d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1734ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1735a72cfb80SBram Moolenaar
1736d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1737a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1738a72cfb80SBram Moolenaar
1739cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1740cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1741a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1742ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1743a72cfb80SBram Moolenaar
1744d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1745ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1746a72cfb80SBram Moolenaar
1747cfcd011fSBram Moolenaar  var cmd_first = 'call '
1748cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1749ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1750ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1751ad39c094SBram Moolenaar  bwipe!
1752585fea7bSBram Moolenaar
1753cfcd011fSBram Moolenaar  var n = true
17542d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
17552d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
17562d6b20d6SBram Moolenaar
1757e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1758e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1759e5abf7afSBram Moolenaar
1760d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1761d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1762d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1763ad39c094SBram Moolenaarenddef
1764ad39c094SBram Moolenaar
176547e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1766f5be8cdbSBram Moolenaar  # only checks line continuation
1767cfcd011fSBram Moolenaar  var lines =<< trim END
176847e880d6SBram Moolenaar      vim9script
176947e880d6SBram Moolenaar      execute 'g:someVar'
177047e880d6SBram Moolenaar                .. ' = ' ..
177147e880d6SBram Moolenaar                   '28'
177247e880d6SBram Moolenaar      assert_equal(28, g:someVar)
177347e880d6SBram Moolenaar      unlet g:someVar
177447e880d6SBram Moolenaar  END
177547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
177647e880d6SBram Moolenaarenddef
177747e880d6SBram Moolenaar
1778ad39c094SBram Moolenaardef Test_echo_cmd()
1779a72cfb80SBram Moolenaar  echo 'some' # comment
1780585fea7bSBram Moolenaar  echon 'thing'
1781ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1782ad39c094SBram Moolenaar
1783a72cfb80SBram Moolenaar  echo "some" # comment
1784a72cfb80SBram Moolenaar  echon "thing"
1785a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1786a72cfb80SBram Moolenaar
1787cfcd011fSBram Moolenaar  var str1 = 'some'
1788cfcd011fSBram Moolenaar  var str2 = 'more'
1789ad39c094SBram Moolenaar  echo str1 str2
1790ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1791a72cfb80SBram Moolenaar
1792d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1793ad39c094SBram Moolenaarenddef
1794ad39c094SBram Moolenaar
1795f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1796f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1797f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1798f93c7feaSBram Moolenaar  echo 'clear'
1799df069eecSBram Moolenaar  :1messages
1800f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1801f93c7feaSBram Moolenaar
1802d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1803f93c7feaSBram Moolenaarenddef
1804f93c7feaSBram Moolenaar
180547e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1806f5be8cdbSBram Moolenaar  # only checks line continuation
1807cfcd011fSBram Moolenaar  var lines =<< trim END
180847e880d6SBram Moolenaar      vim9script
180947e880d6SBram Moolenaar      echomsg 'here'
181047e880d6SBram Moolenaar                .. ' is ' ..
181147e880d6SBram Moolenaar                   'a message'
181247e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
181347e880d6SBram Moolenaar  END
181447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
181547e880d6SBram Moolenaarenddef
181647e880d6SBram Moolenaar
1817f93c7feaSBram Moolenaardef Test_echoerr_cmd()
181840ee466cSBram Moolenaar  try
181940ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
182040ee466cSBram Moolenaar  catch
182140ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
182240ee466cSBram Moolenaar  endtry
1823f93c7feaSBram Moolenaarenddef
1824f93c7feaSBram Moolenaar
182547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1826f5be8cdbSBram Moolenaar  # only checks line continuation
1827cfcd011fSBram Moolenaar  var lines =<< trim END
182847e880d6SBram Moolenaar      vim9script
182947e880d6SBram Moolenaar      try
183047e880d6SBram Moolenaar        echoerr 'this'
183147e880d6SBram Moolenaar                .. ' is ' ..
183247e880d6SBram Moolenaar                   'wrong'
183347e880d6SBram Moolenaar      catch
183447e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
183547e880d6SBram Moolenaar      endtry
183647e880d6SBram Moolenaar  END
183747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
183847e880d6SBram Moolenaarenddef
183947e880d6SBram Moolenaar
184041fe0617SBram Moolenaardef Test_for_outside_of_function()
1841cfcd011fSBram Moolenaar  var lines =<< trim END
184241fe0617SBram Moolenaar    vim9script
184341fe0617SBram Moolenaar    new
184441fe0617SBram Moolenaar    for var in range(0, 3)
184541fe0617SBram Moolenaar      append(line('$'), var)
184641fe0617SBram Moolenaar    endfor
184741fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
184841fe0617SBram Moolenaar    bwipe!
184941fe0617SBram Moolenaar  END
185041fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
185141fe0617SBram Moolenaar  source Xvim9for.vim
185241fe0617SBram Moolenaar  delete('Xvim9for.vim')
185341fe0617SBram Moolenaarenddef
18548a7d6542SBram Moolenaar
1855e8c4abbbSBram Moolenaardef Test_for_loop()
1856cfcd011fSBram Moolenaar  var result = ''
1857e8c4abbbSBram Moolenaar  for cnt in range(7)
1858e8c4abbbSBram Moolenaar    if cnt == 4
1859e8c4abbbSBram Moolenaar      break
1860e8c4abbbSBram Moolenaar    endif
1861e8c4abbbSBram Moolenaar    if cnt == 2
1862e8c4abbbSBram Moolenaar      continue
1863e8c4abbbSBram Moolenaar    endif
1864e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1865e8c4abbbSBram Moolenaar  endfor
1866e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18670ad3e894SBram Moolenaar
1868cfcd011fSBram Moolenaar  var concat = ''
18690ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18700ad3e894SBram Moolenaar    concat ..= str
18710ad3e894SBram Moolenaar  endfor
18720ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
187338bd8de5SBram Moolenaar
187438bd8de5SBram Moolenaar  var total = 0
187538bd8de5SBram Moolenaar  for nr in
187638bd8de5SBram Moolenaar      [1, 2, 3]
187738bd8de5SBram Moolenaar    total += nr
187838bd8de5SBram Moolenaar  endfor
187938bd8de5SBram Moolenaar  assert_equal(6, total)
188038bd8de5SBram Moolenaar
188138bd8de5SBram Moolenaar  total = 0
188238bd8de5SBram Moolenaar  for nr
188338bd8de5SBram Moolenaar    in [1, 2, 3]
188438bd8de5SBram Moolenaar    total += nr
188538bd8de5SBram Moolenaar  endfor
188638bd8de5SBram Moolenaar  assert_equal(6, total)
188738bd8de5SBram Moolenaar
188838bd8de5SBram Moolenaar  total = 0
188938bd8de5SBram Moolenaar  for nr
189038bd8de5SBram Moolenaar    in
189138bd8de5SBram Moolenaar    [1, 2, 3]
189238bd8de5SBram Moolenaar    total += nr
189338bd8de5SBram Moolenaar  endfor
189438bd8de5SBram Moolenaar  assert_equal(6, total)
1895e8c4abbbSBram Moolenaarenddef
1896e8c4abbbSBram Moolenaar
1897e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1898*025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
1899*025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
1900*025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
1901675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1902675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1903cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1904822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
19052d870f8dSBram Moolenaar  delfunc! g:Func
1906451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1907675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1908675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1909675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1910e8c4abbbSBram Moolenaarenddef
1911e8c4abbbSBram Moolenaar
1912ea87069dSBram Moolenaardef Test_for_loop_script_var()
1913ea87069dSBram Moolenaar  # cannot use s:var in a :def function
1914ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
1915ea87069dSBram Moolenaar
1916ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
1917ea87069dSBram Moolenaar  var lines =<< trim END
1918ea87069dSBram Moolenaar    vim9script
1919ea87069dSBram Moolenaar    var total = 0
1920ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
1921ea87069dSBram Moolenaar      total += s:var
1922ea87069dSBram Moolenaar    endfor
1923ea87069dSBram Moolenaar    assert_equal(6, total)
1924ea87069dSBram Moolenaar
1925ea87069dSBram Moolenaar    total = 0
1926ea87069dSBram Moolenaar    for var in [1, 2, 3]
1927ea87069dSBram Moolenaar      total += var
1928ea87069dSBram Moolenaar    endfor
1929ea87069dSBram Moolenaar    assert_equal(6, total)
1930ea87069dSBram Moolenaar  END
1931ea87069dSBram Moolenaarenddef
1932ea87069dSBram Moolenaar
1933792f786aSBram Moolenaardef Test_for_loop_unpack()
19344b8a0651SBram Moolenaar  var lines =<< trim END
1935792f786aSBram Moolenaar      var result = []
1936792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
1937792f786aSBram Moolenaar        result->add(v1)
1938792f786aSBram Moolenaar        result->add(v2)
1939792f786aSBram Moolenaar      endfor
1940792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
1941792f786aSBram Moolenaar
1942792f786aSBram Moolenaar      result = []
1943792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
1944792f786aSBram Moolenaar        result->add(v1)
1945792f786aSBram Moolenaar        result->add(v2)
1946792f786aSBram Moolenaar        result->add(v3)
1947792f786aSBram Moolenaar      endfor
1948792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
1949792f786aSBram Moolenaar
19504b8a0651SBram Moolenaar      result = []
19514b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
19524b8a0651SBram Moolenaar        result->add(&ts)
19534b8a0651SBram Moolenaar        result->add(&sw)
19544b8a0651SBram Moolenaar      endfor
19554b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
19564b8a0651SBram Moolenaar
19574b8a0651SBram Moolenaar      var slist: list<string>
19584b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
19594b8a0651SBram Moolenaar        slist->add($LOOPVAR)
19604b8a0651SBram Moolenaar        slist->add(@r)
19614b8a0651SBram Moolenaar        slist->add(v:errmsg)
19624b8a0651SBram Moolenaar      endfor
19634b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
19644b8a0651SBram Moolenaar
19654b8a0651SBram Moolenaar      slist = []
19664b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
19674b8a0651SBram Moolenaar        slist->add(g:globalvar)
19684b8a0651SBram Moolenaar        slist->add(b:bufvar)
19694b8a0651SBram Moolenaar        slist->add(w:winvar)
19704b8a0651SBram Moolenaar        slist->add(t:tabvar)
19714b8a0651SBram Moolenaar      endfor
19724b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
1973f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
19744b8a0651SBram Moolenaar  END
19754b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
19764b8a0651SBram Moolenaar
19774b8a0651SBram Moolenaar  lines =<< trim END
1978792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
1979792f786aSBram Moolenaar        echo v1 v2
1980792f786aSBram Moolenaar      endfor
1981792f786aSBram Moolenaar  END
1982792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
1983792f786aSBram Moolenaar
1984792f786aSBram Moolenaar  lines =<< trim END
1985792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
1986792f786aSBram Moolenaar        echo v1 v2
1987792f786aSBram Moolenaar      endfor
1988792f786aSBram Moolenaar  END
1989792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
1990792f786aSBram Moolenaar
1991792f786aSBram Moolenaar  lines =<< trim END
1992792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
1993792f786aSBram Moolenaar        echo v1
1994792f786aSBram Moolenaar      endfor
1995792f786aSBram Moolenaar  END
1996792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
1997792f786aSBram Moolenaarenddef
1998792f786aSBram Moolenaar
1999d0df1aacSBram Moolenaardef Test_while_loop()
2000cfcd011fSBram Moolenaar  var result = ''
2001cfcd011fSBram Moolenaar  var cnt = 0
2002d0df1aacSBram Moolenaar  while cnt < 555
2003d0df1aacSBram Moolenaar    if cnt == 3
2004d0df1aacSBram Moolenaar      break
2005d0df1aacSBram Moolenaar    endif
2006d0df1aacSBram Moolenaar    cnt += 1
2007d0df1aacSBram Moolenaar    if cnt == 2
2008d0df1aacSBram Moolenaar      continue
2009d0df1aacSBram Moolenaar    endif
2010d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2011d0df1aacSBram Moolenaar  endwhile
2012d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2013d0df1aacSBram Moolenaarenddef
2014d0df1aacSBram Moolenaar
2015e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2016675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2017675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2018675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2019675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2020675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2021675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2022675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2023bd5da371SBram Moolenaarenddef
2024bd5da371SBram Moolenaar
20259645e2d9SBram Moolenaardef Test_interrupt_loop()
2026cfcd011fSBram Moolenaar  var caught = false
2027cfcd011fSBram Moolenaar  var x = 0
202897acfc78SBram Moolenaar  try
20299645e2d9SBram Moolenaar    while 1
20309645e2d9SBram Moolenaar      x += 1
20319645e2d9SBram Moolenaar      if x == 100
20329645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
20339645e2d9SBram Moolenaar      endif
20349645e2d9SBram Moolenaar    endwhile
203597acfc78SBram Moolenaar  catch
203697acfc78SBram Moolenaar    caught = true
203797acfc78SBram Moolenaar    assert_equal(100, x)
203897acfc78SBram Moolenaar  endtry
203997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
204025859dd7SBram Moolenaar  # consume the CTRL-C
204125859dd7SBram Moolenaar  getchar(0)
20429645e2d9SBram Moolenaarenddef
204320431c9dSBram Moolenaar
20444fdae999SBram Moolenaardef Test_automatic_line_continuation()
2045cfcd011fSBram Moolenaar  var mylist = [
20464fdae999SBram Moolenaar      'one',
20474fdae999SBram Moolenaar      'two',
20484fdae999SBram Moolenaar      'three',
2049f5be8cdbSBram Moolenaar      ] # comment
20504fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
20514fdae999SBram Moolenaar
2052cfcd011fSBram Moolenaar  var mydict = {
2053e0de171eSBram Moolenaar      ['one']: 1,
2054e0de171eSBram Moolenaar      ['two']: 2,
2055e0de171eSBram Moolenaar      ['three']:
20564fdae999SBram Moolenaar          3,
2057f5be8cdbSBram Moolenaar      } # comment
2058e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2059e0de171eSBram Moolenaar  mydict = {
20602c330432SBram Moolenaar      one: 1,  # comment
20612c330432SBram Moolenaar      two:     # comment
20622c330432SBram Moolenaar           2,  # comment
20632c330432SBram Moolenaar      three: 3 # comment
20642c330432SBram Moolenaar      }
2065e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2066e0de171eSBram Moolenaar  mydict = {
20672c330432SBram Moolenaar      one: 1,
20684fdae999SBram Moolenaar      two:
20694fdae999SBram Moolenaar           2,
20702c330432SBram Moolenaar      three: 3
20714fdae999SBram Moolenaar      }
2072e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2073e6085c53SBram Moolenaar
2074e6085c53SBram Moolenaar  assert_equal(
2075e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2076e6085c53SBram Moolenaar        split('one two three')
2077e6085c53SBram Moolenaar        )
20784fdae999SBram Moolenaarenddef
20794fdae999SBram Moolenaar
20807a092245SBram Moolenaardef Test_vim9_comment()
20817a092245SBram Moolenaar  CheckScriptSuccess([
20827a092245SBram Moolenaar      'vim9script',
20837a092245SBram Moolenaar      '# something',
208493f82cbeSBram Moolenaar      '#something',
208593f82cbeSBram Moolenaar      '#{something',
20867a092245SBram Moolenaar      ])
208793f82cbeSBram Moolenaar
208893f82cbeSBram Moolenaar  split Xfile
208993f82cbeSBram Moolenaar  CheckScriptSuccess([
209093f82cbeSBram Moolenaar      'vim9script',
209193f82cbeSBram Moolenaar      'edit #something',
209293f82cbeSBram Moolenaar      ])
209393f82cbeSBram Moolenaar  CheckScriptSuccess([
209493f82cbeSBram Moolenaar      'vim9script',
209593f82cbeSBram Moolenaar      'edit #{something',
209693f82cbeSBram Moolenaar      ])
209793f82cbeSBram Moolenaar  close
209893f82cbeSBram Moolenaar
20997a092245SBram Moolenaar  CheckScriptFailure([
21007a092245SBram Moolenaar      'vim9script',
21017a092245SBram Moolenaar      ':# something',
21027a092245SBram Moolenaar      ], 'E488:')
21037a092245SBram Moolenaar  CheckScriptFailure([
21047a092245SBram Moolenaar      '# something',
21057a092245SBram Moolenaar      ], 'E488:')
21067a092245SBram Moolenaar  CheckScriptFailure([
21077a092245SBram Moolenaar      ':# something',
21087a092245SBram Moolenaar      ], 'E488:')
21097a092245SBram Moolenaar
21104a8d9f2eSBram Moolenaar  { # block start
21114a8d9f2eSBram Moolenaar  } # block end
21124a8d9f2eSBram Moolenaar  CheckDefFailure([
21134a8d9f2eSBram Moolenaar      '{# comment',
21144a8d9f2eSBram Moolenaar      ], 'E488:')
21154a8d9f2eSBram Moolenaar  CheckDefFailure([
21164a8d9f2eSBram Moolenaar      '{',
21174a8d9f2eSBram Moolenaar      '}# comment',
21184a8d9f2eSBram Moolenaar      ], 'E488:')
21194a8d9f2eSBram Moolenaar
21204a8d9f2eSBram Moolenaar  echo "yes" # comment
21214a8d9f2eSBram Moolenaar  CheckDefFailure([
21224a8d9f2eSBram Moolenaar      'echo "yes"# comment',
21234a8d9f2eSBram Moolenaar      ], 'E488:')
21247a092245SBram Moolenaar  CheckScriptSuccess([
21257a092245SBram Moolenaar      'vim9script',
21267a092245SBram Moolenaar      'echo "yes" # something',
21277a092245SBram Moolenaar      ])
21287a092245SBram Moolenaar  CheckScriptFailure([
21297a092245SBram Moolenaar      'vim9script',
21307a092245SBram Moolenaar      'echo "yes"# something',
21317a092245SBram Moolenaar      ], 'E121:')
21327a092245SBram Moolenaar  CheckScriptFailure([
21337a092245SBram Moolenaar      'vim9script',
21347a092245SBram Moolenaar      'echo# something',
21357a092245SBram Moolenaar      ], 'E121:')
21367a092245SBram Moolenaar  CheckScriptFailure([
21377a092245SBram Moolenaar      'echo "yes" # something',
21387a092245SBram Moolenaar      ], 'E121:')
21397a092245SBram Moolenaar
21404a8d9f2eSBram Moolenaar  exe "echo" # comment
21414a8d9f2eSBram Moolenaar  CheckDefFailure([
21424a8d9f2eSBram Moolenaar      'exe "echo"# comment',
21434a8d9f2eSBram Moolenaar      ], 'E488:')
21444a8d9f2eSBram Moolenaar  CheckScriptSuccess([
21454a8d9f2eSBram Moolenaar      'vim9script',
21464a8d9f2eSBram Moolenaar      'exe "echo" # something',
21474a8d9f2eSBram Moolenaar      ])
21484a8d9f2eSBram Moolenaar  CheckScriptFailure([
21494a8d9f2eSBram Moolenaar      'vim9script',
21504a8d9f2eSBram Moolenaar      'exe "echo"# something',
21514a8d9f2eSBram Moolenaar      ], 'E121:')
21524a8d9f2eSBram Moolenaar  CheckScriptFailure([
21534a8d9f2eSBram Moolenaar      'vim9script',
21544a8d9f2eSBram Moolenaar      'exe# something',
21554a8d9f2eSBram Moolenaar      ], 'E121:')
21564a8d9f2eSBram Moolenaar  CheckScriptFailure([
21574a8d9f2eSBram Moolenaar      'exe "echo" # something',
21584a8d9f2eSBram Moolenaar      ], 'E121:')
21594a8d9f2eSBram Moolenaar
21607a092245SBram Moolenaar  CheckDefFailure([
21617a092245SBram Moolenaar      'try# comment',
21627a092245SBram Moolenaar      '  echo "yes"',
21637a092245SBram Moolenaar      'catch',
21647a092245SBram Moolenaar      'endtry',
21657a092245SBram Moolenaar      ], 'E488:')
21662c5ed4e3SBram Moolenaar  CheckScriptFailure([
21672c5ed4e3SBram Moolenaar      'vim9script',
21682c5ed4e3SBram Moolenaar      'try# comment',
21692c5ed4e3SBram Moolenaar      'echo "yes"',
21702c5ed4e3SBram Moolenaar      ], 'E488:')
21717a092245SBram Moolenaar  CheckDefFailure([
21727a092245SBram Moolenaar      'try',
2173a72cfb80SBram Moolenaar      '  throw#comment',
2174a72cfb80SBram Moolenaar      'catch',
2175a72cfb80SBram Moolenaar      'endtry',
2176e4984290SBram Moolenaar      ], 'E1143:')
2177a72cfb80SBram Moolenaar  CheckDefFailure([
2178a72cfb80SBram Moolenaar      'try',
2179a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2180a72cfb80SBram Moolenaar      'catch',
2181a72cfb80SBram Moolenaar      'endtry',
2182a72cfb80SBram Moolenaar      ], 'E488:')
2183a72cfb80SBram Moolenaar  CheckDefFailure([
2184a72cfb80SBram Moolenaar      'try',
21857a092245SBram Moolenaar      '  echo "yes"',
21867a092245SBram Moolenaar      'catch# comment',
21877a092245SBram Moolenaar      'endtry',
21887a092245SBram Moolenaar      ], 'E488:')
21892c5ed4e3SBram Moolenaar  CheckScriptFailure([
21902c5ed4e3SBram Moolenaar      'vim9script',
21912c5ed4e3SBram Moolenaar      'try',
21922c5ed4e3SBram Moolenaar      '  echo "yes"',
21932c5ed4e3SBram Moolenaar      'catch# comment',
21942c5ed4e3SBram Moolenaar      'endtry',
21952c5ed4e3SBram Moolenaar      ], 'E654:')
21962c5ed4e3SBram Moolenaar  CheckDefFailure([
21972c5ed4e3SBram Moolenaar      'try',
21982c5ed4e3SBram Moolenaar      '  echo "yes"',
21992c5ed4e3SBram Moolenaar      'catch /pat/# comment',
22002c5ed4e3SBram Moolenaar      'endtry',
22012c5ed4e3SBram Moolenaar      ], 'E488:')
22027a092245SBram Moolenaar  CheckDefFailure([
22037a092245SBram Moolenaar      'try',
22047a092245SBram Moolenaar      'echo "yes"',
22057a092245SBram Moolenaar      'catch',
22067a092245SBram Moolenaar      'endtry# comment',
22077a092245SBram Moolenaar      ], 'E488:')
22082c5ed4e3SBram Moolenaar  CheckScriptFailure([
22092c5ed4e3SBram Moolenaar      'vim9script',
22102c5ed4e3SBram Moolenaar      'try',
22112c5ed4e3SBram Moolenaar      '  echo "yes"',
22122c5ed4e3SBram Moolenaar      'catch',
22132c5ed4e3SBram Moolenaar      'endtry# comment',
22149b7bf9e9SBram Moolenaar      ], 'E488:')
22152c5ed4e3SBram Moolenaar
22162c5ed4e3SBram Moolenaar  CheckScriptSuccess([
22172c5ed4e3SBram Moolenaar      'vim9script',
22182c5ed4e3SBram Moolenaar      'hi # comment',
22192c5ed4e3SBram Moolenaar      ])
22202c5ed4e3SBram Moolenaar  CheckScriptFailure([
22212c5ed4e3SBram Moolenaar      'vim9script',
22222c5ed4e3SBram Moolenaar      'hi# comment',
22232c5ed4e3SBram Moolenaar      ], 'E416:')
22241966c248SBram Moolenaar  CheckScriptSuccess([
22251966c248SBram Moolenaar      'vim9script',
22261966c248SBram Moolenaar      'hi Search # comment',
22271966c248SBram Moolenaar      ])
22281966c248SBram Moolenaar  CheckScriptFailure([
22291966c248SBram Moolenaar      'vim9script',
22301966c248SBram Moolenaar      'hi Search# comment',
22311966c248SBram Moolenaar      ], 'E416:')
22321966c248SBram Moolenaar  CheckScriptSuccess([
22331966c248SBram Moolenaar      'vim9script',
22341966c248SBram Moolenaar      'hi link This Search # comment',
22351966c248SBram Moolenaar      ])
22361966c248SBram Moolenaar  CheckScriptFailure([
22371966c248SBram Moolenaar      'vim9script',
22381966c248SBram Moolenaar      'hi link This That# comment',
22391966c248SBram Moolenaar      ], 'E413:')
22401966c248SBram Moolenaar  CheckScriptSuccess([
22411966c248SBram Moolenaar      'vim9script',
22421966c248SBram Moolenaar      'hi clear This # comment',
22431966c248SBram Moolenaar      'hi clear # comment',
22441966c248SBram Moolenaar      ])
2245f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2246f5be8cdbSBram Moolenaar  # hi clear This# comment',
22471966c248SBram Moolenaar  CheckScriptFailure([
22481966c248SBram Moolenaar      'vim9script',
22491966c248SBram Moolenaar      'hi clear# comment',
22501966c248SBram Moolenaar      ], 'E416:')
22511966c248SBram Moolenaar
22521966c248SBram Moolenaar  CheckScriptSuccess([
22531966c248SBram Moolenaar      'vim9script',
22541966c248SBram Moolenaar      'hi Group term=bold',
22551966c248SBram Moolenaar      'match Group /todo/ # comment',
22561966c248SBram Moolenaar      ])
22571966c248SBram Moolenaar  CheckScriptFailure([
22581966c248SBram Moolenaar      'vim9script',
22591966c248SBram Moolenaar      'hi Group term=bold',
22601966c248SBram Moolenaar      'match Group /todo/# comment',
22611966c248SBram Moolenaar      ], 'E488:')
22621966c248SBram Moolenaar  CheckScriptSuccess([
22631966c248SBram Moolenaar      'vim9script',
22641966c248SBram Moolenaar      'match # comment',
22651966c248SBram Moolenaar      ])
22661966c248SBram Moolenaar  CheckScriptFailure([
22671966c248SBram Moolenaar      'vim9script',
22681966c248SBram Moolenaar      'match# comment',
22691966c248SBram Moolenaar      ], 'E475:')
22701966c248SBram Moolenaar  CheckScriptSuccess([
22711966c248SBram Moolenaar      'vim9script',
22721966c248SBram Moolenaar      'match none # comment',
22731966c248SBram Moolenaar      ])
22741966c248SBram Moolenaar  CheckScriptFailure([
22751966c248SBram Moolenaar      'vim9script',
22761966c248SBram Moolenaar      'match none# comment',
22771966c248SBram Moolenaar      ], 'E475:')
22781966c248SBram Moolenaar
22791966c248SBram Moolenaar  CheckScriptSuccess([
22801966c248SBram Moolenaar      'vim9script',
22811966c248SBram Moolenaar      'menutrans clear # comment',
22821966c248SBram Moolenaar      ])
22831966c248SBram Moolenaar  CheckScriptFailure([
22841966c248SBram Moolenaar      'vim9script',
22851966c248SBram Moolenaar      'menutrans clear# comment text',
22861966c248SBram Moolenaar      ], 'E474:')
22871966c248SBram Moolenaar
22881966c248SBram Moolenaar  CheckScriptSuccess([
22891966c248SBram Moolenaar      'vim9script',
22901966c248SBram Moolenaar      'syntax clear # comment',
22911966c248SBram Moolenaar      ])
22921966c248SBram Moolenaar  CheckScriptFailure([
22931966c248SBram Moolenaar      'vim9script',
22941966c248SBram Moolenaar      'syntax clear# comment text',
22951966c248SBram Moolenaar      ], 'E28:')
22961966c248SBram Moolenaar  CheckScriptSuccess([
22971966c248SBram Moolenaar      'vim9script',
22981966c248SBram Moolenaar      'syntax keyword Word some',
22991966c248SBram Moolenaar      'syntax clear Word # comment',
23001966c248SBram Moolenaar      ])
23011966c248SBram Moolenaar  CheckScriptFailure([
23021966c248SBram Moolenaar      'vim9script',
23031966c248SBram Moolenaar      'syntax keyword Word some',
23041966c248SBram Moolenaar      'syntax clear Word# comment text',
23051966c248SBram Moolenaar      ], 'E28:')
23061966c248SBram Moolenaar
23071966c248SBram Moolenaar  CheckScriptSuccess([
23081966c248SBram Moolenaar      'vim9script',
23091966c248SBram Moolenaar      'syntax list # comment',
23101966c248SBram Moolenaar      ])
23111966c248SBram Moolenaar  CheckScriptFailure([
23121966c248SBram Moolenaar      'vim9script',
23131966c248SBram Moolenaar      'syntax list# comment text',
23141966c248SBram Moolenaar      ], 'E28:')
23151966c248SBram Moolenaar
23161966c248SBram Moolenaar  CheckScriptSuccess([
23171966c248SBram Moolenaar      'vim9script',
23181966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
23191966c248SBram Moolenaar      ])
23201966c248SBram Moolenaar  CheckScriptFailure([
23211966c248SBram Moolenaar      'vim9script',
23221966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
23231966c248SBram Moolenaar      ], 'E475:')
23241966c248SBram Moolenaar
23251966c248SBram Moolenaar  CheckScriptSuccess([
23261966c248SBram Moolenaar      'vim9script',
23271966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
23281966c248SBram Moolenaar      ])
23291966c248SBram Moolenaar  CheckScriptFailure([
23301966c248SBram Moolenaar      'vim9script',
23311966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
23321966c248SBram Moolenaar      ], 'E789:')
23331966c248SBram Moolenaar
23341966c248SBram Moolenaar  CheckScriptSuccess([
23351966c248SBram Moolenaar      'vim9script',
23361966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
23371966c248SBram Moolenaar      ])
23381966c248SBram Moolenaar  CheckScriptFailure([
23391966c248SBram Moolenaar      'vim9script',
23401966c248SBram Moolenaar      'syntax match Word /pat/# comment',
23411966c248SBram Moolenaar      ], 'E402:')
23421966c248SBram Moolenaar
23431966c248SBram Moolenaar  CheckScriptSuccess([
23441966c248SBram Moolenaar      'vim9script',
23451966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
23461966c248SBram Moolenaar      ])
23471966c248SBram Moolenaar  CheckScriptFailure([
23481966c248SBram Moolenaar      'vim9script',
23491966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
23501966c248SBram Moolenaar      ], 'E475:')
23511966c248SBram Moolenaar  CheckScriptFailure([
23521966c248SBram Moolenaar      'vim9script',
23531966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
23541966c248SBram Moolenaar      ], 'E406:')
23551966c248SBram Moolenaar  CheckScriptFailure([
23561966c248SBram Moolenaar      'vim9script',
23571966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
23581966c248SBram Moolenaar      ], 'E475:')
23591966c248SBram Moolenaar
23601966c248SBram Moolenaar  CheckScriptSuccess([
23611966c248SBram Moolenaar      'vim9script',
23621966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
23631966c248SBram Moolenaar      ])
23641966c248SBram Moolenaar  CheckScriptFailure([
23651966c248SBram Moolenaar      'vim9script',
23661966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2367d032f34aSBram Moolenaar      ], 'E402:')
23681966c248SBram Moolenaar
23691966c248SBram Moolenaar  CheckScriptSuccess([
23701966c248SBram Moolenaar      'vim9script',
23711966c248SBram Moolenaar      'syntax sync # comment',
23721966c248SBram Moolenaar      ])
23731966c248SBram Moolenaar  CheckScriptFailure([
23741966c248SBram Moolenaar      'vim9script',
23751966c248SBram Moolenaar      'syntax sync# comment',
23761966c248SBram Moolenaar      ], 'E404:')
23771966c248SBram Moolenaar  CheckScriptSuccess([
23781966c248SBram Moolenaar      'vim9script',
23791966c248SBram Moolenaar      'syntax sync ccomment # comment',
23801966c248SBram Moolenaar      ])
23811966c248SBram Moolenaar  CheckScriptFailure([
23821966c248SBram Moolenaar      'vim9script',
23831966c248SBram Moolenaar      'syntax sync ccomment# comment',
23841966c248SBram Moolenaar      ], 'E404:')
23851966c248SBram Moolenaar
23861966c248SBram Moolenaar  CheckScriptSuccess([
23871966c248SBram Moolenaar      'vim9script',
23881966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
23891966c248SBram Moolenaar      ])
23901966c248SBram Moolenaar  CheckScriptFailure([
23911966c248SBram Moolenaar      'vim9script',
23921966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
23931966c248SBram Moolenaar      ], 'E475:')
2394a72cfb80SBram Moolenaar
2395a72cfb80SBram Moolenaar  CheckScriptSuccess([
2396a72cfb80SBram Moolenaar      'vim9script',
2397a72cfb80SBram Moolenaar      'command Echo echo # comment',
2398a72cfb80SBram Moolenaar      'command Echo # comment',
23992d870f8dSBram Moolenaar      'delcommand Echo',
2400a72cfb80SBram Moolenaar      ])
2401a72cfb80SBram Moolenaar  CheckScriptFailure([
2402a72cfb80SBram Moolenaar      'vim9script',
2403a72cfb80SBram Moolenaar      'command Echo echo# comment',
2404a72cfb80SBram Moolenaar      'Echo',
2405a72cfb80SBram Moolenaar      ], 'E121:')
24062d870f8dSBram Moolenaar  delcommand Echo
240770249ee8SBram Moolenaar
240870249ee8SBram Moolenaar  var curdir = getcwd()
240970249ee8SBram Moolenaar  CheckScriptSuccess([
241070249ee8SBram Moolenaar      'command Echo cd " comment',
241170249ee8SBram Moolenaar      'Echo',
241270249ee8SBram Moolenaar      'delcommand Echo',
241370249ee8SBram Moolenaar      ])
241470249ee8SBram Moolenaar  CheckScriptSuccess([
241570249ee8SBram Moolenaar      'vim9script'
241670249ee8SBram Moolenaar      'command Echo cd # comment',
241770249ee8SBram Moolenaar      'Echo',
241870249ee8SBram Moolenaar      'delcommand Echo',
241970249ee8SBram Moolenaar      ])
242070249ee8SBram Moolenaar  CheckScriptFailure([
242170249ee8SBram Moolenaar      'vim9script',
242270249ee8SBram Moolenaar      'command Echo cd " comment',
242370249ee8SBram Moolenaar      'Echo',
242470249ee8SBram Moolenaar      ], 'E344:')
242570249ee8SBram Moolenaar  delcommand Echo
242670249ee8SBram Moolenaar  chdir(curdir)
242770249ee8SBram Moolenaar
2428a72cfb80SBram Moolenaar  CheckScriptFailure([
2429a72cfb80SBram Moolenaar      'vim9script',
2430a72cfb80SBram Moolenaar      'command Echo# comment',
2431a72cfb80SBram Moolenaar      ], 'E182:')
2432a72cfb80SBram Moolenaar  CheckScriptFailure([
2433a72cfb80SBram Moolenaar      'vim9script',
2434a72cfb80SBram Moolenaar      'command Echo echo',
2435a72cfb80SBram Moolenaar      'command Echo# comment',
2436a72cfb80SBram Moolenaar      ], 'E182:')
24372d870f8dSBram Moolenaar  delcommand Echo
2438a72cfb80SBram Moolenaar
2439a72cfb80SBram Moolenaar  CheckScriptSuccess([
2440a72cfb80SBram Moolenaar      'vim9script',
2441a72cfb80SBram Moolenaar      'function # comment',
2442a72cfb80SBram Moolenaar      ])
2443a72cfb80SBram Moolenaar  CheckScriptFailure([
2444a72cfb80SBram Moolenaar      'vim9script',
24459898107fSBram Moolenaar      'function " comment',
24469898107fSBram Moolenaar      ], 'E129:')
24479898107fSBram Moolenaar  CheckScriptFailure([
24489898107fSBram Moolenaar      'vim9script',
2449a72cfb80SBram Moolenaar      'function# comment',
2450a72cfb80SBram Moolenaar      ], 'E129:')
2451a72cfb80SBram Moolenaar  CheckScriptSuccess([
2452a72cfb80SBram Moolenaar      'vim9script',
2453a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2454a72cfb80SBram Moolenaar      ])
2455a72cfb80SBram Moolenaar  CheckScriptFailure([
2456a72cfb80SBram Moolenaar      'vim9script',
2457a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2458a72cfb80SBram Moolenaar      ], 'E488:')
2459a72cfb80SBram Moolenaar
2460a72cfb80SBram Moolenaar  CheckScriptSuccess([
2461a72cfb80SBram Moolenaar      'vim9script',
24624c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2463a72cfb80SBram Moolenaar      'endfunc',
24644c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2465a72cfb80SBram Moolenaar      ])
2466a72cfb80SBram Moolenaar  CheckScriptFailure([
2467a72cfb80SBram Moolenaar      'vim9script',
24684c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2469a72cfb80SBram Moolenaar      'endfunc',
24704c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2471a72cfb80SBram Moolenaar      ], 'E488:')
2472a72cfb80SBram Moolenaar
2473a72cfb80SBram Moolenaar  CheckScriptSuccess([
2474a72cfb80SBram Moolenaar      'vim9script',
2475a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2476a72cfb80SBram Moolenaar      ])
2477a72cfb80SBram Moolenaar  CheckScriptFailure([
2478a72cfb80SBram Moolenaar      'vim9script',
2479a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2480a72cfb80SBram Moolenaar      ], 'E488:')
2481e7e4838fSBram Moolenaar
2482e7e4838fSBram Moolenaar  CheckScriptFailure([
2483e7e4838fSBram Moolenaar      'def Test() " comment',
2484e7e4838fSBram Moolenaar      'enddef',
2485e7e4838fSBram Moolenaar      ], 'E488:')
2486e7e4838fSBram Moolenaar  CheckScriptFailure([
2487e7e4838fSBram Moolenaar      'vim9script',
2488e7e4838fSBram Moolenaar      'def Test() " comment',
2489e7e4838fSBram Moolenaar      'enddef',
2490e7e4838fSBram Moolenaar      ], 'E488:')
2491e7e4838fSBram Moolenaar
2492e7e4838fSBram Moolenaar  CheckScriptSuccess([
2493e7e4838fSBram Moolenaar      'func Test() " comment',
2494e7e4838fSBram Moolenaar      'endfunc',
24952d870f8dSBram Moolenaar      'delfunc Test',
2496e7e4838fSBram Moolenaar      ])
24979898107fSBram Moolenaar  CheckScriptSuccess([
2498e7e4838fSBram Moolenaar      'vim9script',
2499e7e4838fSBram Moolenaar      'func Test() " comment',
2500e7e4838fSBram Moolenaar      'endfunc',
25019898107fSBram Moolenaar      ])
2502e7e4838fSBram Moolenaar
2503e7e4838fSBram Moolenaar  CheckScriptSuccess([
2504e7e4838fSBram Moolenaar      'def Test() # comment',
2505e7e4838fSBram Moolenaar      'enddef',
2506e7e4838fSBram Moolenaar      ])
2507e7e4838fSBram Moolenaar  CheckScriptFailure([
2508e7e4838fSBram Moolenaar      'func Test() # comment',
2509e7e4838fSBram Moolenaar      'endfunc',
2510e7e4838fSBram Moolenaar      ], 'E488:')
25112c5ed4e3SBram Moolenaarenddef
25122c5ed4e3SBram Moolenaar
25132c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
25142c5ed4e3SBram Moolenaar  CheckCanRunGui
25152c5ed4e3SBram Moolenaar
25162c5ed4e3SBram Moolenaar  CheckScriptFailure([
25172c5ed4e3SBram Moolenaar      'vim9script',
25182c5ed4e3SBram Moolenaar      'gui#comment'
25192c5ed4e3SBram Moolenaar      ], 'E499:')
25202c5ed4e3SBram Moolenaar  CheckScriptFailure([
25212c5ed4e3SBram Moolenaar      'vim9script',
25222c5ed4e3SBram Moolenaar      'gui -f#comment'
25232c5ed4e3SBram Moolenaar      ], 'E499:')
25247a092245SBram Moolenaarenddef
25257a092245SBram Moolenaar
2526a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
25276797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
25286797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2529a26b9700SBram Moolenaar
2530a26b9700SBram Moolenaar  edit test.vim
2531a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2532a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2533a26b9700SBram Moolenaar
2534a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2535a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2536a26b9700SBram Moolenaar
2537a26b9700SBram Moolenaar  g:entered = 0
2538a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2539a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2540a26b9700SBram Moolenaar
2541a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2542a26b9700SBram Moolenaar
2543a26b9700SBram Moolenaar  au! TabEnter
2544a26b9700SBram Moolenaar  unlet g:entered
2545d72c1bf0SBram Moolenaar
2546d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2547d72c1bf0SBram Moolenaar      'vim9script',
25486797966dSBram Moolenaar      'g:var = 123',
2549e55b1c09SBram Moolenaar      'b:var = 456',
2550e55b1c09SBram Moolenaar      'w:var = 777',
2551e55b1c09SBram Moolenaar      't:var = 888',
2552d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2553d72c1bf0SBram Moolenaar      ])
2554d72c1bf0SBram Moolenaar
2555d72c1bf0SBram Moolenaar  CheckScriptFailure([
2556d72c1bf0SBram Moolenaar      'vim9script',
2557cfcd011fSBram Moolenaar      'let var = 123',
2558cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2559cfcd011fSBram Moolenaar
2560cfcd011fSBram Moolenaar  CheckScriptFailure([
2561cfcd011fSBram Moolenaar      'vim9script',
2562cfcd011fSBram Moolenaar      'var g:var = 123',
2563e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2564e55b1c09SBram Moolenaar
2565e55b1c09SBram Moolenaar  CheckScriptFailure([
2566e55b1c09SBram Moolenaar      'vim9script',
2567cfcd011fSBram Moolenaar      'var b:var = 123',
2568e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2569e55b1c09SBram Moolenaar
2570e55b1c09SBram Moolenaar  CheckScriptFailure([
2571e55b1c09SBram Moolenaar      'vim9script',
2572cfcd011fSBram Moolenaar      'var w:var = 123',
2573e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2574e55b1c09SBram Moolenaar
2575e55b1c09SBram Moolenaar  CheckScriptFailure([
2576e55b1c09SBram Moolenaar      'vim9script',
2577cfcd011fSBram Moolenaar      'var t:var = 123',
2578e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2579e55b1c09SBram Moolenaar
2580e55b1c09SBram Moolenaar  CheckScriptFailure([
2581e55b1c09SBram Moolenaar      'vim9script',
2582cfcd011fSBram Moolenaar      'var v:version = 123',
2583e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2584e55b1c09SBram Moolenaar
2585e55b1c09SBram Moolenaar  CheckScriptFailure([
2586e55b1c09SBram Moolenaar      'vim9script',
2587cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2588e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
25896797966dSBram Moolenaar
25906797966dSBram Moolenaar  CheckScriptFailure([
25916797966dSBram Moolenaar      'vim9script',
25926797966dSBram Moolenaar      'g:var = 123',
259332e35117SBram Moolenaar      'unlet g:var# comment1',
2594d72c1bf0SBram Moolenaar      ], 'E108:')
2595d72c1bf0SBram Moolenaar
2596d72c1bf0SBram Moolenaar  CheckScriptFailure([
2597d72c1bf0SBram Moolenaar      'let g:var = 123',
2598d72c1bf0SBram Moolenaar      'unlet g:var # something',
2599d72c1bf0SBram Moolenaar      ], 'E488:')
2600faac4104SBram Moolenaar
2601faac4104SBram Moolenaar  CheckScriptSuccess([
2602faac4104SBram Moolenaar      'vim9script',
260332e35117SBram Moolenaar      'if 1 # comment2',
2604faac4104SBram Moolenaar      '  echo "yes"',
2605faac4104SBram Moolenaar      'elseif 2 #comment',
2606faac4104SBram Moolenaar      '  echo "no"',
2607faac4104SBram Moolenaar      'endif',
2608faac4104SBram Moolenaar      ])
2609faac4104SBram Moolenaar
2610faac4104SBram Moolenaar  CheckScriptFailure([
2611faac4104SBram Moolenaar      'vim9script',
261232e35117SBram Moolenaar      'if 1# comment3',
2613faac4104SBram Moolenaar      '  echo "yes"',
2614faac4104SBram Moolenaar      'endif',
2615faac4104SBram Moolenaar      ], 'E15:')
2616faac4104SBram Moolenaar
2617faac4104SBram Moolenaar  CheckScriptFailure([
2618faac4104SBram Moolenaar      'vim9script',
261932e35117SBram Moolenaar      'if 0 # comment4',
2620faac4104SBram Moolenaar      '  echo "yes"',
2621faac4104SBram Moolenaar      'elseif 2#comment',
2622faac4104SBram Moolenaar      '  echo "no"',
2623faac4104SBram Moolenaar      'endif',
2624faac4104SBram Moolenaar      ], 'E15:')
2625faac4104SBram Moolenaar
2626faac4104SBram Moolenaar  CheckScriptSuccess([
2627faac4104SBram Moolenaar      'vim9script',
2628cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2629faac4104SBram Moolenaar      ])
2630faac4104SBram Moolenaar
2631faac4104SBram Moolenaar  CheckScriptFailure([
2632faac4104SBram Moolenaar      'vim9script',
2633cfcd011fSBram Moolenaar      'var v = 1# comment6',
263432e35117SBram Moolenaar      ], 'E15:')
2635faac4104SBram Moolenaar
2636faac4104SBram Moolenaar  CheckScriptSuccess([
2637faac4104SBram Moolenaar      'vim9script',
2638faac4104SBram Moolenaar      'new'
2639d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2640df069eecSBram Moolenaar      ':$',
2641faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2642faac4104SBram Moolenaar      'bwipe!',
2643faac4104SBram Moolenaar      ])
2644faac4104SBram Moolenaar
2645f5be8cdbSBram Moolenaar  CheckScriptFailure([
2646f5be8cdbSBram Moolenaar      'vim9script',
2647f5be8cdbSBram Moolenaar      'new'
2648d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2649f5be8cdbSBram Moolenaar      ':$',
2650f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2651f5be8cdbSBram Moolenaar      'bwipe!',
2652f5be8cdbSBram Moolenaar      ], 'E488:')
2653f5be8cdbSBram Moolenaar
2654f5be8cdbSBram Moolenaar  CheckScriptFailure([
2655f5be8cdbSBram Moolenaar      'vim9script',
2656f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2657f5be8cdbSBram Moolenaar      ], 'E477:')
2658a26b9700SBram Moolenaarenddef
2659a26b9700SBram Moolenaar
26607e5bd91dSBram Moolenaardef Test_finish()
2661cfcd011fSBram Moolenaar  var lines =<< trim END
26627e5bd91dSBram Moolenaar    vim9script
26636797966dSBram Moolenaar    g:res = 'one'
26647e5bd91dSBram Moolenaar    if v:false | finish | endif
26656797966dSBram Moolenaar    g:res = 'two'
26667e5bd91dSBram Moolenaar    finish
26676797966dSBram Moolenaar    g:res = 'three'
26687e5bd91dSBram Moolenaar  END
26697e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
26707e5bd91dSBram Moolenaar  source Xfinished
26717e5bd91dSBram Moolenaar  assert_equal('two', g:res)
26727e5bd91dSBram Moolenaar
26737e5bd91dSBram Moolenaar  unlet g:res
26747e5bd91dSBram Moolenaar  delete('Xfinished')
26757e5bd91dSBram Moolenaarenddef
26767e5bd91dSBram Moolenaar
2677a5d0077eSBram Moolenaardef Test_forward_declaration()
2678cfcd011fSBram Moolenaar  var lines =<< trim END
2679a5d0077eSBram Moolenaar    vim9script
2680a5d0077eSBram Moolenaar    def GetValue(): string
2681a5d0077eSBram Moolenaar      return theVal
2682a5d0077eSBram Moolenaar    enddef
2683cfcd011fSBram Moolenaar    var theVal = 'something'
2684822ba247SBram Moolenaar    g:initVal = GetValue()
2685a5d0077eSBram Moolenaar    theVal = 'else'
2686a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2687a5d0077eSBram Moolenaar  END
2688a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2689a5d0077eSBram Moolenaar  source Xforward
2690a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2691a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2692a5d0077eSBram Moolenaar
2693a5d0077eSBram Moolenaar  unlet g:initVal
2694a5d0077eSBram Moolenaar  unlet g:laterVal
2695a5d0077eSBram Moolenaar  delete('Xforward')
2696a5d0077eSBram Moolenaarenddef
2697a5d0077eSBram Moolenaar
26989721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2699cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
27009721fb4eSBram Moolenaar    source Xvim9_script.vim
27019721fb4eSBram Moolenaar
27029721fb4eSBram Moolenaar    call assert_false(exists('local'))
27039721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27049721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
27059721fb4eSBram Moolenaar    call assert_equal('global', global)
27069721fb4eSBram Moolenaar    call assert_equal('global', g:global)
27079721fb4eSBram Moolenaar
27089721fb4eSBram Moolenaar    " imported variable becomes script-local
27099721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
27109721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
27119721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27129721fb4eSBram Moolenaar
27139721fb4eSBram Moolenaar    " imported function becomes script-local
27149721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
27159721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
27169721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
27179721fb4eSBram Moolenaar  END
27189721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
27199721fb4eSBram Moolenaar
2720cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
27219721fb4eSBram Moolenaar    vim9script
2722cfcd011fSBram Moolenaar    var local = 'local'
27239721fb4eSBram Moolenaar    g:global = 'global'
2724cfcd011fSBram Moolenaar    export var exported = 'exported'
27259721fb4eSBram Moolenaar    export def GetText(): string
27269721fb4eSBram Moolenaar       return 'text'
27279721fb4eSBram Moolenaar    enddef
27289721fb4eSBram Moolenaar  END
27299721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
27309721fb4eSBram Moolenaar
27319721fb4eSBram Moolenaar  source Xlegacy_script.vim
27329721fb4eSBram Moolenaar
27339721fb4eSBram Moolenaar  assert_equal('global', g:global)
2734f5be8cdbSBram Moolenaar  unlet g:global
27359721fb4eSBram Moolenaar
27369721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
27379721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
27389721fb4eSBram Moolenaarenddef
2739a5d0077eSBram Moolenaar
27407d699701SBram Moolenaarfunc Test_vim9script_not_global()
27417d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
27427d699701SBram Moolenaar  let vim9lines =<< trim END
27437d699701SBram Moolenaar    vim9script
2744cfcd011fSBram Moolenaar    var name = 'local'
27457d699701SBram Moolenaar    func TheFunc()
27467d699701SBram Moolenaar      echo 'local'
27477d699701SBram Moolenaar    endfunc
27487d699701SBram Moolenaar    def DefFunc()
27497d699701SBram Moolenaar      echo 'local'
27507d699701SBram Moolenaar    enddef
27517d699701SBram Moolenaar  END
27527d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
27537d699701SBram Moolenaar  source Xvim9script.vim
27547d699701SBram Moolenaar  try
27557d699701SBram Moolenaar    echo g:var
27567d699701SBram Moolenaar    assert_report('did not fail')
27577d699701SBram Moolenaar  catch /E121:/
27587d699701SBram Moolenaar    " caught
27597d699701SBram Moolenaar  endtry
27607d699701SBram Moolenaar  try
27617d699701SBram Moolenaar    call TheFunc()
27627d699701SBram Moolenaar    assert_report('did not fail')
27637d699701SBram Moolenaar  catch /E117:/
27647d699701SBram Moolenaar    " caught
27657d699701SBram Moolenaar  endtry
27667d699701SBram Moolenaar  try
27677d699701SBram Moolenaar    call DefFunc()
27687d699701SBram Moolenaar    assert_report('did not fail')
27697d699701SBram Moolenaar  catch /E117:/
27707d699701SBram Moolenaar    " caught
27717d699701SBram Moolenaar  endtry
27727d699701SBram Moolenaar
277325859dd7SBram Moolenaar  call delete('Xvim9script.vim')
27747d699701SBram Moolenaarendfunc
27757d699701SBram Moolenaar
2776eeb27bfeSBram Moolenaardef Test_vim9_copen()
2777eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2778eeb27bfeSBram Moolenaar  copen
2779eeb27bfeSBram Moolenaar  quit
2780eeb27bfeSBram Moolenaarenddef
2781eeb27bfeSBram Moolenaar
27822d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
27832d6b20d6SBram Moolenaardef Test_vim9_autoload()
2784cfcd011fSBram Moolenaar  var lines =<< trim END
27852d6b20d6SBram Moolenaar     vim9script
27862d6b20d6SBram Moolenaar     def foo#test()
27872d6b20d6SBram Moolenaar         echomsg getreg('"')
27882d6b20d6SBram Moolenaar     enddef
27892d6b20d6SBram Moolenaar  END
27902d6b20d6SBram Moolenaar
27912d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
27922d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2793cfcd011fSBram Moolenaar  var save_rtp = &rtp
27942d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
27952d6b20d6SBram Moolenaar  augroup test
27962d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
27972d6b20d6SBram Moolenaar  augroup END
27982d6b20d6SBram Moolenaar
27992d6b20d6SBram Moolenaar  normal Y
28002d6b20d6SBram Moolenaar
28012d6b20d6SBram Moolenaar  augroup test
28022d6b20d6SBram Moolenaar    autocmd!
28032d6b20d6SBram Moolenaar  augroup END
28042d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
28052d6b20d6SBram Moolenaar  &rtp = save_rtp
28062d6b20d6SBram Moolenaarenddef
28072d6b20d6SBram Moolenaar
280877e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
280977e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2810cfcd011fSBram Moolenaar  var lines =<< trim END
281177e5dcc3SBram Moolenaar      vim9script
281277e5dcc3SBram Moolenaar      def crash#func()
281377e5dcc3SBram Moolenaar          try
281477e5dcc3SBram Moolenaar              for x in List()
281577e5dcc3SBram Moolenaar              endfor
281677e5dcc3SBram Moolenaar          catch
281777e5dcc3SBram Moolenaar          endtry
281877e5dcc3SBram Moolenaar          g:ok = true
281977e5dcc3SBram Moolenaar      enddef
282077e5dcc3SBram Moolenaar      fu List()
282177e5dcc3SBram Moolenaar          invalid
282277e5dcc3SBram Moolenaar      endfu
282377e5dcc3SBram Moolenaar      try
282477e5dcc3SBram Moolenaar          invalid
282577e5dcc3SBram Moolenaar      catch /wontmatch/
282677e5dcc3SBram Moolenaar      endtry
282777e5dcc3SBram Moolenaar  END
282877e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
282977e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
283077e5dcc3SBram Moolenaar
283177e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
283277e5dcc3SBram Moolenaar  lines =<< trim END
283377e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
283477e5dcc3SBram Moolenaar    call crash#func()
283577e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
28369c4f5520SBram Moolenaar    qall!
283777e5dcc3SBram Moolenaar  END
283877e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
283977e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
284077e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
284177e5dcc3SBram Moolenaar
284277e5dcc3SBram Moolenaar  delete('Xdidit')
284377e5dcc3SBram Moolenaar  delete('Xscript')
284477e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
284577e5dcc3SBram Moolenaarenddef
284677e5dcc3SBram Moolenaar
284781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
284881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
284981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2850cfcd011fSBram Moolenaar  var lines =<< trim END
285181e17fbeSBram Moolenaar    let s:counter = 1
285281e17fbeSBram Moolenaar    def s:Func()
285381e17fbeSBram Moolenaar      au! CursorHold
285481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
285581e17fbeSBram Moolenaar    enddef
285681e17fbeSBram Moolenaar    call s:Func()
285781e17fbeSBram Moolenaar    doau CursorHold
285881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
285981e17fbeSBram Moolenaar    au! CursorHold
286081e17fbeSBram Moolenaar  END
286181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
286281e17fbeSBram Moolenaarenddef
286381e17fbeSBram Moolenaar
28643896a105SBram Moolenaardef Test_cmdline_win()
28653896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
28663896a105SBram Moolenaar  # the command line window.
28673896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2868cfcd011fSBram Moolenaar  var export_lines =<< trim END
28693896a105SBram Moolenaar    vim9script
2870cfcd011fSBram Moolenaar    export var That = 'yes'
28713896a105SBram Moolenaar  END
28723896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2873cfcd011fSBram Moolenaar  var import_lines =<< trim END
28743896a105SBram Moolenaar    vim9script
28753896a105SBram Moolenaar    import That from './Xexport.vim'
28763896a105SBram Moolenaar  END
28773896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2878cfcd011fSBram Moolenaar  var save_rtp = &rtp
28793896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
28803896a105SBram Moolenaar  syntax on
28813896a105SBram Moolenaar  augroup CmdWin
28823896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
28833896a105SBram Moolenaar  augroup END
28843896a105SBram Moolenaar  # this will open and also close the cmdline window
28853896a105SBram Moolenaar  feedkeys('q:', 'xt')
28863896a105SBram Moolenaar  assert_equal('yes', g:got_there)
28873896a105SBram Moolenaar
28883896a105SBram Moolenaar  augroup CmdWin
28893896a105SBram Moolenaar    au!
28903896a105SBram Moolenaar  augroup END
28913896a105SBram Moolenaar  &rtp = save_rtp
28923896a105SBram Moolenaar  delete('rtp', 'rf')
28933896a105SBram Moolenaarenddef
28943896a105SBram Moolenaar
2895e3d4685fSBram Moolenaardef Test_invalid_sid()
2896e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
289725859dd7SBram Moolenaar
28989c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2899d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2900e3d4685fSBram Moolenaar  endif
2901e3d4685fSBram Moolenaar  delete('Xdidit')
2902e3d4685fSBram Moolenaarenddef
2903e3d4685fSBram Moolenaar
29049ec7026fSBram Moolenaardef Test_restoring_cpo()
29059ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
29069ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
29079ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
29089ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
29099ec7026fSBram Moolenaar  endif
29109ec7026fSBram Moolenaar  delete('Xsourced')
29119ec7026fSBram Moolenaar  delete('Xclose')
29129ec7026fSBram Moolenaarenddef
29139ec7026fSBram Moolenaar
29149ec7026fSBram Moolenaar
2915f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2916cfcd011fSBram Moolenaar  var lines =<< trim END
2917cfcd011fSBram Moolenaar    var name: any
2918cfcd011fSBram Moolenaar    assert_equal(0, name)
2919f0afd9e1SBram Moolenaar  END
2920f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2921f0afd9e1SBram Moolenaarenddef
2922f0afd9e1SBram Moolenaar
29237e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
292458dbef33SBram Moolenaar  CheckRunVimInTerminal
292558dbef33SBram Moolenaar
29267e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
29277e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
29287e9210eaSBram Moolenaarendfunc
29297e9210eaSBram Moolenaar
29307e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
29319c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2932cfcd011fSBram Moolenaar  var lines =<< trim END
29339c4f5520SBram Moolenaar    func CheckAndQuit()
29349c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
29359c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
29369c4f5520SBram Moolenaar    endfunc
29379c4f5520SBram Moolenaar  END
29389c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
29399c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2940e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
29419c4f5520SBram Moolenaar  # define Afunc() on the command line
29429c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
29439c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
29449c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
29459c4f5520SBram Moolenaar
29469c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
29479c4f5520SBram Moolenaar  delete('XcallFunc')
29489c4f5520SBram Moolenaar  delete('Xdidcmd')
29499c4f5520SBram Moolenaarenddef
29509c4f5520SBram Moolenaar
2951fcdc5d83SBram Moolenaardef Test_script_var_scope()
2952fcdc5d83SBram Moolenaar  var lines =<< trim END
2953fcdc5d83SBram Moolenaar      vim9script
2954fcdc5d83SBram Moolenaar      if true
2955fcdc5d83SBram Moolenaar        if true
2956fcdc5d83SBram Moolenaar          var one = 'one'
2957fcdc5d83SBram Moolenaar          echo one
2958fcdc5d83SBram Moolenaar        endif
2959fcdc5d83SBram Moolenaar        echo one
2960fcdc5d83SBram Moolenaar      endif
2961fcdc5d83SBram Moolenaar  END
2962fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2963fcdc5d83SBram Moolenaar
2964fcdc5d83SBram Moolenaar  lines =<< trim END
2965fcdc5d83SBram Moolenaar      vim9script
2966fcdc5d83SBram Moolenaar      if true
2967fcdc5d83SBram Moolenaar        if false
2968fcdc5d83SBram Moolenaar          var one = 'one'
2969fcdc5d83SBram Moolenaar          echo one
2970fcdc5d83SBram Moolenaar        else
2971fcdc5d83SBram Moolenaar          var one = 'one'
2972fcdc5d83SBram Moolenaar          echo one
2973fcdc5d83SBram Moolenaar        endif
2974fcdc5d83SBram Moolenaar        echo one
2975fcdc5d83SBram Moolenaar      endif
2976fcdc5d83SBram Moolenaar  END
2977fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
2978fcdc5d83SBram Moolenaar
2979fcdc5d83SBram Moolenaar  lines =<< trim END
2980fcdc5d83SBram Moolenaar      vim9script
2981fcdc5d83SBram Moolenaar      while true
2982fcdc5d83SBram Moolenaar        var one = 'one'
2983fcdc5d83SBram Moolenaar        echo one
2984fcdc5d83SBram Moolenaar        break
2985fcdc5d83SBram Moolenaar      endwhile
2986fcdc5d83SBram Moolenaar      echo one
2987fcdc5d83SBram Moolenaar  END
2988fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2989fcdc5d83SBram Moolenaar
2990fcdc5d83SBram Moolenaar  lines =<< trim END
2991fcdc5d83SBram Moolenaar      vim9script
2992fcdc5d83SBram Moolenaar      for i in range(1)
2993fcdc5d83SBram Moolenaar        var one = 'one'
2994fcdc5d83SBram Moolenaar        echo one
2995fcdc5d83SBram Moolenaar      endfor
2996fcdc5d83SBram Moolenaar      echo one
2997fcdc5d83SBram Moolenaar  END
2998fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
29999becdf2bSBram Moolenaar
30009becdf2bSBram Moolenaar  lines =<< trim END
30019becdf2bSBram Moolenaar      vim9script
30029becdf2bSBram Moolenaar      {
30039becdf2bSBram Moolenaar        var one = 'one'
30049becdf2bSBram Moolenaar        assert_equal('one', one)
30059becdf2bSBram Moolenaar      }
30069becdf2bSBram Moolenaar      assert_false(exists('one'))
30079becdf2bSBram Moolenaar      assert_false(exists('s:one'))
30089becdf2bSBram Moolenaar  END
30099becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
30109becdf2bSBram Moolenaar
30119becdf2bSBram Moolenaar  lines =<< trim END
30129becdf2bSBram Moolenaar      vim9script
30139becdf2bSBram Moolenaar      {
30149becdf2bSBram Moolenaar        var one = 'one'
30159becdf2bSBram Moolenaar        echo one
30169becdf2bSBram Moolenaar      }
30179becdf2bSBram Moolenaar      echo one
30189becdf2bSBram Moolenaar  END
30199becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3020fcdc5d83SBram Moolenaarenddef
3021fcdc5d83SBram Moolenaar
3022352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3023352134bbSBram Moolenaar  var lines =<< trim END
3024352134bbSBram Moolenaar    vim9script
3025352134bbSBram Moolenaar    def Callback(...l: any)
3026352134bbSBram Moolenaar      try
3027352134bbSBram Moolenaar        var x: string
3028352134bbSBram Moolenaar        var y: string
3029352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3030352134bbSBram Moolenaar        [x, y] = ['']
3031352134bbSBram Moolenaar      catch
3032352134bbSBram Moolenaar        g:caught = 'yes'
3033352134bbSBram Moolenaar      endtry
3034352134bbSBram Moolenaar    enddef
3035e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3036352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3037352134bbSBram Moolenaar  END
3038352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3039352134bbSBram Moolenaar
3040352134bbSBram Moolenaar  unlet g:caught
3041352134bbSBram Moolenaarenddef
3042352134bbSBram Moolenaar
3043631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3044631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3045631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3046631e8f93SBram Moolenaar  endif
3047631e8f93SBram Moolenaar  var lines =<< trim END
3048631e8f93SBram Moolenaar      vim9script
3049631e8f93SBram Moolenaar      var source: list<number>
3050631e8f93SBram Moolenaar      def Out_cb(...l: any)
3051631e8f93SBram Moolenaar          eval [][0]
3052631e8f93SBram Moolenaar      enddef
3053631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3054631e8f93SBram Moolenaar          sleep 1m
3055631e8f93SBram Moolenaar          source += l
3056631e8f93SBram Moolenaar      enddef
3057e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
3058631e8f93SBram Moolenaar      sleep 100m
3059631e8f93SBram Moolenaar  END
3060631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3061631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3062631e8f93SBram Moolenaar  delete('Xdef')
3063631e8f93SBram Moolenaarenddef
3064631e8f93SBram Moolenaar
30654324d87aSBram Moolenaardef InvokeNormal()
30664324d87aSBram Moolenaar  exe "norm! :m+1\r"
30674324d87aSBram Moolenaarenddef
30684324d87aSBram Moolenaar
30694324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
30704324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
30714324d87aSBram Moolenaar  new
30724324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
30734324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
30744324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
30754324d87aSBram Moolenaar  xunmap <F3>
3076b5b9480eSBram Moolenaarenddef
3077b5b9480eSBram Moolenaar
3078b5b9480eSBram Moolenaardef Test_white_space_after_command()
3079b5b9480eSBram Moolenaar  var lines =<< trim END
3080b5b9480eSBram Moolenaar    exit_cb: Func})
3081b5b9480eSBram Moolenaar  END
3082b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
30834324d87aSBram Moolenaarenddef
30844324d87aSBram Moolenaar
3085585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3086585fea7bSBram Moolenaardef Test_substitute_cmd()
3087585fea7bSBram Moolenaar  new
3088585fea7bSBram Moolenaar  setline(1, 'something')
3089585fea7bSBram Moolenaar  :substitute(some(other(
3090585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3091585fea7bSBram Moolenaar  bwipe!
3092585fea7bSBram Moolenaar
3093f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3094cfcd011fSBram Moolenaar  var lines =<< trim END
3095585fea7bSBram Moolenaar    vim9script
3096585fea7bSBram Moolenaar    new
3097585fea7bSBram Moolenaar    setline(1, 'something')
3098585fea7bSBram Moolenaar    :substitute(some(other(
3099585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3100585fea7bSBram Moolenaar    bwipe!
3101585fea7bSBram Moolenaar  END
3102585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3103585fea7bSBram Moolenaar  source Xvim9lines
3104585fea7bSBram Moolenaar
3105585fea7bSBram Moolenaar  delete('Xvim9lines')
3106585fea7bSBram Moolenaarenddef
3107585fea7bSBram Moolenaar
31088a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3109