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!
26025cb1caSBram Moolenaar
27025cb1caSBram Moolenaar  # won't generate anything
28025cb1caSBram Moolenaar  if false
29025cb1caSBram Moolenaar    :123
30025cb1caSBram Moolenaar  endif
315d72ce69SBram Moolenaarenddef
325d72ce69SBram Moolenaar
33a6e67e4fSBram Moolenaarlet g:alist = [7]
34a6e67e4fSBram Moolenaarlet g:astring = 'text'
35f0b9f43cSBram Moolenaarlet g:anumber = 123
366e587dcbSBram Moolenaar
374c17ad94SBram Moolenaardef Test_delfunction()
38f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
394c17ad94SBram Moolenaar  CheckScriptSuccess([
404c17ad94SBram Moolenaar      'vim9script',
414c17ad94SBram Moolenaar      'func CheckMe()',
424c17ad94SBram Moolenaar      '  return 123',
434c17ad94SBram Moolenaar      'endfunc',
444c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
454c17ad94SBram Moolenaar      ])
464c17ad94SBram Moolenaar
47f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
484c17ad94SBram Moolenaar  CheckScriptFailure([
494c17ad94SBram Moolenaar      'vim9script',
504c17ad94SBram Moolenaar      'func DeleteMe1()',
514c17ad94SBram Moolenaar      'endfunc',
524c17ad94SBram Moolenaar      'delfunction DeleteMe1',
534c17ad94SBram Moolenaar      ], 'E1084:')
544c17ad94SBram Moolenaar  CheckScriptFailure([
554c17ad94SBram Moolenaar      'vim9script',
564c17ad94SBram Moolenaar      'func DeleteMe2()',
574c17ad94SBram Moolenaar      'endfunc',
584c17ad94SBram Moolenaar      'def DoThat()',
594c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
604c17ad94SBram Moolenaar      'enddef',
614c17ad94SBram Moolenaar      'DoThat()',
624c17ad94SBram Moolenaar      ], 'E1084:')
634c17ad94SBram Moolenaar  CheckScriptFailure([
644c17ad94SBram Moolenaar      'vim9script',
654c17ad94SBram Moolenaar      'def DeleteMe3()',
664c17ad94SBram Moolenaar      'enddef',
674c17ad94SBram Moolenaar      'delfunction DeleteMe3',
684c17ad94SBram Moolenaar      ], 'E1084:')
694c17ad94SBram Moolenaar  CheckScriptFailure([
704c17ad94SBram Moolenaar      'vim9script',
714c17ad94SBram Moolenaar      'def DeleteMe4()',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'def DoThat()',
744c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
754c17ad94SBram Moolenaar      'enddef',
764c17ad94SBram Moolenaar      'DoThat()',
774c17ad94SBram Moolenaar      ], 'E1084:')
78925e9fd6SBram Moolenaar
79925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
80cfcd011fSBram Moolenaar  var lines =<< trim END
81925e9fd6SBram Moolenaar      vim9script
82925e9fd6SBram Moolenaar      def g:Global(): string
83925e9fd6SBram Moolenaar        return "yes"
84925e9fd6SBram Moolenaar      enddef
85925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
86925e9fd6SBram Moolenaar      def! g:Global(): string
87925e9fd6SBram Moolenaar        return "no"
88925e9fd6SBram Moolenaar      enddef
89925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
90925e9fd6SBram Moolenaar      delfunc g:Global
91925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
92925e9fd6SBram Moolenaar  END
93925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
94925e9fd6SBram Moolenaar
95925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
96925e9fd6SBram Moolenaar  lines =<< trim END
97925e9fd6SBram Moolenaar      vim9script
98925e9fd6SBram Moolenaar      func g:Global()
99925e9fd6SBram Moolenaar        return "yes"
100925e9fd6SBram Moolenaar      endfunc
101925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
102925e9fd6SBram Moolenaar      def! g:Global(): string
103925e9fd6SBram Moolenaar        return "no"
104925e9fd6SBram Moolenaar      enddef
105925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
106925e9fd6SBram Moolenaar      delfunc g:Global
107925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
108925e9fd6SBram Moolenaar  END
109925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
110925e9fd6SBram Moolenaar
111925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
112925e9fd6SBram Moolenaar  lines =<< trim END
113925e9fd6SBram Moolenaar      vim9script
114925e9fd6SBram Moolenaar      def g:Global(): string
115925e9fd6SBram Moolenaar        return "yes"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
118925e9fd6SBram Moolenaar      func! g:Global()
119925e9fd6SBram Moolenaar        return "no"
120925e9fd6SBram Moolenaar      endfunc
121925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
122925e9fd6SBram Moolenaar      delfunc g:Global
123925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
124925e9fd6SBram Moolenaar  END
125925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1264c17ad94SBram Moolenaarenddef
1274c17ad94SBram Moolenaar
12808052228SBram Moolenaardef Test_wrong_type()
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
131cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
133599c89c8SBram Moolenaar
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13642a480bfSBram Moolenaar
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
148a0a9f43aSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
15108052228SBram Moolenaarenddef
1528a7d6542SBram Moolenaar
15310c65860SBram Moolenaardef Test_script_wrong_type()
15410c65860SBram Moolenaar  var lines =<< trim END
15510c65860SBram Moolenaar      vim9script
15610c65860SBram Moolenaar      var s:dict: dict<string>
15710c65860SBram Moolenaar      s:dict['a'] = ['x']
15810c65860SBram Moolenaar  END
15910c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
16010c65860SBram Moolenaarenddef
16110c65860SBram Moolenaar
16208052228SBram Moolenaardef Test_const()
163cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
164cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
165cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16630fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16730fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
168dbeecb2bSBram Moolenaar
169cfcd011fSBram Moolenaar  var lines =<< trim END
17030fd8204SBram Moolenaar    final list = [1, 2, 3]
171dbeecb2bSBram Moolenaar    list[0] = 4
1720b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
17330fd8204SBram Moolenaar    const other = [5, 6, 7]
1740b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17571abe482SBram Moolenaar
176cfcd011fSBram Moolenaar    var varlist = [7, 8]
17730fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17871abe482SBram Moolenaar    varlist[0] = 77
17971abe482SBram Moolenaar    # TODO: does not work yet
18071abe482SBram Moolenaar    # constlist[1][1] = 88
181cfcd011fSBram Moolenaar    var cl = constlist[1]
18271abe482SBram Moolenaar    cl[1] = 88
18371abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
18471abe482SBram Moolenaar
185e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
186e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
18771abe482SBram Moolenaar    vardict['five'] = 55
18871abe482SBram Moolenaar    # TODO: does not work yet
18971abe482SBram Moolenaar    # constdict['two']['six'] = 66
190cfcd011fSBram Moolenaar    var cd = constdict['two']
19171abe482SBram Moolenaar    cd['six'] = 66
192e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
193dbeecb2bSBram Moolenaar  END
194dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19508052228SBram Moolenaarenddef
1968a7d6542SBram Moolenaar
1970b4c66c6SBram Moolenaardef Test_const_bang()
198cfcd011fSBram Moolenaar  var lines =<< trim END
19930fd8204SBram Moolenaar      const var = 234
2000b4c66c6SBram Moolenaar      var = 99
2010b4c66c6SBram Moolenaar  END
2020b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2030b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2040b4c66c6SBram Moolenaar
2050b4c66c6SBram Moolenaar  lines =<< trim END
20630fd8204SBram Moolenaar      const ll = [2, 3, 4]
2070b4c66c6SBram Moolenaar      ll[0] = 99
2080b4c66c6SBram Moolenaar  END
2090b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2100b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2110b4c66c6SBram Moolenaar
2120b4c66c6SBram Moolenaar  lines =<< trim END
21330fd8204SBram Moolenaar      const ll = [2, 3, 4]
2140b4c66c6SBram Moolenaar      ll[3] = 99
2150b4c66c6SBram Moolenaar  END
2160b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2170b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2180b4c66c6SBram Moolenaar
2190b4c66c6SBram Moolenaar  lines =<< trim END
220e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2210b4c66c6SBram Moolenaar      dd["one"] = 99
2220b4c66c6SBram Moolenaar  END
2230b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2240b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2250b4c66c6SBram Moolenaar
2260b4c66c6SBram Moolenaar  lines =<< trim END
227e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2280b4c66c6SBram Moolenaar      dd["three"] = 99
2290b4c66c6SBram Moolenaar  END
2300b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2310b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2320b4c66c6SBram Moolenaarenddef
2330b4c66c6SBram Moolenaar
234df069eecSBram Moolenaardef Test_range_no_colon()
235d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
236d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
237d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
238d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
239df069eecSBram Moolenaarenddef
240df069eecSBram Moolenaar
241df069eecSBram Moolenaar
2428a7d6542SBram Moolenaardef Test_block()
243cfcd011fSBram Moolenaar  var outer = 1
2448a7d6542SBram Moolenaar  {
245cfcd011fSBram Moolenaar    var inner = 2
2468a7d6542SBram Moolenaar    assert_equal(1, outer)
2478a7d6542SBram Moolenaar    assert_equal(2, inner)
2488a7d6542SBram Moolenaar  }
2498a7d6542SBram Moolenaar  assert_equal(1, outer)
2508a7d6542SBram Moolenaarenddef
2518a7d6542SBram Moolenaar
25208052228SBram Moolenaardef Test_block_failure()
253cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
25408052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25508052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25608052228SBram Moolenaarenddef
2578a7d6542SBram Moolenaar
258fbbcd003SBram Moolenaardef Test_block_local_vars()
259fbbcd003SBram Moolenaar  var lines =<< trim END
260fbbcd003SBram Moolenaar      vim9script
261ed234f24SBram Moolenaar      v:testing = 1
262fbbcd003SBram Moolenaar      if true
263ed234f24SBram Moolenaar        var text = ['hello']
264ed234f24SBram Moolenaar        def SayHello(): list<string>
265fbbcd003SBram Moolenaar          return text
266fbbcd003SBram Moolenaar        enddef
267fbbcd003SBram Moolenaar        def SetText(v: string)
268ed234f24SBram Moolenaar          text = [v]
269fbbcd003SBram Moolenaar        enddef
270fbbcd003SBram Moolenaar      endif
271fbbcd003SBram Moolenaar
272fbbcd003SBram Moolenaar      if true
273ed234f24SBram Moolenaar        var text = ['again']
274ed234f24SBram Moolenaar        def SayAgain(): list<string>
275fbbcd003SBram Moolenaar          return text
276fbbcd003SBram Moolenaar        enddef
277fbbcd003SBram Moolenaar      endif
278ed234f24SBram Moolenaar
279ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
280ed234f24SBram Moolenaar      test_garbagecollect_now()
281ed234f24SBram Moolenaar
282fbbcd003SBram Moolenaar      defcompile
283fbbcd003SBram Moolenaar
284ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
285ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
286fbbcd003SBram Moolenaar
287fbbcd003SBram Moolenaar      SetText('foobar')
288ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
289ed234f24SBram Moolenaar
290ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
291ed234f24SBram Moolenaar      qall!
292fbbcd003SBram Moolenaar  END
293ed234f24SBram Moolenaar
294ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
295ed234f24SBram Moolenaar  # context gets garbage collected.
296ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
297ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
298ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
299ed234f24SBram Moolenaar
300ed234f24SBram Moolenaar  delete('Xscript')
301ed234f24SBram Moolenaar  delete('Xdidit')
302fbbcd003SBram Moolenaarenddef
303fbbcd003SBram Moolenaar
30439ca4127SBram Moolenaardef Test_block_local_vars_with_func()
30539ca4127SBram Moolenaar  var lines =<< trim END
30639ca4127SBram Moolenaar      vim9script
30739ca4127SBram Moolenaar      if true
30839ca4127SBram Moolenaar        var foo = 'foo'
30939ca4127SBram Moolenaar        if true
31039ca4127SBram Moolenaar          var bar = 'bar'
31139ca4127SBram Moolenaar          def Func(): list<string>
31239ca4127SBram Moolenaar            return [foo, bar]
31339ca4127SBram Moolenaar          enddef
31439ca4127SBram Moolenaar        endif
31539ca4127SBram Moolenaar      endif
31639ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
31739ca4127SBram Moolenaar      # "foo" and "bar"
31839ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
31939ca4127SBram Moolenaar  END
32039ca4127SBram Moolenaar  CheckScriptSuccess(lines)
32139ca4127SBram Moolenaarenddef
32239ca4127SBram Moolenaar
323d032f34aSBram Moolenaarfunc g:NoSuchFunc()
324d032f34aSBram Moolenaar  echo 'none'
325d032f34aSBram Moolenaarendfunc
326d032f34aSBram Moolenaar
3278a7d6542SBram Moolenaardef Test_try_catch()
328cfcd011fSBram Moolenaar  var l = []
3297a092245SBram Moolenaar  try # comment
3308a7d6542SBram Moolenaar    add(l, '1')
3318a7d6542SBram Moolenaar    throw 'wrong'
3328a7d6542SBram Moolenaar    add(l, '2')
3337a092245SBram Moolenaar  catch # comment
3348a7d6542SBram Moolenaar    add(l, v:exception)
3357a092245SBram Moolenaar  finally # comment
3368a7d6542SBram Moolenaar    add(l, '3')
3377a092245SBram Moolenaar  endtry # comment
3388a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
33968d130c6SBram Moolenaar
340e859312eSBram Moolenaar  l = []
341e859312eSBram Moolenaar  try
342e859312eSBram Moolenaar    try
343e859312eSBram Moolenaar      add(l, '1')
344e859312eSBram Moolenaar      throw 'wrong'
345e859312eSBram Moolenaar      add(l, '2')
346e859312eSBram Moolenaar    catch /right/
347e859312eSBram Moolenaar      add(l, v:exception)
348e859312eSBram Moolenaar    endtry
349e859312eSBram Moolenaar  catch /wrong/
350e859312eSBram Moolenaar    add(l, 'caught')
351373863edSBram Moolenaar  fina
352e859312eSBram Moolenaar    add(l, 'finally')
353e859312eSBram Moolenaar  endtry
354e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
355e859312eSBram Moolenaar
356cfcd011fSBram Moolenaar  var n: number
35768d130c6SBram Moolenaar  try
35868d130c6SBram Moolenaar    n = l[3]
35968d130c6SBram Moolenaar  catch /E684:/
36068d130c6SBram Moolenaar    n = 99
36168d130c6SBram Moolenaar  endtry
36268d130c6SBram Moolenaar  assert_equal(99, n)
36368d130c6SBram Moolenaar
36468d130c6SBram Moolenaar  try
365cc673e74SBram Moolenaar    # string slice returns a string, not a number
36668d130c6SBram Moolenaar    n = g:astring[3]
3675e654230SBram Moolenaar  catch /E1012:/
36868d130c6SBram Moolenaar    n = 77
36968d130c6SBram Moolenaar  endtry
37068d130c6SBram Moolenaar  assert_equal(77, n)
37168d130c6SBram Moolenaar
37268d130c6SBram Moolenaar  try
37368d130c6SBram Moolenaar    n = l[g:astring]
3745e654230SBram Moolenaar  catch /E1012:/
37556acb094SBram Moolenaar    n = 88
37668d130c6SBram Moolenaar  endtry
37756acb094SBram Moolenaar  assert_equal(88, n)
37868d130c6SBram Moolenaar
37968d130c6SBram Moolenaar  try
38068d130c6SBram Moolenaar    n = s:does_not_exist
38168d130c6SBram Moolenaar  catch /E121:/
382f0b9f43cSBram Moolenaar    n = 111
383f0b9f43cSBram Moolenaar  endtry
384f0b9f43cSBram Moolenaar  assert_equal(111, n)
385f0b9f43cSBram Moolenaar
386f0b9f43cSBram Moolenaar  try
387f0b9f43cSBram Moolenaar    n = g:does_not_exist
388f0b9f43cSBram Moolenaar  catch /E121:/
38968d130c6SBram Moolenaar    n = 121
39068d130c6SBram Moolenaar  endtry
39168d130c6SBram Moolenaar  assert_equal(121, n)
39268d130c6SBram Moolenaar
393e0de171eSBram Moolenaar  var d = {one: 1}
39468d130c6SBram Moolenaar  try
39568d130c6SBram Moolenaar    n = d[g:astring]
39668d130c6SBram Moolenaar  catch /E716:/
39768d130c6SBram Moolenaar    n = 222
39868d130c6SBram Moolenaar  endtry
39968d130c6SBram Moolenaar  assert_equal(222, n)
400f0b9f43cSBram Moolenaar
401f0b9f43cSBram Moolenaar  try
402f0b9f43cSBram Moolenaar    n = -g:astring
403f0b9f43cSBram Moolenaar  catch /E39:/
404f0b9f43cSBram Moolenaar    n = 233
405f0b9f43cSBram Moolenaar  endtry
406f0b9f43cSBram Moolenaar  assert_equal(233, n)
407f0b9f43cSBram Moolenaar
408f0b9f43cSBram Moolenaar  try
409f0b9f43cSBram Moolenaar    n = +g:astring
410f0b9f43cSBram Moolenaar  catch /E1030:/
411f0b9f43cSBram Moolenaar    n = 244
412f0b9f43cSBram Moolenaar  endtry
413f0b9f43cSBram Moolenaar  assert_equal(244, n)
414f0b9f43cSBram Moolenaar
415f0b9f43cSBram Moolenaar  try
416f0b9f43cSBram Moolenaar    n = +g:alist
417f0b9f43cSBram Moolenaar  catch /E745:/
418f0b9f43cSBram Moolenaar    n = 255
419f0b9f43cSBram Moolenaar  endtry
420f0b9f43cSBram Moolenaar  assert_equal(255, n)
421f0b9f43cSBram Moolenaar
422cfcd011fSBram Moolenaar  var nd: dict<any>
423f0b9f43cSBram Moolenaar  try
4242bede173SBram Moolenaar    nd = {[g:anumber]: 1}
4255e654230SBram Moolenaar  catch /E1012:/
426f0b9f43cSBram Moolenaar    n = 266
427f0b9f43cSBram Moolenaar  endtry
428f0b9f43cSBram Moolenaar  assert_equal(266, n)
429f0b9f43cSBram Moolenaar
430f0b9f43cSBram Moolenaar  try
431f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
432f0b9f43cSBram Moolenaar  catch /E1093:/
433f0b9f43cSBram Moolenaar    n = 277
434f0b9f43cSBram Moolenaar  endtry
435f0b9f43cSBram Moolenaar  assert_equal(277, n)
436f0b9f43cSBram Moolenaar
437e859312eSBram Moolenaar  try
438e859312eSBram Moolenaar    &ts = g:astring
4395e654230SBram Moolenaar  catch /E1012:/
440e859312eSBram Moolenaar    n = 288
441e859312eSBram Moolenaar  endtry
442e859312eSBram Moolenaar  assert_equal(288, n)
443e859312eSBram Moolenaar
444e859312eSBram Moolenaar  try
445e859312eSBram Moolenaar    &backspace = 'asdf'
446e859312eSBram Moolenaar  catch /E474:/
447e859312eSBram Moolenaar    n = 299
448e859312eSBram Moolenaar  endtry
449e859312eSBram Moolenaar  assert_equal(299, n)
450e859312eSBram Moolenaar
451e859312eSBram Moolenaar  l = [1]
452e859312eSBram Moolenaar  try
453e859312eSBram Moolenaar    l[3] = 3
454e859312eSBram Moolenaar  catch /E684:/
455e859312eSBram Moolenaar    n = 300
456e859312eSBram Moolenaar  endtry
457e859312eSBram Moolenaar  assert_equal(300, n)
458e859312eSBram Moolenaar
459e859312eSBram Moolenaar  try
460e859312eSBram Moolenaar    unlet g:does_not_exist
461e859312eSBram Moolenaar  catch /E108:/
462e859312eSBram Moolenaar    n = 322
463e859312eSBram Moolenaar  endtry
464e859312eSBram Moolenaar  assert_equal(322, n)
465e859312eSBram Moolenaar
466e859312eSBram Moolenaar  try
4672bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
468e859312eSBram Moolenaar  catch /E721:/
469e859312eSBram Moolenaar    n = 333
470e859312eSBram Moolenaar  endtry
471e859312eSBram Moolenaar  assert_equal(333, n)
472e859312eSBram Moolenaar
473e859312eSBram Moolenaar  try
474e859312eSBram Moolenaar    l = DeletedFunc()
475e859312eSBram Moolenaar  catch /E933:/
476e859312eSBram Moolenaar    n = 344
477e859312eSBram Moolenaar  endtry
478e859312eSBram Moolenaar  assert_equal(344, n)
479d032f34aSBram Moolenaar
480d032f34aSBram Moolenaar  try
481d032f34aSBram Moolenaar    echo len(v:true)
482d032f34aSBram Moolenaar  catch /E701:/
483d032f34aSBram Moolenaar    n = 355
484d032f34aSBram Moolenaar  endtry
485d032f34aSBram Moolenaar  assert_equal(355, n)
486d032f34aSBram Moolenaar
487cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
488d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
489d032f34aSBram Moolenaar  try
490d032f34aSBram Moolenaar    echo P()
491d032f34aSBram Moolenaar  catch /E117:/
492d032f34aSBram Moolenaar    n = 366
493d032f34aSBram Moolenaar  endtry
494d032f34aSBram Moolenaar  assert_equal(366, n)
495d032f34aSBram Moolenaar
496d032f34aSBram Moolenaar  try
497d032f34aSBram Moolenaar    echo g:NoSuchFunc()
498d032f34aSBram Moolenaar  catch /E117:/
499d032f34aSBram Moolenaar    n = 377
500d032f34aSBram Moolenaar  endtry
501d032f34aSBram Moolenaar  assert_equal(377, n)
502d032f34aSBram Moolenaar
503d032f34aSBram Moolenaar  try
504d032f34aSBram Moolenaar    echo g:alist + 4
505d032f34aSBram Moolenaar  catch /E745:/
506d032f34aSBram Moolenaar    n = 388
507d032f34aSBram Moolenaar  endtry
508d032f34aSBram Moolenaar  assert_equal(388, n)
509d032f34aSBram Moolenaar
510d032f34aSBram Moolenaar  try
511d032f34aSBram Moolenaar    echo 4 + g:alist
512d032f34aSBram Moolenaar  catch /E745:/
513d032f34aSBram Moolenaar    n = 399
514d032f34aSBram Moolenaar  endtry
515d032f34aSBram Moolenaar  assert_equal(399, n)
516d032f34aSBram Moolenaar
517d032f34aSBram Moolenaar  try
518d032f34aSBram Moolenaar    echo g:alist.member
519d032f34aSBram Moolenaar  catch /E715:/
520d032f34aSBram Moolenaar    n = 400
521d032f34aSBram Moolenaar  endtry
522d032f34aSBram Moolenaar  assert_equal(400, n)
523d032f34aSBram Moolenaar
524d032f34aSBram Moolenaar  try
525d032f34aSBram Moolenaar    echo d.member
526d032f34aSBram Moolenaar  catch /E716:/
527d032f34aSBram Moolenaar    n = 411
528d032f34aSBram Moolenaar  endtry
529d032f34aSBram Moolenaar  assert_equal(411, n)
5308a7d6542SBram Moolenaarenddef
5318a7d6542SBram Moolenaar
532e859312eSBram Moolenaardef DeletedFunc(): list<any>
533e859312eSBram Moolenaar  return ['delete me']
534e859312eSBram Moolenaarenddef
535e859312eSBram Moolenaardefcompile
536e859312eSBram Moolenaardelfunc DeletedFunc
537e859312eSBram Moolenaar
538257cc5eeSBram Moolenaardef ThrowFromDef()
539a72cfb80SBram Moolenaar  throw "getout" # comment
540257cc5eeSBram Moolenaarenddef
541257cc5eeSBram Moolenaar
542257cc5eeSBram Moolenaarfunc CatchInFunc()
543257cc5eeSBram Moolenaar  try
544257cc5eeSBram Moolenaar    call ThrowFromDef()
545257cc5eeSBram Moolenaar  catch
546257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
547257cc5eeSBram Moolenaar  endtry
548257cc5eeSBram Moolenaarendfunc
549257cc5eeSBram Moolenaar
550257cc5eeSBram Moolenaardef CatchInDef()
551257cc5eeSBram Moolenaar  try
552257cc5eeSBram Moolenaar    ThrowFromDef()
553257cc5eeSBram Moolenaar  catch
554257cc5eeSBram Moolenaar    g:thrown_def = v:exception
555257cc5eeSBram Moolenaar  endtry
556257cc5eeSBram Moolenaarenddef
557257cc5eeSBram Moolenaar
558f575adffSBram Moolenaardef ReturnFinally(): string
559f575adffSBram Moolenaar  try
560f575adffSBram Moolenaar    return 'intry'
561373863edSBram Moolenaar  finall
562f575adffSBram Moolenaar    g:in_finally = 'finally'
563f575adffSBram Moolenaar  endtry
564f575adffSBram Moolenaar  return 'end'
565f575adffSBram Moolenaarenddef
566f575adffSBram Moolenaar
567257cc5eeSBram Moolenaardef Test_try_catch_nested()
568257cc5eeSBram Moolenaar  CatchInFunc()
569257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
570257cc5eeSBram Moolenaar
571257cc5eeSBram Moolenaar  CatchInDef()
572257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
573f575adffSBram Moolenaar
574f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
575f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
576f575adffSBram Moolenaarenddef
577f575adffSBram Moolenaar
5789939f57bSBram Moolenaardef TryOne(): number
5799939f57bSBram Moolenaar  try
5809939f57bSBram Moolenaar    return 0
5819939f57bSBram Moolenaar  catch
5829939f57bSBram Moolenaar  endtry
5839939f57bSBram Moolenaar  return 0
5849939f57bSBram Moolenaarenddef
5859939f57bSBram Moolenaar
5869939f57bSBram Moolenaardef TryTwo(n: number): string
5879939f57bSBram Moolenaar  try
588cfcd011fSBram Moolenaar    var x = {}
5899939f57bSBram Moolenaar  catch
5909939f57bSBram Moolenaar  endtry
5919939f57bSBram Moolenaar  return 'text'
5929939f57bSBram Moolenaarenddef
5939939f57bSBram Moolenaar
5949939f57bSBram Moolenaardef Test_try_catch_twice()
5959939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5969939f57bSBram Moolenaarenddef
5979939f57bSBram Moolenaar
598f575adffSBram Moolenaardef Test_try_catch_match()
599cfcd011fSBram Moolenaar  var seq = 'a'
600f575adffSBram Moolenaar  try
601f575adffSBram Moolenaar    throw 'something'
602f575adffSBram Moolenaar  catch /nothing/
603f575adffSBram Moolenaar    seq ..= 'x'
604f575adffSBram Moolenaar  catch /some/
605f575adffSBram Moolenaar    seq ..= 'b'
606f575adffSBram Moolenaar  catch /asdf/
607f575adffSBram Moolenaar    seq ..= 'x'
608e8c4abbbSBram Moolenaar  catch ?a\?sdf?
609e8c4abbbSBram Moolenaar    seq ..= 'y'
610f575adffSBram Moolenaar  finally
611f575adffSBram Moolenaar    seq ..= 'c'
612f575adffSBram Moolenaar  endtry
613f575adffSBram Moolenaar  assert_equal('abc', seq)
614257cc5eeSBram Moolenaarenddef
615257cc5eeSBram Moolenaar
616e8c4abbbSBram Moolenaardef Test_try_catch_fails()
617d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
618d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
619d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
620d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
621d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
622d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
623d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
624d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
62513106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
626d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
627585fea7bSBram Moolenaar
628e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
629d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
630e8c4abbbSBram Moolenaarenddef
631e8c4abbbSBram Moolenaar
632006ad48bSBram Moolenaardef Test_throw_vimscript()
633f5be8cdbSBram Moolenaar  # only checks line continuation
634cfcd011fSBram Moolenaar  var lines =<< trim END
635006ad48bSBram Moolenaar      vim9script
636006ad48bSBram Moolenaar      try
637006ad48bSBram Moolenaar        throw 'one'
638006ad48bSBram Moolenaar              .. 'two'
639006ad48bSBram Moolenaar      catch
640006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
641006ad48bSBram Moolenaar      endtry
642006ad48bSBram Moolenaar  END
643006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
6441e021e63SBram Moolenaar
6451e021e63SBram Moolenaar  lines =<< trim END
6461e021e63SBram Moolenaar    vim9script
647352134bbSBram Moolenaar    @r = ''
6481e021e63SBram Moolenaar    def Func()
6491e021e63SBram Moolenaar      throw @r
6501e021e63SBram Moolenaar    enddef
6511e021e63SBram Moolenaar    var result = ''
6521e021e63SBram Moolenaar    try
6531e021e63SBram Moolenaar      Func()
6541e021e63SBram Moolenaar    catch /E1129:/
6551e021e63SBram Moolenaar      result = 'caught'
6561e021e63SBram Moolenaar    endtry
6571e021e63SBram Moolenaar    assert_equal('caught', result)
6581e021e63SBram Moolenaar  END
6591e021e63SBram Moolenaar  CheckScriptSuccess(lines)
660006ad48bSBram Moolenaarenddef
661006ad48bSBram Moolenaar
662ed677f55SBram Moolenaardef Test_error_in_nested_function()
663ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
664cfcd011fSBram Moolenaar  var lines =<< trim END
665ed677f55SBram Moolenaar      vim9script
666ed677f55SBram Moolenaar      def Func()
667ed677f55SBram Moolenaar        Error()
668ed677f55SBram Moolenaar        g:test_var = 1
669ed677f55SBram Moolenaar      enddef
670ed677f55SBram Moolenaar      func Error() abort
671ed677f55SBram Moolenaar        eval [][0]
672ed677f55SBram Moolenaar      endfunc
673ed677f55SBram Moolenaar      Func()
674ed677f55SBram Moolenaar  END
675ed677f55SBram Moolenaar  g:test_var = 0
676ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
677ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
678ed677f55SBram Moolenaarenddef
679ed677f55SBram Moolenaar
68037c83711SBram Moolenaardef Test_cexpr_vimscript()
681f5be8cdbSBram Moolenaar  # only checks line continuation
68237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
683cfcd011fSBram Moolenaar  var lines =<< trim END
68437c83711SBram Moolenaar      vim9script
68537c83711SBram Moolenaar      cexpr 'File'
68637c83711SBram Moolenaar                .. ' someFile' ..
68737c83711SBram Moolenaar                   ' line 19'
68837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
68937c83711SBram Moolenaar  END
69037c83711SBram Moolenaar  CheckScriptSuccess(lines)
69137c83711SBram Moolenaar  set errorformat&
69237c83711SBram Moolenaarenddef
69337c83711SBram Moolenaar
694c9edd6b5SBram Moolenaardef Test_statusline_syntax()
695c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
696cfcd011fSBram Moolenaar  var lines =<< trim END
697c9edd6b5SBram Moolenaar      vim9script
698c9edd6b5SBram Moolenaar      func g:Status()
699c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
700c9edd6b5SBram Moolenaar      endfunc
701c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
702c9edd6b5SBram Moolenaar      redrawstatus
703c9edd6b5SBram Moolenaar      set laststatus statusline=
704c9edd6b5SBram Moolenaar  END
705c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
706c9edd6b5SBram Moolenaarenddef
707c9edd6b5SBram Moolenaar
708b209750bSBram Moolenaardef Test_list_vimscript()
709b209750bSBram Moolenaar  # checks line continuation and comments
710cfcd011fSBram Moolenaar  var lines =<< trim END
711b209750bSBram Moolenaar      vim9script
712cfcd011fSBram Moolenaar      var mylist = [
713b209750bSBram Moolenaar            'one',
714b209750bSBram Moolenaar            # comment
715b209750bSBram Moolenaar            'two', # empty line follows
716b209750bSBram Moolenaar
717b209750bSBram Moolenaar            'three',
718b209750bSBram Moolenaar            ]
719b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
720b209750bSBram Moolenaar  END
721b209750bSBram Moolenaar  CheckScriptSuccess(lines)
72266250c93SBram Moolenaar
72366250c93SBram Moolenaar  # check all lines from heredoc are kept
72466250c93SBram Moolenaar  lines =<< trim END
72566250c93SBram Moolenaar      # comment 1
72666250c93SBram Moolenaar      two
72766250c93SBram Moolenaar      # comment 3
72866250c93SBram Moolenaar
72966250c93SBram Moolenaar      five
73066250c93SBram Moolenaar      # comment 6
73166250c93SBram Moolenaar  END
73266250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
733b209750bSBram Moolenaarenddef
734b209750bSBram Moolenaar
7352a1381c3SBram Moolenaarif has('channel')
73640ee466cSBram Moolenaar  let someJob = test_null_job()
73740ee466cSBram Moolenaar
73840ee466cSBram Moolenaar  def FuncWithError()
73940ee466cSBram Moolenaar    echomsg g:someJob
74040ee466cSBram Moolenaar  enddef
74140ee466cSBram Moolenaar
74240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
74340ee466cSBram Moolenaar    try
74440ee466cSBram Moolenaar      call FuncWithError()
74540ee466cSBram Moolenaar    catch
74640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
74740ee466cSBram Moolenaar    endtry
74840ee466cSBram Moolenaar  endfunc
7492a1381c3SBram Moolenaarendif
75040ee466cSBram Moolenaar
7518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7528a7d6542SBram Moolenaar  vim9script
753cfcd011fSBram Moolenaar  var name: string = 'bob'
7548a7d6542SBram Moolenaar  def Concat(arg: string): string
7558a7d6542SBram Moolenaar    return name .. arg
7568a7d6542SBram Moolenaar  enddef
757227a69deSBram Moolenaar  g:result = Concat('bie')
758227a69deSBram Moolenaar  g:localname = name
7598a7d6542SBram Moolenaar
7608a7d6542SBram Moolenaar  export const CONST = 1234
761cfcd011fSBram Moolenaar  export var exported = 9876
762cfcd011fSBram Moolenaar  export var exp_name = 'John'
7638a7d6542SBram Moolenaar  export def Exported(): string
7648a7d6542SBram Moolenaar    return 'Exported'
7658a7d6542SBram Moolenaar  enddef
7668a7d6542SBram MoolenaarEND
7678a7d6542SBram Moolenaar
768b3ca9824SBram Moolenaardef Undo_export_script_lines()
769b3ca9824SBram Moolenaar  unlet g:result
770b3ca9824SBram Moolenaar  unlet g:localname
771b3ca9824SBram Moolenaarenddef
772b3ca9824SBram Moolenaar
7735269bd2aSBram Moolenaardef Test_vim9_import_export()
774cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7758a7d6542SBram Moolenaar    vim9script
7768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7778a7d6542SBram Moolenaar    g:imported = exported
7786e587dcbSBram Moolenaar    exported += 3
7796e587dcbSBram Moolenaar    g:imported_added = exported
7808a7d6542SBram Moolenaar    g:imported_func = Exported()
7816e587dcbSBram Moolenaar
78240f4f7a4SBram Moolenaar    def GetExported(): string
783e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
78440f4f7a4SBram Moolenaar      return local_dict.ref()
78540f4f7a4SBram Moolenaar    enddef
78640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
78740f4f7a4SBram Moolenaar
7886e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7896e587dcbSBram Moolenaar    g:imported_name = exp_name
7906e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7916e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7925381c7a1SBram Moolenaar    g:imported_later = exported
7938a7d6542SBram Moolenaar  END
7948a7d6542SBram Moolenaar
7958a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7968a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7978a7d6542SBram Moolenaar
7988a7d6542SBram Moolenaar  source Ximport.vim
7998a7d6542SBram Moolenaar
8008a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8018a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8028a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8036e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8045381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8058a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
80640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
8076e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8086e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8098a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8108a7d6542SBram Moolenaar
811b3ca9824SBram Moolenaar  Undo_export_script_lines()
8128a7d6542SBram Moolenaar  unlet g:imported
8136e587dcbSBram Moolenaar  unlet g:imported_added
8145381c7a1SBram Moolenaar  unlet g:imported_later
8158a7d6542SBram Moolenaar  unlet g:imported_func
8166e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
8178a7d6542SBram Moolenaar  delete('Ximport.vim')
818f2d5c240SBram Moolenaar
8191c991144SBram Moolenaar  # similar, with line breaks
820cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
8211c991144SBram Moolenaar    vim9script
8221c991144SBram Moolenaar    import {
8231c991144SBram Moolenaar        exported,
8241c991144SBram Moolenaar        Exported,
8251c991144SBram Moolenaar        }
8261c991144SBram Moolenaar        from
8271c991144SBram Moolenaar        './Xexport.vim'
8281c991144SBram Moolenaar    g:imported = exported
8291c991144SBram Moolenaar    exported += 5
8301c991144SBram Moolenaar    g:imported_added = exported
8311c991144SBram Moolenaar    g:imported_func = Exported()
8321c991144SBram Moolenaar  END
8331c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8341c991144SBram Moolenaar  source Ximport_lbr.vim
8351c991144SBram Moolenaar
8361c991144SBram Moolenaar  assert_equal(9876, g:imported)
8371c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8381c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8391c991144SBram Moolenaar
8401c991144SBram Moolenaar  # exported script not sourced again
8411c991144SBram Moolenaar  assert_false(exists('g:result'))
8421c991144SBram Moolenaar  unlet g:imported
8431c991144SBram Moolenaar  unlet g:imported_added
8441c991144SBram Moolenaar  unlet g:imported_func
8451c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8461c991144SBram Moolenaar
8471c991144SBram Moolenaar  # import inside :def function
848cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8495381c7a1SBram Moolenaar    vim9script
8505381c7a1SBram Moolenaar    def ImportInDef()
8515381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8525381c7a1SBram Moolenaar      g:imported = exported
8535381c7a1SBram Moolenaar      exported += 7
8545381c7a1SBram Moolenaar      g:imported_added = exported
8555381c7a1SBram Moolenaar    enddef
8565381c7a1SBram Moolenaar    ImportInDef()
8575381c7a1SBram Moolenaar  END
8585381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8595381c7a1SBram Moolenaar  source Ximport2.vim
860f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8615381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8625381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8635381c7a1SBram Moolenaar  unlet g:imported
8645381c7a1SBram Moolenaar  unlet g:imported_added
8655381c7a1SBram Moolenaar  delete('Ximport2.vim')
8665381c7a1SBram Moolenaar
867cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
868f2d5c240SBram Moolenaar    vim9script
869f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
870f2d5c240SBram Moolenaar    def UseExport()
871f2d5c240SBram Moolenaar      g:imported = Export.exported
872f2d5c240SBram Moolenaar    enddef
873f2d5c240SBram Moolenaar    UseExport()
874f2d5c240SBram Moolenaar  END
875f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
876f2d5c240SBram Moolenaar  source Ximport.vim
8775381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
878f2d5c240SBram Moolenaar
879cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
880599c89c8SBram Moolenaar    vim9script
881599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
882599c89c8SBram Moolenaar    def Func()
883cfcd011fSBram Moolenaar      var dummy = 1
884cfcd011fSBram Moolenaar      var imported = Export + dummy
885599c89c8SBram Moolenaar    enddef
886822ba247SBram Moolenaar    defcompile
887599c89c8SBram Moolenaar  END
888599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
88944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
890599c89c8SBram Moolenaar
891cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
892599c89c8SBram Moolenaar    vim9script
893599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
894599c89c8SBram Moolenaar    def Func()
895cfcd011fSBram Moolenaar      var imported = Export . exported
896599c89c8SBram Moolenaar    enddef
897822ba247SBram Moolenaar    defcompile
898599c89c8SBram Moolenaar  END
899599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
90044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
901599c89c8SBram Moolenaar
902cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
903599c89c8SBram Moolenaar    vim9script
904599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
905599c89c8SBram Moolenaar    def Func()
906cfcd011fSBram Moolenaar      var imported = Export.
907599c89c8SBram Moolenaar    enddef
908822ba247SBram Moolenaar    defcompile
909599c89c8SBram Moolenaar  END
910599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
91144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
912599c89c8SBram Moolenaar
913cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
9141c991144SBram Moolenaar    vim9script
9151c991144SBram Moolenaar    import *
9161c991144SBram Moolenaar        as Export
9171c991144SBram Moolenaar        from
9181c991144SBram Moolenaar        './Xexport.vim'
9191c991144SBram Moolenaar    def UseExport()
9201c991144SBram Moolenaar      g:imported = Export.exported
9211c991144SBram Moolenaar    enddef
9221c991144SBram Moolenaar    UseExport()
9231c991144SBram Moolenaar  END
9241c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9251c991144SBram Moolenaar  source Ximport.vim
9261c991144SBram Moolenaar  assert_equal(9883, g:imported)
9271c991144SBram Moolenaar
928cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
929f2d5c240SBram Moolenaar    vim9script
930f2d5c240SBram Moolenaar    import * from './Xexport.vim'
931f2d5c240SBram Moolenaar  END
932f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
93344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
934f2d5c240SBram Moolenaar
935f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
936cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
937fa29c8abSBram Moolenaar    vim9script
938fa29c8abSBram Moolenaar    import name from './Xexport.vim'
939fa29c8abSBram Moolenaar  END
940fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
94144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
942fa29c8abSBram Moolenaar
943f5be8cdbSBram Moolenaar  # try to import something that is already defined
944cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9455269bd2aSBram Moolenaar    vim9script
946cfcd011fSBram Moolenaar    var exported = 'something'
9475269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9485269bd2aSBram Moolenaar  END
9495269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
95044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9515269bd2aSBram Moolenaar
952f5be8cdbSBram Moolenaar  # try to import something that is already defined
9535269bd2aSBram Moolenaar  import_already_defined =<< trim END
9545269bd2aSBram Moolenaar    vim9script
955cfcd011fSBram Moolenaar    var exported = 'something'
9565269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9575269bd2aSBram Moolenaar  END
9585269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
95944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9605269bd2aSBram Moolenaar
961f5be8cdbSBram Moolenaar  # try to import something that is already defined
9625269bd2aSBram Moolenaar  import_already_defined =<< trim END
9635269bd2aSBram Moolenaar    vim9script
964cfcd011fSBram Moolenaar    var exported = 'something'
9655269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9665269bd2aSBram Moolenaar  END
9675269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
96844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9695269bd2aSBram Moolenaar
970918a4249SBram Moolenaar  # try changing an imported const
971918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
972918a4249SBram Moolenaar    vim9script
973918a4249SBram Moolenaar    import CONST from './Xexport.vim'
974918a4249SBram Moolenaar    def Assign()
975918a4249SBram Moolenaar      CONST = 987
976918a4249SBram Moolenaar    enddef
977918a4249SBram Moolenaar    defcompile
978918a4249SBram Moolenaar  END
979918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
980918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
981918a4249SBram Moolenaar
982f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
983cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
984fa29c8abSBram Moolenaar    vim9script
985fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
986fa29c8abSBram Moolenaar  END
987fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
98844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
989fa29c8abSBram Moolenaar
990cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
991fa29c8abSBram Moolenaar    vim9script
992fa29c8abSBram Moolenaar    import name './Xexport.vim'
993fa29c8abSBram Moolenaar  END
994fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
99544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
996fa29c8abSBram Moolenaar
997cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
998fa29c8abSBram Moolenaar    vim9script
999fa29c8abSBram Moolenaar    import name from Xexport.vim
1000fa29c8abSBram Moolenaar  END
1001fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
100244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1003fa29c8abSBram Moolenaar
1004cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1005fa29c8abSBram Moolenaar    vim9script
1006fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1007fa29c8abSBram Moolenaar  END
1008fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
100944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1010fa29c8abSBram Moolenaar
1011cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1012fa29c8abSBram Moolenaar    vim9script
1013fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1014fa29c8abSBram Moolenaar  END
10155269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
101644d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1017fa29c8abSBram Moolenaar
1018f2d5c240SBram Moolenaar  delete('Ximport.vim')
10195269bd2aSBram Moolenaar  delete('Ximport3.vim')
10208a7d6542SBram Moolenaar  delete('Xexport.vim')
10218a7d6542SBram Moolenaar
1022f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1023750802b5SBram Moolenaar  set cpo&vi
1024cfcd011fSBram Moolenaar  var cpo_before = &cpo
1025cfcd011fSBram Moolenaar  var lines =<< trim END
1026750802b5SBram Moolenaar    vim9script
1027750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1028750802b5SBram Moolenaar  END
1029750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1030750802b5SBram Moolenaar  source Xvim9_script
1031750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1032750802b5SBram Moolenaar  set cpo&vim
1033750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1034750802b5SBram Moolenaar  delete('Xvim9_script')
1035750802b5SBram Moolenaarenddef
1036750802b5SBram Moolenaar
1037803af686SBram Moolenaarfunc g:Trigger()
1038803af686SBram Moolenaar  source Ximport.vim
1039803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1040803af686SBram Moolenaarendfunc
1041803af686SBram Moolenaar
1042803af686SBram Moolenaardef Test_import_export_expr_map()
1043803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1044cfcd011fSBram Moolenaar  var export_lines =<< trim END
1045803af686SBram Moolenaar    vim9script
1046803af686SBram Moolenaar    export def That(): string
1047803af686SBram Moolenaar      return 'yes'
1048803af686SBram Moolenaar    enddef
1049803af686SBram Moolenaar  END
1050803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1051803af686SBram Moolenaar
1052cfcd011fSBram Moolenaar  var import_lines =<< trim END
1053803af686SBram Moolenaar    vim9script
1054803af686SBram Moolenaar    import That from './Xexport_that.vim'
1055803af686SBram Moolenaar    assert_equal('yes', That())
1056803af686SBram Moolenaar  END
1057803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1058803af686SBram Moolenaar
1059803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1060803af686SBram Moolenaar  feedkeys('trigger', "xt")
1061803af686SBram Moolenaar
1062730b2483SBram Moolenaar  delete('Xexport_that.vim')
1063803af686SBram Moolenaar  delete('Ximport.vim')
1064803af686SBram Moolenaar  nunmap trigger
1065803af686SBram Moolenaarenddef
1066803af686SBram Moolenaar
10678e1986e3SBram Moolenaardef Test_import_in_filetype()
10688e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10698e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1070cfcd011fSBram Moolenaar  var export_lines =<< trim END
10718e1986e3SBram Moolenaar    vim9script
1072cfcd011fSBram Moolenaar    export var That = 'yes'
10738e1986e3SBram Moolenaar  END
1074730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10758e1986e3SBram Moolenaar
1076cfcd011fSBram Moolenaar  var import_lines =<< trim END
10778e1986e3SBram Moolenaar    vim9script
1078730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10798e1986e3SBram Moolenaar    assert_equal('yes', That)
10808e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10818e1986e3SBram Moolenaar  END
10828e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10838e1986e3SBram Moolenaar
1084cfcd011fSBram Moolenaar  var save_rtp = &rtp
10858e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10868e1986e3SBram Moolenaar
10878e1986e3SBram Moolenaar  filetype plugin on
10888e1986e3SBram Moolenaar  copen
10898e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10908e1986e3SBram Moolenaar
10918e1986e3SBram Moolenaar  quit!
1092730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10938e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10948e1986e3SBram Moolenaar  &rtp = save_rtp
10958e1986e3SBram Moolenaarenddef
10968e1986e3SBram Moolenaar
1097efa94447SBram Moolenaardef Test_use_import_in_mapping()
1098cfcd011fSBram Moolenaar  var lines =<< trim END
1099efa94447SBram Moolenaar      vim9script
1100efa94447SBram Moolenaar      export def Funcx()
1101efa94447SBram Moolenaar        g:result = 42
1102efa94447SBram Moolenaar      enddef
1103efa94447SBram Moolenaar  END
1104efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1105efa94447SBram Moolenaar  lines =<< trim END
1106efa94447SBram Moolenaar      vim9script
1107efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1108b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1109efa94447SBram Moolenaar  END
1110efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1111efa94447SBram Moolenaar
1112efa94447SBram Moolenaar  source Xmapscript.vim
1113b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1114efa94447SBram Moolenaar  assert_equal(42, g:result)
1115efa94447SBram Moolenaar
1116efa94447SBram Moolenaar  unlet g:result
1117efa94447SBram Moolenaar  delete('XsomeExport.vim')
1118efa94447SBram Moolenaar  delete('Xmapscript.vim')
1119b3ca9824SBram Moolenaar  nunmap <F3>
1120efa94447SBram Moolenaarenddef
1121efa94447SBram Moolenaar
1122750802b5SBram Moolenaardef Test_vim9script_fails()
11238a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11248a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1125cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
11269721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1127cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1128750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1129750802b5SBram Moolenaar
1130cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1131c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1132c785b9a7SBram Moolenaar
1133e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1134e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
11358a7d6542SBram Moolenaarenddef
11368a7d6542SBram Moolenaar
1137f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1138101f4810SBram Moolenaar  CheckRunVimInTerminal
1139101f4810SBram Moolenaar
11409bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1141c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11429bb3eb3eSBram Moolenaarendfunc
11439bb3eb3eSBram Moolenaar
1144c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1145cfcd011fSBram Moolenaar  var export =<< trim END
1146101f4810SBram Moolenaar    vim9script
1147101f4810SBram Moolenaar    export def Foo(): number
1148101f4810SBram Moolenaar        return 0
1149101f4810SBram Moolenaar    enddef
1150101f4810SBram Moolenaar  END
1151730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1152101f4810SBram Moolenaar
1153e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
11549bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11559bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1156101f4810SBram Moolenaar
1157730b2483SBram Moolenaar  delete('XexportCmd.vim')
11589bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11599bb3eb3eSBram Moolenaarenddef
1160101f4810SBram Moolenaar
11612b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
11622b32700dSBram Moolenaar  var lines =<< trim END
11632b32700dSBram Moolenaar    vim9script noclear
11642b32700dSBram Moolenaar    g:loadCount += 1
11652b32700dSBram Moolenaar    var s:reloaded = 'init'
11662b32700dSBram Moolenaar
11672b32700dSBram Moolenaar    def Again(): string
11682b32700dSBram Moolenaar      return 'again'
11692b32700dSBram Moolenaar    enddef
11702b32700dSBram Moolenaar
11712b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
11722b32700dSBram Moolenaar    var s:loaded = true
11732b32700dSBram Moolenaar
11742b32700dSBram Moolenaar    var s:notReloaded = 'yes'
11752b32700dSBram Moolenaar    s:reloaded = 'first'
11762b32700dSBram Moolenaar    def g:Values(): list<string>
1177cdc40c43SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once()]
11782b32700dSBram Moolenaar    enddef
11792b32700dSBram Moolenaar
11802b32700dSBram Moolenaar    def Once(): string
11812b32700dSBram Moolenaar      return 'once'
11822b32700dSBram Moolenaar    enddef
11832b32700dSBram Moolenaar  END
11842b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
11852b32700dSBram Moolenaar  g:loadCount = 0
11862b32700dSBram Moolenaar  source XReloaded
11872b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1188cdc40c43SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once'], g:Values())
11892b32700dSBram Moolenaar  source XReloaded
11902b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1191cdc40c43SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once'], g:Values())
11922b32700dSBram Moolenaar  source XReloaded
11932b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1194cdc40c43SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once'], g:Values())
11952b32700dSBram Moolenaar
11962b32700dSBram Moolenaar  delete('Xreloaded')
11972b32700dSBram Moolenaar  delfunc g:Values
11982b32700dSBram Moolenaar  unlet g:loadCount
11992b32700dSBram Moolenaarenddef
12002b32700dSBram Moolenaar
12014c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1202cfcd011fSBram Moolenaar  var lines =<< trim END
12038a7d6542SBram Moolenaar    vim9script
12048a7d6542SBram Moolenaar    const var = ''
1205cfcd011fSBram Moolenaar    var valone = 1234
12068a7d6542SBram Moolenaar    def MyFunc(arg: string)
12078a7d6542SBram Moolenaar       valone = 5678
12088a7d6542SBram Moolenaar    enddef
12098a7d6542SBram Moolenaar  END
1210cfcd011fSBram Moolenaar  var morelines =<< trim END
1211cfcd011fSBram Moolenaar    var valtwo = 222
12128a7d6542SBram Moolenaar    export def GetValtwo(): number
12138a7d6542SBram Moolenaar      return valtwo
12148a7d6542SBram Moolenaar    enddef
12158a7d6542SBram Moolenaar  END
121603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
12178a7d6542SBram Moolenaar  source Xreload.vim
12188a7d6542SBram Moolenaar  source Xreload.vim
12198a7d6542SBram Moolenaar  source Xreload.vim
12208a7d6542SBram Moolenaar
1221cfcd011fSBram Moolenaar  var testlines =<< trim END
12228a7d6542SBram Moolenaar    vim9script
12238a7d6542SBram Moolenaar    def TheFunc()
12248a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
12258a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
12268a7d6542SBram Moolenaar    enddef
12278a7d6542SBram Moolenaar    TheFunc()
12288a7d6542SBram Moolenaar  END
12298a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
12308a7d6542SBram Moolenaar  source Ximport.vim
12318a7d6542SBram Moolenaar
1232f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1233f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
12348a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12358a7d6542SBram Moolenaar  source Ximport.vim
12368a7d6542SBram Moolenaar
1237f5be8cdbSBram Moolenaar  # cannot declare a var twice
12388a7d6542SBram Moolenaar  lines =<< trim END
12398a7d6542SBram Moolenaar    vim9script
1240cfcd011fSBram Moolenaar    var valone = 1234
1241cfcd011fSBram Moolenaar    var valone = 5678
12428a7d6542SBram Moolenaar  END
12438a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
124444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
12458a7d6542SBram Moolenaar
12468a7d6542SBram Moolenaar  delete('Xreload.vim')
12478a7d6542SBram Moolenaar  delete('Ximport.vim')
12488a7d6542SBram Moolenaarenddef
12498a7d6542SBram Moolenaar
1250*07a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
1251*07a65d26SBram Moolenaar" compiled function using that variable must fail.
1252*07a65d26SBram Moolenaardef Test_script_reload_change_type()
1253*07a65d26SBram Moolenaar  var lines =<< trim END
1254*07a65d26SBram Moolenaar    vim9script noclear
1255*07a65d26SBram Moolenaar    var str = 'string'
1256*07a65d26SBram Moolenaar    def g:GetStr(): string
1257*07a65d26SBram Moolenaar      return str .. 'xxx'
1258*07a65d26SBram Moolenaar    enddef
1259*07a65d26SBram Moolenaar  END
1260*07a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
1261*07a65d26SBram Moolenaar  source Xreload.vim
1262*07a65d26SBram Moolenaar  echo g:GetStr()
1263*07a65d26SBram Moolenaar
1264*07a65d26SBram Moolenaar  lines =<< trim END
1265*07a65d26SBram Moolenaar    vim9script noclear
1266*07a65d26SBram Moolenaar    var str = 1234
1267*07a65d26SBram Moolenaar  END
1268*07a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
1269*07a65d26SBram Moolenaar  source Xreload.vim
1270*07a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
1271*07a65d26SBram Moolenaar
1272*07a65d26SBram Moolenaar  delfunc g:GetStr
1273*07a65d26SBram Moolenaar  delete('Xreload.vim')
1274*07a65d26SBram Moolenaarenddef
1275*07a65d26SBram Moolenaar
127695006e3dSBram Moolenaardef s:RetSome(): string
127795006e3dSBram Moolenaar  return 'some'
127895006e3dSBram Moolenaarenddef
127995006e3dSBram Moolenaar
1280fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1281fe465a01SBram Moolenaar" script-local name.
1282fe465a01SBram Moolenaardef Test_vim9script_funcref()
1283cfcd011fSBram Moolenaar  var sortlines =<< trim END
1284fe465a01SBram Moolenaar      vim9script
1285fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1286bed36b93SBram Moolenaar        return i2 - i1
1287fe465a01SBram Moolenaar      enddef
1288fe465a01SBram Moolenaar
1289fe465a01SBram Moolenaar      export def FastSort(): list<number>
1290fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1291fe465a01SBram Moolenaar      enddef
1292fe465a01SBram Moolenaar  END
1293fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1294fe465a01SBram Moolenaar
1295cfcd011fSBram Moolenaar  var lines =<< trim END
1296fe465a01SBram Moolenaar    vim9script
1297fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1298fe465a01SBram Moolenaar    def Test()
1299fe465a01SBram Moolenaar      g:result = FastSort()
1300fe465a01SBram Moolenaar    enddef
1301fe465a01SBram Moolenaar    Test()
1302fe465a01SBram Moolenaar  END
1303fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1304fe465a01SBram Moolenaar
1305fe465a01SBram Moolenaar  source Xscript.vim
1306fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1307fe465a01SBram Moolenaar
1308fe465a01SBram Moolenaar  unlet g:result
1309fe465a01SBram Moolenaar  delete('Xsort.vim')
1310fe465a01SBram Moolenaar  delete('Xscript.vim')
131195006e3dSBram Moolenaar
1312cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
131395006e3dSBram Moolenaar  assert_equal('some', Funcref())
1314fe465a01SBram Moolenaarenddef
1315fe465a01SBram Moolenaar
1316601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1317601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1318601e76acSBram Moolenaar" function reference.
1319c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1320cfcd011fSBram Moolenaar  var filterLines =<< trim END
1321c620c055SBram Moolenaar    vim9script
1322c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1323c620c055SBram Moolenaar      return idx % 2 == 1
1324c620c055SBram Moolenaar    enddef
1325c620c055SBram Moolenaar    export def FastFilter(): list<number>
1326c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1327c620c055SBram Moolenaar    enddef
1328601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1329601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1330601e76acSBram Moolenaar    enddef
1331c620c055SBram Moolenaar  END
1332c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1333c620c055SBram Moolenaar
1334cfcd011fSBram Moolenaar  var lines =<< trim END
1335c620c055SBram Moolenaar    vim9script
1336601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1337c620c055SBram Moolenaar    def Test()
1338cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1339c620c055SBram Moolenaar    enddef
1340c620c055SBram Moolenaar    Test()
1341601e76acSBram Moolenaar    def TestDirect()
1342cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1343601e76acSBram Moolenaar    enddef
1344601e76acSBram Moolenaar    TestDirect()
1345c620c055SBram Moolenaar  END
1346601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1347c620c055SBram Moolenaar  delete('Xfilter.vim')
1348c620c055SBram Moolenaarenddef
1349c620c055SBram Moolenaar
13504c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1351cfcd011fSBram Moolenaar  var first_lines =<< trim END
13524c17ad94SBram Moolenaar    vim9script
13534c17ad94SBram Moolenaar    def FuncYes(): string
13544c17ad94SBram Moolenaar      return 'yes'
13554c17ad94SBram Moolenaar    enddef
13564c17ad94SBram Moolenaar  END
1357cfcd011fSBram Moolenaar  var withno_lines =<< trim END
13584c17ad94SBram Moolenaar    def FuncNo(): string
13594c17ad94SBram Moolenaar      return 'no'
13604c17ad94SBram Moolenaar    enddef
13614c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
13624c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
13634c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
136403afdcf1SBram Moolenaar    enddef
136503afdcf1SBram Moolenaar  END
1366cfcd011fSBram Moolenaar  var nono_lines =<< trim END
136703afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
136803afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
136944d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
13704c17ad94SBram Moolenaar    enddef
13714c17ad94SBram Moolenaar  END
13724c17ad94SBram Moolenaar
13734c17ad94SBram Moolenaar  # FuncNo() is defined
137403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13754c17ad94SBram Moolenaar  source Xreloaded.vim
13764c17ad94SBram Moolenaar  g:DoCheck(true)
13774c17ad94SBram Moolenaar
13784c17ad94SBram Moolenaar  # FuncNo() is not redefined
137903afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13804c17ad94SBram Moolenaar  source Xreloaded.vim
13815082471fSBram Moolenaar  g:DoCheck(false)
13824c17ad94SBram Moolenaar
13834c17ad94SBram Moolenaar  # FuncNo() is back
138403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13854c17ad94SBram Moolenaar  source Xreloaded.vim
13865082471fSBram Moolenaar  g:DoCheck(false)
13874c17ad94SBram Moolenaar
13884c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13894c17ad94SBram Moolenaarenddef
13904c17ad94SBram Moolenaar
139189483d40SBram Moolenaardef Test_vim9script_reload_delvar()
139289483d40SBram Moolenaar  # write the script with a script-local variable
1393cfcd011fSBram Moolenaar  var lines =<< trim END
139489483d40SBram Moolenaar    vim9script
1395cfcd011fSBram Moolenaar    var name = 'string'
139689483d40SBram Moolenaar  END
139789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
139889483d40SBram Moolenaar  source XreloadVar.vim
139989483d40SBram Moolenaar
140089483d40SBram Moolenaar  # now write the script using the same variable locally - works
140189483d40SBram Moolenaar  lines =<< trim END
140289483d40SBram Moolenaar    vim9script
140389483d40SBram Moolenaar    def Func()
1404cfcd011fSBram Moolenaar      var name = 'string'
140589483d40SBram Moolenaar    enddef
140689483d40SBram Moolenaar  END
140789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
140889483d40SBram Moolenaar  source XreloadVar.vim
140989483d40SBram Moolenaar
141089483d40SBram Moolenaar  delete('XreloadVar.vim')
141189483d40SBram Moolenaarenddef
141289483d40SBram Moolenaar
14138a7d6542SBram Moolenaardef Test_import_absolute()
1414cfcd011fSBram Moolenaar  var import_lines = [
1415e6085c53SBram Moolenaar        'vim9script',
1416e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1417e6085c53SBram Moolenaar        'def UseExported()',
1418e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1419e6085c53SBram Moolenaar        '  exported = 8888',
1420e6085c53SBram Moolenaar        '  g:imported_after = exported',
1421e6085c53SBram Moolenaar        'enddef',
1422e6085c53SBram Moolenaar        'UseExported()',
1423e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1424e6085c53SBram Moolenaar        ]
14258a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
14268a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
14278a7d6542SBram Moolenaar
14288a7d6542SBram Moolenaar  source Ximport_abs.vim
14298a7d6542SBram Moolenaar
14308a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
14314e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1432fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1433fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1434fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1435fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1436fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1437fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1438fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1439fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1440fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1441fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1442e6085c53SBram Moolenaar        g:import_disassembled)
1443b3ca9824SBram Moolenaar
1444b3ca9824SBram Moolenaar  Undo_export_script_lines()
14458a7d6542SBram Moolenaar  unlet g:imported_abs
14464e12a5dfSBram Moolenaar  unlet g:import_disassembled
14478a7d6542SBram Moolenaar
14488a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
14498a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
14508a7d6542SBram Moolenaarenddef
14518a7d6542SBram Moolenaar
14528a7d6542SBram Moolenaardef Test_import_rtp()
1453cfcd011fSBram Moolenaar  var import_lines = [
1454e6085c53SBram Moolenaar        'vim9script',
1455e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1456e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1457e6085c53SBram Moolenaar        ]
14588a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
14598a7d6542SBram Moolenaar  mkdir('import')
14608a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
14618a7d6542SBram Moolenaar
1462cfcd011fSBram Moolenaar  var save_rtp = &rtp
14638a7d6542SBram Moolenaar  &rtp = getcwd()
14648a7d6542SBram Moolenaar  source Ximport_rtp.vim
14658a7d6542SBram Moolenaar  &rtp = save_rtp
14668a7d6542SBram Moolenaar
14678a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
14688a7d6542SBram Moolenaar
1469b3ca9824SBram Moolenaar  Undo_export_script_lines()
1470b3ca9824SBram Moolenaar  unlet g:imported_rtp
14718a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
147289483d40SBram Moolenaar  delete('import', 'rf')
14738a7d6542SBram Moolenaarenddef
14748a7d6542SBram Moolenaar
147525e0f586SBram Moolenaardef Test_import_compile_error()
1476cfcd011fSBram Moolenaar  var export_lines = [
147725e0f586SBram Moolenaar        'vim9script',
147825e0f586SBram Moolenaar        'export def ExpFunc(): string',
147925e0f586SBram Moolenaar        '  return notDefined',
148025e0f586SBram Moolenaar        'enddef',
148125e0f586SBram Moolenaar        ]
148225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
148325e0f586SBram Moolenaar
1484cfcd011fSBram Moolenaar  var import_lines = [
148525e0f586SBram Moolenaar        'vim9script',
148625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
148725e0f586SBram Moolenaar        'def ImpFunc()',
148825e0f586SBram Moolenaar        '  echo ExpFunc()',
148925e0f586SBram Moolenaar        'enddef',
149025e0f586SBram Moolenaar        'defcompile',
149125e0f586SBram Moolenaar        ]
149225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
149325e0f586SBram Moolenaar
149425e0f586SBram Moolenaar  try
149525e0f586SBram Moolenaar    source Ximport.vim
149625e0f586SBram Moolenaar  catch /E1001/
1497f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
14987707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
149925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
150025e0f586SBram Moolenaar  endtry
150125e0f586SBram Moolenaar
150225e0f586SBram Moolenaar  delete('Xexported.vim')
150325e0f586SBram Moolenaar  delete('Ximport.vim')
150425e0f586SBram Moolenaarenddef
150525e0f586SBram Moolenaar
1506c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1507cfcd011fSBram Moolenaar  var lines = [
1508c4ce36d4SBram Moolenaar        'vim9script',
1509c4ce36d4SBram Moolenaar        'def Func()',
1510c4ce36d4SBram Moolenaar        '  eval [][0]',
1511c4ce36d4SBram Moolenaar        'enddef',
1512c4ce36d4SBram Moolenaar        'Func()',
1513c4ce36d4SBram Moolenaar        ]
1514c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1515c4ce36d4SBram Moolenaar
1516c4ce36d4SBram Moolenaar  for count in range(3)
1517c4ce36d4SBram Moolenaar    try
1518c4ce36d4SBram Moolenaar      source Xtestscript.vim
1519c4ce36d4SBram Moolenaar    catch /E684/
1520c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1521c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1522c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1523c4ce36d4SBram Moolenaar    endtry
1524c4ce36d4SBram Moolenaar  endfor
1525c4ce36d4SBram Moolenaar
1526c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1527c4ce36d4SBram Moolenaarenddef
1528c4ce36d4SBram Moolenaar
1529eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1530cfcd011fSBram Moolenaar  var export_lines =<< trim END
1531eef2102eSBram Moolenaar      vim9script
1532eef2102eSBram Moolenaar      export def Func()
1533eef2102eSBram Moolenaar        echo 'imported'
1534eef2102eSBram Moolenaar      enddef
1535eef2102eSBram Moolenaar  END
1536eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1537eef2102eSBram Moolenaar
1538cfcd011fSBram Moolenaar  var lines =<< trim END
1539eef2102eSBram Moolenaar    vim9script
1540eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1541eef2102eSBram Moolenaar    def Func()
1542eef2102eSBram Moolenaar      echo 'local to function'
1543eef2102eSBram Moolenaar    enddef
1544eef2102eSBram Moolenaar  END
1545eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1546eef2102eSBram Moolenaar
1547eef2102eSBram Moolenaar  lines =<< trim END
1548eef2102eSBram Moolenaar    vim9script
1549eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1550eef2102eSBram Moolenaar    def Outer()
1551eef2102eSBram Moolenaar      def Func()
1552eef2102eSBram Moolenaar        echo 'local to function'
1553eef2102eSBram Moolenaar      enddef
1554eef2102eSBram Moolenaar    enddef
1555eef2102eSBram Moolenaar    defcompile
1556eef2102eSBram Moolenaar  END
1557eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1558eef2102eSBram Moolenaar
1559eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1560eef2102eSBram Moolenaarenddef
1561eef2102eSBram Moolenaar
1562b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1563cfcd011fSBram Moolenaar  var lines =<< trim END
1564b9a2cac3SBram Moolenaar    vim9script
1565b9a2cac3SBram Moolenaar    def Func()
1566b9a2cac3SBram Moolenaar      echo 'one'
1567b9a2cac3SBram Moolenaar    enddef
1568b9a2cac3SBram Moolenaar    def Func()
1569b9a2cac3SBram Moolenaar      echo 'two'
1570b9a2cac3SBram Moolenaar    enddef
1571b9a2cac3SBram Moolenaar  END
1572b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1573fa211f3cSBram Moolenaar
1574fa211f3cSBram Moolenaar  lines =<< trim END
1575fa211f3cSBram Moolenaar    vim9script
1576fa211f3cSBram Moolenaar    def Foo(): string
1577fa211f3cSBram Moolenaar      return 'foo'
1578fa211f3cSBram Moolenaar      enddef
1579fa211f3cSBram Moolenaar    def Func()
1580cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1581fa211f3cSBram Moolenaar    enddef
1582fa211f3cSBram Moolenaar    defcompile
1583fa211f3cSBram Moolenaar  END
1584fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1585b9a2cac3SBram Moolenaarenddef
1586b9a2cac3SBram Moolenaar
15878a7d6542SBram Moolenaardef Test_fixed_size_list()
1588f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1589cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
15908a7d6542SBram Moolenaar  l->remove(0)
15918a7d6542SBram Moolenaar  l->add(5)
15928a7d6542SBram Moolenaar  l->insert(99, 1)
15930f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
15948a7d6542SBram Moolenaarenddef
15958a7d6542SBram Moolenaar
1596ae616494SBram Moolenaardef Test_no_insert_xit()
1597d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1598d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1599d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1600d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1601d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1602ae616494SBram Moolenaar
1603ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1604ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1605ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1606ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1607f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1608f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1609f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1610f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1611f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1612ae616494SBram Moolenaarenddef
1613ae616494SBram Moolenaar
1614158906cfSBram Moolenaardef IfElse(what: number): string
1615cfcd011fSBram Moolenaar  var res = ''
1616158906cfSBram Moolenaar  if what == 1
1617158906cfSBram Moolenaar    res = "one"
1618158906cfSBram Moolenaar  elseif what == 2
1619158906cfSBram Moolenaar    res = "two"
1620a259d8d3SBram Moolenaar  else
1621158906cfSBram Moolenaar    res = "three"
1622a259d8d3SBram Moolenaar  endif
1623158906cfSBram Moolenaar  return res
1624a259d8d3SBram Moolenaarenddef
1625a259d8d3SBram Moolenaar
1626158906cfSBram Moolenaardef Test_if_elseif_else()
1627158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1628158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1629158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
16300f18b6d1SBram Moolenaarenddef
16310f18b6d1SBram Moolenaar
1632e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1633d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1634d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1635d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1636d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1637d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1638e8c4abbbSBram Moolenaarenddef
1639e8c4abbbSBram Moolenaar
16406d69bf60SBram Moolenaarlet g:bool_true = v:true
16416d69bf60SBram Moolenaarlet g:bool_false = v:false
16426d69bf60SBram Moolenaar
16436d69bf60SBram Moolenaardef Test_if_const_expr()
1644cfcd011fSBram Moolenaar  var res = false
16456d69bf60SBram Moolenaar  if true ? true : false
16466d69bf60SBram Moolenaar    res = true
16476d69bf60SBram Moolenaar  endif
16486d69bf60SBram Moolenaar  assert_equal(true, res)
16496d69bf60SBram Moolenaar
1650585fea7bSBram Moolenaar  g:glob = 2
1651585fea7bSBram Moolenaar  if false
16526797966dSBram Moolenaar    execute('g:glob = 3')
1653585fea7bSBram Moolenaar  endif
1654585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1655585fea7bSBram Moolenaar  if true
16566797966dSBram Moolenaar    execute('g:glob = 3')
1657585fea7bSBram Moolenaar  endif
1658585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1659585fea7bSBram Moolenaar
16606d69bf60SBram Moolenaar  res = false
16616d69bf60SBram Moolenaar  if g:bool_true ? true : false
16626d69bf60SBram Moolenaar    res = true
16636d69bf60SBram Moolenaar  endif
16646d69bf60SBram Moolenaar  assert_equal(true, res)
16656d69bf60SBram Moolenaar
16666d69bf60SBram Moolenaar  res = false
16676d69bf60SBram Moolenaar  if true ? g:bool_true : false
16686d69bf60SBram Moolenaar    res = true
16696d69bf60SBram Moolenaar  endif
16706d69bf60SBram Moolenaar  assert_equal(true, res)
16716d69bf60SBram Moolenaar
16726d69bf60SBram Moolenaar  res = false
16736d69bf60SBram Moolenaar  if true ? true : g:bool_false
16746d69bf60SBram Moolenaar    res = true
16756d69bf60SBram Moolenaar  endif
16766d69bf60SBram Moolenaar  assert_equal(true, res)
16776d69bf60SBram Moolenaar
16786d69bf60SBram Moolenaar  res = false
16796d69bf60SBram Moolenaar  if true ? false : true
16806d69bf60SBram Moolenaar    res = true
16816d69bf60SBram Moolenaar  endif
16826d69bf60SBram Moolenaar  assert_equal(false, res)
16836d69bf60SBram Moolenaar
16846d69bf60SBram Moolenaar  res = false
16856d69bf60SBram Moolenaar  if false ? false : true
16866d69bf60SBram Moolenaar    res = true
16876d69bf60SBram Moolenaar  endif
16886d69bf60SBram Moolenaar  assert_equal(true, res)
16896d69bf60SBram Moolenaar
16906d69bf60SBram Moolenaar  res = false
16916d69bf60SBram Moolenaar  if false ? true : false
16926d69bf60SBram Moolenaar    res = true
16936d69bf60SBram Moolenaar  endif
16946d69bf60SBram Moolenaar  assert_equal(false, res)
16956d69bf60SBram Moolenaar
16966d69bf60SBram Moolenaar  res = false
1697e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1698e8c4abbbSBram Moolenaar    res = true
1699e8c4abbbSBram Moolenaar  endif
1700e8c4abbbSBram Moolenaar  assert_equal(false, res)
1701e8c4abbbSBram Moolenaar
1702e8c4abbbSBram Moolenaar  res = false
17036d69bf60SBram Moolenaar  if true && true
17046d69bf60SBram Moolenaar    res = true
17056d69bf60SBram Moolenaar  endif
17066d69bf60SBram Moolenaar  assert_equal(true, res)
17076d69bf60SBram Moolenaar
17086d69bf60SBram Moolenaar  res = false
17096d69bf60SBram Moolenaar  if true && false
17106d69bf60SBram Moolenaar    res = true
17116d69bf60SBram Moolenaar  endif
17126d69bf60SBram Moolenaar  assert_equal(false, res)
17136d69bf60SBram Moolenaar
17146d69bf60SBram Moolenaar  res = false
17156d69bf60SBram Moolenaar  if g:bool_true && false
17166d69bf60SBram Moolenaar    res = true
17176d69bf60SBram Moolenaar  endif
17186d69bf60SBram Moolenaar  assert_equal(false, res)
17196d69bf60SBram Moolenaar
17206d69bf60SBram Moolenaar  res = false
17216d69bf60SBram Moolenaar  if true && g:bool_false
17226d69bf60SBram Moolenaar    res = true
17236d69bf60SBram Moolenaar  endif
17246d69bf60SBram Moolenaar  assert_equal(false, res)
17256d69bf60SBram Moolenaar
17266d69bf60SBram Moolenaar  res = false
17276d69bf60SBram Moolenaar  if false && false
17286d69bf60SBram Moolenaar    res = true
17296d69bf60SBram Moolenaar  endif
17306d69bf60SBram Moolenaar  assert_equal(false, res)
17316d69bf60SBram Moolenaar
17326d69bf60SBram Moolenaar  res = false
17336d69bf60SBram Moolenaar  if true || false
17346d69bf60SBram Moolenaar    res = true
17356d69bf60SBram Moolenaar  endif
17366d69bf60SBram Moolenaar  assert_equal(true, res)
17376d69bf60SBram Moolenaar
17386d69bf60SBram Moolenaar  res = false
17396d69bf60SBram Moolenaar  if g:bool_true || false
17406d69bf60SBram Moolenaar    res = true
17416d69bf60SBram Moolenaar  endif
17426d69bf60SBram Moolenaar  assert_equal(true, res)
17436d69bf60SBram Moolenaar
17446d69bf60SBram Moolenaar  res = false
17456d69bf60SBram Moolenaar  if true || g:bool_false
17466d69bf60SBram Moolenaar    res = true
17476d69bf60SBram Moolenaar  endif
17486d69bf60SBram Moolenaar  assert_equal(true, res)
17496d69bf60SBram Moolenaar
17506d69bf60SBram Moolenaar  res = false
17516d69bf60SBram Moolenaar  if false || false
17526d69bf60SBram Moolenaar    res = true
17536d69bf60SBram Moolenaar  endif
17546d69bf60SBram Moolenaar  assert_equal(false, res)
17553988f64fSBram Moolenaar
17563988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
17573988f64fSBram Moolenaar  if false | eval 0 | endif
17583988f64fSBram Moolenaar  if false | eval burp + 234 | endif
17593988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
17603988f64fSBram Moolenaar  if false
17613988f64fSBram Moolenaar    burp
17623988f64fSBram Moolenaar  endif
176380c34ca3SBram Moolenaarenddef
17646d69bf60SBram Moolenaar
176580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1766d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1767d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1768d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1769d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
17706d69bf60SBram Moolenaarenddef
17716d69bf60SBram Moolenaar
177272abcf42SBram Moolenaardef RunNested(i: number): number
1773cfcd011fSBram Moolenaar  var x: number = 0
177472abcf42SBram Moolenaar  if i % 2
177572abcf42SBram Moolenaar    if 1
1776f5be8cdbSBram Moolenaar      # comment
177772abcf42SBram Moolenaar    else
1778f5be8cdbSBram Moolenaar      # comment
177972abcf42SBram Moolenaar    endif
178072abcf42SBram Moolenaar    x += 1
178172abcf42SBram Moolenaar  else
178272abcf42SBram Moolenaar    x += 1000
178372abcf42SBram Moolenaar  endif
178472abcf42SBram Moolenaar  return x
178572abcf42SBram Moolenaarenddef
178672abcf42SBram Moolenaar
178772abcf42SBram Moolenaardef Test_nested_if()
178872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
178972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
179072abcf42SBram Moolenaarenddef
179172abcf42SBram Moolenaar
1792ad39c094SBram Moolenaardef Test_execute_cmd()
1793e4984290SBram Moolenaar  # missing argument is ignored
1794e4984290SBram Moolenaar  execute
1795e4984290SBram Moolenaar  execute # comment
1796e4984290SBram Moolenaar
1797ad39c094SBram Moolenaar  new
1798ad39c094SBram Moolenaar  setline(1, 'default')
1799d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1800ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1801a72cfb80SBram Moolenaar
1802d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1803a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1804a72cfb80SBram Moolenaar
1805cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1806cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1807a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1808ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1809a72cfb80SBram Moolenaar
1810d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1811ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1812a72cfb80SBram Moolenaar
1813cfcd011fSBram Moolenaar  var cmd_first = 'call '
1814cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1815ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1816ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1817ad39c094SBram Moolenaar  bwipe!
1818585fea7bSBram Moolenaar
1819cfcd011fSBram Moolenaar  var n = true
18202d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
18212d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
18222d6b20d6SBram Moolenaar
1823e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1824e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1825e5abf7afSBram Moolenaar
1826d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1827d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1828d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1829ad39c094SBram Moolenaarenddef
1830ad39c094SBram Moolenaar
183147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1832f5be8cdbSBram Moolenaar  # only checks line continuation
1833cfcd011fSBram Moolenaar  var lines =<< trim END
183447e880d6SBram Moolenaar      vim9script
183547e880d6SBram Moolenaar      execute 'g:someVar'
183647e880d6SBram Moolenaar                .. ' = ' ..
183747e880d6SBram Moolenaar                   '28'
183847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
183947e880d6SBram Moolenaar      unlet g:someVar
184047e880d6SBram Moolenaar  END
184147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
184247e880d6SBram Moolenaarenddef
184347e880d6SBram Moolenaar
1844ad39c094SBram Moolenaardef Test_echo_cmd()
1845a72cfb80SBram Moolenaar  echo 'some' # comment
1846585fea7bSBram Moolenaar  echon 'thing'
1847ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1848ad39c094SBram Moolenaar
1849a72cfb80SBram Moolenaar  echo "some" # comment
1850a72cfb80SBram Moolenaar  echon "thing"
1851a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1852a72cfb80SBram Moolenaar
1853cfcd011fSBram Moolenaar  var str1 = 'some'
1854cfcd011fSBram Moolenaar  var str2 = 'more'
1855ad39c094SBram Moolenaar  echo str1 str2
1856ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1857a72cfb80SBram Moolenaar
1858d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1859ad39c094SBram Moolenaarenddef
1860ad39c094SBram Moolenaar
1861f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1862f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1863f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1864f93c7feaSBram Moolenaar  echo 'clear'
1865df069eecSBram Moolenaar  :1messages
1866f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1867f93c7feaSBram Moolenaar
1868d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1869f93c7feaSBram Moolenaarenddef
1870f93c7feaSBram Moolenaar
187147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1872f5be8cdbSBram Moolenaar  # only checks line continuation
1873cfcd011fSBram Moolenaar  var lines =<< trim END
187447e880d6SBram Moolenaar      vim9script
187547e880d6SBram Moolenaar      echomsg 'here'
187647e880d6SBram Moolenaar                .. ' is ' ..
187747e880d6SBram Moolenaar                   'a message'
187847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
187947e880d6SBram Moolenaar  END
188047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
188147e880d6SBram Moolenaarenddef
188247e880d6SBram Moolenaar
1883f93c7feaSBram Moolenaardef Test_echoerr_cmd()
188440ee466cSBram Moolenaar  try
188540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
188640ee466cSBram Moolenaar  catch
188740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
188840ee466cSBram Moolenaar  endtry
1889f93c7feaSBram Moolenaarenddef
1890f93c7feaSBram Moolenaar
189147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1892f5be8cdbSBram Moolenaar  # only checks line continuation
1893cfcd011fSBram Moolenaar  var lines =<< trim END
189447e880d6SBram Moolenaar      vim9script
189547e880d6SBram Moolenaar      try
189647e880d6SBram Moolenaar        echoerr 'this'
189747e880d6SBram Moolenaar                .. ' is ' ..
189847e880d6SBram Moolenaar                   'wrong'
189947e880d6SBram Moolenaar      catch
190047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
190147e880d6SBram Moolenaar      endtry
190247e880d6SBram Moolenaar  END
190347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
190447e880d6SBram Moolenaarenddef
190547e880d6SBram Moolenaar
190641fe0617SBram Moolenaardef Test_for_outside_of_function()
1907cfcd011fSBram Moolenaar  var lines =<< trim END
190841fe0617SBram Moolenaar    vim9script
190941fe0617SBram Moolenaar    new
191041fe0617SBram Moolenaar    for var in range(0, 3)
191141fe0617SBram Moolenaar      append(line('$'), var)
191241fe0617SBram Moolenaar    endfor
191341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
191441fe0617SBram Moolenaar    bwipe!
191541fe0617SBram Moolenaar  END
191641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
191741fe0617SBram Moolenaar  source Xvim9for.vim
191841fe0617SBram Moolenaar  delete('Xvim9for.vim')
191941fe0617SBram Moolenaarenddef
19208a7d6542SBram Moolenaar
1921e8c4abbbSBram Moolenaardef Test_for_loop()
1922cfcd011fSBram Moolenaar  var result = ''
1923e8c4abbbSBram Moolenaar  for cnt in range(7)
1924e8c4abbbSBram Moolenaar    if cnt == 4
1925e8c4abbbSBram Moolenaar      break
1926e8c4abbbSBram Moolenaar    endif
1927e8c4abbbSBram Moolenaar    if cnt == 2
1928e8c4abbbSBram Moolenaar      continue
1929e8c4abbbSBram Moolenaar    endif
1930e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1931e8c4abbbSBram Moolenaar  endfor
1932e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
19330ad3e894SBram Moolenaar
1934cfcd011fSBram Moolenaar  var concat = ''
19350ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
19360ad3e894SBram Moolenaar    concat ..= str
19370ad3e894SBram Moolenaar  endfor
19380ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
193938bd8de5SBram Moolenaar
194038bd8de5SBram Moolenaar  var total = 0
194138bd8de5SBram Moolenaar  for nr in
194238bd8de5SBram Moolenaar      [1, 2, 3]
194338bd8de5SBram Moolenaar    total += nr
194438bd8de5SBram Moolenaar  endfor
194538bd8de5SBram Moolenaar  assert_equal(6, total)
194638bd8de5SBram Moolenaar
194738bd8de5SBram Moolenaar  total = 0
194838bd8de5SBram Moolenaar  for nr
194938bd8de5SBram Moolenaar    in [1, 2, 3]
195038bd8de5SBram Moolenaar    total += nr
195138bd8de5SBram Moolenaar  endfor
195238bd8de5SBram Moolenaar  assert_equal(6, total)
195338bd8de5SBram Moolenaar
195438bd8de5SBram Moolenaar  total = 0
195538bd8de5SBram Moolenaar  for nr
195638bd8de5SBram Moolenaar    in
195738bd8de5SBram Moolenaar    [1, 2, 3]
195838bd8de5SBram Moolenaar    total += nr
195938bd8de5SBram Moolenaar  endfor
196038bd8de5SBram Moolenaar  assert_equal(6, total)
1961e8c4abbbSBram Moolenaarenddef
1962e8c4abbbSBram Moolenaar
1963e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1964025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
1965025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
1966025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
1967675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1968675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1969cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1970822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
19712d870f8dSBram Moolenaar  delfunc! g:Func
1972451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1973675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1974675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1975675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1976e8c4abbbSBram Moolenaarenddef
1977e8c4abbbSBram Moolenaar
1978ea87069dSBram Moolenaardef Test_for_loop_script_var()
1979ea87069dSBram Moolenaar  # cannot use s:var in a :def function
1980ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
1981ea87069dSBram Moolenaar
1982ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
1983ea87069dSBram Moolenaar  var lines =<< trim END
1984ea87069dSBram Moolenaar    vim9script
1985ea87069dSBram Moolenaar    var total = 0
1986ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
1987ea87069dSBram Moolenaar      total += s:var
1988ea87069dSBram Moolenaar    endfor
1989ea87069dSBram Moolenaar    assert_equal(6, total)
1990ea87069dSBram Moolenaar
1991ea87069dSBram Moolenaar    total = 0
1992ea87069dSBram Moolenaar    for var in [1, 2, 3]
1993ea87069dSBram Moolenaar      total += var
1994ea87069dSBram Moolenaar    endfor
1995ea87069dSBram Moolenaar    assert_equal(6, total)
1996ea87069dSBram Moolenaar  END
1997ea87069dSBram Moolenaarenddef
1998ea87069dSBram Moolenaar
1999792f786aSBram Moolenaardef Test_for_loop_unpack()
20004b8a0651SBram Moolenaar  var lines =<< trim END
2001792f786aSBram Moolenaar      var result = []
2002792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2003792f786aSBram Moolenaar        result->add(v1)
2004792f786aSBram Moolenaar        result->add(v2)
2005792f786aSBram Moolenaar      endfor
2006792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2007792f786aSBram Moolenaar
2008792f786aSBram Moolenaar      result = []
2009792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2010792f786aSBram Moolenaar        result->add(v1)
2011792f786aSBram Moolenaar        result->add(v2)
2012792f786aSBram Moolenaar        result->add(v3)
2013792f786aSBram Moolenaar      endfor
2014792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2015792f786aSBram Moolenaar
20164b8a0651SBram Moolenaar      result = []
20174b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
20184b8a0651SBram Moolenaar        result->add(&ts)
20194b8a0651SBram Moolenaar        result->add(&sw)
20204b8a0651SBram Moolenaar      endfor
20214b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
20224b8a0651SBram Moolenaar
20234b8a0651SBram Moolenaar      var slist: list<string>
20244b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
20254b8a0651SBram Moolenaar        slist->add($LOOPVAR)
20264b8a0651SBram Moolenaar        slist->add(@r)
20274b8a0651SBram Moolenaar        slist->add(v:errmsg)
20284b8a0651SBram Moolenaar      endfor
20294b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
20304b8a0651SBram Moolenaar
20314b8a0651SBram Moolenaar      slist = []
20324b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
20334b8a0651SBram Moolenaar        slist->add(g:globalvar)
20344b8a0651SBram Moolenaar        slist->add(b:bufvar)
20354b8a0651SBram Moolenaar        slist->add(w:winvar)
20364b8a0651SBram Moolenaar        slist->add(t:tabvar)
20374b8a0651SBram Moolenaar      endfor
20384b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2039f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
20404b8a0651SBram Moolenaar  END
20414b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
20424b8a0651SBram Moolenaar
20434b8a0651SBram Moolenaar  lines =<< trim END
2044792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2045792f786aSBram Moolenaar        echo v1 v2
2046792f786aSBram Moolenaar      endfor
2047792f786aSBram Moolenaar  END
2048792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2049792f786aSBram Moolenaar
2050792f786aSBram Moolenaar  lines =<< trim END
2051792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2052792f786aSBram Moolenaar        echo v1 v2
2053792f786aSBram Moolenaar      endfor
2054792f786aSBram Moolenaar  END
2055792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2056792f786aSBram Moolenaar
2057792f786aSBram Moolenaar  lines =<< trim END
2058792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2059792f786aSBram Moolenaar        echo v1
2060792f786aSBram Moolenaar      endfor
2061792f786aSBram Moolenaar  END
2062792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2063792f786aSBram Moolenaarenddef
2064792f786aSBram Moolenaar
2065d0df1aacSBram Moolenaardef Test_while_loop()
2066cfcd011fSBram Moolenaar  var result = ''
2067cfcd011fSBram Moolenaar  var cnt = 0
2068d0df1aacSBram Moolenaar  while cnt < 555
2069d0df1aacSBram Moolenaar    if cnt == 3
2070d0df1aacSBram Moolenaar      break
2071d0df1aacSBram Moolenaar    endif
2072d0df1aacSBram Moolenaar    cnt += 1
2073d0df1aacSBram Moolenaar    if cnt == 2
2074d0df1aacSBram Moolenaar      continue
2075d0df1aacSBram Moolenaar    endif
2076d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2077d0df1aacSBram Moolenaar  endwhile
2078d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2079d0df1aacSBram Moolenaarenddef
2080d0df1aacSBram Moolenaar
2081e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2082675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2083675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2084675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2085675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2086675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2087675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2088675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2089bd5da371SBram Moolenaarenddef
2090bd5da371SBram Moolenaar
20919645e2d9SBram Moolenaardef Test_interrupt_loop()
2092cfcd011fSBram Moolenaar  var caught = false
2093cfcd011fSBram Moolenaar  var x = 0
209497acfc78SBram Moolenaar  try
20959645e2d9SBram Moolenaar    while 1
20969645e2d9SBram Moolenaar      x += 1
20979645e2d9SBram Moolenaar      if x == 100
20989645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
20999645e2d9SBram Moolenaar      endif
21009645e2d9SBram Moolenaar    endwhile
210197acfc78SBram Moolenaar  catch
210297acfc78SBram Moolenaar    caught = true
210397acfc78SBram Moolenaar    assert_equal(100, x)
210497acfc78SBram Moolenaar  endtry
210597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
210625859dd7SBram Moolenaar  # consume the CTRL-C
210725859dd7SBram Moolenaar  getchar(0)
21089645e2d9SBram Moolenaarenddef
210920431c9dSBram Moolenaar
21104fdae999SBram Moolenaardef Test_automatic_line_continuation()
2111cfcd011fSBram Moolenaar  var mylist = [
21124fdae999SBram Moolenaar      'one',
21134fdae999SBram Moolenaar      'two',
21144fdae999SBram Moolenaar      'three',
2115f5be8cdbSBram Moolenaar      ] # comment
21164fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
21174fdae999SBram Moolenaar
2118cfcd011fSBram Moolenaar  var mydict = {
2119e0de171eSBram Moolenaar      ['one']: 1,
2120e0de171eSBram Moolenaar      ['two']: 2,
2121e0de171eSBram Moolenaar      ['three']:
21224fdae999SBram Moolenaar          3,
2123f5be8cdbSBram Moolenaar      } # comment
2124e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2125e0de171eSBram Moolenaar  mydict = {
21262c330432SBram Moolenaar      one: 1,  # comment
21272c330432SBram Moolenaar      two:     # comment
21282c330432SBram Moolenaar           2,  # comment
21292c330432SBram Moolenaar      three: 3 # comment
21302c330432SBram Moolenaar      }
2131e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2132e0de171eSBram Moolenaar  mydict = {
21332c330432SBram Moolenaar      one: 1,
21344fdae999SBram Moolenaar      two:
21354fdae999SBram Moolenaar           2,
21362c330432SBram Moolenaar      three: 3
21374fdae999SBram Moolenaar      }
2138e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2139e6085c53SBram Moolenaar
2140e6085c53SBram Moolenaar  assert_equal(
2141e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2142e6085c53SBram Moolenaar        split('one two three')
2143e6085c53SBram Moolenaar        )
21444fdae999SBram Moolenaarenddef
21454fdae999SBram Moolenaar
21467a092245SBram Moolenaardef Test_vim9_comment()
21477a092245SBram Moolenaar  CheckScriptSuccess([
21487a092245SBram Moolenaar      'vim9script',
21497a092245SBram Moolenaar      '# something',
215093f82cbeSBram Moolenaar      '#something',
215193f82cbeSBram Moolenaar      '#{something',
21527a092245SBram Moolenaar      ])
215393f82cbeSBram Moolenaar
215493f82cbeSBram Moolenaar  split Xfile
215593f82cbeSBram Moolenaar  CheckScriptSuccess([
215693f82cbeSBram Moolenaar      'vim9script',
215793f82cbeSBram Moolenaar      'edit #something',
215893f82cbeSBram Moolenaar      ])
215993f82cbeSBram Moolenaar  CheckScriptSuccess([
216093f82cbeSBram Moolenaar      'vim9script',
216193f82cbeSBram Moolenaar      'edit #{something',
216293f82cbeSBram Moolenaar      ])
216393f82cbeSBram Moolenaar  close
216493f82cbeSBram Moolenaar
21657a092245SBram Moolenaar  CheckScriptFailure([
21667a092245SBram Moolenaar      'vim9script',
21677a092245SBram Moolenaar      ':# something',
21687a092245SBram Moolenaar      ], 'E488:')
21697a092245SBram Moolenaar  CheckScriptFailure([
21707a092245SBram Moolenaar      '# something',
21717a092245SBram Moolenaar      ], 'E488:')
21727a092245SBram Moolenaar  CheckScriptFailure([
21737a092245SBram Moolenaar      ':# something',
21747a092245SBram Moolenaar      ], 'E488:')
21757a092245SBram Moolenaar
21764a8d9f2eSBram Moolenaar  { # block start
21774a8d9f2eSBram Moolenaar  } # block end
21784a8d9f2eSBram Moolenaar  CheckDefFailure([
21794a8d9f2eSBram Moolenaar      '{# comment',
21804a8d9f2eSBram Moolenaar      ], 'E488:')
21814a8d9f2eSBram Moolenaar  CheckDefFailure([
21824a8d9f2eSBram Moolenaar      '{',
21834a8d9f2eSBram Moolenaar      '}# comment',
21844a8d9f2eSBram Moolenaar      ], 'E488:')
21854a8d9f2eSBram Moolenaar
21864a8d9f2eSBram Moolenaar  echo "yes" # comment
21874a8d9f2eSBram Moolenaar  CheckDefFailure([
21884a8d9f2eSBram Moolenaar      'echo "yes"# comment',
21894a8d9f2eSBram Moolenaar      ], 'E488:')
21907a092245SBram Moolenaar  CheckScriptSuccess([
21917a092245SBram Moolenaar      'vim9script',
21927a092245SBram Moolenaar      'echo "yes" # something',
21937a092245SBram Moolenaar      ])
21947a092245SBram Moolenaar  CheckScriptFailure([
21957a092245SBram Moolenaar      'vim9script',
21967a092245SBram Moolenaar      'echo "yes"# something',
21977a092245SBram Moolenaar      ], 'E121:')
21987a092245SBram Moolenaar  CheckScriptFailure([
21997a092245SBram Moolenaar      'vim9script',
22007a092245SBram Moolenaar      'echo# something',
2201f8103f27SBram Moolenaar      ], 'E1144:')
22027a092245SBram Moolenaar  CheckScriptFailure([
22037a092245SBram Moolenaar      'echo "yes" # something',
22047a092245SBram Moolenaar      ], 'E121:')
22057a092245SBram Moolenaar
22064a8d9f2eSBram Moolenaar  exe "echo" # comment
22074a8d9f2eSBram Moolenaar  CheckDefFailure([
22084a8d9f2eSBram Moolenaar      'exe "echo"# comment',
22094a8d9f2eSBram Moolenaar      ], 'E488:')
22104a8d9f2eSBram Moolenaar  CheckScriptSuccess([
22114a8d9f2eSBram Moolenaar      'vim9script',
22124a8d9f2eSBram Moolenaar      'exe "echo" # something',
22134a8d9f2eSBram Moolenaar      ])
22144a8d9f2eSBram Moolenaar  CheckScriptFailure([
22154a8d9f2eSBram Moolenaar      'vim9script',
22164a8d9f2eSBram Moolenaar      'exe "echo"# something',
22174a8d9f2eSBram Moolenaar      ], 'E121:')
22184a8d9f2eSBram Moolenaar  CheckScriptFailure([
22194a8d9f2eSBram Moolenaar      'vim9script',
22204a8d9f2eSBram Moolenaar      'exe# something',
2221f8103f27SBram Moolenaar      ], 'E1144:')
22224a8d9f2eSBram Moolenaar  CheckScriptFailure([
22234a8d9f2eSBram Moolenaar      'exe "echo" # something',
22244a8d9f2eSBram Moolenaar      ], 'E121:')
22254a8d9f2eSBram Moolenaar
22267a092245SBram Moolenaar  CheckDefFailure([
22277a092245SBram Moolenaar      'try# comment',
22287a092245SBram Moolenaar      '  echo "yes"',
22297a092245SBram Moolenaar      'catch',
22307a092245SBram Moolenaar      'endtry',
2231f8103f27SBram Moolenaar      ], 'E1144:')
22322c5ed4e3SBram Moolenaar  CheckScriptFailure([
22332c5ed4e3SBram Moolenaar      'vim9script',
22342c5ed4e3SBram Moolenaar      'try# comment',
22352c5ed4e3SBram Moolenaar      'echo "yes"',
2236f8103f27SBram Moolenaar      ], 'E1144:')
22377a092245SBram Moolenaar  CheckDefFailure([
22387a092245SBram Moolenaar      'try',
2239a72cfb80SBram Moolenaar      '  throw#comment',
2240a72cfb80SBram Moolenaar      'catch',
2241a72cfb80SBram Moolenaar      'endtry',
2242f8103f27SBram Moolenaar      ], 'E1144:')
2243a72cfb80SBram Moolenaar  CheckDefFailure([
2244a72cfb80SBram Moolenaar      'try',
2245a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2246a72cfb80SBram Moolenaar      'catch',
2247a72cfb80SBram Moolenaar      'endtry',
2248a72cfb80SBram Moolenaar      ], 'E488:')
2249a72cfb80SBram Moolenaar  CheckDefFailure([
2250a72cfb80SBram Moolenaar      'try',
22517a092245SBram Moolenaar      '  echo "yes"',
22527a092245SBram Moolenaar      'catch# comment',
22537a092245SBram Moolenaar      'endtry',
2254f8103f27SBram Moolenaar      ], 'E1144:')
22552c5ed4e3SBram Moolenaar  CheckScriptFailure([
22562c5ed4e3SBram Moolenaar      'vim9script',
22572c5ed4e3SBram Moolenaar      'try',
22582c5ed4e3SBram Moolenaar      '  echo "yes"',
22592c5ed4e3SBram Moolenaar      'catch# comment',
22602c5ed4e3SBram Moolenaar      'endtry',
2261f8103f27SBram Moolenaar      ], 'E1144:')
22622c5ed4e3SBram Moolenaar  CheckDefFailure([
22632c5ed4e3SBram Moolenaar      'try',
22642c5ed4e3SBram Moolenaar      '  echo "yes"',
22652c5ed4e3SBram Moolenaar      'catch /pat/# comment',
22662c5ed4e3SBram Moolenaar      'endtry',
22672c5ed4e3SBram Moolenaar      ], 'E488:')
22687a092245SBram Moolenaar  CheckDefFailure([
22697a092245SBram Moolenaar      'try',
22707a092245SBram Moolenaar      'echo "yes"',
22717a092245SBram Moolenaar      'catch',
22727a092245SBram Moolenaar      'endtry# comment',
2273f8103f27SBram Moolenaar      ], 'E1144:')
22742c5ed4e3SBram Moolenaar  CheckScriptFailure([
22752c5ed4e3SBram Moolenaar      'vim9script',
22762c5ed4e3SBram Moolenaar      'try',
22772c5ed4e3SBram Moolenaar      '  echo "yes"',
22782c5ed4e3SBram Moolenaar      'catch',
22792c5ed4e3SBram Moolenaar      'endtry# comment',
2280f8103f27SBram Moolenaar      ], 'E1144:')
22812c5ed4e3SBram Moolenaar
22822c5ed4e3SBram Moolenaar  CheckScriptSuccess([
22832c5ed4e3SBram Moolenaar      'vim9script',
22842c5ed4e3SBram Moolenaar      'hi # comment',
22852c5ed4e3SBram Moolenaar      ])
22862c5ed4e3SBram Moolenaar  CheckScriptFailure([
22872c5ed4e3SBram Moolenaar      'vim9script',
22882c5ed4e3SBram Moolenaar      'hi# comment',
2289f8103f27SBram Moolenaar      ], 'E1144:')
22901966c248SBram Moolenaar  CheckScriptSuccess([
22911966c248SBram Moolenaar      'vim9script',
22921966c248SBram Moolenaar      'hi Search # comment',
22931966c248SBram Moolenaar      ])
22941966c248SBram Moolenaar  CheckScriptFailure([
22951966c248SBram Moolenaar      'vim9script',
22961966c248SBram Moolenaar      'hi Search# comment',
22971966c248SBram Moolenaar      ], 'E416:')
22981966c248SBram Moolenaar  CheckScriptSuccess([
22991966c248SBram Moolenaar      'vim9script',
23001966c248SBram Moolenaar      'hi link This Search # comment',
23011966c248SBram Moolenaar      ])
23021966c248SBram Moolenaar  CheckScriptFailure([
23031966c248SBram Moolenaar      'vim9script',
23041966c248SBram Moolenaar      'hi link This That# comment',
23051966c248SBram Moolenaar      ], 'E413:')
23061966c248SBram Moolenaar  CheckScriptSuccess([
23071966c248SBram Moolenaar      'vim9script',
23081966c248SBram Moolenaar      'hi clear This # comment',
23091966c248SBram Moolenaar      'hi clear # comment',
23101966c248SBram Moolenaar      ])
2311f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2312f5be8cdbSBram Moolenaar  # hi clear This# comment',
23131966c248SBram Moolenaar  CheckScriptFailure([
23141966c248SBram Moolenaar      'vim9script',
23151966c248SBram Moolenaar      'hi clear# comment',
23161966c248SBram Moolenaar      ], 'E416:')
23171966c248SBram Moolenaar
23181966c248SBram Moolenaar  CheckScriptSuccess([
23191966c248SBram Moolenaar      'vim9script',
23201966c248SBram Moolenaar      'hi Group term=bold',
23211966c248SBram Moolenaar      'match Group /todo/ # comment',
23221966c248SBram Moolenaar      ])
23231966c248SBram Moolenaar  CheckScriptFailure([
23241966c248SBram Moolenaar      'vim9script',
23251966c248SBram Moolenaar      'hi Group term=bold',
23261966c248SBram Moolenaar      'match Group /todo/# comment',
23271966c248SBram Moolenaar      ], 'E488:')
23281966c248SBram Moolenaar  CheckScriptSuccess([
23291966c248SBram Moolenaar      'vim9script',
23301966c248SBram Moolenaar      'match # comment',
23311966c248SBram Moolenaar      ])
23321966c248SBram Moolenaar  CheckScriptFailure([
23331966c248SBram Moolenaar      'vim9script',
23341966c248SBram Moolenaar      'match# comment',
2335f8103f27SBram Moolenaar      ], 'E1144:')
23361966c248SBram Moolenaar  CheckScriptSuccess([
23371966c248SBram Moolenaar      'vim9script',
23381966c248SBram Moolenaar      'match none # comment',
23391966c248SBram Moolenaar      ])
23401966c248SBram Moolenaar  CheckScriptFailure([
23411966c248SBram Moolenaar      'vim9script',
23421966c248SBram Moolenaar      'match none# comment',
23431966c248SBram Moolenaar      ], 'E475:')
23441966c248SBram Moolenaar
23451966c248SBram Moolenaar  CheckScriptSuccess([
23461966c248SBram Moolenaar      'vim9script',
23471966c248SBram Moolenaar      'menutrans clear # comment',
23481966c248SBram Moolenaar      ])
23491966c248SBram Moolenaar  CheckScriptFailure([
23501966c248SBram Moolenaar      'vim9script',
23511966c248SBram Moolenaar      'menutrans clear# comment text',
23521966c248SBram Moolenaar      ], 'E474:')
23531966c248SBram Moolenaar
23541966c248SBram Moolenaar  CheckScriptSuccess([
23551966c248SBram Moolenaar      'vim9script',
23561966c248SBram Moolenaar      'syntax clear # comment',
23571966c248SBram Moolenaar      ])
23581966c248SBram Moolenaar  CheckScriptFailure([
23591966c248SBram Moolenaar      'vim9script',
23601966c248SBram Moolenaar      'syntax clear# comment text',
23611966c248SBram Moolenaar      ], 'E28:')
23621966c248SBram Moolenaar  CheckScriptSuccess([
23631966c248SBram Moolenaar      'vim9script',
23641966c248SBram Moolenaar      'syntax keyword Word some',
23651966c248SBram Moolenaar      'syntax clear Word # comment',
23661966c248SBram Moolenaar      ])
23671966c248SBram Moolenaar  CheckScriptFailure([
23681966c248SBram Moolenaar      'vim9script',
23691966c248SBram Moolenaar      'syntax keyword Word some',
23701966c248SBram Moolenaar      'syntax clear Word# comment text',
23711966c248SBram Moolenaar      ], 'E28:')
23721966c248SBram Moolenaar
23731966c248SBram Moolenaar  CheckScriptSuccess([
23741966c248SBram Moolenaar      'vim9script',
23751966c248SBram Moolenaar      'syntax list # comment',
23761966c248SBram Moolenaar      ])
23771966c248SBram Moolenaar  CheckScriptFailure([
23781966c248SBram Moolenaar      'vim9script',
23791966c248SBram Moolenaar      'syntax list# comment text',
23801966c248SBram Moolenaar      ], 'E28:')
23811966c248SBram Moolenaar
23821966c248SBram Moolenaar  CheckScriptSuccess([
23831966c248SBram Moolenaar      'vim9script',
23841966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
23851966c248SBram Moolenaar      ])
23861966c248SBram Moolenaar  CheckScriptFailure([
23871966c248SBram Moolenaar      'vim9script',
23881966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
23891966c248SBram Moolenaar      ], 'E475:')
23901966c248SBram Moolenaar
23911966c248SBram Moolenaar  CheckScriptSuccess([
23921966c248SBram Moolenaar      'vim9script',
23931966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
23941966c248SBram Moolenaar      ])
23951966c248SBram Moolenaar  CheckScriptFailure([
23961966c248SBram Moolenaar      'vim9script',
23971966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
23981966c248SBram Moolenaar      ], 'E789:')
23991966c248SBram Moolenaar
24001966c248SBram Moolenaar  CheckScriptSuccess([
24011966c248SBram Moolenaar      'vim9script',
24021966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
24031966c248SBram Moolenaar      ])
24041966c248SBram Moolenaar  CheckScriptFailure([
24051966c248SBram Moolenaar      'vim9script',
24061966c248SBram Moolenaar      'syntax match Word /pat/# comment',
24071966c248SBram Moolenaar      ], 'E402:')
24081966c248SBram Moolenaar
24091966c248SBram Moolenaar  CheckScriptSuccess([
24101966c248SBram Moolenaar      'vim9script',
24111966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
24121966c248SBram Moolenaar      ])
24131966c248SBram Moolenaar  CheckScriptFailure([
24141966c248SBram Moolenaar      'vim9script',
24151966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
24161966c248SBram Moolenaar      ], 'E475:')
24171966c248SBram Moolenaar  CheckScriptFailure([
24181966c248SBram Moolenaar      'vim9script',
24191966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
24201966c248SBram Moolenaar      ], 'E406:')
24211966c248SBram Moolenaar  CheckScriptFailure([
24221966c248SBram Moolenaar      'vim9script',
24231966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
24241966c248SBram Moolenaar      ], 'E475:')
24251966c248SBram Moolenaar
24261966c248SBram Moolenaar  CheckScriptSuccess([
24271966c248SBram Moolenaar      'vim9script',
24281966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
24291966c248SBram Moolenaar      ])
24301966c248SBram Moolenaar  CheckScriptFailure([
24311966c248SBram Moolenaar      'vim9script',
24321966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2433d032f34aSBram Moolenaar      ], 'E402:')
24341966c248SBram Moolenaar
24351966c248SBram Moolenaar  CheckScriptSuccess([
24361966c248SBram Moolenaar      'vim9script',
24371966c248SBram Moolenaar      'syntax sync # comment',
24381966c248SBram Moolenaar      ])
24391966c248SBram Moolenaar  CheckScriptFailure([
24401966c248SBram Moolenaar      'vim9script',
24411966c248SBram Moolenaar      'syntax sync# comment',
24421966c248SBram Moolenaar      ], 'E404:')
24431966c248SBram Moolenaar  CheckScriptSuccess([
24441966c248SBram Moolenaar      'vim9script',
24451966c248SBram Moolenaar      'syntax sync ccomment # comment',
24461966c248SBram Moolenaar      ])
24471966c248SBram Moolenaar  CheckScriptFailure([
24481966c248SBram Moolenaar      'vim9script',
24491966c248SBram Moolenaar      'syntax sync ccomment# comment',
24501966c248SBram Moolenaar      ], 'E404:')
24511966c248SBram Moolenaar
24521966c248SBram Moolenaar  CheckScriptSuccess([
24531966c248SBram Moolenaar      'vim9script',
24541966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
24551966c248SBram Moolenaar      ])
24561966c248SBram Moolenaar  CheckScriptFailure([
24571966c248SBram Moolenaar      'vim9script',
24581966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
24591966c248SBram Moolenaar      ], 'E475:')
2460a72cfb80SBram Moolenaar
2461a72cfb80SBram Moolenaar  CheckScriptSuccess([
2462a72cfb80SBram Moolenaar      'vim9script',
2463a72cfb80SBram Moolenaar      'command Echo echo # comment',
2464a72cfb80SBram Moolenaar      'command Echo # comment',
24652d870f8dSBram Moolenaar      'delcommand Echo',
2466a72cfb80SBram Moolenaar      ])
2467a72cfb80SBram Moolenaar  CheckScriptFailure([
2468a72cfb80SBram Moolenaar      'vim9script',
2469a72cfb80SBram Moolenaar      'command Echo echo# comment',
2470a72cfb80SBram Moolenaar      'Echo',
2471f8103f27SBram Moolenaar      ], 'E1144:')
24722d870f8dSBram Moolenaar  delcommand Echo
247370249ee8SBram Moolenaar
247470249ee8SBram Moolenaar  var curdir = getcwd()
247570249ee8SBram Moolenaar  CheckScriptSuccess([
247670249ee8SBram Moolenaar      'command Echo cd " comment',
247770249ee8SBram Moolenaar      'Echo',
247870249ee8SBram Moolenaar      'delcommand Echo',
247970249ee8SBram Moolenaar      ])
248070249ee8SBram Moolenaar  CheckScriptSuccess([
2481090728adSBram Moolenaar      'vim9script',
248270249ee8SBram Moolenaar      'command Echo cd # comment',
248370249ee8SBram Moolenaar      'Echo',
248470249ee8SBram Moolenaar      'delcommand Echo',
248570249ee8SBram Moolenaar      ])
248670249ee8SBram Moolenaar  CheckScriptFailure([
248770249ee8SBram Moolenaar      'vim9script',
248870249ee8SBram Moolenaar      'command Echo cd " comment',
248970249ee8SBram Moolenaar      'Echo',
249070249ee8SBram Moolenaar      ], 'E344:')
249170249ee8SBram Moolenaar  delcommand Echo
249270249ee8SBram Moolenaar  chdir(curdir)
249370249ee8SBram Moolenaar
2494a72cfb80SBram Moolenaar  CheckScriptFailure([
2495a72cfb80SBram Moolenaar      'vim9script',
2496a72cfb80SBram Moolenaar      'command Echo# comment',
2497a72cfb80SBram Moolenaar      ], 'E182:')
2498a72cfb80SBram Moolenaar  CheckScriptFailure([
2499a72cfb80SBram Moolenaar      'vim9script',
2500a72cfb80SBram Moolenaar      'command Echo echo',
2501a72cfb80SBram Moolenaar      'command Echo# comment',
2502a72cfb80SBram Moolenaar      ], 'E182:')
25032d870f8dSBram Moolenaar  delcommand Echo
2504a72cfb80SBram Moolenaar
2505a72cfb80SBram Moolenaar  CheckScriptSuccess([
2506a72cfb80SBram Moolenaar      'vim9script',
2507a72cfb80SBram Moolenaar      'function # comment',
2508a72cfb80SBram Moolenaar      ])
2509a72cfb80SBram Moolenaar  CheckScriptFailure([
2510a72cfb80SBram Moolenaar      'vim9script',
25119898107fSBram Moolenaar      'function " comment',
25129898107fSBram Moolenaar      ], 'E129:')
25139898107fSBram Moolenaar  CheckScriptFailure([
25149898107fSBram Moolenaar      'vim9script',
2515a72cfb80SBram Moolenaar      'function# comment',
2516f8103f27SBram Moolenaar      ], 'E1144:')
2517a72cfb80SBram Moolenaar  CheckScriptSuccess([
2518a72cfb80SBram Moolenaar      'vim9script',
2519a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2520a72cfb80SBram Moolenaar      ])
2521a72cfb80SBram Moolenaar  CheckScriptFailure([
2522a72cfb80SBram Moolenaar      'vim9script',
2523a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2524a72cfb80SBram Moolenaar      ], 'E488:')
2525a72cfb80SBram Moolenaar
2526a72cfb80SBram Moolenaar  CheckScriptSuccess([
2527a72cfb80SBram Moolenaar      'vim9script',
25284c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2529a72cfb80SBram Moolenaar      'endfunc',
25304c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2531a72cfb80SBram Moolenaar      ])
2532a72cfb80SBram Moolenaar  CheckScriptFailure([
2533a72cfb80SBram Moolenaar      'vim9script',
25344c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2535a72cfb80SBram Moolenaar      'endfunc',
25364c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2537a72cfb80SBram Moolenaar      ], 'E488:')
2538a72cfb80SBram Moolenaar
2539a72cfb80SBram Moolenaar  CheckScriptSuccess([
2540a72cfb80SBram Moolenaar      'vim9script',
2541a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2542a72cfb80SBram Moolenaar      ])
2543a72cfb80SBram Moolenaar  CheckScriptFailure([
2544a72cfb80SBram Moolenaar      'vim9script',
2545a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2546a72cfb80SBram Moolenaar      ], 'E488:')
2547e7e4838fSBram Moolenaar
2548e7e4838fSBram Moolenaar  CheckScriptFailure([
2549e7e4838fSBram Moolenaar      'def Test() " comment',
2550e7e4838fSBram Moolenaar      'enddef',
2551e7e4838fSBram Moolenaar      ], 'E488:')
2552e7e4838fSBram Moolenaar  CheckScriptFailure([
2553e7e4838fSBram Moolenaar      'vim9script',
2554e7e4838fSBram Moolenaar      'def Test() " comment',
2555e7e4838fSBram Moolenaar      'enddef',
2556e7e4838fSBram Moolenaar      ], 'E488:')
2557e7e4838fSBram Moolenaar
2558e7e4838fSBram Moolenaar  CheckScriptSuccess([
2559e7e4838fSBram Moolenaar      'func Test() " comment',
2560e7e4838fSBram Moolenaar      'endfunc',
25612d870f8dSBram Moolenaar      'delfunc Test',
2562e7e4838fSBram Moolenaar      ])
25639898107fSBram Moolenaar  CheckScriptSuccess([
2564e7e4838fSBram Moolenaar      'vim9script',
2565e7e4838fSBram Moolenaar      'func Test() " comment',
2566e7e4838fSBram Moolenaar      'endfunc',
25679898107fSBram Moolenaar      ])
2568e7e4838fSBram Moolenaar
2569e7e4838fSBram Moolenaar  CheckScriptSuccess([
2570e7e4838fSBram Moolenaar      'def Test() # comment',
2571e7e4838fSBram Moolenaar      'enddef',
2572e7e4838fSBram Moolenaar      ])
2573e7e4838fSBram Moolenaar  CheckScriptFailure([
2574e7e4838fSBram Moolenaar      'func Test() # comment',
2575e7e4838fSBram Moolenaar      'endfunc',
2576e7e4838fSBram Moolenaar      ], 'E488:')
25772c5ed4e3SBram Moolenaarenddef
25782c5ed4e3SBram Moolenaar
25792c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
25802c5ed4e3SBram Moolenaar  CheckCanRunGui
25812c5ed4e3SBram Moolenaar
25822c5ed4e3SBram Moolenaar  CheckScriptFailure([
25832c5ed4e3SBram Moolenaar      'vim9script',
25842c5ed4e3SBram Moolenaar      'gui#comment'
2585f8103f27SBram Moolenaar      ], 'E1144:')
25862c5ed4e3SBram Moolenaar  CheckScriptFailure([
25872c5ed4e3SBram Moolenaar      'vim9script',
25882c5ed4e3SBram Moolenaar      'gui -f#comment'
25892c5ed4e3SBram Moolenaar      ], 'E499:')
25907a092245SBram Moolenaarenddef
25917a092245SBram Moolenaar
2592a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
25936797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
25946797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2595a26b9700SBram Moolenaar
2596a26b9700SBram Moolenaar  edit test.vim
2597a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2598a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2599a26b9700SBram Moolenaar
2600a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2601a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2602a26b9700SBram Moolenaar
2603a26b9700SBram Moolenaar  g:entered = 0
2604a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2605a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2606a26b9700SBram Moolenaar
2607a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2608a26b9700SBram Moolenaar
2609a26b9700SBram Moolenaar  au! TabEnter
2610a26b9700SBram Moolenaar  unlet g:entered
2611d72c1bf0SBram Moolenaar
2612d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2613d72c1bf0SBram Moolenaar      'vim9script',
26146797966dSBram Moolenaar      'g:var = 123',
2615e55b1c09SBram Moolenaar      'b:var = 456',
2616e55b1c09SBram Moolenaar      'w:var = 777',
2617e55b1c09SBram Moolenaar      't:var = 888',
2618d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2619d72c1bf0SBram Moolenaar      ])
2620d72c1bf0SBram Moolenaar
2621d72c1bf0SBram Moolenaar  CheckScriptFailure([
2622d72c1bf0SBram Moolenaar      'vim9script',
2623cfcd011fSBram Moolenaar      'let var = 123',
2624cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2625cfcd011fSBram Moolenaar
2626cfcd011fSBram Moolenaar  CheckScriptFailure([
2627cfcd011fSBram Moolenaar      'vim9script',
2628cfcd011fSBram Moolenaar      'var g:var = 123',
2629e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2630e55b1c09SBram Moolenaar
2631e55b1c09SBram Moolenaar  CheckScriptFailure([
2632e55b1c09SBram Moolenaar      'vim9script',
2633cfcd011fSBram Moolenaar      'var b:var = 123',
2634e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2635e55b1c09SBram Moolenaar
2636e55b1c09SBram Moolenaar  CheckScriptFailure([
2637e55b1c09SBram Moolenaar      'vim9script',
2638cfcd011fSBram Moolenaar      'var w:var = 123',
2639e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2640e55b1c09SBram Moolenaar
2641e55b1c09SBram Moolenaar  CheckScriptFailure([
2642e55b1c09SBram Moolenaar      'vim9script',
2643cfcd011fSBram Moolenaar      'var t:var = 123',
2644e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2645e55b1c09SBram Moolenaar
2646e55b1c09SBram Moolenaar  CheckScriptFailure([
2647e55b1c09SBram Moolenaar      'vim9script',
2648cfcd011fSBram Moolenaar      'var v:version = 123',
2649e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2650e55b1c09SBram Moolenaar
2651e55b1c09SBram Moolenaar  CheckScriptFailure([
2652e55b1c09SBram Moolenaar      'vim9script',
2653cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2654e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
26556797966dSBram Moolenaar
26566797966dSBram Moolenaar  CheckScriptFailure([
26576797966dSBram Moolenaar      'vim9script',
26586797966dSBram Moolenaar      'g:var = 123',
265932e35117SBram Moolenaar      'unlet g:var# comment1',
2660d72c1bf0SBram Moolenaar      ], 'E108:')
2661d72c1bf0SBram Moolenaar
2662d72c1bf0SBram Moolenaar  CheckScriptFailure([
2663d72c1bf0SBram Moolenaar      'let g:var = 123',
2664d72c1bf0SBram Moolenaar      'unlet g:var # something',
2665d72c1bf0SBram Moolenaar      ], 'E488:')
2666faac4104SBram Moolenaar
2667faac4104SBram Moolenaar  CheckScriptSuccess([
2668faac4104SBram Moolenaar      'vim9script',
266932e35117SBram Moolenaar      'if 1 # comment2',
2670faac4104SBram Moolenaar      '  echo "yes"',
2671faac4104SBram Moolenaar      'elseif 2 #comment',
2672faac4104SBram Moolenaar      '  echo "no"',
2673faac4104SBram Moolenaar      'endif',
2674faac4104SBram Moolenaar      ])
2675faac4104SBram Moolenaar
2676faac4104SBram Moolenaar  CheckScriptFailure([
2677faac4104SBram Moolenaar      'vim9script',
267832e35117SBram Moolenaar      'if 1# comment3',
2679faac4104SBram Moolenaar      '  echo "yes"',
2680faac4104SBram Moolenaar      'endif',
2681faac4104SBram Moolenaar      ], 'E15:')
2682faac4104SBram Moolenaar
2683faac4104SBram Moolenaar  CheckScriptFailure([
2684faac4104SBram Moolenaar      'vim9script',
268532e35117SBram Moolenaar      'if 0 # comment4',
2686faac4104SBram Moolenaar      '  echo "yes"',
2687faac4104SBram Moolenaar      'elseif 2#comment',
2688faac4104SBram Moolenaar      '  echo "no"',
2689faac4104SBram Moolenaar      'endif',
2690faac4104SBram Moolenaar      ], 'E15:')
2691faac4104SBram Moolenaar
2692faac4104SBram Moolenaar  CheckScriptSuccess([
2693faac4104SBram Moolenaar      'vim9script',
2694cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2695faac4104SBram Moolenaar      ])
2696faac4104SBram Moolenaar
2697faac4104SBram Moolenaar  CheckScriptFailure([
2698faac4104SBram Moolenaar      'vim9script',
2699cfcd011fSBram Moolenaar      'var v = 1# comment6',
270032e35117SBram Moolenaar      ], 'E15:')
2701faac4104SBram Moolenaar
2702faac4104SBram Moolenaar  CheckScriptSuccess([
2703faac4104SBram Moolenaar      'vim9script',
2704faac4104SBram Moolenaar      'new'
2705d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2706df069eecSBram Moolenaar      ':$',
2707faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2708faac4104SBram Moolenaar      'bwipe!',
2709faac4104SBram Moolenaar      ])
2710faac4104SBram Moolenaar
2711f5be8cdbSBram Moolenaar  CheckScriptFailure([
2712f5be8cdbSBram Moolenaar      'vim9script',
2713f5be8cdbSBram Moolenaar      'new'
2714d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2715f5be8cdbSBram Moolenaar      ':$',
2716f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2717f5be8cdbSBram Moolenaar      'bwipe!',
2718f5be8cdbSBram Moolenaar      ], 'E488:')
2719f5be8cdbSBram Moolenaar
2720f5be8cdbSBram Moolenaar  CheckScriptFailure([
2721f5be8cdbSBram Moolenaar      'vim9script',
2722f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2723f5be8cdbSBram Moolenaar      ], 'E477:')
2724a26b9700SBram Moolenaarenddef
2725a26b9700SBram Moolenaar
27267e5bd91dSBram Moolenaardef Test_finish()
2727cfcd011fSBram Moolenaar  var lines =<< trim END
27287e5bd91dSBram Moolenaar    vim9script
27296797966dSBram Moolenaar    g:res = 'one'
27307e5bd91dSBram Moolenaar    if v:false | finish | endif
27316797966dSBram Moolenaar    g:res = 'two'
27327e5bd91dSBram Moolenaar    finish
27336797966dSBram Moolenaar    g:res = 'three'
27347e5bd91dSBram Moolenaar  END
27357e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
27367e5bd91dSBram Moolenaar  source Xfinished
27377e5bd91dSBram Moolenaar  assert_equal('two', g:res)
27387e5bd91dSBram Moolenaar
27397e5bd91dSBram Moolenaar  unlet g:res
27407e5bd91dSBram Moolenaar  delete('Xfinished')
27417e5bd91dSBram Moolenaarenddef
27427e5bd91dSBram Moolenaar
2743a5d0077eSBram Moolenaardef Test_forward_declaration()
2744cfcd011fSBram Moolenaar  var lines =<< trim END
2745a5d0077eSBram Moolenaar    vim9script
2746a5d0077eSBram Moolenaar    def GetValue(): string
2747a5d0077eSBram Moolenaar      return theVal
2748a5d0077eSBram Moolenaar    enddef
2749cfcd011fSBram Moolenaar    var theVal = 'something'
2750822ba247SBram Moolenaar    g:initVal = GetValue()
2751a5d0077eSBram Moolenaar    theVal = 'else'
2752a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2753a5d0077eSBram Moolenaar  END
2754a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2755a5d0077eSBram Moolenaar  source Xforward
2756a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2757a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2758a5d0077eSBram Moolenaar
2759a5d0077eSBram Moolenaar  unlet g:initVal
2760a5d0077eSBram Moolenaar  unlet g:laterVal
2761a5d0077eSBram Moolenaar  delete('Xforward')
2762a5d0077eSBram Moolenaarenddef
2763a5d0077eSBram Moolenaar
27649721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2765cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
27669721fb4eSBram Moolenaar    source Xvim9_script.vim
27679721fb4eSBram Moolenaar
27689721fb4eSBram Moolenaar    call assert_false(exists('local'))
27699721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27709721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
27719721fb4eSBram Moolenaar    call assert_equal('global', global)
27729721fb4eSBram Moolenaar    call assert_equal('global', g:global)
27739721fb4eSBram Moolenaar
27749721fb4eSBram Moolenaar    " imported variable becomes script-local
27759721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
27769721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
27779721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27789721fb4eSBram Moolenaar
27799721fb4eSBram Moolenaar    " imported function becomes script-local
27809721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
27819721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
27829721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
27839721fb4eSBram Moolenaar  END
27849721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
27859721fb4eSBram Moolenaar
2786cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
27879721fb4eSBram Moolenaar    vim9script
2788cfcd011fSBram Moolenaar    var local = 'local'
27899721fb4eSBram Moolenaar    g:global = 'global'
2790cfcd011fSBram Moolenaar    export var exported = 'exported'
27919721fb4eSBram Moolenaar    export def GetText(): string
27929721fb4eSBram Moolenaar       return 'text'
27939721fb4eSBram Moolenaar    enddef
27949721fb4eSBram Moolenaar  END
27959721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
27969721fb4eSBram Moolenaar
27979721fb4eSBram Moolenaar  source Xlegacy_script.vim
27989721fb4eSBram Moolenaar
27999721fb4eSBram Moolenaar  assert_equal('global', g:global)
2800f5be8cdbSBram Moolenaar  unlet g:global
28019721fb4eSBram Moolenaar
28029721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
28039721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
28049721fb4eSBram Moolenaarenddef
2805a5d0077eSBram Moolenaar
28067d699701SBram Moolenaarfunc Test_vim9script_not_global()
28077d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
28087d699701SBram Moolenaar  let vim9lines =<< trim END
28097d699701SBram Moolenaar    vim9script
2810cfcd011fSBram Moolenaar    var name = 'local'
28117d699701SBram Moolenaar    func TheFunc()
28127d699701SBram Moolenaar      echo 'local'
28137d699701SBram Moolenaar    endfunc
28147d699701SBram Moolenaar    def DefFunc()
28157d699701SBram Moolenaar      echo 'local'
28167d699701SBram Moolenaar    enddef
28177d699701SBram Moolenaar  END
28187d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
28197d699701SBram Moolenaar  source Xvim9script.vim
28207d699701SBram Moolenaar  try
28217d699701SBram Moolenaar    echo g:var
28227d699701SBram Moolenaar    assert_report('did not fail')
28237d699701SBram Moolenaar  catch /E121:/
28247d699701SBram Moolenaar    " caught
28257d699701SBram Moolenaar  endtry
28267d699701SBram Moolenaar  try
28277d699701SBram Moolenaar    call TheFunc()
28287d699701SBram Moolenaar    assert_report('did not fail')
28297d699701SBram Moolenaar  catch /E117:/
28307d699701SBram Moolenaar    " caught
28317d699701SBram Moolenaar  endtry
28327d699701SBram Moolenaar  try
28337d699701SBram Moolenaar    call DefFunc()
28347d699701SBram Moolenaar    assert_report('did not fail')
28357d699701SBram Moolenaar  catch /E117:/
28367d699701SBram Moolenaar    " caught
28377d699701SBram Moolenaar  endtry
28387d699701SBram Moolenaar
283925859dd7SBram Moolenaar  call delete('Xvim9script.vim')
28407d699701SBram Moolenaarendfunc
28417d699701SBram Moolenaar
2842eeb27bfeSBram Moolenaardef Test_vim9_copen()
2843eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2844eeb27bfeSBram Moolenaar  copen
2845eeb27bfeSBram Moolenaar  quit
2846eeb27bfeSBram Moolenaarenddef
2847eeb27bfeSBram Moolenaar
284803290b84SBram Moolenaar" test using an auto-loaded function and variable
28492d6b20d6SBram Moolenaardef Test_vim9_autoload()
2850cfcd011fSBram Moolenaar  var lines =<< trim END
28512d6b20d6SBram Moolenaar     vim9script
285203290b84SBram Moolenaar     def some#gettest(): string
285303290b84SBram Moolenaar       return 'test'
285403290b84SBram Moolenaar     enddef
285503290b84SBram Moolenaar     g:some#name = 'name'
285603290b84SBram Moolenaar  END
285703290b84SBram Moolenaar
285803290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
285903290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
286003290b84SBram Moolenaar  var save_rtp = &rtp
286103290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
286203290b84SBram Moolenaar
286303290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
286403290b84SBram Moolenaar  assert_equal('name', g:some#name)
286503290b84SBram Moolenaar  g:some#other = 'other'
286603290b84SBram Moolenaar  assert_equal('other', g:some#other)
286703290b84SBram Moolenaar
286817f700acSBram Moolenaar  # upper case script name works
286917f700acSBram Moolenaar  lines =<< trim END
287017f700acSBram Moolenaar     vim9script
287117f700acSBram Moolenaar     def Other#getOther(): string
287217f700acSBram Moolenaar       return 'other'
287317f700acSBram Moolenaar     enddef
287417f700acSBram Moolenaar  END
287517f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
287617f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
287717f700acSBram Moolenaar
287803290b84SBram Moolenaar  delete('Xdir', 'rf')
287903290b84SBram Moolenaar  &rtp = save_rtp
288003290b84SBram Moolenaarenddef
288103290b84SBram Moolenaar
288203290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
288303290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
288403290b84SBram Moolenaar  var lines =<< trim END
288503290b84SBram Moolenaar     vim9script
28862d6b20d6SBram Moolenaar     def foo#test()
28872d6b20d6SBram Moolenaar         echomsg getreg('"')
28882d6b20d6SBram Moolenaar     enddef
28892d6b20d6SBram Moolenaar  END
28902d6b20d6SBram Moolenaar
28912d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
28922d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2893cfcd011fSBram Moolenaar  var save_rtp = &rtp
28942d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
28952d6b20d6SBram Moolenaar  augroup test
28962d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
28972d6b20d6SBram Moolenaar  augroup END
28982d6b20d6SBram Moolenaar
28992d6b20d6SBram Moolenaar  normal Y
29002d6b20d6SBram Moolenaar
29012d6b20d6SBram Moolenaar  augroup test
29022d6b20d6SBram Moolenaar    autocmd!
29032d6b20d6SBram Moolenaar  augroup END
29042d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
29052d6b20d6SBram Moolenaar  &rtp = save_rtp
29062d6b20d6SBram Moolenaarenddef
29072d6b20d6SBram Moolenaar
290877e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
290977e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2910cfcd011fSBram Moolenaar  var lines =<< trim END
291177e5dcc3SBram Moolenaar      vim9script
291277e5dcc3SBram Moolenaar      def crash#func()
291377e5dcc3SBram Moolenaar          try
291477e5dcc3SBram Moolenaar              for x in List()
291577e5dcc3SBram Moolenaar              endfor
291677e5dcc3SBram Moolenaar          catch
291777e5dcc3SBram Moolenaar          endtry
291877e5dcc3SBram Moolenaar          g:ok = true
291977e5dcc3SBram Moolenaar      enddef
292077e5dcc3SBram Moolenaar      fu List()
292177e5dcc3SBram Moolenaar          invalid
292277e5dcc3SBram Moolenaar      endfu
292377e5dcc3SBram Moolenaar      try
292477e5dcc3SBram Moolenaar          invalid
292577e5dcc3SBram Moolenaar      catch /wontmatch/
292677e5dcc3SBram Moolenaar      endtry
292777e5dcc3SBram Moolenaar  END
292877e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
292977e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
293077e5dcc3SBram Moolenaar
293177e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
293277e5dcc3SBram Moolenaar  lines =<< trim END
293377e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
293477e5dcc3SBram Moolenaar    call crash#func()
293577e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
29369c4f5520SBram Moolenaar    qall!
293777e5dcc3SBram Moolenaar  END
293877e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
293977e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
294077e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
294177e5dcc3SBram Moolenaar
294277e5dcc3SBram Moolenaar  delete('Xdidit')
294377e5dcc3SBram Moolenaar  delete('Xscript')
294477e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
294503290b84SBram Moolenaar
294603290b84SBram Moolenaar  lines =<< trim END
294703290b84SBram Moolenaar    vim9script
294803290b84SBram Moolenaar    var foo#bar = 'asdf'
294903290b84SBram Moolenaar  END
295003290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
295177e5dcc3SBram Moolenaarenddef
295277e5dcc3SBram Moolenaar
295381e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
295481e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
295581e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2956cfcd011fSBram Moolenaar  var lines =<< trim END
295781e17fbeSBram Moolenaar    let s:counter = 1
295881e17fbeSBram Moolenaar    def s:Func()
295981e17fbeSBram Moolenaar      au! CursorHold
296081e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
296181e17fbeSBram Moolenaar    enddef
296281e17fbeSBram Moolenaar    call s:Func()
296381e17fbeSBram Moolenaar    doau CursorHold
296481e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
296581e17fbeSBram Moolenaar    au! CursorHold
296681e17fbeSBram Moolenaar  END
296781e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
296881e17fbeSBram Moolenaarenddef
296981e17fbeSBram Moolenaar
29703896a105SBram Moolenaardef Test_cmdline_win()
29713896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
29723896a105SBram Moolenaar  # the command line window.
29733896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2974cfcd011fSBram Moolenaar  var export_lines =<< trim END
29753896a105SBram Moolenaar    vim9script
2976cfcd011fSBram Moolenaar    export var That = 'yes'
29773896a105SBram Moolenaar  END
29783896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2979cfcd011fSBram Moolenaar  var import_lines =<< trim END
29803896a105SBram Moolenaar    vim9script
29813896a105SBram Moolenaar    import That from './Xexport.vim'
29823896a105SBram Moolenaar  END
29833896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2984cfcd011fSBram Moolenaar  var save_rtp = &rtp
29853896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
29863896a105SBram Moolenaar  syntax on
29873896a105SBram Moolenaar  augroup CmdWin
29883896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
29893896a105SBram Moolenaar  augroup END
29903896a105SBram Moolenaar  # this will open and also close the cmdline window
29913896a105SBram Moolenaar  feedkeys('q:', 'xt')
29923896a105SBram Moolenaar  assert_equal('yes', g:got_there)
29933896a105SBram Moolenaar
29943896a105SBram Moolenaar  augroup CmdWin
29953896a105SBram Moolenaar    au!
29963896a105SBram Moolenaar  augroup END
29973896a105SBram Moolenaar  &rtp = save_rtp
29983896a105SBram Moolenaar  delete('rtp', 'rf')
29993896a105SBram Moolenaarenddef
30003896a105SBram Moolenaar
3001e3d4685fSBram Moolenaardef Test_invalid_sid()
3002e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
300325859dd7SBram Moolenaar
30049c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3005d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3006e3d4685fSBram Moolenaar  endif
3007e3d4685fSBram Moolenaar  delete('Xdidit')
3008e3d4685fSBram Moolenaarenddef
3009e3d4685fSBram Moolenaar
30109ec7026fSBram Moolenaardef Test_restoring_cpo()
30119ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
30129ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
30139ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
30149ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
30159ec7026fSBram Moolenaar  endif
30169ec7026fSBram Moolenaar  delete('Xsourced')
30179ec7026fSBram Moolenaar  delete('Xclose')
3018090728adSBram Moolenaar  delete('Xdone')
30199ec7026fSBram Moolenaarenddef
30209ec7026fSBram Moolenaar
30219ec7026fSBram Moolenaar
3022f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3023cfcd011fSBram Moolenaar  var lines =<< trim END
3024cfcd011fSBram Moolenaar    var name: any
3025cfcd011fSBram Moolenaar    assert_equal(0, name)
3026f0afd9e1SBram Moolenaar  END
3027f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3028f0afd9e1SBram Moolenaarenddef
3029f0afd9e1SBram Moolenaar
30307e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
303158dbef33SBram Moolenaar  CheckRunVimInTerminal
303258dbef33SBram Moolenaar
30337e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
30347e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
30357e9210eaSBram Moolenaarendfunc
30367e9210eaSBram Moolenaar
30377e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
30389c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3039cfcd011fSBram Moolenaar  var lines =<< trim END
30409c4f5520SBram Moolenaar    func CheckAndQuit()
30419c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
30429c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
30439c4f5520SBram Moolenaar    endfunc
30449c4f5520SBram Moolenaar  END
30459c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
30469c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3047e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
30489c4f5520SBram Moolenaar  # define Afunc() on the command line
30499c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
30509c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
30519c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
30529c4f5520SBram Moolenaar
30539c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
30549c4f5520SBram Moolenaar  delete('XcallFunc')
30559c4f5520SBram Moolenaar  delete('Xdidcmd')
30569c4f5520SBram Moolenaarenddef
30579c4f5520SBram Moolenaar
3058fcdc5d83SBram Moolenaardef Test_script_var_scope()
3059fcdc5d83SBram Moolenaar  var lines =<< trim END
3060fcdc5d83SBram Moolenaar      vim9script
3061fcdc5d83SBram Moolenaar      if true
3062fcdc5d83SBram Moolenaar        if true
3063fcdc5d83SBram Moolenaar          var one = 'one'
3064fcdc5d83SBram Moolenaar          echo one
3065fcdc5d83SBram Moolenaar        endif
3066fcdc5d83SBram Moolenaar        echo one
3067fcdc5d83SBram Moolenaar      endif
3068fcdc5d83SBram Moolenaar  END
3069fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3070fcdc5d83SBram Moolenaar
3071fcdc5d83SBram Moolenaar  lines =<< trim END
3072fcdc5d83SBram Moolenaar      vim9script
3073fcdc5d83SBram Moolenaar      if true
3074fcdc5d83SBram Moolenaar        if false
3075fcdc5d83SBram Moolenaar          var one = 'one'
3076fcdc5d83SBram Moolenaar          echo one
3077fcdc5d83SBram Moolenaar        else
3078fcdc5d83SBram Moolenaar          var one = 'one'
3079fcdc5d83SBram Moolenaar          echo one
3080fcdc5d83SBram Moolenaar        endif
3081fcdc5d83SBram Moolenaar        echo one
3082fcdc5d83SBram Moolenaar      endif
3083fcdc5d83SBram Moolenaar  END
3084fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3085fcdc5d83SBram Moolenaar
3086fcdc5d83SBram Moolenaar  lines =<< trim END
3087fcdc5d83SBram Moolenaar      vim9script
3088fcdc5d83SBram Moolenaar      while true
3089fcdc5d83SBram Moolenaar        var one = 'one'
3090fcdc5d83SBram Moolenaar        echo one
3091fcdc5d83SBram Moolenaar        break
3092fcdc5d83SBram Moolenaar      endwhile
3093fcdc5d83SBram Moolenaar      echo one
3094fcdc5d83SBram Moolenaar  END
3095fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3096fcdc5d83SBram Moolenaar
3097fcdc5d83SBram Moolenaar  lines =<< trim END
3098fcdc5d83SBram Moolenaar      vim9script
3099fcdc5d83SBram Moolenaar      for i in range(1)
3100fcdc5d83SBram Moolenaar        var one = 'one'
3101fcdc5d83SBram Moolenaar        echo one
3102fcdc5d83SBram Moolenaar      endfor
3103fcdc5d83SBram Moolenaar      echo one
3104fcdc5d83SBram Moolenaar  END
3105fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
31069becdf2bSBram Moolenaar
31079becdf2bSBram Moolenaar  lines =<< trim END
31089becdf2bSBram Moolenaar      vim9script
31099becdf2bSBram Moolenaar      {
31109becdf2bSBram Moolenaar        var one = 'one'
31119becdf2bSBram Moolenaar        assert_equal('one', one)
31129becdf2bSBram Moolenaar      }
31139becdf2bSBram Moolenaar      assert_false(exists('one'))
31149becdf2bSBram Moolenaar      assert_false(exists('s:one'))
31159becdf2bSBram Moolenaar  END
31169becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
31179becdf2bSBram Moolenaar
31189becdf2bSBram Moolenaar  lines =<< trim END
31199becdf2bSBram Moolenaar      vim9script
31209becdf2bSBram Moolenaar      {
31219becdf2bSBram Moolenaar        var one = 'one'
31229becdf2bSBram Moolenaar        echo one
31239becdf2bSBram Moolenaar      }
31249becdf2bSBram Moolenaar      echo one
31259becdf2bSBram Moolenaar  END
31269becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3127fcdc5d83SBram Moolenaarenddef
3128fcdc5d83SBram Moolenaar
3129352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3130352134bbSBram Moolenaar  var lines =<< trim END
3131352134bbSBram Moolenaar    vim9script
3132352134bbSBram Moolenaar    def Callback(...l: any)
3133352134bbSBram Moolenaar      try
3134352134bbSBram Moolenaar        var x: string
3135352134bbSBram Moolenaar        var y: string
3136352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3137352134bbSBram Moolenaar        [x, y] = ['']
3138352134bbSBram Moolenaar      catch
3139352134bbSBram Moolenaar        g:caught = 'yes'
3140352134bbSBram Moolenaar      endtry
3141352134bbSBram Moolenaar    enddef
3142e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3143352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3144352134bbSBram Moolenaar  END
3145352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3146352134bbSBram Moolenaar
3147352134bbSBram Moolenaar  unlet g:caught
3148352134bbSBram Moolenaarenddef
3149352134bbSBram Moolenaar
3150631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3151631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3152631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3153631e8f93SBram Moolenaar  endif
3154631e8f93SBram Moolenaar  var lines =<< trim END
3155631e8f93SBram Moolenaar      vim9script
3156631e8f93SBram Moolenaar      var source: list<number>
3157631e8f93SBram Moolenaar      def Out_cb(...l: any)
3158631e8f93SBram Moolenaar          eval [][0]
3159631e8f93SBram Moolenaar      enddef
3160631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3161631e8f93SBram Moolenaar          sleep 1m
3162631e8f93SBram Moolenaar          source += l
3163631e8f93SBram Moolenaar      enddef
3164e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
31656f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
31666f17a3f0SBram Moolenaar        sleep 10m
31676f17a3f0SBram Moolenaar      endwhile
31686f17a3f0SBram Moolenaar      sleep 10m
3169631e8f93SBram Moolenaar  END
3170631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3171631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3172631e8f93SBram Moolenaar  delete('Xdef')
3173631e8f93SBram Moolenaarenddef
3174631e8f93SBram Moolenaar
31754324d87aSBram Moolenaardef InvokeNormal()
31764324d87aSBram Moolenaar  exe "norm! :m+1\r"
31774324d87aSBram Moolenaarenddef
31784324d87aSBram Moolenaar
31794324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
31804324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
31814324d87aSBram Moolenaar  new
31824324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
31834324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
31844324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
31854324d87aSBram Moolenaar  xunmap <F3>
3186b5b9480eSBram Moolenaarenddef
3187b5b9480eSBram Moolenaar
3188b5b9480eSBram Moolenaardef Test_white_space_after_command()
3189b5b9480eSBram Moolenaar  var lines =<< trim END
3190b5b9480eSBram Moolenaar    exit_cb: Func})
3191b5b9480eSBram Moolenaar  END
3192b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3193f8103f27SBram Moolenaar
3194f8103f27SBram Moolenaar  lines =<< trim END
3195f8103f27SBram Moolenaar    e#
3196f8103f27SBram Moolenaar  END
3197f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
31984324d87aSBram Moolenaarenddef
31994324d87aSBram Moolenaar
32004aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
32014aab88d9SBram Moolenaar  var lines =<< trim END
32024aab88d9SBram Moolenaar      vim9script
32034aab88d9SBram Moolenaar      if exists('g:guard')
32044aab88d9SBram Moolenaar        finish
32054aab88d9SBram Moolenaar      endif
32064aab88d9SBram Moolenaar      g:guard = 1
32074aab88d9SBram Moolenaar      var name = 'thename'
32084aab88d9SBram Moolenaar      def g:GetName(): string
32094aab88d9SBram Moolenaar        return name
32104aab88d9SBram Moolenaar      enddef
32114aab88d9SBram Moolenaar      def g:SetName(arg: string)
32124aab88d9SBram Moolenaar        name = arg
32134aab88d9SBram Moolenaar      enddef
32144aab88d9SBram Moolenaar  END
32154aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
32164aab88d9SBram Moolenaar  so XscriptTwice.vim
32174aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
32184aab88d9SBram Moolenaar  g:SetName('newname')
32194aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
32204aab88d9SBram Moolenaar  so XscriptTwice.vim
32214aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
32224aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
32234aab88d9SBram Moolenaar
32244aab88d9SBram Moolenaar  delfunc g:GetName
32254aab88d9SBram Moolenaar  delfunc g:SetName
32264aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
32274aab88d9SBram Moolenaar  unlet g:guard
32284aab88d9SBram Moolenaarenddef
32294aab88d9SBram Moolenaar
32304aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
32314aab88d9SBram Moolenaar  var exportlines =<< trim END
32324aab88d9SBram Moolenaar      vim9script
32334aab88d9SBram Moolenaar      if exists('g:guard')
32344aab88d9SBram Moolenaar        finish
32354aab88d9SBram Moolenaar      endif
32364aab88d9SBram Moolenaar      g:guard = 1
32374aab88d9SBram Moolenaar      export var name = 'someName'
32384aab88d9SBram Moolenaar  END
32394aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
32404aab88d9SBram Moolenaar
32414aab88d9SBram Moolenaar  var lines =<< trim END
32424aab88d9SBram Moolenaar      vim9script
32434aab88d9SBram Moolenaar      import name from './XexportScript.vim'
32444aab88d9SBram Moolenaar      def g:GetName(): string
32454aab88d9SBram Moolenaar        return name
32464aab88d9SBram Moolenaar      enddef
32474aab88d9SBram Moolenaar  END
32484aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
32494aab88d9SBram Moolenaar  so XscriptImport.vim
32504aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
32514aab88d9SBram Moolenaar
32524aab88d9SBram Moolenaar  so XexportScript.vim
32534aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
32544aab88d9SBram Moolenaar
32554aab88d9SBram Moolenaar  delfunc g:GetName
32564aab88d9SBram Moolenaar  delete('XexportScript.vim')
32574aab88d9SBram Moolenaar  delete('XscriptImport.vim')
32584aab88d9SBram Moolenaar  unlet g:guard
32594aab88d9SBram Moolenaarenddef
32604aab88d9SBram Moolenaar
3261585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3262585fea7bSBram Moolenaardef Test_substitute_cmd()
3263585fea7bSBram Moolenaar  new
3264585fea7bSBram Moolenaar  setline(1, 'something')
3265585fea7bSBram Moolenaar  :substitute(some(other(
3266585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3267585fea7bSBram Moolenaar  bwipe!
3268585fea7bSBram Moolenaar
3269f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3270cfcd011fSBram Moolenaar  var lines =<< trim END
3271585fea7bSBram Moolenaar    vim9script
3272585fea7bSBram Moolenaar    new
3273585fea7bSBram Moolenaar    setline(1, 'something')
3274585fea7bSBram Moolenaar    :substitute(some(other(
3275585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3276585fea7bSBram Moolenaar    bwipe!
3277585fea7bSBram Moolenaar  END
3278585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3279585fea7bSBram Moolenaar  source Xvim9lines
3280585fea7bSBram Moolenaar
3281585fea7bSBram Moolenaar  delete('Xvim9lines')
3282585fea7bSBram Moolenaarenddef
3283585fea7bSBram Moolenaar
32848a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3285