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
4532e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4542e5910bfSBram Moolenaar  catch /E1105:/
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)
8184bce26bbSBram Moolenaar
8194bce26bbSBram Moolenaar  lines =<< trim END
8204bce26bbSBram Moolenaar    [{
8214bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
8224bce26bbSBram Moolenaar  END
8234bce26bbSBram 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:')
1744ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1745d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
17466628b7ebSBram Moolenaar
17476628b7ebSBram Moolenaar  var lines =<< trim END
17486628b7ebSBram Moolenaar      var s = ''
17496628b7ebSBram Moolenaar      if s = ''
17506628b7ebSBram Moolenaar      endif
17516628b7ebSBram Moolenaar  END
17526628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
17536628b7ebSBram Moolenaar
17546628b7ebSBram Moolenaar  lines =<< trim END
17556628b7ebSBram Moolenaar      var s = ''
17566628b7ebSBram Moolenaar      if s == ''
17576628b7ebSBram Moolenaar      elseif s = ''
17586628b7ebSBram Moolenaar      endif
17596628b7ebSBram Moolenaar  END
17606628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1761e8c4abbbSBram Moolenaarenddef
1762e8c4abbbSBram Moolenaar
17636d69bf60SBram Moolenaarlet g:bool_true = v:true
17646d69bf60SBram Moolenaarlet g:bool_false = v:false
17656d69bf60SBram Moolenaar
17666d69bf60SBram Moolenaardef Test_if_const_expr()
1767cfcd011fSBram Moolenaar  var res = false
17686d69bf60SBram Moolenaar  if true ? true : false
17696d69bf60SBram Moolenaar    res = true
17706d69bf60SBram Moolenaar  endif
17716d69bf60SBram Moolenaar  assert_equal(true, res)
17726d69bf60SBram Moolenaar
1773585fea7bSBram Moolenaar  g:glob = 2
1774585fea7bSBram Moolenaar  if false
17756797966dSBram Moolenaar    execute('g:glob = 3')
1776585fea7bSBram Moolenaar  endif
1777585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1778585fea7bSBram Moolenaar  if true
17796797966dSBram Moolenaar    execute('g:glob = 3')
1780585fea7bSBram Moolenaar  endif
1781585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1782585fea7bSBram Moolenaar
17836d69bf60SBram Moolenaar  res = false
17846d69bf60SBram Moolenaar  if g:bool_true ? true : false
17856d69bf60SBram Moolenaar    res = true
17866d69bf60SBram Moolenaar  endif
17876d69bf60SBram Moolenaar  assert_equal(true, res)
17886d69bf60SBram Moolenaar
17896d69bf60SBram Moolenaar  res = false
17906d69bf60SBram Moolenaar  if true ? g:bool_true : false
17916d69bf60SBram Moolenaar    res = true
17926d69bf60SBram Moolenaar  endif
17936d69bf60SBram Moolenaar  assert_equal(true, res)
17946d69bf60SBram Moolenaar
17956d69bf60SBram Moolenaar  res = false
17966d69bf60SBram Moolenaar  if true ? true : g:bool_false
17976d69bf60SBram Moolenaar    res = true
17986d69bf60SBram Moolenaar  endif
17996d69bf60SBram Moolenaar  assert_equal(true, res)
18006d69bf60SBram Moolenaar
18016d69bf60SBram Moolenaar  res = false
18026d69bf60SBram Moolenaar  if true ? false : true
18036d69bf60SBram Moolenaar    res = true
18046d69bf60SBram Moolenaar  endif
18056d69bf60SBram Moolenaar  assert_equal(false, res)
18066d69bf60SBram Moolenaar
18076d69bf60SBram Moolenaar  res = false
18086d69bf60SBram Moolenaar  if false ? false : true
18096d69bf60SBram Moolenaar    res = true
18106d69bf60SBram Moolenaar  endif
18116d69bf60SBram Moolenaar  assert_equal(true, res)
18126d69bf60SBram Moolenaar
18136d69bf60SBram Moolenaar  res = false
18146d69bf60SBram Moolenaar  if false ? true : false
18156d69bf60SBram Moolenaar    res = true
18166d69bf60SBram Moolenaar  endif
18176d69bf60SBram Moolenaar  assert_equal(false, res)
18186d69bf60SBram Moolenaar
18196d69bf60SBram Moolenaar  res = false
1820e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1821e8c4abbbSBram Moolenaar    res = true
1822e8c4abbbSBram Moolenaar  endif
1823e8c4abbbSBram Moolenaar  assert_equal(false, res)
1824e8c4abbbSBram Moolenaar
1825e8c4abbbSBram Moolenaar  res = false
18266d69bf60SBram Moolenaar  if true && true
18276d69bf60SBram Moolenaar    res = true
18286d69bf60SBram Moolenaar  endif
18296d69bf60SBram Moolenaar  assert_equal(true, res)
18306d69bf60SBram Moolenaar
18316d69bf60SBram Moolenaar  res = false
18326d69bf60SBram Moolenaar  if true && false
18336d69bf60SBram Moolenaar    res = true
18346d69bf60SBram Moolenaar  endif
18356d69bf60SBram Moolenaar  assert_equal(false, res)
18366d69bf60SBram Moolenaar
18376d69bf60SBram Moolenaar  res = false
18386d69bf60SBram Moolenaar  if g:bool_true && false
18396d69bf60SBram Moolenaar    res = true
18406d69bf60SBram Moolenaar  endif
18416d69bf60SBram Moolenaar  assert_equal(false, res)
18426d69bf60SBram Moolenaar
18436d69bf60SBram Moolenaar  res = false
18446d69bf60SBram Moolenaar  if true && g:bool_false
18456d69bf60SBram Moolenaar    res = true
18466d69bf60SBram Moolenaar  endif
18476d69bf60SBram Moolenaar  assert_equal(false, res)
18486d69bf60SBram Moolenaar
18496d69bf60SBram Moolenaar  res = false
18506d69bf60SBram Moolenaar  if false && false
18516d69bf60SBram Moolenaar    res = true
18526d69bf60SBram Moolenaar  endif
18536d69bf60SBram Moolenaar  assert_equal(false, res)
18546d69bf60SBram Moolenaar
18556d69bf60SBram Moolenaar  res = false
18566d69bf60SBram Moolenaar  if true || false
18576d69bf60SBram Moolenaar    res = true
18586d69bf60SBram Moolenaar  endif
18596d69bf60SBram Moolenaar  assert_equal(true, res)
18606d69bf60SBram Moolenaar
18616d69bf60SBram Moolenaar  res = false
18626d69bf60SBram Moolenaar  if g:bool_true || false
18636d69bf60SBram Moolenaar    res = true
18646d69bf60SBram Moolenaar  endif
18656d69bf60SBram Moolenaar  assert_equal(true, res)
18666d69bf60SBram Moolenaar
18676d69bf60SBram Moolenaar  res = false
18686d69bf60SBram Moolenaar  if true || g:bool_false
18696d69bf60SBram Moolenaar    res = true
18706d69bf60SBram Moolenaar  endif
18716d69bf60SBram Moolenaar  assert_equal(true, res)
18726d69bf60SBram Moolenaar
18736d69bf60SBram Moolenaar  res = false
18746d69bf60SBram Moolenaar  if false || false
18756d69bf60SBram Moolenaar    res = true
18766d69bf60SBram Moolenaar  endif
18776d69bf60SBram Moolenaar  assert_equal(false, res)
18783988f64fSBram Moolenaar
18793988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
18803988f64fSBram Moolenaar  if false | eval 0 | endif
18813988f64fSBram Moolenaar  if false | eval burp + 234 | endif
18823988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
18833988f64fSBram Moolenaar  if false
18843988f64fSBram Moolenaar    burp
18853988f64fSBram Moolenaar  endif
188680c34ca3SBram Moolenaarenddef
18876d69bf60SBram Moolenaar
188880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1889d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1890d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1891d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1892d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
18936d69bf60SBram Moolenaarenddef
18946d69bf60SBram Moolenaar
189572abcf42SBram Moolenaardef RunNested(i: number): number
1896cfcd011fSBram Moolenaar  var x: number = 0
189772abcf42SBram Moolenaar  if i % 2
189872abcf42SBram Moolenaar    if 1
1899f5be8cdbSBram Moolenaar      # comment
190072abcf42SBram Moolenaar    else
1901f5be8cdbSBram Moolenaar      # comment
190272abcf42SBram Moolenaar    endif
190372abcf42SBram Moolenaar    x += 1
190472abcf42SBram Moolenaar  else
190572abcf42SBram Moolenaar    x += 1000
190672abcf42SBram Moolenaar  endif
190772abcf42SBram Moolenaar  return x
190872abcf42SBram Moolenaarenddef
190972abcf42SBram Moolenaar
191072abcf42SBram Moolenaardef Test_nested_if()
191172abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
191272abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
191372abcf42SBram Moolenaarenddef
191472abcf42SBram Moolenaar
1915ad39c094SBram Moolenaardef Test_execute_cmd()
1916e4984290SBram Moolenaar  # missing argument is ignored
1917e4984290SBram Moolenaar  execute
1918e4984290SBram Moolenaar  execute # comment
1919e4984290SBram Moolenaar
1920ad39c094SBram Moolenaar  new
1921ad39c094SBram Moolenaar  setline(1, 'default')
1922d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1923ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1924a72cfb80SBram Moolenaar
1925d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1926a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1927a72cfb80SBram Moolenaar
1928cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1929cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1930a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1931ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1932a72cfb80SBram Moolenaar
1933d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1934ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1935a72cfb80SBram Moolenaar
1936cfcd011fSBram Moolenaar  var cmd_first = 'call '
1937cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1938ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1939ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1940ad39c094SBram Moolenaar  bwipe!
1941585fea7bSBram Moolenaar
1942cfcd011fSBram Moolenaar  var n = true
19432d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
19442d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
19452d6b20d6SBram Moolenaar
1946e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1947e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1948e5abf7afSBram Moolenaar
1949d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1950d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1951d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1952ad39c094SBram Moolenaarenddef
1953ad39c094SBram Moolenaar
195447e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1955f5be8cdbSBram Moolenaar  # only checks line continuation
1956cfcd011fSBram Moolenaar  var lines =<< trim END
195747e880d6SBram Moolenaar      vim9script
195847e880d6SBram Moolenaar      execute 'g:someVar'
195947e880d6SBram Moolenaar                .. ' = ' ..
196047e880d6SBram Moolenaar                   '28'
196147e880d6SBram Moolenaar      assert_equal(28, g:someVar)
196247e880d6SBram Moolenaar      unlet g:someVar
196347e880d6SBram Moolenaar  END
196447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
196547e880d6SBram Moolenaarenddef
196647e880d6SBram Moolenaar
1967ad39c094SBram Moolenaardef Test_echo_cmd()
1968a72cfb80SBram Moolenaar  echo 'some' # comment
1969585fea7bSBram Moolenaar  echon 'thing'
1970ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1971ad39c094SBram Moolenaar
1972a72cfb80SBram Moolenaar  echo "some" # comment
1973a72cfb80SBram Moolenaar  echon "thing"
1974a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1975a72cfb80SBram Moolenaar
1976cfcd011fSBram Moolenaar  var str1 = 'some'
1977cfcd011fSBram Moolenaar  var str2 = 'more'
1978ad39c094SBram Moolenaar  echo str1 str2
1979ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1980a72cfb80SBram Moolenaar
1981d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1982ad39c094SBram Moolenaarenddef
1983ad39c094SBram Moolenaar
1984f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1985f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1986f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1987f93c7feaSBram Moolenaar  echo 'clear'
1988df069eecSBram Moolenaar  :1messages
1989f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1990f93c7feaSBram Moolenaar
1991d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1992f93c7feaSBram Moolenaarenddef
1993f93c7feaSBram Moolenaar
199447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1995f5be8cdbSBram Moolenaar  # only checks line continuation
1996cfcd011fSBram Moolenaar  var lines =<< trim END
199747e880d6SBram Moolenaar      vim9script
199847e880d6SBram Moolenaar      echomsg 'here'
199947e880d6SBram Moolenaar                .. ' is ' ..
200047e880d6SBram Moolenaar                   'a message'
200147e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
200247e880d6SBram Moolenaar  END
200347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
200447e880d6SBram Moolenaarenddef
200547e880d6SBram Moolenaar
2006f93c7feaSBram Moolenaardef Test_echoerr_cmd()
200740ee466cSBram Moolenaar  try
200840ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
200940ee466cSBram Moolenaar  catch
201040ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
201140ee466cSBram Moolenaar  endtry
2012f93c7feaSBram Moolenaarenddef
2013f93c7feaSBram Moolenaar
201447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2015f5be8cdbSBram Moolenaar  # only checks line continuation
2016cfcd011fSBram Moolenaar  var lines =<< trim END
201747e880d6SBram Moolenaar      vim9script
201847e880d6SBram Moolenaar      try
201947e880d6SBram Moolenaar        echoerr 'this'
202047e880d6SBram Moolenaar                .. ' is ' ..
202147e880d6SBram Moolenaar                   'wrong'
202247e880d6SBram Moolenaar      catch
202347e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
202447e880d6SBram Moolenaar      endtry
202547e880d6SBram Moolenaar  END
202647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
202747e880d6SBram Moolenaarenddef
202847e880d6SBram Moolenaar
202941fe0617SBram Moolenaardef Test_for_outside_of_function()
2030cfcd011fSBram Moolenaar  var lines =<< trim END
203141fe0617SBram Moolenaar    vim9script
203241fe0617SBram Moolenaar    new
203341fe0617SBram Moolenaar    for var in range(0, 3)
203441fe0617SBram Moolenaar      append(line('$'), var)
203541fe0617SBram Moolenaar    endfor
203641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
203741fe0617SBram Moolenaar    bwipe!
203841fe0617SBram Moolenaar  END
203941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
204041fe0617SBram Moolenaar  source Xvim9for.vim
204141fe0617SBram Moolenaar  delete('Xvim9for.vim')
204241fe0617SBram Moolenaarenddef
20438a7d6542SBram Moolenaar
2044e8c4abbbSBram Moolenaardef Test_for_loop()
2045cfcd011fSBram Moolenaar  var result = ''
2046e8c4abbbSBram Moolenaar  for cnt in range(7)
2047e8c4abbbSBram Moolenaar    if cnt == 4
2048e8c4abbbSBram Moolenaar      break
2049e8c4abbbSBram Moolenaar    endif
2050e8c4abbbSBram Moolenaar    if cnt == 2
2051e8c4abbbSBram Moolenaar      continue
2052e8c4abbbSBram Moolenaar    endif
2053e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2054e8c4abbbSBram Moolenaar  endfor
2055e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
20560ad3e894SBram Moolenaar
2057cfcd011fSBram Moolenaar  var concat = ''
20580ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
20590ad3e894SBram Moolenaar    concat ..= str
20600ad3e894SBram Moolenaar  endfor
20610ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
206238bd8de5SBram Moolenaar
206338bd8de5SBram Moolenaar  var total = 0
206438bd8de5SBram Moolenaar  for nr in
206538bd8de5SBram Moolenaar      [1, 2, 3]
206638bd8de5SBram Moolenaar    total += nr
206738bd8de5SBram Moolenaar  endfor
206838bd8de5SBram Moolenaar  assert_equal(6, total)
206938bd8de5SBram Moolenaar
207038bd8de5SBram Moolenaar  total = 0
207138bd8de5SBram Moolenaar  for nr
207238bd8de5SBram Moolenaar    in [1, 2, 3]
207338bd8de5SBram Moolenaar    total += nr
207438bd8de5SBram Moolenaar  endfor
207538bd8de5SBram Moolenaar  assert_equal(6, total)
207638bd8de5SBram Moolenaar
207738bd8de5SBram Moolenaar  total = 0
207838bd8de5SBram Moolenaar  for nr
207938bd8de5SBram Moolenaar    in
208038bd8de5SBram Moolenaar    [1, 2, 3]
208138bd8de5SBram Moolenaar    total += nr
208238bd8de5SBram Moolenaar  endfor
208338bd8de5SBram Moolenaar  assert_equal(6, total)
2084036d0714SBram Moolenaar
2085036d0714SBram Moolenaar  var res = ""
2086036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2087036d0714SBram Moolenaar    res ..= n .. s
2088036d0714SBram Moolenaar  endfor
2089036d0714SBram Moolenaar  assert_equal('1a2b', res)
2090e8c4abbbSBram Moolenaarenddef
2091e8c4abbbSBram Moolenaar
2092e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2093025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2094025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2095025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2096675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2097675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2098cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2099822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21002d870f8dSBram Moolenaar  delfunc! g:Func
2101451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2102675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2103675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2104675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2105e8c4abbbSBram Moolenaarenddef
2106e8c4abbbSBram Moolenaar
2107ea87069dSBram Moolenaardef Test_for_loop_script_var()
2108ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2109ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2110ea87069dSBram Moolenaar
2111ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2112ea87069dSBram Moolenaar  var lines =<< trim END
2113ea87069dSBram Moolenaar    vim9script
2114ea87069dSBram Moolenaar    var total = 0
2115ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2116ea87069dSBram Moolenaar      total += s:var
2117ea87069dSBram Moolenaar    endfor
2118ea87069dSBram Moolenaar    assert_equal(6, total)
2119ea87069dSBram Moolenaar
2120ea87069dSBram Moolenaar    total = 0
2121ea87069dSBram Moolenaar    for var in [1, 2, 3]
2122ea87069dSBram Moolenaar      total += var
2123ea87069dSBram Moolenaar    endfor
2124ea87069dSBram Moolenaar    assert_equal(6, total)
2125ea87069dSBram Moolenaar  END
2126ea87069dSBram Moolenaarenddef
2127ea87069dSBram Moolenaar
2128792f786aSBram Moolenaardef Test_for_loop_unpack()
21294b8a0651SBram Moolenaar  var lines =<< trim END
2130792f786aSBram Moolenaar      var result = []
2131792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2132792f786aSBram Moolenaar        result->add(v1)
2133792f786aSBram Moolenaar        result->add(v2)
2134792f786aSBram Moolenaar      endfor
2135792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2136792f786aSBram Moolenaar
2137792f786aSBram Moolenaar      result = []
2138792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2139792f786aSBram Moolenaar        result->add(v1)
2140792f786aSBram Moolenaar        result->add(v2)
2141792f786aSBram Moolenaar        result->add(v3)
2142792f786aSBram Moolenaar      endfor
2143792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2144792f786aSBram Moolenaar
21454b8a0651SBram Moolenaar      result = []
21464b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
21474b8a0651SBram Moolenaar        result->add(&ts)
21484b8a0651SBram Moolenaar        result->add(&sw)
21494b8a0651SBram Moolenaar      endfor
21504b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
21514b8a0651SBram Moolenaar
21524b8a0651SBram Moolenaar      var slist: list<string>
21534b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
21544b8a0651SBram Moolenaar        slist->add($LOOPVAR)
21554b8a0651SBram Moolenaar        slist->add(@r)
21564b8a0651SBram Moolenaar        slist->add(v:errmsg)
21574b8a0651SBram Moolenaar      endfor
21584b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
21594b8a0651SBram Moolenaar
21604b8a0651SBram Moolenaar      slist = []
21614b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
21624b8a0651SBram Moolenaar        slist->add(g:globalvar)
21634b8a0651SBram Moolenaar        slist->add(b:bufvar)
21644b8a0651SBram Moolenaar        slist->add(w:winvar)
21654b8a0651SBram Moolenaar        slist->add(t:tabvar)
21664b8a0651SBram Moolenaar      endfor
21674b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2168f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
21694b8a0651SBram Moolenaar  END
21704b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
21714b8a0651SBram Moolenaar
21724b8a0651SBram Moolenaar  lines =<< trim END
2173792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2174792f786aSBram Moolenaar        echo v1 v2
2175792f786aSBram Moolenaar      endfor
2176792f786aSBram Moolenaar  END
2177792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2178792f786aSBram Moolenaar
2179792f786aSBram Moolenaar  lines =<< trim END
2180792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2181792f786aSBram Moolenaar        echo v1 v2
2182792f786aSBram Moolenaar      endfor
2183792f786aSBram Moolenaar  END
2184792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2185792f786aSBram Moolenaar
2186792f786aSBram Moolenaar  lines =<< trim END
2187792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2188792f786aSBram Moolenaar        echo v1
2189792f786aSBram Moolenaar      endfor
2190792f786aSBram Moolenaar  END
2191792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2192792f786aSBram Moolenaarenddef
2193792f786aSBram Moolenaar
2194d0df1aacSBram Moolenaardef Test_while_loop()
2195cfcd011fSBram Moolenaar  var result = ''
2196cfcd011fSBram Moolenaar  var cnt = 0
2197d0df1aacSBram Moolenaar  while cnt < 555
2198d0df1aacSBram Moolenaar    if cnt == 3
2199d0df1aacSBram Moolenaar      break
2200d0df1aacSBram Moolenaar    endif
2201d0df1aacSBram Moolenaar    cnt += 1
2202d0df1aacSBram Moolenaar    if cnt == 2
2203d0df1aacSBram Moolenaar      continue
2204d0df1aacSBram Moolenaar    endif
2205d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2206d0df1aacSBram Moolenaar  endwhile
2207d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2208*dee37dc7SBram Moolenaar
2209*dee37dc7SBram Moolenaar  var s = ''
2210*dee37dc7SBram Moolenaar  while s == 'x' #{comment
2211*dee37dc7SBram Moolenaar  endwhile
2212d0df1aacSBram Moolenaarenddef
2213d0df1aacSBram Moolenaar
2214e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2215675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2216675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2217675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2218675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2219675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2220675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2221675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
22226628b7ebSBram Moolenaar
22236628b7ebSBram Moolenaar  var lines =<< trim END
22246628b7ebSBram Moolenaar      var s = ''
22256628b7ebSBram Moolenaar      while s = ''
22266628b7ebSBram Moolenaar      endwhile
22276628b7ebSBram Moolenaar  END
22286628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2229bd5da371SBram Moolenaarenddef
2230bd5da371SBram Moolenaar
22319645e2d9SBram Moolenaardef Test_interrupt_loop()
2232cfcd011fSBram Moolenaar  var caught = false
2233cfcd011fSBram Moolenaar  var x = 0
223497acfc78SBram Moolenaar  try
22359645e2d9SBram Moolenaar    while 1
22369645e2d9SBram Moolenaar      x += 1
22379645e2d9SBram Moolenaar      if x == 100
22389645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22399645e2d9SBram Moolenaar      endif
22409645e2d9SBram Moolenaar    endwhile
224197acfc78SBram Moolenaar  catch
224297acfc78SBram Moolenaar    caught = true
224397acfc78SBram Moolenaar    assert_equal(100, x)
224497acfc78SBram Moolenaar  endtry
224597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
224625859dd7SBram Moolenaar  # consume the CTRL-C
224725859dd7SBram Moolenaar  getchar(0)
22489645e2d9SBram Moolenaarenddef
224920431c9dSBram Moolenaar
22504fdae999SBram Moolenaardef Test_automatic_line_continuation()
2251cfcd011fSBram Moolenaar  var mylist = [
22524fdae999SBram Moolenaar      'one',
22534fdae999SBram Moolenaar      'two',
22544fdae999SBram Moolenaar      'three',
2255f5be8cdbSBram Moolenaar      ] # comment
22564fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
22574fdae999SBram Moolenaar
2258cfcd011fSBram Moolenaar  var mydict = {
2259e0de171eSBram Moolenaar      ['one']: 1,
2260e0de171eSBram Moolenaar      ['two']: 2,
2261e0de171eSBram Moolenaar      ['three']:
22624fdae999SBram Moolenaar          3,
2263f5be8cdbSBram Moolenaar      } # comment
2264e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2265e0de171eSBram Moolenaar  mydict = {
22662c330432SBram Moolenaar      one: 1,  # comment
22672c330432SBram Moolenaar      two:     # comment
22682c330432SBram Moolenaar           2,  # comment
22692c330432SBram Moolenaar      three: 3 # comment
22702c330432SBram Moolenaar      }
2271e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2272e0de171eSBram Moolenaar  mydict = {
22732c330432SBram Moolenaar      one: 1,
22744fdae999SBram Moolenaar      two:
22754fdae999SBram Moolenaar           2,
22762c330432SBram Moolenaar      three: 3
22774fdae999SBram Moolenaar      }
2278e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2279e6085c53SBram Moolenaar
2280e6085c53SBram Moolenaar  assert_equal(
2281e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2282e6085c53SBram Moolenaar        split('one two three')
2283e6085c53SBram Moolenaar        )
22844fdae999SBram Moolenaarenddef
22854fdae999SBram Moolenaar
22867a092245SBram Moolenaardef Test_vim9_comment()
22877a092245SBram Moolenaar  CheckScriptSuccess([
22887a092245SBram Moolenaar      'vim9script',
22897a092245SBram Moolenaar      '# something',
229093f82cbeSBram Moolenaar      '#something',
229193f82cbeSBram Moolenaar      '#{something',
22927a092245SBram Moolenaar      ])
229393f82cbeSBram Moolenaar
229493f82cbeSBram Moolenaar  split Xfile
229593f82cbeSBram Moolenaar  CheckScriptSuccess([
229693f82cbeSBram Moolenaar      'vim9script',
229793f82cbeSBram Moolenaar      'edit #something',
229893f82cbeSBram Moolenaar      ])
229993f82cbeSBram Moolenaar  CheckScriptSuccess([
230093f82cbeSBram Moolenaar      'vim9script',
230193f82cbeSBram Moolenaar      'edit #{something',
230293f82cbeSBram Moolenaar      ])
230393f82cbeSBram Moolenaar  close
230493f82cbeSBram Moolenaar
23057a092245SBram Moolenaar  CheckScriptFailure([
23067a092245SBram Moolenaar      'vim9script',
23077a092245SBram Moolenaar      ':# something',
23087a092245SBram Moolenaar      ], 'E488:')
23097a092245SBram Moolenaar  CheckScriptFailure([
23107a092245SBram Moolenaar      '# something',
23117a092245SBram Moolenaar      ], 'E488:')
23127a092245SBram Moolenaar  CheckScriptFailure([
23137a092245SBram Moolenaar      ':# something',
23147a092245SBram Moolenaar      ], 'E488:')
23157a092245SBram Moolenaar
23164a8d9f2eSBram Moolenaar  { # block start
23174a8d9f2eSBram Moolenaar  } # block end
23184a8d9f2eSBram Moolenaar  CheckDefFailure([
23194a8d9f2eSBram Moolenaar      '{# comment',
23204a8d9f2eSBram Moolenaar      ], 'E488:')
23214a8d9f2eSBram Moolenaar  CheckDefFailure([
23224a8d9f2eSBram Moolenaar      '{',
23234a8d9f2eSBram Moolenaar      '}# comment',
23244a8d9f2eSBram Moolenaar      ], 'E488:')
23254a8d9f2eSBram Moolenaar
23264a8d9f2eSBram Moolenaar  echo "yes" # comment
23274a8d9f2eSBram Moolenaar  CheckDefFailure([
23284a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23294a8d9f2eSBram Moolenaar      ], 'E488:')
23307a092245SBram Moolenaar  CheckScriptSuccess([
23317a092245SBram Moolenaar      'vim9script',
23327a092245SBram Moolenaar      'echo "yes" # something',
23337a092245SBram Moolenaar      ])
23347a092245SBram Moolenaar  CheckScriptFailure([
23357a092245SBram Moolenaar      'vim9script',
23367a092245SBram Moolenaar      'echo "yes"# something',
23377a092245SBram Moolenaar      ], 'E121:')
23387a092245SBram Moolenaar  CheckScriptFailure([
23397a092245SBram Moolenaar      'vim9script',
23407a092245SBram Moolenaar      'echo# something',
2341f8103f27SBram Moolenaar      ], 'E1144:')
23427a092245SBram Moolenaar  CheckScriptFailure([
23437a092245SBram Moolenaar      'echo "yes" # something',
23447a092245SBram Moolenaar      ], 'E121:')
23457a092245SBram Moolenaar
23464a8d9f2eSBram Moolenaar  exe "echo" # comment
23474a8d9f2eSBram Moolenaar  CheckDefFailure([
23484a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23494a8d9f2eSBram Moolenaar      ], 'E488:')
23504a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23514a8d9f2eSBram Moolenaar      'vim9script',
23524a8d9f2eSBram Moolenaar      'exe "echo" # something',
23534a8d9f2eSBram Moolenaar      ])
23544a8d9f2eSBram Moolenaar  CheckScriptFailure([
23554a8d9f2eSBram Moolenaar      'vim9script',
23564a8d9f2eSBram Moolenaar      'exe "echo"# something',
23574a8d9f2eSBram Moolenaar      ], 'E121:')
23584a8d9f2eSBram Moolenaar  CheckScriptFailure([
23594a8d9f2eSBram Moolenaar      'vim9script',
23604a8d9f2eSBram Moolenaar      'exe# something',
2361f8103f27SBram Moolenaar      ], 'E1144:')
23624a8d9f2eSBram Moolenaar  CheckScriptFailure([
23634a8d9f2eSBram Moolenaar      'exe "echo" # something',
23644a8d9f2eSBram Moolenaar      ], 'E121:')
23654a8d9f2eSBram Moolenaar
23667a092245SBram Moolenaar  CheckDefFailure([
23677a092245SBram Moolenaar      'try# comment',
23687a092245SBram Moolenaar      '  echo "yes"',
23697a092245SBram Moolenaar      'catch',
23707a092245SBram Moolenaar      'endtry',
2371f8103f27SBram Moolenaar      ], 'E1144:')
23722c5ed4e3SBram Moolenaar  CheckScriptFailure([
23732c5ed4e3SBram Moolenaar      'vim9script',
23742c5ed4e3SBram Moolenaar      'try# comment',
23752c5ed4e3SBram Moolenaar      'echo "yes"',
2376f8103f27SBram Moolenaar      ], 'E1144:')
23777a092245SBram Moolenaar  CheckDefFailure([
23787a092245SBram Moolenaar      'try',
2379a72cfb80SBram Moolenaar      '  throw#comment',
2380a72cfb80SBram Moolenaar      'catch',
2381a72cfb80SBram Moolenaar      'endtry',
2382f8103f27SBram Moolenaar      ], 'E1144:')
2383a72cfb80SBram Moolenaar  CheckDefFailure([
2384a72cfb80SBram Moolenaar      'try',
2385a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2386a72cfb80SBram Moolenaar      'catch',
2387a72cfb80SBram Moolenaar      'endtry',
2388a72cfb80SBram Moolenaar      ], 'E488:')
2389a72cfb80SBram Moolenaar  CheckDefFailure([
2390a72cfb80SBram Moolenaar      'try',
23917a092245SBram Moolenaar      '  echo "yes"',
23927a092245SBram Moolenaar      'catch# comment',
23937a092245SBram Moolenaar      'endtry',
2394f8103f27SBram Moolenaar      ], 'E1144:')
23952c5ed4e3SBram Moolenaar  CheckScriptFailure([
23962c5ed4e3SBram Moolenaar      'vim9script',
23972c5ed4e3SBram Moolenaar      'try',
23982c5ed4e3SBram Moolenaar      '  echo "yes"',
23992c5ed4e3SBram Moolenaar      'catch# comment',
24002c5ed4e3SBram Moolenaar      'endtry',
2401f8103f27SBram Moolenaar      ], 'E1144:')
24022c5ed4e3SBram Moolenaar  CheckDefFailure([
24032c5ed4e3SBram Moolenaar      'try',
24042c5ed4e3SBram Moolenaar      '  echo "yes"',
24052c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24062c5ed4e3SBram Moolenaar      'endtry',
24072c5ed4e3SBram Moolenaar      ], 'E488:')
24087a092245SBram Moolenaar  CheckDefFailure([
24097a092245SBram Moolenaar      'try',
24107a092245SBram Moolenaar      'echo "yes"',
24117a092245SBram Moolenaar      'catch',
24127a092245SBram Moolenaar      'endtry# comment',
2413f8103f27SBram Moolenaar      ], 'E1144:')
24142c5ed4e3SBram Moolenaar  CheckScriptFailure([
24152c5ed4e3SBram Moolenaar      'vim9script',
24162c5ed4e3SBram Moolenaar      'try',
24172c5ed4e3SBram Moolenaar      '  echo "yes"',
24182c5ed4e3SBram Moolenaar      'catch',
24192c5ed4e3SBram Moolenaar      'endtry# comment',
2420f8103f27SBram Moolenaar      ], 'E1144:')
24212c5ed4e3SBram Moolenaar
24222c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24232c5ed4e3SBram Moolenaar      'vim9script',
24242c5ed4e3SBram Moolenaar      'hi # comment',
24252c5ed4e3SBram Moolenaar      ])
24262c5ed4e3SBram Moolenaar  CheckScriptFailure([
24272c5ed4e3SBram Moolenaar      'vim9script',
24282c5ed4e3SBram Moolenaar      'hi# comment',
2429f8103f27SBram Moolenaar      ], 'E1144:')
24301966c248SBram Moolenaar  CheckScriptSuccess([
24311966c248SBram Moolenaar      'vim9script',
24321966c248SBram Moolenaar      'hi Search # comment',
24331966c248SBram Moolenaar      ])
24341966c248SBram Moolenaar  CheckScriptFailure([
24351966c248SBram Moolenaar      'vim9script',
24361966c248SBram Moolenaar      'hi Search# comment',
24371966c248SBram Moolenaar      ], 'E416:')
24381966c248SBram Moolenaar  CheckScriptSuccess([
24391966c248SBram Moolenaar      'vim9script',
24401966c248SBram Moolenaar      'hi link This Search # comment',
24411966c248SBram Moolenaar      ])
24421966c248SBram Moolenaar  CheckScriptFailure([
24431966c248SBram Moolenaar      'vim9script',
24441966c248SBram Moolenaar      'hi link This That# comment',
24451966c248SBram Moolenaar      ], 'E413:')
24461966c248SBram Moolenaar  CheckScriptSuccess([
24471966c248SBram Moolenaar      'vim9script',
24481966c248SBram Moolenaar      'hi clear This # comment',
24491966c248SBram Moolenaar      'hi clear # comment',
24501966c248SBram Moolenaar      ])
2451f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2452f5be8cdbSBram Moolenaar  # hi clear This# comment',
24531966c248SBram Moolenaar  CheckScriptFailure([
24541966c248SBram Moolenaar      'vim9script',
24551966c248SBram Moolenaar      'hi clear# comment',
24561966c248SBram Moolenaar      ], 'E416:')
24571966c248SBram Moolenaar
24581966c248SBram Moolenaar  CheckScriptSuccess([
24591966c248SBram Moolenaar      'vim9script',
24601966c248SBram Moolenaar      'hi Group term=bold',
24611966c248SBram Moolenaar      'match Group /todo/ # comment',
24621966c248SBram Moolenaar      ])
24631966c248SBram Moolenaar  CheckScriptFailure([
24641966c248SBram Moolenaar      'vim9script',
24651966c248SBram Moolenaar      'hi Group term=bold',
24661966c248SBram Moolenaar      'match Group /todo/# comment',
24671966c248SBram Moolenaar      ], 'E488:')
24681966c248SBram Moolenaar  CheckScriptSuccess([
24691966c248SBram Moolenaar      'vim9script',
24701966c248SBram Moolenaar      'match # comment',
24711966c248SBram Moolenaar      ])
24721966c248SBram Moolenaar  CheckScriptFailure([
24731966c248SBram Moolenaar      'vim9script',
24741966c248SBram Moolenaar      'match# comment',
2475f8103f27SBram Moolenaar      ], 'E1144:')
24761966c248SBram Moolenaar  CheckScriptSuccess([
24771966c248SBram Moolenaar      'vim9script',
24781966c248SBram Moolenaar      'match none # comment',
24791966c248SBram Moolenaar      ])
24801966c248SBram Moolenaar  CheckScriptFailure([
24811966c248SBram Moolenaar      'vim9script',
24821966c248SBram Moolenaar      'match none# comment',
24831966c248SBram Moolenaar      ], 'E475:')
24841966c248SBram Moolenaar
24851966c248SBram Moolenaar  CheckScriptSuccess([
24861966c248SBram Moolenaar      'vim9script',
24871966c248SBram Moolenaar      'menutrans clear # comment',
24881966c248SBram Moolenaar      ])
24891966c248SBram Moolenaar  CheckScriptFailure([
24901966c248SBram Moolenaar      'vim9script',
24911966c248SBram Moolenaar      'menutrans clear# comment text',
24921966c248SBram Moolenaar      ], 'E474:')
24931966c248SBram Moolenaar
24941966c248SBram Moolenaar  CheckScriptSuccess([
24951966c248SBram Moolenaar      'vim9script',
24961966c248SBram Moolenaar      'syntax clear # comment',
24971966c248SBram Moolenaar      ])
24981966c248SBram Moolenaar  CheckScriptFailure([
24991966c248SBram Moolenaar      'vim9script',
25001966c248SBram Moolenaar      'syntax clear# comment text',
25011966c248SBram Moolenaar      ], 'E28:')
25021966c248SBram Moolenaar  CheckScriptSuccess([
25031966c248SBram Moolenaar      'vim9script',
25041966c248SBram Moolenaar      'syntax keyword Word some',
25051966c248SBram Moolenaar      'syntax clear Word # comment',
25061966c248SBram Moolenaar      ])
25071966c248SBram Moolenaar  CheckScriptFailure([
25081966c248SBram Moolenaar      'vim9script',
25091966c248SBram Moolenaar      'syntax keyword Word some',
25101966c248SBram Moolenaar      'syntax clear Word# comment text',
25111966c248SBram Moolenaar      ], 'E28:')
25121966c248SBram Moolenaar
25131966c248SBram Moolenaar  CheckScriptSuccess([
25141966c248SBram Moolenaar      'vim9script',
25151966c248SBram Moolenaar      'syntax list # comment',
25161966c248SBram Moolenaar      ])
25171966c248SBram Moolenaar  CheckScriptFailure([
25181966c248SBram Moolenaar      'vim9script',
25191966c248SBram Moolenaar      'syntax list# comment text',
25201966c248SBram Moolenaar      ], 'E28:')
25211966c248SBram Moolenaar
25221966c248SBram Moolenaar  CheckScriptSuccess([
25231966c248SBram Moolenaar      'vim9script',
25241966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
25251966c248SBram Moolenaar      ])
25261966c248SBram Moolenaar  CheckScriptFailure([
25271966c248SBram Moolenaar      'vim9script',
25281966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25291966c248SBram Moolenaar      ], 'E475:')
25301966c248SBram Moolenaar
25311966c248SBram Moolenaar  CheckScriptSuccess([
25321966c248SBram Moolenaar      'vim9script',
25331966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25341966c248SBram Moolenaar      ])
25351966c248SBram Moolenaar  CheckScriptFailure([
25361966c248SBram Moolenaar      'vim9script',
25371966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25381966c248SBram Moolenaar      ], 'E789:')
25391966c248SBram Moolenaar
25401966c248SBram Moolenaar  CheckScriptSuccess([
25411966c248SBram Moolenaar      'vim9script',
25421966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25431966c248SBram Moolenaar      ])
25441966c248SBram Moolenaar  CheckScriptFailure([
25451966c248SBram Moolenaar      'vim9script',
25461966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25471966c248SBram Moolenaar      ], 'E402:')
25481966c248SBram Moolenaar
25491966c248SBram Moolenaar  CheckScriptSuccess([
25501966c248SBram Moolenaar      'vim9script',
25511966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25521966c248SBram Moolenaar      ])
25531966c248SBram Moolenaar  CheckScriptFailure([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25561966c248SBram Moolenaar      ], 'E475:')
25571966c248SBram Moolenaar  CheckScriptFailure([
25581966c248SBram Moolenaar      'vim9script',
25591966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
25601966c248SBram Moolenaar      ], 'E406:')
25611966c248SBram Moolenaar  CheckScriptFailure([
25621966c248SBram Moolenaar      'vim9script',
25631966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
25641966c248SBram Moolenaar      ], 'E475:')
25651966c248SBram Moolenaar
25661966c248SBram Moolenaar  CheckScriptSuccess([
25671966c248SBram Moolenaar      'vim9script',
25681966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
25691966c248SBram Moolenaar      ])
25701966c248SBram Moolenaar  CheckScriptFailure([
25711966c248SBram Moolenaar      'vim9script',
25721966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2573d032f34aSBram Moolenaar      ], 'E402:')
25741966c248SBram Moolenaar
25751966c248SBram Moolenaar  CheckScriptSuccess([
25761966c248SBram Moolenaar      'vim9script',
25771966c248SBram Moolenaar      'syntax sync # comment',
25781966c248SBram Moolenaar      ])
25791966c248SBram Moolenaar  CheckScriptFailure([
25801966c248SBram Moolenaar      'vim9script',
25811966c248SBram Moolenaar      'syntax sync# comment',
25821966c248SBram Moolenaar      ], 'E404:')
25831966c248SBram Moolenaar  CheckScriptSuccess([
25841966c248SBram Moolenaar      'vim9script',
25851966c248SBram Moolenaar      'syntax sync ccomment # comment',
25861966c248SBram Moolenaar      ])
25871966c248SBram Moolenaar  CheckScriptFailure([
25881966c248SBram Moolenaar      'vim9script',
25891966c248SBram Moolenaar      'syntax sync ccomment# comment',
25901966c248SBram Moolenaar      ], 'E404:')
25911966c248SBram Moolenaar
25921966c248SBram Moolenaar  CheckScriptSuccess([
25931966c248SBram Moolenaar      'vim9script',
25941966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
25951966c248SBram Moolenaar      ])
25961966c248SBram Moolenaar  CheckScriptFailure([
25971966c248SBram Moolenaar      'vim9script',
25981966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25991966c248SBram Moolenaar      ], 'E475:')
2600a72cfb80SBram Moolenaar
2601a72cfb80SBram Moolenaar  CheckScriptSuccess([
2602a72cfb80SBram Moolenaar      'vim9script',
2603a72cfb80SBram Moolenaar      'command Echo echo # comment',
2604a72cfb80SBram Moolenaar      'command Echo # comment',
26052d870f8dSBram Moolenaar      'delcommand Echo',
2606a72cfb80SBram Moolenaar      ])
2607a72cfb80SBram Moolenaar  CheckScriptFailure([
2608a72cfb80SBram Moolenaar      'vim9script',
2609a72cfb80SBram Moolenaar      'command Echo echo# comment',
2610a72cfb80SBram Moolenaar      'Echo',
2611f8103f27SBram Moolenaar      ], 'E1144:')
26122d870f8dSBram Moolenaar  delcommand Echo
261370249ee8SBram Moolenaar
261470249ee8SBram Moolenaar  var curdir = getcwd()
261570249ee8SBram Moolenaar  CheckScriptSuccess([
261670249ee8SBram Moolenaar      'command Echo cd " comment',
261770249ee8SBram Moolenaar      'Echo',
261870249ee8SBram Moolenaar      'delcommand Echo',
261970249ee8SBram Moolenaar      ])
262070249ee8SBram Moolenaar  CheckScriptSuccess([
2621090728adSBram Moolenaar      'vim9script',
262270249ee8SBram Moolenaar      'command Echo cd # comment',
262370249ee8SBram Moolenaar      'Echo',
262470249ee8SBram Moolenaar      'delcommand Echo',
262570249ee8SBram Moolenaar      ])
262670249ee8SBram Moolenaar  CheckScriptFailure([
262770249ee8SBram Moolenaar      'vim9script',
262870249ee8SBram Moolenaar      'command Echo cd " comment',
262970249ee8SBram Moolenaar      'Echo',
263070249ee8SBram Moolenaar      ], 'E344:')
263170249ee8SBram Moolenaar  delcommand Echo
263270249ee8SBram Moolenaar  chdir(curdir)
263370249ee8SBram Moolenaar
2634a72cfb80SBram Moolenaar  CheckScriptFailure([
2635a72cfb80SBram Moolenaar      'vim9script',
2636a72cfb80SBram Moolenaar      'command Echo# comment',
2637a72cfb80SBram Moolenaar      ], 'E182:')
2638a72cfb80SBram Moolenaar  CheckScriptFailure([
2639a72cfb80SBram Moolenaar      'vim9script',
2640a72cfb80SBram Moolenaar      'command Echo echo',
2641a72cfb80SBram Moolenaar      'command Echo# comment',
2642a72cfb80SBram Moolenaar      ], 'E182:')
26432d870f8dSBram Moolenaar  delcommand Echo
2644a72cfb80SBram Moolenaar
2645a72cfb80SBram Moolenaar  CheckScriptSuccess([
2646a72cfb80SBram Moolenaar      'vim9script',
2647a72cfb80SBram Moolenaar      'function # comment',
2648a72cfb80SBram Moolenaar      ])
2649a72cfb80SBram Moolenaar  CheckScriptFailure([
2650a72cfb80SBram Moolenaar      'vim9script',
26519898107fSBram Moolenaar      'function " comment',
26529898107fSBram Moolenaar      ], 'E129:')
26539898107fSBram Moolenaar  CheckScriptFailure([
26549898107fSBram Moolenaar      'vim9script',
2655a72cfb80SBram Moolenaar      'function# comment',
2656f8103f27SBram Moolenaar      ], 'E1144:')
2657a72cfb80SBram Moolenaar  CheckScriptSuccess([
2658a72cfb80SBram Moolenaar      'vim9script',
2659a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2660a72cfb80SBram Moolenaar      ])
2661a72cfb80SBram Moolenaar  CheckScriptFailure([
2662a72cfb80SBram Moolenaar      'vim9script',
2663a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2664a72cfb80SBram Moolenaar      ], 'E488:')
2665a72cfb80SBram Moolenaar
2666a72cfb80SBram Moolenaar  CheckScriptSuccess([
2667a72cfb80SBram Moolenaar      'vim9script',
26684c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2669a72cfb80SBram Moolenaar      'endfunc',
26704c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2671a72cfb80SBram Moolenaar      ])
2672a72cfb80SBram Moolenaar  CheckScriptFailure([
2673a72cfb80SBram Moolenaar      'vim9script',
26744c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2675a72cfb80SBram Moolenaar      'endfunc',
26764c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2677a72cfb80SBram Moolenaar      ], 'E488:')
2678a72cfb80SBram Moolenaar
2679a72cfb80SBram Moolenaar  CheckScriptSuccess([
2680a72cfb80SBram Moolenaar      'vim9script',
2681a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2682a72cfb80SBram Moolenaar      ])
2683a72cfb80SBram Moolenaar  CheckScriptFailure([
2684a72cfb80SBram Moolenaar      'vim9script',
2685a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2686a72cfb80SBram Moolenaar      ], 'E488:')
2687e7e4838fSBram Moolenaar
2688e7e4838fSBram Moolenaar  CheckScriptFailure([
2689e7e4838fSBram Moolenaar      'def Test() " comment',
2690e7e4838fSBram Moolenaar      'enddef',
2691e7e4838fSBram Moolenaar      ], 'E488:')
2692e7e4838fSBram Moolenaar  CheckScriptFailure([
2693e7e4838fSBram Moolenaar      'vim9script',
2694e7e4838fSBram Moolenaar      'def Test() " comment',
2695e7e4838fSBram Moolenaar      'enddef',
2696e7e4838fSBram Moolenaar      ], 'E488:')
2697e7e4838fSBram Moolenaar
2698e7e4838fSBram Moolenaar  CheckScriptSuccess([
2699e7e4838fSBram Moolenaar      'func Test() " comment',
2700e7e4838fSBram Moolenaar      'endfunc',
27012d870f8dSBram Moolenaar      'delfunc Test',
2702e7e4838fSBram Moolenaar      ])
27039898107fSBram Moolenaar  CheckScriptSuccess([
2704e7e4838fSBram Moolenaar      'vim9script',
2705e7e4838fSBram Moolenaar      'func Test() " comment',
2706e7e4838fSBram Moolenaar      'endfunc',
27079898107fSBram Moolenaar      ])
2708e7e4838fSBram Moolenaar
2709e7e4838fSBram Moolenaar  CheckScriptSuccess([
2710e7e4838fSBram Moolenaar      'def Test() # comment',
2711e7e4838fSBram Moolenaar      'enddef',
2712e7e4838fSBram Moolenaar      ])
2713e7e4838fSBram Moolenaar  CheckScriptFailure([
2714e7e4838fSBram Moolenaar      'func Test() # comment',
2715e7e4838fSBram Moolenaar      'endfunc',
2716e7e4838fSBram Moolenaar      ], 'E488:')
27172c5ed4e3SBram Moolenaarenddef
27182c5ed4e3SBram Moolenaar
27192c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27202c5ed4e3SBram Moolenaar  CheckCanRunGui
27212c5ed4e3SBram Moolenaar
27222c5ed4e3SBram Moolenaar  CheckScriptFailure([
27232c5ed4e3SBram Moolenaar      'vim9script',
27242c5ed4e3SBram Moolenaar      'gui#comment'
2725f8103f27SBram Moolenaar      ], 'E1144:')
27262c5ed4e3SBram Moolenaar  CheckScriptFailure([
27272c5ed4e3SBram Moolenaar      'vim9script',
27282c5ed4e3SBram Moolenaar      'gui -f#comment'
27292c5ed4e3SBram Moolenaar      ], 'E499:')
27307a092245SBram Moolenaarenddef
27317a092245SBram Moolenaar
2732a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27336797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27346797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2735a26b9700SBram Moolenaar
2736a26b9700SBram Moolenaar  edit test.vim
2737a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2738a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2739a26b9700SBram Moolenaar
2740a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2741a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2742a26b9700SBram Moolenaar
2743a26b9700SBram Moolenaar  g:entered = 0
2744a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2745a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2746a26b9700SBram Moolenaar
2747a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2748a26b9700SBram Moolenaar
2749a26b9700SBram Moolenaar  au! TabEnter
2750a26b9700SBram Moolenaar  unlet g:entered
2751d72c1bf0SBram Moolenaar
2752d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2753d72c1bf0SBram Moolenaar      'vim9script',
27546797966dSBram Moolenaar      'g:var = 123',
2755e55b1c09SBram Moolenaar      'b:var = 456',
2756e55b1c09SBram Moolenaar      'w:var = 777',
2757e55b1c09SBram Moolenaar      't:var = 888',
2758d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2759d72c1bf0SBram Moolenaar      ])
2760d72c1bf0SBram Moolenaar
2761d72c1bf0SBram Moolenaar  CheckScriptFailure([
2762d72c1bf0SBram Moolenaar      'vim9script',
2763cfcd011fSBram Moolenaar      'let var = 123',
2764cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2765cfcd011fSBram Moolenaar
2766cfcd011fSBram Moolenaar  CheckScriptFailure([
2767cfcd011fSBram Moolenaar      'vim9script',
2768cfcd011fSBram Moolenaar      'var g:var = 123',
2769e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2770e55b1c09SBram Moolenaar
2771e55b1c09SBram Moolenaar  CheckScriptFailure([
2772e55b1c09SBram Moolenaar      'vim9script',
2773cfcd011fSBram Moolenaar      'var b:var = 123',
2774e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2775e55b1c09SBram Moolenaar
2776e55b1c09SBram Moolenaar  CheckScriptFailure([
2777e55b1c09SBram Moolenaar      'vim9script',
2778cfcd011fSBram Moolenaar      'var w:var = 123',
2779e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2780e55b1c09SBram Moolenaar
2781e55b1c09SBram Moolenaar  CheckScriptFailure([
2782e55b1c09SBram Moolenaar      'vim9script',
2783cfcd011fSBram Moolenaar      'var t:var = 123',
2784e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2785e55b1c09SBram Moolenaar
2786e55b1c09SBram Moolenaar  CheckScriptFailure([
2787e55b1c09SBram Moolenaar      'vim9script',
2788cfcd011fSBram Moolenaar      'var v:version = 123',
2789e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2790e55b1c09SBram Moolenaar
2791e55b1c09SBram Moolenaar  CheckScriptFailure([
2792e55b1c09SBram Moolenaar      'vim9script',
2793cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2794e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
27956797966dSBram Moolenaar
27966797966dSBram Moolenaar  CheckScriptFailure([
27976797966dSBram Moolenaar      'vim9script',
27986797966dSBram Moolenaar      'g:var = 123',
279932e35117SBram Moolenaar      'unlet g:var# comment1',
2800d72c1bf0SBram Moolenaar      ], 'E108:')
2801d72c1bf0SBram Moolenaar
2802d72c1bf0SBram Moolenaar  CheckScriptFailure([
2803d72c1bf0SBram Moolenaar      'let g:var = 123',
2804d72c1bf0SBram Moolenaar      'unlet g:var # something',
2805d72c1bf0SBram Moolenaar      ], 'E488:')
2806faac4104SBram Moolenaar
2807faac4104SBram Moolenaar  CheckScriptSuccess([
2808faac4104SBram Moolenaar      'vim9script',
280932e35117SBram Moolenaar      'if 1 # comment2',
2810faac4104SBram Moolenaar      '  echo "yes"',
2811faac4104SBram Moolenaar      'elseif 2 #comment',
2812faac4104SBram Moolenaar      '  echo "no"',
2813faac4104SBram Moolenaar      'endif',
2814faac4104SBram Moolenaar      ])
2815faac4104SBram Moolenaar
2816faac4104SBram Moolenaar  CheckScriptFailure([
2817faac4104SBram Moolenaar      'vim9script',
281832e35117SBram Moolenaar      'if 1# comment3',
2819faac4104SBram Moolenaar      '  echo "yes"',
2820faac4104SBram Moolenaar      'endif',
2821faac4104SBram Moolenaar      ], 'E15:')
2822faac4104SBram Moolenaar
2823faac4104SBram Moolenaar  CheckScriptFailure([
2824faac4104SBram Moolenaar      'vim9script',
282532e35117SBram Moolenaar      'if 0 # comment4',
2826faac4104SBram Moolenaar      '  echo "yes"',
2827faac4104SBram Moolenaar      'elseif 2#comment',
2828faac4104SBram Moolenaar      '  echo "no"',
2829faac4104SBram Moolenaar      'endif',
2830faac4104SBram Moolenaar      ], 'E15:')
2831faac4104SBram Moolenaar
2832faac4104SBram Moolenaar  CheckScriptSuccess([
2833faac4104SBram Moolenaar      'vim9script',
2834cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2835faac4104SBram Moolenaar      ])
2836faac4104SBram Moolenaar
2837faac4104SBram Moolenaar  CheckScriptFailure([
2838faac4104SBram Moolenaar      'vim9script',
2839cfcd011fSBram Moolenaar      'var v = 1# comment6',
284032e35117SBram Moolenaar      ], 'E15:')
2841faac4104SBram Moolenaar
2842faac4104SBram Moolenaar  CheckScriptSuccess([
2843faac4104SBram Moolenaar      'vim9script',
2844faac4104SBram Moolenaar      'new'
2845d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2846df069eecSBram Moolenaar      ':$',
2847faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2848faac4104SBram Moolenaar      'bwipe!',
2849faac4104SBram Moolenaar      ])
2850faac4104SBram Moolenaar
2851f5be8cdbSBram Moolenaar  CheckScriptFailure([
2852f5be8cdbSBram Moolenaar      'vim9script',
2853f5be8cdbSBram Moolenaar      'new'
2854d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2855f5be8cdbSBram Moolenaar      ':$',
2856f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2857f5be8cdbSBram Moolenaar      'bwipe!',
2858f5be8cdbSBram Moolenaar      ], 'E488:')
2859f5be8cdbSBram Moolenaar
2860f5be8cdbSBram Moolenaar  CheckScriptFailure([
2861f5be8cdbSBram Moolenaar      'vim9script',
2862f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2863f5be8cdbSBram Moolenaar      ], 'E477:')
2864a26b9700SBram Moolenaarenddef
2865a26b9700SBram Moolenaar
28667e5bd91dSBram Moolenaardef Test_finish()
2867cfcd011fSBram Moolenaar  var lines =<< trim END
28687e5bd91dSBram Moolenaar    vim9script
28696797966dSBram Moolenaar    g:res = 'one'
28707e5bd91dSBram Moolenaar    if v:false | finish | endif
28716797966dSBram Moolenaar    g:res = 'two'
28727e5bd91dSBram Moolenaar    finish
28736797966dSBram Moolenaar    g:res = 'three'
28747e5bd91dSBram Moolenaar  END
28757e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
28767e5bd91dSBram Moolenaar  source Xfinished
28777e5bd91dSBram Moolenaar  assert_equal('two', g:res)
28787e5bd91dSBram Moolenaar
28797e5bd91dSBram Moolenaar  unlet g:res
28807e5bd91dSBram Moolenaar  delete('Xfinished')
28817e5bd91dSBram Moolenaarenddef
28827e5bd91dSBram Moolenaar
2883a5d0077eSBram Moolenaardef Test_forward_declaration()
2884cfcd011fSBram Moolenaar  var lines =<< trim END
2885a5d0077eSBram Moolenaar    vim9script
2886a5d0077eSBram Moolenaar    def GetValue(): string
2887a5d0077eSBram Moolenaar      return theVal
2888a5d0077eSBram Moolenaar    enddef
2889cfcd011fSBram Moolenaar    var theVal = 'something'
2890822ba247SBram Moolenaar    g:initVal = GetValue()
2891a5d0077eSBram Moolenaar    theVal = 'else'
2892a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2893a5d0077eSBram Moolenaar  END
2894a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2895a5d0077eSBram Moolenaar  source Xforward
2896a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2897a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2898a5d0077eSBram Moolenaar
2899a5d0077eSBram Moolenaar  unlet g:initVal
2900a5d0077eSBram Moolenaar  unlet g:laterVal
2901a5d0077eSBram Moolenaar  delete('Xforward')
2902a5d0077eSBram Moolenaarenddef
2903a5d0077eSBram Moolenaar
29049721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2905a6294955SBram Moolenaar  var vim9_lines =<< trim END
2906a6294955SBram Moolenaar    vim9script
2907a6294955SBram Moolenaar    var local = 'local'
2908a6294955SBram Moolenaar    g:global = 'global'
2909a6294955SBram Moolenaar    export var exported = 'exported'
2910a6294955SBram Moolenaar    export def GetText(): string
2911a6294955SBram Moolenaar       return 'text'
2912a6294955SBram Moolenaar    enddef
2913a6294955SBram Moolenaar  END
2914a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
2915a6294955SBram Moolenaar
2916cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
29179721fb4eSBram Moolenaar    source Xvim9_script.vim
29189721fb4eSBram Moolenaar
29199721fb4eSBram Moolenaar    call assert_false(exists('local'))
29209721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29219721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29229721fb4eSBram Moolenaar    call assert_equal('global', global)
29239721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29249721fb4eSBram Moolenaar
29259721fb4eSBram Moolenaar    " imported variable becomes script-local
29269721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29279721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29289721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29299721fb4eSBram Moolenaar
29309721fb4eSBram Moolenaar    " imported function becomes script-local
29319721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29329721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29339721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29349721fb4eSBram Moolenaar  END
29359721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29369721fb4eSBram Moolenaar
29379721fb4eSBram Moolenaar  source Xlegacy_script.vim
29389721fb4eSBram Moolenaar  assert_equal('global', g:global)
2939f5be8cdbSBram Moolenaar  unlet g:global
29409721fb4eSBram Moolenaar
29419721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29429721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29439721fb4eSBram Moolenaarenddef
2944a5d0077eSBram Moolenaar
29457d699701SBram Moolenaarfunc Test_vim9script_not_global()
29467d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
29477d699701SBram Moolenaar  let vim9lines =<< trim END
29487d699701SBram Moolenaar    vim9script
2949cfcd011fSBram Moolenaar    var name = 'local'
29507d699701SBram Moolenaar    func TheFunc()
29517d699701SBram Moolenaar      echo 'local'
29527d699701SBram Moolenaar    endfunc
29537d699701SBram Moolenaar    def DefFunc()
29547d699701SBram Moolenaar      echo 'local'
29557d699701SBram Moolenaar    enddef
29567d699701SBram Moolenaar  END
29577d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
29587d699701SBram Moolenaar  source Xvim9script.vim
29597d699701SBram Moolenaar  try
29607d699701SBram Moolenaar    echo g:var
29617d699701SBram Moolenaar    assert_report('did not fail')
29627d699701SBram Moolenaar  catch /E121:/
29637d699701SBram Moolenaar    " caught
29647d699701SBram Moolenaar  endtry
29657d699701SBram Moolenaar  try
29667d699701SBram Moolenaar    call TheFunc()
29677d699701SBram Moolenaar    assert_report('did not fail')
29687d699701SBram Moolenaar  catch /E117:/
29697d699701SBram Moolenaar    " caught
29707d699701SBram Moolenaar  endtry
29717d699701SBram Moolenaar  try
29727d699701SBram Moolenaar    call DefFunc()
29737d699701SBram Moolenaar    assert_report('did not fail')
29747d699701SBram Moolenaar  catch /E117:/
29757d699701SBram Moolenaar    " caught
29767d699701SBram Moolenaar  endtry
29777d699701SBram Moolenaar
297825859dd7SBram Moolenaar  call delete('Xvim9script.vim')
29797d699701SBram Moolenaarendfunc
29807d699701SBram Moolenaar
2981eeb27bfeSBram Moolenaardef Test_vim9_copen()
2982eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2983eeb27bfeSBram Moolenaar  copen
2984eeb27bfeSBram Moolenaar  quit
2985eeb27bfeSBram Moolenaarenddef
2986eeb27bfeSBram Moolenaar
298703290b84SBram Moolenaar" test using an auto-loaded function and variable
29882d6b20d6SBram Moolenaardef Test_vim9_autoload()
2989cfcd011fSBram Moolenaar  var lines =<< trim END
29902d6b20d6SBram Moolenaar     vim9script
299103290b84SBram Moolenaar     def some#gettest(): string
299203290b84SBram Moolenaar       return 'test'
299303290b84SBram Moolenaar     enddef
299403290b84SBram Moolenaar     g:some#name = 'name'
299503290b84SBram Moolenaar  END
299603290b84SBram Moolenaar
299703290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
299803290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
299903290b84SBram Moolenaar  var save_rtp = &rtp
300003290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
300103290b84SBram Moolenaar
300203290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
300303290b84SBram Moolenaar  assert_equal('name', g:some#name)
300403290b84SBram Moolenaar  g:some#other = 'other'
300503290b84SBram Moolenaar  assert_equal('other', g:some#other)
300603290b84SBram Moolenaar
300717f700acSBram Moolenaar  # upper case script name works
300817f700acSBram Moolenaar  lines =<< trim END
300917f700acSBram Moolenaar     vim9script
301017f700acSBram Moolenaar     def Other#getOther(): string
301117f700acSBram Moolenaar       return 'other'
301217f700acSBram Moolenaar     enddef
301317f700acSBram Moolenaar  END
301417f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
301517f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
301617f700acSBram Moolenaar
301703290b84SBram Moolenaar  delete('Xdir', 'rf')
301803290b84SBram Moolenaar  &rtp = save_rtp
301903290b84SBram Moolenaarenddef
302003290b84SBram Moolenaar
302103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
302203290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
302303290b84SBram Moolenaar  var lines =<< trim END
302403290b84SBram Moolenaar     vim9script
30252d6b20d6SBram Moolenaar     def foo#test()
30262d6b20d6SBram Moolenaar         echomsg getreg('"')
30272d6b20d6SBram Moolenaar     enddef
30282d6b20d6SBram Moolenaar  END
30292d6b20d6SBram Moolenaar
30302d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
30312d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3032cfcd011fSBram Moolenaar  var save_rtp = &rtp
30332d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
30342d6b20d6SBram Moolenaar  augroup test
30352d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
30362d6b20d6SBram Moolenaar  augroup END
30372d6b20d6SBram Moolenaar
30382d6b20d6SBram Moolenaar  normal Y
30392d6b20d6SBram Moolenaar
30402d6b20d6SBram Moolenaar  augroup test
30412d6b20d6SBram Moolenaar    autocmd!
30422d6b20d6SBram Moolenaar  augroup END
30432d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
30442d6b20d6SBram Moolenaar  &rtp = save_rtp
30452d6b20d6SBram Moolenaarenddef
30462d6b20d6SBram Moolenaar
304777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
304877e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3049cfcd011fSBram Moolenaar  var lines =<< trim END
305077e5dcc3SBram Moolenaar      vim9script
305177e5dcc3SBram Moolenaar      def crash#func()
305277e5dcc3SBram Moolenaar          try
305377e5dcc3SBram Moolenaar              for x in List()
305477e5dcc3SBram Moolenaar              endfor
305577e5dcc3SBram Moolenaar          catch
305677e5dcc3SBram Moolenaar          endtry
305777e5dcc3SBram Moolenaar          g:ok = true
305877e5dcc3SBram Moolenaar      enddef
305977e5dcc3SBram Moolenaar      fu List()
306077e5dcc3SBram Moolenaar          invalid
306177e5dcc3SBram Moolenaar      endfu
306277e5dcc3SBram Moolenaar      try
306348e11c10SBram Moolenaar          alsoinvalid
306477e5dcc3SBram Moolenaar      catch /wontmatch/
306577e5dcc3SBram Moolenaar      endtry
306677e5dcc3SBram Moolenaar  END
306777e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
306877e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
306977e5dcc3SBram Moolenaar
307077e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
307177e5dcc3SBram Moolenaar  lines =<< trim END
307277e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
307377e5dcc3SBram Moolenaar    call crash#func()
307477e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
30759c4f5520SBram Moolenaar    qall!
307677e5dcc3SBram Moolenaar  END
307777e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
307877e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
307977e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
308077e5dcc3SBram Moolenaar
308177e5dcc3SBram Moolenaar  delete('Xdidit')
308277e5dcc3SBram Moolenaar  delete('Xscript')
308377e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
308403290b84SBram Moolenaar
308503290b84SBram Moolenaar  lines =<< trim END
308603290b84SBram Moolenaar    vim9script
308703290b84SBram Moolenaar    var foo#bar = 'asdf'
308803290b84SBram Moolenaar  END
308903290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
309077e5dcc3SBram Moolenaarenddef
309177e5dcc3SBram Moolenaar
309281e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
309381e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
309481e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3095cfcd011fSBram Moolenaar  var lines =<< trim END
309681e17fbeSBram Moolenaar    let s:counter = 1
309781e17fbeSBram Moolenaar    def s:Func()
309881e17fbeSBram Moolenaar      au! CursorHold
309981e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
310081e17fbeSBram Moolenaar    enddef
310181e17fbeSBram Moolenaar    call s:Func()
310281e17fbeSBram Moolenaar    doau CursorHold
310381e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
310481e17fbeSBram Moolenaar    au! CursorHold
310581e17fbeSBram Moolenaar  END
310681e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
310781e17fbeSBram Moolenaarenddef
310881e17fbeSBram Moolenaar
31093896a105SBram Moolenaardef Test_cmdline_win()
31103896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31113896a105SBram Moolenaar  # the command line window.
31123896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3113cfcd011fSBram Moolenaar  var export_lines =<< trim END
31143896a105SBram Moolenaar    vim9script
3115cfcd011fSBram Moolenaar    export var That = 'yes'
31163896a105SBram Moolenaar  END
31173896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3118cfcd011fSBram Moolenaar  var import_lines =<< trim END
31193896a105SBram Moolenaar    vim9script
31203896a105SBram Moolenaar    import That from './Xexport.vim'
31213896a105SBram Moolenaar  END
31223896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3123cfcd011fSBram Moolenaar  var save_rtp = &rtp
31243896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
31253896a105SBram Moolenaar  syntax on
31263896a105SBram Moolenaar  augroup CmdWin
31273896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
31283896a105SBram Moolenaar  augroup END
31293896a105SBram Moolenaar  # this will open and also close the cmdline window
31303896a105SBram Moolenaar  feedkeys('q:', 'xt')
31313896a105SBram Moolenaar  assert_equal('yes', g:got_there)
31323896a105SBram Moolenaar
31333896a105SBram Moolenaar  augroup CmdWin
31343896a105SBram Moolenaar    au!
31353896a105SBram Moolenaar  augroup END
31363896a105SBram Moolenaar  &rtp = save_rtp
31373896a105SBram Moolenaar  delete('rtp', 'rf')
31383896a105SBram Moolenaarenddef
31393896a105SBram Moolenaar
3140e3d4685fSBram Moolenaardef Test_invalid_sid()
3141e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
314225859dd7SBram Moolenaar
31439c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3144d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3145e3d4685fSBram Moolenaar  endif
3146e3d4685fSBram Moolenaar  delete('Xdidit')
3147e3d4685fSBram Moolenaarenddef
3148e3d4685fSBram Moolenaar
31499ec7026fSBram Moolenaardef Test_restoring_cpo()
31509ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
31519ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
31529ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
31539ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
31549ec7026fSBram Moolenaar  endif
31559ec7026fSBram Moolenaar  delete('Xsourced')
31569ec7026fSBram Moolenaar  delete('Xclose')
3157090728adSBram Moolenaar  delete('Xdone')
31589ec7026fSBram Moolenaarenddef
31599ec7026fSBram Moolenaar
31609ec7026fSBram Moolenaar
3161f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3162cfcd011fSBram Moolenaar  var lines =<< trim END
3163cfcd011fSBram Moolenaar    var name: any
3164cfcd011fSBram Moolenaar    assert_equal(0, name)
3165f0afd9e1SBram Moolenaar  END
3166f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3167f0afd9e1SBram Moolenaarenddef
3168f0afd9e1SBram Moolenaar
31697e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
317058dbef33SBram Moolenaar  CheckRunVimInTerminal
317158dbef33SBram Moolenaar
31727e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
31737e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
31747e9210eaSBram Moolenaarendfunc
31757e9210eaSBram Moolenaar
31767e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
31779c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3178cfcd011fSBram Moolenaar  var lines =<< trim END
31799c4f5520SBram Moolenaar    func CheckAndQuit()
31809c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
31819c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
31829c4f5520SBram Moolenaar    endfunc
31839c4f5520SBram Moolenaar  END
31849c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
31859c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3186e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
31879c4f5520SBram Moolenaar  # define Afunc() on the command line
31889c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
31899c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
31902949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
31919c4f5520SBram Moolenaar
31929c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
31939c4f5520SBram Moolenaar  delete('XcallFunc')
31949c4f5520SBram Moolenaar  delete('Xdidcmd')
31959c4f5520SBram Moolenaarenddef
31969c4f5520SBram Moolenaar
3197fcdc5d83SBram Moolenaardef Test_script_var_scope()
3198fcdc5d83SBram Moolenaar  var lines =<< trim END
3199fcdc5d83SBram Moolenaar      vim9script
3200fcdc5d83SBram Moolenaar      if true
3201fcdc5d83SBram Moolenaar        if true
3202fcdc5d83SBram Moolenaar          var one = 'one'
3203fcdc5d83SBram Moolenaar          echo one
3204fcdc5d83SBram Moolenaar        endif
3205fcdc5d83SBram Moolenaar        echo one
3206fcdc5d83SBram Moolenaar      endif
3207fcdc5d83SBram Moolenaar  END
3208fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3209fcdc5d83SBram Moolenaar
3210fcdc5d83SBram Moolenaar  lines =<< trim END
3211fcdc5d83SBram Moolenaar      vim9script
3212fcdc5d83SBram Moolenaar      if true
3213fcdc5d83SBram Moolenaar        if false
3214fcdc5d83SBram Moolenaar          var one = 'one'
3215fcdc5d83SBram Moolenaar          echo one
3216fcdc5d83SBram Moolenaar        else
3217fcdc5d83SBram Moolenaar          var one = 'one'
3218fcdc5d83SBram Moolenaar          echo one
3219fcdc5d83SBram Moolenaar        endif
3220fcdc5d83SBram Moolenaar        echo one
3221fcdc5d83SBram Moolenaar      endif
3222fcdc5d83SBram Moolenaar  END
3223fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3224fcdc5d83SBram Moolenaar
3225fcdc5d83SBram Moolenaar  lines =<< trim END
3226fcdc5d83SBram Moolenaar      vim9script
3227fcdc5d83SBram Moolenaar      while true
3228fcdc5d83SBram Moolenaar        var one = 'one'
3229fcdc5d83SBram Moolenaar        echo one
3230fcdc5d83SBram Moolenaar        break
3231fcdc5d83SBram Moolenaar      endwhile
3232fcdc5d83SBram Moolenaar      echo one
3233fcdc5d83SBram Moolenaar  END
3234fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3235fcdc5d83SBram Moolenaar
3236fcdc5d83SBram Moolenaar  lines =<< trim END
3237fcdc5d83SBram Moolenaar      vim9script
3238fcdc5d83SBram Moolenaar      for i in range(1)
3239fcdc5d83SBram Moolenaar        var one = 'one'
3240fcdc5d83SBram Moolenaar        echo one
3241fcdc5d83SBram Moolenaar      endfor
3242fcdc5d83SBram Moolenaar      echo one
3243fcdc5d83SBram Moolenaar  END
3244fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
32459becdf2bSBram Moolenaar
32469becdf2bSBram Moolenaar  lines =<< trim END
32479becdf2bSBram Moolenaar      vim9script
32489becdf2bSBram Moolenaar      {
32499becdf2bSBram Moolenaar        var one = 'one'
32509becdf2bSBram Moolenaar        assert_equal('one', one)
32519becdf2bSBram Moolenaar      }
32529becdf2bSBram Moolenaar      assert_false(exists('one'))
32539becdf2bSBram Moolenaar      assert_false(exists('s:one'))
32549becdf2bSBram Moolenaar  END
32559becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
32569becdf2bSBram Moolenaar
32579becdf2bSBram Moolenaar  lines =<< trim END
32589becdf2bSBram Moolenaar      vim9script
32599becdf2bSBram Moolenaar      {
32609becdf2bSBram Moolenaar        var one = 'one'
32619becdf2bSBram Moolenaar        echo one
32629becdf2bSBram Moolenaar      }
32639becdf2bSBram Moolenaar      echo one
32649becdf2bSBram Moolenaar  END
32659becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3266fcdc5d83SBram Moolenaarenddef
3267fcdc5d83SBram Moolenaar
3268352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3269352134bbSBram Moolenaar  var lines =<< trim END
3270352134bbSBram Moolenaar    vim9script
3271352134bbSBram Moolenaar    def Callback(...l: any)
3272352134bbSBram Moolenaar      try
3273352134bbSBram Moolenaar        var x: string
3274352134bbSBram Moolenaar        var y: string
3275352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3276352134bbSBram Moolenaar        [x, y] = ['']
3277352134bbSBram Moolenaar      catch
3278352134bbSBram Moolenaar        g:caught = 'yes'
3279352134bbSBram Moolenaar      endtry
3280352134bbSBram Moolenaar    enddef
3281e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3282352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3283352134bbSBram Moolenaar  END
3284352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3285352134bbSBram Moolenaar
3286352134bbSBram Moolenaar  unlet g:caught
3287352134bbSBram Moolenaarenddef
3288352134bbSBram Moolenaar
3289631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3290631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3291631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3292631e8f93SBram Moolenaar  endif
3293631e8f93SBram Moolenaar  var lines =<< trim END
3294631e8f93SBram Moolenaar      vim9script
3295631e8f93SBram Moolenaar      var source: list<number>
3296631e8f93SBram Moolenaar      def Out_cb(...l: any)
3297631e8f93SBram Moolenaar          eval [][0]
3298631e8f93SBram Moolenaar      enddef
3299631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3300631e8f93SBram Moolenaar          sleep 1m
3301631e8f93SBram Moolenaar          source += l
3302631e8f93SBram Moolenaar      enddef
3303e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
33046f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
33056f17a3f0SBram Moolenaar        sleep 10m
33066f17a3f0SBram Moolenaar      endwhile
3307206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3308206c2a6eSBram Moolenaar      sleep 100m
3309631e8f93SBram Moolenaar  END
3310631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3311631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3312631e8f93SBram Moolenaar  delete('Xdef')
3313631e8f93SBram Moolenaarenddef
3314631e8f93SBram Moolenaar
33154324d87aSBram Moolenaardef InvokeNormal()
33164324d87aSBram Moolenaar  exe "norm! :m+1\r"
33174324d87aSBram Moolenaarenddef
33184324d87aSBram Moolenaar
33194324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
33204324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
33214324d87aSBram Moolenaar  new
33224324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
33234324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
33244324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
33254324d87aSBram Moolenaar  xunmap <F3>
3326b5b9480eSBram Moolenaarenddef
3327b5b9480eSBram Moolenaar
3328b5b9480eSBram Moolenaardef Test_white_space_after_command()
3329b5b9480eSBram Moolenaar  var lines =<< trim END
3330b5b9480eSBram Moolenaar    exit_cb: Func})
3331b5b9480eSBram Moolenaar  END
3332b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3333f8103f27SBram Moolenaar
3334f8103f27SBram Moolenaar  lines =<< trim END
3335f8103f27SBram Moolenaar    e#
3336f8103f27SBram Moolenaar  END
3337f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
33384324d87aSBram Moolenaarenddef
33394324d87aSBram Moolenaar
33404aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
33414aab88d9SBram Moolenaar  var lines =<< trim END
33424aab88d9SBram Moolenaar      vim9script
33434aab88d9SBram Moolenaar      if exists('g:guard')
33444aab88d9SBram Moolenaar        finish
33454aab88d9SBram Moolenaar      endif
33464aab88d9SBram Moolenaar      g:guard = 1
33474aab88d9SBram Moolenaar      var name = 'thename'
33484aab88d9SBram Moolenaar      def g:GetName(): string
33494aab88d9SBram Moolenaar        return name
33504aab88d9SBram Moolenaar      enddef
33514aab88d9SBram Moolenaar      def g:SetName(arg: string)
33524aab88d9SBram Moolenaar        name = arg
33534aab88d9SBram Moolenaar      enddef
33544aab88d9SBram Moolenaar  END
33554aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
33564aab88d9SBram Moolenaar  so XscriptTwice.vim
33574aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
33584aab88d9SBram Moolenaar  g:SetName('newname')
33594aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
33604aab88d9SBram Moolenaar  so XscriptTwice.vim
33614aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
33624aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
33634aab88d9SBram Moolenaar
33644aab88d9SBram Moolenaar  delfunc g:GetName
33654aab88d9SBram Moolenaar  delfunc g:SetName
33664aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
33674aab88d9SBram Moolenaar  unlet g:guard
33684aab88d9SBram Moolenaarenddef
33694aab88d9SBram Moolenaar
33704aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
33714aab88d9SBram Moolenaar  var exportlines =<< trim END
33724aab88d9SBram Moolenaar      vim9script
33734aab88d9SBram Moolenaar      if exists('g:guard')
33744aab88d9SBram Moolenaar        finish
33754aab88d9SBram Moolenaar      endif
33764aab88d9SBram Moolenaar      g:guard = 1
33774aab88d9SBram Moolenaar      export var name = 'someName'
33784aab88d9SBram Moolenaar  END
33794aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
33804aab88d9SBram Moolenaar
33814aab88d9SBram Moolenaar  var lines =<< trim END
33824aab88d9SBram Moolenaar      vim9script
33834aab88d9SBram Moolenaar      import name from './XexportScript.vim'
33844aab88d9SBram Moolenaar      def g:GetName(): string
33854aab88d9SBram Moolenaar        return name
33864aab88d9SBram Moolenaar      enddef
33874aab88d9SBram Moolenaar  END
33884aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
33894aab88d9SBram Moolenaar  so XscriptImport.vim
33904aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
33914aab88d9SBram Moolenaar
33924aab88d9SBram Moolenaar  so XexportScript.vim
33934aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
33944aab88d9SBram Moolenaar
33954aab88d9SBram Moolenaar  delfunc g:GetName
33964aab88d9SBram Moolenaar  delete('XexportScript.vim')
33974aab88d9SBram Moolenaar  delete('XscriptImport.vim')
33984aab88d9SBram Moolenaar  unlet g:guard
33994aab88d9SBram Moolenaarenddef
34004aab88d9SBram Moolenaar
3401585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3402585fea7bSBram Moolenaardef Test_substitute_cmd()
3403585fea7bSBram Moolenaar  new
3404585fea7bSBram Moolenaar  setline(1, 'something')
3405585fea7bSBram Moolenaar  :substitute(some(other(
3406585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3407585fea7bSBram Moolenaar  bwipe!
3408585fea7bSBram Moolenaar
3409f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3410cfcd011fSBram Moolenaar  var lines =<< trim END
3411585fea7bSBram Moolenaar    vim9script
3412585fea7bSBram Moolenaar    new
3413585fea7bSBram Moolenaar    setline(1, 'something')
3414585fea7bSBram Moolenaar    :substitute(some(other(
3415585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3416585fea7bSBram Moolenaar    bwipe!
3417585fea7bSBram Moolenaar  END
3418585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3419585fea7bSBram Moolenaar  source Xvim9lines
3420585fea7bSBram Moolenaar
3421585fea7bSBram Moolenaar  delete('Xvim9lines')
3422585fea7bSBram Moolenaarenddef
3423585fea7bSBram Moolenaar
34248a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3425