18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25c2af0affSBram Moolenaar  bwipe!
265d72ce69SBram Moolenaarenddef
275d72ce69SBram Moolenaar
28a6e67e4fSBram Moolenaarlet g:alist = [7]
29a6e67e4fSBram Moolenaarlet g:astring = 'text'
30f0b9f43cSBram Moolenaarlet g:anumber = 123
316e587dcbSBram Moolenaar
324c17ad94SBram Moolenaardef Test_delfunction()
33f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
344c17ad94SBram Moolenaar  CheckScriptSuccess([
354c17ad94SBram Moolenaar      'vim9script',
364c17ad94SBram Moolenaar      'func CheckMe()',
374c17ad94SBram Moolenaar      '  return 123',
384c17ad94SBram Moolenaar      'endfunc',
394c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
404c17ad94SBram Moolenaar      ])
414c17ad94SBram Moolenaar
42f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
434c17ad94SBram Moolenaar  CheckScriptFailure([
444c17ad94SBram Moolenaar      'vim9script',
454c17ad94SBram Moolenaar      'func DeleteMe1()',
464c17ad94SBram Moolenaar      'endfunc',
474c17ad94SBram Moolenaar      'delfunction DeleteMe1',
484c17ad94SBram Moolenaar      ], 'E1084:')
494c17ad94SBram Moolenaar  CheckScriptFailure([
504c17ad94SBram Moolenaar      'vim9script',
514c17ad94SBram Moolenaar      'func DeleteMe2()',
524c17ad94SBram Moolenaar      'endfunc',
534c17ad94SBram Moolenaar      'def DoThat()',
544c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
554c17ad94SBram Moolenaar      'enddef',
564c17ad94SBram Moolenaar      'DoThat()',
574c17ad94SBram Moolenaar      ], 'E1084:')
584c17ad94SBram Moolenaar  CheckScriptFailure([
594c17ad94SBram Moolenaar      'vim9script',
604c17ad94SBram Moolenaar      'def DeleteMe3()',
614c17ad94SBram Moolenaar      'enddef',
624c17ad94SBram Moolenaar      'delfunction DeleteMe3',
634c17ad94SBram Moolenaar      ], 'E1084:')
644c17ad94SBram Moolenaar  CheckScriptFailure([
654c17ad94SBram Moolenaar      'vim9script',
664c17ad94SBram Moolenaar      'def DeleteMe4()',
674c17ad94SBram Moolenaar      'enddef',
684c17ad94SBram Moolenaar      'def DoThat()',
694c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
704c17ad94SBram Moolenaar      'enddef',
714c17ad94SBram Moolenaar      'DoThat()',
724c17ad94SBram Moolenaar      ], 'E1084:')
73925e9fd6SBram Moolenaar
74925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
75cfcd011fSBram Moolenaar  var lines =<< trim END
76925e9fd6SBram Moolenaar      vim9script
77925e9fd6SBram Moolenaar      def g:Global(): string
78925e9fd6SBram Moolenaar        return "yes"
79925e9fd6SBram Moolenaar      enddef
80925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
81925e9fd6SBram Moolenaar      def! g:Global(): string
82925e9fd6SBram Moolenaar        return "no"
83925e9fd6SBram Moolenaar      enddef
84925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
85925e9fd6SBram Moolenaar      delfunc g:Global
86925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
87925e9fd6SBram Moolenaar  END
88925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
91925e9fd6SBram Moolenaar  lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      func g:Global()
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      endfunc
96925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
97925e9fd6SBram Moolenaar      def! g:Global(): string
98925e9fd6SBram Moolenaar        return "no"
99925e9fd6SBram Moolenaar      enddef
100925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
101925e9fd6SBram Moolenaar      delfunc g:Global
102925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
103925e9fd6SBram Moolenaar  END
104925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
105925e9fd6SBram Moolenaar
106925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      def g:Global(): string
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      enddef
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      func! g:Global()
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      endfunc
116925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
117925e9fd6SBram Moolenaar      delfunc g:Global
118925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
119925e9fd6SBram Moolenaar  END
120925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1214c17ad94SBram Moolenaarenddef
1224c17ad94SBram Moolenaar
12308052228SBram Moolenaardef Test_wrong_type()
124cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
125cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
126cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
127cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
128599c89c8SBram Moolenaar
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13142a480bfSBram Moolenaar
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
133cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
136cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
143a0a9f43aSBram Moolenaar
144cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
14608052228SBram Moolenaarenddef
1478a7d6542SBram Moolenaar
14810c65860SBram Moolenaardef Test_script_wrong_type()
14910c65860SBram Moolenaar  var lines =<< trim END
15010c65860SBram Moolenaar      vim9script
15110c65860SBram Moolenaar      var s:dict: dict<string>
15210c65860SBram Moolenaar      s:dict['a'] = ['x']
15310c65860SBram Moolenaar  END
15410c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
15510c65860SBram Moolenaarenddef
15610c65860SBram Moolenaar
15708052228SBram Moolenaardef Test_const()
158cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
160cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16130fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16230fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
163dbeecb2bSBram Moolenaar
164cfcd011fSBram Moolenaar  var lines =<< trim END
16530fd8204SBram Moolenaar    final list = [1, 2, 3]
166dbeecb2bSBram Moolenaar    list[0] = 4
1670b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
16830fd8204SBram Moolenaar    const other = [5, 6, 7]
1690b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17071abe482SBram Moolenaar
171cfcd011fSBram Moolenaar    var varlist = [7, 8]
17230fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17371abe482SBram Moolenaar    varlist[0] = 77
17471abe482SBram Moolenaar    # TODO: does not work yet
17571abe482SBram Moolenaar    # constlist[1][1] = 88
176cfcd011fSBram Moolenaar    var cl = constlist[1]
17771abe482SBram Moolenaar    cl[1] = 88
17871abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
17971abe482SBram Moolenaar
180e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
181e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
18271abe482SBram Moolenaar    vardict['five'] = 55
18371abe482SBram Moolenaar    # TODO: does not work yet
18471abe482SBram Moolenaar    # constdict['two']['six'] = 66
185cfcd011fSBram Moolenaar    var cd = constdict['two']
18671abe482SBram Moolenaar    cd['six'] = 66
187e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
188dbeecb2bSBram Moolenaar  END
189dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19008052228SBram Moolenaarenddef
1918a7d6542SBram Moolenaar
1920b4c66c6SBram Moolenaardef Test_const_bang()
193cfcd011fSBram Moolenaar  var lines =<< trim END
19430fd8204SBram Moolenaar      const var = 234
1950b4c66c6SBram Moolenaar      var = 99
1960b4c66c6SBram Moolenaar  END
1970b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
1980b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
1990b4c66c6SBram Moolenaar
2000b4c66c6SBram Moolenaar  lines =<< trim END
20130fd8204SBram Moolenaar      const ll = [2, 3, 4]
2020b4c66c6SBram Moolenaar      ll[0] = 99
2030b4c66c6SBram Moolenaar  END
2040b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2050b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2060b4c66c6SBram Moolenaar
2070b4c66c6SBram Moolenaar  lines =<< trim END
20830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2090b4c66c6SBram Moolenaar      ll[3] = 99
2100b4c66c6SBram Moolenaar  END
2110b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2120b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2130b4c66c6SBram Moolenaar
2140b4c66c6SBram Moolenaar  lines =<< trim END
215e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2160b4c66c6SBram Moolenaar      dd["one"] = 99
2170b4c66c6SBram Moolenaar  END
2180b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2190b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2200b4c66c6SBram Moolenaar
2210b4c66c6SBram Moolenaar  lines =<< trim END
222e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2230b4c66c6SBram Moolenaar      dd["three"] = 99
2240b4c66c6SBram Moolenaar  END
2250b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2260b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2270b4c66c6SBram Moolenaarenddef
2280b4c66c6SBram Moolenaar
229df069eecSBram Moolenaardef Test_range_no_colon()
230d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
231d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
232d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
233d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
234df069eecSBram Moolenaarenddef
235df069eecSBram Moolenaar
236df069eecSBram Moolenaar
2378a7d6542SBram Moolenaardef Test_block()
238cfcd011fSBram Moolenaar  var outer = 1
2398a7d6542SBram Moolenaar  {
240cfcd011fSBram Moolenaar    var inner = 2
2418a7d6542SBram Moolenaar    assert_equal(1, outer)
2428a7d6542SBram Moolenaar    assert_equal(2, inner)
2438a7d6542SBram Moolenaar  }
2448a7d6542SBram Moolenaar  assert_equal(1, outer)
2458a7d6542SBram Moolenaarenddef
2468a7d6542SBram Moolenaar
24708052228SBram Moolenaardef Test_block_failure()
248cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
24908052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25008052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25108052228SBram Moolenaarenddef
2528a7d6542SBram Moolenaar
253fbbcd003SBram Moolenaardef Test_block_local_vars()
254fbbcd003SBram Moolenaar  var lines =<< trim END
255fbbcd003SBram Moolenaar      vim9script
256ed234f24SBram Moolenaar      v:testing = 1
257fbbcd003SBram Moolenaar      if true
258ed234f24SBram Moolenaar        var text = ['hello']
259ed234f24SBram Moolenaar        def SayHello(): list<string>
260fbbcd003SBram Moolenaar          return text
261fbbcd003SBram Moolenaar        enddef
262fbbcd003SBram Moolenaar        def SetText(v: string)
263ed234f24SBram Moolenaar          text = [v]
264fbbcd003SBram Moolenaar        enddef
265fbbcd003SBram Moolenaar      endif
266fbbcd003SBram Moolenaar
267fbbcd003SBram Moolenaar      if true
268ed234f24SBram Moolenaar        var text = ['again']
269ed234f24SBram Moolenaar        def SayAgain(): list<string>
270fbbcd003SBram Moolenaar          return text
271fbbcd003SBram Moolenaar        enddef
272fbbcd003SBram Moolenaar      endif
273ed234f24SBram Moolenaar
274ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
275ed234f24SBram Moolenaar      test_garbagecollect_now()
276ed234f24SBram Moolenaar
277fbbcd003SBram Moolenaar      defcompile
278fbbcd003SBram Moolenaar
279ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
280ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
281fbbcd003SBram Moolenaar
282fbbcd003SBram Moolenaar      SetText('foobar')
283ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
284ed234f24SBram Moolenaar
285ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
286ed234f24SBram Moolenaar      qall!
287fbbcd003SBram Moolenaar  END
288ed234f24SBram Moolenaar
289ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
290ed234f24SBram Moolenaar  # context gets garbage collected.
291ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
292ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
293ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
294ed234f24SBram Moolenaar
295ed234f24SBram Moolenaar  delete('Xscript')
296ed234f24SBram Moolenaar  delete('Xdidit')
297fbbcd003SBram Moolenaarenddef
298fbbcd003SBram Moolenaar
29939ca4127SBram Moolenaardef Test_block_local_vars_with_func()
30039ca4127SBram Moolenaar  var lines =<< trim END
30139ca4127SBram Moolenaar      vim9script
30239ca4127SBram Moolenaar      if true
30339ca4127SBram Moolenaar        var foo = 'foo'
30439ca4127SBram Moolenaar        if true
30539ca4127SBram Moolenaar          var bar = 'bar'
30639ca4127SBram Moolenaar          def Func(): list<string>
30739ca4127SBram Moolenaar            return [foo, bar]
30839ca4127SBram Moolenaar          enddef
30939ca4127SBram Moolenaar        endif
31039ca4127SBram Moolenaar      endif
31139ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
31239ca4127SBram Moolenaar      # "foo" and "bar"
31339ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
31439ca4127SBram Moolenaar  END
31539ca4127SBram Moolenaar  CheckScriptSuccess(lines)
31639ca4127SBram Moolenaarenddef
31739ca4127SBram Moolenaar
318d032f34aSBram Moolenaarfunc g:NoSuchFunc()
319d032f34aSBram Moolenaar  echo 'none'
320d032f34aSBram Moolenaarendfunc
321d032f34aSBram Moolenaar
3228a7d6542SBram Moolenaardef Test_try_catch()
323cfcd011fSBram Moolenaar  var l = []
3247a092245SBram Moolenaar  try # comment
3258a7d6542SBram Moolenaar    add(l, '1')
3268a7d6542SBram Moolenaar    throw 'wrong'
3278a7d6542SBram Moolenaar    add(l, '2')
3287a092245SBram Moolenaar  catch # comment
3298a7d6542SBram Moolenaar    add(l, v:exception)
3307a092245SBram Moolenaar  finally # comment
3318a7d6542SBram Moolenaar    add(l, '3')
3327a092245SBram Moolenaar  endtry # comment
3338a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
33468d130c6SBram Moolenaar
335e859312eSBram Moolenaar  l = []
336e859312eSBram Moolenaar  try
337e859312eSBram Moolenaar    try
338e859312eSBram Moolenaar      add(l, '1')
339e859312eSBram Moolenaar      throw 'wrong'
340e859312eSBram Moolenaar      add(l, '2')
341e859312eSBram Moolenaar    catch /right/
342e859312eSBram Moolenaar      add(l, v:exception)
343e859312eSBram Moolenaar    endtry
344e859312eSBram Moolenaar  catch /wrong/
345e859312eSBram Moolenaar    add(l, 'caught')
346373863edSBram Moolenaar  fina
347e859312eSBram Moolenaar    add(l, 'finally')
348e859312eSBram Moolenaar  endtry
349e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
350e859312eSBram Moolenaar
351cfcd011fSBram Moolenaar  var n: number
35268d130c6SBram Moolenaar  try
35368d130c6SBram Moolenaar    n = l[3]
35468d130c6SBram Moolenaar  catch /E684:/
35568d130c6SBram Moolenaar    n = 99
35668d130c6SBram Moolenaar  endtry
35768d130c6SBram Moolenaar  assert_equal(99, n)
35868d130c6SBram Moolenaar
35968d130c6SBram Moolenaar  try
360cc673e74SBram Moolenaar    # string slice returns a string, not a number
36168d130c6SBram Moolenaar    n = g:astring[3]
3625e654230SBram Moolenaar  catch /E1012:/
36368d130c6SBram Moolenaar    n = 77
36468d130c6SBram Moolenaar  endtry
36568d130c6SBram Moolenaar  assert_equal(77, n)
36668d130c6SBram Moolenaar
36768d130c6SBram Moolenaar  try
36868d130c6SBram Moolenaar    n = l[g:astring]
3695e654230SBram Moolenaar  catch /E1012:/
37056acb094SBram Moolenaar    n = 88
37168d130c6SBram Moolenaar  endtry
37256acb094SBram Moolenaar  assert_equal(88, n)
37368d130c6SBram Moolenaar
37468d130c6SBram Moolenaar  try
37568d130c6SBram Moolenaar    n = s:does_not_exist
37668d130c6SBram Moolenaar  catch /E121:/
377f0b9f43cSBram Moolenaar    n = 111
378f0b9f43cSBram Moolenaar  endtry
379f0b9f43cSBram Moolenaar  assert_equal(111, n)
380f0b9f43cSBram Moolenaar
381f0b9f43cSBram Moolenaar  try
382f0b9f43cSBram Moolenaar    n = g:does_not_exist
383f0b9f43cSBram Moolenaar  catch /E121:/
38468d130c6SBram Moolenaar    n = 121
38568d130c6SBram Moolenaar  endtry
38668d130c6SBram Moolenaar  assert_equal(121, n)
38768d130c6SBram Moolenaar
388e0de171eSBram Moolenaar  var d = {one: 1}
38968d130c6SBram Moolenaar  try
39068d130c6SBram Moolenaar    n = d[g:astring]
39168d130c6SBram Moolenaar  catch /E716:/
39268d130c6SBram Moolenaar    n = 222
39368d130c6SBram Moolenaar  endtry
39468d130c6SBram Moolenaar  assert_equal(222, n)
395f0b9f43cSBram Moolenaar
396f0b9f43cSBram Moolenaar  try
397f0b9f43cSBram Moolenaar    n = -g:astring
398f0b9f43cSBram Moolenaar  catch /E39:/
399f0b9f43cSBram Moolenaar    n = 233
400f0b9f43cSBram Moolenaar  endtry
401f0b9f43cSBram Moolenaar  assert_equal(233, n)
402f0b9f43cSBram Moolenaar
403f0b9f43cSBram Moolenaar  try
404f0b9f43cSBram Moolenaar    n = +g:astring
405f0b9f43cSBram Moolenaar  catch /E1030:/
406f0b9f43cSBram Moolenaar    n = 244
407f0b9f43cSBram Moolenaar  endtry
408f0b9f43cSBram Moolenaar  assert_equal(244, n)
409f0b9f43cSBram Moolenaar
410f0b9f43cSBram Moolenaar  try
411f0b9f43cSBram Moolenaar    n = +g:alist
412f0b9f43cSBram Moolenaar  catch /E745:/
413f0b9f43cSBram Moolenaar    n = 255
414f0b9f43cSBram Moolenaar  endtry
415f0b9f43cSBram Moolenaar  assert_equal(255, n)
416f0b9f43cSBram Moolenaar
417cfcd011fSBram Moolenaar  var nd: dict<any>
418f0b9f43cSBram Moolenaar  try
4192bede173SBram Moolenaar    nd = {[g:anumber]: 1}
4205e654230SBram Moolenaar  catch /E1012:/
421f0b9f43cSBram Moolenaar    n = 266
422f0b9f43cSBram Moolenaar  endtry
423f0b9f43cSBram Moolenaar  assert_equal(266, n)
424f0b9f43cSBram Moolenaar
425f0b9f43cSBram Moolenaar  try
426f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
427f0b9f43cSBram Moolenaar  catch /E1093:/
428f0b9f43cSBram Moolenaar    n = 277
429f0b9f43cSBram Moolenaar  endtry
430f0b9f43cSBram Moolenaar  assert_equal(277, n)
431f0b9f43cSBram Moolenaar
432e859312eSBram Moolenaar  try
433e859312eSBram Moolenaar    &ts = g:astring
4345e654230SBram Moolenaar  catch /E1012:/
435e859312eSBram Moolenaar    n = 288
436e859312eSBram Moolenaar  endtry
437e859312eSBram Moolenaar  assert_equal(288, n)
438e859312eSBram Moolenaar
439e859312eSBram Moolenaar  try
440e859312eSBram Moolenaar    &backspace = 'asdf'
441e859312eSBram Moolenaar  catch /E474:/
442e859312eSBram Moolenaar    n = 299
443e859312eSBram Moolenaar  endtry
444e859312eSBram Moolenaar  assert_equal(299, n)
445e859312eSBram Moolenaar
446e859312eSBram Moolenaar  l = [1]
447e859312eSBram Moolenaar  try
448e859312eSBram Moolenaar    l[3] = 3
449e859312eSBram Moolenaar  catch /E684:/
450e859312eSBram Moolenaar    n = 300
451e859312eSBram Moolenaar  endtry
452e859312eSBram Moolenaar  assert_equal(300, n)
453e859312eSBram Moolenaar
454e859312eSBram Moolenaar  try
455e859312eSBram Moolenaar    unlet g:does_not_exist
456e859312eSBram Moolenaar  catch /E108:/
457e859312eSBram Moolenaar    n = 322
458e859312eSBram Moolenaar  endtry
459e859312eSBram Moolenaar  assert_equal(322, n)
460e859312eSBram Moolenaar
461e859312eSBram Moolenaar  try
4622bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
463e859312eSBram Moolenaar  catch /E721:/
464e859312eSBram Moolenaar    n = 333
465e859312eSBram Moolenaar  endtry
466e859312eSBram Moolenaar  assert_equal(333, n)
467e859312eSBram Moolenaar
468e859312eSBram Moolenaar  try
469e859312eSBram Moolenaar    l = DeletedFunc()
470e859312eSBram Moolenaar  catch /E933:/
471e859312eSBram Moolenaar    n = 344
472e859312eSBram Moolenaar  endtry
473e859312eSBram Moolenaar  assert_equal(344, n)
474d032f34aSBram Moolenaar
475d032f34aSBram Moolenaar  try
476d032f34aSBram Moolenaar    echo len(v:true)
477d032f34aSBram Moolenaar  catch /E701:/
478d032f34aSBram Moolenaar    n = 355
479d032f34aSBram Moolenaar  endtry
480d032f34aSBram Moolenaar  assert_equal(355, n)
481d032f34aSBram Moolenaar
482cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
483d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
484d032f34aSBram Moolenaar  try
485d032f34aSBram Moolenaar    echo P()
486d032f34aSBram Moolenaar  catch /E117:/
487d032f34aSBram Moolenaar    n = 366
488d032f34aSBram Moolenaar  endtry
489d032f34aSBram Moolenaar  assert_equal(366, n)
490d032f34aSBram Moolenaar
491d032f34aSBram Moolenaar  try
492d032f34aSBram Moolenaar    echo g:NoSuchFunc()
493d032f34aSBram Moolenaar  catch /E117:/
494d032f34aSBram Moolenaar    n = 377
495d032f34aSBram Moolenaar  endtry
496d032f34aSBram Moolenaar  assert_equal(377, n)
497d032f34aSBram Moolenaar
498d032f34aSBram Moolenaar  try
499d032f34aSBram Moolenaar    echo g:alist + 4
500d032f34aSBram Moolenaar  catch /E745:/
501d032f34aSBram Moolenaar    n = 388
502d032f34aSBram Moolenaar  endtry
503d032f34aSBram Moolenaar  assert_equal(388, n)
504d032f34aSBram Moolenaar
505d032f34aSBram Moolenaar  try
506d032f34aSBram Moolenaar    echo 4 + g:alist
507d032f34aSBram Moolenaar  catch /E745:/
508d032f34aSBram Moolenaar    n = 399
509d032f34aSBram Moolenaar  endtry
510d032f34aSBram Moolenaar  assert_equal(399, n)
511d032f34aSBram Moolenaar
512d032f34aSBram Moolenaar  try
513d032f34aSBram Moolenaar    echo g:alist.member
514d032f34aSBram Moolenaar  catch /E715:/
515d032f34aSBram Moolenaar    n = 400
516d032f34aSBram Moolenaar  endtry
517d032f34aSBram Moolenaar  assert_equal(400, n)
518d032f34aSBram Moolenaar
519d032f34aSBram Moolenaar  try
520d032f34aSBram Moolenaar    echo d.member
521d032f34aSBram Moolenaar  catch /E716:/
522d032f34aSBram Moolenaar    n = 411
523d032f34aSBram Moolenaar  endtry
524d032f34aSBram Moolenaar  assert_equal(411, n)
5258a7d6542SBram Moolenaarenddef
5268a7d6542SBram Moolenaar
527e859312eSBram Moolenaardef DeletedFunc(): list<any>
528e859312eSBram Moolenaar  return ['delete me']
529e859312eSBram Moolenaarenddef
530e859312eSBram Moolenaardefcompile
531e859312eSBram Moolenaardelfunc DeletedFunc
532e859312eSBram Moolenaar
533257cc5eeSBram Moolenaardef ThrowFromDef()
534a72cfb80SBram Moolenaar  throw "getout" # comment
535257cc5eeSBram Moolenaarenddef
536257cc5eeSBram Moolenaar
537257cc5eeSBram Moolenaarfunc CatchInFunc()
538257cc5eeSBram Moolenaar  try
539257cc5eeSBram Moolenaar    call ThrowFromDef()
540257cc5eeSBram Moolenaar  catch
541257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
542257cc5eeSBram Moolenaar  endtry
543257cc5eeSBram Moolenaarendfunc
544257cc5eeSBram Moolenaar
545257cc5eeSBram Moolenaardef CatchInDef()
546257cc5eeSBram Moolenaar  try
547257cc5eeSBram Moolenaar    ThrowFromDef()
548257cc5eeSBram Moolenaar  catch
549257cc5eeSBram Moolenaar    g:thrown_def = v:exception
550257cc5eeSBram Moolenaar  endtry
551257cc5eeSBram Moolenaarenddef
552257cc5eeSBram Moolenaar
553f575adffSBram Moolenaardef ReturnFinally(): string
554f575adffSBram Moolenaar  try
555f575adffSBram Moolenaar    return 'intry'
556373863edSBram Moolenaar  finall
557f575adffSBram Moolenaar    g:in_finally = 'finally'
558f575adffSBram Moolenaar  endtry
559f575adffSBram Moolenaar  return 'end'
560f575adffSBram Moolenaarenddef
561f575adffSBram Moolenaar
562257cc5eeSBram Moolenaardef Test_try_catch_nested()
563257cc5eeSBram Moolenaar  CatchInFunc()
564257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
565257cc5eeSBram Moolenaar
566257cc5eeSBram Moolenaar  CatchInDef()
567257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
568f575adffSBram Moolenaar
569f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
570f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
571f575adffSBram Moolenaarenddef
572f575adffSBram Moolenaar
5739939f57bSBram Moolenaardef TryOne(): number
5749939f57bSBram Moolenaar  try
5759939f57bSBram Moolenaar    return 0
5769939f57bSBram Moolenaar  catch
5779939f57bSBram Moolenaar  endtry
5789939f57bSBram Moolenaar  return 0
5799939f57bSBram Moolenaarenddef
5809939f57bSBram Moolenaar
5819939f57bSBram Moolenaardef TryTwo(n: number): string
5829939f57bSBram Moolenaar  try
583cfcd011fSBram Moolenaar    var x = {}
5849939f57bSBram Moolenaar  catch
5859939f57bSBram Moolenaar  endtry
5869939f57bSBram Moolenaar  return 'text'
5879939f57bSBram Moolenaarenddef
5889939f57bSBram Moolenaar
5899939f57bSBram Moolenaardef Test_try_catch_twice()
5909939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5919939f57bSBram Moolenaarenddef
5929939f57bSBram Moolenaar
593f575adffSBram Moolenaardef Test_try_catch_match()
594cfcd011fSBram Moolenaar  var seq = 'a'
595f575adffSBram Moolenaar  try
596f575adffSBram Moolenaar    throw 'something'
597f575adffSBram Moolenaar  catch /nothing/
598f575adffSBram Moolenaar    seq ..= 'x'
599f575adffSBram Moolenaar  catch /some/
600f575adffSBram Moolenaar    seq ..= 'b'
601f575adffSBram Moolenaar  catch /asdf/
602f575adffSBram Moolenaar    seq ..= 'x'
603e8c4abbbSBram Moolenaar  catch ?a\?sdf?
604e8c4abbbSBram Moolenaar    seq ..= 'y'
605f575adffSBram Moolenaar  finally
606f575adffSBram Moolenaar    seq ..= 'c'
607f575adffSBram Moolenaar  endtry
608f575adffSBram Moolenaar  assert_equal('abc', seq)
609257cc5eeSBram Moolenaarenddef
610257cc5eeSBram Moolenaar
611e8c4abbbSBram Moolenaardef Test_try_catch_fails()
612d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
613d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
614d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
615d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
616d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
617d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
618d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
619d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
62013106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
621d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
622585fea7bSBram Moolenaar
623e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
624d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
625e8c4abbbSBram Moolenaarenddef
626e8c4abbbSBram Moolenaar
627006ad48bSBram Moolenaardef Test_throw_vimscript()
628f5be8cdbSBram Moolenaar  # only checks line continuation
629cfcd011fSBram Moolenaar  var lines =<< trim END
630006ad48bSBram Moolenaar      vim9script
631006ad48bSBram Moolenaar      try
632006ad48bSBram Moolenaar        throw 'one'
633006ad48bSBram Moolenaar              .. 'two'
634006ad48bSBram Moolenaar      catch
635006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
636006ad48bSBram Moolenaar      endtry
637006ad48bSBram Moolenaar  END
638006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
6391e021e63SBram Moolenaar
6401e021e63SBram Moolenaar  lines =<< trim END
6411e021e63SBram Moolenaar    vim9script
642352134bbSBram Moolenaar    @r = ''
6431e021e63SBram Moolenaar    def Func()
6441e021e63SBram Moolenaar      throw @r
6451e021e63SBram Moolenaar    enddef
6461e021e63SBram Moolenaar    var result = ''
6471e021e63SBram Moolenaar    try
6481e021e63SBram Moolenaar      Func()
6491e021e63SBram Moolenaar    catch /E1129:/
6501e021e63SBram Moolenaar      result = 'caught'
6511e021e63SBram Moolenaar    endtry
6521e021e63SBram Moolenaar    assert_equal('caught', result)
6531e021e63SBram Moolenaar  END
6541e021e63SBram Moolenaar  CheckScriptSuccess(lines)
655006ad48bSBram Moolenaarenddef
656006ad48bSBram Moolenaar
657ed677f55SBram Moolenaardef Test_error_in_nested_function()
658ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
659cfcd011fSBram Moolenaar  var lines =<< trim END
660ed677f55SBram Moolenaar      vim9script
661ed677f55SBram Moolenaar      def Func()
662ed677f55SBram Moolenaar        Error()
663ed677f55SBram Moolenaar        g:test_var = 1
664ed677f55SBram Moolenaar      enddef
665ed677f55SBram Moolenaar      func Error() abort
666ed677f55SBram Moolenaar        eval [][0]
667ed677f55SBram Moolenaar      endfunc
668ed677f55SBram Moolenaar      Func()
669ed677f55SBram Moolenaar  END
670ed677f55SBram Moolenaar  g:test_var = 0
671ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
672ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
673ed677f55SBram Moolenaarenddef
674ed677f55SBram Moolenaar
67537c83711SBram Moolenaardef Test_cexpr_vimscript()
676f5be8cdbSBram Moolenaar  # only checks line continuation
67737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
678cfcd011fSBram Moolenaar  var lines =<< trim END
67937c83711SBram Moolenaar      vim9script
68037c83711SBram Moolenaar      cexpr 'File'
68137c83711SBram Moolenaar                .. ' someFile' ..
68237c83711SBram Moolenaar                   ' line 19'
68337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
68437c83711SBram Moolenaar  END
68537c83711SBram Moolenaar  CheckScriptSuccess(lines)
68637c83711SBram Moolenaar  set errorformat&
68737c83711SBram Moolenaarenddef
68837c83711SBram Moolenaar
689c9edd6b5SBram Moolenaardef Test_statusline_syntax()
690c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
691cfcd011fSBram Moolenaar  var lines =<< trim END
692c9edd6b5SBram Moolenaar      vim9script
693c9edd6b5SBram Moolenaar      func g:Status()
694c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
695c9edd6b5SBram Moolenaar      endfunc
696c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
697c9edd6b5SBram Moolenaar      redrawstatus
698c9edd6b5SBram Moolenaar      set laststatus statusline=
699c9edd6b5SBram Moolenaar  END
700c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
701c9edd6b5SBram Moolenaarenddef
702c9edd6b5SBram Moolenaar
703b209750bSBram Moolenaardef Test_list_vimscript()
704b209750bSBram Moolenaar  # checks line continuation and comments
705cfcd011fSBram Moolenaar  var lines =<< trim END
706b209750bSBram Moolenaar      vim9script
707cfcd011fSBram Moolenaar      var mylist = [
708b209750bSBram Moolenaar            'one',
709b209750bSBram Moolenaar            # comment
710b209750bSBram Moolenaar            'two', # empty line follows
711b209750bSBram Moolenaar
712b209750bSBram Moolenaar            'three',
713b209750bSBram Moolenaar            ]
714b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
715b209750bSBram Moolenaar  END
716b209750bSBram Moolenaar  CheckScriptSuccess(lines)
71766250c93SBram Moolenaar
71866250c93SBram Moolenaar  # check all lines from heredoc are kept
71966250c93SBram Moolenaar  lines =<< trim END
72066250c93SBram Moolenaar      # comment 1
72166250c93SBram Moolenaar      two
72266250c93SBram Moolenaar      # comment 3
72366250c93SBram Moolenaar
72466250c93SBram Moolenaar      five
72566250c93SBram Moolenaar      # comment 6
72666250c93SBram Moolenaar  END
72766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
728b209750bSBram Moolenaarenddef
729b209750bSBram Moolenaar
7302a1381c3SBram Moolenaarif has('channel')
73140ee466cSBram Moolenaar  let someJob = test_null_job()
73240ee466cSBram Moolenaar
73340ee466cSBram Moolenaar  def FuncWithError()
73440ee466cSBram Moolenaar    echomsg g:someJob
73540ee466cSBram Moolenaar  enddef
73640ee466cSBram Moolenaar
73740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
73840ee466cSBram Moolenaar    try
73940ee466cSBram Moolenaar      call FuncWithError()
74040ee466cSBram Moolenaar    catch
74140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
74240ee466cSBram Moolenaar    endtry
74340ee466cSBram Moolenaar  endfunc
7442a1381c3SBram Moolenaarendif
74540ee466cSBram Moolenaar
7468a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7478a7d6542SBram Moolenaar  vim9script
748cfcd011fSBram Moolenaar  var name: string = 'bob'
7498a7d6542SBram Moolenaar  def Concat(arg: string): string
7508a7d6542SBram Moolenaar    return name .. arg
7518a7d6542SBram Moolenaar  enddef
752227a69deSBram Moolenaar  g:result = Concat('bie')
753227a69deSBram Moolenaar  g:localname = name
7548a7d6542SBram Moolenaar
7558a7d6542SBram Moolenaar  export const CONST = 1234
756cfcd011fSBram Moolenaar  export var exported = 9876
757cfcd011fSBram Moolenaar  export var exp_name = 'John'
7588a7d6542SBram Moolenaar  export def Exported(): string
7598a7d6542SBram Moolenaar    return 'Exported'
7608a7d6542SBram Moolenaar  enddef
7618a7d6542SBram MoolenaarEND
7628a7d6542SBram Moolenaar
763b3ca9824SBram Moolenaardef Undo_export_script_lines()
764b3ca9824SBram Moolenaar  unlet g:result
765b3ca9824SBram Moolenaar  unlet g:localname
766b3ca9824SBram Moolenaarenddef
767b3ca9824SBram Moolenaar
7685269bd2aSBram Moolenaardef Test_vim9_import_export()
769cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7708a7d6542SBram Moolenaar    vim9script
7718a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7728a7d6542SBram Moolenaar    g:imported = exported
7736e587dcbSBram Moolenaar    exported += 3
7746e587dcbSBram Moolenaar    g:imported_added = exported
7758a7d6542SBram Moolenaar    g:imported_func = Exported()
7766e587dcbSBram Moolenaar
77740f4f7a4SBram Moolenaar    def GetExported(): string
778e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
77940f4f7a4SBram Moolenaar      return local_dict.ref()
78040f4f7a4SBram Moolenaar    enddef
78140f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
78240f4f7a4SBram Moolenaar
7836e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7846e587dcbSBram Moolenaar    g:imported_name = exp_name
7856e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7866e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7875381c7a1SBram Moolenaar    g:imported_later = exported
7888a7d6542SBram Moolenaar  END
7898a7d6542SBram Moolenaar
7908a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7918a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7928a7d6542SBram Moolenaar
7938a7d6542SBram Moolenaar  source Ximport.vim
7948a7d6542SBram Moolenaar
7958a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7968a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7978a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7986e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7995381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8008a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
80140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
8026e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8036e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8048a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8058a7d6542SBram Moolenaar
806b3ca9824SBram Moolenaar  Undo_export_script_lines()
8078a7d6542SBram Moolenaar  unlet g:imported
8086e587dcbSBram Moolenaar  unlet g:imported_added
8095381c7a1SBram Moolenaar  unlet g:imported_later
8108a7d6542SBram Moolenaar  unlet g:imported_func
8116e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
8128a7d6542SBram Moolenaar  delete('Ximport.vim')
813f2d5c240SBram Moolenaar
8141c991144SBram Moolenaar  # similar, with line breaks
815cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
8161c991144SBram Moolenaar    vim9script
8171c991144SBram Moolenaar    import {
8181c991144SBram Moolenaar        exported,
8191c991144SBram Moolenaar        Exported,
8201c991144SBram Moolenaar        }
8211c991144SBram Moolenaar        from
8221c991144SBram Moolenaar        './Xexport.vim'
8231c991144SBram Moolenaar    g:imported = exported
8241c991144SBram Moolenaar    exported += 5
8251c991144SBram Moolenaar    g:imported_added = exported
8261c991144SBram Moolenaar    g:imported_func = Exported()
8271c991144SBram Moolenaar  END
8281c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8291c991144SBram Moolenaar  source Ximport_lbr.vim
8301c991144SBram Moolenaar
8311c991144SBram Moolenaar  assert_equal(9876, g:imported)
8321c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8331c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8341c991144SBram Moolenaar
8351c991144SBram Moolenaar  # exported script not sourced again
8361c991144SBram Moolenaar  assert_false(exists('g:result'))
8371c991144SBram Moolenaar  unlet g:imported
8381c991144SBram Moolenaar  unlet g:imported_added
8391c991144SBram Moolenaar  unlet g:imported_func
8401c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8411c991144SBram Moolenaar
8421c991144SBram Moolenaar  # import inside :def function
843cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8445381c7a1SBram Moolenaar    vim9script
8455381c7a1SBram Moolenaar    def ImportInDef()
8465381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8475381c7a1SBram Moolenaar      g:imported = exported
8485381c7a1SBram Moolenaar      exported += 7
8495381c7a1SBram Moolenaar      g:imported_added = exported
8505381c7a1SBram Moolenaar    enddef
8515381c7a1SBram Moolenaar    ImportInDef()
8525381c7a1SBram Moolenaar  END
8535381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8545381c7a1SBram Moolenaar  source Ximport2.vim
855f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8565381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8575381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8585381c7a1SBram Moolenaar  unlet g:imported
8595381c7a1SBram Moolenaar  unlet g:imported_added
8605381c7a1SBram Moolenaar  delete('Ximport2.vim')
8615381c7a1SBram Moolenaar
862cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
863f2d5c240SBram Moolenaar    vim9script
864f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
865f2d5c240SBram Moolenaar    def UseExport()
866f2d5c240SBram Moolenaar      g:imported = Export.exported
867f2d5c240SBram Moolenaar    enddef
868f2d5c240SBram Moolenaar    UseExport()
869f2d5c240SBram Moolenaar  END
870f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
871f2d5c240SBram Moolenaar  source Ximport.vim
8725381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
873f2d5c240SBram Moolenaar
874cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
875599c89c8SBram Moolenaar    vim9script
876599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
877599c89c8SBram Moolenaar    def Func()
878cfcd011fSBram Moolenaar      var dummy = 1
879cfcd011fSBram Moolenaar      var imported = Export + dummy
880599c89c8SBram Moolenaar    enddef
881822ba247SBram Moolenaar    defcompile
882599c89c8SBram Moolenaar  END
883599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
88444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
885599c89c8SBram Moolenaar
886cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
887599c89c8SBram Moolenaar    vim9script
888599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
889599c89c8SBram Moolenaar    def Func()
890cfcd011fSBram Moolenaar      var imported = Export . exported
891599c89c8SBram Moolenaar    enddef
892822ba247SBram Moolenaar    defcompile
893599c89c8SBram Moolenaar  END
894599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
89544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
896599c89c8SBram Moolenaar
897cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
898599c89c8SBram Moolenaar    vim9script
899599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
900599c89c8SBram Moolenaar    def Func()
901cfcd011fSBram Moolenaar      var imported = Export.
902599c89c8SBram Moolenaar    enddef
903822ba247SBram Moolenaar    defcompile
904599c89c8SBram Moolenaar  END
905599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
90644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
907599c89c8SBram Moolenaar
908cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
9091c991144SBram Moolenaar    vim9script
9101c991144SBram Moolenaar    import *
9111c991144SBram Moolenaar        as Export
9121c991144SBram Moolenaar        from
9131c991144SBram Moolenaar        './Xexport.vim'
9141c991144SBram Moolenaar    def UseExport()
9151c991144SBram Moolenaar      g:imported = Export.exported
9161c991144SBram Moolenaar    enddef
9171c991144SBram Moolenaar    UseExport()
9181c991144SBram Moolenaar  END
9191c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9201c991144SBram Moolenaar  source Ximport.vim
9211c991144SBram Moolenaar  assert_equal(9883, g:imported)
9221c991144SBram Moolenaar
923cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
924f2d5c240SBram Moolenaar    vim9script
925f2d5c240SBram Moolenaar    import * from './Xexport.vim'
926f2d5c240SBram Moolenaar  END
927f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
92844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
929f2d5c240SBram Moolenaar
930f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
931cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
932fa29c8abSBram Moolenaar    vim9script
933fa29c8abSBram Moolenaar    import name from './Xexport.vim'
934fa29c8abSBram Moolenaar  END
935fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
93644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
937fa29c8abSBram Moolenaar
938f5be8cdbSBram Moolenaar  # try to import something that is already defined
939cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9405269bd2aSBram Moolenaar    vim9script
941cfcd011fSBram Moolenaar    var exported = 'something'
9425269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9435269bd2aSBram Moolenaar  END
9445269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
94544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9465269bd2aSBram Moolenaar
947f5be8cdbSBram Moolenaar  # try to import something that is already defined
9485269bd2aSBram Moolenaar  import_already_defined =<< trim END
9495269bd2aSBram Moolenaar    vim9script
950cfcd011fSBram Moolenaar    var exported = 'something'
9515269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9525269bd2aSBram Moolenaar  END
9535269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
95444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9555269bd2aSBram Moolenaar
956f5be8cdbSBram Moolenaar  # try to import something that is already defined
9575269bd2aSBram Moolenaar  import_already_defined =<< trim END
9585269bd2aSBram Moolenaar    vim9script
959cfcd011fSBram Moolenaar    var exported = 'something'
9605269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9615269bd2aSBram Moolenaar  END
9625269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
96344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9645269bd2aSBram Moolenaar
965918a4249SBram Moolenaar  # try changing an imported const
966918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
967918a4249SBram Moolenaar    vim9script
968918a4249SBram Moolenaar    import CONST from './Xexport.vim'
969918a4249SBram Moolenaar    def Assign()
970918a4249SBram Moolenaar      CONST = 987
971918a4249SBram Moolenaar    enddef
972918a4249SBram Moolenaar    defcompile
973918a4249SBram Moolenaar  END
974918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
975918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
976918a4249SBram Moolenaar
977f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
978cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
979fa29c8abSBram Moolenaar    vim9script
980fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
981fa29c8abSBram Moolenaar  END
982fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
98344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
984fa29c8abSBram Moolenaar
985cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
986fa29c8abSBram Moolenaar    vim9script
987fa29c8abSBram Moolenaar    import name './Xexport.vim'
988fa29c8abSBram Moolenaar  END
989fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
99044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
991fa29c8abSBram Moolenaar
992cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
993fa29c8abSBram Moolenaar    vim9script
994fa29c8abSBram Moolenaar    import name from Xexport.vim
995fa29c8abSBram Moolenaar  END
996fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
99744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
998fa29c8abSBram Moolenaar
999cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1000fa29c8abSBram Moolenaar    vim9script
1001fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1002fa29c8abSBram Moolenaar  END
1003fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
100444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1005fa29c8abSBram Moolenaar
1006cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1007fa29c8abSBram Moolenaar    vim9script
1008fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1009fa29c8abSBram Moolenaar  END
10105269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
101144d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1012fa29c8abSBram Moolenaar
1013f2d5c240SBram Moolenaar  delete('Ximport.vim')
10145269bd2aSBram Moolenaar  delete('Ximport3.vim')
10158a7d6542SBram Moolenaar  delete('Xexport.vim')
10168a7d6542SBram Moolenaar
1017f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1018750802b5SBram Moolenaar  set cpo&vi
1019cfcd011fSBram Moolenaar  var cpo_before = &cpo
1020cfcd011fSBram Moolenaar  var lines =<< trim END
1021750802b5SBram Moolenaar    vim9script
1022750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1023750802b5SBram Moolenaar  END
1024750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1025750802b5SBram Moolenaar  source Xvim9_script
1026750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1027750802b5SBram Moolenaar  set cpo&vim
1028750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1029750802b5SBram Moolenaar  delete('Xvim9_script')
1030750802b5SBram Moolenaarenddef
1031750802b5SBram Moolenaar
1032803af686SBram Moolenaarfunc g:Trigger()
1033803af686SBram Moolenaar  source Ximport.vim
1034803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1035803af686SBram Moolenaarendfunc
1036803af686SBram Moolenaar
1037803af686SBram Moolenaardef Test_import_export_expr_map()
1038803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1039cfcd011fSBram Moolenaar  var export_lines =<< trim END
1040803af686SBram Moolenaar    vim9script
1041803af686SBram Moolenaar    export def That(): string
1042803af686SBram Moolenaar      return 'yes'
1043803af686SBram Moolenaar    enddef
1044803af686SBram Moolenaar  END
1045803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1046803af686SBram Moolenaar
1047cfcd011fSBram Moolenaar  var import_lines =<< trim END
1048803af686SBram Moolenaar    vim9script
1049803af686SBram Moolenaar    import That from './Xexport_that.vim'
1050803af686SBram Moolenaar    assert_equal('yes', That())
1051803af686SBram Moolenaar  END
1052803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1053803af686SBram Moolenaar
1054803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1055803af686SBram Moolenaar  feedkeys('trigger', "xt")
1056803af686SBram Moolenaar
1057730b2483SBram Moolenaar  delete('Xexport_that.vim')
1058803af686SBram Moolenaar  delete('Ximport.vim')
1059803af686SBram Moolenaar  nunmap trigger
1060803af686SBram Moolenaarenddef
1061803af686SBram Moolenaar
10628e1986e3SBram Moolenaardef Test_import_in_filetype()
10638e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10648e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1065cfcd011fSBram Moolenaar  var export_lines =<< trim END
10668e1986e3SBram Moolenaar    vim9script
1067cfcd011fSBram Moolenaar    export var That = 'yes'
10688e1986e3SBram Moolenaar  END
1069730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10708e1986e3SBram Moolenaar
1071cfcd011fSBram Moolenaar  var import_lines =<< trim END
10728e1986e3SBram Moolenaar    vim9script
1073730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10748e1986e3SBram Moolenaar    assert_equal('yes', That)
10758e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10768e1986e3SBram Moolenaar  END
10778e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10788e1986e3SBram Moolenaar
1079cfcd011fSBram Moolenaar  var save_rtp = &rtp
10808e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10818e1986e3SBram Moolenaar
10828e1986e3SBram Moolenaar  filetype plugin on
10838e1986e3SBram Moolenaar  copen
10848e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10858e1986e3SBram Moolenaar
10868e1986e3SBram Moolenaar  quit!
1087730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10888e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10898e1986e3SBram Moolenaar  &rtp = save_rtp
10908e1986e3SBram Moolenaarenddef
10918e1986e3SBram Moolenaar
1092efa94447SBram Moolenaardef Test_use_import_in_mapping()
1093cfcd011fSBram Moolenaar  var lines =<< trim END
1094efa94447SBram Moolenaar      vim9script
1095efa94447SBram Moolenaar      export def Funcx()
1096efa94447SBram Moolenaar        g:result = 42
1097efa94447SBram Moolenaar      enddef
1098efa94447SBram Moolenaar  END
1099efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1100efa94447SBram Moolenaar  lines =<< trim END
1101efa94447SBram Moolenaar      vim9script
1102efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1103b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1104efa94447SBram Moolenaar  END
1105efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1106efa94447SBram Moolenaar
1107efa94447SBram Moolenaar  source Xmapscript.vim
1108b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1109efa94447SBram Moolenaar  assert_equal(42, g:result)
1110efa94447SBram Moolenaar
1111efa94447SBram Moolenaar  unlet g:result
1112efa94447SBram Moolenaar  delete('XsomeExport.vim')
1113efa94447SBram Moolenaar  delete('Xmapscript.vim')
1114b3ca9824SBram Moolenaar  nunmap <F3>
1115efa94447SBram Moolenaarenddef
1116efa94447SBram Moolenaar
1117750802b5SBram Moolenaardef Test_vim9script_fails()
11188a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11198a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1120cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
11219721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1122cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1123750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1124750802b5SBram Moolenaar
1125cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1126c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1127c785b9a7SBram Moolenaar
1128e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1129e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
11308a7d6542SBram Moolenaarenddef
11318a7d6542SBram Moolenaar
1132f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1133101f4810SBram Moolenaar  CheckRunVimInTerminal
1134101f4810SBram Moolenaar
11359bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1136c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11379bb3eb3eSBram Moolenaarendfunc
11389bb3eb3eSBram Moolenaar
1139c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1140cfcd011fSBram Moolenaar  var export =<< trim END
1141101f4810SBram Moolenaar    vim9script
1142101f4810SBram Moolenaar    export def Foo(): number
1143101f4810SBram Moolenaar        return 0
1144101f4810SBram Moolenaar    enddef
1145101f4810SBram Moolenaar  END
1146730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1147101f4810SBram Moolenaar
1148e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
11499bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11509bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1151101f4810SBram Moolenaar
1152730b2483SBram Moolenaar  delete('XexportCmd.vim')
11539bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11549bb3eb3eSBram Moolenaarenddef
1155101f4810SBram Moolenaar
11564c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1157cfcd011fSBram Moolenaar  var lines =<< trim END
11588a7d6542SBram Moolenaar    vim9script
11598a7d6542SBram Moolenaar    const var = ''
1160cfcd011fSBram Moolenaar    var valone = 1234
11618a7d6542SBram Moolenaar    def MyFunc(arg: string)
11628a7d6542SBram Moolenaar       valone = 5678
11638a7d6542SBram Moolenaar    enddef
11648a7d6542SBram Moolenaar  END
1165cfcd011fSBram Moolenaar  var morelines =<< trim END
1166cfcd011fSBram Moolenaar    var valtwo = 222
11678a7d6542SBram Moolenaar    export def GetValtwo(): number
11688a7d6542SBram Moolenaar      return valtwo
11698a7d6542SBram Moolenaar    enddef
11708a7d6542SBram Moolenaar  END
117103afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11728a7d6542SBram Moolenaar  source Xreload.vim
11738a7d6542SBram Moolenaar  source Xreload.vim
11748a7d6542SBram Moolenaar  source Xreload.vim
11758a7d6542SBram Moolenaar
1176cfcd011fSBram Moolenaar  var testlines =<< trim END
11778a7d6542SBram Moolenaar    vim9script
11788a7d6542SBram Moolenaar    def TheFunc()
11798a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11808a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11818a7d6542SBram Moolenaar    enddef
11828a7d6542SBram Moolenaar    TheFunc()
11838a7d6542SBram Moolenaar  END
11848a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11858a7d6542SBram Moolenaar  source Ximport.vim
11868a7d6542SBram Moolenaar
1187f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1188f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11898a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11908a7d6542SBram Moolenaar  source Ximport.vim
11918a7d6542SBram Moolenaar
1192f5be8cdbSBram Moolenaar  # cannot declare a var twice
11938a7d6542SBram Moolenaar  lines =<< trim END
11948a7d6542SBram Moolenaar    vim9script
1195cfcd011fSBram Moolenaar    var valone = 1234
1196cfcd011fSBram Moolenaar    var valone = 5678
11978a7d6542SBram Moolenaar  END
11988a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
119944d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
12008a7d6542SBram Moolenaar
12018a7d6542SBram Moolenaar  delete('Xreload.vim')
12028a7d6542SBram Moolenaar  delete('Ximport.vim')
12038a7d6542SBram Moolenaarenddef
12048a7d6542SBram Moolenaar
120595006e3dSBram Moolenaardef s:RetSome(): string
120695006e3dSBram Moolenaar  return 'some'
120795006e3dSBram Moolenaarenddef
120895006e3dSBram Moolenaar
1209fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1210fe465a01SBram Moolenaar" script-local name.
1211fe465a01SBram Moolenaardef Test_vim9script_funcref()
1212cfcd011fSBram Moolenaar  var sortlines =<< trim END
1213fe465a01SBram Moolenaar      vim9script
1214fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1215bed36b93SBram Moolenaar        return i2 - i1
1216fe465a01SBram Moolenaar      enddef
1217fe465a01SBram Moolenaar
1218fe465a01SBram Moolenaar      export def FastSort(): list<number>
1219fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1220fe465a01SBram Moolenaar      enddef
1221fe465a01SBram Moolenaar  END
1222fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1223fe465a01SBram Moolenaar
1224cfcd011fSBram Moolenaar  var lines =<< trim END
1225fe465a01SBram Moolenaar    vim9script
1226fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1227fe465a01SBram Moolenaar    def Test()
1228fe465a01SBram Moolenaar      g:result = FastSort()
1229fe465a01SBram Moolenaar    enddef
1230fe465a01SBram Moolenaar    Test()
1231fe465a01SBram Moolenaar  END
1232fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1233fe465a01SBram Moolenaar
1234fe465a01SBram Moolenaar  source Xscript.vim
1235fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1236fe465a01SBram Moolenaar
1237fe465a01SBram Moolenaar  unlet g:result
1238fe465a01SBram Moolenaar  delete('Xsort.vim')
1239fe465a01SBram Moolenaar  delete('Xscript.vim')
124095006e3dSBram Moolenaar
1241cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
124295006e3dSBram Moolenaar  assert_equal('some', Funcref())
1243fe465a01SBram Moolenaarenddef
1244fe465a01SBram Moolenaar
1245601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1246601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1247601e76acSBram Moolenaar" function reference.
1248c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1249cfcd011fSBram Moolenaar  var filterLines =<< trim END
1250c620c055SBram Moolenaar    vim9script
1251c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1252c620c055SBram Moolenaar      return idx % 2 == 1
1253c620c055SBram Moolenaar    enddef
1254c620c055SBram Moolenaar    export def FastFilter(): list<number>
1255c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1256c620c055SBram Moolenaar    enddef
1257601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1258601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1259601e76acSBram Moolenaar    enddef
1260c620c055SBram Moolenaar  END
1261c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1262c620c055SBram Moolenaar
1263cfcd011fSBram Moolenaar  var lines =<< trim END
1264c620c055SBram Moolenaar    vim9script
1265601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1266c620c055SBram Moolenaar    def Test()
1267cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1268c620c055SBram Moolenaar    enddef
1269c620c055SBram Moolenaar    Test()
1270601e76acSBram Moolenaar    def TestDirect()
1271cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1272601e76acSBram Moolenaar    enddef
1273601e76acSBram Moolenaar    TestDirect()
1274c620c055SBram Moolenaar  END
1275601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1276c620c055SBram Moolenaar  delete('Xfilter.vim')
1277c620c055SBram Moolenaarenddef
1278c620c055SBram Moolenaar
12794c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1280cfcd011fSBram Moolenaar  var first_lines =<< trim END
12814c17ad94SBram Moolenaar    vim9script
12824c17ad94SBram Moolenaar    def FuncYes(): string
12834c17ad94SBram Moolenaar      return 'yes'
12844c17ad94SBram Moolenaar    enddef
12854c17ad94SBram Moolenaar  END
1286cfcd011fSBram Moolenaar  var withno_lines =<< trim END
12874c17ad94SBram Moolenaar    def FuncNo(): string
12884c17ad94SBram Moolenaar      return 'no'
12894c17ad94SBram Moolenaar    enddef
12904c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12914c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12924c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
129303afdcf1SBram Moolenaar    enddef
129403afdcf1SBram Moolenaar  END
1295cfcd011fSBram Moolenaar  var nono_lines =<< trim END
129603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
129703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
129844d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12994c17ad94SBram Moolenaar    enddef
13004c17ad94SBram Moolenaar  END
13014c17ad94SBram Moolenaar
13024c17ad94SBram Moolenaar  # FuncNo() is defined
130303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13044c17ad94SBram Moolenaar  source Xreloaded.vim
13054c17ad94SBram Moolenaar  g:DoCheck(true)
13064c17ad94SBram Moolenaar
13074c17ad94SBram Moolenaar  # FuncNo() is not redefined
130803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13094c17ad94SBram Moolenaar  source Xreloaded.vim
131003afdcf1SBram Moolenaar  g:DoCheck()
13114c17ad94SBram Moolenaar
13124c17ad94SBram Moolenaar  # FuncNo() is back
131303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13144c17ad94SBram Moolenaar  source Xreloaded.vim
131503afdcf1SBram Moolenaar  g:DoCheck()
13164c17ad94SBram Moolenaar
13174c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13184c17ad94SBram Moolenaarenddef
13194c17ad94SBram Moolenaar
132089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
132189483d40SBram Moolenaar  # write the script with a script-local variable
1322cfcd011fSBram Moolenaar  var lines =<< trim END
132389483d40SBram Moolenaar    vim9script
1324cfcd011fSBram Moolenaar    var name = 'string'
132589483d40SBram Moolenaar  END
132689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
132789483d40SBram Moolenaar  source XreloadVar.vim
132889483d40SBram Moolenaar
132989483d40SBram Moolenaar  # now write the script using the same variable locally - works
133089483d40SBram Moolenaar  lines =<< trim END
133189483d40SBram Moolenaar    vim9script
133289483d40SBram Moolenaar    def Func()
1333cfcd011fSBram Moolenaar      var name = 'string'
133489483d40SBram Moolenaar    enddef
133589483d40SBram Moolenaar  END
133689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
133789483d40SBram Moolenaar  source XreloadVar.vim
133889483d40SBram Moolenaar
133989483d40SBram Moolenaar  delete('XreloadVar.vim')
134089483d40SBram Moolenaarenddef
134189483d40SBram Moolenaar
13428a7d6542SBram Moolenaardef Test_import_absolute()
1343cfcd011fSBram Moolenaar  var import_lines = [
1344e6085c53SBram Moolenaar        'vim9script',
1345e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1346e6085c53SBram Moolenaar        'def UseExported()',
1347e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1348e6085c53SBram Moolenaar        '  exported = 8888',
1349e6085c53SBram Moolenaar        '  g:imported_after = exported',
1350e6085c53SBram Moolenaar        'enddef',
1351e6085c53SBram Moolenaar        'UseExported()',
1352e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1353e6085c53SBram Moolenaar        ]
13548a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13558a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13568a7d6542SBram Moolenaar
13578a7d6542SBram Moolenaar  source Ximport_abs.vim
13588a7d6542SBram Moolenaar
13598a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13604e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1361fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1362fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1363fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1364fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1365fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1366fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1367fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1368fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1369fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1370fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1371e6085c53SBram Moolenaar        g:import_disassembled)
1372b3ca9824SBram Moolenaar
1373b3ca9824SBram Moolenaar  Undo_export_script_lines()
13748a7d6542SBram Moolenaar  unlet g:imported_abs
13754e12a5dfSBram Moolenaar  unlet g:import_disassembled
13768a7d6542SBram Moolenaar
13778a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13788a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13798a7d6542SBram Moolenaarenddef
13808a7d6542SBram Moolenaar
13818a7d6542SBram Moolenaardef Test_import_rtp()
1382cfcd011fSBram Moolenaar  var import_lines = [
1383e6085c53SBram Moolenaar        'vim9script',
1384e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1385e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1386e6085c53SBram Moolenaar        ]
13878a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13888a7d6542SBram Moolenaar  mkdir('import')
13898a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13908a7d6542SBram Moolenaar
1391cfcd011fSBram Moolenaar  var save_rtp = &rtp
13928a7d6542SBram Moolenaar  &rtp = getcwd()
13938a7d6542SBram Moolenaar  source Ximport_rtp.vim
13948a7d6542SBram Moolenaar  &rtp = save_rtp
13958a7d6542SBram Moolenaar
13968a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13978a7d6542SBram Moolenaar
1398b3ca9824SBram Moolenaar  Undo_export_script_lines()
1399b3ca9824SBram Moolenaar  unlet g:imported_rtp
14008a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
140189483d40SBram Moolenaar  delete('import', 'rf')
14028a7d6542SBram Moolenaarenddef
14038a7d6542SBram Moolenaar
140425e0f586SBram Moolenaardef Test_import_compile_error()
1405cfcd011fSBram Moolenaar  var export_lines = [
140625e0f586SBram Moolenaar        'vim9script',
140725e0f586SBram Moolenaar        'export def ExpFunc(): string',
140825e0f586SBram Moolenaar        '  return notDefined',
140925e0f586SBram Moolenaar        'enddef',
141025e0f586SBram Moolenaar        ]
141125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
141225e0f586SBram Moolenaar
1413cfcd011fSBram Moolenaar  var import_lines = [
141425e0f586SBram Moolenaar        'vim9script',
141525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
141625e0f586SBram Moolenaar        'def ImpFunc()',
141725e0f586SBram Moolenaar        '  echo ExpFunc()',
141825e0f586SBram Moolenaar        'enddef',
141925e0f586SBram Moolenaar        'defcompile',
142025e0f586SBram Moolenaar        ]
142125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
142225e0f586SBram Moolenaar
142325e0f586SBram Moolenaar  try
142425e0f586SBram Moolenaar    source Ximport.vim
142525e0f586SBram Moolenaar  catch /E1001/
1426f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
14277707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
142825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
142925e0f586SBram Moolenaar  endtry
143025e0f586SBram Moolenaar
143125e0f586SBram Moolenaar  delete('Xexported.vim')
143225e0f586SBram Moolenaar  delete('Ximport.vim')
143325e0f586SBram Moolenaarenddef
143425e0f586SBram Moolenaar
1435c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1436cfcd011fSBram Moolenaar  var lines = [
1437c4ce36d4SBram Moolenaar        'vim9script',
1438c4ce36d4SBram Moolenaar        'def Func()',
1439c4ce36d4SBram Moolenaar        '  eval [][0]',
1440c4ce36d4SBram Moolenaar        'enddef',
1441c4ce36d4SBram Moolenaar        'Func()',
1442c4ce36d4SBram Moolenaar        ]
1443c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1444c4ce36d4SBram Moolenaar
1445c4ce36d4SBram Moolenaar  for count in range(3)
1446c4ce36d4SBram Moolenaar    try
1447c4ce36d4SBram Moolenaar      source Xtestscript.vim
1448c4ce36d4SBram Moolenaar    catch /E684/
1449c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1450c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1451c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1452c4ce36d4SBram Moolenaar    endtry
1453c4ce36d4SBram Moolenaar  endfor
1454c4ce36d4SBram Moolenaar
1455c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1456c4ce36d4SBram Moolenaarenddef
1457c4ce36d4SBram Moolenaar
1458eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1459cfcd011fSBram Moolenaar  var export_lines =<< trim END
1460eef2102eSBram Moolenaar      vim9script
1461eef2102eSBram Moolenaar      export def Func()
1462eef2102eSBram Moolenaar        echo 'imported'
1463eef2102eSBram Moolenaar      enddef
1464eef2102eSBram Moolenaar  END
1465eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1466eef2102eSBram Moolenaar
1467cfcd011fSBram Moolenaar  var lines =<< trim END
1468eef2102eSBram Moolenaar    vim9script
1469eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1470eef2102eSBram Moolenaar    def Func()
1471eef2102eSBram Moolenaar      echo 'local to function'
1472eef2102eSBram Moolenaar    enddef
1473eef2102eSBram Moolenaar  END
1474eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1475eef2102eSBram Moolenaar
1476eef2102eSBram Moolenaar  lines =<< trim END
1477eef2102eSBram Moolenaar    vim9script
1478eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1479eef2102eSBram Moolenaar    def Outer()
1480eef2102eSBram Moolenaar      def Func()
1481eef2102eSBram Moolenaar        echo 'local to function'
1482eef2102eSBram Moolenaar      enddef
1483eef2102eSBram Moolenaar    enddef
1484eef2102eSBram Moolenaar    defcompile
1485eef2102eSBram Moolenaar  END
1486eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1487eef2102eSBram Moolenaar
1488eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1489eef2102eSBram Moolenaarenddef
1490eef2102eSBram Moolenaar
1491b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1492cfcd011fSBram Moolenaar  var lines =<< trim END
1493b9a2cac3SBram Moolenaar    vim9script
1494b9a2cac3SBram Moolenaar    def Func()
1495b9a2cac3SBram Moolenaar      echo 'one'
1496b9a2cac3SBram Moolenaar    enddef
1497b9a2cac3SBram Moolenaar    def Func()
1498b9a2cac3SBram Moolenaar      echo 'two'
1499b9a2cac3SBram Moolenaar    enddef
1500b9a2cac3SBram Moolenaar  END
1501b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1502fa211f3cSBram Moolenaar
1503fa211f3cSBram Moolenaar  lines =<< trim END
1504fa211f3cSBram Moolenaar    vim9script
1505fa211f3cSBram Moolenaar    def Foo(): string
1506fa211f3cSBram Moolenaar      return 'foo'
1507fa211f3cSBram Moolenaar      enddef
1508fa211f3cSBram Moolenaar    def Func()
1509cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1510fa211f3cSBram Moolenaar    enddef
1511fa211f3cSBram Moolenaar    defcompile
1512fa211f3cSBram Moolenaar  END
1513fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1514b9a2cac3SBram Moolenaarenddef
1515b9a2cac3SBram Moolenaar
15168a7d6542SBram Moolenaardef Test_fixed_size_list()
1517f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1518cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
15198a7d6542SBram Moolenaar  l->remove(0)
15208a7d6542SBram Moolenaar  l->add(5)
15218a7d6542SBram Moolenaar  l->insert(99, 1)
15220f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
15238a7d6542SBram Moolenaarenddef
15248a7d6542SBram Moolenaar
1525ae616494SBram Moolenaardef Test_no_insert_xit()
1526d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1527d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1528d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1529d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1530d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1531ae616494SBram Moolenaar
1532ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1533ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1534ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1535ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1536f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1537f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1538f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1539f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1540f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1541ae616494SBram Moolenaarenddef
1542ae616494SBram Moolenaar
1543158906cfSBram Moolenaardef IfElse(what: number): string
1544cfcd011fSBram Moolenaar  var res = ''
1545158906cfSBram Moolenaar  if what == 1
1546158906cfSBram Moolenaar    res = "one"
1547158906cfSBram Moolenaar  elseif what == 2
1548158906cfSBram Moolenaar    res = "two"
1549a259d8d3SBram Moolenaar  else
1550158906cfSBram Moolenaar    res = "three"
1551a259d8d3SBram Moolenaar  endif
1552158906cfSBram Moolenaar  return res
1553a259d8d3SBram Moolenaarenddef
1554a259d8d3SBram Moolenaar
1555158906cfSBram Moolenaardef Test_if_elseif_else()
1556158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1557158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1558158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15590f18b6d1SBram Moolenaarenddef
15600f18b6d1SBram Moolenaar
1561e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1562d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1563d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1564d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1565d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1566d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1567e8c4abbbSBram Moolenaarenddef
1568e8c4abbbSBram Moolenaar
15696d69bf60SBram Moolenaarlet g:bool_true = v:true
15706d69bf60SBram Moolenaarlet g:bool_false = v:false
15716d69bf60SBram Moolenaar
15726d69bf60SBram Moolenaardef Test_if_const_expr()
1573cfcd011fSBram Moolenaar  var res = false
15746d69bf60SBram Moolenaar  if true ? true : false
15756d69bf60SBram Moolenaar    res = true
15766d69bf60SBram Moolenaar  endif
15776d69bf60SBram Moolenaar  assert_equal(true, res)
15786d69bf60SBram Moolenaar
1579585fea7bSBram Moolenaar  g:glob = 2
1580585fea7bSBram Moolenaar  if false
15816797966dSBram Moolenaar    execute('g:glob = 3')
1582585fea7bSBram Moolenaar  endif
1583585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1584585fea7bSBram Moolenaar  if true
15856797966dSBram Moolenaar    execute('g:glob = 3')
1586585fea7bSBram Moolenaar  endif
1587585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1588585fea7bSBram Moolenaar
15896d69bf60SBram Moolenaar  res = false
15906d69bf60SBram Moolenaar  if g:bool_true ? true : false
15916d69bf60SBram Moolenaar    res = true
15926d69bf60SBram Moolenaar  endif
15936d69bf60SBram Moolenaar  assert_equal(true, res)
15946d69bf60SBram Moolenaar
15956d69bf60SBram Moolenaar  res = false
15966d69bf60SBram Moolenaar  if true ? g:bool_true : false
15976d69bf60SBram Moolenaar    res = true
15986d69bf60SBram Moolenaar  endif
15996d69bf60SBram Moolenaar  assert_equal(true, res)
16006d69bf60SBram Moolenaar
16016d69bf60SBram Moolenaar  res = false
16026d69bf60SBram Moolenaar  if true ? true : g:bool_false
16036d69bf60SBram Moolenaar    res = true
16046d69bf60SBram Moolenaar  endif
16056d69bf60SBram Moolenaar  assert_equal(true, res)
16066d69bf60SBram Moolenaar
16076d69bf60SBram Moolenaar  res = false
16086d69bf60SBram Moolenaar  if true ? false : true
16096d69bf60SBram Moolenaar    res = true
16106d69bf60SBram Moolenaar  endif
16116d69bf60SBram Moolenaar  assert_equal(false, res)
16126d69bf60SBram Moolenaar
16136d69bf60SBram Moolenaar  res = false
16146d69bf60SBram Moolenaar  if false ? false : true
16156d69bf60SBram Moolenaar    res = true
16166d69bf60SBram Moolenaar  endif
16176d69bf60SBram Moolenaar  assert_equal(true, res)
16186d69bf60SBram Moolenaar
16196d69bf60SBram Moolenaar  res = false
16206d69bf60SBram Moolenaar  if false ? true : false
16216d69bf60SBram Moolenaar    res = true
16226d69bf60SBram Moolenaar  endif
16236d69bf60SBram Moolenaar  assert_equal(false, res)
16246d69bf60SBram Moolenaar
16256d69bf60SBram Moolenaar  res = false
1626e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1627e8c4abbbSBram Moolenaar    res = true
1628e8c4abbbSBram Moolenaar  endif
1629e8c4abbbSBram Moolenaar  assert_equal(false, res)
1630e8c4abbbSBram Moolenaar
1631e8c4abbbSBram Moolenaar  res = false
16326d69bf60SBram Moolenaar  if true && true
16336d69bf60SBram Moolenaar    res = true
16346d69bf60SBram Moolenaar  endif
16356d69bf60SBram Moolenaar  assert_equal(true, res)
16366d69bf60SBram Moolenaar
16376d69bf60SBram Moolenaar  res = false
16386d69bf60SBram Moolenaar  if true && false
16396d69bf60SBram Moolenaar    res = true
16406d69bf60SBram Moolenaar  endif
16416d69bf60SBram Moolenaar  assert_equal(false, res)
16426d69bf60SBram Moolenaar
16436d69bf60SBram Moolenaar  res = false
16446d69bf60SBram Moolenaar  if g:bool_true && false
16456d69bf60SBram Moolenaar    res = true
16466d69bf60SBram Moolenaar  endif
16476d69bf60SBram Moolenaar  assert_equal(false, res)
16486d69bf60SBram Moolenaar
16496d69bf60SBram Moolenaar  res = false
16506d69bf60SBram Moolenaar  if true && g:bool_false
16516d69bf60SBram Moolenaar    res = true
16526d69bf60SBram Moolenaar  endif
16536d69bf60SBram Moolenaar  assert_equal(false, res)
16546d69bf60SBram Moolenaar
16556d69bf60SBram Moolenaar  res = false
16566d69bf60SBram Moolenaar  if false && false
16576d69bf60SBram Moolenaar    res = true
16586d69bf60SBram Moolenaar  endif
16596d69bf60SBram Moolenaar  assert_equal(false, res)
16606d69bf60SBram Moolenaar
16616d69bf60SBram Moolenaar  res = false
16626d69bf60SBram Moolenaar  if true || false
16636d69bf60SBram Moolenaar    res = true
16646d69bf60SBram Moolenaar  endif
16656d69bf60SBram Moolenaar  assert_equal(true, res)
16666d69bf60SBram Moolenaar
16676d69bf60SBram Moolenaar  res = false
16686d69bf60SBram Moolenaar  if g:bool_true || false
16696d69bf60SBram Moolenaar    res = true
16706d69bf60SBram Moolenaar  endif
16716d69bf60SBram Moolenaar  assert_equal(true, res)
16726d69bf60SBram Moolenaar
16736d69bf60SBram Moolenaar  res = false
16746d69bf60SBram Moolenaar  if true || g:bool_false
16756d69bf60SBram Moolenaar    res = true
16766d69bf60SBram Moolenaar  endif
16776d69bf60SBram Moolenaar  assert_equal(true, res)
16786d69bf60SBram Moolenaar
16796d69bf60SBram Moolenaar  res = false
16806d69bf60SBram Moolenaar  if false || false
16816d69bf60SBram Moolenaar    res = true
16826d69bf60SBram Moolenaar  endif
16836d69bf60SBram Moolenaar  assert_equal(false, res)
16843988f64fSBram Moolenaar
16853988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16863988f64fSBram Moolenaar  if false | eval 0 | endif
16873988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16883988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16893988f64fSBram Moolenaar  if false
16903988f64fSBram Moolenaar    burp
16913988f64fSBram Moolenaar  endif
169280c34ca3SBram Moolenaarenddef
16936d69bf60SBram Moolenaar
169480c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1695d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1696d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1697d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1698d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16996d69bf60SBram Moolenaarenddef
17006d69bf60SBram Moolenaar
170172abcf42SBram Moolenaardef RunNested(i: number): number
1702cfcd011fSBram Moolenaar  var x: number = 0
170372abcf42SBram Moolenaar  if i % 2
170472abcf42SBram Moolenaar    if 1
1705f5be8cdbSBram Moolenaar      # comment
170672abcf42SBram Moolenaar    else
1707f5be8cdbSBram Moolenaar      # comment
170872abcf42SBram Moolenaar    endif
170972abcf42SBram Moolenaar    x += 1
171072abcf42SBram Moolenaar  else
171172abcf42SBram Moolenaar    x += 1000
171272abcf42SBram Moolenaar  endif
171372abcf42SBram Moolenaar  return x
171472abcf42SBram Moolenaarenddef
171572abcf42SBram Moolenaar
171672abcf42SBram Moolenaardef Test_nested_if()
171772abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
171872abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
171972abcf42SBram Moolenaarenddef
172072abcf42SBram Moolenaar
1721ad39c094SBram Moolenaardef Test_execute_cmd()
1722e4984290SBram Moolenaar  # missing argument is ignored
1723e4984290SBram Moolenaar  execute
1724e4984290SBram Moolenaar  execute # comment
1725e4984290SBram Moolenaar
1726ad39c094SBram Moolenaar  new
1727ad39c094SBram Moolenaar  setline(1, 'default')
1728d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1729ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1730a72cfb80SBram Moolenaar
1731d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1732a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1733a72cfb80SBram Moolenaar
1734cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1735cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1736a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1737ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1738a72cfb80SBram Moolenaar
1739d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1740ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1741a72cfb80SBram Moolenaar
1742cfcd011fSBram Moolenaar  var cmd_first = 'call '
1743cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1744ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1745ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1746ad39c094SBram Moolenaar  bwipe!
1747585fea7bSBram Moolenaar
1748cfcd011fSBram Moolenaar  var n = true
17492d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
17502d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
17512d6b20d6SBram Moolenaar
1752e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1753e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1754e5abf7afSBram Moolenaar
1755d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1756d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1757d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1758ad39c094SBram Moolenaarenddef
1759ad39c094SBram Moolenaar
176047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1761f5be8cdbSBram Moolenaar  # only checks line continuation
1762cfcd011fSBram Moolenaar  var lines =<< trim END
176347e880d6SBram Moolenaar      vim9script
176447e880d6SBram Moolenaar      execute 'g:someVar'
176547e880d6SBram Moolenaar                .. ' = ' ..
176647e880d6SBram Moolenaar                   '28'
176747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
176847e880d6SBram Moolenaar      unlet g:someVar
176947e880d6SBram Moolenaar  END
177047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
177147e880d6SBram Moolenaarenddef
177247e880d6SBram Moolenaar
1773ad39c094SBram Moolenaardef Test_echo_cmd()
1774a72cfb80SBram Moolenaar  echo 'some' # comment
1775585fea7bSBram Moolenaar  echon 'thing'
1776ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1777ad39c094SBram Moolenaar
1778a72cfb80SBram Moolenaar  echo "some" # comment
1779a72cfb80SBram Moolenaar  echon "thing"
1780a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1781a72cfb80SBram Moolenaar
1782cfcd011fSBram Moolenaar  var str1 = 'some'
1783cfcd011fSBram Moolenaar  var str2 = 'more'
1784ad39c094SBram Moolenaar  echo str1 str2
1785ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1786a72cfb80SBram Moolenaar
1787d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1788ad39c094SBram Moolenaarenddef
1789ad39c094SBram Moolenaar
1790f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1791f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1792f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1793f93c7feaSBram Moolenaar  echo 'clear'
1794df069eecSBram Moolenaar  :1messages
1795f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1796f93c7feaSBram Moolenaar
1797d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1798f93c7feaSBram Moolenaarenddef
1799f93c7feaSBram Moolenaar
180047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1801f5be8cdbSBram Moolenaar  # only checks line continuation
1802cfcd011fSBram Moolenaar  var lines =<< trim END
180347e880d6SBram Moolenaar      vim9script
180447e880d6SBram Moolenaar      echomsg 'here'
180547e880d6SBram Moolenaar                .. ' is ' ..
180647e880d6SBram Moolenaar                   'a message'
180747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
180847e880d6SBram Moolenaar  END
180947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
181047e880d6SBram Moolenaarenddef
181147e880d6SBram Moolenaar
1812f93c7feaSBram Moolenaardef Test_echoerr_cmd()
181340ee466cSBram Moolenaar  try
181440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
181540ee466cSBram Moolenaar  catch
181640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
181740ee466cSBram Moolenaar  endtry
1818f93c7feaSBram Moolenaarenddef
1819f93c7feaSBram Moolenaar
182047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1821f5be8cdbSBram Moolenaar  # only checks line continuation
1822cfcd011fSBram Moolenaar  var lines =<< trim END
182347e880d6SBram Moolenaar      vim9script
182447e880d6SBram Moolenaar      try
182547e880d6SBram Moolenaar        echoerr 'this'
182647e880d6SBram Moolenaar                .. ' is ' ..
182747e880d6SBram Moolenaar                   'wrong'
182847e880d6SBram Moolenaar      catch
182947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
183047e880d6SBram Moolenaar      endtry
183147e880d6SBram Moolenaar  END
183247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
183347e880d6SBram Moolenaarenddef
183447e880d6SBram Moolenaar
183541fe0617SBram Moolenaardef Test_for_outside_of_function()
1836cfcd011fSBram Moolenaar  var lines =<< trim END
183741fe0617SBram Moolenaar    vim9script
183841fe0617SBram Moolenaar    new
183941fe0617SBram Moolenaar    for var in range(0, 3)
184041fe0617SBram Moolenaar      append(line('$'), var)
184141fe0617SBram Moolenaar    endfor
184241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
184341fe0617SBram Moolenaar    bwipe!
184441fe0617SBram Moolenaar  END
184541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
184641fe0617SBram Moolenaar  source Xvim9for.vim
184741fe0617SBram Moolenaar  delete('Xvim9for.vim')
184841fe0617SBram Moolenaarenddef
18498a7d6542SBram Moolenaar
1850e8c4abbbSBram Moolenaardef Test_for_loop()
1851cfcd011fSBram Moolenaar  var result = ''
1852e8c4abbbSBram Moolenaar  for cnt in range(7)
1853e8c4abbbSBram Moolenaar    if cnt == 4
1854e8c4abbbSBram Moolenaar      break
1855e8c4abbbSBram Moolenaar    endif
1856e8c4abbbSBram Moolenaar    if cnt == 2
1857e8c4abbbSBram Moolenaar      continue
1858e8c4abbbSBram Moolenaar    endif
1859e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1860e8c4abbbSBram Moolenaar  endfor
1861e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18620ad3e894SBram Moolenaar
1863cfcd011fSBram Moolenaar  var concat = ''
18640ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18650ad3e894SBram Moolenaar    concat ..= str
18660ad3e894SBram Moolenaar  endfor
18670ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
186838bd8de5SBram Moolenaar
186938bd8de5SBram Moolenaar  var total = 0
187038bd8de5SBram Moolenaar  for nr in
187138bd8de5SBram Moolenaar      [1, 2, 3]
187238bd8de5SBram Moolenaar    total += nr
187338bd8de5SBram Moolenaar  endfor
187438bd8de5SBram Moolenaar  assert_equal(6, total)
187538bd8de5SBram Moolenaar
187638bd8de5SBram Moolenaar  total = 0
187738bd8de5SBram Moolenaar  for nr
187838bd8de5SBram Moolenaar    in [1, 2, 3]
187938bd8de5SBram Moolenaar    total += nr
188038bd8de5SBram Moolenaar  endfor
188138bd8de5SBram Moolenaar  assert_equal(6, total)
188238bd8de5SBram Moolenaar
188338bd8de5SBram Moolenaar  total = 0
188438bd8de5SBram Moolenaar  for nr
188538bd8de5SBram Moolenaar    in
188638bd8de5SBram Moolenaar    [1, 2, 3]
188738bd8de5SBram Moolenaar    total += nr
188838bd8de5SBram Moolenaar  endfor
188938bd8de5SBram Moolenaar  assert_equal(6, total)
1890e8c4abbbSBram Moolenaarenddef
1891e8c4abbbSBram Moolenaar
1892e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1893675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1894675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1895cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1896822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
18972d870f8dSBram Moolenaar  delfunc! g:Func
1898451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1899675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1900675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1901675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1902e8c4abbbSBram Moolenaarenddef
1903e8c4abbbSBram Moolenaar
1904ea87069dSBram Moolenaardef Test_for_loop_script_var()
1905ea87069dSBram Moolenaar  # cannot use s:var in a :def function
1906ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
1907ea87069dSBram Moolenaar
1908ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
1909ea87069dSBram Moolenaar  var lines =<< trim END
1910ea87069dSBram Moolenaar    vim9script
1911ea87069dSBram Moolenaar    var total = 0
1912ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
1913ea87069dSBram Moolenaar      total += s:var
1914ea87069dSBram Moolenaar    endfor
1915ea87069dSBram Moolenaar    assert_equal(6, total)
1916ea87069dSBram Moolenaar
1917ea87069dSBram Moolenaar    total = 0
1918ea87069dSBram Moolenaar    for var in [1, 2, 3]
1919ea87069dSBram Moolenaar      total += var
1920ea87069dSBram Moolenaar    endfor
1921ea87069dSBram Moolenaar    assert_equal(6, total)
1922ea87069dSBram Moolenaar  END
1923ea87069dSBram Moolenaarenddef
1924ea87069dSBram Moolenaar
1925792f786aSBram Moolenaardef Test_for_loop_unpack()
19264b8a0651SBram Moolenaar  var lines =<< trim END
1927792f786aSBram Moolenaar      var result = []
1928792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
1929792f786aSBram Moolenaar        result->add(v1)
1930792f786aSBram Moolenaar        result->add(v2)
1931792f786aSBram Moolenaar      endfor
1932792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
1933792f786aSBram Moolenaar
1934792f786aSBram Moolenaar      result = []
1935792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
1936792f786aSBram Moolenaar        result->add(v1)
1937792f786aSBram Moolenaar        result->add(v2)
1938792f786aSBram Moolenaar        result->add(v3)
1939792f786aSBram Moolenaar      endfor
1940792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
1941792f786aSBram Moolenaar
19424b8a0651SBram Moolenaar      result = []
19434b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
19444b8a0651SBram Moolenaar        result->add(&ts)
19454b8a0651SBram Moolenaar        result->add(&sw)
19464b8a0651SBram Moolenaar      endfor
19474b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
19484b8a0651SBram Moolenaar
19494b8a0651SBram Moolenaar      var slist: list<string>
19504b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
19514b8a0651SBram Moolenaar        slist->add($LOOPVAR)
19524b8a0651SBram Moolenaar        slist->add(@r)
19534b8a0651SBram Moolenaar        slist->add(v:errmsg)
19544b8a0651SBram Moolenaar      endfor
19554b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
19564b8a0651SBram Moolenaar
19574b8a0651SBram Moolenaar      slist = []
19584b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
19594b8a0651SBram Moolenaar        slist->add(g:globalvar)
19604b8a0651SBram Moolenaar        slist->add(b:bufvar)
19614b8a0651SBram Moolenaar        slist->add(w:winvar)
19624b8a0651SBram Moolenaar        slist->add(t:tabvar)
19634b8a0651SBram Moolenaar      endfor
19644b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
1965f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
19664b8a0651SBram Moolenaar  END
19674b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
19684b8a0651SBram Moolenaar
19694b8a0651SBram Moolenaar  lines =<< trim END
1970792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
1971792f786aSBram Moolenaar        echo v1 v2
1972792f786aSBram Moolenaar      endfor
1973792f786aSBram Moolenaar  END
1974792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
1975792f786aSBram Moolenaar
1976792f786aSBram Moolenaar  lines =<< trim END
1977792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
1978792f786aSBram Moolenaar        echo v1 v2
1979792f786aSBram Moolenaar      endfor
1980792f786aSBram Moolenaar  END
1981792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
1982792f786aSBram Moolenaar
1983792f786aSBram Moolenaar  lines =<< trim END
1984792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
1985792f786aSBram Moolenaar        echo v1
1986792f786aSBram Moolenaar      endfor
1987792f786aSBram Moolenaar  END
1988792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
1989792f786aSBram Moolenaarenddef
1990792f786aSBram Moolenaar
1991d0df1aacSBram Moolenaardef Test_while_loop()
1992cfcd011fSBram Moolenaar  var result = ''
1993cfcd011fSBram Moolenaar  var cnt = 0
1994d0df1aacSBram Moolenaar  while cnt < 555
1995d0df1aacSBram Moolenaar    if cnt == 3
1996d0df1aacSBram Moolenaar      break
1997d0df1aacSBram Moolenaar    endif
1998d0df1aacSBram Moolenaar    cnt += 1
1999d0df1aacSBram Moolenaar    if cnt == 2
2000d0df1aacSBram Moolenaar      continue
2001d0df1aacSBram Moolenaar    endif
2002d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2003d0df1aacSBram Moolenaar  endwhile
2004d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2005d0df1aacSBram Moolenaarenddef
2006d0df1aacSBram Moolenaar
2007e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2008675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2009675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2010675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2011675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2012675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2013675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2014675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2015bd5da371SBram Moolenaarenddef
2016bd5da371SBram Moolenaar
20179645e2d9SBram Moolenaardef Test_interrupt_loop()
2018cfcd011fSBram Moolenaar  var caught = false
2019cfcd011fSBram Moolenaar  var x = 0
202097acfc78SBram Moolenaar  try
20219645e2d9SBram Moolenaar    while 1
20229645e2d9SBram Moolenaar      x += 1
20239645e2d9SBram Moolenaar      if x == 100
20249645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
20259645e2d9SBram Moolenaar      endif
20269645e2d9SBram Moolenaar    endwhile
202797acfc78SBram Moolenaar  catch
202897acfc78SBram Moolenaar    caught = true
202997acfc78SBram Moolenaar    assert_equal(100, x)
203097acfc78SBram Moolenaar  endtry
203197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
203225859dd7SBram Moolenaar  # consume the CTRL-C
203325859dd7SBram Moolenaar  getchar(0)
20349645e2d9SBram Moolenaarenddef
203520431c9dSBram Moolenaar
20364fdae999SBram Moolenaardef Test_automatic_line_continuation()
2037cfcd011fSBram Moolenaar  var mylist = [
20384fdae999SBram Moolenaar      'one',
20394fdae999SBram Moolenaar      'two',
20404fdae999SBram Moolenaar      'three',
2041f5be8cdbSBram Moolenaar      ] # comment
20424fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
20434fdae999SBram Moolenaar
2044cfcd011fSBram Moolenaar  var mydict = {
2045e0de171eSBram Moolenaar      ['one']: 1,
2046e0de171eSBram Moolenaar      ['two']: 2,
2047e0de171eSBram Moolenaar      ['three']:
20484fdae999SBram Moolenaar          3,
2049f5be8cdbSBram Moolenaar      } # comment
2050e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2051e0de171eSBram Moolenaar  mydict = {
20522c330432SBram Moolenaar      one: 1,  # comment
20532c330432SBram Moolenaar      two:     # comment
20542c330432SBram Moolenaar           2,  # comment
20552c330432SBram Moolenaar      three: 3 # comment
20562c330432SBram Moolenaar      }
2057e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2058e0de171eSBram Moolenaar  mydict = {
20592c330432SBram Moolenaar      one: 1,
20604fdae999SBram Moolenaar      two:
20614fdae999SBram Moolenaar           2,
20622c330432SBram Moolenaar      three: 3
20634fdae999SBram Moolenaar      }
2064e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2065e6085c53SBram Moolenaar
2066e6085c53SBram Moolenaar  assert_equal(
2067e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2068e6085c53SBram Moolenaar        split('one two three')
2069e6085c53SBram Moolenaar        )
20704fdae999SBram Moolenaarenddef
20714fdae999SBram Moolenaar
20727a092245SBram Moolenaardef Test_vim9_comment()
20737a092245SBram Moolenaar  CheckScriptSuccess([
20747a092245SBram Moolenaar      'vim9script',
20757a092245SBram Moolenaar      '# something',
207693f82cbeSBram Moolenaar      '#something',
207793f82cbeSBram Moolenaar      '#{something',
20787a092245SBram Moolenaar      ])
207993f82cbeSBram Moolenaar
208093f82cbeSBram Moolenaar  split Xfile
208193f82cbeSBram Moolenaar  CheckScriptSuccess([
208293f82cbeSBram Moolenaar      'vim9script',
208393f82cbeSBram Moolenaar      'edit #something',
208493f82cbeSBram Moolenaar      ])
208593f82cbeSBram Moolenaar  CheckScriptSuccess([
208693f82cbeSBram Moolenaar      'vim9script',
208793f82cbeSBram Moolenaar      'edit #{something',
208893f82cbeSBram Moolenaar      ])
208993f82cbeSBram Moolenaar  close
209093f82cbeSBram Moolenaar
20917a092245SBram Moolenaar  CheckScriptFailure([
20927a092245SBram Moolenaar      'vim9script',
20937a092245SBram Moolenaar      ':# something',
20947a092245SBram Moolenaar      ], 'E488:')
20957a092245SBram Moolenaar  CheckScriptFailure([
20967a092245SBram Moolenaar      '# something',
20977a092245SBram Moolenaar      ], 'E488:')
20987a092245SBram Moolenaar  CheckScriptFailure([
20997a092245SBram Moolenaar      ':# something',
21007a092245SBram Moolenaar      ], 'E488:')
21017a092245SBram Moolenaar
21024a8d9f2eSBram Moolenaar  { # block start
21034a8d9f2eSBram Moolenaar  } # block end
21044a8d9f2eSBram Moolenaar  CheckDefFailure([
21054a8d9f2eSBram Moolenaar      '{# comment',
21064a8d9f2eSBram Moolenaar      ], 'E488:')
21074a8d9f2eSBram Moolenaar  CheckDefFailure([
21084a8d9f2eSBram Moolenaar      '{',
21094a8d9f2eSBram Moolenaar      '}# comment',
21104a8d9f2eSBram Moolenaar      ], 'E488:')
21114a8d9f2eSBram Moolenaar
21124a8d9f2eSBram Moolenaar  echo "yes" # comment
21134a8d9f2eSBram Moolenaar  CheckDefFailure([
21144a8d9f2eSBram Moolenaar      'echo "yes"# comment',
21154a8d9f2eSBram Moolenaar      ], 'E488:')
21167a092245SBram Moolenaar  CheckScriptSuccess([
21177a092245SBram Moolenaar      'vim9script',
21187a092245SBram Moolenaar      'echo "yes" # something',
21197a092245SBram Moolenaar      ])
21207a092245SBram Moolenaar  CheckScriptFailure([
21217a092245SBram Moolenaar      'vim9script',
21227a092245SBram Moolenaar      'echo "yes"# something',
21237a092245SBram Moolenaar      ], 'E121:')
21247a092245SBram Moolenaar  CheckScriptFailure([
21257a092245SBram Moolenaar      'vim9script',
21267a092245SBram Moolenaar      'echo# something',
21277a092245SBram Moolenaar      ], 'E121:')
21287a092245SBram Moolenaar  CheckScriptFailure([
21297a092245SBram Moolenaar      'echo "yes" # something',
21307a092245SBram Moolenaar      ], 'E121:')
21317a092245SBram Moolenaar
21324a8d9f2eSBram Moolenaar  exe "echo" # comment
21334a8d9f2eSBram Moolenaar  CheckDefFailure([
21344a8d9f2eSBram Moolenaar      'exe "echo"# comment',
21354a8d9f2eSBram Moolenaar      ], 'E488:')
21364a8d9f2eSBram Moolenaar  CheckScriptSuccess([
21374a8d9f2eSBram Moolenaar      'vim9script',
21384a8d9f2eSBram Moolenaar      'exe "echo" # something',
21394a8d9f2eSBram Moolenaar      ])
21404a8d9f2eSBram Moolenaar  CheckScriptFailure([
21414a8d9f2eSBram Moolenaar      'vim9script',
21424a8d9f2eSBram Moolenaar      'exe "echo"# something',
21434a8d9f2eSBram Moolenaar      ], 'E121:')
21444a8d9f2eSBram Moolenaar  CheckScriptFailure([
21454a8d9f2eSBram Moolenaar      'vim9script',
21464a8d9f2eSBram Moolenaar      'exe# something',
21474a8d9f2eSBram Moolenaar      ], 'E121:')
21484a8d9f2eSBram Moolenaar  CheckScriptFailure([
21494a8d9f2eSBram Moolenaar      'exe "echo" # something',
21504a8d9f2eSBram Moolenaar      ], 'E121:')
21514a8d9f2eSBram Moolenaar
21527a092245SBram Moolenaar  CheckDefFailure([
21537a092245SBram Moolenaar      'try# comment',
21547a092245SBram Moolenaar      '  echo "yes"',
21557a092245SBram Moolenaar      'catch',
21567a092245SBram Moolenaar      'endtry',
21577a092245SBram Moolenaar      ], 'E488:')
21582c5ed4e3SBram Moolenaar  CheckScriptFailure([
21592c5ed4e3SBram Moolenaar      'vim9script',
21602c5ed4e3SBram Moolenaar      'try# comment',
21612c5ed4e3SBram Moolenaar      'echo "yes"',
21622c5ed4e3SBram Moolenaar      ], 'E488:')
21637a092245SBram Moolenaar  CheckDefFailure([
21647a092245SBram Moolenaar      'try',
2165a72cfb80SBram Moolenaar      '  throw#comment',
2166a72cfb80SBram Moolenaar      'catch',
2167a72cfb80SBram Moolenaar      'endtry',
2168e4984290SBram Moolenaar      ], 'E1143:')
2169a72cfb80SBram Moolenaar  CheckDefFailure([
2170a72cfb80SBram Moolenaar      'try',
2171a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2172a72cfb80SBram Moolenaar      'catch',
2173a72cfb80SBram Moolenaar      'endtry',
2174a72cfb80SBram Moolenaar      ], 'E488:')
2175a72cfb80SBram Moolenaar  CheckDefFailure([
2176a72cfb80SBram Moolenaar      'try',
21777a092245SBram Moolenaar      '  echo "yes"',
21787a092245SBram Moolenaar      'catch# comment',
21797a092245SBram Moolenaar      'endtry',
21807a092245SBram Moolenaar      ], 'E488:')
21812c5ed4e3SBram Moolenaar  CheckScriptFailure([
21822c5ed4e3SBram Moolenaar      'vim9script',
21832c5ed4e3SBram Moolenaar      'try',
21842c5ed4e3SBram Moolenaar      '  echo "yes"',
21852c5ed4e3SBram Moolenaar      'catch# comment',
21862c5ed4e3SBram Moolenaar      'endtry',
21872c5ed4e3SBram Moolenaar      ], 'E654:')
21882c5ed4e3SBram Moolenaar  CheckDefFailure([
21892c5ed4e3SBram Moolenaar      'try',
21902c5ed4e3SBram Moolenaar      '  echo "yes"',
21912c5ed4e3SBram Moolenaar      'catch /pat/# comment',
21922c5ed4e3SBram Moolenaar      'endtry',
21932c5ed4e3SBram Moolenaar      ], 'E488:')
21947a092245SBram Moolenaar  CheckDefFailure([
21957a092245SBram Moolenaar      'try',
21967a092245SBram Moolenaar      'echo "yes"',
21977a092245SBram Moolenaar      'catch',
21987a092245SBram Moolenaar      'endtry# comment',
21997a092245SBram Moolenaar      ], 'E488:')
22002c5ed4e3SBram Moolenaar  CheckScriptFailure([
22012c5ed4e3SBram Moolenaar      'vim9script',
22022c5ed4e3SBram Moolenaar      'try',
22032c5ed4e3SBram Moolenaar      '  echo "yes"',
22042c5ed4e3SBram Moolenaar      'catch',
22052c5ed4e3SBram Moolenaar      'endtry# comment',
22069b7bf9e9SBram Moolenaar      ], 'E488:')
22072c5ed4e3SBram Moolenaar
22082c5ed4e3SBram Moolenaar  CheckScriptSuccess([
22092c5ed4e3SBram Moolenaar      'vim9script',
22102c5ed4e3SBram Moolenaar      'hi # comment',
22112c5ed4e3SBram Moolenaar      ])
22122c5ed4e3SBram Moolenaar  CheckScriptFailure([
22132c5ed4e3SBram Moolenaar      'vim9script',
22142c5ed4e3SBram Moolenaar      'hi# comment',
22152c5ed4e3SBram Moolenaar      ], 'E416:')
22161966c248SBram Moolenaar  CheckScriptSuccess([
22171966c248SBram Moolenaar      'vim9script',
22181966c248SBram Moolenaar      'hi Search # comment',
22191966c248SBram Moolenaar      ])
22201966c248SBram Moolenaar  CheckScriptFailure([
22211966c248SBram Moolenaar      'vim9script',
22221966c248SBram Moolenaar      'hi Search# comment',
22231966c248SBram Moolenaar      ], 'E416:')
22241966c248SBram Moolenaar  CheckScriptSuccess([
22251966c248SBram Moolenaar      'vim9script',
22261966c248SBram Moolenaar      'hi link This Search # comment',
22271966c248SBram Moolenaar      ])
22281966c248SBram Moolenaar  CheckScriptFailure([
22291966c248SBram Moolenaar      'vim9script',
22301966c248SBram Moolenaar      'hi link This That# comment',
22311966c248SBram Moolenaar      ], 'E413:')
22321966c248SBram Moolenaar  CheckScriptSuccess([
22331966c248SBram Moolenaar      'vim9script',
22341966c248SBram Moolenaar      'hi clear This # comment',
22351966c248SBram Moolenaar      'hi clear # comment',
22361966c248SBram Moolenaar      ])
2237f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2238f5be8cdbSBram Moolenaar  # hi clear This# comment',
22391966c248SBram Moolenaar  CheckScriptFailure([
22401966c248SBram Moolenaar      'vim9script',
22411966c248SBram Moolenaar      'hi clear# comment',
22421966c248SBram Moolenaar      ], 'E416:')
22431966c248SBram Moolenaar
22441966c248SBram Moolenaar  CheckScriptSuccess([
22451966c248SBram Moolenaar      'vim9script',
22461966c248SBram Moolenaar      'hi Group term=bold',
22471966c248SBram Moolenaar      'match Group /todo/ # comment',
22481966c248SBram Moolenaar      ])
22491966c248SBram Moolenaar  CheckScriptFailure([
22501966c248SBram Moolenaar      'vim9script',
22511966c248SBram Moolenaar      'hi Group term=bold',
22521966c248SBram Moolenaar      'match Group /todo/# comment',
22531966c248SBram Moolenaar      ], 'E488:')
22541966c248SBram Moolenaar  CheckScriptSuccess([
22551966c248SBram Moolenaar      'vim9script',
22561966c248SBram Moolenaar      'match # comment',
22571966c248SBram Moolenaar      ])
22581966c248SBram Moolenaar  CheckScriptFailure([
22591966c248SBram Moolenaar      'vim9script',
22601966c248SBram Moolenaar      'match# comment',
22611966c248SBram Moolenaar      ], 'E475:')
22621966c248SBram Moolenaar  CheckScriptSuccess([
22631966c248SBram Moolenaar      'vim9script',
22641966c248SBram Moolenaar      'match none # comment',
22651966c248SBram Moolenaar      ])
22661966c248SBram Moolenaar  CheckScriptFailure([
22671966c248SBram Moolenaar      'vim9script',
22681966c248SBram Moolenaar      'match none# comment',
22691966c248SBram Moolenaar      ], 'E475:')
22701966c248SBram Moolenaar
22711966c248SBram Moolenaar  CheckScriptSuccess([
22721966c248SBram Moolenaar      'vim9script',
22731966c248SBram Moolenaar      'menutrans clear # comment',
22741966c248SBram Moolenaar      ])
22751966c248SBram Moolenaar  CheckScriptFailure([
22761966c248SBram Moolenaar      'vim9script',
22771966c248SBram Moolenaar      'menutrans clear# comment text',
22781966c248SBram Moolenaar      ], 'E474:')
22791966c248SBram Moolenaar
22801966c248SBram Moolenaar  CheckScriptSuccess([
22811966c248SBram Moolenaar      'vim9script',
22821966c248SBram Moolenaar      'syntax clear # comment',
22831966c248SBram Moolenaar      ])
22841966c248SBram Moolenaar  CheckScriptFailure([
22851966c248SBram Moolenaar      'vim9script',
22861966c248SBram Moolenaar      'syntax clear# comment text',
22871966c248SBram Moolenaar      ], 'E28:')
22881966c248SBram Moolenaar  CheckScriptSuccess([
22891966c248SBram Moolenaar      'vim9script',
22901966c248SBram Moolenaar      'syntax keyword Word some',
22911966c248SBram Moolenaar      'syntax clear Word # comment',
22921966c248SBram Moolenaar      ])
22931966c248SBram Moolenaar  CheckScriptFailure([
22941966c248SBram Moolenaar      'vim9script',
22951966c248SBram Moolenaar      'syntax keyword Word some',
22961966c248SBram Moolenaar      'syntax clear Word# comment text',
22971966c248SBram Moolenaar      ], 'E28:')
22981966c248SBram Moolenaar
22991966c248SBram Moolenaar  CheckScriptSuccess([
23001966c248SBram Moolenaar      'vim9script',
23011966c248SBram Moolenaar      'syntax list # comment',
23021966c248SBram Moolenaar      ])
23031966c248SBram Moolenaar  CheckScriptFailure([
23041966c248SBram Moolenaar      'vim9script',
23051966c248SBram Moolenaar      'syntax list# comment text',
23061966c248SBram Moolenaar      ], 'E28:')
23071966c248SBram Moolenaar
23081966c248SBram Moolenaar  CheckScriptSuccess([
23091966c248SBram Moolenaar      'vim9script',
23101966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
23111966c248SBram Moolenaar      ])
23121966c248SBram Moolenaar  CheckScriptFailure([
23131966c248SBram Moolenaar      'vim9script',
23141966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
23151966c248SBram Moolenaar      ], 'E475:')
23161966c248SBram Moolenaar
23171966c248SBram Moolenaar  CheckScriptSuccess([
23181966c248SBram Moolenaar      'vim9script',
23191966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
23201966c248SBram Moolenaar      ])
23211966c248SBram Moolenaar  CheckScriptFailure([
23221966c248SBram Moolenaar      'vim9script',
23231966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
23241966c248SBram Moolenaar      ], 'E789:')
23251966c248SBram Moolenaar
23261966c248SBram Moolenaar  CheckScriptSuccess([
23271966c248SBram Moolenaar      'vim9script',
23281966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
23291966c248SBram Moolenaar      ])
23301966c248SBram Moolenaar  CheckScriptFailure([
23311966c248SBram Moolenaar      'vim9script',
23321966c248SBram Moolenaar      'syntax match Word /pat/# comment',
23331966c248SBram Moolenaar      ], 'E402:')
23341966c248SBram Moolenaar
23351966c248SBram Moolenaar  CheckScriptSuccess([
23361966c248SBram Moolenaar      'vim9script',
23371966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
23381966c248SBram Moolenaar      ])
23391966c248SBram Moolenaar  CheckScriptFailure([
23401966c248SBram Moolenaar      'vim9script',
23411966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
23421966c248SBram Moolenaar      ], 'E475:')
23431966c248SBram Moolenaar  CheckScriptFailure([
23441966c248SBram Moolenaar      'vim9script',
23451966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
23461966c248SBram Moolenaar      ], 'E406:')
23471966c248SBram Moolenaar  CheckScriptFailure([
23481966c248SBram Moolenaar      'vim9script',
23491966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
23501966c248SBram Moolenaar      ], 'E475:')
23511966c248SBram Moolenaar
23521966c248SBram Moolenaar  CheckScriptSuccess([
23531966c248SBram Moolenaar      'vim9script',
23541966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
23551966c248SBram Moolenaar      ])
23561966c248SBram Moolenaar  CheckScriptFailure([
23571966c248SBram Moolenaar      'vim9script',
23581966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2359d032f34aSBram Moolenaar      ], 'E402:')
23601966c248SBram Moolenaar
23611966c248SBram Moolenaar  CheckScriptSuccess([
23621966c248SBram Moolenaar      'vim9script',
23631966c248SBram Moolenaar      'syntax sync # comment',
23641966c248SBram Moolenaar      ])
23651966c248SBram Moolenaar  CheckScriptFailure([
23661966c248SBram Moolenaar      'vim9script',
23671966c248SBram Moolenaar      'syntax sync# comment',
23681966c248SBram Moolenaar      ], 'E404:')
23691966c248SBram Moolenaar  CheckScriptSuccess([
23701966c248SBram Moolenaar      'vim9script',
23711966c248SBram Moolenaar      'syntax sync ccomment # comment',
23721966c248SBram Moolenaar      ])
23731966c248SBram Moolenaar  CheckScriptFailure([
23741966c248SBram Moolenaar      'vim9script',
23751966c248SBram Moolenaar      'syntax sync ccomment# comment',
23761966c248SBram Moolenaar      ], 'E404:')
23771966c248SBram Moolenaar
23781966c248SBram Moolenaar  CheckScriptSuccess([
23791966c248SBram Moolenaar      'vim9script',
23801966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
23811966c248SBram Moolenaar      ])
23821966c248SBram Moolenaar  CheckScriptFailure([
23831966c248SBram Moolenaar      'vim9script',
23841966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
23851966c248SBram Moolenaar      ], 'E475:')
2386a72cfb80SBram Moolenaar
2387a72cfb80SBram Moolenaar  CheckScriptSuccess([
2388a72cfb80SBram Moolenaar      'vim9script',
2389a72cfb80SBram Moolenaar      'command Echo echo # comment',
2390a72cfb80SBram Moolenaar      'command Echo # comment',
23912d870f8dSBram Moolenaar      'delcommand Echo',
2392a72cfb80SBram Moolenaar      ])
2393a72cfb80SBram Moolenaar  CheckScriptFailure([
2394a72cfb80SBram Moolenaar      'vim9script',
2395a72cfb80SBram Moolenaar      'command Echo echo# comment',
2396a72cfb80SBram Moolenaar      'Echo',
2397a72cfb80SBram Moolenaar      ], 'E121:')
23982d870f8dSBram Moolenaar  delcommand Echo
239970249ee8SBram Moolenaar
240070249ee8SBram Moolenaar  var curdir = getcwd()
240170249ee8SBram Moolenaar  CheckScriptSuccess([
240270249ee8SBram Moolenaar      'command Echo cd " comment',
240370249ee8SBram Moolenaar      'Echo',
240470249ee8SBram Moolenaar      'delcommand Echo',
240570249ee8SBram Moolenaar      ])
240670249ee8SBram Moolenaar  CheckScriptSuccess([
240770249ee8SBram Moolenaar      'vim9script'
240870249ee8SBram Moolenaar      'command Echo cd # comment',
240970249ee8SBram Moolenaar      'Echo',
241070249ee8SBram Moolenaar      'delcommand Echo',
241170249ee8SBram Moolenaar      ])
241270249ee8SBram Moolenaar  CheckScriptFailure([
241370249ee8SBram Moolenaar      'vim9script',
241470249ee8SBram Moolenaar      'command Echo cd " comment',
241570249ee8SBram Moolenaar      'Echo',
241670249ee8SBram Moolenaar      ], 'E344:')
241770249ee8SBram Moolenaar  delcommand Echo
241870249ee8SBram Moolenaar  chdir(curdir)
241970249ee8SBram Moolenaar
2420a72cfb80SBram Moolenaar  CheckScriptFailure([
2421a72cfb80SBram Moolenaar      'vim9script',
2422a72cfb80SBram Moolenaar      'command Echo# comment',
2423a72cfb80SBram Moolenaar      ], 'E182:')
2424a72cfb80SBram Moolenaar  CheckScriptFailure([
2425a72cfb80SBram Moolenaar      'vim9script',
2426a72cfb80SBram Moolenaar      'command Echo echo',
2427a72cfb80SBram Moolenaar      'command Echo# comment',
2428a72cfb80SBram Moolenaar      ], 'E182:')
24292d870f8dSBram Moolenaar  delcommand Echo
2430a72cfb80SBram Moolenaar
2431a72cfb80SBram Moolenaar  CheckScriptSuccess([
2432a72cfb80SBram Moolenaar      'vim9script',
2433a72cfb80SBram Moolenaar      'function # comment',
2434a72cfb80SBram Moolenaar      ])
2435a72cfb80SBram Moolenaar  CheckScriptFailure([
2436a72cfb80SBram Moolenaar      'vim9script',
24379898107fSBram Moolenaar      'function " comment',
24389898107fSBram Moolenaar      ], 'E129:')
24399898107fSBram Moolenaar  CheckScriptFailure([
24409898107fSBram Moolenaar      'vim9script',
2441a72cfb80SBram Moolenaar      'function# comment',
2442a72cfb80SBram Moolenaar      ], 'E129:')
2443a72cfb80SBram Moolenaar  CheckScriptSuccess([
2444a72cfb80SBram Moolenaar      'vim9script',
2445a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2446a72cfb80SBram Moolenaar      ])
2447a72cfb80SBram Moolenaar  CheckScriptFailure([
2448a72cfb80SBram Moolenaar      'vim9script',
2449a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2450a72cfb80SBram Moolenaar      ], 'E488:')
2451a72cfb80SBram Moolenaar
2452a72cfb80SBram Moolenaar  CheckScriptSuccess([
2453a72cfb80SBram Moolenaar      'vim9script',
24544c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2455a72cfb80SBram Moolenaar      'endfunc',
24564c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2457a72cfb80SBram Moolenaar      ])
2458a72cfb80SBram Moolenaar  CheckScriptFailure([
2459a72cfb80SBram Moolenaar      'vim9script',
24604c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2461a72cfb80SBram Moolenaar      'endfunc',
24624c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2463a72cfb80SBram Moolenaar      ], 'E488:')
2464a72cfb80SBram Moolenaar
2465a72cfb80SBram Moolenaar  CheckScriptSuccess([
2466a72cfb80SBram Moolenaar      'vim9script',
2467a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2468a72cfb80SBram Moolenaar      ])
2469a72cfb80SBram Moolenaar  CheckScriptFailure([
2470a72cfb80SBram Moolenaar      'vim9script',
2471a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2472a72cfb80SBram Moolenaar      ], 'E488:')
2473e7e4838fSBram Moolenaar
2474e7e4838fSBram Moolenaar  CheckScriptFailure([
2475e7e4838fSBram Moolenaar      'def Test() " comment',
2476e7e4838fSBram Moolenaar      'enddef',
2477e7e4838fSBram Moolenaar      ], 'E488:')
2478e7e4838fSBram Moolenaar  CheckScriptFailure([
2479e7e4838fSBram Moolenaar      'vim9script',
2480e7e4838fSBram Moolenaar      'def Test() " comment',
2481e7e4838fSBram Moolenaar      'enddef',
2482e7e4838fSBram Moolenaar      ], 'E488:')
2483e7e4838fSBram Moolenaar
2484e7e4838fSBram Moolenaar  CheckScriptSuccess([
2485e7e4838fSBram Moolenaar      'func Test() " comment',
2486e7e4838fSBram Moolenaar      'endfunc',
24872d870f8dSBram Moolenaar      'delfunc Test',
2488e7e4838fSBram Moolenaar      ])
24899898107fSBram Moolenaar  CheckScriptSuccess([
2490e7e4838fSBram Moolenaar      'vim9script',
2491e7e4838fSBram Moolenaar      'func Test() " comment',
2492e7e4838fSBram Moolenaar      'endfunc',
24939898107fSBram Moolenaar      ])
2494e7e4838fSBram Moolenaar
2495e7e4838fSBram Moolenaar  CheckScriptSuccess([
2496e7e4838fSBram Moolenaar      'def Test() # comment',
2497e7e4838fSBram Moolenaar      'enddef',
2498e7e4838fSBram Moolenaar      ])
2499e7e4838fSBram Moolenaar  CheckScriptFailure([
2500e7e4838fSBram Moolenaar      'func Test() # comment',
2501e7e4838fSBram Moolenaar      'endfunc',
2502e7e4838fSBram Moolenaar      ], 'E488:')
25032c5ed4e3SBram Moolenaarenddef
25042c5ed4e3SBram Moolenaar
25052c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
25062c5ed4e3SBram Moolenaar  CheckCanRunGui
25072c5ed4e3SBram Moolenaar
25082c5ed4e3SBram Moolenaar  CheckScriptFailure([
25092c5ed4e3SBram Moolenaar      'vim9script',
25102c5ed4e3SBram Moolenaar      'gui#comment'
25112c5ed4e3SBram Moolenaar      ], 'E499:')
25122c5ed4e3SBram Moolenaar  CheckScriptFailure([
25132c5ed4e3SBram Moolenaar      'vim9script',
25142c5ed4e3SBram Moolenaar      'gui -f#comment'
25152c5ed4e3SBram Moolenaar      ], 'E499:')
25167a092245SBram Moolenaarenddef
25177a092245SBram Moolenaar
2518a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
25196797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
25206797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2521a26b9700SBram Moolenaar
2522a26b9700SBram Moolenaar  edit test.vim
2523a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2524a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2525a26b9700SBram Moolenaar
2526a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2527a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2528a26b9700SBram Moolenaar
2529a26b9700SBram Moolenaar  g:entered = 0
2530a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2531a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2532a26b9700SBram Moolenaar
2533a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2534a26b9700SBram Moolenaar
2535a26b9700SBram Moolenaar  au! TabEnter
2536a26b9700SBram Moolenaar  unlet g:entered
2537d72c1bf0SBram Moolenaar
2538d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2539d72c1bf0SBram Moolenaar      'vim9script',
25406797966dSBram Moolenaar      'g:var = 123',
2541e55b1c09SBram Moolenaar      'b:var = 456',
2542e55b1c09SBram Moolenaar      'w:var = 777',
2543e55b1c09SBram Moolenaar      't:var = 888',
2544d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2545d72c1bf0SBram Moolenaar      ])
2546d72c1bf0SBram Moolenaar
2547d72c1bf0SBram Moolenaar  CheckScriptFailure([
2548d72c1bf0SBram Moolenaar      'vim9script',
2549cfcd011fSBram Moolenaar      'let var = 123',
2550cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2551cfcd011fSBram Moolenaar
2552cfcd011fSBram Moolenaar  CheckScriptFailure([
2553cfcd011fSBram Moolenaar      'vim9script',
2554cfcd011fSBram Moolenaar      'var g:var = 123',
2555e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2556e55b1c09SBram Moolenaar
2557e55b1c09SBram Moolenaar  CheckScriptFailure([
2558e55b1c09SBram Moolenaar      'vim9script',
2559cfcd011fSBram Moolenaar      'var b:var = 123',
2560e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2561e55b1c09SBram Moolenaar
2562e55b1c09SBram Moolenaar  CheckScriptFailure([
2563e55b1c09SBram Moolenaar      'vim9script',
2564cfcd011fSBram Moolenaar      'var w:var = 123',
2565e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2566e55b1c09SBram Moolenaar
2567e55b1c09SBram Moolenaar  CheckScriptFailure([
2568e55b1c09SBram Moolenaar      'vim9script',
2569cfcd011fSBram Moolenaar      'var t:var = 123',
2570e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2571e55b1c09SBram Moolenaar
2572e55b1c09SBram Moolenaar  CheckScriptFailure([
2573e55b1c09SBram Moolenaar      'vim9script',
2574cfcd011fSBram Moolenaar      'var v:version = 123',
2575e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2576e55b1c09SBram Moolenaar
2577e55b1c09SBram Moolenaar  CheckScriptFailure([
2578e55b1c09SBram Moolenaar      'vim9script',
2579cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2580e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
25816797966dSBram Moolenaar
25826797966dSBram Moolenaar  CheckScriptFailure([
25836797966dSBram Moolenaar      'vim9script',
25846797966dSBram Moolenaar      'g:var = 123',
258532e35117SBram Moolenaar      'unlet g:var# comment1',
2586d72c1bf0SBram Moolenaar      ], 'E108:')
2587d72c1bf0SBram Moolenaar
2588d72c1bf0SBram Moolenaar  CheckScriptFailure([
2589d72c1bf0SBram Moolenaar      'let g:var = 123',
2590d72c1bf0SBram Moolenaar      'unlet g:var # something',
2591d72c1bf0SBram Moolenaar      ], 'E488:')
2592faac4104SBram Moolenaar
2593faac4104SBram Moolenaar  CheckScriptSuccess([
2594faac4104SBram Moolenaar      'vim9script',
259532e35117SBram Moolenaar      'if 1 # comment2',
2596faac4104SBram Moolenaar      '  echo "yes"',
2597faac4104SBram Moolenaar      'elseif 2 #comment',
2598faac4104SBram Moolenaar      '  echo "no"',
2599faac4104SBram Moolenaar      'endif',
2600faac4104SBram Moolenaar      ])
2601faac4104SBram Moolenaar
2602faac4104SBram Moolenaar  CheckScriptFailure([
2603faac4104SBram Moolenaar      'vim9script',
260432e35117SBram Moolenaar      'if 1# comment3',
2605faac4104SBram Moolenaar      '  echo "yes"',
2606faac4104SBram Moolenaar      'endif',
2607faac4104SBram Moolenaar      ], 'E15:')
2608faac4104SBram Moolenaar
2609faac4104SBram Moolenaar  CheckScriptFailure([
2610faac4104SBram Moolenaar      'vim9script',
261132e35117SBram Moolenaar      'if 0 # comment4',
2612faac4104SBram Moolenaar      '  echo "yes"',
2613faac4104SBram Moolenaar      'elseif 2#comment',
2614faac4104SBram Moolenaar      '  echo "no"',
2615faac4104SBram Moolenaar      'endif',
2616faac4104SBram Moolenaar      ], 'E15:')
2617faac4104SBram Moolenaar
2618faac4104SBram Moolenaar  CheckScriptSuccess([
2619faac4104SBram Moolenaar      'vim9script',
2620cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2621faac4104SBram Moolenaar      ])
2622faac4104SBram Moolenaar
2623faac4104SBram Moolenaar  CheckScriptFailure([
2624faac4104SBram Moolenaar      'vim9script',
2625cfcd011fSBram Moolenaar      'var v = 1# comment6',
262632e35117SBram Moolenaar      ], 'E15:')
2627faac4104SBram Moolenaar
2628faac4104SBram Moolenaar  CheckScriptSuccess([
2629faac4104SBram Moolenaar      'vim9script',
2630faac4104SBram Moolenaar      'new'
2631d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2632df069eecSBram Moolenaar      ':$',
2633faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2634faac4104SBram Moolenaar      'bwipe!',
2635faac4104SBram Moolenaar      ])
2636faac4104SBram Moolenaar
2637f5be8cdbSBram Moolenaar  CheckScriptFailure([
2638f5be8cdbSBram Moolenaar      'vim9script',
2639f5be8cdbSBram Moolenaar      'new'
2640d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2641f5be8cdbSBram Moolenaar      ':$',
2642f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2643f5be8cdbSBram Moolenaar      'bwipe!',
2644f5be8cdbSBram Moolenaar      ], 'E488:')
2645f5be8cdbSBram Moolenaar
2646f5be8cdbSBram Moolenaar  CheckScriptFailure([
2647f5be8cdbSBram Moolenaar      'vim9script',
2648f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2649f5be8cdbSBram Moolenaar      ], 'E477:')
2650a26b9700SBram Moolenaarenddef
2651a26b9700SBram Moolenaar
26527e5bd91dSBram Moolenaardef Test_finish()
2653cfcd011fSBram Moolenaar  var lines =<< trim END
26547e5bd91dSBram Moolenaar    vim9script
26556797966dSBram Moolenaar    g:res = 'one'
26567e5bd91dSBram Moolenaar    if v:false | finish | endif
26576797966dSBram Moolenaar    g:res = 'two'
26587e5bd91dSBram Moolenaar    finish
26596797966dSBram Moolenaar    g:res = 'three'
26607e5bd91dSBram Moolenaar  END
26617e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
26627e5bd91dSBram Moolenaar  source Xfinished
26637e5bd91dSBram Moolenaar  assert_equal('two', g:res)
26647e5bd91dSBram Moolenaar
26657e5bd91dSBram Moolenaar  unlet g:res
26667e5bd91dSBram Moolenaar  delete('Xfinished')
26677e5bd91dSBram Moolenaarenddef
26687e5bd91dSBram Moolenaar
2669a5d0077eSBram Moolenaardef Test_forward_declaration()
2670cfcd011fSBram Moolenaar  var lines =<< trim END
2671a5d0077eSBram Moolenaar    vim9script
2672a5d0077eSBram Moolenaar    def GetValue(): string
2673a5d0077eSBram Moolenaar      return theVal
2674a5d0077eSBram Moolenaar    enddef
2675cfcd011fSBram Moolenaar    var theVal = 'something'
2676822ba247SBram Moolenaar    g:initVal = GetValue()
2677a5d0077eSBram Moolenaar    theVal = 'else'
2678a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2679a5d0077eSBram Moolenaar  END
2680a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2681a5d0077eSBram Moolenaar  source Xforward
2682a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2683a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2684a5d0077eSBram Moolenaar
2685a5d0077eSBram Moolenaar  unlet g:initVal
2686a5d0077eSBram Moolenaar  unlet g:laterVal
2687a5d0077eSBram Moolenaar  delete('Xforward')
2688a5d0077eSBram Moolenaarenddef
2689a5d0077eSBram Moolenaar
26909721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2691cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
26929721fb4eSBram Moolenaar    source Xvim9_script.vim
26939721fb4eSBram Moolenaar
26949721fb4eSBram Moolenaar    call assert_false(exists('local'))
26959721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26969721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
26979721fb4eSBram Moolenaar    call assert_equal('global', global)
26989721fb4eSBram Moolenaar    call assert_equal('global', g:global)
26999721fb4eSBram Moolenaar
27009721fb4eSBram Moolenaar    " imported variable becomes script-local
27019721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
27029721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
27039721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27049721fb4eSBram Moolenaar
27059721fb4eSBram Moolenaar    " imported function becomes script-local
27069721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
27079721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
27089721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
27099721fb4eSBram Moolenaar  END
27109721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
27119721fb4eSBram Moolenaar
2712cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
27139721fb4eSBram Moolenaar    vim9script
2714cfcd011fSBram Moolenaar    var local = 'local'
27159721fb4eSBram Moolenaar    g:global = 'global'
2716cfcd011fSBram Moolenaar    export var exported = 'exported'
27179721fb4eSBram Moolenaar    export def GetText(): string
27189721fb4eSBram Moolenaar       return 'text'
27199721fb4eSBram Moolenaar    enddef
27209721fb4eSBram Moolenaar  END
27219721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
27229721fb4eSBram Moolenaar
27239721fb4eSBram Moolenaar  source Xlegacy_script.vim
27249721fb4eSBram Moolenaar
27259721fb4eSBram Moolenaar  assert_equal('global', g:global)
2726f5be8cdbSBram Moolenaar  unlet g:global
27279721fb4eSBram Moolenaar
27289721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
27299721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
27309721fb4eSBram Moolenaarenddef
2731a5d0077eSBram Moolenaar
27327d699701SBram Moolenaarfunc Test_vim9script_not_global()
27337d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
27347d699701SBram Moolenaar  let vim9lines =<< trim END
27357d699701SBram Moolenaar    vim9script
2736cfcd011fSBram Moolenaar    var name = 'local'
27377d699701SBram Moolenaar    func TheFunc()
27387d699701SBram Moolenaar      echo 'local'
27397d699701SBram Moolenaar    endfunc
27407d699701SBram Moolenaar    def DefFunc()
27417d699701SBram Moolenaar      echo 'local'
27427d699701SBram Moolenaar    enddef
27437d699701SBram Moolenaar  END
27447d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
27457d699701SBram Moolenaar  source Xvim9script.vim
27467d699701SBram Moolenaar  try
27477d699701SBram Moolenaar    echo g:var
27487d699701SBram Moolenaar    assert_report('did not fail')
27497d699701SBram Moolenaar  catch /E121:/
27507d699701SBram Moolenaar    " caught
27517d699701SBram Moolenaar  endtry
27527d699701SBram Moolenaar  try
27537d699701SBram Moolenaar    call TheFunc()
27547d699701SBram Moolenaar    assert_report('did not fail')
27557d699701SBram Moolenaar  catch /E117:/
27567d699701SBram Moolenaar    " caught
27577d699701SBram Moolenaar  endtry
27587d699701SBram Moolenaar  try
27597d699701SBram Moolenaar    call DefFunc()
27607d699701SBram Moolenaar    assert_report('did not fail')
27617d699701SBram Moolenaar  catch /E117:/
27627d699701SBram Moolenaar    " caught
27637d699701SBram Moolenaar  endtry
27647d699701SBram Moolenaar
276525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
27667d699701SBram Moolenaarendfunc
27677d699701SBram Moolenaar
2768eeb27bfeSBram Moolenaardef Test_vim9_copen()
2769eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2770eeb27bfeSBram Moolenaar  copen
2771eeb27bfeSBram Moolenaar  quit
2772eeb27bfeSBram Moolenaarenddef
2773eeb27bfeSBram Moolenaar
27742d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
27752d6b20d6SBram Moolenaardef Test_vim9_autoload()
2776cfcd011fSBram Moolenaar  var lines =<< trim END
27772d6b20d6SBram Moolenaar     vim9script
27782d6b20d6SBram Moolenaar     def foo#test()
27792d6b20d6SBram Moolenaar         echomsg getreg('"')
27802d6b20d6SBram Moolenaar     enddef
27812d6b20d6SBram Moolenaar  END
27822d6b20d6SBram Moolenaar
27832d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
27842d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2785cfcd011fSBram Moolenaar  var save_rtp = &rtp
27862d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
27872d6b20d6SBram Moolenaar  augroup test
27882d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
27892d6b20d6SBram Moolenaar  augroup END
27902d6b20d6SBram Moolenaar
27912d6b20d6SBram Moolenaar  normal Y
27922d6b20d6SBram Moolenaar
27932d6b20d6SBram Moolenaar  augroup test
27942d6b20d6SBram Moolenaar    autocmd!
27952d6b20d6SBram Moolenaar  augroup END
27962d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
27972d6b20d6SBram Moolenaar  &rtp = save_rtp
27982d6b20d6SBram Moolenaarenddef
27992d6b20d6SBram Moolenaar
280077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
280177e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2802cfcd011fSBram Moolenaar  var lines =<< trim END
280377e5dcc3SBram Moolenaar      vim9script
280477e5dcc3SBram Moolenaar      def crash#func()
280577e5dcc3SBram Moolenaar          try
280677e5dcc3SBram Moolenaar              for x in List()
280777e5dcc3SBram Moolenaar              endfor
280877e5dcc3SBram Moolenaar          catch
280977e5dcc3SBram Moolenaar          endtry
281077e5dcc3SBram Moolenaar          g:ok = true
281177e5dcc3SBram Moolenaar      enddef
281277e5dcc3SBram Moolenaar      fu List()
281377e5dcc3SBram Moolenaar          invalid
281477e5dcc3SBram Moolenaar      endfu
281577e5dcc3SBram Moolenaar      try
281677e5dcc3SBram Moolenaar          invalid
281777e5dcc3SBram Moolenaar      catch /wontmatch/
281877e5dcc3SBram Moolenaar      endtry
281977e5dcc3SBram Moolenaar  END
282077e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
282177e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
282277e5dcc3SBram Moolenaar
282377e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
282477e5dcc3SBram Moolenaar  lines =<< trim END
282577e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
282677e5dcc3SBram Moolenaar    call crash#func()
282777e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
28289c4f5520SBram Moolenaar    qall!
282977e5dcc3SBram Moolenaar  END
283077e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
283177e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
283277e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
283377e5dcc3SBram Moolenaar
283477e5dcc3SBram Moolenaar  delete('Xdidit')
283577e5dcc3SBram Moolenaar  delete('Xscript')
283677e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
283777e5dcc3SBram Moolenaarenddef
283877e5dcc3SBram Moolenaar
283981e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
284081e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
284181e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2842cfcd011fSBram Moolenaar  var lines =<< trim END
284381e17fbeSBram Moolenaar    let s:counter = 1
284481e17fbeSBram Moolenaar    def s:Func()
284581e17fbeSBram Moolenaar      au! CursorHold
284681e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
284781e17fbeSBram Moolenaar    enddef
284881e17fbeSBram Moolenaar    call s:Func()
284981e17fbeSBram Moolenaar    doau CursorHold
285081e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
285181e17fbeSBram Moolenaar    au! CursorHold
285281e17fbeSBram Moolenaar  END
285381e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
285481e17fbeSBram Moolenaarenddef
285581e17fbeSBram Moolenaar
28563896a105SBram Moolenaardef Test_cmdline_win()
28573896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
28583896a105SBram Moolenaar  # the command line window.
28593896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2860cfcd011fSBram Moolenaar  var export_lines =<< trim END
28613896a105SBram Moolenaar    vim9script
2862cfcd011fSBram Moolenaar    export var That = 'yes'
28633896a105SBram Moolenaar  END
28643896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2865cfcd011fSBram Moolenaar  var import_lines =<< trim END
28663896a105SBram Moolenaar    vim9script
28673896a105SBram Moolenaar    import That from './Xexport.vim'
28683896a105SBram Moolenaar  END
28693896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2870cfcd011fSBram Moolenaar  var save_rtp = &rtp
28713896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
28723896a105SBram Moolenaar  syntax on
28733896a105SBram Moolenaar  augroup CmdWin
28743896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
28753896a105SBram Moolenaar  augroup END
28763896a105SBram Moolenaar  # this will open and also close the cmdline window
28773896a105SBram Moolenaar  feedkeys('q:', 'xt')
28783896a105SBram Moolenaar  assert_equal('yes', g:got_there)
28793896a105SBram Moolenaar
28803896a105SBram Moolenaar  augroup CmdWin
28813896a105SBram Moolenaar    au!
28823896a105SBram Moolenaar  augroup END
28833896a105SBram Moolenaar  &rtp = save_rtp
28843896a105SBram Moolenaar  delete('rtp', 'rf')
28853896a105SBram Moolenaarenddef
28863896a105SBram Moolenaar
2887e3d4685fSBram Moolenaardef Test_invalid_sid()
2888e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
288925859dd7SBram Moolenaar
28909c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2891d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2892e3d4685fSBram Moolenaar  endif
2893e3d4685fSBram Moolenaar  delete('Xdidit')
2894e3d4685fSBram Moolenaarenddef
2895e3d4685fSBram Moolenaar
28969ec7026fSBram Moolenaardef Test_restoring_cpo()
28979ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
28989ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
28999ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
29009ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
29019ec7026fSBram Moolenaar  endif
29029ec7026fSBram Moolenaar  delete('Xsourced')
29039ec7026fSBram Moolenaar  delete('Xclose')
29049ec7026fSBram Moolenaarenddef
29059ec7026fSBram Moolenaar
29069ec7026fSBram Moolenaar
2907f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2908cfcd011fSBram Moolenaar  var lines =<< trim END
2909cfcd011fSBram Moolenaar    var name: any
2910cfcd011fSBram Moolenaar    assert_equal(0, name)
2911f0afd9e1SBram Moolenaar  END
2912f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2913f0afd9e1SBram Moolenaarenddef
2914f0afd9e1SBram Moolenaar
29157e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
291658dbef33SBram Moolenaar  CheckRunVimInTerminal
291758dbef33SBram Moolenaar
29187e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
29197e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
29207e9210eaSBram Moolenaarendfunc
29217e9210eaSBram Moolenaar
29227e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
29239c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2924cfcd011fSBram Moolenaar  var lines =<< trim END
29259c4f5520SBram Moolenaar    func CheckAndQuit()
29269c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
29279c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
29289c4f5520SBram Moolenaar    endfunc
29299c4f5520SBram Moolenaar  END
29309c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
29319c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2932e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
29339c4f5520SBram Moolenaar  # define Afunc() on the command line
29349c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
29359c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
29369c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
29379c4f5520SBram Moolenaar
29389c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
29399c4f5520SBram Moolenaar  delete('XcallFunc')
29409c4f5520SBram Moolenaar  delete('Xdidcmd')
29419c4f5520SBram Moolenaarenddef
29429c4f5520SBram Moolenaar
2943fcdc5d83SBram Moolenaardef Test_script_var_scope()
2944fcdc5d83SBram Moolenaar  var lines =<< trim END
2945fcdc5d83SBram Moolenaar      vim9script
2946fcdc5d83SBram Moolenaar      if true
2947fcdc5d83SBram Moolenaar        if true
2948fcdc5d83SBram Moolenaar          var one = 'one'
2949fcdc5d83SBram Moolenaar          echo one
2950fcdc5d83SBram Moolenaar        endif
2951fcdc5d83SBram Moolenaar        echo one
2952fcdc5d83SBram Moolenaar      endif
2953fcdc5d83SBram Moolenaar  END
2954fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2955fcdc5d83SBram Moolenaar
2956fcdc5d83SBram Moolenaar  lines =<< trim END
2957fcdc5d83SBram Moolenaar      vim9script
2958fcdc5d83SBram Moolenaar      if true
2959fcdc5d83SBram Moolenaar        if false
2960fcdc5d83SBram Moolenaar          var one = 'one'
2961fcdc5d83SBram Moolenaar          echo one
2962fcdc5d83SBram Moolenaar        else
2963fcdc5d83SBram Moolenaar          var one = 'one'
2964fcdc5d83SBram Moolenaar          echo one
2965fcdc5d83SBram Moolenaar        endif
2966fcdc5d83SBram Moolenaar        echo one
2967fcdc5d83SBram Moolenaar      endif
2968fcdc5d83SBram Moolenaar  END
2969fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
2970fcdc5d83SBram Moolenaar
2971fcdc5d83SBram Moolenaar  lines =<< trim END
2972fcdc5d83SBram Moolenaar      vim9script
2973fcdc5d83SBram Moolenaar      while true
2974fcdc5d83SBram Moolenaar        var one = 'one'
2975fcdc5d83SBram Moolenaar        echo one
2976fcdc5d83SBram Moolenaar        break
2977fcdc5d83SBram Moolenaar      endwhile
2978fcdc5d83SBram Moolenaar      echo one
2979fcdc5d83SBram Moolenaar  END
2980fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2981fcdc5d83SBram Moolenaar
2982fcdc5d83SBram Moolenaar  lines =<< trim END
2983fcdc5d83SBram Moolenaar      vim9script
2984fcdc5d83SBram Moolenaar      for i in range(1)
2985fcdc5d83SBram Moolenaar        var one = 'one'
2986fcdc5d83SBram Moolenaar        echo one
2987fcdc5d83SBram Moolenaar      endfor
2988fcdc5d83SBram Moolenaar      echo one
2989fcdc5d83SBram Moolenaar  END
2990fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
29919becdf2bSBram Moolenaar
29929becdf2bSBram Moolenaar  lines =<< trim END
29939becdf2bSBram Moolenaar      vim9script
29949becdf2bSBram Moolenaar      {
29959becdf2bSBram Moolenaar        var one = 'one'
29969becdf2bSBram Moolenaar        assert_equal('one', one)
29979becdf2bSBram Moolenaar      }
29989becdf2bSBram Moolenaar      assert_false(exists('one'))
29999becdf2bSBram Moolenaar      assert_false(exists('s:one'))
30009becdf2bSBram Moolenaar  END
30019becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
30029becdf2bSBram Moolenaar
30039becdf2bSBram Moolenaar  lines =<< trim END
30049becdf2bSBram Moolenaar      vim9script
30059becdf2bSBram Moolenaar      {
30069becdf2bSBram Moolenaar        var one = 'one'
30079becdf2bSBram Moolenaar        echo one
30089becdf2bSBram Moolenaar      }
30099becdf2bSBram Moolenaar      echo one
30109becdf2bSBram Moolenaar  END
30119becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3012fcdc5d83SBram Moolenaarenddef
3013fcdc5d83SBram Moolenaar
3014352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3015352134bbSBram Moolenaar  var lines =<< trim END
3016352134bbSBram Moolenaar    vim9script
3017352134bbSBram Moolenaar    def Callback(...l: any)
3018352134bbSBram Moolenaar      try
3019352134bbSBram Moolenaar        var x: string
3020352134bbSBram Moolenaar        var y: string
3021352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3022352134bbSBram Moolenaar        [x, y] = ['']
3023352134bbSBram Moolenaar      catch
3024352134bbSBram Moolenaar        g:caught = 'yes'
3025352134bbSBram Moolenaar      endtry
3026352134bbSBram Moolenaar    enddef
3027e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3028352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3029352134bbSBram Moolenaar  END
3030352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3031352134bbSBram Moolenaar
3032352134bbSBram Moolenaar  unlet g:caught
3033352134bbSBram Moolenaarenddef
3034352134bbSBram Moolenaar
3035631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3036631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3037631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3038631e8f93SBram Moolenaar  endif
3039631e8f93SBram Moolenaar  var lines =<< trim END
3040631e8f93SBram Moolenaar      vim9script
3041631e8f93SBram Moolenaar      var source: list<number>
3042631e8f93SBram Moolenaar      def Out_cb(...l: any)
3043631e8f93SBram Moolenaar          eval [][0]
3044631e8f93SBram Moolenaar      enddef
3045631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3046631e8f93SBram Moolenaar          sleep 1m
3047631e8f93SBram Moolenaar          source += l
3048631e8f93SBram Moolenaar      enddef
3049e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
3050631e8f93SBram Moolenaar      sleep 100m
3051631e8f93SBram Moolenaar  END
3052631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3053631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3054631e8f93SBram Moolenaar  delete('Xdef')
3055631e8f93SBram Moolenaarenddef
3056631e8f93SBram Moolenaar
3057b4bcea47SBram Moolenaardef Test_put_with_linebreak()
3058b4bcea47SBram Moolenaar  new
3059b4bcea47SBram Moolenaar  var lines =<< trim END
3060b4bcea47SBram Moolenaar    vim9script
3061b4bcea47SBram Moolenaar    pu =split('abc', '\zs')
3062b4bcea47SBram Moolenaar            ->join()
3063b4bcea47SBram Moolenaar  END
3064b4bcea47SBram Moolenaar  CheckScriptSuccess(lines)
3065b4bcea47SBram Moolenaar  getline(2)->assert_equal('a b c')
3066b4bcea47SBram Moolenaar  bwipe!
3067b4bcea47SBram Moolenaarenddef
3068b4bcea47SBram Moolenaar
30694324d87aSBram Moolenaardef InvokeNormal()
30704324d87aSBram Moolenaar  exe "norm! :m+1\r"
30714324d87aSBram Moolenaarenddef
30724324d87aSBram Moolenaar
30734324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
30744324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
30754324d87aSBram Moolenaar  new
30764324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
30774324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
30784324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
30794324d87aSBram Moolenaar  xunmap <F3>
3080*b5b9480eSBram Moolenaarenddef
3081*b5b9480eSBram Moolenaar
3082*b5b9480eSBram Moolenaardef Test_white_space_after_command()
3083*b5b9480eSBram Moolenaar  var lines =<< trim END
3084*b5b9480eSBram Moolenaar    exit_cb: Func})
3085*b5b9480eSBram Moolenaar  END
3086*b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
30874324d87aSBram Moolenaarenddef
30884324d87aSBram Moolenaar
3089585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3090585fea7bSBram Moolenaardef Test_substitute_cmd()
3091585fea7bSBram Moolenaar  new
3092585fea7bSBram Moolenaar  setline(1, 'something')
3093585fea7bSBram Moolenaar  :substitute(some(other(
3094585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3095585fea7bSBram Moolenaar  bwipe!
3096585fea7bSBram Moolenaar
3097f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3098cfcd011fSBram Moolenaar  var lines =<< trim END
3099585fea7bSBram Moolenaar    vim9script
3100585fea7bSBram Moolenaar    new
3101585fea7bSBram Moolenaar    setline(1, 'something')
3102585fea7bSBram Moolenaar    :substitute(some(other(
3103585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3104585fea7bSBram Moolenaar    bwipe!
3105585fea7bSBram Moolenaar  END
3106585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3107585fea7bSBram Moolenaar  source Xvim9lines
3108585fea7bSBram Moolenaar
3109585fea7bSBram Moolenaar  delete('Xvim9lines')
3110585fea7bSBram Moolenaarenddef
3111585fea7bSBram Moolenaar
31128a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3113