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
3279e1d9e34SBram Moolenaardef Test_try_catch_throw()
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
36469f7050cSBram Moolenaar  var done = 'no'
36569f7050cSBram Moolenaar  if 0
36669f7050cSBram Moolenaar    try | catch | endtry
36769f7050cSBram Moolenaar  else
36869f7050cSBram Moolenaar    done = 'yes'
36969f7050cSBram Moolenaar  endif
37069f7050cSBram Moolenaar  assert_equal('yes', done)
37169f7050cSBram Moolenaar
37269f7050cSBram Moolenaar  done = 'no'
37369f7050cSBram Moolenaar  if 1
37469f7050cSBram Moolenaar    done = 'yes'
37569f7050cSBram Moolenaar  else
37669f7050cSBram Moolenaar    try | catch | endtry
37769f7050cSBram Moolenaar    done = 'never'
37869f7050cSBram Moolenaar  endif
37969f7050cSBram Moolenaar  assert_equal('yes', done)
38069f7050cSBram Moolenaar
38169f7050cSBram Moolenaar  if 1
38269f7050cSBram Moolenaar  else
38369f7050cSBram Moolenaar    try | catch /pat/ | endtry
38469f7050cSBram Moolenaar    try | catch /pat/
38569f7050cSBram Moolenaar    endtry
38669f7050cSBram Moolenaar    try
38769f7050cSBram Moolenaar    catch /pat/ | endtry
38869f7050cSBram Moolenaar    try
38969f7050cSBram Moolenaar    catch /pat/
39069f7050cSBram Moolenaar    endtry
39169f7050cSBram Moolenaar  endif
39269f7050cSBram Moolenaar
39368d130c6SBram Moolenaar  try
394cc673e74SBram Moolenaar    # string slice returns a string, not a number
39568d130c6SBram Moolenaar    n = g:astring[3]
3965e654230SBram Moolenaar  catch /E1012:/
39768d130c6SBram Moolenaar    n = 77
39868d130c6SBram Moolenaar  endtry
39968d130c6SBram Moolenaar  assert_equal(77, n)
40068d130c6SBram Moolenaar
40168d130c6SBram Moolenaar  try
40268d130c6SBram Moolenaar    n = l[g:astring]
4035e654230SBram Moolenaar  catch /E1012:/
40456acb094SBram Moolenaar    n = 88
40568d130c6SBram Moolenaar  endtry
40656acb094SBram Moolenaar  assert_equal(88, n)
40768d130c6SBram Moolenaar
40868d130c6SBram Moolenaar  try
40968d130c6SBram Moolenaar    n = s:does_not_exist
41068d130c6SBram Moolenaar  catch /E121:/
411f0b9f43cSBram Moolenaar    n = 111
412f0b9f43cSBram Moolenaar  endtry
413f0b9f43cSBram Moolenaar  assert_equal(111, n)
414f0b9f43cSBram Moolenaar
415f0b9f43cSBram Moolenaar  try
416f0b9f43cSBram Moolenaar    n = g:does_not_exist
417f0b9f43cSBram Moolenaar  catch /E121:/
41868d130c6SBram Moolenaar    n = 121
41968d130c6SBram Moolenaar  endtry
42068d130c6SBram Moolenaar  assert_equal(121, n)
42168d130c6SBram Moolenaar
422e0de171eSBram Moolenaar  var d = {one: 1}
42368d130c6SBram Moolenaar  try
42468d130c6SBram Moolenaar    n = d[g:astring]
42568d130c6SBram Moolenaar  catch /E716:/
42668d130c6SBram Moolenaar    n = 222
42768d130c6SBram Moolenaar  endtry
42868d130c6SBram Moolenaar  assert_equal(222, n)
429f0b9f43cSBram Moolenaar
430f0b9f43cSBram Moolenaar  try
431f0b9f43cSBram Moolenaar    n = -g:astring
432f0b9f43cSBram Moolenaar  catch /E39:/
433f0b9f43cSBram Moolenaar    n = 233
434f0b9f43cSBram Moolenaar  endtry
435f0b9f43cSBram Moolenaar  assert_equal(233, n)
436f0b9f43cSBram Moolenaar
437f0b9f43cSBram Moolenaar  try
438f0b9f43cSBram Moolenaar    n = +g:astring
439f0b9f43cSBram Moolenaar  catch /E1030:/
440f0b9f43cSBram Moolenaar    n = 244
441f0b9f43cSBram Moolenaar  endtry
442f0b9f43cSBram Moolenaar  assert_equal(244, n)
443f0b9f43cSBram Moolenaar
444f0b9f43cSBram Moolenaar  try
445f0b9f43cSBram Moolenaar    n = +g:alist
446f0b9f43cSBram Moolenaar  catch /E745:/
447f0b9f43cSBram Moolenaar    n = 255
448f0b9f43cSBram Moolenaar  endtry
449f0b9f43cSBram Moolenaar  assert_equal(255, n)
450f0b9f43cSBram Moolenaar
451cfcd011fSBram Moolenaar  var nd: dict<any>
452f0b9f43cSBram Moolenaar  try
4532bede173SBram Moolenaar    nd = {[g:anumber]: 1}
4545e654230SBram Moolenaar  catch /E1012:/
455f0b9f43cSBram Moolenaar    n = 266
456f0b9f43cSBram Moolenaar  endtry
457f0b9f43cSBram Moolenaar  assert_equal(266, n)
458f0b9f43cSBram Moolenaar
459f0b9f43cSBram Moolenaar  try
460f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
461f0b9f43cSBram Moolenaar  catch /E1093:/
462f0b9f43cSBram Moolenaar    n = 277
463f0b9f43cSBram Moolenaar  endtry
464f0b9f43cSBram Moolenaar  assert_equal(277, n)
465f0b9f43cSBram Moolenaar
466e859312eSBram Moolenaar  try
467e859312eSBram Moolenaar    &ts = g:astring
4685e654230SBram Moolenaar  catch /E1012:/
469e859312eSBram Moolenaar    n = 288
470e859312eSBram Moolenaar  endtry
471e859312eSBram Moolenaar  assert_equal(288, n)
472e859312eSBram Moolenaar
473e859312eSBram Moolenaar  try
474e859312eSBram Moolenaar    &backspace = 'asdf'
475e859312eSBram Moolenaar  catch /E474:/
476e859312eSBram Moolenaar    n = 299
477e859312eSBram Moolenaar  endtry
478e859312eSBram Moolenaar  assert_equal(299, n)
479e859312eSBram Moolenaar
480e859312eSBram Moolenaar  l = [1]
481e859312eSBram Moolenaar  try
482e859312eSBram Moolenaar    l[3] = 3
483e859312eSBram Moolenaar  catch /E684:/
484e859312eSBram Moolenaar    n = 300
485e859312eSBram Moolenaar  endtry
486e859312eSBram Moolenaar  assert_equal(300, n)
487e859312eSBram Moolenaar
488e859312eSBram Moolenaar  try
489e859312eSBram Moolenaar    unlet g:does_not_exist
490e859312eSBram Moolenaar  catch /E108:/
491e859312eSBram Moolenaar    n = 322
492e859312eSBram Moolenaar  endtry
493e859312eSBram Moolenaar  assert_equal(322, n)
494e859312eSBram Moolenaar
495e859312eSBram Moolenaar  try
4962bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
497e859312eSBram Moolenaar  catch /E721:/
498e859312eSBram Moolenaar    n = 333
499e859312eSBram Moolenaar  endtry
500e859312eSBram Moolenaar  assert_equal(333, n)
501e859312eSBram Moolenaar
502e859312eSBram Moolenaar  try
503e859312eSBram Moolenaar    l = DeletedFunc()
504e859312eSBram Moolenaar  catch /E933:/
505e859312eSBram Moolenaar    n = 344
506e859312eSBram Moolenaar  endtry
507e859312eSBram Moolenaar  assert_equal(344, n)
508d032f34aSBram Moolenaar
509d032f34aSBram Moolenaar  try
510d032f34aSBram Moolenaar    echo len(v:true)
511d032f34aSBram Moolenaar  catch /E701:/
512d032f34aSBram Moolenaar    n = 355
513d032f34aSBram Moolenaar  endtry
514d032f34aSBram Moolenaar  assert_equal(355, n)
515d032f34aSBram Moolenaar
516cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
517d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
518d032f34aSBram Moolenaar  try
519d032f34aSBram Moolenaar    echo P()
520d032f34aSBram Moolenaar  catch /E117:/
521d032f34aSBram Moolenaar    n = 366
522d032f34aSBram Moolenaar  endtry
523d032f34aSBram Moolenaar  assert_equal(366, n)
524d032f34aSBram Moolenaar
525d032f34aSBram Moolenaar  try
526d032f34aSBram Moolenaar    echo g:NoSuchFunc()
527d032f34aSBram Moolenaar  catch /E117:/
528d032f34aSBram Moolenaar    n = 377
529d032f34aSBram Moolenaar  endtry
530d032f34aSBram Moolenaar  assert_equal(377, n)
531d032f34aSBram Moolenaar
532d032f34aSBram Moolenaar  try
533d032f34aSBram Moolenaar    echo g:alist + 4
534d032f34aSBram Moolenaar  catch /E745:/
535d032f34aSBram Moolenaar    n = 388
536d032f34aSBram Moolenaar  endtry
537d032f34aSBram Moolenaar  assert_equal(388, n)
538d032f34aSBram Moolenaar
539d032f34aSBram Moolenaar  try
540d032f34aSBram Moolenaar    echo 4 + g:alist
541d032f34aSBram Moolenaar  catch /E745:/
542d032f34aSBram Moolenaar    n = 399
543d032f34aSBram Moolenaar  endtry
544d032f34aSBram Moolenaar  assert_equal(399, n)
545d032f34aSBram Moolenaar
546d032f34aSBram Moolenaar  try
547d032f34aSBram Moolenaar    echo g:alist.member
548d032f34aSBram Moolenaar  catch /E715:/
549d032f34aSBram Moolenaar    n = 400
550d032f34aSBram Moolenaar  endtry
551d032f34aSBram Moolenaar  assert_equal(400, n)
552d032f34aSBram Moolenaar
553d032f34aSBram Moolenaar  try
554d032f34aSBram Moolenaar    echo d.member
555d032f34aSBram Moolenaar  catch /E716:/
556d032f34aSBram Moolenaar    n = 411
557d032f34aSBram Moolenaar  endtry
558d032f34aSBram Moolenaar  assert_equal(411, n)
5598a7d6542SBram Moolenaarenddef
5608a7d6542SBram Moolenaar
5611430ceebSBram Moolenaardef Test_cnext_works_in_catch()
5621430ceebSBram Moolenaar  var lines =<< trim END
5631430ceebSBram Moolenaar      vim9script
5641430ceebSBram Moolenaar      au BufEnter * eval 0
5651430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
5661430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
5671430ceebSBram Moolenaar      var items = [
5681430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
5691430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
5701430ceebSBram Moolenaar        ]
5711430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
5721430ceebSBram Moolenaar      cwindow
5731430ceebSBram Moolenaar
5741430ceebSBram Moolenaar      def CnextOrCfirst()
5751430ceebSBram Moolenaar        # if cnext fails, cfirst is used
5761430ceebSBram Moolenaar        try
5771430ceebSBram Moolenaar          cnext
5781430ceebSBram Moolenaar        catch
5791430ceebSBram Moolenaar          cfirst
5801430ceebSBram Moolenaar        endtry
5811430ceebSBram Moolenaar      enddef
5821430ceebSBram Moolenaar
5831430ceebSBram Moolenaar      CnextOrCfirst()
5841430ceebSBram Moolenaar      CnextOrCfirst()
5851430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
5861430ceebSBram Moolenaar      qall
5871430ceebSBram Moolenaar  END
5881430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
5891430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
5901430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
5911430ceebSBram Moolenaar
5921430ceebSBram Moolenaar  delete('Xfile1')
5931430ceebSBram Moolenaar  delete('Xfile2')
5941430ceebSBram Moolenaar  delete('XCatchCnext')
5951430ceebSBram Moolenaar  delete('Xresult')
5961430ceebSBram Moolenaarenddef
5971430ceebSBram Moolenaar
5989e1d9e34SBram Moolenaardef Test_throw_skipped()
5999e1d9e34SBram Moolenaar  if 0
6009e1d9e34SBram Moolenaar    throw dontgethere
6019e1d9e34SBram Moolenaar  endif
6029e1d9e34SBram Moolenaarenddef
6039e1d9e34SBram Moolenaar
6048f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6058f81b22eSBram Moolenaar  var lines =<< trim END
6068f81b22eSBram Moolenaar    vim9script
6078f81b22eSBram Moolenaar    def Func()
6088f81b22eSBram Moolenaar      throw 'error'
6098f81b22eSBram Moolenaar    enddef
6108f81b22eSBram Moolenaar    silent! Func()
6118f81b22eSBram Moolenaar  END
6128f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6138f81b22eSBram Moolenaar  source XthrowSilenced
6148f81b22eSBram Moolenaar  delete('XthrowSilenced')
6158f81b22eSBram Moolenaarenddef
6168f81b22eSBram Moolenaar
617e859312eSBram Moolenaardef DeletedFunc(): list<any>
618e859312eSBram Moolenaar  return ['delete me']
619e859312eSBram Moolenaarenddef
620e859312eSBram Moolenaardefcompile
621e859312eSBram Moolenaardelfunc DeletedFunc
622e859312eSBram Moolenaar
623257cc5eeSBram Moolenaardef ThrowFromDef()
624a72cfb80SBram Moolenaar  throw "getout" # comment
625257cc5eeSBram Moolenaarenddef
626257cc5eeSBram Moolenaar
627257cc5eeSBram Moolenaarfunc CatchInFunc()
628257cc5eeSBram Moolenaar  try
629257cc5eeSBram Moolenaar    call ThrowFromDef()
630257cc5eeSBram Moolenaar  catch
631257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
632257cc5eeSBram Moolenaar  endtry
633257cc5eeSBram Moolenaarendfunc
634257cc5eeSBram Moolenaar
635257cc5eeSBram Moolenaardef CatchInDef()
636257cc5eeSBram Moolenaar  try
637257cc5eeSBram Moolenaar    ThrowFromDef()
638257cc5eeSBram Moolenaar  catch
639257cc5eeSBram Moolenaar    g:thrown_def = v:exception
640257cc5eeSBram Moolenaar  endtry
641257cc5eeSBram Moolenaarenddef
642257cc5eeSBram Moolenaar
643f575adffSBram Moolenaardef ReturnFinally(): string
644f575adffSBram Moolenaar  try
645f575adffSBram Moolenaar    return 'intry'
646373863edSBram Moolenaar  finall
647f575adffSBram Moolenaar    g:in_finally = 'finally'
648f575adffSBram Moolenaar  endtry
649f575adffSBram Moolenaar  return 'end'
650f575adffSBram Moolenaarenddef
651f575adffSBram Moolenaar
652257cc5eeSBram Moolenaardef Test_try_catch_nested()
653257cc5eeSBram Moolenaar  CatchInFunc()
654257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
655257cc5eeSBram Moolenaar
656257cc5eeSBram Moolenaar  CatchInDef()
657257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
658f575adffSBram Moolenaar
659f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
660f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
661f575adffSBram Moolenaarenddef
662f575adffSBram Moolenaar
6639939f57bSBram Moolenaardef TryOne(): number
6649939f57bSBram Moolenaar  try
6659939f57bSBram Moolenaar    return 0
6669939f57bSBram Moolenaar  catch
6679939f57bSBram Moolenaar  endtry
6689939f57bSBram Moolenaar  return 0
6699939f57bSBram Moolenaarenddef
6709939f57bSBram Moolenaar
6719939f57bSBram Moolenaardef TryTwo(n: number): string
6729939f57bSBram Moolenaar  try
673cfcd011fSBram Moolenaar    var x = {}
6749939f57bSBram Moolenaar  catch
6759939f57bSBram Moolenaar  endtry
6769939f57bSBram Moolenaar  return 'text'
6779939f57bSBram Moolenaarenddef
6789939f57bSBram Moolenaar
6799939f57bSBram Moolenaardef Test_try_catch_twice()
6809939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
6819939f57bSBram Moolenaarenddef
6829939f57bSBram Moolenaar
683f575adffSBram Moolenaardef Test_try_catch_match()
684cfcd011fSBram Moolenaar  var seq = 'a'
685f575adffSBram Moolenaar  try
686f575adffSBram Moolenaar    throw 'something'
687f575adffSBram Moolenaar  catch /nothing/
688f575adffSBram Moolenaar    seq ..= 'x'
689f575adffSBram Moolenaar  catch /some/
690f575adffSBram Moolenaar    seq ..= 'b'
691f575adffSBram Moolenaar  catch /asdf/
692f575adffSBram Moolenaar    seq ..= 'x'
693e8c4abbbSBram Moolenaar  catch ?a\?sdf?
694e8c4abbbSBram Moolenaar    seq ..= 'y'
695f575adffSBram Moolenaar  finally
696f575adffSBram Moolenaar    seq ..= 'c'
697f575adffSBram Moolenaar  endtry
698f575adffSBram Moolenaar  assert_equal('abc', seq)
699257cc5eeSBram Moolenaarenddef
700257cc5eeSBram Moolenaar
701e8c4abbbSBram Moolenaardef Test_try_catch_fails()
702d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
703d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
704d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
705d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
706d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
707d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
708d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
709d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
71013106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
711d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
712585fea7bSBram Moolenaar
713e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
714d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
715e8c4abbbSBram Moolenaarenddef
716e8c4abbbSBram Moolenaar
717006ad48bSBram Moolenaardef Test_throw_vimscript()
718f5be8cdbSBram Moolenaar  # only checks line continuation
719cfcd011fSBram Moolenaar  var lines =<< trim END
720006ad48bSBram Moolenaar      vim9script
721006ad48bSBram Moolenaar      try
722006ad48bSBram Moolenaar        throw 'one'
723006ad48bSBram Moolenaar              .. 'two'
724006ad48bSBram Moolenaar      catch
725006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
726006ad48bSBram Moolenaar      endtry
727006ad48bSBram Moolenaar  END
728006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7291e021e63SBram Moolenaar
7301e021e63SBram Moolenaar  lines =<< trim END
7311e021e63SBram Moolenaar    vim9script
732352134bbSBram Moolenaar    @r = ''
7331e021e63SBram Moolenaar    def Func()
7341e021e63SBram Moolenaar      throw @r
7351e021e63SBram Moolenaar    enddef
7361e021e63SBram Moolenaar    var result = ''
7371e021e63SBram Moolenaar    try
7381e021e63SBram Moolenaar      Func()
7391e021e63SBram Moolenaar    catch /E1129:/
7401e021e63SBram Moolenaar      result = 'caught'
7411e021e63SBram Moolenaar    endtry
7421e021e63SBram Moolenaar    assert_equal('caught', result)
7431e021e63SBram Moolenaar  END
7441e021e63SBram Moolenaar  CheckScriptSuccess(lines)
745006ad48bSBram Moolenaarenddef
746006ad48bSBram Moolenaar
747ed677f55SBram Moolenaardef Test_error_in_nested_function()
748ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
749cfcd011fSBram Moolenaar  var lines =<< trim END
750ed677f55SBram Moolenaar      vim9script
751ed677f55SBram Moolenaar      def Func()
752ed677f55SBram Moolenaar        Error()
753ed677f55SBram Moolenaar        g:test_var = 1
754ed677f55SBram Moolenaar      enddef
755ed677f55SBram Moolenaar      func Error() abort
756ed677f55SBram Moolenaar        eval [][0]
757ed677f55SBram Moolenaar      endfunc
758ed677f55SBram Moolenaar      Func()
759ed677f55SBram Moolenaar  END
760ed677f55SBram Moolenaar  g:test_var = 0
761ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
762ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
763ed677f55SBram Moolenaarenddef
764ed677f55SBram Moolenaar
76537c83711SBram Moolenaardef Test_cexpr_vimscript()
766f5be8cdbSBram Moolenaar  # only checks line continuation
76737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
768cfcd011fSBram Moolenaar  var lines =<< trim END
76937c83711SBram Moolenaar      vim9script
77037c83711SBram Moolenaar      cexpr 'File'
77137c83711SBram Moolenaar                .. ' someFile' ..
77237c83711SBram Moolenaar                   ' line 19'
77337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
77437c83711SBram Moolenaar  END
77537c83711SBram Moolenaar  CheckScriptSuccess(lines)
77637c83711SBram Moolenaar  set errorformat&
77737c83711SBram Moolenaarenddef
77837c83711SBram Moolenaar
779c9edd6b5SBram Moolenaardef Test_statusline_syntax()
780c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
781cfcd011fSBram Moolenaar  var lines =<< trim END
782c9edd6b5SBram Moolenaar      vim9script
783c9edd6b5SBram Moolenaar      func g:Status()
784c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
785c9edd6b5SBram Moolenaar      endfunc
786c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
787c9edd6b5SBram Moolenaar      redrawstatus
788c9edd6b5SBram Moolenaar      set laststatus statusline=
789c9edd6b5SBram Moolenaar  END
790c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
791c9edd6b5SBram Moolenaarenddef
792c9edd6b5SBram Moolenaar
793b209750bSBram Moolenaardef Test_list_vimscript()
794b209750bSBram Moolenaar  # checks line continuation and comments
795cfcd011fSBram Moolenaar  var lines =<< trim END
796b209750bSBram Moolenaar      vim9script
797cfcd011fSBram Moolenaar      var mylist = [
798b209750bSBram Moolenaar            'one',
799b209750bSBram Moolenaar            # comment
800b209750bSBram Moolenaar            'two', # empty line follows
801b209750bSBram Moolenaar
802b209750bSBram Moolenaar            'three',
803b209750bSBram Moolenaar            ]
804b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
805b209750bSBram Moolenaar  END
806b209750bSBram Moolenaar  CheckScriptSuccess(lines)
80766250c93SBram Moolenaar
80866250c93SBram Moolenaar  # check all lines from heredoc are kept
80966250c93SBram Moolenaar  lines =<< trim END
81066250c93SBram Moolenaar      # comment 1
81166250c93SBram Moolenaar      two
81266250c93SBram Moolenaar      # comment 3
81366250c93SBram Moolenaar
81466250c93SBram Moolenaar      five
81566250c93SBram Moolenaar      # comment 6
81666250c93SBram Moolenaar  END
81766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
818*4bce26bbSBram Moolenaar
819*4bce26bbSBram Moolenaar  lines =<< trim END
820*4bce26bbSBram Moolenaar    [{
821*4bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
822*4bce26bbSBram Moolenaar  END
823*4bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
824b209750bSBram Moolenaarenddef
825b209750bSBram Moolenaar
8262a1381c3SBram Moolenaarif has('channel')
82740ee466cSBram Moolenaar  let someJob = test_null_job()
82840ee466cSBram Moolenaar
82940ee466cSBram Moolenaar  def FuncWithError()
83040ee466cSBram Moolenaar    echomsg g:someJob
83140ee466cSBram Moolenaar  enddef
83240ee466cSBram Moolenaar
83340ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
83440ee466cSBram Moolenaar    try
83540ee466cSBram Moolenaar      call FuncWithError()
83640ee466cSBram Moolenaar    catch
83740ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
83840ee466cSBram Moolenaar    endtry
83940ee466cSBram Moolenaar  endfunc
8402a1381c3SBram Moolenaarendif
84140ee466cSBram Moolenaar
8428a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8438a7d6542SBram Moolenaar  vim9script
844cfcd011fSBram Moolenaar  var name: string = 'bob'
8458a7d6542SBram Moolenaar  def Concat(arg: string): string
8468a7d6542SBram Moolenaar    return name .. arg
8478a7d6542SBram Moolenaar  enddef
848227a69deSBram Moolenaar  g:result = Concat('bie')
849227a69deSBram Moolenaar  g:localname = name
8508a7d6542SBram Moolenaar
8518a7d6542SBram Moolenaar  export const CONST = 1234
852cfcd011fSBram Moolenaar  export var exported = 9876
853cfcd011fSBram Moolenaar  export var exp_name = 'John'
8548a7d6542SBram Moolenaar  export def Exported(): string
8558a7d6542SBram Moolenaar    return 'Exported'
8568a7d6542SBram Moolenaar  enddef
8578a7d6542SBram MoolenaarEND
8588a7d6542SBram Moolenaar
859b3ca9824SBram Moolenaardef Undo_export_script_lines()
860b3ca9824SBram Moolenaar  unlet g:result
861b3ca9824SBram Moolenaar  unlet g:localname
862b3ca9824SBram Moolenaarenddef
863b3ca9824SBram Moolenaar
8645269bd2aSBram Moolenaardef Test_vim9_import_export()
865cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
8668a7d6542SBram Moolenaar    vim9script
8678a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8688a7d6542SBram Moolenaar    g:imported = exported
8696e587dcbSBram Moolenaar    exported += 3
8706e587dcbSBram Moolenaar    g:imported_added = exported
8718a7d6542SBram Moolenaar    g:imported_func = Exported()
8726e587dcbSBram Moolenaar
87340f4f7a4SBram Moolenaar    def GetExported(): string
874e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
87540f4f7a4SBram Moolenaar      return local_dict.ref()
87640f4f7a4SBram Moolenaar    enddef
87740f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
87840f4f7a4SBram Moolenaar
8796e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8806e587dcbSBram Moolenaar    g:imported_name = exp_name
8816e587dcbSBram Moolenaar    exp_name ..= ' Doe'
8826e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
8835381c7a1SBram Moolenaar    g:imported_later = exported
8848a7d6542SBram Moolenaar  END
8858a7d6542SBram Moolenaar
8868a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
8878a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
8888a7d6542SBram Moolenaar
8898a7d6542SBram Moolenaar  source Ximport.vim
8908a7d6542SBram Moolenaar
8918a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8928a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8938a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8946e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8955381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8968a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
89740f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
8986e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8996e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9008a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9018a7d6542SBram Moolenaar
902b3ca9824SBram Moolenaar  Undo_export_script_lines()
9038a7d6542SBram Moolenaar  unlet g:imported
9046e587dcbSBram Moolenaar  unlet g:imported_added
9055381c7a1SBram Moolenaar  unlet g:imported_later
9068a7d6542SBram Moolenaar  unlet g:imported_func
9076e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9088a7d6542SBram Moolenaar  delete('Ximport.vim')
909f2d5c240SBram Moolenaar
9101c991144SBram Moolenaar  # similar, with line breaks
911cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9121c991144SBram Moolenaar    vim9script
9131c991144SBram Moolenaar    import {
9141c991144SBram Moolenaar        exported,
9151c991144SBram Moolenaar        Exported,
9161c991144SBram Moolenaar        }
9171c991144SBram Moolenaar        from
9181c991144SBram Moolenaar        './Xexport.vim'
9191c991144SBram Moolenaar    g:imported = exported
9201c991144SBram Moolenaar    exported += 5
9211c991144SBram Moolenaar    g:imported_added = exported
9221c991144SBram Moolenaar    g:imported_func = Exported()
9231c991144SBram Moolenaar  END
9241c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9251c991144SBram Moolenaar  source Ximport_lbr.vim
9261c991144SBram Moolenaar
9271c991144SBram Moolenaar  assert_equal(9876, g:imported)
9281c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9291c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9301c991144SBram Moolenaar
9311c991144SBram Moolenaar  # exported script not sourced again
9321c991144SBram Moolenaar  assert_false(exists('g:result'))
9331c991144SBram Moolenaar  unlet g:imported
9341c991144SBram Moolenaar  unlet g:imported_added
9351c991144SBram Moolenaar  unlet g:imported_func
9361c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9371c991144SBram Moolenaar
9381c991144SBram Moolenaar  # import inside :def function
939cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
9405381c7a1SBram Moolenaar    vim9script
9415381c7a1SBram Moolenaar    def ImportInDef()
9425381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9435381c7a1SBram Moolenaar      g:imported = exported
9445381c7a1SBram Moolenaar      exported += 7
9455381c7a1SBram Moolenaar      g:imported_added = exported
9465381c7a1SBram Moolenaar    enddef
9475381c7a1SBram Moolenaar    ImportInDef()
9485381c7a1SBram Moolenaar  END
9495381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9505381c7a1SBram Moolenaar  source Ximport2.vim
951f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9525381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9535381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9545381c7a1SBram Moolenaar  unlet g:imported
9555381c7a1SBram Moolenaar  unlet g:imported_added
9565381c7a1SBram Moolenaar  delete('Ximport2.vim')
9575381c7a1SBram Moolenaar
958cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
959f2d5c240SBram Moolenaar    vim9script
960f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
961f2d5c240SBram Moolenaar    def UseExport()
962f2d5c240SBram Moolenaar      g:imported = Export.exported
963f2d5c240SBram Moolenaar    enddef
964f2d5c240SBram Moolenaar    UseExport()
965f2d5c240SBram Moolenaar  END
966f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
967f2d5c240SBram Moolenaar  source Ximport.vim
9685381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
969f2d5c240SBram Moolenaar
970cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
971599c89c8SBram Moolenaar    vim9script
972599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
973599c89c8SBram Moolenaar    def Func()
974cfcd011fSBram Moolenaar      var dummy = 1
975cfcd011fSBram Moolenaar      var imported = Export + dummy
976599c89c8SBram Moolenaar    enddef
977822ba247SBram Moolenaar    defcompile
978599c89c8SBram Moolenaar  END
979599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
98044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
981599c89c8SBram Moolenaar
982cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
983599c89c8SBram Moolenaar    vim9script
984599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
985599c89c8SBram Moolenaar    def Func()
986cfcd011fSBram Moolenaar      var imported = Export . exported
987599c89c8SBram Moolenaar    enddef
988822ba247SBram Moolenaar    defcompile
989599c89c8SBram Moolenaar  END
990599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
99144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
992599c89c8SBram Moolenaar
993a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
994a6294955SBram Moolenaar    vim9script
995a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
996a6294955SBram Moolenaar    var some = 'other'
997a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
998a6294955SBram Moolenaar    defcompile
999a6294955SBram Moolenaar  END
1000a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1001a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1002a6294955SBram Moolenaar
1003cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1004599c89c8SBram Moolenaar    vim9script
1005599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1006599c89c8SBram Moolenaar    def Func()
1007cfcd011fSBram Moolenaar      var imported = Export.
1008599c89c8SBram Moolenaar    enddef
1009822ba247SBram Moolenaar    defcompile
1010599c89c8SBram Moolenaar  END
1011599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
101244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1013599c89c8SBram Moolenaar
1014cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10151c991144SBram Moolenaar    vim9script
10161c991144SBram Moolenaar    import *
10171c991144SBram Moolenaar        as Export
10181c991144SBram Moolenaar        from
10191c991144SBram Moolenaar        './Xexport.vim'
10201c991144SBram Moolenaar    def UseExport()
10211c991144SBram Moolenaar      g:imported = Export.exported
10221c991144SBram Moolenaar    enddef
10231c991144SBram Moolenaar    UseExport()
10241c991144SBram Moolenaar  END
10251c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10261c991144SBram Moolenaar  source Ximport.vim
10271c991144SBram Moolenaar  assert_equal(9883, g:imported)
10281c991144SBram Moolenaar
1029cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1030f2d5c240SBram Moolenaar    vim9script
1031f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1032f2d5c240SBram Moolenaar  END
1033f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
103444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1035f2d5c240SBram Moolenaar
1036f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1037cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1038fa29c8abSBram Moolenaar    vim9script
1039fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1040fa29c8abSBram Moolenaar  END
1041fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
104244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1043fa29c8abSBram Moolenaar
1044f5be8cdbSBram Moolenaar  # try to import something that is already defined
1045cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
10465269bd2aSBram Moolenaar    vim9script
1047cfcd011fSBram Moolenaar    var exported = 'something'
10485269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10495269bd2aSBram Moolenaar  END
10505269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
105144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10525269bd2aSBram Moolenaar
1053f5be8cdbSBram Moolenaar  # try to import something that is already defined
10545269bd2aSBram Moolenaar  import_already_defined =<< trim END
10555269bd2aSBram Moolenaar    vim9script
1056cfcd011fSBram Moolenaar    var exported = 'something'
10575269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10585269bd2aSBram Moolenaar  END
10595269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
106044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10615269bd2aSBram Moolenaar
1062f5be8cdbSBram Moolenaar  # try to import something that is already defined
10635269bd2aSBram Moolenaar  import_already_defined =<< trim END
10645269bd2aSBram Moolenaar    vim9script
1065cfcd011fSBram Moolenaar    var exported = 'something'
10665269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10675269bd2aSBram Moolenaar  END
10685269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
106944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10705269bd2aSBram Moolenaar
1071918a4249SBram Moolenaar  # try changing an imported const
1072918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1073918a4249SBram Moolenaar    vim9script
1074918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1075918a4249SBram Moolenaar    def Assign()
1076918a4249SBram Moolenaar      CONST = 987
1077918a4249SBram Moolenaar    enddef
1078918a4249SBram Moolenaar    defcompile
1079918a4249SBram Moolenaar  END
1080918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1081918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1082918a4249SBram Moolenaar
1083f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1084cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1085fa29c8abSBram Moolenaar    vim9script
1086fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1087fa29c8abSBram Moolenaar  END
1088fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
108944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1090fa29c8abSBram Moolenaar
1091cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1092fa29c8abSBram Moolenaar    vim9script
1093fa29c8abSBram Moolenaar    import name './Xexport.vim'
1094fa29c8abSBram Moolenaar  END
1095fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
109644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1097fa29c8abSBram Moolenaar
1098cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1099fa29c8abSBram Moolenaar    vim9script
1100fa29c8abSBram Moolenaar    import name from Xexport.vim
1101fa29c8abSBram Moolenaar  END
1102fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
110344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1104fa29c8abSBram Moolenaar
1105cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1106fa29c8abSBram Moolenaar    vim9script
1107fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1108fa29c8abSBram Moolenaar  END
1109fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
111044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1111fa29c8abSBram Moolenaar
1112cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1113fa29c8abSBram Moolenaar    vim9script
1114fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1115fa29c8abSBram Moolenaar  END
11165269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
111744d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1118fa29c8abSBram Moolenaar
1119f2d5c240SBram Moolenaar  delete('Ximport.vim')
11205269bd2aSBram Moolenaar  delete('Ximport3.vim')
11218a7d6542SBram Moolenaar  delete('Xexport.vim')
11228a7d6542SBram Moolenaar
1123f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1124750802b5SBram Moolenaar  set cpo&vi
1125cfcd011fSBram Moolenaar  var cpo_before = &cpo
1126cfcd011fSBram Moolenaar  var lines =<< trim END
1127750802b5SBram Moolenaar    vim9script
1128750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1129750802b5SBram Moolenaar  END
1130750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1131750802b5SBram Moolenaar  source Xvim9_script
1132750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1133750802b5SBram Moolenaar  set cpo&vim
1134750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1135750802b5SBram Moolenaar  delete('Xvim9_script')
1136750802b5SBram Moolenaarenddef
1137750802b5SBram Moolenaar
1138803af686SBram Moolenaarfunc g:Trigger()
1139803af686SBram Moolenaar  source Ximport.vim
1140803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1141803af686SBram Moolenaarendfunc
1142803af686SBram Moolenaar
1143803af686SBram Moolenaardef Test_import_export_expr_map()
1144803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1145cfcd011fSBram Moolenaar  var export_lines =<< trim END
1146803af686SBram Moolenaar    vim9script
1147803af686SBram Moolenaar    export def That(): string
1148803af686SBram Moolenaar      return 'yes'
1149803af686SBram Moolenaar    enddef
1150803af686SBram Moolenaar  END
1151803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1152803af686SBram Moolenaar
1153cfcd011fSBram Moolenaar  var import_lines =<< trim END
1154803af686SBram Moolenaar    vim9script
1155803af686SBram Moolenaar    import That from './Xexport_that.vim'
1156803af686SBram Moolenaar    assert_equal('yes', That())
1157803af686SBram Moolenaar  END
1158803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1159803af686SBram Moolenaar
1160803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1161803af686SBram Moolenaar  feedkeys('trigger', "xt")
1162803af686SBram Moolenaar
1163730b2483SBram Moolenaar  delete('Xexport_that.vim')
1164803af686SBram Moolenaar  delete('Ximport.vim')
1165803af686SBram Moolenaar  nunmap trigger
1166803af686SBram Moolenaarenddef
1167803af686SBram Moolenaar
11688e1986e3SBram Moolenaardef Test_import_in_filetype()
11698e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
11708e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1171cfcd011fSBram Moolenaar  var export_lines =<< trim END
11728e1986e3SBram Moolenaar    vim9script
1173cfcd011fSBram Moolenaar    export var That = 'yes'
11748e1986e3SBram Moolenaar  END
1175730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
11768e1986e3SBram Moolenaar
1177cfcd011fSBram Moolenaar  var import_lines =<< trim END
11788e1986e3SBram Moolenaar    vim9script
1179730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
11808e1986e3SBram Moolenaar    assert_equal('yes', That)
11818e1986e3SBram Moolenaar    g:did_load_mytpe = 1
11828e1986e3SBram Moolenaar  END
11838e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
11848e1986e3SBram Moolenaar
1185cfcd011fSBram Moolenaar  var save_rtp = &rtp
11868e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
11878e1986e3SBram Moolenaar
11888e1986e3SBram Moolenaar  filetype plugin on
11898e1986e3SBram Moolenaar  copen
11908e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
11918e1986e3SBram Moolenaar
11928e1986e3SBram Moolenaar  quit!
1193730b2483SBram Moolenaar  delete('Xexport_ft.vim')
11948e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
11958e1986e3SBram Moolenaar  &rtp = save_rtp
11968e1986e3SBram Moolenaarenddef
11978e1986e3SBram Moolenaar
1198efa94447SBram Moolenaardef Test_use_import_in_mapping()
1199cfcd011fSBram Moolenaar  var lines =<< trim END
1200efa94447SBram Moolenaar      vim9script
1201efa94447SBram Moolenaar      export def Funcx()
1202efa94447SBram Moolenaar        g:result = 42
1203efa94447SBram Moolenaar      enddef
1204efa94447SBram Moolenaar  END
1205efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1206efa94447SBram Moolenaar  lines =<< trim END
1207efa94447SBram Moolenaar      vim9script
1208efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1209b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1210efa94447SBram Moolenaar  END
1211efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1212efa94447SBram Moolenaar
1213efa94447SBram Moolenaar  source Xmapscript.vim
1214b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1215efa94447SBram Moolenaar  assert_equal(42, g:result)
1216efa94447SBram Moolenaar
1217efa94447SBram Moolenaar  unlet g:result
1218efa94447SBram Moolenaar  delete('XsomeExport.vim')
1219efa94447SBram Moolenaar  delete('Xmapscript.vim')
1220b3ca9824SBram Moolenaar  nunmap <F3>
1221efa94447SBram Moolenaarenddef
1222efa94447SBram Moolenaar
1223750802b5SBram Moolenaardef Test_vim9script_fails()
12248a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12258a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1226cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
12279721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1228cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1229750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1230750802b5SBram Moolenaar
1231cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1232c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1233c785b9a7SBram Moolenaar
1234e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1235e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
12368a7d6542SBram Moolenaarenddef
12378a7d6542SBram Moolenaar
1238f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1239101f4810SBram Moolenaar  CheckRunVimInTerminal
1240101f4810SBram Moolenaar
12419bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1242c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
12439bb3eb3eSBram Moolenaarendfunc
12449bb3eb3eSBram Moolenaar
1245c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1246cfcd011fSBram Moolenaar  var export =<< trim END
1247101f4810SBram Moolenaar    vim9script
1248101f4810SBram Moolenaar    export def Foo(): number
1249101f4810SBram Moolenaar        return 0
1250101f4810SBram Moolenaar    enddef
1251101f4810SBram Moolenaar  END
1252730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1253101f4810SBram Moolenaar
1254e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
12559bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
12562949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1257101f4810SBram Moolenaar
1258730b2483SBram Moolenaar  delete('XexportCmd.vim')
12599bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
12609bb3eb3eSBram Moolenaarenddef
1261101f4810SBram Moolenaar
12622b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
12632b32700dSBram Moolenaar  var lines =<< trim END
1264a6294955SBram Moolenaar    vim9script
1265a6294955SBram Moolenaar    export var exported = 'thexport'
1266a6294955SBram Moolenaar  END
1267a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1268a6294955SBram Moolenaar  lines =<< trim END
12692b32700dSBram Moolenaar    vim9script noclear
12702b32700dSBram Moolenaar    g:loadCount += 1
12712b32700dSBram Moolenaar    var s:reloaded = 'init'
1272a6294955SBram Moolenaar    import exported from './XExportReload'
12732b32700dSBram Moolenaar
12742b32700dSBram Moolenaar    def Again(): string
12752b32700dSBram Moolenaar      return 'again'
12762b32700dSBram Moolenaar    enddef
12772b32700dSBram Moolenaar
12782b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
12792b32700dSBram Moolenaar    var s:loaded = true
12802b32700dSBram Moolenaar
12812b32700dSBram Moolenaar    var s:notReloaded = 'yes'
12822b32700dSBram Moolenaar    s:reloaded = 'first'
12832b32700dSBram Moolenaar    def g:Values(): list<string>
1284a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
12852b32700dSBram Moolenaar    enddef
12862b32700dSBram Moolenaar
12872b32700dSBram Moolenaar    def Once(): string
12882b32700dSBram Moolenaar      return 'once'
12892b32700dSBram Moolenaar    enddef
12902b32700dSBram Moolenaar  END
12912b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
12922b32700dSBram Moolenaar  g:loadCount = 0
12932b32700dSBram Moolenaar  source XReloaded
12942b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1295a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
12962b32700dSBram Moolenaar  source XReloaded
12972b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1298a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
12992b32700dSBram Moolenaar  source XReloaded
13002b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1301a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13022b32700dSBram Moolenaar
130348e11c10SBram Moolenaar  delete('XReloaded')
1304a6294955SBram Moolenaar  delete('XExportReload')
13052b32700dSBram Moolenaar  delfunc g:Values
13062b32700dSBram Moolenaar  unlet g:loadCount
13072b32700dSBram Moolenaarenddef
13082b32700dSBram Moolenaar
13094c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1310cfcd011fSBram Moolenaar  var lines =<< trim END
13118a7d6542SBram Moolenaar    vim9script
13128a7d6542SBram Moolenaar    const var = ''
1313cfcd011fSBram Moolenaar    var valone = 1234
13148a7d6542SBram Moolenaar    def MyFunc(arg: string)
13158a7d6542SBram Moolenaar       valone = 5678
13168a7d6542SBram Moolenaar    enddef
13178a7d6542SBram Moolenaar  END
1318cfcd011fSBram Moolenaar  var morelines =<< trim END
1319cfcd011fSBram Moolenaar    var valtwo = 222
13208a7d6542SBram Moolenaar    export def GetValtwo(): number
13218a7d6542SBram Moolenaar      return valtwo
13228a7d6542SBram Moolenaar    enddef
13238a7d6542SBram Moolenaar  END
132403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13258a7d6542SBram Moolenaar  source Xreload.vim
13268a7d6542SBram Moolenaar  source Xreload.vim
13278a7d6542SBram Moolenaar  source Xreload.vim
13288a7d6542SBram Moolenaar
1329cfcd011fSBram Moolenaar  var testlines =<< trim END
13308a7d6542SBram Moolenaar    vim9script
13318a7d6542SBram Moolenaar    def TheFunc()
13328a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13338a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13348a7d6542SBram Moolenaar    enddef
13358a7d6542SBram Moolenaar    TheFunc()
13368a7d6542SBram Moolenaar  END
13378a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13388a7d6542SBram Moolenaar  source Ximport.vim
13398a7d6542SBram Moolenaar
1340f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1341f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
13428a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13438a7d6542SBram Moolenaar  source Ximport.vim
13448a7d6542SBram Moolenaar
1345f5be8cdbSBram Moolenaar  # cannot declare a var twice
13468a7d6542SBram Moolenaar  lines =<< trim END
13478a7d6542SBram Moolenaar    vim9script
1348cfcd011fSBram Moolenaar    var valone = 1234
1349cfcd011fSBram Moolenaar    var valone = 5678
13508a7d6542SBram Moolenaar  END
13518a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
135244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
13538a7d6542SBram Moolenaar
13548a7d6542SBram Moolenaar  delete('Xreload.vim')
13558a7d6542SBram Moolenaar  delete('Ximport.vim')
13568a7d6542SBram Moolenaarenddef
13578a7d6542SBram Moolenaar
135807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
135907a65d26SBram Moolenaar" compiled function using that variable must fail.
136007a65d26SBram Moolenaardef Test_script_reload_change_type()
136107a65d26SBram Moolenaar  var lines =<< trim END
136207a65d26SBram Moolenaar    vim9script noclear
136307a65d26SBram Moolenaar    var str = 'string'
136407a65d26SBram Moolenaar    def g:GetStr(): string
136507a65d26SBram Moolenaar      return str .. 'xxx'
136607a65d26SBram Moolenaar    enddef
136707a65d26SBram Moolenaar  END
136807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
136907a65d26SBram Moolenaar  source Xreload.vim
137007a65d26SBram Moolenaar  echo g:GetStr()
137107a65d26SBram Moolenaar
137207a65d26SBram Moolenaar  lines =<< trim END
137307a65d26SBram Moolenaar    vim9script noclear
137407a65d26SBram Moolenaar    var str = 1234
137507a65d26SBram Moolenaar  END
137607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
137707a65d26SBram Moolenaar  source Xreload.vim
137807a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
137907a65d26SBram Moolenaar
138007a65d26SBram Moolenaar  delfunc g:GetStr
138107a65d26SBram Moolenaar  delete('Xreload.vim')
138207a65d26SBram Moolenaarenddef
138307a65d26SBram Moolenaar
138495006e3dSBram Moolenaardef s:RetSome(): string
138595006e3dSBram Moolenaar  return 'some'
138695006e3dSBram Moolenaarenddef
138795006e3dSBram Moolenaar
1388fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1389fe465a01SBram Moolenaar" script-local name.
1390fe465a01SBram Moolenaardef Test_vim9script_funcref()
1391cfcd011fSBram Moolenaar  var sortlines =<< trim END
1392fe465a01SBram Moolenaar      vim9script
1393fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1394bed36b93SBram Moolenaar        return i2 - i1
1395fe465a01SBram Moolenaar      enddef
1396fe465a01SBram Moolenaar
1397fe465a01SBram Moolenaar      export def FastSort(): list<number>
1398fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1399fe465a01SBram Moolenaar      enddef
1400fe465a01SBram Moolenaar  END
1401fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1402fe465a01SBram Moolenaar
1403cfcd011fSBram Moolenaar  var lines =<< trim END
1404fe465a01SBram Moolenaar    vim9script
1405fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1406fe465a01SBram Moolenaar    def Test()
1407fe465a01SBram Moolenaar      g:result = FastSort()
1408fe465a01SBram Moolenaar    enddef
1409fe465a01SBram Moolenaar    Test()
1410fe465a01SBram Moolenaar  END
1411fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1412fe465a01SBram Moolenaar
1413fe465a01SBram Moolenaar  source Xscript.vim
1414fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1415fe465a01SBram Moolenaar
1416fe465a01SBram Moolenaar  unlet g:result
1417fe465a01SBram Moolenaar  delete('Xsort.vim')
1418fe465a01SBram Moolenaar  delete('Xscript.vim')
141995006e3dSBram Moolenaar
1420cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
142195006e3dSBram Moolenaar  assert_equal('some', Funcref())
1422fe465a01SBram Moolenaarenddef
1423fe465a01SBram Moolenaar
1424601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1425601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1426601e76acSBram Moolenaar" function reference.
1427c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1428cfcd011fSBram Moolenaar  var filterLines =<< trim END
1429c620c055SBram Moolenaar    vim9script
1430c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1431c620c055SBram Moolenaar      return idx % 2 == 1
1432c620c055SBram Moolenaar    enddef
1433c620c055SBram Moolenaar    export def FastFilter(): list<number>
1434c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1435c620c055SBram Moolenaar    enddef
1436601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1437601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1438601e76acSBram Moolenaar    enddef
1439c620c055SBram Moolenaar  END
1440c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1441c620c055SBram Moolenaar
1442cfcd011fSBram Moolenaar  var lines =<< trim END
1443c620c055SBram Moolenaar    vim9script
1444601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1445c620c055SBram Moolenaar    def Test()
1446cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1447c620c055SBram Moolenaar    enddef
1448c620c055SBram Moolenaar    Test()
1449601e76acSBram Moolenaar    def TestDirect()
1450cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1451601e76acSBram Moolenaar    enddef
1452601e76acSBram Moolenaar    TestDirect()
1453c620c055SBram Moolenaar  END
1454601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1455c620c055SBram Moolenaar  delete('Xfilter.vim')
1456c620c055SBram Moolenaarenddef
1457c620c055SBram Moolenaar
14584c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1459cfcd011fSBram Moolenaar  var first_lines =<< trim END
14604c17ad94SBram Moolenaar    vim9script
14614c17ad94SBram Moolenaar    def FuncYes(): string
14624c17ad94SBram Moolenaar      return 'yes'
14634c17ad94SBram Moolenaar    enddef
14644c17ad94SBram Moolenaar  END
1465cfcd011fSBram Moolenaar  var withno_lines =<< trim END
14664c17ad94SBram Moolenaar    def FuncNo(): string
14674c17ad94SBram Moolenaar      return 'no'
14684c17ad94SBram Moolenaar    enddef
14694c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
14704c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
14714c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
147203afdcf1SBram Moolenaar    enddef
147303afdcf1SBram Moolenaar  END
1474cfcd011fSBram Moolenaar  var nono_lines =<< trim END
147503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
147603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
147744d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
14784c17ad94SBram Moolenaar    enddef
14794c17ad94SBram Moolenaar  END
14804c17ad94SBram Moolenaar
14814c17ad94SBram Moolenaar  # FuncNo() is defined
148203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14834c17ad94SBram Moolenaar  source Xreloaded.vim
14844c17ad94SBram Moolenaar  g:DoCheck(true)
14854c17ad94SBram Moolenaar
14864c17ad94SBram Moolenaar  # FuncNo() is not redefined
148703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
14884c17ad94SBram Moolenaar  source Xreloaded.vim
14895082471fSBram Moolenaar  g:DoCheck(false)
14904c17ad94SBram Moolenaar
14914c17ad94SBram Moolenaar  # FuncNo() is back
149203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14934c17ad94SBram Moolenaar  source Xreloaded.vim
14945082471fSBram Moolenaar  g:DoCheck(false)
14954c17ad94SBram Moolenaar
14964c17ad94SBram Moolenaar  delete('Xreloaded.vim')
14974c17ad94SBram Moolenaarenddef
14984c17ad94SBram Moolenaar
149989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
150089483d40SBram Moolenaar  # write the script with a script-local variable
1501cfcd011fSBram Moolenaar  var lines =<< trim END
150289483d40SBram Moolenaar    vim9script
1503cfcd011fSBram Moolenaar    var name = 'string'
150489483d40SBram Moolenaar  END
150589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
150689483d40SBram Moolenaar  source XreloadVar.vim
150789483d40SBram Moolenaar
150889483d40SBram Moolenaar  # now write the script using the same variable locally - works
150989483d40SBram Moolenaar  lines =<< trim END
151089483d40SBram Moolenaar    vim9script
151189483d40SBram Moolenaar    def Func()
1512cfcd011fSBram Moolenaar      var name = 'string'
151389483d40SBram Moolenaar    enddef
151489483d40SBram Moolenaar  END
151589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
151689483d40SBram Moolenaar  source XreloadVar.vim
151789483d40SBram Moolenaar
151889483d40SBram Moolenaar  delete('XreloadVar.vim')
151989483d40SBram Moolenaarenddef
152089483d40SBram Moolenaar
15218a7d6542SBram Moolenaardef Test_import_absolute()
1522cfcd011fSBram Moolenaar  var import_lines = [
1523e6085c53SBram Moolenaar        'vim9script',
1524e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1525e6085c53SBram Moolenaar        'def UseExported()',
1526e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1527e6085c53SBram Moolenaar        '  exported = 8888',
1528e6085c53SBram Moolenaar        '  g:imported_after = exported',
1529e6085c53SBram Moolenaar        'enddef',
1530e6085c53SBram Moolenaar        'UseExported()',
1531e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1532e6085c53SBram Moolenaar        ]
15338a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15348a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15358a7d6542SBram Moolenaar
15368a7d6542SBram Moolenaar  source Ximport_abs.vim
15378a7d6542SBram Moolenaar
15388a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15394e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1540fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1541fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1542fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1543fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1544fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1545fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1546fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1547fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1548fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1549fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1550e6085c53SBram Moolenaar        g:import_disassembled)
1551b3ca9824SBram Moolenaar
1552b3ca9824SBram Moolenaar  Undo_export_script_lines()
15538a7d6542SBram Moolenaar  unlet g:imported_abs
15544e12a5dfSBram Moolenaar  unlet g:import_disassembled
15558a7d6542SBram Moolenaar
15568a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15578a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
15588a7d6542SBram Moolenaarenddef
15598a7d6542SBram Moolenaar
15608a7d6542SBram Moolenaardef Test_import_rtp()
1561cfcd011fSBram Moolenaar  var import_lines = [
1562e6085c53SBram Moolenaar        'vim9script',
1563e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1564e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1565e6085c53SBram Moolenaar        ]
15668a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
15678a7d6542SBram Moolenaar  mkdir('import')
15688a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
15698a7d6542SBram Moolenaar
1570cfcd011fSBram Moolenaar  var save_rtp = &rtp
15718a7d6542SBram Moolenaar  &rtp = getcwd()
15728a7d6542SBram Moolenaar  source Ximport_rtp.vim
15738a7d6542SBram Moolenaar  &rtp = save_rtp
15748a7d6542SBram Moolenaar
15758a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
15768a7d6542SBram Moolenaar
1577b3ca9824SBram Moolenaar  Undo_export_script_lines()
1578b3ca9824SBram Moolenaar  unlet g:imported_rtp
15798a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
158089483d40SBram Moolenaar  delete('import', 'rf')
15818a7d6542SBram Moolenaarenddef
15828a7d6542SBram Moolenaar
158325e0f586SBram Moolenaardef Test_import_compile_error()
1584cfcd011fSBram Moolenaar  var export_lines = [
158525e0f586SBram Moolenaar        'vim9script',
158625e0f586SBram Moolenaar        'export def ExpFunc(): string',
158725e0f586SBram Moolenaar        '  return notDefined',
158825e0f586SBram Moolenaar        'enddef',
158925e0f586SBram Moolenaar        ]
159025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
159125e0f586SBram Moolenaar
1592cfcd011fSBram Moolenaar  var import_lines = [
159325e0f586SBram Moolenaar        'vim9script',
159425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
159525e0f586SBram Moolenaar        'def ImpFunc()',
159625e0f586SBram Moolenaar        '  echo ExpFunc()',
159725e0f586SBram Moolenaar        'enddef',
159825e0f586SBram Moolenaar        'defcompile',
159925e0f586SBram Moolenaar        ]
160025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
160125e0f586SBram Moolenaar
160225e0f586SBram Moolenaar  try
160325e0f586SBram Moolenaar    source Ximport.vim
160425e0f586SBram Moolenaar  catch /E1001/
1605f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
16067707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
160725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
160825e0f586SBram Moolenaar  endtry
160925e0f586SBram Moolenaar
161025e0f586SBram Moolenaar  delete('Xexported.vim')
161125e0f586SBram Moolenaar  delete('Ximport.vim')
161225e0f586SBram Moolenaarenddef
161325e0f586SBram Moolenaar
1614c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1615cfcd011fSBram Moolenaar  var lines = [
1616c4ce36d4SBram Moolenaar        'vim9script',
1617c4ce36d4SBram Moolenaar        'def Func()',
1618c4ce36d4SBram Moolenaar        '  eval [][0]',
1619c4ce36d4SBram Moolenaar        'enddef',
1620c4ce36d4SBram Moolenaar        'Func()',
1621c4ce36d4SBram Moolenaar        ]
1622c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1623c4ce36d4SBram Moolenaar
1624c4ce36d4SBram Moolenaar  for count in range(3)
1625c4ce36d4SBram Moolenaar    try
1626c4ce36d4SBram Moolenaar      source Xtestscript.vim
1627c4ce36d4SBram Moolenaar    catch /E684/
1628c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1629c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1630c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1631c4ce36d4SBram Moolenaar    endtry
1632c4ce36d4SBram Moolenaar  endfor
1633c4ce36d4SBram Moolenaar
1634c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1635c4ce36d4SBram Moolenaarenddef
1636c4ce36d4SBram Moolenaar
1637eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1638cfcd011fSBram Moolenaar  var export_lines =<< trim END
1639eef2102eSBram Moolenaar      vim9script
1640eef2102eSBram Moolenaar      export def Func()
1641eef2102eSBram Moolenaar        echo 'imported'
1642eef2102eSBram Moolenaar      enddef
1643eef2102eSBram Moolenaar  END
1644eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1645eef2102eSBram Moolenaar
1646cfcd011fSBram Moolenaar  var lines =<< trim END
1647eef2102eSBram Moolenaar    vim9script
1648eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1649eef2102eSBram Moolenaar    def Func()
1650eef2102eSBram Moolenaar      echo 'local to function'
1651eef2102eSBram Moolenaar    enddef
1652eef2102eSBram Moolenaar  END
1653eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1654eef2102eSBram Moolenaar
1655eef2102eSBram Moolenaar  lines =<< trim END
1656eef2102eSBram Moolenaar    vim9script
1657eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1658eef2102eSBram Moolenaar    def Outer()
1659eef2102eSBram Moolenaar      def Func()
1660eef2102eSBram Moolenaar        echo 'local to function'
1661eef2102eSBram Moolenaar      enddef
1662eef2102eSBram Moolenaar    enddef
1663eef2102eSBram Moolenaar    defcompile
1664eef2102eSBram Moolenaar  END
1665eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1666eef2102eSBram Moolenaar
1667eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1668eef2102eSBram Moolenaarenddef
1669eef2102eSBram Moolenaar
1670b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1671cfcd011fSBram Moolenaar  var lines =<< trim END
1672b9a2cac3SBram Moolenaar    vim9script
1673b9a2cac3SBram Moolenaar    def Func()
1674b9a2cac3SBram Moolenaar      echo 'one'
1675b9a2cac3SBram Moolenaar    enddef
1676b9a2cac3SBram Moolenaar    def Func()
1677b9a2cac3SBram Moolenaar      echo 'two'
1678b9a2cac3SBram Moolenaar    enddef
1679b9a2cac3SBram Moolenaar  END
1680b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1681fa211f3cSBram Moolenaar
1682fa211f3cSBram Moolenaar  lines =<< trim END
1683fa211f3cSBram Moolenaar    vim9script
1684fa211f3cSBram Moolenaar    def Foo(): string
1685fa211f3cSBram Moolenaar      return 'foo'
1686fa211f3cSBram Moolenaar      enddef
1687fa211f3cSBram Moolenaar    def Func()
1688cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1689fa211f3cSBram Moolenaar    enddef
1690fa211f3cSBram Moolenaar    defcompile
1691fa211f3cSBram Moolenaar  END
1692fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1693b9a2cac3SBram Moolenaarenddef
1694b9a2cac3SBram Moolenaar
16958a7d6542SBram Moolenaardef Test_fixed_size_list()
1696f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1697cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
16988a7d6542SBram Moolenaar  l->remove(0)
16998a7d6542SBram Moolenaar  l->add(5)
17008a7d6542SBram Moolenaar  l->insert(99, 1)
17010f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17028a7d6542SBram Moolenaarenddef
17038a7d6542SBram Moolenaar
1704ae616494SBram Moolenaardef Test_no_insert_xit()
1705d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1706d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1707d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1708d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1709d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1710ae616494SBram Moolenaar
1711ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1712ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1713ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1714ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1715f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1716f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1717f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1718f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1719f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1720ae616494SBram Moolenaarenddef
1721ae616494SBram Moolenaar
1722158906cfSBram Moolenaardef IfElse(what: number): string
1723cfcd011fSBram Moolenaar  var res = ''
1724158906cfSBram Moolenaar  if what == 1
1725158906cfSBram Moolenaar    res = "one"
1726158906cfSBram Moolenaar  elseif what == 2
1727158906cfSBram Moolenaar    res = "two"
1728a259d8d3SBram Moolenaar  else
1729158906cfSBram Moolenaar    res = "three"
1730a259d8d3SBram Moolenaar  endif
1731158906cfSBram Moolenaar  return res
1732a259d8d3SBram Moolenaarenddef
1733a259d8d3SBram Moolenaar
1734158906cfSBram Moolenaardef Test_if_elseif_else()
1735158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1736158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1737158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
17380f18b6d1SBram Moolenaarenddef
17390f18b6d1SBram Moolenaar
1740e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1741d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1742d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1743d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1744d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1745d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1746e8c4abbbSBram Moolenaarenddef
1747e8c4abbbSBram Moolenaar
17486d69bf60SBram Moolenaarlet g:bool_true = v:true
17496d69bf60SBram Moolenaarlet g:bool_false = v:false
17506d69bf60SBram Moolenaar
17516d69bf60SBram Moolenaardef Test_if_const_expr()
1752cfcd011fSBram Moolenaar  var res = false
17536d69bf60SBram Moolenaar  if true ? true : false
17546d69bf60SBram Moolenaar    res = true
17556d69bf60SBram Moolenaar  endif
17566d69bf60SBram Moolenaar  assert_equal(true, res)
17576d69bf60SBram Moolenaar
1758585fea7bSBram Moolenaar  g:glob = 2
1759585fea7bSBram Moolenaar  if false
17606797966dSBram Moolenaar    execute('g:glob = 3')
1761585fea7bSBram Moolenaar  endif
1762585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1763585fea7bSBram Moolenaar  if true
17646797966dSBram Moolenaar    execute('g:glob = 3')
1765585fea7bSBram Moolenaar  endif
1766585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1767585fea7bSBram Moolenaar
17686d69bf60SBram Moolenaar  res = false
17696d69bf60SBram Moolenaar  if g:bool_true ? true : false
17706d69bf60SBram Moolenaar    res = true
17716d69bf60SBram Moolenaar  endif
17726d69bf60SBram Moolenaar  assert_equal(true, res)
17736d69bf60SBram Moolenaar
17746d69bf60SBram Moolenaar  res = false
17756d69bf60SBram Moolenaar  if true ? g:bool_true : false
17766d69bf60SBram Moolenaar    res = true
17776d69bf60SBram Moolenaar  endif
17786d69bf60SBram Moolenaar  assert_equal(true, res)
17796d69bf60SBram Moolenaar
17806d69bf60SBram Moolenaar  res = false
17816d69bf60SBram Moolenaar  if true ? true : g:bool_false
17826d69bf60SBram Moolenaar    res = true
17836d69bf60SBram Moolenaar  endif
17846d69bf60SBram Moolenaar  assert_equal(true, res)
17856d69bf60SBram Moolenaar
17866d69bf60SBram Moolenaar  res = false
17876d69bf60SBram Moolenaar  if true ? false : true
17886d69bf60SBram Moolenaar    res = true
17896d69bf60SBram Moolenaar  endif
17906d69bf60SBram Moolenaar  assert_equal(false, res)
17916d69bf60SBram Moolenaar
17926d69bf60SBram Moolenaar  res = false
17936d69bf60SBram Moolenaar  if false ? false : true
17946d69bf60SBram Moolenaar    res = true
17956d69bf60SBram Moolenaar  endif
17966d69bf60SBram Moolenaar  assert_equal(true, res)
17976d69bf60SBram Moolenaar
17986d69bf60SBram Moolenaar  res = false
17996d69bf60SBram Moolenaar  if false ? true : false
18006d69bf60SBram Moolenaar    res = true
18016d69bf60SBram Moolenaar  endif
18026d69bf60SBram Moolenaar  assert_equal(false, res)
18036d69bf60SBram Moolenaar
18046d69bf60SBram Moolenaar  res = false
1805e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1806e8c4abbbSBram Moolenaar    res = true
1807e8c4abbbSBram Moolenaar  endif
1808e8c4abbbSBram Moolenaar  assert_equal(false, res)
1809e8c4abbbSBram Moolenaar
1810e8c4abbbSBram Moolenaar  res = false
18116d69bf60SBram Moolenaar  if true && true
18126d69bf60SBram Moolenaar    res = true
18136d69bf60SBram Moolenaar  endif
18146d69bf60SBram Moolenaar  assert_equal(true, res)
18156d69bf60SBram Moolenaar
18166d69bf60SBram Moolenaar  res = false
18176d69bf60SBram Moolenaar  if true && false
18186d69bf60SBram Moolenaar    res = true
18196d69bf60SBram Moolenaar  endif
18206d69bf60SBram Moolenaar  assert_equal(false, res)
18216d69bf60SBram Moolenaar
18226d69bf60SBram Moolenaar  res = false
18236d69bf60SBram Moolenaar  if g:bool_true && false
18246d69bf60SBram Moolenaar    res = true
18256d69bf60SBram Moolenaar  endif
18266d69bf60SBram Moolenaar  assert_equal(false, res)
18276d69bf60SBram Moolenaar
18286d69bf60SBram Moolenaar  res = false
18296d69bf60SBram Moolenaar  if true && g:bool_false
18306d69bf60SBram Moolenaar    res = true
18316d69bf60SBram Moolenaar  endif
18326d69bf60SBram Moolenaar  assert_equal(false, res)
18336d69bf60SBram Moolenaar
18346d69bf60SBram Moolenaar  res = false
18356d69bf60SBram Moolenaar  if false && false
18366d69bf60SBram Moolenaar    res = true
18376d69bf60SBram Moolenaar  endif
18386d69bf60SBram Moolenaar  assert_equal(false, res)
18396d69bf60SBram Moolenaar
18406d69bf60SBram Moolenaar  res = false
18416d69bf60SBram Moolenaar  if true || false
18426d69bf60SBram Moolenaar    res = true
18436d69bf60SBram Moolenaar  endif
18446d69bf60SBram Moolenaar  assert_equal(true, res)
18456d69bf60SBram Moolenaar
18466d69bf60SBram Moolenaar  res = false
18476d69bf60SBram Moolenaar  if g:bool_true || false
18486d69bf60SBram Moolenaar    res = true
18496d69bf60SBram Moolenaar  endif
18506d69bf60SBram Moolenaar  assert_equal(true, res)
18516d69bf60SBram Moolenaar
18526d69bf60SBram Moolenaar  res = false
18536d69bf60SBram Moolenaar  if true || g:bool_false
18546d69bf60SBram Moolenaar    res = true
18556d69bf60SBram Moolenaar  endif
18566d69bf60SBram Moolenaar  assert_equal(true, res)
18576d69bf60SBram Moolenaar
18586d69bf60SBram Moolenaar  res = false
18596d69bf60SBram Moolenaar  if false || false
18606d69bf60SBram Moolenaar    res = true
18616d69bf60SBram Moolenaar  endif
18626d69bf60SBram Moolenaar  assert_equal(false, res)
18633988f64fSBram Moolenaar
18643988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
18653988f64fSBram Moolenaar  if false | eval 0 | endif
18663988f64fSBram Moolenaar  if false | eval burp + 234 | endif
18673988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
18683988f64fSBram Moolenaar  if false
18693988f64fSBram Moolenaar    burp
18703988f64fSBram Moolenaar  endif
187180c34ca3SBram Moolenaarenddef
18726d69bf60SBram Moolenaar
187380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1874d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1875d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1876d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1877d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
18786d69bf60SBram Moolenaarenddef
18796d69bf60SBram Moolenaar
188072abcf42SBram Moolenaardef RunNested(i: number): number
1881cfcd011fSBram Moolenaar  var x: number = 0
188272abcf42SBram Moolenaar  if i % 2
188372abcf42SBram Moolenaar    if 1
1884f5be8cdbSBram Moolenaar      # comment
188572abcf42SBram Moolenaar    else
1886f5be8cdbSBram Moolenaar      # comment
188772abcf42SBram Moolenaar    endif
188872abcf42SBram Moolenaar    x += 1
188972abcf42SBram Moolenaar  else
189072abcf42SBram Moolenaar    x += 1000
189172abcf42SBram Moolenaar  endif
189272abcf42SBram Moolenaar  return x
189372abcf42SBram Moolenaarenddef
189472abcf42SBram Moolenaar
189572abcf42SBram Moolenaardef Test_nested_if()
189672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
189772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
189872abcf42SBram Moolenaarenddef
189972abcf42SBram Moolenaar
1900ad39c094SBram Moolenaardef Test_execute_cmd()
1901e4984290SBram Moolenaar  # missing argument is ignored
1902e4984290SBram Moolenaar  execute
1903e4984290SBram Moolenaar  execute # comment
1904e4984290SBram Moolenaar
1905ad39c094SBram Moolenaar  new
1906ad39c094SBram Moolenaar  setline(1, 'default')
1907d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1908ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1909a72cfb80SBram Moolenaar
1910d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1911a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1912a72cfb80SBram Moolenaar
1913cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1914cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1915a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1916ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1917a72cfb80SBram Moolenaar
1918d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1919ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1920a72cfb80SBram Moolenaar
1921cfcd011fSBram Moolenaar  var cmd_first = 'call '
1922cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1923ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1924ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1925ad39c094SBram Moolenaar  bwipe!
1926585fea7bSBram Moolenaar
1927cfcd011fSBram Moolenaar  var n = true
19282d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
19292d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
19302d6b20d6SBram Moolenaar
1931e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1932e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1933e5abf7afSBram Moolenaar
1934d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1935d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1936d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1937ad39c094SBram Moolenaarenddef
1938ad39c094SBram Moolenaar
193947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1940f5be8cdbSBram Moolenaar  # only checks line continuation
1941cfcd011fSBram Moolenaar  var lines =<< trim END
194247e880d6SBram Moolenaar      vim9script
194347e880d6SBram Moolenaar      execute 'g:someVar'
194447e880d6SBram Moolenaar                .. ' = ' ..
194547e880d6SBram Moolenaar                   '28'
194647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
194747e880d6SBram Moolenaar      unlet g:someVar
194847e880d6SBram Moolenaar  END
194947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
195047e880d6SBram Moolenaarenddef
195147e880d6SBram Moolenaar
1952ad39c094SBram Moolenaardef Test_echo_cmd()
1953a72cfb80SBram Moolenaar  echo 'some' # comment
1954585fea7bSBram Moolenaar  echon 'thing'
1955ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1956ad39c094SBram Moolenaar
1957a72cfb80SBram Moolenaar  echo "some" # comment
1958a72cfb80SBram Moolenaar  echon "thing"
1959a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1960a72cfb80SBram Moolenaar
1961cfcd011fSBram Moolenaar  var str1 = 'some'
1962cfcd011fSBram Moolenaar  var str2 = 'more'
1963ad39c094SBram Moolenaar  echo str1 str2
1964ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1965a72cfb80SBram Moolenaar
1966d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1967ad39c094SBram Moolenaarenddef
1968ad39c094SBram Moolenaar
1969f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1970f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1971f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1972f93c7feaSBram Moolenaar  echo 'clear'
1973df069eecSBram Moolenaar  :1messages
1974f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1975f93c7feaSBram Moolenaar
1976d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1977f93c7feaSBram Moolenaarenddef
1978f93c7feaSBram Moolenaar
197947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1980f5be8cdbSBram Moolenaar  # only checks line continuation
1981cfcd011fSBram Moolenaar  var lines =<< trim END
198247e880d6SBram Moolenaar      vim9script
198347e880d6SBram Moolenaar      echomsg 'here'
198447e880d6SBram Moolenaar                .. ' is ' ..
198547e880d6SBram Moolenaar                   'a message'
198647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
198747e880d6SBram Moolenaar  END
198847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
198947e880d6SBram Moolenaarenddef
199047e880d6SBram Moolenaar
1991f93c7feaSBram Moolenaardef Test_echoerr_cmd()
199240ee466cSBram Moolenaar  try
199340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
199440ee466cSBram Moolenaar  catch
199540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
199640ee466cSBram Moolenaar  endtry
1997f93c7feaSBram Moolenaarenddef
1998f93c7feaSBram Moolenaar
199947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2000f5be8cdbSBram Moolenaar  # only checks line continuation
2001cfcd011fSBram Moolenaar  var lines =<< trim END
200247e880d6SBram Moolenaar      vim9script
200347e880d6SBram Moolenaar      try
200447e880d6SBram Moolenaar        echoerr 'this'
200547e880d6SBram Moolenaar                .. ' is ' ..
200647e880d6SBram Moolenaar                   'wrong'
200747e880d6SBram Moolenaar      catch
200847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
200947e880d6SBram Moolenaar      endtry
201047e880d6SBram Moolenaar  END
201147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
201247e880d6SBram Moolenaarenddef
201347e880d6SBram Moolenaar
201441fe0617SBram Moolenaardef Test_for_outside_of_function()
2015cfcd011fSBram Moolenaar  var lines =<< trim END
201641fe0617SBram Moolenaar    vim9script
201741fe0617SBram Moolenaar    new
201841fe0617SBram Moolenaar    for var in range(0, 3)
201941fe0617SBram Moolenaar      append(line('$'), var)
202041fe0617SBram Moolenaar    endfor
202141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
202241fe0617SBram Moolenaar    bwipe!
202341fe0617SBram Moolenaar  END
202441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
202541fe0617SBram Moolenaar  source Xvim9for.vim
202641fe0617SBram Moolenaar  delete('Xvim9for.vim')
202741fe0617SBram Moolenaarenddef
20288a7d6542SBram Moolenaar
2029e8c4abbbSBram Moolenaardef Test_for_loop()
2030cfcd011fSBram Moolenaar  var result = ''
2031e8c4abbbSBram Moolenaar  for cnt in range(7)
2032e8c4abbbSBram Moolenaar    if cnt == 4
2033e8c4abbbSBram Moolenaar      break
2034e8c4abbbSBram Moolenaar    endif
2035e8c4abbbSBram Moolenaar    if cnt == 2
2036e8c4abbbSBram Moolenaar      continue
2037e8c4abbbSBram Moolenaar    endif
2038e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2039e8c4abbbSBram Moolenaar  endfor
2040e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
20410ad3e894SBram Moolenaar
2042cfcd011fSBram Moolenaar  var concat = ''
20430ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
20440ad3e894SBram Moolenaar    concat ..= str
20450ad3e894SBram Moolenaar  endfor
20460ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
204738bd8de5SBram Moolenaar
204838bd8de5SBram Moolenaar  var total = 0
204938bd8de5SBram Moolenaar  for nr in
205038bd8de5SBram Moolenaar      [1, 2, 3]
205138bd8de5SBram Moolenaar    total += nr
205238bd8de5SBram Moolenaar  endfor
205338bd8de5SBram Moolenaar  assert_equal(6, total)
205438bd8de5SBram Moolenaar
205538bd8de5SBram Moolenaar  total = 0
205638bd8de5SBram Moolenaar  for nr
205738bd8de5SBram Moolenaar    in [1, 2, 3]
205838bd8de5SBram Moolenaar    total += nr
205938bd8de5SBram Moolenaar  endfor
206038bd8de5SBram Moolenaar  assert_equal(6, total)
206138bd8de5SBram Moolenaar
206238bd8de5SBram Moolenaar  total = 0
206338bd8de5SBram Moolenaar  for nr
206438bd8de5SBram Moolenaar    in
206538bd8de5SBram Moolenaar    [1, 2, 3]
206638bd8de5SBram Moolenaar    total += nr
206738bd8de5SBram Moolenaar  endfor
206838bd8de5SBram Moolenaar  assert_equal(6, total)
2069036d0714SBram Moolenaar
2070036d0714SBram Moolenaar  var res = ""
2071036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2072036d0714SBram Moolenaar    res ..= n .. s
2073036d0714SBram Moolenaar  endfor
2074036d0714SBram Moolenaar  assert_equal('1a2b', res)
2075e8c4abbbSBram Moolenaarenddef
2076e8c4abbbSBram Moolenaar
2077e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2078025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2079025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2080025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2081675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2082675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2083cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2084822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
20852d870f8dSBram Moolenaar  delfunc! g:Func
2086451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2087675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2088675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2089675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2090e8c4abbbSBram Moolenaarenddef
2091e8c4abbbSBram Moolenaar
2092ea87069dSBram Moolenaardef Test_for_loop_script_var()
2093ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2094ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2095ea87069dSBram Moolenaar
2096ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2097ea87069dSBram Moolenaar  var lines =<< trim END
2098ea87069dSBram Moolenaar    vim9script
2099ea87069dSBram Moolenaar    var total = 0
2100ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2101ea87069dSBram Moolenaar      total += s:var
2102ea87069dSBram Moolenaar    endfor
2103ea87069dSBram Moolenaar    assert_equal(6, total)
2104ea87069dSBram Moolenaar
2105ea87069dSBram Moolenaar    total = 0
2106ea87069dSBram Moolenaar    for var in [1, 2, 3]
2107ea87069dSBram Moolenaar      total += var
2108ea87069dSBram Moolenaar    endfor
2109ea87069dSBram Moolenaar    assert_equal(6, total)
2110ea87069dSBram Moolenaar  END
2111ea87069dSBram Moolenaarenddef
2112ea87069dSBram Moolenaar
2113792f786aSBram Moolenaardef Test_for_loop_unpack()
21144b8a0651SBram Moolenaar  var lines =<< trim END
2115792f786aSBram Moolenaar      var result = []
2116792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2117792f786aSBram Moolenaar        result->add(v1)
2118792f786aSBram Moolenaar        result->add(v2)
2119792f786aSBram Moolenaar      endfor
2120792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2121792f786aSBram Moolenaar
2122792f786aSBram Moolenaar      result = []
2123792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2124792f786aSBram Moolenaar        result->add(v1)
2125792f786aSBram Moolenaar        result->add(v2)
2126792f786aSBram Moolenaar        result->add(v3)
2127792f786aSBram Moolenaar      endfor
2128792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2129792f786aSBram Moolenaar
21304b8a0651SBram Moolenaar      result = []
21314b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
21324b8a0651SBram Moolenaar        result->add(&ts)
21334b8a0651SBram Moolenaar        result->add(&sw)
21344b8a0651SBram Moolenaar      endfor
21354b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
21364b8a0651SBram Moolenaar
21374b8a0651SBram Moolenaar      var slist: list<string>
21384b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
21394b8a0651SBram Moolenaar        slist->add($LOOPVAR)
21404b8a0651SBram Moolenaar        slist->add(@r)
21414b8a0651SBram Moolenaar        slist->add(v:errmsg)
21424b8a0651SBram Moolenaar      endfor
21434b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
21444b8a0651SBram Moolenaar
21454b8a0651SBram Moolenaar      slist = []
21464b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
21474b8a0651SBram Moolenaar        slist->add(g:globalvar)
21484b8a0651SBram Moolenaar        slist->add(b:bufvar)
21494b8a0651SBram Moolenaar        slist->add(w:winvar)
21504b8a0651SBram Moolenaar        slist->add(t:tabvar)
21514b8a0651SBram Moolenaar      endfor
21524b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2153f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
21544b8a0651SBram Moolenaar  END
21554b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
21564b8a0651SBram Moolenaar
21574b8a0651SBram Moolenaar  lines =<< trim END
2158792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2159792f786aSBram Moolenaar        echo v1 v2
2160792f786aSBram Moolenaar      endfor
2161792f786aSBram Moolenaar  END
2162792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2163792f786aSBram Moolenaar
2164792f786aSBram Moolenaar  lines =<< trim END
2165792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2166792f786aSBram Moolenaar        echo v1 v2
2167792f786aSBram Moolenaar      endfor
2168792f786aSBram Moolenaar  END
2169792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2170792f786aSBram Moolenaar
2171792f786aSBram Moolenaar  lines =<< trim END
2172792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2173792f786aSBram Moolenaar        echo v1
2174792f786aSBram Moolenaar      endfor
2175792f786aSBram Moolenaar  END
2176792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2177792f786aSBram Moolenaarenddef
2178792f786aSBram Moolenaar
2179d0df1aacSBram Moolenaardef Test_while_loop()
2180cfcd011fSBram Moolenaar  var result = ''
2181cfcd011fSBram Moolenaar  var cnt = 0
2182d0df1aacSBram Moolenaar  while cnt < 555
2183d0df1aacSBram Moolenaar    if cnt == 3
2184d0df1aacSBram Moolenaar      break
2185d0df1aacSBram Moolenaar    endif
2186d0df1aacSBram Moolenaar    cnt += 1
2187d0df1aacSBram Moolenaar    if cnt == 2
2188d0df1aacSBram Moolenaar      continue
2189d0df1aacSBram Moolenaar    endif
2190d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2191d0df1aacSBram Moolenaar  endwhile
2192d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2193d0df1aacSBram Moolenaarenddef
2194d0df1aacSBram Moolenaar
2195e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2196675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2197675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2198675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2199675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2200675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2201675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2202675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2203bd5da371SBram Moolenaarenddef
2204bd5da371SBram Moolenaar
22059645e2d9SBram Moolenaardef Test_interrupt_loop()
2206cfcd011fSBram Moolenaar  var caught = false
2207cfcd011fSBram Moolenaar  var x = 0
220897acfc78SBram Moolenaar  try
22099645e2d9SBram Moolenaar    while 1
22109645e2d9SBram Moolenaar      x += 1
22119645e2d9SBram Moolenaar      if x == 100
22129645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22139645e2d9SBram Moolenaar      endif
22149645e2d9SBram Moolenaar    endwhile
221597acfc78SBram Moolenaar  catch
221697acfc78SBram Moolenaar    caught = true
221797acfc78SBram Moolenaar    assert_equal(100, x)
221897acfc78SBram Moolenaar  endtry
221997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
222025859dd7SBram Moolenaar  # consume the CTRL-C
222125859dd7SBram Moolenaar  getchar(0)
22229645e2d9SBram Moolenaarenddef
222320431c9dSBram Moolenaar
22244fdae999SBram Moolenaardef Test_automatic_line_continuation()
2225cfcd011fSBram Moolenaar  var mylist = [
22264fdae999SBram Moolenaar      'one',
22274fdae999SBram Moolenaar      'two',
22284fdae999SBram Moolenaar      'three',
2229f5be8cdbSBram Moolenaar      ] # comment
22304fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
22314fdae999SBram Moolenaar
2232cfcd011fSBram Moolenaar  var mydict = {
2233e0de171eSBram Moolenaar      ['one']: 1,
2234e0de171eSBram Moolenaar      ['two']: 2,
2235e0de171eSBram Moolenaar      ['three']:
22364fdae999SBram Moolenaar          3,
2237f5be8cdbSBram Moolenaar      } # comment
2238e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2239e0de171eSBram Moolenaar  mydict = {
22402c330432SBram Moolenaar      one: 1,  # comment
22412c330432SBram Moolenaar      two:     # comment
22422c330432SBram Moolenaar           2,  # comment
22432c330432SBram Moolenaar      three: 3 # comment
22442c330432SBram Moolenaar      }
2245e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2246e0de171eSBram Moolenaar  mydict = {
22472c330432SBram Moolenaar      one: 1,
22484fdae999SBram Moolenaar      two:
22494fdae999SBram Moolenaar           2,
22502c330432SBram Moolenaar      three: 3
22514fdae999SBram Moolenaar      }
2252e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2253e6085c53SBram Moolenaar
2254e6085c53SBram Moolenaar  assert_equal(
2255e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2256e6085c53SBram Moolenaar        split('one two three')
2257e6085c53SBram Moolenaar        )
22584fdae999SBram Moolenaarenddef
22594fdae999SBram Moolenaar
22607a092245SBram Moolenaardef Test_vim9_comment()
22617a092245SBram Moolenaar  CheckScriptSuccess([
22627a092245SBram Moolenaar      'vim9script',
22637a092245SBram Moolenaar      '# something',
226493f82cbeSBram Moolenaar      '#something',
226593f82cbeSBram Moolenaar      '#{something',
22667a092245SBram Moolenaar      ])
226793f82cbeSBram Moolenaar
226893f82cbeSBram Moolenaar  split Xfile
226993f82cbeSBram Moolenaar  CheckScriptSuccess([
227093f82cbeSBram Moolenaar      'vim9script',
227193f82cbeSBram Moolenaar      'edit #something',
227293f82cbeSBram Moolenaar      ])
227393f82cbeSBram Moolenaar  CheckScriptSuccess([
227493f82cbeSBram Moolenaar      'vim9script',
227593f82cbeSBram Moolenaar      'edit #{something',
227693f82cbeSBram Moolenaar      ])
227793f82cbeSBram Moolenaar  close
227893f82cbeSBram Moolenaar
22797a092245SBram Moolenaar  CheckScriptFailure([
22807a092245SBram Moolenaar      'vim9script',
22817a092245SBram Moolenaar      ':# something',
22827a092245SBram Moolenaar      ], 'E488:')
22837a092245SBram Moolenaar  CheckScriptFailure([
22847a092245SBram Moolenaar      '# something',
22857a092245SBram Moolenaar      ], 'E488:')
22867a092245SBram Moolenaar  CheckScriptFailure([
22877a092245SBram Moolenaar      ':# something',
22887a092245SBram Moolenaar      ], 'E488:')
22897a092245SBram Moolenaar
22904a8d9f2eSBram Moolenaar  { # block start
22914a8d9f2eSBram Moolenaar  } # block end
22924a8d9f2eSBram Moolenaar  CheckDefFailure([
22934a8d9f2eSBram Moolenaar      '{# comment',
22944a8d9f2eSBram Moolenaar      ], 'E488:')
22954a8d9f2eSBram Moolenaar  CheckDefFailure([
22964a8d9f2eSBram Moolenaar      '{',
22974a8d9f2eSBram Moolenaar      '}# comment',
22984a8d9f2eSBram Moolenaar      ], 'E488:')
22994a8d9f2eSBram Moolenaar
23004a8d9f2eSBram Moolenaar  echo "yes" # comment
23014a8d9f2eSBram Moolenaar  CheckDefFailure([
23024a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23034a8d9f2eSBram Moolenaar      ], 'E488:')
23047a092245SBram Moolenaar  CheckScriptSuccess([
23057a092245SBram Moolenaar      'vim9script',
23067a092245SBram Moolenaar      'echo "yes" # something',
23077a092245SBram Moolenaar      ])
23087a092245SBram Moolenaar  CheckScriptFailure([
23097a092245SBram Moolenaar      'vim9script',
23107a092245SBram Moolenaar      'echo "yes"# something',
23117a092245SBram Moolenaar      ], 'E121:')
23127a092245SBram Moolenaar  CheckScriptFailure([
23137a092245SBram Moolenaar      'vim9script',
23147a092245SBram Moolenaar      'echo# something',
2315f8103f27SBram Moolenaar      ], 'E1144:')
23167a092245SBram Moolenaar  CheckScriptFailure([
23177a092245SBram Moolenaar      'echo "yes" # something',
23187a092245SBram Moolenaar      ], 'E121:')
23197a092245SBram Moolenaar
23204a8d9f2eSBram Moolenaar  exe "echo" # comment
23214a8d9f2eSBram Moolenaar  CheckDefFailure([
23224a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23234a8d9f2eSBram Moolenaar      ], 'E488:')
23244a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23254a8d9f2eSBram Moolenaar      'vim9script',
23264a8d9f2eSBram Moolenaar      'exe "echo" # something',
23274a8d9f2eSBram Moolenaar      ])
23284a8d9f2eSBram Moolenaar  CheckScriptFailure([
23294a8d9f2eSBram Moolenaar      'vim9script',
23304a8d9f2eSBram Moolenaar      'exe "echo"# something',
23314a8d9f2eSBram Moolenaar      ], 'E121:')
23324a8d9f2eSBram Moolenaar  CheckScriptFailure([
23334a8d9f2eSBram Moolenaar      'vim9script',
23344a8d9f2eSBram Moolenaar      'exe# something',
2335f8103f27SBram Moolenaar      ], 'E1144:')
23364a8d9f2eSBram Moolenaar  CheckScriptFailure([
23374a8d9f2eSBram Moolenaar      'exe "echo" # something',
23384a8d9f2eSBram Moolenaar      ], 'E121:')
23394a8d9f2eSBram Moolenaar
23407a092245SBram Moolenaar  CheckDefFailure([
23417a092245SBram Moolenaar      'try# comment',
23427a092245SBram Moolenaar      '  echo "yes"',
23437a092245SBram Moolenaar      'catch',
23447a092245SBram Moolenaar      'endtry',
2345f8103f27SBram Moolenaar      ], 'E1144:')
23462c5ed4e3SBram Moolenaar  CheckScriptFailure([
23472c5ed4e3SBram Moolenaar      'vim9script',
23482c5ed4e3SBram Moolenaar      'try# comment',
23492c5ed4e3SBram Moolenaar      'echo "yes"',
2350f8103f27SBram Moolenaar      ], 'E1144:')
23517a092245SBram Moolenaar  CheckDefFailure([
23527a092245SBram Moolenaar      'try',
2353a72cfb80SBram Moolenaar      '  throw#comment',
2354a72cfb80SBram Moolenaar      'catch',
2355a72cfb80SBram Moolenaar      'endtry',
2356f8103f27SBram Moolenaar      ], 'E1144:')
2357a72cfb80SBram Moolenaar  CheckDefFailure([
2358a72cfb80SBram Moolenaar      'try',
2359a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2360a72cfb80SBram Moolenaar      'catch',
2361a72cfb80SBram Moolenaar      'endtry',
2362a72cfb80SBram Moolenaar      ], 'E488:')
2363a72cfb80SBram Moolenaar  CheckDefFailure([
2364a72cfb80SBram Moolenaar      'try',
23657a092245SBram Moolenaar      '  echo "yes"',
23667a092245SBram Moolenaar      'catch# comment',
23677a092245SBram Moolenaar      'endtry',
2368f8103f27SBram Moolenaar      ], 'E1144:')
23692c5ed4e3SBram Moolenaar  CheckScriptFailure([
23702c5ed4e3SBram Moolenaar      'vim9script',
23712c5ed4e3SBram Moolenaar      'try',
23722c5ed4e3SBram Moolenaar      '  echo "yes"',
23732c5ed4e3SBram Moolenaar      'catch# comment',
23742c5ed4e3SBram Moolenaar      'endtry',
2375f8103f27SBram Moolenaar      ], 'E1144:')
23762c5ed4e3SBram Moolenaar  CheckDefFailure([
23772c5ed4e3SBram Moolenaar      'try',
23782c5ed4e3SBram Moolenaar      '  echo "yes"',
23792c5ed4e3SBram Moolenaar      'catch /pat/# comment',
23802c5ed4e3SBram Moolenaar      'endtry',
23812c5ed4e3SBram Moolenaar      ], 'E488:')
23827a092245SBram Moolenaar  CheckDefFailure([
23837a092245SBram Moolenaar      'try',
23847a092245SBram Moolenaar      'echo "yes"',
23857a092245SBram Moolenaar      'catch',
23867a092245SBram Moolenaar      'endtry# comment',
2387f8103f27SBram Moolenaar      ], 'E1144:')
23882c5ed4e3SBram Moolenaar  CheckScriptFailure([
23892c5ed4e3SBram Moolenaar      'vim9script',
23902c5ed4e3SBram Moolenaar      'try',
23912c5ed4e3SBram Moolenaar      '  echo "yes"',
23922c5ed4e3SBram Moolenaar      'catch',
23932c5ed4e3SBram Moolenaar      'endtry# comment',
2394f8103f27SBram Moolenaar      ], 'E1144:')
23952c5ed4e3SBram Moolenaar
23962c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23972c5ed4e3SBram Moolenaar      'vim9script',
23982c5ed4e3SBram Moolenaar      'hi # comment',
23992c5ed4e3SBram Moolenaar      ])
24002c5ed4e3SBram Moolenaar  CheckScriptFailure([
24012c5ed4e3SBram Moolenaar      'vim9script',
24022c5ed4e3SBram Moolenaar      'hi# comment',
2403f8103f27SBram Moolenaar      ], 'E1144:')
24041966c248SBram Moolenaar  CheckScriptSuccess([
24051966c248SBram Moolenaar      'vim9script',
24061966c248SBram Moolenaar      'hi Search # comment',
24071966c248SBram Moolenaar      ])
24081966c248SBram Moolenaar  CheckScriptFailure([
24091966c248SBram Moolenaar      'vim9script',
24101966c248SBram Moolenaar      'hi Search# comment',
24111966c248SBram Moolenaar      ], 'E416:')
24121966c248SBram Moolenaar  CheckScriptSuccess([
24131966c248SBram Moolenaar      'vim9script',
24141966c248SBram Moolenaar      'hi link This Search # comment',
24151966c248SBram Moolenaar      ])
24161966c248SBram Moolenaar  CheckScriptFailure([
24171966c248SBram Moolenaar      'vim9script',
24181966c248SBram Moolenaar      'hi link This That# comment',
24191966c248SBram Moolenaar      ], 'E413:')
24201966c248SBram Moolenaar  CheckScriptSuccess([
24211966c248SBram Moolenaar      'vim9script',
24221966c248SBram Moolenaar      'hi clear This # comment',
24231966c248SBram Moolenaar      'hi clear # comment',
24241966c248SBram Moolenaar      ])
2425f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2426f5be8cdbSBram Moolenaar  # hi clear This# comment',
24271966c248SBram Moolenaar  CheckScriptFailure([
24281966c248SBram Moolenaar      'vim9script',
24291966c248SBram Moolenaar      'hi clear# comment',
24301966c248SBram Moolenaar      ], 'E416:')
24311966c248SBram Moolenaar
24321966c248SBram Moolenaar  CheckScriptSuccess([
24331966c248SBram Moolenaar      'vim9script',
24341966c248SBram Moolenaar      'hi Group term=bold',
24351966c248SBram Moolenaar      'match Group /todo/ # comment',
24361966c248SBram Moolenaar      ])
24371966c248SBram Moolenaar  CheckScriptFailure([
24381966c248SBram Moolenaar      'vim9script',
24391966c248SBram Moolenaar      'hi Group term=bold',
24401966c248SBram Moolenaar      'match Group /todo/# comment',
24411966c248SBram Moolenaar      ], 'E488:')
24421966c248SBram Moolenaar  CheckScriptSuccess([
24431966c248SBram Moolenaar      'vim9script',
24441966c248SBram Moolenaar      'match # comment',
24451966c248SBram Moolenaar      ])
24461966c248SBram Moolenaar  CheckScriptFailure([
24471966c248SBram Moolenaar      'vim9script',
24481966c248SBram Moolenaar      'match# comment',
2449f8103f27SBram Moolenaar      ], 'E1144:')
24501966c248SBram Moolenaar  CheckScriptSuccess([
24511966c248SBram Moolenaar      'vim9script',
24521966c248SBram Moolenaar      'match none # comment',
24531966c248SBram Moolenaar      ])
24541966c248SBram Moolenaar  CheckScriptFailure([
24551966c248SBram Moolenaar      'vim9script',
24561966c248SBram Moolenaar      'match none# comment',
24571966c248SBram Moolenaar      ], 'E475:')
24581966c248SBram Moolenaar
24591966c248SBram Moolenaar  CheckScriptSuccess([
24601966c248SBram Moolenaar      'vim9script',
24611966c248SBram Moolenaar      'menutrans clear # comment',
24621966c248SBram Moolenaar      ])
24631966c248SBram Moolenaar  CheckScriptFailure([
24641966c248SBram Moolenaar      'vim9script',
24651966c248SBram Moolenaar      'menutrans clear# comment text',
24661966c248SBram Moolenaar      ], 'E474:')
24671966c248SBram Moolenaar
24681966c248SBram Moolenaar  CheckScriptSuccess([
24691966c248SBram Moolenaar      'vim9script',
24701966c248SBram Moolenaar      'syntax clear # comment',
24711966c248SBram Moolenaar      ])
24721966c248SBram Moolenaar  CheckScriptFailure([
24731966c248SBram Moolenaar      'vim9script',
24741966c248SBram Moolenaar      'syntax clear# comment text',
24751966c248SBram Moolenaar      ], 'E28:')
24761966c248SBram Moolenaar  CheckScriptSuccess([
24771966c248SBram Moolenaar      'vim9script',
24781966c248SBram Moolenaar      'syntax keyword Word some',
24791966c248SBram Moolenaar      'syntax clear Word # comment',
24801966c248SBram Moolenaar      ])
24811966c248SBram Moolenaar  CheckScriptFailure([
24821966c248SBram Moolenaar      'vim9script',
24831966c248SBram Moolenaar      'syntax keyword Word some',
24841966c248SBram Moolenaar      'syntax clear Word# comment text',
24851966c248SBram Moolenaar      ], 'E28:')
24861966c248SBram Moolenaar
24871966c248SBram Moolenaar  CheckScriptSuccess([
24881966c248SBram Moolenaar      'vim9script',
24891966c248SBram Moolenaar      'syntax list # comment',
24901966c248SBram Moolenaar      ])
24911966c248SBram Moolenaar  CheckScriptFailure([
24921966c248SBram Moolenaar      'vim9script',
24931966c248SBram Moolenaar      'syntax list# comment text',
24941966c248SBram Moolenaar      ], 'E28:')
24951966c248SBram Moolenaar
24961966c248SBram Moolenaar  CheckScriptSuccess([
24971966c248SBram Moolenaar      'vim9script',
24981966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24991966c248SBram Moolenaar      ])
25001966c248SBram Moolenaar  CheckScriptFailure([
25011966c248SBram Moolenaar      'vim9script',
25021966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25031966c248SBram Moolenaar      ], 'E475:')
25041966c248SBram Moolenaar
25051966c248SBram Moolenaar  CheckScriptSuccess([
25061966c248SBram Moolenaar      'vim9script',
25071966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25081966c248SBram Moolenaar      ])
25091966c248SBram Moolenaar  CheckScriptFailure([
25101966c248SBram Moolenaar      'vim9script',
25111966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25121966c248SBram Moolenaar      ], 'E789:')
25131966c248SBram Moolenaar
25141966c248SBram Moolenaar  CheckScriptSuccess([
25151966c248SBram Moolenaar      'vim9script',
25161966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25171966c248SBram Moolenaar      ])
25181966c248SBram Moolenaar  CheckScriptFailure([
25191966c248SBram Moolenaar      'vim9script',
25201966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25211966c248SBram Moolenaar      ], 'E402:')
25221966c248SBram Moolenaar
25231966c248SBram Moolenaar  CheckScriptSuccess([
25241966c248SBram Moolenaar      'vim9script',
25251966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25261966c248SBram Moolenaar      ])
25271966c248SBram Moolenaar  CheckScriptFailure([
25281966c248SBram Moolenaar      'vim9script',
25291966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25301966c248SBram Moolenaar      ], 'E475:')
25311966c248SBram Moolenaar  CheckScriptFailure([
25321966c248SBram Moolenaar      'vim9script',
25331966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
25341966c248SBram Moolenaar      ], 'E406:')
25351966c248SBram Moolenaar  CheckScriptFailure([
25361966c248SBram Moolenaar      'vim9script',
25371966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
25381966c248SBram Moolenaar      ], 'E475:')
25391966c248SBram Moolenaar
25401966c248SBram Moolenaar  CheckScriptSuccess([
25411966c248SBram Moolenaar      'vim9script',
25421966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
25431966c248SBram Moolenaar      ])
25441966c248SBram Moolenaar  CheckScriptFailure([
25451966c248SBram Moolenaar      'vim9script',
25461966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2547d032f34aSBram Moolenaar      ], 'E402:')
25481966c248SBram Moolenaar
25491966c248SBram Moolenaar  CheckScriptSuccess([
25501966c248SBram Moolenaar      'vim9script',
25511966c248SBram Moolenaar      'syntax sync # comment',
25521966c248SBram Moolenaar      ])
25531966c248SBram Moolenaar  CheckScriptFailure([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'syntax sync# comment',
25561966c248SBram Moolenaar      ], 'E404:')
25571966c248SBram Moolenaar  CheckScriptSuccess([
25581966c248SBram Moolenaar      'vim9script',
25591966c248SBram Moolenaar      'syntax sync ccomment # comment',
25601966c248SBram Moolenaar      ])
25611966c248SBram Moolenaar  CheckScriptFailure([
25621966c248SBram Moolenaar      'vim9script',
25631966c248SBram Moolenaar      'syntax sync ccomment# comment',
25641966c248SBram Moolenaar      ], 'E404:')
25651966c248SBram Moolenaar
25661966c248SBram Moolenaar  CheckScriptSuccess([
25671966c248SBram Moolenaar      'vim9script',
25681966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
25691966c248SBram Moolenaar      ])
25701966c248SBram Moolenaar  CheckScriptFailure([
25711966c248SBram Moolenaar      'vim9script',
25721966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25731966c248SBram Moolenaar      ], 'E475:')
2574a72cfb80SBram Moolenaar
2575a72cfb80SBram Moolenaar  CheckScriptSuccess([
2576a72cfb80SBram Moolenaar      'vim9script',
2577a72cfb80SBram Moolenaar      'command Echo echo # comment',
2578a72cfb80SBram Moolenaar      'command Echo # comment',
25792d870f8dSBram Moolenaar      'delcommand Echo',
2580a72cfb80SBram Moolenaar      ])
2581a72cfb80SBram Moolenaar  CheckScriptFailure([
2582a72cfb80SBram Moolenaar      'vim9script',
2583a72cfb80SBram Moolenaar      'command Echo echo# comment',
2584a72cfb80SBram Moolenaar      'Echo',
2585f8103f27SBram Moolenaar      ], 'E1144:')
25862d870f8dSBram Moolenaar  delcommand Echo
258770249ee8SBram Moolenaar
258870249ee8SBram Moolenaar  var curdir = getcwd()
258970249ee8SBram Moolenaar  CheckScriptSuccess([
259070249ee8SBram Moolenaar      'command Echo cd " comment',
259170249ee8SBram Moolenaar      'Echo',
259270249ee8SBram Moolenaar      'delcommand Echo',
259370249ee8SBram Moolenaar      ])
259470249ee8SBram Moolenaar  CheckScriptSuccess([
2595090728adSBram Moolenaar      'vim9script',
259670249ee8SBram Moolenaar      'command Echo cd # comment',
259770249ee8SBram Moolenaar      'Echo',
259870249ee8SBram Moolenaar      'delcommand Echo',
259970249ee8SBram Moolenaar      ])
260070249ee8SBram Moolenaar  CheckScriptFailure([
260170249ee8SBram Moolenaar      'vim9script',
260270249ee8SBram Moolenaar      'command Echo cd " comment',
260370249ee8SBram Moolenaar      'Echo',
260470249ee8SBram Moolenaar      ], 'E344:')
260570249ee8SBram Moolenaar  delcommand Echo
260670249ee8SBram Moolenaar  chdir(curdir)
260770249ee8SBram Moolenaar
2608a72cfb80SBram Moolenaar  CheckScriptFailure([
2609a72cfb80SBram Moolenaar      'vim9script',
2610a72cfb80SBram Moolenaar      'command Echo# comment',
2611a72cfb80SBram Moolenaar      ], 'E182:')
2612a72cfb80SBram Moolenaar  CheckScriptFailure([
2613a72cfb80SBram Moolenaar      'vim9script',
2614a72cfb80SBram Moolenaar      'command Echo echo',
2615a72cfb80SBram Moolenaar      'command Echo# comment',
2616a72cfb80SBram Moolenaar      ], 'E182:')
26172d870f8dSBram Moolenaar  delcommand Echo
2618a72cfb80SBram Moolenaar
2619a72cfb80SBram Moolenaar  CheckScriptSuccess([
2620a72cfb80SBram Moolenaar      'vim9script',
2621a72cfb80SBram Moolenaar      'function # comment',
2622a72cfb80SBram Moolenaar      ])
2623a72cfb80SBram Moolenaar  CheckScriptFailure([
2624a72cfb80SBram Moolenaar      'vim9script',
26259898107fSBram Moolenaar      'function " comment',
26269898107fSBram Moolenaar      ], 'E129:')
26279898107fSBram Moolenaar  CheckScriptFailure([
26289898107fSBram Moolenaar      'vim9script',
2629a72cfb80SBram Moolenaar      'function# comment',
2630f8103f27SBram Moolenaar      ], 'E1144:')
2631a72cfb80SBram Moolenaar  CheckScriptSuccess([
2632a72cfb80SBram Moolenaar      'vim9script',
2633a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2634a72cfb80SBram Moolenaar      ])
2635a72cfb80SBram Moolenaar  CheckScriptFailure([
2636a72cfb80SBram Moolenaar      'vim9script',
2637a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2638a72cfb80SBram Moolenaar      ], 'E488:')
2639a72cfb80SBram Moolenaar
2640a72cfb80SBram Moolenaar  CheckScriptSuccess([
2641a72cfb80SBram Moolenaar      'vim9script',
26424c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2643a72cfb80SBram Moolenaar      'endfunc',
26444c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2645a72cfb80SBram Moolenaar      ])
2646a72cfb80SBram Moolenaar  CheckScriptFailure([
2647a72cfb80SBram Moolenaar      'vim9script',
26484c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2649a72cfb80SBram Moolenaar      'endfunc',
26504c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2651a72cfb80SBram Moolenaar      ], 'E488:')
2652a72cfb80SBram Moolenaar
2653a72cfb80SBram Moolenaar  CheckScriptSuccess([
2654a72cfb80SBram Moolenaar      'vim9script',
2655a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2656a72cfb80SBram Moolenaar      ])
2657a72cfb80SBram Moolenaar  CheckScriptFailure([
2658a72cfb80SBram Moolenaar      'vim9script',
2659a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2660a72cfb80SBram Moolenaar      ], 'E488:')
2661e7e4838fSBram Moolenaar
2662e7e4838fSBram Moolenaar  CheckScriptFailure([
2663e7e4838fSBram Moolenaar      'def Test() " comment',
2664e7e4838fSBram Moolenaar      'enddef',
2665e7e4838fSBram Moolenaar      ], 'E488:')
2666e7e4838fSBram Moolenaar  CheckScriptFailure([
2667e7e4838fSBram Moolenaar      'vim9script',
2668e7e4838fSBram Moolenaar      'def Test() " comment',
2669e7e4838fSBram Moolenaar      'enddef',
2670e7e4838fSBram Moolenaar      ], 'E488:')
2671e7e4838fSBram Moolenaar
2672e7e4838fSBram Moolenaar  CheckScriptSuccess([
2673e7e4838fSBram Moolenaar      'func Test() " comment',
2674e7e4838fSBram Moolenaar      'endfunc',
26752d870f8dSBram Moolenaar      'delfunc Test',
2676e7e4838fSBram Moolenaar      ])
26779898107fSBram Moolenaar  CheckScriptSuccess([
2678e7e4838fSBram Moolenaar      'vim9script',
2679e7e4838fSBram Moolenaar      'func Test() " comment',
2680e7e4838fSBram Moolenaar      'endfunc',
26819898107fSBram Moolenaar      ])
2682e7e4838fSBram Moolenaar
2683e7e4838fSBram Moolenaar  CheckScriptSuccess([
2684e7e4838fSBram Moolenaar      'def Test() # comment',
2685e7e4838fSBram Moolenaar      'enddef',
2686e7e4838fSBram Moolenaar      ])
2687e7e4838fSBram Moolenaar  CheckScriptFailure([
2688e7e4838fSBram Moolenaar      'func Test() # comment',
2689e7e4838fSBram Moolenaar      'endfunc',
2690e7e4838fSBram Moolenaar      ], 'E488:')
26912c5ed4e3SBram Moolenaarenddef
26922c5ed4e3SBram Moolenaar
26932c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
26942c5ed4e3SBram Moolenaar  CheckCanRunGui
26952c5ed4e3SBram Moolenaar
26962c5ed4e3SBram Moolenaar  CheckScriptFailure([
26972c5ed4e3SBram Moolenaar      'vim9script',
26982c5ed4e3SBram Moolenaar      'gui#comment'
2699f8103f27SBram Moolenaar      ], 'E1144:')
27002c5ed4e3SBram Moolenaar  CheckScriptFailure([
27012c5ed4e3SBram Moolenaar      'vim9script',
27022c5ed4e3SBram Moolenaar      'gui -f#comment'
27032c5ed4e3SBram Moolenaar      ], 'E499:')
27047a092245SBram Moolenaarenddef
27057a092245SBram Moolenaar
2706a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27076797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27086797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2709a26b9700SBram Moolenaar
2710a26b9700SBram Moolenaar  edit test.vim
2711a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2712a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2713a26b9700SBram Moolenaar
2714a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2715a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2716a26b9700SBram Moolenaar
2717a26b9700SBram Moolenaar  g:entered = 0
2718a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2719a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2720a26b9700SBram Moolenaar
2721a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2722a26b9700SBram Moolenaar
2723a26b9700SBram Moolenaar  au! TabEnter
2724a26b9700SBram Moolenaar  unlet g:entered
2725d72c1bf0SBram Moolenaar
2726d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2727d72c1bf0SBram Moolenaar      'vim9script',
27286797966dSBram Moolenaar      'g:var = 123',
2729e55b1c09SBram Moolenaar      'b:var = 456',
2730e55b1c09SBram Moolenaar      'w:var = 777',
2731e55b1c09SBram Moolenaar      't:var = 888',
2732d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2733d72c1bf0SBram Moolenaar      ])
2734d72c1bf0SBram Moolenaar
2735d72c1bf0SBram Moolenaar  CheckScriptFailure([
2736d72c1bf0SBram Moolenaar      'vim9script',
2737cfcd011fSBram Moolenaar      'let var = 123',
2738cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2739cfcd011fSBram Moolenaar
2740cfcd011fSBram Moolenaar  CheckScriptFailure([
2741cfcd011fSBram Moolenaar      'vim9script',
2742cfcd011fSBram Moolenaar      'var g:var = 123',
2743e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2744e55b1c09SBram Moolenaar
2745e55b1c09SBram Moolenaar  CheckScriptFailure([
2746e55b1c09SBram Moolenaar      'vim9script',
2747cfcd011fSBram Moolenaar      'var b:var = 123',
2748e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2749e55b1c09SBram Moolenaar
2750e55b1c09SBram Moolenaar  CheckScriptFailure([
2751e55b1c09SBram Moolenaar      'vim9script',
2752cfcd011fSBram Moolenaar      'var w:var = 123',
2753e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2754e55b1c09SBram Moolenaar
2755e55b1c09SBram Moolenaar  CheckScriptFailure([
2756e55b1c09SBram Moolenaar      'vim9script',
2757cfcd011fSBram Moolenaar      'var t:var = 123',
2758e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2759e55b1c09SBram Moolenaar
2760e55b1c09SBram Moolenaar  CheckScriptFailure([
2761e55b1c09SBram Moolenaar      'vim9script',
2762cfcd011fSBram Moolenaar      'var v:version = 123',
2763e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2764e55b1c09SBram Moolenaar
2765e55b1c09SBram Moolenaar  CheckScriptFailure([
2766e55b1c09SBram Moolenaar      'vim9script',
2767cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2768e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
27696797966dSBram Moolenaar
27706797966dSBram Moolenaar  CheckScriptFailure([
27716797966dSBram Moolenaar      'vim9script',
27726797966dSBram Moolenaar      'g:var = 123',
277332e35117SBram Moolenaar      'unlet g:var# comment1',
2774d72c1bf0SBram Moolenaar      ], 'E108:')
2775d72c1bf0SBram Moolenaar
2776d72c1bf0SBram Moolenaar  CheckScriptFailure([
2777d72c1bf0SBram Moolenaar      'let g:var = 123',
2778d72c1bf0SBram Moolenaar      'unlet g:var # something',
2779d72c1bf0SBram Moolenaar      ], 'E488:')
2780faac4104SBram Moolenaar
2781faac4104SBram Moolenaar  CheckScriptSuccess([
2782faac4104SBram Moolenaar      'vim9script',
278332e35117SBram Moolenaar      'if 1 # comment2',
2784faac4104SBram Moolenaar      '  echo "yes"',
2785faac4104SBram Moolenaar      'elseif 2 #comment',
2786faac4104SBram Moolenaar      '  echo "no"',
2787faac4104SBram Moolenaar      'endif',
2788faac4104SBram Moolenaar      ])
2789faac4104SBram Moolenaar
2790faac4104SBram Moolenaar  CheckScriptFailure([
2791faac4104SBram Moolenaar      'vim9script',
279232e35117SBram Moolenaar      'if 1# comment3',
2793faac4104SBram Moolenaar      '  echo "yes"',
2794faac4104SBram Moolenaar      'endif',
2795faac4104SBram Moolenaar      ], 'E15:')
2796faac4104SBram Moolenaar
2797faac4104SBram Moolenaar  CheckScriptFailure([
2798faac4104SBram Moolenaar      'vim9script',
279932e35117SBram Moolenaar      'if 0 # comment4',
2800faac4104SBram Moolenaar      '  echo "yes"',
2801faac4104SBram Moolenaar      'elseif 2#comment',
2802faac4104SBram Moolenaar      '  echo "no"',
2803faac4104SBram Moolenaar      'endif',
2804faac4104SBram Moolenaar      ], 'E15:')
2805faac4104SBram Moolenaar
2806faac4104SBram Moolenaar  CheckScriptSuccess([
2807faac4104SBram Moolenaar      'vim9script',
2808cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2809faac4104SBram Moolenaar      ])
2810faac4104SBram Moolenaar
2811faac4104SBram Moolenaar  CheckScriptFailure([
2812faac4104SBram Moolenaar      'vim9script',
2813cfcd011fSBram Moolenaar      'var v = 1# comment6',
281432e35117SBram Moolenaar      ], 'E15:')
2815faac4104SBram Moolenaar
2816faac4104SBram Moolenaar  CheckScriptSuccess([
2817faac4104SBram Moolenaar      'vim9script',
2818faac4104SBram Moolenaar      'new'
2819d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2820df069eecSBram Moolenaar      ':$',
2821faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2822faac4104SBram Moolenaar      'bwipe!',
2823faac4104SBram Moolenaar      ])
2824faac4104SBram Moolenaar
2825f5be8cdbSBram Moolenaar  CheckScriptFailure([
2826f5be8cdbSBram Moolenaar      'vim9script',
2827f5be8cdbSBram Moolenaar      'new'
2828d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2829f5be8cdbSBram Moolenaar      ':$',
2830f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2831f5be8cdbSBram Moolenaar      'bwipe!',
2832f5be8cdbSBram Moolenaar      ], 'E488:')
2833f5be8cdbSBram Moolenaar
2834f5be8cdbSBram Moolenaar  CheckScriptFailure([
2835f5be8cdbSBram Moolenaar      'vim9script',
2836f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2837f5be8cdbSBram Moolenaar      ], 'E477:')
2838a26b9700SBram Moolenaarenddef
2839a26b9700SBram Moolenaar
28407e5bd91dSBram Moolenaardef Test_finish()
2841cfcd011fSBram Moolenaar  var lines =<< trim END
28427e5bd91dSBram Moolenaar    vim9script
28436797966dSBram Moolenaar    g:res = 'one'
28447e5bd91dSBram Moolenaar    if v:false | finish | endif
28456797966dSBram Moolenaar    g:res = 'two'
28467e5bd91dSBram Moolenaar    finish
28476797966dSBram Moolenaar    g:res = 'three'
28487e5bd91dSBram Moolenaar  END
28497e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
28507e5bd91dSBram Moolenaar  source Xfinished
28517e5bd91dSBram Moolenaar  assert_equal('two', g:res)
28527e5bd91dSBram Moolenaar
28537e5bd91dSBram Moolenaar  unlet g:res
28547e5bd91dSBram Moolenaar  delete('Xfinished')
28557e5bd91dSBram Moolenaarenddef
28567e5bd91dSBram Moolenaar
2857a5d0077eSBram Moolenaardef Test_forward_declaration()
2858cfcd011fSBram Moolenaar  var lines =<< trim END
2859a5d0077eSBram Moolenaar    vim9script
2860a5d0077eSBram Moolenaar    def GetValue(): string
2861a5d0077eSBram Moolenaar      return theVal
2862a5d0077eSBram Moolenaar    enddef
2863cfcd011fSBram Moolenaar    var theVal = 'something'
2864822ba247SBram Moolenaar    g:initVal = GetValue()
2865a5d0077eSBram Moolenaar    theVal = 'else'
2866a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2867a5d0077eSBram Moolenaar  END
2868a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2869a5d0077eSBram Moolenaar  source Xforward
2870a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2871a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2872a5d0077eSBram Moolenaar
2873a5d0077eSBram Moolenaar  unlet g:initVal
2874a5d0077eSBram Moolenaar  unlet g:laterVal
2875a5d0077eSBram Moolenaar  delete('Xforward')
2876a5d0077eSBram Moolenaarenddef
2877a5d0077eSBram Moolenaar
28789721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2879a6294955SBram Moolenaar  var vim9_lines =<< trim END
2880a6294955SBram Moolenaar    vim9script
2881a6294955SBram Moolenaar    var local = 'local'
2882a6294955SBram Moolenaar    g:global = 'global'
2883a6294955SBram Moolenaar    export var exported = 'exported'
2884a6294955SBram Moolenaar    export def GetText(): string
2885a6294955SBram Moolenaar       return 'text'
2886a6294955SBram Moolenaar    enddef
2887a6294955SBram Moolenaar  END
2888a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
2889a6294955SBram Moolenaar
2890cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
28919721fb4eSBram Moolenaar    source Xvim9_script.vim
28929721fb4eSBram Moolenaar
28939721fb4eSBram Moolenaar    call assert_false(exists('local'))
28949721fb4eSBram Moolenaar    call assert_false(exists('exported'))
28959721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
28969721fb4eSBram Moolenaar    call assert_equal('global', global)
28979721fb4eSBram Moolenaar    call assert_equal('global', g:global)
28989721fb4eSBram Moolenaar
28999721fb4eSBram Moolenaar    " imported variable becomes script-local
29009721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29019721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29029721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29039721fb4eSBram Moolenaar
29049721fb4eSBram Moolenaar    " imported function becomes script-local
29059721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29069721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29079721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29089721fb4eSBram Moolenaar  END
29099721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29109721fb4eSBram Moolenaar
29119721fb4eSBram Moolenaar  source Xlegacy_script.vim
29129721fb4eSBram Moolenaar  assert_equal('global', g:global)
2913f5be8cdbSBram Moolenaar  unlet g:global
29149721fb4eSBram Moolenaar
29159721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29169721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29179721fb4eSBram Moolenaarenddef
2918a5d0077eSBram Moolenaar
29197d699701SBram Moolenaarfunc Test_vim9script_not_global()
29207d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
29217d699701SBram Moolenaar  let vim9lines =<< trim END
29227d699701SBram Moolenaar    vim9script
2923cfcd011fSBram Moolenaar    var name = 'local'
29247d699701SBram Moolenaar    func TheFunc()
29257d699701SBram Moolenaar      echo 'local'
29267d699701SBram Moolenaar    endfunc
29277d699701SBram Moolenaar    def DefFunc()
29287d699701SBram Moolenaar      echo 'local'
29297d699701SBram Moolenaar    enddef
29307d699701SBram Moolenaar  END
29317d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
29327d699701SBram Moolenaar  source Xvim9script.vim
29337d699701SBram Moolenaar  try
29347d699701SBram Moolenaar    echo g:var
29357d699701SBram Moolenaar    assert_report('did not fail')
29367d699701SBram Moolenaar  catch /E121:/
29377d699701SBram Moolenaar    " caught
29387d699701SBram Moolenaar  endtry
29397d699701SBram Moolenaar  try
29407d699701SBram Moolenaar    call TheFunc()
29417d699701SBram Moolenaar    assert_report('did not fail')
29427d699701SBram Moolenaar  catch /E117:/
29437d699701SBram Moolenaar    " caught
29447d699701SBram Moolenaar  endtry
29457d699701SBram Moolenaar  try
29467d699701SBram Moolenaar    call DefFunc()
29477d699701SBram Moolenaar    assert_report('did not fail')
29487d699701SBram Moolenaar  catch /E117:/
29497d699701SBram Moolenaar    " caught
29507d699701SBram Moolenaar  endtry
29517d699701SBram Moolenaar
295225859dd7SBram Moolenaar  call delete('Xvim9script.vim')
29537d699701SBram Moolenaarendfunc
29547d699701SBram Moolenaar
2955eeb27bfeSBram Moolenaardef Test_vim9_copen()
2956eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2957eeb27bfeSBram Moolenaar  copen
2958eeb27bfeSBram Moolenaar  quit
2959eeb27bfeSBram Moolenaarenddef
2960eeb27bfeSBram Moolenaar
296103290b84SBram Moolenaar" test using an auto-loaded function and variable
29622d6b20d6SBram Moolenaardef Test_vim9_autoload()
2963cfcd011fSBram Moolenaar  var lines =<< trim END
29642d6b20d6SBram Moolenaar     vim9script
296503290b84SBram Moolenaar     def some#gettest(): string
296603290b84SBram Moolenaar       return 'test'
296703290b84SBram Moolenaar     enddef
296803290b84SBram Moolenaar     g:some#name = 'name'
296903290b84SBram Moolenaar  END
297003290b84SBram Moolenaar
297103290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
297203290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
297303290b84SBram Moolenaar  var save_rtp = &rtp
297403290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
297503290b84SBram Moolenaar
297603290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
297703290b84SBram Moolenaar  assert_equal('name', g:some#name)
297803290b84SBram Moolenaar  g:some#other = 'other'
297903290b84SBram Moolenaar  assert_equal('other', g:some#other)
298003290b84SBram Moolenaar
298117f700acSBram Moolenaar  # upper case script name works
298217f700acSBram Moolenaar  lines =<< trim END
298317f700acSBram Moolenaar     vim9script
298417f700acSBram Moolenaar     def Other#getOther(): string
298517f700acSBram Moolenaar       return 'other'
298617f700acSBram Moolenaar     enddef
298717f700acSBram Moolenaar  END
298817f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
298917f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
299017f700acSBram Moolenaar
299103290b84SBram Moolenaar  delete('Xdir', 'rf')
299203290b84SBram Moolenaar  &rtp = save_rtp
299303290b84SBram Moolenaarenddef
299403290b84SBram Moolenaar
299503290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
299603290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
299703290b84SBram Moolenaar  var lines =<< trim END
299803290b84SBram Moolenaar     vim9script
29992d6b20d6SBram Moolenaar     def foo#test()
30002d6b20d6SBram Moolenaar         echomsg getreg('"')
30012d6b20d6SBram Moolenaar     enddef
30022d6b20d6SBram Moolenaar  END
30032d6b20d6SBram Moolenaar
30042d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
30052d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3006cfcd011fSBram Moolenaar  var save_rtp = &rtp
30072d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
30082d6b20d6SBram Moolenaar  augroup test
30092d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
30102d6b20d6SBram Moolenaar  augroup END
30112d6b20d6SBram Moolenaar
30122d6b20d6SBram Moolenaar  normal Y
30132d6b20d6SBram Moolenaar
30142d6b20d6SBram Moolenaar  augroup test
30152d6b20d6SBram Moolenaar    autocmd!
30162d6b20d6SBram Moolenaar  augroup END
30172d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
30182d6b20d6SBram Moolenaar  &rtp = save_rtp
30192d6b20d6SBram Moolenaarenddef
30202d6b20d6SBram Moolenaar
302177e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
302277e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3023cfcd011fSBram Moolenaar  var lines =<< trim END
302477e5dcc3SBram Moolenaar      vim9script
302577e5dcc3SBram Moolenaar      def crash#func()
302677e5dcc3SBram Moolenaar          try
302777e5dcc3SBram Moolenaar              for x in List()
302877e5dcc3SBram Moolenaar              endfor
302977e5dcc3SBram Moolenaar          catch
303077e5dcc3SBram Moolenaar          endtry
303177e5dcc3SBram Moolenaar          g:ok = true
303277e5dcc3SBram Moolenaar      enddef
303377e5dcc3SBram Moolenaar      fu List()
303477e5dcc3SBram Moolenaar          invalid
303577e5dcc3SBram Moolenaar      endfu
303677e5dcc3SBram Moolenaar      try
303748e11c10SBram Moolenaar          alsoinvalid
303877e5dcc3SBram Moolenaar      catch /wontmatch/
303977e5dcc3SBram Moolenaar      endtry
304077e5dcc3SBram Moolenaar  END
304177e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
304277e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
304377e5dcc3SBram Moolenaar
304477e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
304577e5dcc3SBram Moolenaar  lines =<< trim END
304677e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
304777e5dcc3SBram Moolenaar    call crash#func()
304877e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
30499c4f5520SBram Moolenaar    qall!
305077e5dcc3SBram Moolenaar  END
305177e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
305277e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
305377e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
305477e5dcc3SBram Moolenaar
305577e5dcc3SBram Moolenaar  delete('Xdidit')
305677e5dcc3SBram Moolenaar  delete('Xscript')
305777e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
305803290b84SBram Moolenaar
305903290b84SBram Moolenaar  lines =<< trim END
306003290b84SBram Moolenaar    vim9script
306103290b84SBram Moolenaar    var foo#bar = 'asdf'
306203290b84SBram Moolenaar  END
306303290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
306477e5dcc3SBram Moolenaarenddef
306577e5dcc3SBram Moolenaar
306681e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
306781e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
306881e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3069cfcd011fSBram Moolenaar  var lines =<< trim END
307081e17fbeSBram Moolenaar    let s:counter = 1
307181e17fbeSBram Moolenaar    def s:Func()
307281e17fbeSBram Moolenaar      au! CursorHold
307381e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
307481e17fbeSBram Moolenaar    enddef
307581e17fbeSBram Moolenaar    call s:Func()
307681e17fbeSBram Moolenaar    doau CursorHold
307781e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
307881e17fbeSBram Moolenaar    au! CursorHold
307981e17fbeSBram Moolenaar  END
308081e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
308181e17fbeSBram Moolenaarenddef
308281e17fbeSBram Moolenaar
30833896a105SBram Moolenaardef Test_cmdline_win()
30843896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
30853896a105SBram Moolenaar  # the command line window.
30863896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3087cfcd011fSBram Moolenaar  var export_lines =<< trim END
30883896a105SBram Moolenaar    vim9script
3089cfcd011fSBram Moolenaar    export var That = 'yes'
30903896a105SBram Moolenaar  END
30913896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3092cfcd011fSBram Moolenaar  var import_lines =<< trim END
30933896a105SBram Moolenaar    vim9script
30943896a105SBram Moolenaar    import That from './Xexport.vim'
30953896a105SBram Moolenaar  END
30963896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3097cfcd011fSBram Moolenaar  var save_rtp = &rtp
30983896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
30993896a105SBram Moolenaar  syntax on
31003896a105SBram Moolenaar  augroup CmdWin
31013896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
31023896a105SBram Moolenaar  augroup END
31033896a105SBram Moolenaar  # this will open and also close the cmdline window
31043896a105SBram Moolenaar  feedkeys('q:', 'xt')
31053896a105SBram Moolenaar  assert_equal('yes', g:got_there)
31063896a105SBram Moolenaar
31073896a105SBram Moolenaar  augroup CmdWin
31083896a105SBram Moolenaar    au!
31093896a105SBram Moolenaar  augroup END
31103896a105SBram Moolenaar  &rtp = save_rtp
31113896a105SBram Moolenaar  delete('rtp', 'rf')
31123896a105SBram Moolenaarenddef
31133896a105SBram Moolenaar
3114e3d4685fSBram Moolenaardef Test_invalid_sid()
3115e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
311625859dd7SBram Moolenaar
31179c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3118d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3119e3d4685fSBram Moolenaar  endif
3120e3d4685fSBram Moolenaar  delete('Xdidit')
3121e3d4685fSBram Moolenaarenddef
3122e3d4685fSBram Moolenaar
31239ec7026fSBram Moolenaardef Test_restoring_cpo()
31249ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
31259ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
31269ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
31279ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
31289ec7026fSBram Moolenaar  endif
31299ec7026fSBram Moolenaar  delete('Xsourced')
31309ec7026fSBram Moolenaar  delete('Xclose')
3131090728adSBram Moolenaar  delete('Xdone')
31329ec7026fSBram Moolenaarenddef
31339ec7026fSBram Moolenaar
31349ec7026fSBram Moolenaar
3135f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3136cfcd011fSBram Moolenaar  var lines =<< trim END
3137cfcd011fSBram Moolenaar    var name: any
3138cfcd011fSBram Moolenaar    assert_equal(0, name)
3139f0afd9e1SBram Moolenaar  END
3140f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3141f0afd9e1SBram Moolenaarenddef
3142f0afd9e1SBram Moolenaar
31437e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
314458dbef33SBram Moolenaar  CheckRunVimInTerminal
314558dbef33SBram Moolenaar
31467e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
31477e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
31487e9210eaSBram Moolenaarendfunc
31497e9210eaSBram Moolenaar
31507e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
31519c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3152cfcd011fSBram Moolenaar  var lines =<< trim END
31539c4f5520SBram Moolenaar    func CheckAndQuit()
31549c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
31559c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
31569c4f5520SBram Moolenaar    endfunc
31579c4f5520SBram Moolenaar  END
31589c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
31599c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3160e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
31619c4f5520SBram Moolenaar  # define Afunc() on the command line
31629c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
31639c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
31642949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
31659c4f5520SBram Moolenaar
31669c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
31679c4f5520SBram Moolenaar  delete('XcallFunc')
31689c4f5520SBram Moolenaar  delete('Xdidcmd')
31699c4f5520SBram Moolenaarenddef
31709c4f5520SBram Moolenaar
3171fcdc5d83SBram Moolenaardef Test_script_var_scope()
3172fcdc5d83SBram Moolenaar  var lines =<< trim END
3173fcdc5d83SBram Moolenaar      vim9script
3174fcdc5d83SBram Moolenaar      if true
3175fcdc5d83SBram Moolenaar        if true
3176fcdc5d83SBram Moolenaar          var one = 'one'
3177fcdc5d83SBram Moolenaar          echo one
3178fcdc5d83SBram Moolenaar        endif
3179fcdc5d83SBram Moolenaar        echo one
3180fcdc5d83SBram Moolenaar      endif
3181fcdc5d83SBram Moolenaar  END
3182fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3183fcdc5d83SBram Moolenaar
3184fcdc5d83SBram Moolenaar  lines =<< trim END
3185fcdc5d83SBram Moolenaar      vim9script
3186fcdc5d83SBram Moolenaar      if true
3187fcdc5d83SBram Moolenaar        if false
3188fcdc5d83SBram Moolenaar          var one = 'one'
3189fcdc5d83SBram Moolenaar          echo one
3190fcdc5d83SBram Moolenaar        else
3191fcdc5d83SBram Moolenaar          var one = 'one'
3192fcdc5d83SBram Moolenaar          echo one
3193fcdc5d83SBram Moolenaar        endif
3194fcdc5d83SBram Moolenaar        echo one
3195fcdc5d83SBram Moolenaar      endif
3196fcdc5d83SBram Moolenaar  END
3197fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3198fcdc5d83SBram Moolenaar
3199fcdc5d83SBram Moolenaar  lines =<< trim END
3200fcdc5d83SBram Moolenaar      vim9script
3201fcdc5d83SBram Moolenaar      while true
3202fcdc5d83SBram Moolenaar        var one = 'one'
3203fcdc5d83SBram Moolenaar        echo one
3204fcdc5d83SBram Moolenaar        break
3205fcdc5d83SBram Moolenaar      endwhile
3206fcdc5d83SBram Moolenaar      echo one
3207fcdc5d83SBram Moolenaar  END
3208fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3209fcdc5d83SBram Moolenaar
3210fcdc5d83SBram Moolenaar  lines =<< trim END
3211fcdc5d83SBram Moolenaar      vim9script
3212fcdc5d83SBram Moolenaar      for i in range(1)
3213fcdc5d83SBram Moolenaar        var one = 'one'
3214fcdc5d83SBram Moolenaar        echo one
3215fcdc5d83SBram Moolenaar      endfor
3216fcdc5d83SBram Moolenaar      echo one
3217fcdc5d83SBram Moolenaar  END
3218fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
32199becdf2bSBram Moolenaar
32209becdf2bSBram Moolenaar  lines =<< trim END
32219becdf2bSBram Moolenaar      vim9script
32229becdf2bSBram Moolenaar      {
32239becdf2bSBram Moolenaar        var one = 'one'
32249becdf2bSBram Moolenaar        assert_equal('one', one)
32259becdf2bSBram Moolenaar      }
32269becdf2bSBram Moolenaar      assert_false(exists('one'))
32279becdf2bSBram Moolenaar      assert_false(exists('s:one'))
32289becdf2bSBram Moolenaar  END
32299becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
32309becdf2bSBram Moolenaar
32319becdf2bSBram Moolenaar  lines =<< trim END
32329becdf2bSBram Moolenaar      vim9script
32339becdf2bSBram Moolenaar      {
32349becdf2bSBram Moolenaar        var one = 'one'
32359becdf2bSBram Moolenaar        echo one
32369becdf2bSBram Moolenaar      }
32379becdf2bSBram Moolenaar      echo one
32389becdf2bSBram Moolenaar  END
32399becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3240fcdc5d83SBram Moolenaarenddef
3241fcdc5d83SBram Moolenaar
3242352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3243352134bbSBram Moolenaar  var lines =<< trim END
3244352134bbSBram Moolenaar    vim9script
3245352134bbSBram Moolenaar    def Callback(...l: any)
3246352134bbSBram Moolenaar      try
3247352134bbSBram Moolenaar        var x: string
3248352134bbSBram Moolenaar        var y: string
3249352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3250352134bbSBram Moolenaar        [x, y] = ['']
3251352134bbSBram Moolenaar      catch
3252352134bbSBram Moolenaar        g:caught = 'yes'
3253352134bbSBram Moolenaar      endtry
3254352134bbSBram Moolenaar    enddef
3255e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3256352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3257352134bbSBram Moolenaar  END
3258352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3259352134bbSBram Moolenaar
3260352134bbSBram Moolenaar  unlet g:caught
3261352134bbSBram Moolenaarenddef
3262352134bbSBram Moolenaar
3263631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3264631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3265631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3266631e8f93SBram Moolenaar  endif
3267631e8f93SBram Moolenaar  var lines =<< trim END
3268631e8f93SBram Moolenaar      vim9script
3269631e8f93SBram Moolenaar      var source: list<number>
3270631e8f93SBram Moolenaar      def Out_cb(...l: any)
3271631e8f93SBram Moolenaar          eval [][0]
3272631e8f93SBram Moolenaar      enddef
3273631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3274631e8f93SBram Moolenaar          sleep 1m
3275631e8f93SBram Moolenaar          source += l
3276631e8f93SBram Moolenaar      enddef
3277e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
32786f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
32796f17a3f0SBram Moolenaar        sleep 10m
32806f17a3f0SBram Moolenaar      endwhile
32816f17a3f0SBram Moolenaar      sleep 10m
3282631e8f93SBram Moolenaar  END
3283631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3284631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3285631e8f93SBram Moolenaar  delete('Xdef')
3286631e8f93SBram Moolenaarenddef
3287631e8f93SBram Moolenaar
32884324d87aSBram Moolenaardef InvokeNormal()
32894324d87aSBram Moolenaar  exe "norm! :m+1\r"
32904324d87aSBram Moolenaarenddef
32914324d87aSBram Moolenaar
32924324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
32934324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
32944324d87aSBram Moolenaar  new
32954324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
32964324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
32974324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
32984324d87aSBram Moolenaar  xunmap <F3>
3299b5b9480eSBram Moolenaarenddef
3300b5b9480eSBram Moolenaar
3301b5b9480eSBram Moolenaardef Test_white_space_after_command()
3302b5b9480eSBram Moolenaar  var lines =<< trim END
3303b5b9480eSBram Moolenaar    exit_cb: Func})
3304b5b9480eSBram Moolenaar  END
3305b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3306f8103f27SBram Moolenaar
3307f8103f27SBram Moolenaar  lines =<< trim END
3308f8103f27SBram Moolenaar    e#
3309f8103f27SBram Moolenaar  END
3310f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
33114324d87aSBram Moolenaarenddef
33124324d87aSBram Moolenaar
33134aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
33144aab88d9SBram Moolenaar  var lines =<< trim END
33154aab88d9SBram Moolenaar      vim9script
33164aab88d9SBram Moolenaar      if exists('g:guard')
33174aab88d9SBram Moolenaar        finish
33184aab88d9SBram Moolenaar      endif
33194aab88d9SBram Moolenaar      g:guard = 1
33204aab88d9SBram Moolenaar      var name = 'thename'
33214aab88d9SBram Moolenaar      def g:GetName(): string
33224aab88d9SBram Moolenaar        return name
33234aab88d9SBram Moolenaar      enddef
33244aab88d9SBram Moolenaar      def g:SetName(arg: string)
33254aab88d9SBram Moolenaar        name = arg
33264aab88d9SBram Moolenaar      enddef
33274aab88d9SBram Moolenaar  END
33284aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
33294aab88d9SBram Moolenaar  so XscriptTwice.vim
33304aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
33314aab88d9SBram Moolenaar  g:SetName('newname')
33324aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
33334aab88d9SBram Moolenaar  so XscriptTwice.vim
33344aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
33354aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
33364aab88d9SBram Moolenaar
33374aab88d9SBram Moolenaar  delfunc g:GetName
33384aab88d9SBram Moolenaar  delfunc g:SetName
33394aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
33404aab88d9SBram Moolenaar  unlet g:guard
33414aab88d9SBram Moolenaarenddef
33424aab88d9SBram Moolenaar
33434aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
33444aab88d9SBram Moolenaar  var exportlines =<< trim END
33454aab88d9SBram Moolenaar      vim9script
33464aab88d9SBram Moolenaar      if exists('g:guard')
33474aab88d9SBram Moolenaar        finish
33484aab88d9SBram Moolenaar      endif
33494aab88d9SBram Moolenaar      g:guard = 1
33504aab88d9SBram Moolenaar      export var name = 'someName'
33514aab88d9SBram Moolenaar  END
33524aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
33534aab88d9SBram Moolenaar
33544aab88d9SBram Moolenaar  var lines =<< trim END
33554aab88d9SBram Moolenaar      vim9script
33564aab88d9SBram Moolenaar      import name from './XexportScript.vim'
33574aab88d9SBram Moolenaar      def g:GetName(): string
33584aab88d9SBram Moolenaar        return name
33594aab88d9SBram Moolenaar      enddef
33604aab88d9SBram Moolenaar  END
33614aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
33624aab88d9SBram Moolenaar  so XscriptImport.vim
33634aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
33644aab88d9SBram Moolenaar
33654aab88d9SBram Moolenaar  so XexportScript.vim
33664aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
33674aab88d9SBram Moolenaar
33684aab88d9SBram Moolenaar  delfunc g:GetName
33694aab88d9SBram Moolenaar  delete('XexportScript.vim')
33704aab88d9SBram Moolenaar  delete('XscriptImport.vim')
33714aab88d9SBram Moolenaar  unlet g:guard
33724aab88d9SBram Moolenaarenddef
33734aab88d9SBram Moolenaar
3374585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3375585fea7bSBram Moolenaardef Test_substitute_cmd()
3376585fea7bSBram Moolenaar  new
3377585fea7bSBram Moolenaar  setline(1, 'something')
3378585fea7bSBram Moolenaar  :substitute(some(other(
3379585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3380585fea7bSBram Moolenaar  bwipe!
3381585fea7bSBram Moolenaar
3382f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3383cfcd011fSBram Moolenaar  var lines =<< trim END
3384585fea7bSBram Moolenaar    vim9script
3385585fea7bSBram Moolenaar    new
3386585fea7bSBram Moolenaar    setline(1, 'something')
3387585fea7bSBram Moolenaar    :substitute(some(other(
3388585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3389585fea7bSBram Moolenaar    bwipe!
3390585fea7bSBram Moolenaar  END
3391585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3392585fea7bSBram Moolenaar  source Xvim9lines
3393585fea7bSBram Moolenaar
3394585fea7bSBram Moolenaar  delete('Xvim9lines')
3395585fea7bSBram Moolenaarenddef
3396585fea7bSBram Moolenaar
33978a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3398