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)
559d9d7789bSBram Moolenaar
560d9d7789bSBram Moolenaar  var counter = 0
561d9d7789bSBram Moolenaar  for i in range(4)
562d9d7789bSBram Moolenaar    try
563d9d7789bSBram Moolenaar      eval [][0]
564d9d7789bSBram Moolenaar    catch
565d9d7789bSBram Moolenaar    endtry
566d9d7789bSBram Moolenaar    counter += 1
567d9d7789bSBram Moolenaar  endfor
568d9d7789bSBram Moolenaar  assert_equal(4, counter)
5698a7d6542SBram Moolenaarenddef
5708a7d6542SBram Moolenaar
5711430ceebSBram Moolenaardef Test_cnext_works_in_catch()
5721430ceebSBram Moolenaar  var lines =<< trim END
5731430ceebSBram Moolenaar      vim9script
5741430ceebSBram Moolenaar      au BufEnter * eval 0
5751430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
5761430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
5771430ceebSBram Moolenaar      var items = [
5781430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
5791430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
5801430ceebSBram Moolenaar        ]
5811430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
5821430ceebSBram Moolenaar      cwindow
5831430ceebSBram Moolenaar
5841430ceebSBram Moolenaar      def CnextOrCfirst()
5851430ceebSBram Moolenaar        # if cnext fails, cfirst is used
5861430ceebSBram Moolenaar        try
5871430ceebSBram Moolenaar          cnext
5881430ceebSBram Moolenaar        catch
5891430ceebSBram Moolenaar          cfirst
5901430ceebSBram Moolenaar        endtry
5911430ceebSBram Moolenaar      enddef
5921430ceebSBram Moolenaar
5931430ceebSBram Moolenaar      CnextOrCfirst()
5941430ceebSBram Moolenaar      CnextOrCfirst()
5951430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
5961430ceebSBram Moolenaar      qall
5971430ceebSBram Moolenaar  END
5981430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
5991430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6001430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6011430ceebSBram Moolenaar
6021430ceebSBram Moolenaar  delete('Xfile1')
6031430ceebSBram Moolenaar  delete('Xfile2')
6041430ceebSBram Moolenaar  delete('XCatchCnext')
6051430ceebSBram Moolenaar  delete('Xresult')
6061430ceebSBram Moolenaarenddef
6071430ceebSBram Moolenaar
6089e1d9e34SBram Moolenaardef Test_throw_skipped()
6099e1d9e34SBram Moolenaar  if 0
6109e1d9e34SBram Moolenaar    throw dontgethere
6119e1d9e34SBram Moolenaar  endif
6129e1d9e34SBram Moolenaarenddef
6139e1d9e34SBram Moolenaar
6148f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6158f81b22eSBram Moolenaar  var lines =<< trim END
6168f81b22eSBram Moolenaar    vim9script
6178f81b22eSBram Moolenaar    def Func()
6188f81b22eSBram Moolenaar      throw 'error'
6198f81b22eSBram Moolenaar    enddef
6208f81b22eSBram Moolenaar    silent! Func()
6218f81b22eSBram Moolenaar  END
6228f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6238f81b22eSBram Moolenaar  source XthrowSilenced
6248f81b22eSBram Moolenaar  delete('XthrowSilenced')
6258f81b22eSBram Moolenaarenddef
6268f81b22eSBram Moolenaar
627e859312eSBram Moolenaardef DeletedFunc(): list<any>
628e859312eSBram Moolenaar  return ['delete me']
629e859312eSBram Moolenaarenddef
630e859312eSBram Moolenaardefcompile
631e859312eSBram Moolenaardelfunc DeletedFunc
632e859312eSBram Moolenaar
633257cc5eeSBram Moolenaardef ThrowFromDef()
634a72cfb80SBram Moolenaar  throw "getout" # comment
635257cc5eeSBram Moolenaarenddef
636257cc5eeSBram Moolenaar
637257cc5eeSBram Moolenaarfunc CatchInFunc()
638257cc5eeSBram Moolenaar  try
639257cc5eeSBram Moolenaar    call ThrowFromDef()
640257cc5eeSBram Moolenaar  catch
641257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
642257cc5eeSBram Moolenaar  endtry
643257cc5eeSBram Moolenaarendfunc
644257cc5eeSBram Moolenaar
645257cc5eeSBram Moolenaardef CatchInDef()
646257cc5eeSBram Moolenaar  try
647257cc5eeSBram Moolenaar    ThrowFromDef()
648257cc5eeSBram Moolenaar  catch
649257cc5eeSBram Moolenaar    g:thrown_def = v:exception
650257cc5eeSBram Moolenaar  endtry
651257cc5eeSBram Moolenaarenddef
652257cc5eeSBram Moolenaar
653f575adffSBram Moolenaardef ReturnFinally(): string
654f575adffSBram Moolenaar  try
655f575adffSBram Moolenaar    return 'intry'
656373863edSBram Moolenaar  finall
657f575adffSBram Moolenaar    g:in_finally = 'finally'
658f575adffSBram Moolenaar  endtry
659f575adffSBram Moolenaar  return 'end'
660f575adffSBram Moolenaarenddef
661f575adffSBram Moolenaar
662257cc5eeSBram Moolenaardef Test_try_catch_nested()
663257cc5eeSBram Moolenaar  CatchInFunc()
664257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
665257cc5eeSBram Moolenaar
666257cc5eeSBram Moolenaar  CatchInDef()
667257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
668f575adffSBram Moolenaar
669f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
670f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
671f575adffSBram Moolenaarenddef
672f575adffSBram Moolenaar
6739939f57bSBram Moolenaardef TryOne(): number
6749939f57bSBram Moolenaar  try
6759939f57bSBram Moolenaar    return 0
6769939f57bSBram Moolenaar  catch
6779939f57bSBram Moolenaar  endtry
6789939f57bSBram Moolenaar  return 0
6799939f57bSBram Moolenaarenddef
6809939f57bSBram Moolenaar
6819939f57bSBram Moolenaardef TryTwo(n: number): string
6829939f57bSBram Moolenaar  try
683cfcd011fSBram Moolenaar    var x = {}
6849939f57bSBram Moolenaar  catch
6859939f57bSBram Moolenaar  endtry
6869939f57bSBram Moolenaar  return 'text'
6879939f57bSBram Moolenaarenddef
6889939f57bSBram Moolenaar
6899939f57bSBram Moolenaardef Test_try_catch_twice()
6909939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
6919939f57bSBram Moolenaarenddef
6929939f57bSBram Moolenaar
693f575adffSBram Moolenaardef Test_try_catch_match()
694cfcd011fSBram Moolenaar  var seq = 'a'
695f575adffSBram Moolenaar  try
696f575adffSBram Moolenaar    throw 'something'
697f575adffSBram Moolenaar  catch /nothing/
698f575adffSBram Moolenaar    seq ..= 'x'
699f575adffSBram Moolenaar  catch /some/
700f575adffSBram Moolenaar    seq ..= 'b'
701f575adffSBram Moolenaar  catch /asdf/
702f575adffSBram Moolenaar    seq ..= 'x'
703e8c4abbbSBram Moolenaar  catch ?a\?sdf?
704e8c4abbbSBram Moolenaar    seq ..= 'y'
705f575adffSBram Moolenaar  finally
706f575adffSBram Moolenaar    seq ..= 'c'
707f575adffSBram Moolenaar  endtry
708f575adffSBram Moolenaar  assert_equal('abc', seq)
709257cc5eeSBram Moolenaarenddef
710257cc5eeSBram Moolenaar
711e8c4abbbSBram Moolenaardef Test_try_catch_fails()
712d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
713d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
714d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
715d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
716d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
717d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
718d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
719d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
72013106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
721d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
722585fea7bSBram Moolenaar
723e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
724d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
725e8c4abbbSBram Moolenaarenddef
726e8c4abbbSBram Moolenaar
727006ad48bSBram Moolenaardef Test_throw_vimscript()
728f5be8cdbSBram Moolenaar  # only checks line continuation
729cfcd011fSBram Moolenaar  var lines =<< trim END
730006ad48bSBram Moolenaar      vim9script
731006ad48bSBram Moolenaar      try
732006ad48bSBram Moolenaar        throw 'one'
733006ad48bSBram Moolenaar              .. 'two'
734006ad48bSBram Moolenaar      catch
735006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
736006ad48bSBram Moolenaar      endtry
737006ad48bSBram Moolenaar  END
738006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7391e021e63SBram Moolenaar
7401e021e63SBram Moolenaar  lines =<< trim END
7411e021e63SBram Moolenaar    vim9script
742352134bbSBram Moolenaar    @r = ''
7431e021e63SBram Moolenaar    def Func()
7441e021e63SBram Moolenaar      throw @r
7451e021e63SBram Moolenaar    enddef
7461e021e63SBram Moolenaar    var result = ''
7471e021e63SBram Moolenaar    try
7481e021e63SBram Moolenaar      Func()
7491e021e63SBram Moolenaar    catch /E1129:/
7501e021e63SBram Moolenaar      result = 'caught'
7511e021e63SBram Moolenaar    endtry
7521e021e63SBram Moolenaar    assert_equal('caught', result)
7531e021e63SBram Moolenaar  END
7541e021e63SBram Moolenaar  CheckScriptSuccess(lines)
755006ad48bSBram Moolenaarenddef
756006ad48bSBram Moolenaar
757ed677f55SBram Moolenaardef Test_error_in_nested_function()
758*03dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
759cfcd011fSBram Moolenaar  var lines =<< trim END
760ed677f55SBram Moolenaar      vim9script
761ed677f55SBram Moolenaar      def Func()
762ed677f55SBram Moolenaar        Error()
763ed677f55SBram Moolenaar        g:test_var = 1
764ed677f55SBram Moolenaar      enddef
765ed677f55SBram Moolenaar      func Error() abort
766ed677f55SBram Moolenaar        eval [][0]
767ed677f55SBram Moolenaar      endfunc
768ed677f55SBram Moolenaar      Func()
769ed677f55SBram Moolenaar  END
770ed677f55SBram Moolenaar  g:test_var = 0
771ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
772ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
773ed677f55SBram Moolenaarenddef
774ed677f55SBram Moolenaar
77537c83711SBram Moolenaardef Test_cexpr_vimscript()
776f5be8cdbSBram Moolenaar  # only checks line continuation
77737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
778cfcd011fSBram Moolenaar  var lines =<< trim END
77937c83711SBram Moolenaar      vim9script
78037c83711SBram Moolenaar      cexpr 'File'
78137c83711SBram Moolenaar                .. ' someFile' ..
78237c83711SBram Moolenaar                   ' line 19'
78337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
78437c83711SBram Moolenaar  END
78537c83711SBram Moolenaar  CheckScriptSuccess(lines)
78637c83711SBram Moolenaar  set errorformat&
78737c83711SBram Moolenaarenddef
78837c83711SBram Moolenaar
789c9edd6b5SBram Moolenaardef Test_statusline_syntax()
790c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
791cfcd011fSBram Moolenaar  var lines =<< trim END
792c9edd6b5SBram Moolenaar      vim9script
793c9edd6b5SBram Moolenaar      func g:Status()
794c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
795c9edd6b5SBram Moolenaar      endfunc
796c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
797c9edd6b5SBram Moolenaar      redrawstatus
798c9edd6b5SBram Moolenaar      set laststatus statusline=
799c9edd6b5SBram Moolenaar  END
800c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
801c9edd6b5SBram Moolenaarenddef
802c9edd6b5SBram Moolenaar
803b209750bSBram Moolenaardef Test_list_vimscript()
804b209750bSBram Moolenaar  # checks line continuation and comments
805cfcd011fSBram Moolenaar  var lines =<< trim END
806b209750bSBram Moolenaar      vim9script
807cfcd011fSBram Moolenaar      var mylist = [
808b209750bSBram Moolenaar            'one',
809b209750bSBram Moolenaar            # comment
810b209750bSBram Moolenaar            'two', # empty line follows
811b209750bSBram Moolenaar
812b209750bSBram Moolenaar            'three',
813b209750bSBram Moolenaar            ]
814b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
815b209750bSBram Moolenaar  END
816b209750bSBram Moolenaar  CheckScriptSuccess(lines)
81766250c93SBram Moolenaar
81866250c93SBram Moolenaar  # check all lines from heredoc are kept
81966250c93SBram Moolenaar  lines =<< trim END
82066250c93SBram Moolenaar      # comment 1
82166250c93SBram Moolenaar      two
82266250c93SBram Moolenaar      # comment 3
82366250c93SBram Moolenaar
82466250c93SBram Moolenaar      five
82566250c93SBram Moolenaar      # comment 6
82666250c93SBram Moolenaar  END
82766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
8284bce26bbSBram Moolenaar
8294bce26bbSBram Moolenaar  lines =<< trim END
8304bce26bbSBram Moolenaar    [{
8314bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
8324bce26bbSBram Moolenaar  END
8334bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
834b209750bSBram Moolenaarenddef
835b209750bSBram Moolenaar
8362a1381c3SBram Moolenaarif has('channel')
83740ee466cSBram Moolenaar  let someJob = test_null_job()
83840ee466cSBram Moolenaar
83940ee466cSBram Moolenaar  def FuncWithError()
84040ee466cSBram Moolenaar    echomsg g:someJob
84140ee466cSBram Moolenaar  enddef
84240ee466cSBram Moolenaar
84340ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
84440ee466cSBram Moolenaar    try
84540ee466cSBram Moolenaar      call FuncWithError()
84640ee466cSBram Moolenaar    catch
84740ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
84840ee466cSBram Moolenaar    endtry
84940ee466cSBram Moolenaar  endfunc
8502a1381c3SBram Moolenaarendif
85140ee466cSBram Moolenaar
8528a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8538a7d6542SBram Moolenaar  vim9script
854cfcd011fSBram Moolenaar  var name: string = 'bob'
8558a7d6542SBram Moolenaar  def Concat(arg: string): string
8568a7d6542SBram Moolenaar    return name .. arg
8578a7d6542SBram Moolenaar  enddef
858227a69deSBram Moolenaar  g:result = Concat('bie')
859227a69deSBram Moolenaar  g:localname = name
8608a7d6542SBram Moolenaar
8618a7d6542SBram Moolenaar  export const CONST = 1234
862cfcd011fSBram Moolenaar  export var exported = 9876
863cfcd011fSBram Moolenaar  export var exp_name = 'John'
8648a7d6542SBram Moolenaar  export def Exported(): string
8658a7d6542SBram Moolenaar    return 'Exported'
8668a7d6542SBram Moolenaar  enddef
8678a7d6542SBram MoolenaarEND
8688a7d6542SBram Moolenaar
869b3ca9824SBram Moolenaardef Undo_export_script_lines()
870b3ca9824SBram Moolenaar  unlet g:result
871b3ca9824SBram Moolenaar  unlet g:localname
872b3ca9824SBram Moolenaarenddef
873b3ca9824SBram Moolenaar
8745269bd2aSBram Moolenaardef Test_vim9_import_export()
875cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
8768a7d6542SBram Moolenaar    vim9script
8778a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8788a7d6542SBram Moolenaar    g:imported = exported
8796e587dcbSBram Moolenaar    exported += 3
8806e587dcbSBram Moolenaar    g:imported_added = exported
8818a7d6542SBram Moolenaar    g:imported_func = Exported()
8826e587dcbSBram Moolenaar
88340f4f7a4SBram Moolenaar    def GetExported(): string
884e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
88540f4f7a4SBram Moolenaar      return local_dict.ref()
88640f4f7a4SBram Moolenaar    enddef
88740f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
88840f4f7a4SBram Moolenaar
8896e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8906e587dcbSBram Moolenaar    g:imported_name = exp_name
8916e587dcbSBram Moolenaar    exp_name ..= ' Doe'
8926e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
8935381c7a1SBram Moolenaar    g:imported_later = exported
8948a7d6542SBram Moolenaar  END
8958a7d6542SBram Moolenaar
8968a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
8978a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
8988a7d6542SBram Moolenaar
8998a7d6542SBram Moolenaar  source Ximport.vim
9008a7d6542SBram Moolenaar
9018a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9028a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9038a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9046e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9055381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9068a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
90740f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9086e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9096e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9108a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9118a7d6542SBram Moolenaar
912b3ca9824SBram Moolenaar  Undo_export_script_lines()
9138a7d6542SBram Moolenaar  unlet g:imported
9146e587dcbSBram Moolenaar  unlet g:imported_added
9155381c7a1SBram Moolenaar  unlet g:imported_later
9168a7d6542SBram Moolenaar  unlet g:imported_func
9176e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9188a7d6542SBram Moolenaar  delete('Ximport.vim')
919f2d5c240SBram Moolenaar
9201c991144SBram Moolenaar  # similar, with line breaks
921cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9221c991144SBram Moolenaar    vim9script
9231c991144SBram Moolenaar    import {
9241c991144SBram Moolenaar        exported,
9251c991144SBram Moolenaar        Exported,
9261c991144SBram Moolenaar        }
9271c991144SBram Moolenaar        from
9281c991144SBram Moolenaar        './Xexport.vim'
9291c991144SBram Moolenaar    g:imported = exported
9301c991144SBram Moolenaar    exported += 5
9311c991144SBram Moolenaar    g:imported_added = exported
9321c991144SBram Moolenaar    g:imported_func = Exported()
9331c991144SBram Moolenaar  END
9341c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9351c991144SBram Moolenaar  source Ximport_lbr.vim
9361c991144SBram Moolenaar
9371c991144SBram Moolenaar  assert_equal(9876, g:imported)
9381c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9391c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9401c991144SBram Moolenaar
9411c991144SBram Moolenaar  # exported script not sourced again
9421c991144SBram Moolenaar  assert_false(exists('g:result'))
9431c991144SBram Moolenaar  unlet g:imported
9441c991144SBram Moolenaar  unlet g:imported_added
9451c991144SBram Moolenaar  unlet g:imported_func
9461c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9471c991144SBram Moolenaar
9481c991144SBram Moolenaar  # import inside :def function
949cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
9505381c7a1SBram Moolenaar    vim9script
9515381c7a1SBram Moolenaar    def ImportInDef()
9525381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9535381c7a1SBram Moolenaar      g:imported = exported
9545381c7a1SBram Moolenaar      exported += 7
9555381c7a1SBram Moolenaar      g:imported_added = exported
9565381c7a1SBram Moolenaar    enddef
9575381c7a1SBram Moolenaar    ImportInDef()
9585381c7a1SBram Moolenaar  END
9595381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9605381c7a1SBram Moolenaar  source Ximport2.vim
961f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9625381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9635381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9645381c7a1SBram Moolenaar  unlet g:imported
9655381c7a1SBram Moolenaar  unlet g:imported_added
9665381c7a1SBram Moolenaar  delete('Ximport2.vim')
9675381c7a1SBram Moolenaar
968cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
969f2d5c240SBram Moolenaar    vim9script
970f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
971f2d5c240SBram Moolenaar    def UseExport()
972f2d5c240SBram Moolenaar      g:imported = Export.exported
973f2d5c240SBram Moolenaar    enddef
974f2d5c240SBram Moolenaar    UseExport()
975f2d5c240SBram Moolenaar  END
976f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
977f2d5c240SBram Moolenaar  source Ximport.vim
9785381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
979f2d5c240SBram Moolenaar
980cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
981599c89c8SBram Moolenaar    vim9script
982599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
983599c89c8SBram Moolenaar    def Func()
984cfcd011fSBram Moolenaar      var dummy = 1
985cfcd011fSBram Moolenaar      var imported = Export + dummy
986599c89c8SBram Moolenaar    enddef
987822ba247SBram Moolenaar    defcompile
988599c89c8SBram Moolenaar  END
989599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
99044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
991599c89c8SBram Moolenaar
992cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
993599c89c8SBram Moolenaar    vim9script
994599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
995599c89c8SBram Moolenaar    def Func()
996cfcd011fSBram Moolenaar      var imported = Export . exported
997599c89c8SBram Moolenaar    enddef
998822ba247SBram Moolenaar    defcompile
999599c89c8SBram Moolenaar  END
1000599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
100144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1002599c89c8SBram Moolenaar
1003a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1004a6294955SBram Moolenaar    vim9script
1005a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1006a6294955SBram Moolenaar    var some = 'other'
1007a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1008a6294955SBram Moolenaar    defcompile
1009a6294955SBram Moolenaar  END
1010a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1011a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1012a6294955SBram Moolenaar
1013cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1014599c89c8SBram Moolenaar    vim9script
1015599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1016599c89c8SBram Moolenaar    def Func()
1017cfcd011fSBram Moolenaar      var imported = Export.
1018599c89c8SBram Moolenaar    enddef
1019822ba247SBram Moolenaar    defcompile
1020599c89c8SBram Moolenaar  END
1021599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
102244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1023599c89c8SBram Moolenaar
1024cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10251c991144SBram Moolenaar    vim9script
10261c991144SBram Moolenaar    import *
10271c991144SBram Moolenaar        as Export
10281c991144SBram Moolenaar        from
10291c991144SBram Moolenaar        './Xexport.vim'
10301c991144SBram Moolenaar    def UseExport()
10311c991144SBram Moolenaar      g:imported = Export.exported
10321c991144SBram Moolenaar    enddef
10331c991144SBram Moolenaar    UseExport()
10341c991144SBram Moolenaar  END
10351c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10361c991144SBram Moolenaar  source Ximport.vim
10371c991144SBram Moolenaar  assert_equal(9883, g:imported)
10381c991144SBram Moolenaar
1039cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1040f2d5c240SBram Moolenaar    vim9script
1041f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1042f2d5c240SBram Moolenaar  END
1043f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
104444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1045f2d5c240SBram Moolenaar
1046f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1047cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1048fa29c8abSBram Moolenaar    vim9script
1049fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1050fa29c8abSBram Moolenaar  END
1051fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
105244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1053fa29c8abSBram Moolenaar
1054f5be8cdbSBram Moolenaar  # try to import something that is already defined
1055cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
10565269bd2aSBram Moolenaar    vim9script
1057cfcd011fSBram Moolenaar    var exported = 'something'
10585269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10595269bd2aSBram Moolenaar  END
10605269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
106144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10625269bd2aSBram Moolenaar
1063f5be8cdbSBram Moolenaar  # try to import something that is already defined
10645269bd2aSBram Moolenaar  import_already_defined =<< trim END
10655269bd2aSBram Moolenaar    vim9script
1066cfcd011fSBram Moolenaar    var exported = 'something'
10675269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10685269bd2aSBram Moolenaar  END
10695269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
107044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10715269bd2aSBram Moolenaar
1072f5be8cdbSBram Moolenaar  # try to import something that is already defined
10735269bd2aSBram Moolenaar  import_already_defined =<< trim END
10745269bd2aSBram Moolenaar    vim9script
1075cfcd011fSBram Moolenaar    var exported = 'something'
10765269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10775269bd2aSBram Moolenaar  END
10785269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
107944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10805269bd2aSBram Moolenaar
1081918a4249SBram Moolenaar  # try changing an imported const
1082918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1083918a4249SBram Moolenaar    vim9script
1084918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1085918a4249SBram Moolenaar    def Assign()
1086918a4249SBram Moolenaar      CONST = 987
1087918a4249SBram Moolenaar    enddef
1088918a4249SBram Moolenaar    defcompile
1089918a4249SBram Moolenaar  END
1090918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1091918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1092918a4249SBram Moolenaar
1093f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1094cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1095fa29c8abSBram Moolenaar    vim9script
1096fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1097fa29c8abSBram Moolenaar  END
1098fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
109944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1100fa29c8abSBram Moolenaar
1101cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1102fa29c8abSBram Moolenaar    vim9script
1103fa29c8abSBram Moolenaar    import name './Xexport.vim'
1104fa29c8abSBram Moolenaar  END
1105fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
110644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1107fa29c8abSBram Moolenaar
1108cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1109fa29c8abSBram Moolenaar    vim9script
1110fa29c8abSBram Moolenaar    import name from Xexport.vim
1111fa29c8abSBram Moolenaar  END
1112fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
111344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1114fa29c8abSBram Moolenaar
1115cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1116fa29c8abSBram Moolenaar    vim9script
1117fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1118fa29c8abSBram Moolenaar  END
1119fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
112044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1121fa29c8abSBram Moolenaar
1122cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1123fa29c8abSBram Moolenaar    vim9script
1124fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1125fa29c8abSBram Moolenaar  END
11265269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
112744d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1128fa29c8abSBram Moolenaar
1129f2d5c240SBram Moolenaar  delete('Ximport.vim')
11305269bd2aSBram Moolenaar  delete('Ximport3.vim')
11318a7d6542SBram Moolenaar  delete('Xexport.vim')
11328a7d6542SBram Moolenaar
1133f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1134750802b5SBram Moolenaar  set cpo&vi
1135cfcd011fSBram Moolenaar  var cpo_before = &cpo
1136cfcd011fSBram Moolenaar  var lines =<< trim END
1137750802b5SBram Moolenaar    vim9script
1138750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1139750802b5SBram Moolenaar  END
1140750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1141750802b5SBram Moolenaar  source Xvim9_script
1142750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1143750802b5SBram Moolenaar  set cpo&vim
1144750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1145750802b5SBram Moolenaar  delete('Xvim9_script')
1146750802b5SBram Moolenaarenddef
1147750802b5SBram Moolenaar
1148803af686SBram Moolenaarfunc g:Trigger()
1149803af686SBram Moolenaar  source Ximport.vim
1150803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1151803af686SBram Moolenaarendfunc
1152803af686SBram Moolenaar
1153803af686SBram Moolenaardef Test_import_export_expr_map()
1154803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1155cfcd011fSBram Moolenaar  var export_lines =<< trim END
1156803af686SBram Moolenaar    vim9script
1157803af686SBram Moolenaar    export def That(): string
1158803af686SBram Moolenaar      return 'yes'
1159803af686SBram Moolenaar    enddef
1160803af686SBram Moolenaar  END
1161803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1162803af686SBram Moolenaar
1163cfcd011fSBram Moolenaar  var import_lines =<< trim END
1164803af686SBram Moolenaar    vim9script
1165803af686SBram Moolenaar    import That from './Xexport_that.vim'
1166803af686SBram Moolenaar    assert_equal('yes', That())
1167803af686SBram Moolenaar  END
1168803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1169803af686SBram Moolenaar
1170803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1171803af686SBram Moolenaar  feedkeys('trigger', "xt")
1172803af686SBram Moolenaar
1173730b2483SBram Moolenaar  delete('Xexport_that.vim')
1174803af686SBram Moolenaar  delete('Ximport.vim')
1175803af686SBram Moolenaar  nunmap trigger
1176803af686SBram Moolenaarenddef
1177803af686SBram Moolenaar
11788e1986e3SBram Moolenaardef Test_import_in_filetype()
11798e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
11808e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1181cfcd011fSBram Moolenaar  var export_lines =<< trim END
11828e1986e3SBram Moolenaar    vim9script
1183cfcd011fSBram Moolenaar    export var That = 'yes'
11848e1986e3SBram Moolenaar  END
1185730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
11868e1986e3SBram Moolenaar
1187cfcd011fSBram Moolenaar  var import_lines =<< trim END
11888e1986e3SBram Moolenaar    vim9script
1189730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
11908e1986e3SBram Moolenaar    assert_equal('yes', That)
11918e1986e3SBram Moolenaar    g:did_load_mytpe = 1
11928e1986e3SBram Moolenaar  END
11938e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
11948e1986e3SBram Moolenaar
1195cfcd011fSBram Moolenaar  var save_rtp = &rtp
11968e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
11978e1986e3SBram Moolenaar
11988e1986e3SBram Moolenaar  filetype plugin on
11998e1986e3SBram Moolenaar  copen
12008e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
12018e1986e3SBram Moolenaar
12028e1986e3SBram Moolenaar  quit!
1203730b2483SBram Moolenaar  delete('Xexport_ft.vim')
12048e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
12058e1986e3SBram Moolenaar  &rtp = save_rtp
12068e1986e3SBram Moolenaarenddef
12078e1986e3SBram Moolenaar
1208efa94447SBram Moolenaardef Test_use_import_in_mapping()
1209cfcd011fSBram Moolenaar  var lines =<< trim END
1210efa94447SBram Moolenaar      vim9script
1211efa94447SBram Moolenaar      export def Funcx()
1212efa94447SBram Moolenaar        g:result = 42
1213efa94447SBram Moolenaar      enddef
1214efa94447SBram Moolenaar  END
1215efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1216efa94447SBram Moolenaar  lines =<< trim END
1217efa94447SBram Moolenaar      vim9script
1218efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1219b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1220efa94447SBram Moolenaar  END
1221efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1222efa94447SBram Moolenaar
1223efa94447SBram Moolenaar  source Xmapscript.vim
1224b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1225efa94447SBram Moolenaar  assert_equal(42, g:result)
1226efa94447SBram Moolenaar
1227efa94447SBram Moolenaar  unlet g:result
1228efa94447SBram Moolenaar  delete('XsomeExport.vim')
1229efa94447SBram Moolenaar  delete('Xmapscript.vim')
1230b3ca9824SBram Moolenaar  nunmap <F3>
1231efa94447SBram Moolenaarenddef
1232efa94447SBram Moolenaar
1233750802b5SBram Moolenaardef Test_vim9script_fails()
12348a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12358a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1236cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
12379721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1238cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1239750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1240750802b5SBram Moolenaar
1241cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1242c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1243c785b9a7SBram Moolenaar
1244e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1245e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
12468a7d6542SBram Moolenaarenddef
12478a7d6542SBram Moolenaar
1248f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1249101f4810SBram Moolenaar  CheckRunVimInTerminal
1250101f4810SBram Moolenaar
12519bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1252c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
12539bb3eb3eSBram Moolenaarendfunc
12549bb3eb3eSBram Moolenaar
1255c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1256cfcd011fSBram Moolenaar  var export =<< trim END
1257101f4810SBram Moolenaar    vim9script
1258101f4810SBram Moolenaar    export def Foo(): number
1259101f4810SBram Moolenaar        return 0
1260101f4810SBram Moolenaar    enddef
1261101f4810SBram Moolenaar  END
1262730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1263101f4810SBram Moolenaar
1264e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
12659bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
12662949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1267101f4810SBram Moolenaar
1268730b2483SBram Moolenaar  delete('XexportCmd.vim')
12699bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
12709bb3eb3eSBram Moolenaarenddef
1271101f4810SBram Moolenaar
12722b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
12732b32700dSBram Moolenaar  var lines =<< trim END
1274a6294955SBram Moolenaar    vim9script
1275a6294955SBram Moolenaar    export var exported = 'thexport'
1276a6294955SBram Moolenaar  END
1277a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1278a6294955SBram Moolenaar  lines =<< trim END
12792b32700dSBram Moolenaar    vim9script noclear
12802b32700dSBram Moolenaar    g:loadCount += 1
12812b32700dSBram Moolenaar    var s:reloaded = 'init'
1282a6294955SBram Moolenaar    import exported from './XExportReload'
12832b32700dSBram Moolenaar
12842b32700dSBram Moolenaar    def Again(): string
12852b32700dSBram Moolenaar      return 'again'
12862b32700dSBram Moolenaar    enddef
12872b32700dSBram Moolenaar
12882b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
12892b32700dSBram Moolenaar    var s:loaded = true
12902b32700dSBram Moolenaar
12912b32700dSBram Moolenaar    var s:notReloaded = 'yes'
12922b32700dSBram Moolenaar    s:reloaded = 'first'
12932b32700dSBram Moolenaar    def g:Values(): list<string>
1294a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
12952b32700dSBram Moolenaar    enddef
12962b32700dSBram Moolenaar
12972b32700dSBram Moolenaar    def Once(): string
12982b32700dSBram Moolenaar      return 'once'
12992b32700dSBram Moolenaar    enddef
13002b32700dSBram Moolenaar  END
13012b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
13022b32700dSBram Moolenaar  g:loadCount = 0
13032b32700dSBram Moolenaar  source XReloaded
13042b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1305a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
13062b32700dSBram Moolenaar  source XReloaded
13072b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1308a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13092b32700dSBram Moolenaar  source XReloaded
13102b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1311a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13122b32700dSBram Moolenaar
131348e11c10SBram Moolenaar  delete('XReloaded')
1314a6294955SBram Moolenaar  delete('XExportReload')
13152b32700dSBram Moolenaar  delfunc g:Values
13162b32700dSBram Moolenaar  unlet g:loadCount
13172b32700dSBram Moolenaarenddef
13182b32700dSBram Moolenaar
13194c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1320cfcd011fSBram Moolenaar  var lines =<< trim END
13218a7d6542SBram Moolenaar    vim9script
13228a7d6542SBram Moolenaar    const var = ''
1323cfcd011fSBram Moolenaar    var valone = 1234
13248a7d6542SBram Moolenaar    def MyFunc(arg: string)
13258a7d6542SBram Moolenaar       valone = 5678
13268a7d6542SBram Moolenaar    enddef
13278a7d6542SBram Moolenaar  END
1328cfcd011fSBram Moolenaar  var morelines =<< trim END
1329cfcd011fSBram Moolenaar    var valtwo = 222
13308a7d6542SBram Moolenaar    export def GetValtwo(): number
13318a7d6542SBram Moolenaar      return valtwo
13328a7d6542SBram Moolenaar    enddef
13338a7d6542SBram Moolenaar  END
133403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13358a7d6542SBram Moolenaar  source Xreload.vim
13368a7d6542SBram Moolenaar  source Xreload.vim
13378a7d6542SBram Moolenaar  source Xreload.vim
13388a7d6542SBram Moolenaar
1339cfcd011fSBram Moolenaar  var testlines =<< trim END
13408a7d6542SBram Moolenaar    vim9script
13418a7d6542SBram Moolenaar    def TheFunc()
13428a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13438a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13448a7d6542SBram Moolenaar    enddef
13458a7d6542SBram Moolenaar    TheFunc()
13468a7d6542SBram Moolenaar  END
13478a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13488a7d6542SBram Moolenaar  source Ximport.vim
13498a7d6542SBram Moolenaar
1350f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1351f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
13528a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13538a7d6542SBram Moolenaar  source Ximport.vim
13548a7d6542SBram Moolenaar
1355f5be8cdbSBram Moolenaar  # cannot declare a var twice
13568a7d6542SBram Moolenaar  lines =<< trim END
13578a7d6542SBram Moolenaar    vim9script
1358cfcd011fSBram Moolenaar    var valone = 1234
1359cfcd011fSBram Moolenaar    var valone = 5678
13608a7d6542SBram Moolenaar  END
13618a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
136244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
13638a7d6542SBram Moolenaar
13648a7d6542SBram Moolenaar  delete('Xreload.vim')
13658a7d6542SBram Moolenaar  delete('Ximport.vim')
13668a7d6542SBram Moolenaarenddef
13678a7d6542SBram Moolenaar
136807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
136907a65d26SBram Moolenaar" compiled function using that variable must fail.
137007a65d26SBram Moolenaardef Test_script_reload_change_type()
137107a65d26SBram Moolenaar  var lines =<< trim END
137207a65d26SBram Moolenaar    vim9script noclear
137307a65d26SBram Moolenaar    var str = 'string'
137407a65d26SBram Moolenaar    def g:GetStr(): string
137507a65d26SBram Moolenaar      return str .. 'xxx'
137607a65d26SBram Moolenaar    enddef
137707a65d26SBram Moolenaar  END
137807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
137907a65d26SBram Moolenaar  source Xreload.vim
138007a65d26SBram Moolenaar  echo g:GetStr()
138107a65d26SBram Moolenaar
138207a65d26SBram Moolenaar  lines =<< trim END
138307a65d26SBram Moolenaar    vim9script noclear
138407a65d26SBram Moolenaar    var str = 1234
138507a65d26SBram Moolenaar  END
138607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
138707a65d26SBram Moolenaar  source Xreload.vim
138807a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
138907a65d26SBram Moolenaar
139007a65d26SBram Moolenaar  delfunc g:GetStr
139107a65d26SBram Moolenaar  delete('Xreload.vim')
139207a65d26SBram Moolenaarenddef
139307a65d26SBram Moolenaar
139495006e3dSBram Moolenaardef s:RetSome(): string
139595006e3dSBram Moolenaar  return 'some'
139695006e3dSBram Moolenaarenddef
139795006e3dSBram Moolenaar
1398fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1399fe465a01SBram Moolenaar" script-local name.
1400fe465a01SBram Moolenaardef Test_vim9script_funcref()
1401cfcd011fSBram Moolenaar  var sortlines =<< trim END
1402fe465a01SBram Moolenaar      vim9script
1403fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1404bed36b93SBram Moolenaar        return i2 - i1
1405fe465a01SBram Moolenaar      enddef
1406fe465a01SBram Moolenaar
1407fe465a01SBram Moolenaar      export def FastSort(): list<number>
1408fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1409fe465a01SBram Moolenaar      enddef
1410fe465a01SBram Moolenaar  END
1411fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1412fe465a01SBram Moolenaar
1413cfcd011fSBram Moolenaar  var lines =<< trim END
1414fe465a01SBram Moolenaar    vim9script
1415fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1416fe465a01SBram Moolenaar    def Test()
1417fe465a01SBram Moolenaar      g:result = FastSort()
1418fe465a01SBram Moolenaar    enddef
1419fe465a01SBram Moolenaar    Test()
1420fe465a01SBram Moolenaar  END
1421fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1422fe465a01SBram Moolenaar
1423fe465a01SBram Moolenaar  source Xscript.vim
1424fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1425fe465a01SBram Moolenaar
1426fe465a01SBram Moolenaar  unlet g:result
1427fe465a01SBram Moolenaar  delete('Xsort.vim')
1428fe465a01SBram Moolenaar  delete('Xscript.vim')
142995006e3dSBram Moolenaar
1430cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
143195006e3dSBram Moolenaar  assert_equal('some', Funcref())
1432fe465a01SBram Moolenaarenddef
1433fe465a01SBram Moolenaar
1434601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1435601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1436601e76acSBram Moolenaar" function reference.
1437c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1438cfcd011fSBram Moolenaar  var filterLines =<< trim END
1439c620c055SBram Moolenaar    vim9script
1440c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1441c620c055SBram Moolenaar      return idx % 2 == 1
1442c620c055SBram Moolenaar    enddef
1443c620c055SBram Moolenaar    export def FastFilter(): list<number>
1444c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1445c620c055SBram Moolenaar    enddef
1446601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1447601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1448601e76acSBram Moolenaar    enddef
1449c620c055SBram Moolenaar  END
1450c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1451c620c055SBram Moolenaar
1452cfcd011fSBram Moolenaar  var lines =<< trim END
1453c620c055SBram Moolenaar    vim9script
1454601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1455c620c055SBram Moolenaar    def Test()
1456cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1457c620c055SBram Moolenaar    enddef
1458c620c055SBram Moolenaar    Test()
1459601e76acSBram Moolenaar    def TestDirect()
1460cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1461601e76acSBram Moolenaar    enddef
1462601e76acSBram Moolenaar    TestDirect()
1463c620c055SBram Moolenaar  END
1464601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1465c620c055SBram Moolenaar  delete('Xfilter.vim')
1466c620c055SBram Moolenaarenddef
1467c620c055SBram Moolenaar
14684c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1469cfcd011fSBram Moolenaar  var first_lines =<< trim END
14704c17ad94SBram Moolenaar    vim9script
14714c17ad94SBram Moolenaar    def FuncYes(): string
14724c17ad94SBram Moolenaar      return 'yes'
14734c17ad94SBram Moolenaar    enddef
14744c17ad94SBram Moolenaar  END
1475cfcd011fSBram Moolenaar  var withno_lines =<< trim END
14764c17ad94SBram Moolenaar    def FuncNo(): string
14774c17ad94SBram Moolenaar      return 'no'
14784c17ad94SBram Moolenaar    enddef
14794c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
14804c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
14814c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
148203afdcf1SBram Moolenaar    enddef
148303afdcf1SBram Moolenaar  END
1484cfcd011fSBram Moolenaar  var nono_lines =<< trim END
148503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
148603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
148744d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
14884c17ad94SBram Moolenaar    enddef
14894c17ad94SBram Moolenaar  END
14904c17ad94SBram Moolenaar
14914c17ad94SBram Moolenaar  # FuncNo() is defined
149203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14934c17ad94SBram Moolenaar  source Xreloaded.vim
14944c17ad94SBram Moolenaar  g:DoCheck(true)
14954c17ad94SBram Moolenaar
14964c17ad94SBram Moolenaar  # FuncNo() is not redefined
149703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
14984c17ad94SBram Moolenaar  source Xreloaded.vim
14995082471fSBram Moolenaar  g:DoCheck(false)
15004c17ad94SBram Moolenaar
15014c17ad94SBram Moolenaar  # FuncNo() is back
150203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15034c17ad94SBram Moolenaar  source Xreloaded.vim
15045082471fSBram Moolenaar  g:DoCheck(false)
15054c17ad94SBram Moolenaar
15064c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15074c17ad94SBram Moolenaarenddef
15084c17ad94SBram Moolenaar
150989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
151089483d40SBram Moolenaar  # write the script with a script-local variable
1511cfcd011fSBram Moolenaar  var lines =<< trim END
151289483d40SBram Moolenaar    vim9script
1513cfcd011fSBram Moolenaar    var name = 'string'
151489483d40SBram Moolenaar  END
151589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
151689483d40SBram Moolenaar  source XreloadVar.vim
151789483d40SBram Moolenaar
151889483d40SBram Moolenaar  # now write the script using the same variable locally - works
151989483d40SBram Moolenaar  lines =<< trim END
152089483d40SBram Moolenaar    vim9script
152189483d40SBram Moolenaar    def Func()
1522cfcd011fSBram Moolenaar      var name = 'string'
152389483d40SBram Moolenaar    enddef
152489483d40SBram Moolenaar  END
152589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
152689483d40SBram Moolenaar  source XreloadVar.vim
152789483d40SBram Moolenaar
152889483d40SBram Moolenaar  delete('XreloadVar.vim')
152989483d40SBram Moolenaarenddef
153089483d40SBram Moolenaar
15318a7d6542SBram Moolenaardef Test_import_absolute()
1532cfcd011fSBram Moolenaar  var import_lines = [
1533e6085c53SBram Moolenaar        'vim9script',
1534e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1535e6085c53SBram Moolenaar        'def UseExported()',
1536e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1537e6085c53SBram Moolenaar        '  exported = 8888',
1538e6085c53SBram Moolenaar        '  g:imported_after = exported',
1539e6085c53SBram Moolenaar        'enddef',
1540e6085c53SBram Moolenaar        'UseExported()',
1541e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1542e6085c53SBram Moolenaar        ]
15438a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15448a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15458a7d6542SBram Moolenaar
15468a7d6542SBram Moolenaar  source Ximport_abs.vim
15478a7d6542SBram Moolenaar
15488a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15494e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1550fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1551fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1552fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1553fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1554fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1555fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1556fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1557fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1558fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1559fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1560e6085c53SBram Moolenaar        g:import_disassembled)
1561b3ca9824SBram Moolenaar
1562b3ca9824SBram Moolenaar  Undo_export_script_lines()
15638a7d6542SBram Moolenaar  unlet g:imported_abs
15644e12a5dfSBram Moolenaar  unlet g:import_disassembled
15658a7d6542SBram Moolenaar
15668a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15678a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
15688a7d6542SBram Moolenaarenddef
15698a7d6542SBram Moolenaar
15708a7d6542SBram Moolenaardef Test_import_rtp()
1571cfcd011fSBram Moolenaar  var import_lines = [
1572e6085c53SBram Moolenaar        'vim9script',
1573e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1574e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1575e6085c53SBram Moolenaar        ]
15768a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
15778a7d6542SBram Moolenaar  mkdir('import')
15788a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
15798a7d6542SBram Moolenaar
1580cfcd011fSBram Moolenaar  var save_rtp = &rtp
15818a7d6542SBram Moolenaar  &rtp = getcwd()
15828a7d6542SBram Moolenaar  source Ximport_rtp.vim
15838a7d6542SBram Moolenaar  &rtp = save_rtp
15848a7d6542SBram Moolenaar
15858a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
15868a7d6542SBram Moolenaar
1587b3ca9824SBram Moolenaar  Undo_export_script_lines()
1588b3ca9824SBram Moolenaar  unlet g:imported_rtp
15898a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
159089483d40SBram Moolenaar  delete('import', 'rf')
15918a7d6542SBram Moolenaarenddef
15928a7d6542SBram Moolenaar
159325e0f586SBram Moolenaardef Test_import_compile_error()
1594cfcd011fSBram Moolenaar  var export_lines = [
159525e0f586SBram Moolenaar        'vim9script',
159625e0f586SBram Moolenaar        'export def ExpFunc(): string',
159725e0f586SBram Moolenaar        '  return notDefined',
159825e0f586SBram Moolenaar        'enddef',
159925e0f586SBram Moolenaar        ]
160025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
160125e0f586SBram Moolenaar
1602cfcd011fSBram Moolenaar  var import_lines = [
160325e0f586SBram Moolenaar        'vim9script',
160425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
160525e0f586SBram Moolenaar        'def ImpFunc()',
160625e0f586SBram Moolenaar        '  echo ExpFunc()',
160725e0f586SBram Moolenaar        'enddef',
160825e0f586SBram Moolenaar        'defcompile',
160925e0f586SBram Moolenaar        ]
161025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
161125e0f586SBram Moolenaar
161225e0f586SBram Moolenaar  try
161325e0f586SBram Moolenaar    source Ximport.vim
161425e0f586SBram Moolenaar  catch /E1001/
1615f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
16167707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
161725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
161825e0f586SBram Moolenaar  endtry
161925e0f586SBram Moolenaar
162025e0f586SBram Moolenaar  delete('Xexported.vim')
162125e0f586SBram Moolenaar  delete('Ximport.vim')
162225e0f586SBram Moolenaarenddef
162325e0f586SBram Moolenaar
1624c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1625cfcd011fSBram Moolenaar  var lines = [
1626c4ce36d4SBram Moolenaar        'vim9script',
1627c4ce36d4SBram Moolenaar        'def Func()',
1628c4ce36d4SBram Moolenaar        '  eval [][0]',
1629c4ce36d4SBram Moolenaar        'enddef',
1630c4ce36d4SBram Moolenaar        'Func()',
1631c4ce36d4SBram Moolenaar        ]
1632c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1633c4ce36d4SBram Moolenaar
1634c4ce36d4SBram Moolenaar  for count in range(3)
1635c4ce36d4SBram Moolenaar    try
1636c4ce36d4SBram Moolenaar      source Xtestscript.vim
1637c4ce36d4SBram Moolenaar    catch /E684/
1638c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1639c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1640c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1641c4ce36d4SBram Moolenaar    endtry
1642c4ce36d4SBram Moolenaar  endfor
1643c4ce36d4SBram Moolenaar
1644c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1645c4ce36d4SBram Moolenaarenddef
1646c4ce36d4SBram Moolenaar
1647eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1648cfcd011fSBram Moolenaar  var export_lines =<< trim END
1649eef2102eSBram Moolenaar      vim9script
1650eef2102eSBram Moolenaar      export def Func()
1651eef2102eSBram Moolenaar        echo 'imported'
1652eef2102eSBram Moolenaar      enddef
1653eef2102eSBram Moolenaar  END
1654eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1655eef2102eSBram Moolenaar
1656cfcd011fSBram Moolenaar  var lines =<< trim END
1657eef2102eSBram Moolenaar    vim9script
1658eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1659eef2102eSBram Moolenaar    def Func()
1660eef2102eSBram Moolenaar      echo 'local to function'
1661eef2102eSBram Moolenaar    enddef
1662eef2102eSBram Moolenaar  END
1663eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1664eef2102eSBram Moolenaar
1665eef2102eSBram Moolenaar  lines =<< trim END
1666eef2102eSBram Moolenaar    vim9script
1667eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1668eef2102eSBram Moolenaar    def Outer()
1669eef2102eSBram Moolenaar      def Func()
1670eef2102eSBram Moolenaar        echo 'local to function'
1671eef2102eSBram Moolenaar      enddef
1672eef2102eSBram Moolenaar    enddef
1673eef2102eSBram Moolenaar    defcompile
1674eef2102eSBram Moolenaar  END
1675eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1676eef2102eSBram Moolenaar
1677eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1678eef2102eSBram Moolenaarenddef
1679eef2102eSBram Moolenaar
1680b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1681cfcd011fSBram Moolenaar  var lines =<< trim END
1682b9a2cac3SBram Moolenaar    vim9script
1683b9a2cac3SBram Moolenaar    def Func()
1684b9a2cac3SBram Moolenaar      echo 'one'
1685b9a2cac3SBram Moolenaar    enddef
1686b9a2cac3SBram Moolenaar    def Func()
1687b9a2cac3SBram Moolenaar      echo 'two'
1688b9a2cac3SBram Moolenaar    enddef
1689b9a2cac3SBram Moolenaar  END
1690b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1691fa211f3cSBram Moolenaar
1692fa211f3cSBram Moolenaar  lines =<< trim END
1693fa211f3cSBram Moolenaar    vim9script
1694fa211f3cSBram Moolenaar    def Foo(): string
1695fa211f3cSBram Moolenaar      return 'foo'
1696fa211f3cSBram Moolenaar      enddef
1697fa211f3cSBram Moolenaar    def Func()
1698cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1699fa211f3cSBram Moolenaar    enddef
1700fa211f3cSBram Moolenaar    defcompile
1701fa211f3cSBram Moolenaar  END
1702fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1703b9a2cac3SBram Moolenaarenddef
1704b9a2cac3SBram Moolenaar
17058a7d6542SBram Moolenaardef Test_fixed_size_list()
1706f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1707cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
17088a7d6542SBram Moolenaar  l->remove(0)
17098a7d6542SBram Moolenaar  l->add(5)
17108a7d6542SBram Moolenaar  l->insert(99, 1)
17110f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17128a7d6542SBram Moolenaarenddef
17138a7d6542SBram Moolenaar
1714ae616494SBram Moolenaardef Test_no_insert_xit()
1715d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1716d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1717d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1718d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1719d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1720ae616494SBram Moolenaar
1721ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1722ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1723ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1724ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1725f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1726f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1727f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1728f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1729f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1730ae616494SBram Moolenaarenddef
1731ae616494SBram Moolenaar
1732158906cfSBram Moolenaardef IfElse(what: number): string
1733cfcd011fSBram Moolenaar  var res = ''
1734158906cfSBram Moolenaar  if what == 1
1735158906cfSBram Moolenaar    res = "one"
1736158906cfSBram Moolenaar  elseif what == 2
1737158906cfSBram Moolenaar    res = "two"
1738a259d8d3SBram Moolenaar  else
1739158906cfSBram Moolenaar    res = "three"
1740a259d8d3SBram Moolenaar  endif
1741158906cfSBram Moolenaar  return res
1742a259d8d3SBram Moolenaarenddef
1743a259d8d3SBram Moolenaar
1744158906cfSBram Moolenaardef Test_if_elseif_else()
1745158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1746158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1747158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
17480f18b6d1SBram Moolenaarenddef
17490f18b6d1SBram Moolenaar
1750e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1751d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1752d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1753d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1754ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1755d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
17566628b7ebSBram Moolenaar
17576628b7ebSBram Moolenaar  var lines =<< trim END
17586628b7ebSBram Moolenaar      var s = ''
17596628b7ebSBram Moolenaar      if s = ''
17606628b7ebSBram Moolenaar      endif
17616628b7ebSBram Moolenaar  END
17626628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
17636628b7ebSBram Moolenaar
17646628b7ebSBram Moolenaar  lines =<< trim END
17656628b7ebSBram Moolenaar      var s = ''
17666628b7ebSBram Moolenaar      if s == ''
17676628b7ebSBram Moolenaar      elseif s = ''
17686628b7ebSBram Moolenaar      endif
17696628b7ebSBram Moolenaar  END
17706628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1771e8c4abbbSBram Moolenaarenddef
1772e8c4abbbSBram Moolenaar
17736d69bf60SBram Moolenaarlet g:bool_true = v:true
17746d69bf60SBram Moolenaarlet g:bool_false = v:false
17756d69bf60SBram Moolenaar
17766d69bf60SBram Moolenaardef Test_if_const_expr()
1777cfcd011fSBram Moolenaar  var res = false
17786d69bf60SBram Moolenaar  if true ? true : false
17796d69bf60SBram Moolenaar    res = true
17806d69bf60SBram Moolenaar  endif
17816d69bf60SBram Moolenaar  assert_equal(true, res)
17826d69bf60SBram Moolenaar
1783585fea7bSBram Moolenaar  g:glob = 2
1784585fea7bSBram Moolenaar  if false
17856797966dSBram Moolenaar    execute('g:glob = 3')
1786585fea7bSBram Moolenaar  endif
1787585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1788585fea7bSBram Moolenaar  if true
17896797966dSBram Moolenaar    execute('g:glob = 3')
1790585fea7bSBram Moolenaar  endif
1791585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1792585fea7bSBram Moolenaar
17936d69bf60SBram Moolenaar  res = false
17946d69bf60SBram Moolenaar  if g:bool_true ? true : false
17956d69bf60SBram Moolenaar    res = true
17966d69bf60SBram Moolenaar  endif
17976d69bf60SBram Moolenaar  assert_equal(true, res)
17986d69bf60SBram Moolenaar
17996d69bf60SBram Moolenaar  res = false
18006d69bf60SBram Moolenaar  if true ? g:bool_true : false
18016d69bf60SBram Moolenaar    res = true
18026d69bf60SBram Moolenaar  endif
18036d69bf60SBram Moolenaar  assert_equal(true, res)
18046d69bf60SBram Moolenaar
18056d69bf60SBram Moolenaar  res = false
18066d69bf60SBram Moolenaar  if true ? true : g:bool_false
18076d69bf60SBram Moolenaar    res = true
18086d69bf60SBram Moolenaar  endif
18096d69bf60SBram Moolenaar  assert_equal(true, res)
18106d69bf60SBram Moolenaar
18116d69bf60SBram Moolenaar  res = false
18126d69bf60SBram Moolenaar  if true ? false : true
18136d69bf60SBram Moolenaar    res = true
18146d69bf60SBram Moolenaar  endif
18156d69bf60SBram Moolenaar  assert_equal(false, res)
18166d69bf60SBram Moolenaar
18176d69bf60SBram Moolenaar  res = false
18186d69bf60SBram Moolenaar  if false ? false : true
18196d69bf60SBram Moolenaar    res = true
18206d69bf60SBram Moolenaar  endif
18216d69bf60SBram Moolenaar  assert_equal(true, res)
18226d69bf60SBram Moolenaar
18236d69bf60SBram Moolenaar  res = false
18246d69bf60SBram Moolenaar  if false ? true : false
18256d69bf60SBram Moolenaar    res = true
18266d69bf60SBram Moolenaar  endif
18276d69bf60SBram Moolenaar  assert_equal(false, res)
18286d69bf60SBram Moolenaar
18296d69bf60SBram Moolenaar  res = false
1830e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1831e8c4abbbSBram Moolenaar    res = true
1832e8c4abbbSBram Moolenaar  endif
1833e8c4abbbSBram Moolenaar  assert_equal(false, res)
1834e8c4abbbSBram Moolenaar
1835e8c4abbbSBram Moolenaar  res = false
18366d69bf60SBram Moolenaar  if true && true
18376d69bf60SBram Moolenaar    res = true
18386d69bf60SBram Moolenaar  endif
18396d69bf60SBram Moolenaar  assert_equal(true, res)
18406d69bf60SBram Moolenaar
18416d69bf60SBram Moolenaar  res = false
18426d69bf60SBram Moolenaar  if true && false
18436d69bf60SBram Moolenaar    res = true
18446d69bf60SBram Moolenaar  endif
18456d69bf60SBram Moolenaar  assert_equal(false, res)
18466d69bf60SBram Moolenaar
18476d69bf60SBram Moolenaar  res = false
18486d69bf60SBram Moolenaar  if g:bool_true && false
18496d69bf60SBram Moolenaar    res = true
18506d69bf60SBram Moolenaar  endif
18516d69bf60SBram Moolenaar  assert_equal(false, res)
18526d69bf60SBram Moolenaar
18536d69bf60SBram Moolenaar  res = false
18546d69bf60SBram Moolenaar  if true && g:bool_false
18556d69bf60SBram Moolenaar    res = true
18566d69bf60SBram Moolenaar  endif
18576d69bf60SBram Moolenaar  assert_equal(false, res)
18586d69bf60SBram Moolenaar
18596d69bf60SBram Moolenaar  res = false
18606d69bf60SBram Moolenaar  if false && false
18616d69bf60SBram Moolenaar    res = true
18626d69bf60SBram Moolenaar  endif
18636d69bf60SBram Moolenaar  assert_equal(false, res)
18646d69bf60SBram Moolenaar
18656d69bf60SBram Moolenaar  res = false
18666d69bf60SBram Moolenaar  if true || false
18676d69bf60SBram Moolenaar    res = true
18686d69bf60SBram Moolenaar  endif
18696d69bf60SBram Moolenaar  assert_equal(true, res)
18706d69bf60SBram Moolenaar
18716d69bf60SBram Moolenaar  res = false
18726d69bf60SBram Moolenaar  if g:bool_true || false
18736d69bf60SBram Moolenaar    res = true
18746d69bf60SBram Moolenaar  endif
18756d69bf60SBram Moolenaar  assert_equal(true, res)
18766d69bf60SBram Moolenaar
18776d69bf60SBram Moolenaar  res = false
18786d69bf60SBram Moolenaar  if true || g:bool_false
18796d69bf60SBram Moolenaar    res = true
18806d69bf60SBram Moolenaar  endif
18816d69bf60SBram Moolenaar  assert_equal(true, res)
18826d69bf60SBram Moolenaar
18836d69bf60SBram Moolenaar  res = false
18846d69bf60SBram Moolenaar  if false || false
18856d69bf60SBram Moolenaar    res = true
18866d69bf60SBram Moolenaar  endif
18876d69bf60SBram Moolenaar  assert_equal(false, res)
18883988f64fSBram Moolenaar
18893988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
18903988f64fSBram Moolenaar  if false | eval 0 | endif
18913988f64fSBram Moolenaar  if false | eval burp + 234 | endif
18923988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
18933988f64fSBram Moolenaar  if false
18943988f64fSBram Moolenaar    burp
18953988f64fSBram Moolenaar  endif
189680c34ca3SBram Moolenaarenddef
18976d69bf60SBram Moolenaar
189880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1899d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1900d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1901d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1902d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19036d69bf60SBram Moolenaarenddef
19046d69bf60SBram Moolenaar
190572abcf42SBram Moolenaardef RunNested(i: number): number
1906cfcd011fSBram Moolenaar  var x: number = 0
190772abcf42SBram Moolenaar  if i % 2
190872abcf42SBram Moolenaar    if 1
1909f5be8cdbSBram Moolenaar      # comment
191072abcf42SBram Moolenaar    else
1911f5be8cdbSBram Moolenaar      # comment
191272abcf42SBram Moolenaar    endif
191372abcf42SBram Moolenaar    x += 1
191472abcf42SBram Moolenaar  else
191572abcf42SBram Moolenaar    x += 1000
191672abcf42SBram Moolenaar  endif
191772abcf42SBram Moolenaar  return x
191872abcf42SBram Moolenaarenddef
191972abcf42SBram Moolenaar
192072abcf42SBram Moolenaardef Test_nested_if()
192172abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
192272abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
192372abcf42SBram Moolenaarenddef
192472abcf42SBram Moolenaar
1925ad39c094SBram Moolenaardef Test_execute_cmd()
1926e4984290SBram Moolenaar  # missing argument is ignored
1927e4984290SBram Moolenaar  execute
1928e4984290SBram Moolenaar  execute # comment
1929e4984290SBram Moolenaar
1930ad39c094SBram Moolenaar  new
1931ad39c094SBram Moolenaar  setline(1, 'default')
1932d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1933ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1934a72cfb80SBram Moolenaar
1935d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1936a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1937a72cfb80SBram Moolenaar
1938cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1939cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1940a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1941ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1942a72cfb80SBram Moolenaar
1943d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1944ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1945a72cfb80SBram Moolenaar
1946cfcd011fSBram Moolenaar  var cmd_first = 'call '
1947cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1948ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1949ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1950ad39c094SBram Moolenaar  bwipe!
1951585fea7bSBram Moolenaar
1952cfcd011fSBram Moolenaar  var n = true
19532d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
19542d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
19552d6b20d6SBram Moolenaar
1956e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1957e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1958e5abf7afSBram Moolenaar
1959d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1960d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1961d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1962ad39c094SBram Moolenaarenddef
1963ad39c094SBram Moolenaar
196447e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1965f5be8cdbSBram Moolenaar  # only checks line continuation
1966cfcd011fSBram Moolenaar  var lines =<< trim END
196747e880d6SBram Moolenaar      vim9script
196847e880d6SBram Moolenaar      execute 'g:someVar'
196947e880d6SBram Moolenaar                .. ' = ' ..
197047e880d6SBram Moolenaar                   '28'
197147e880d6SBram Moolenaar      assert_equal(28, g:someVar)
197247e880d6SBram Moolenaar      unlet g:someVar
197347e880d6SBram Moolenaar  END
197447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
197547e880d6SBram Moolenaarenddef
197647e880d6SBram Moolenaar
1977ad39c094SBram Moolenaardef Test_echo_cmd()
1978a72cfb80SBram Moolenaar  echo 'some' # comment
1979585fea7bSBram Moolenaar  echon 'thing'
1980ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1981ad39c094SBram Moolenaar
1982a72cfb80SBram Moolenaar  echo "some" # comment
1983a72cfb80SBram Moolenaar  echon "thing"
1984a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1985a72cfb80SBram Moolenaar
1986cfcd011fSBram Moolenaar  var str1 = 'some'
1987cfcd011fSBram Moolenaar  var str2 = 'more'
1988ad39c094SBram Moolenaar  echo str1 str2
1989ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1990a72cfb80SBram Moolenaar
1991d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1992ad39c094SBram Moolenaarenddef
1993ad39c094SBram Moolenaar
1994f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1995f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1996f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1997f93c7feaSBram Moolenaar  echo 'clear'
1998df069eecSBram Moolenaar  :1messages
1999f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2000f93c7feaSBram Moolenaar
2001d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2002f93c7feaSBram Moolenaarenddef
2003f93c7feaSBram Moolenaar
200447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2005f5be8cdbSBram Moolenaar  # only checks line continuation
2006cfcd011fSBram Moolenaar  var lines =<< trim END
200747e880d6SBram Moolenaar      vim9script
200847e880d6SBram Moolenaar      echomsg 'here'
200947e880d6SBram Moolenaar                .. ' is ' ..
201047e880d6SBram Moolenaar                   'a message'
201147e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
201247e880d6SBram Moolenaar  END
201347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
201447e880d6SBram Moolenaarenddef
201547e880d6SBram Moolenaar
2016f93c7feaSBram Moolenaardef Test_echoerr_cmd()
201740ee466cSBram Moolenaar  try
201840ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
201940ee466cSBram Moolenaar  catch
202040ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
202140ee466cSBram Moolenaar  endtry
2022f93c7feaSBram Moolenaarenddef
2023f93c7feaSBram Moolenaar
202447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2025f5be8cdbSBram Moolenaar  # only checks line continuation
2026cfcd011fSBram Moolenaar  var lines =<< trim END
202747e880d6SBram Moolenaar      vim9script
202847e880d6SBram Moolenaar      try
202947e880d6SBram Moolenaar        echoerr 'this'
203047e880d6SBram Moolenaar                .. ' is ' ..
203147e880d6SBram Moolenaar                   'wrong'
203247e880d6SBram Moolenaar      catch
203347e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
203447e880d6SBram Moolenaar      endtry
203547e880d6SBram Moolenaar  END
203647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
203747e880d6SBram Moolenaarenddef
203847e880d6SBram Moolenaar
203941fe0617SBram Moolenaardef Test_for_outside_of_function()
2040cfcd011fSBram Moolenaar  var lines =<< trim END
204141fe0617SBram Moolenaar    vim9script
204241fe0617SBram Moolenaar    new
204341fe0617SBram Moolenaar    for var in range(0, 3)
204441fe0617SBram Moolenaar      append(line('$'), var)
204541fe0617SBram Moolenaar    endfor
204641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
204741fe0617SBram Moolenaar    bwipe!
204841fe0617SBram Moolenaar  END
204941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
205041fe0617SBram Moolenaar  source Xvim9for.vim
205141fe0617SBram Moolenaar  delete('Xvim9for.vim')
205241fe0617SBram Moolenaarenddef
20538a7d6542SBram Moolenaar
2054e8c4abbbSBram Moolenaardef Test_for_loop()
2055cfcd011fSBram Moolenaar  var result = ''
2056e8c4abbbSBram Moolenaar  for cnt in range(7)
2057e8c4abbbSBram Moolenaar    if cnt == 4
2058e8c4abbbSBram Moolenaar      break
2059e8c4abbbSBram Moolenaar    endif
2060e8c4abbbSBram Moolenaar    if cnt == 2
2061e8c4abbbSBram Moolenaar      continue
2062e8c4abbbSBram Moolenaar    endif
2063e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2064e8c4abbbSBram Moolenaar  endfor
2065e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
20660ad3e894SBram Moolenaar
2067cfcd011fSBram Moolenaar  var concat = ''
20680ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
20690ad3e894SBram Moolenaar    concat ..= str
20700ad3e894SBram Moolenaar  endfor
20710ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
207238bd8de5SBram Moolenaar
207338bd8de5SBram Moolenaar  var total = 0
207438bd8de5SBram Moolenaar  for nr in
207538bd8de5SBram Moolenaar      [1, 2, 3]
207638bd8de5SBram Moolenaar    total += nr
207738bd8de5SBram Moolenaar  endfor
207838bd8de5SBram Moolenaar  assert_equal(6, total)
207938bd8de5SBram Moolenaar
208038bd8de5SBram Moolenaar  total = 0
208138bd8de5SBram Moolenaar  for nr
208238bd8de5SBram Moolenaar    in [1, 2, 3]
208338bd8de5SBram Moolenaar    total += nr
208438bd8de5SBram Moolenaar  endfor
208538bd8de5SBram Moolenaar  assert_equal(6, total)
208638bd8de5SBram Moolenaar
208738bd8de5SBram Moolenaar  total = 0
208838bd8de5SBram Moolenaar  for nr
208938bd8de5SBram Moolenaar    in
209038bd8de5SBram Moolenaar    [1, 2, 3]
209138bd8de5SBram Moolenaar    total += nr
209238bd8de5SBram Moolenaar  endfor
209338bd8de5SBram Moolenaar  assert_equal(6, total)
2094036d0714SBram Moolenaar
2095036d0714SBram Moolenaar  var res = ""
2096036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2097036d0714SBram Moolenaar    res ..= n .. s
2098036d0714SBram Moolenaar  endfor
2099036d0714SBram Moolenaar  assert_equal('1a2b', res)
2100e8c4abbbSBram Moolenaarenddef
2101e8c4abbbSBram Moolenaar
2102e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2103025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2104025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2105025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2106675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2107675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2108cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2109822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21102d870f8dSBram Moolenaar  delfunc! g:Func
2111451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2112675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2113675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2114675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2115e8c4abbbSBram Moolenaarenddef
2116e8c4abbbSBram Moolenaar
2117ea87069dSBram Moolenaardef Test_for_loop_script_var()
2118ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2119ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2120ea87069dSBram Moolenaar
2121ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2122ea87069dSBram Moolenaar  var lines =<< trim END
2123ea87069dSBram Moolenaar    vim9script
2124ea87069dSBram Moolenaar    var total = 0
2125ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2126ea87069dSBram Moolenaar      total += s:var
2127ea87069dSBram Moolenaar    endfor
2128ea87069dSBram Moolenaar    assert_equal(6, total)
2129ea87069dSBram Moolenaar
2130ea87069dSBram Moolenaar    total = 0
2131ea87069dSBram Moolenaar    for var in [1, 2, 3]
2132ea87069dSBram Moolenaar      total += var
2133ea87069dSBram Moolenaar    endfor
2134ea87069dSBram Moolenaar    assert_equal(6, total)
2135ea87069dSBram Moolenaar  END
2136ea87069dSBram Moolenaarenddef
2137ea87069dSBram Moolenaar
2138792f786aSBram Moolenaardef Test_for_loop_unpack()
21394b8a0651SBram Moolenaar  var lines =<< trim END
2140792f786aSBram Moolenaar      var result = []
2141792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2142792f786aSBram Moolenaar        result->add(v1)
2143792f786aSBram Moolenaar        result->add(v2)
2144792f786aSBram Moolenaar      endfor
2145792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2146792f786aSBram Moolenaar
2147792f786aSBram Moolenaar      result = []
2148792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2149792f786aSBram Moolenaar        result->add(v1)
2150792f786aSBram Moolenaar        result->add(v2)
2151792f786aSBram Moolenaar        result->add(v3)
2152792f786aSBram Moolenaar      endfor
2153792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2154792f786aSBram Moolenaar
21554b8a0651SBram Moolenaar      result = []
21564b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
21574b8a0651SBram Moolenaar        result->add(&ts)
21584b8a0651SBram Moolenaar        result->add(&sw)
21594b8a0651SBram Moolenaar      endfor
21604b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
21614b8a0651SBram Moolenaar
21624b8a0651SBram Moolenaar      var slist: list<string>
21634b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
21644b8a0651SBram Moolenaar        slist->add($LOOPVAR)
21654b8a0651SBram Moolenaar        slist->add(@r)
21664b8a0651SBram Moolenaar        slist->add(v:errmsg)
21674b8a0651SBram Moolenaar      endfor
21684b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
21694b8a0651SBram Moolenaar
21704b8a0651SBram Moolenaar      slist = []
21714b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
21724b8a0651SBram Moolenaar        slist->add(g:globalvar)
21734b8a0651SBram Moolenaar        slist->add(b:bufvar)
21744b8a0651SBram Moolenaar        slist->add(w:winvar)
21754b8a0651SBram Moolenaar        slist->add(t:tabvar)
21764b8a0651SBram Moolenaar      endfor
21774b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2178f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
21794b8a0651SBram Moolenaar  END
21804b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
21814b8a0651SBram Moolenaar
21824b8a0651SBram Moolenaar  lines =<< trim END
2183792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2184792f786aSBram Moolenaar        echo v1 v2
2185792f786aSBram Moolenaar      endfor
2186792f786aSBram Moolenaar  END
2187792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2188792f786aSBram Moolenaar
2189792f786aSBram Moolenaar  lines =<< trim END
2190792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2191792f786aSBram Moolenaar        echo v1 v2
2192792f786aSBram Moolenaar      endfor
2193792f786aSBram Moolenaar  END
2194792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2195792f786aSBram Moolenaar
2196792f786aSBram Moolenaar  lines =<< trim END
2197792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2198792f786aSBram Moolenaar        echo v1
2199792f786aSBram Moolenaar      endfor
2200792f786aSBram Moolenaar  END
2201792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2202792f786aSBram Moolenaarenddef
2203792f786aSBram Moolenaar
2204c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2205c150c09eSBram Moolenaar  var looped = 0
2206c150c09eSBram Moolenaar  var cleanup = 0
2207c150c09eSBram Moolenaar  for i in range(3)
2208c150c09eSBram Moolenaar    looped += 1
2209c150c09eSBram Moolenaar    try
2210c150c09eSBram Moolenaar      eval [][0]
2211c150c09eSBram Moolenaar    catch
2212c150c09eSBram Moolenaar      continue
2213c150c09eSBram Moolenaar    finally
2214c150c09eSBram Moolenaar      cleanup += 1
2215c150c09eSBram Moolenaar    endtry
2216c150c09eSBram Moolenaar  endfor
2217c150c09eSBram Moolenaar  assert_equal(3, looped)
2218c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2219c150c09eSBram Moolenaarenddef
2220c150c09eSBram Moolenaar
2221d0df1aacSBram Moolenaardef Test_while_loop()
2222cfcd011fSBram Moolenaar  var result = ''
2223cfcd011fSBram Moolenaar  var cnt = 0
2224d0df1aacSBram Moolenaar  while cnt < 555
2225d0df1aacSBram Moolenaar    if cnt == 3
2226d0df1aacSBram Moolenaar      break
2227d0df1aacSBram Moolenaar    endif
2228d0df1aacSBram Moolenaar    cnt += 1
2229d0df1aacSBram Moolenaar    if cnt == 2
2230d0df1aacSBram Moolenaar      continue
2231d0df1aacSBram Moolenaar    endif
2232d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2233d0df1aacSBram Moolenaar  endwhile
2234d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2235dee37dc7SBram Moolenaar
2236dee37dc7SBram Moolenaar  var s = ''
22370123cc1eSBram Moolenaar  while s == 'x' #{comment}
2238dee37dc7SBram Moolenaar  endwhile
2239d0df1aacSBram Moolenaarenddef
2240d0df1aacSBram Moolenaar
2241e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2242675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2243675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2244675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2245675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2246675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2247675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2248675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
22496628b7ebSBram Moolenaar
22506628b7ebSBram Moolenaar  var lines =<< trim END
22516628b7ebSBram Moolenaar      var s = ''
22526628b7ebSBram Moolenaar      while s = ''
22536628b7ebSBram Moolenaar      endwhile
22546628b7ebSBram Moolenaar  END
22556628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2256bd5da371SBram Moolenaarenddef
2257bd5da371SBram Moolenaar
22589645e2d9SBram Moolenaardef Test_interrupt_loop()
2259cfcd011fSBram Moolenaar  var caught = false
2260cfcd011fSBram Moolenaar  var x = 0
226197acfc78SBram Moolenaar  try
22629645e2d9SBram Moolenaar    while 1
22639645e2d9SBram Moolenaar      x += 1
22649645e2d9SBram Moolenaar      if x == 100
22659645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22669645e2d9SBram Moolenaar      endif
22679645e2d9SBram Moolenaar    endwhile
226897acfc78SBram Moolenaar  catch
226997acfc78SBram Moolenaar    caught = true
227097acfc78SBram Moolenaar    assert_equal(100, x)
227197acfc78SBram Moolenaar  endtry
227297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
227325859dd7SBram Moolenaar  # consume the CTRL-C
227425859dd7SBram Moolenaar  getchar(0)
22759645e2d9SBram Moolenaarenddef
227620431c9dSBram Moolenaar
22774fdae999SBram Moolenaardef Test_automatic_line_continuation()
2278cfcd011fSBram Moolenaar  var mylist = [
22794fdae999SBram Moolenaar      'one',
22804fdae999SBram Moolenaar      'two',
22814fdae999SBram Moolenaar      'three',
2282f5be8cdbSBram Moolenaar      ] # comment
22834fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
22844fdae999SBram Moolenaar
2285cfcd011fSBram Moolenaar  var mydict = {
2286e0de171eSBram Moolenaar      ['one']: 1,
2287e0de171eSBram Moolenaar      ['two']: 2,
2288e0de171eSBram Moolenaar      ['three']:
22894fdae999SBram Moolenaar          3,
2290f5be8cdbSBram Moolenaar      } # comment
2291e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2292e0de171eSBram Moolenaar  mydict = {
22932c330432SBram Moolenaar      one: 1,  # comment
22942c330432SBram Moolenaar      two:     # comment
22952c330432SBram Moolenaar           2,  # comment
22962c330432SBram Moolenaar      three: 3 # comment
22972c330432SBram Moolenaar      }
2298e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2299e0de171eSBram Moolenaar  mydict = {
23002c330432SBram Moolenaar      one: 1,
23014fdae999SBram Moolenaar      two:
23024fdae999SBram Moolenaar           2,
23032c330432SBram Moolenaar      three: 3
23044fdae999SBram Moolenaar      }
2305e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2306e6085c53SBram Moolenaar
2307e6085c53SBram Moolenaar  assert_equal(
2308e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2309e6085c53SBram Moolenaar        split('one two three')
2310e6085c53SBram Moolenaar        )
23114fdae999SBram Moolenaarenddef
23124fdae999SBram Moolenaar
23137a092245SBram Moolenaardef Test_vim9_comment()
23147a092245SBram Moolenaar  CheckScriptSuccess([
23157a092245SBram Moolenaar      'vim9script',
23167a092245SBram Moolenaar      '# something',
231793f82cbeSBram Moolenaar      '#something',
231893f82cbeSBram Moolenaar      '#{something',
23197a092245SBram Moolenaar      ])
232093f82cbeSBram Moolenaar
232193f82cbeSBram Moolenaar  split Xfile
232293f82cbeSBram Moolenaar  CheckScriptSuccess([
232393f82cbeSBram Moolenaar      'vim9script',
232493f82cbeSBram Moolenaar      'edit #something',
232593f82cbeSBram Moolenaar      ])
232693f82cbeSBram Moolenaar  CheckScriptSuccess([
232793f82cbeSBram Moolenaar      'vim9script',
232893f82cbeSBram Moolenaar      'edit #{something',
232993f82cbeSBram Moolenaar      ])
233093f82cbeSBram Moolenaar  close
233193f82cbeSBram Moolenaar
23327a092245SBram Moolenaar  CheckScriptFailure([
23337a092245SBram Moolenaar      'vim9script',
23347a092245SBram Moolenaar      ':# something',
23357a092245SBram Moolenaar      ], 'E488:')
23367a092245SBram Moolenaar  CheckScriptFailure([
23377a092245SBram Moolenaar      '# something',
23387a092245SBram Moolenaar      ], 'E488:')
23397a092245SBram Moolenaar  CheckScriptFailure([
23407a092245SBram Moolenaar      ':# something',
23417a092245SBram Moolenaar      ], 'E488:')
23427a092245SBram Moolenaar
23434a8d9f2eSBram Moolenaar  { # block start
23444a8d9f2eSBram Moolenaar  } # block end
23454a8d9f2eSBram Moolenaar  CheckDefFailure([
23464a8d9f2eSBram Moolenaar      '{# comment',
23474a8d9f2eSBram Moolenaar      ], 'E488:')
23484a8d9f2eSBram Moolenaar  CheckDefFailure([
23494a8d9f2eSBram Moolenaar      '{',
23504a8d9f2eSBram Moolenaar      '}# comment',
23514a8d9f2eSBram Moolenaar      ], 'E488:')
23524a8d9f2eSBram Moolenaar
23534a8d9f2eSBram Moolenaar  echo "yes" # comment
23544a8d9f2eSBram Moolenaar  CheckDefFailure([
23554a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23564a8d9f2eSBram Moolenaar      ], 'E488:')
23577a092245SBram Moolenaar  CheckScriptSuccess([
23587a092245SBram Moolenaar      'vim9script',
23597a092245SBram Moolenaar      'echo "yes" # something',
23607a092245SBram Moolenaar      ])
23617a092245SBram Moolenaar  CheckScriptFailure([
23627a092245SBram Moolenaar      'vim9script',
23637a092245SBram Moolenaar      'echo "yes"# something',
23647a092245SBram Moolenaar      ], 'E121:')
23657a092245SBram Moolenaar  CheckScriptFailure([
23667a092245SBram Moolenaar      'vim9script',
23677a092245SBram Moolenaar      'echo# something',
2368f8103f27SBram Moolenaar      ], 'E1144:')
23697a092245SBram Moolenaar  CheckScriptFailure([
23707a092245SBram Moolenaar      'echo "yes" # something',
23717a092245SBram Moolenaar      ], 'E121:')
23727a092245SBram Moolenaar
23734a8d9f2eSBram Moolenaar  exe "echo" # comment
23744a8d9f2eSBram Moolenaar  CheckDefFailure([
23754a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23764a8d9f2eSBram Moolenaar      ], 'E488:')
23774a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23784a8d9f2eSBram Moolenaar      'vim9script',
23794a8d9f2eSBram Moolenaar      'exe "echo" # something',
23804a8d9f2eSBram Moolenaar      ])
23814a8d9f2eSBram Moolenaar  CheckScriptFailure([
23824a8d9f2eSBram Moolenaar      'vim9script',
23834a8d9f2eSBram Moolenaar      'exe "echo"# something',
23844a8d9f2eSBram Moolenaar      ], 'E121:')
23854a8d9f2eSBram Moolenaar  CheckScriptFailure([
23864a8d9f2eSBram Moolenaar      'vim9script',
23874a8d9f2eSBram Moolenaar      'exe# something',
2388f8103f27SBram Moolenaar      ], 'E1144:')
23894a8d9f2eSBram Moolenaar  CheckScriptFailure([
23904a8d9f2eSBram Moolenaar      'exe "echo" # something',
23914a8d9f2eSBram Moolenaar      ], 'E121:')
23924a8d9f2eSBram Moolenaar
23937a092245SBram Moolenaar  CheckDefFailure([
23947a092245SBram Moolenaar      'try# comment',
23957a092245SBram Moolenaar      '  echo "yes"',
23967a092245SBram Moolenaar      'catch',
23977a092245SBram Moolenaar      'endtry',
2398f8103f27SBram Moolenaar      ], 'E1144:')
23992c5ed4e3SBram Moolenaar  CheckScriptFailure([
24002c5ed4e3SBram Moolenaar      'vim9script',
24012c5ed4e3SBram Moolenaar      'try# comment',
24022c5ed4e3SBram Moolenaar      'echo "yes"',
2403f8103f27SBram Moolenaar      ], 'E1144:')
24047a092245SBram Moolenaar  CheckDefFailure([
24057a092245SBram Moolenaar      'try',
2406a72cfb80SBram Moolenaar      '  throw#comment',
2407a72cfb80SBram Moolenaar      'catch',
2408a72cfb80SBram Moolenaar      'endtry',
2409f8103f27SBram Moolenaar      ], 'E1144:')
2410a72cfb80SBram Moolenaar  CheckDefFailure([
2411a72cfb80SBram Moolenaar      'try',
2412a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2413a72cfb80SBram Moolenaar      'catch',
2414a72cfb80SBram Moolenaar      'endtry',
2415a72cfb80SBram Moolenaar      ], 'E488:')
2416a72cfb80SBram Moolenaar  CheckDefFailure([
2417a72cfb80SBram Moolenaar      'try',
24187a092245SBram Moolenaar      '  echo "yes"',
24197a092245SBram Moolenaar      'catch# comment',
24207a092245SBram Moolenaar      'endtry',
2421f8103f27SBram Moolenaar      ], 'E1144:')
24222c5ed4e3SBram Moolenaar  CheckScriptFailure([
24232c5ed4e3SBram Moolenaar      'vim9script',
24242c5ed4e3SBram Moolenaar      'try',
24252c5ed4e3SBram Moolenaar      '  echo "yes"',
24262c5ed4e3SBram Moolenaar      'catch# comment',
24272c5ed4e3SBram Moolenaar      'endtry',
2428f8103f27SBram Moolenaar      ], 'E1144:')
24292c5ed4e3SBram Moolenaar  CheckDefFailure([
24302c5ed4e3SBram Moolenaar      'try',
24312c5ed4e3SBram Moolenaar      '  echo "yes"',
24322c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24332c5ed4e3SBram Moolenaar      'endtry',
24342c5ed4e3SBram Moolenaar      ], 'E488:')
24357a092245SBram Moolenaar  CheckDefFailure([
24367a092245SBram Moolenaar      'try',
24377a092245SBram Moolenaar      'echo "yes"',
24387a092245SBram Moolenaar      'catch',
24397a092245SBram Moolenaar      'endtry# comment',
2440f8103f27SBram Moolenaar      ], 'E1144:')
24412c5ed4e3SBram Moolenaar  CheckScriptFailure([
24422c5ed4e3SBram Moolenaar      'vim9script',
24432c5ed4e3SBram Moolenaar      'try',
24442c5ed4e3SBram Moolenaar      '  echo "yes"',
24452c5ed4e3SBram Moolenaar      'catch',
24462c5ed4e3SBram Moolenaar      'endtry# comment',
2447f8103f27SBram Moolenaar      ], 'E1144:')
24482c5ed4e3SBram Moolenaar
24492c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24502c5ed4e3SBram Moolenaar      'vim9script',
24512c5ed4e3SBram Moolenaar      'hi # comment',
24522c5ed4e3SBram Moolenaar      ])
24532c5ed4e3SBram Moolenaar  CheckScriptFailure([
24542c5ed4e3SBram Moolenaar      'vim9script',
24552c5ed4e3SBram Moolenaar      'hi# comment',
2456f8103f27SBram Moolenaar      ], 'E1144:')
24571966c248SBram Moolenaar  CheckScriptSuccess([
24581966c248SBram Moolenaar      'vim9script',
24591966c248SBram Moolenaar      'hi Search # comment',
24601966c248SBram Moolenaar      ])
24611966c248SBram Moolenaar  CheckScriptFailure([
24621966c248SBram Moolenaar      'vim9script',
24631966c248SBram Moolenaar      'hi Search# comment',
24641966c248SBram Moolenaar      ], 'E416:')
24651966c248SBram Moolenaar  CheckScriptSuccess([
24661966c248SBram Moolenaar      'vim9script',
24671966c248SBram Moolenaar      'hi link This Search # comment',
24681966c248SBram Moolenaar      ])
24691966c248SBram Moolenaar  CheckScriptFailure([
24701966c248SBram Moolenaar      'vim9script',
24711966c248SBram Moolenaar      'hi link This That# comment',
24721966c248SBram Moolenaar      ], 'E413:')
24731966c248SBram Moolenaar  CheckScriptSuccess([
24741966c248SBram Moolenaar      'vim9script',
24751966c248SBram Moolenaar      'hi clear This # comment',
24761966c248SBram Moolenaar      'hi clear # comment',
24771966c248SBram Moolenaar      ])
2478f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2479f5be8cdbSBram Moolenaar  # hi clear This# comment',
24801966c248SBram Moolenaar  CheckScriptFailure([
24811966c248SBram Moolenaar      'vim9script',
24821966c248SBram Moolenaar      'hi clear# comment',
24831966c248SBram Moolenaar      ], 'E416:')
24841966c248SBram Moolenaar
24851966c248SBram Moolenaar  CheckScriptSuccess([
24861966c248SBram Moolenaar      'vim9script',
24871966c248SBram Moolenaar      'hi Group term=bold',
24881966c248SBram Moolenaar      'match Group /todo/ # comment',
24891966c248SBram Moolenaar      ])
24901966c248SBram Moolenaar  CheckScriptFailure([
24911966c248SBram Moolenaar      'vim9script',
24921966c248SBram Moolenaar      'hi Group term=bold',
24931966c248SBram Moolenaar      'match Group /todo/# comment',
24941966c248SBram Moolenaar      ], 'E488:')
24951966c248SBram Moolenaar  CheckScriptSuccess([
24961966c248SBram Moolenaar      'vim9script',
24971966c248SBram Moolenaar      'match # comment',
24981966c248SBram Moolenaar      ])
24991966c248SBram Moolenaar  CheckScriptFailure([
25001966c248SBram Moolenaar      'vim9script',
25011966c248SBram Moolenaar      'match# comment',
2502f8103f27SBram Moolenaar      ], 'E1144:')
25031966c248SBram Moolenaar  CheckScriptSuccess([
25041966c248SBram Moolenaar      'vim9script',
25051966c248SBram Moolenaar      'match none # comment',
25061966c248SBram Moolenaar      ])
25071966c248SBram Moolenaar  CheckScriptFailure([
25081966c248SBram Moolenaar      'vim9script',
25091966c248SBram Moolenaar      'match none# comment',
25101966c248SBram Moolenaar      ], 'E475:')
25111966c248SBram Moolenaar
25121966c248SBram Moolenaar  CheckScriptSuccess([
25131966c248SBram Moolenaar      'vim9script',
25141966c248SBram Moolenaar      'menutrans clear # comment',
25151966c248SBram Moolenaar      ])
25161966c248SBram Moolenaar  CheckScriptFailure([
25171966c248SBram Moolenaar      'vim9script',
25181966c248SBram Moolenaar      'menutrans clear# comment text',
25191966c248SBram Moolenaar      ], 'E474:')
25201966c248SBram Moolenaar
25211966c248SBram Moolenaar  CheckScriptSuccess([
25221966c248SBram Moolenaar      'vim9script',
25231966c248SBram Moolenaar      'syntax clear # comment',
25241966c248SBram Moolenaar      ])
25251966c248SBram Moolenaar  CheckScriptFailure([
25261966c248SBram Moolenaar      'vim9script',
25271966c248SBram Moolenaar      'syntax clear# comment text',
25281966c248SBram Moolenaar      ], 'E28:')
25291966c248SBram Moolenaar  CheckScriptSuccess([
25301966c248SBram Moolenaar      'vim9script',
25311966c248SBram Moolenaar      'syntax keyword Word some',
25321966c248SBram Moolenaar      'syntax clear Word # comment',
25331966c248SBram Moolenaar      ])
25341966c248SBram Moolenaar  CheckScriptFailure([
25351966c248SBram Moolenaar      'vim9script',
25361966c248SBram Moolenaar      'syntax keyword Word some',
25371966c248SBram Moolenaar      'syntax clear Word# comment text',
25381966c248SBram Moolenaar      ], 'E28:')
25391966c248SBram Moolenaar
25401966c248SBram Moolenaar  CheckScriptSuccess([
25411966c248SBram Moolenaar      'vim9script',
25421966c248SBram Moolenaar      'syntax list # comment',
25431966c248SBram Moolenaar      ])
25441966c248SBram Moolenaar  CheckScriptFailure([
25451966c248SBram Moolenaar      'vim9script',
25461966c248SBram Moolenaar      'syntax list# comment text',
25471966c248SBram Moolenaar      ], 'E28:')
25481966c248SBram Moolenaar
25491966c248SBram Moolenaar  CheckScriptSuccess([
25501966c248SBram Moolenaar      'vim9script',
25511966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
25521966c248SBram Moolenaar      ])
25531966c248SBram Moolenaar  CheckScriptFailure([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25561966c248SBram Moolenaar      ], 'E475:')
25571966c248SBram Moolenaar
25581966c248SBram Moolenaar  CheckScriptSuccess([
25591966c248SBram Moolenaar      'vim9script',
25601966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25611966c248SBram Moolenaar      ])
25621966c248SBram Moolenaar  CheckScriptFailure([
25631966c248SBram Moolenaar      'vim9script',
25641966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25651966c248SBram Moolenaar      ], 'E789:')
25661966c248SBram Moolenaar
25671966c248SBram Moolenaar  CheckScriptSuccess([
25681966c248SBram Moolenaar      'vim9script',
25691966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25701966c248SBram Moolenaar      ])
25711966c248SBram Moolenaar  CheckScriptFailure([
25721966c248SBram Moolenaar      'vim9script',
25731966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25741966c248SBram Moolenaar      ], 'E402:')
25751966c248SBram Moolenaar
25761966c248SBram Moolenaar  CheckScriptSuccess([
25771966c248SBram Moolenaar      'vim9script',
25781966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25791966c248SBram Moolenaar      ])
25801966c248SBram Moolenaar  CheckScriptFailure([
25811966c248SBram Moolenaar      'vim9script',
25821966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25831966c248SBram Moolenaar      ], 'E475:')
25841966c248SBram Moolenaar  CheckScriptFailure([
25851966c248SBram Moolenaar      'vim9script',
25861966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
25871966c248SBram Moolenaar      ], 'E406:')
25881966c248SBram Moolenaar  CheckScriptFailure([
25891966c248SBram Moolenaar      'vim9script',
25901966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
25911966c248SBram Moolenaar      ], 'E475:')
25921966c248SBram Moolenaar
25931966c248SBram Moolenaar  CheckScriptSuccess([
25941966c248SBram Moolenaar      'vim9script',
25951966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
25961966c248SBram Moolenaar      ])
25971966c248SBram Moolenaar  CheckScriptFailure([
25981966c248SBram Moolenaar      'vim9script',
25991966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2600d032f34aSBram Moolenaar      ], 'E402:')
26011966c248SBram Moolenaar
26021966c248SBram Moolenaar  CheckScriptSuccess([
26031966c248SBram Moolenaar      'vim9script',
26041966c248SBram Moolenaar      'syntax sync # comment',
26051966c248SBram Moolenaar      ])
26061966c248SBram Moolenaar  CheckScriptFailure([
26071966c248SBram Moolenaar      'vim9script',
26081966c248SBram Moolenaar      'syntax sync# comment',
26091966c248SBram Moolenaar      ], 'E404:')
26101966c248SBram Moolenaar  CheckScriptSuccess([
26111966c248SBram Moolenaar      'vim9script',
26121966c248SBram Moolenaar      'syntax sync ccomment # comment',
26131966c248SBram Moolenaar      ])
26141966c248SBram Moolenaar  CheckScriptFailure([
26151966c248SBram Moolenaar      'vim9script',
26161966c248SBram Moolenaar      'syntax sync ccomment# comment',
26171966c248SBram Moolenaar      ], 'E404:')
26181966c248SBram Moolenaar
26191966c248SBram Moolenaar  CheckScriptSuccess([
26201966c248SBram Moolenaar      'vim9script',
26211966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26221966c248SBram Moolenaar      ])
26231966c248SBram Moolenaar  CheckScriptFailure([
26241966c248SBram Moolenaar      'vim9script',
26251966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26261966c248SBram Moolenaar      ], 'E475:')
2627a72cfb80SBram Moolenaar
2628a72cfb80SBram Moolenaar  CheckScriptSuccess([
2629a72cfb80SBram Moolenaar      'vim9script',
2630a72cfb80SBram Moolenaar      'command Echo echo # comment',
2631a72cfb80SBram Moolenaar      'command Echo # comment',
26322d870f8dSBram Moolenaar      'delcommand Echo',
2633a72cfb80SBram Moolenaar      ])
2634a72cfb80SBram Moolenaar  CheckScriptFailure([
2635a72cfb80SBram Moolenaar      'vim9script',
2636a72cfb80SBram Moolenaar      'command Echo echo# comment',
2637a72cfb80SBram Moolenaar      'Echo',
2638f8103f27SBram Moolenaar      ], 'E1144:')
26392d870f8dSBram Moolenaar  delcommand Echo
264070249ee8SBram Moolenaar
264170249ee8SBram Moolenaar  var curdir = getcwd()
264270249ee8SBram Moolenaar  CheckScriptSuccess([
264370249ee8SBram Moolenaar      'command Echo cd " comment',
264470249ee8SBram Moolenaar      'Echo',
264570249ee8SBram Moolenaar      'delcommand Echo',
264670249ee8SBram Moolenaar      ])
264770249ee8SBram Moolenaar  CheckScriptSuccess([
2648090728adSBram Moolenaar      'vim9script',
264970249ee8SBram Moolenaar      'command Echo cd # comment',
265070249ee8SBram Moolenaar      'Echo',
265170249ee8SBram Moolenaar      'delcommand Echo',
265270249ee8SBram Moolenaar      ])
265370249ee8SBram Moolenaar  CheckScriptFailure([
265470249ee8SBram Moolenaar      'vim9script',
265570249ee8SBram Moolenaar      'command Echo cd " comment',
265670249ee8SBram Moolenaar      'Echo',
265770249ee8SBram Moolenaar      ], 'E344:')
265870249ee8SBram Moolenaar  delcommand Echo
265970249ee8SBram Moolenaar  chdir(curdir)
266070249ee8SBram Moolenaar
2661a72cfb80SBram Moolenaar  CheckScriptFailure([
2662a72cfb80SBram Moolenaar      'vim9script',
2663a72cfb80SBram Moolenaar      'command Echo# comment',
2664a72cfb80SBram Moolenaar      ], 'E182:')
2665a72cfb80SBram Moolenaar  CheckScriptFailure([
2666a72cfb80SBram Moolenaar      'vim9script',
2667a72cfb80SBram Moolenaar      'command Echo echo',
2668a72cfb80SBram Moolenaar      'command Echo# comment',
2669a72cfb80SBram Moolenaar      ], 'E182:')
26702d870f8dSBram Moolenaar  delcommand Echo
2671a72cfb80SBram Moolenaar
2672a72cfb80SBram Moolenaar  CheckScriptSuccess([
2673a72cfb80SBram Moolenaar      'vim9script',
2674a72cfb80SBram Moolenaar      'function # comment',
2675a72cfb80SBram Moolenaar      ])
2676a72cfb80SBram Moolenaar  CheckScriptFailure([
2677a72cfb80SBram Moolenaar      'vim9script',
26789898107fSBram Moolenaar      'function " comment',
26799898107fSBram Moolenaar      ], 'E129:')
26809898107fSBram Moolenaar  CheckScriptFailure([
26819898107fSBram Moolenaar      'vim9script',
2682a72cfb80SBram Moolenaar      'function# comment',
2683f8103f27SBram Moolenaar      ], 'E1144:')
2684a72cfb80SBram Moolenaar  CheckScriptSuccess([
2685a72cfb80SBram Moolenaar      'vim9script',
2686a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2687a72cfb80SBram Moolenaar      ])
2688a72cfb80SBram Moolenaar  CheckScriptFailure([
2689a72cfb80SBram Moolenaar      'vim9script',
2690a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2691a72cfb80SBram Moolenaar      ], 'E488:')
2692a72cfb80SBram Moolenaar
2693a72cfb80SBram Moolenaar  CheckScriptSuccess([
2694a72cfb80SBram Moolenaar      'vim9script',
26954c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2696a72cfb80SBram Moolenaar      'endfunc',
26974c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2698a72cfb80SBram Moolenaar      ])
2699a72cfb80SBram Moolenaar  CheckScriptFailure([
2700a72cfb80SBram Moolenaar      'vim9script',
27014c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2702a72cfb80SBram Moolenaar      'endfunc',
27034c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2704a72cfb80SBram Moolenaar      ], 'E488:')
2705a72cfb80SBram Moolenaar
2706a72cfb80SBram Moolenaar  CheckScriptSuccess([
2707a72cfb80SBram Moolenaar      'vim9script',
2708a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2709a72cfb80SBram Moolenaar      ])
2710a72cfb80SBram Moolenaar  CheckScriptFailure([
2711a72cfb80SBram Moolenaar      'vim9script',
2712a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2713a72cfb80SBram Moolenaar      ], 'E488:')
2714e7e4838fSBram Moolenaar
2715e7e4838fSBram Moolenaar  CheckScriptFailure([
2716e7e4838fSBram Moolenaar      'def Test() " comment',
2717e7e4838fSBram Moolenaar      'enddef',
2718e7e4838fSBram Moolenaar      ], 'E488:')
2719e7e4838fSBram Moolenaar  CheckScriptFailure([
2720e7e4838fSBram Moolenaar      'vim9script',
2721e7e4838fSBram Moolenaar      'def Test() " comment',
2722e7e4838fSBram Moolenaar      'enddef',
2723e7e4838fSBram Moolenaar      ], 'E488:')
2724e7e4838fSBram Moolenaar
2725e7e4838fSBram Moolenaar  CheckScriptSuccess([
2726e7e4838fSBram Moolenaar      'func Test() " comment',
2727e7e4838fSBram Moolenaar      'endfunc',
27282d870f8dSBram Moolenaar      'delfunc Test',
2729e7e4838fSBram Moolenaar      ])
27309898107fSBram Moolenaar  CheckScriptSuccess([
2731e7e4838fSBram Moolenaar      'vim9script',
2732e7e4838fSBram Moolenaar      'func Test() " comment',
2733e7e4838fSBram Moolenaar      'endfunc',
27349898107fSBram Moolenaar      ])
2735e7e4838fSBram Moolenaar
2736e7e4838fSBram Moolenaar  CheckScriptSuccess([
2737e7e4838fSBram Moolenaar      'def Test() # comment',
2738e7e4838fSBram Moolenaar      'enddef',
2739e7e4838fSBram Moolenaar      ])
2740e7e4838fSBram Moolenaar  CheckScriptFailure([
2741e7e4838fSBram Moolenaar      'func Test() # comment',
2742e7e4838fSBram Moolenaar      'endfunc',
2743e7e4838fSBram Moolenaar      ], 'E488:')
27442c5ed4e3SBram Moolenaarenddef
27452c5ed4e3SBram Moolenaar
27462c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27472c5ed4e3SBram Moolenaar  CheckCanRunGui
27482c5ed4e3SBram Moolenaar
27492c5ed4e3SBram Moolenaar  CheckScriptFailure([
27502c5ed4e3SBram Moolenaar      'vim9script',
27512c5ed4e3SBram Moolenaar      'gui#comment'
2752f8103f27SBram Moolenaar      ], 'E1144:')
27532c5ed4e3SBram Moolenaar  CheckScriptFailure([
27542c5ed4e3SBram Moolenaar      'vim9script',
27552c5ed4e3SBram Moolenaar      'gui -f#comment'
27562c5ed4e3SBram Moolenaar      ], 'E499:')
27577a092245SBram Moolenaarenddef
27587a092245SBram Moolenaar
2759a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27606797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27616797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2762a26b9700SBram Moolenaar
2763a26b9700SBram Moolenaar  edit test.vim
2764a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2765a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2766a26b9700SBram Moolenaar
2767a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2768a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2769a26b9700SBram Moolenaar
2770a26b9700SBram Moolenaar  g:entered = 0
2771a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2772a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2773a26b9700SBram Moolenaar
2774a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2775a26b9700SBram Moolenaar
2776a26b9700SBram Moolenaar  au! TabEnter
2777a26b9700SBram Moolenaar  unlet g:entered
2778d72c1bf0SBram Moolenaar
2779d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2780d72c1bf0SBram Moolenaar      'vim9script',
27816797966dSBram Moolenaar      'g:var = 123',
2782e55b1c09SBram Moolenaar      'b:var = 456',
2783e55b1c09SBram Moolenaar      'w:var = 777',
2784e55b1c09SBram Moolenaar      't:var = 888',
2785d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2786d72c1bf0SBram Moolenaar      ])
2787d72c1bf0SBram Moolenaar
2788d72c1bf0SBram Moolenaar  CheckScriptFailure([
2789d72c1bf0SBram Moolenaar      'vim9script',
2790cfcd011fSBram Moolenaar      'let var = 123',
2791cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2792cfcd011fSBram Moolenaar
2793cfcd011fSBram Moolenaar  CheckScriptFailure([
2794cfcd011fSBram Moolenaar      'vim9script',
2795cfcd011fSBram Moolenaar      'var g:var = 123',
2796e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2797e55b1c09SBram Moolenaar
2798e55b1c09SBram Moolenaar  CheckScriptFailure([
2799e55b1c09SBram Moolenaar      'vim9script',
2800cfcd011fSBram Moolenaar      'var b:var = 123',
2801e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2802e55b1c09SBram Moolenaar
2803e55b1c09SBram Moolenaar  CheckScriptFailure([
2804e55b1c09SBram Moolenaar      'vim9script',
2805cfcd011fSBram Moolenaar      'var w:var = 123',
2806e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2807e55b1c09SBram Moolenaar
2808e55b1c09SBram Moolenaar  CheckScriptFailure([
2809e55b1c09SBram Moolenaar      'vim9script',
2810cfcd011fSBram Moolenaar      'var t:var = 123',
2811e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2812e55b1c09SBram Moolenaar
2813e55b1c09SBram Moolenaar  CheckScriptFailure([
2814e55b1c09SBram Moolenaar      'vim9script',
2815cfcd011fSBram Moolenaar      'var v:version = 123',
2816e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2817e55b1c09SBram Moolenaar
2818e55b1c09SBram Moolenaar  CheckScriptFailure([
2819e55b1c09SBram Moolenaar      'vim9script',
2820cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2821e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28226797966dSBram Moolenaar
28236797966dSBram Moolenaar  CheckScriptFailure([
28246797966dSBram Moolenaar      'vim9script',
28256797966dSBram Moolenaar      'g:var = 123',
282632e35117SBram Moolenaar      'unlet g:var# comment1',
2827d72c1bf0SBram Moolenaar      ], 'E108:')
2828d72c1bf0SBram Moolenaar
2829d72c1bf0SBram Moolenaar  CheckScriptFailure([
2830d72c1bf0SBram Moolenaar      'let g:var = 123',
2831d72c1bf0SBram Moolenaar      'unlet g:var # something',
2832d72c1bf0SBram Moolenaar      ], 'E488:')
2833faac4104SBram Moolenaar
2834faac4104SBram Moolenaar  CheckScriptSuccess([
2835faac4104SBram Moolenaar      'vim9script',
283632e35117SBram Moolenaar      'if 1 # comment2',
2837faac4104SBram Moolenaar      '  echo "yes"',
2838faac4104SBram Moolenaar      'elseif 2 #comment',
2839faac4104SBram Moolenaar      '  echo "no"',
2840faac4104SBram Moolenaar      'endif',
2841faac4104SBram Moolenaar      ])
2842faac4104SBram Moolenaar
2843faac4104SBram Moolenaar  CheckScriptFailure([
2844faac4104SBram Moolenaar      'vim9script',
284532e35117SBram Moolenaar      'if 1# comment3',
2846faac4104SBram Moolenaar      '  echo "yes"',
2847faac4104SBram Moolenaar      'endif',
2848faac4104SBram Moolenaar      ], 'E15:')
2849faac4104SBram Moolenaar
2850faac4104SBram Moolenaar  CheckScriptFailure([
2851faac4104SBram Moolenaar      'vim9script',
285232e35117SBram Moolenaar      'if 0 # comment4',
2853faac4104SBram Moolenaar      '  echo "yes"',
2854faac4104SBram Moolenaar      'elseif 2#comment',
2855faac4104SBram Moolenaar      '  echo "no"',
2856faac4104SBram Moolenaar      'endif',
2857faac4104SBram Moolenaar      ], 'E15:')
2858faac4104SBram Moolenaar
2859faac4104SBram Moolenaar  CheckScriptSuccess([
2860faac4104SBram Moolenaar      'vim9script',
2861cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2862faac4104SBram Moolenaar      ])
2863faac4104SBram Moolenaar
2864faac4104SBram Moolenaar  CheckScriptFailure([
2865faac4104SBram Moolenaar      'vim9script',
2866cfcd011fSBram Moolenaar      'var v = 1# comment6',
286732e35117SBram Moolenaar      ], 'E15:')
2868faac4104SBram Moolenaar
2869faac4104SBram Moolenaar  CheckScriptSuccess([
2870faac4104SBram Moolenaar      'vim9script',
2871faac4104SBram Moolenaar      'new'
2872d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2873df069eecSBram Moolenaar      ':$',
2874faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2875faac4104SBram Moolenaar      'bwipe!',
2876faac4104SBram Moolenaar      ])
2877faac4104SBram Moolenaar
2878f5be8cdbSBram Moolenaar  CheckScriptFailure([
2879f5be8cdbSBram Moolenaar      'vim9script',
2880f5be8cdbSBram Moolenaar      'new'
2881d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2882f5be8cdbSBram Moolenaar      ':$',
2883f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2884f5be8cdbSBram Moolenaar      'bwipe!',
2885f5be8cdbSBram Moolenaar      ], 'E488:')
2886f5be8cdbSBram Moolenaar
2887f5be8cdbSBram Moolenaar  CheckScriptFailure([
2888f5be8cdbSBram Moolenaar      'vim9script',
2889f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2890f5be8cdbSBram Moolenaar      ], 'E477:')
2891a26b9700SBram Moolenaarenddef
2892a26b9700SBram Moolenaar
28937e5bd91dSBram Moolenaardef Test_finish()
2894cfcd011fSBram Moolenaar  var lines =<< trim END
28957e5bd91dSBram Moolenaar    vim9script
28966797966dSBram Moolenaar    g:res = 'one'
28977e5bd91dSBram Moolenaar    if v:false | finish | endif
28986797966dSBram Moolenaar    g:res = 'two'
28997e5bd91dSBram Moolenaar    finish
29006797966dSBram Moolenaar    g:res = 'three'
29017e5bd91dSBram Moolenaar  END
29027e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29037e5bd91dSBram Moolenaar  source Xfinished
29047e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29057e5bd91dSBram Moolenaar
29067e5bd91dSBram Moolenaar  unlet g:res
29077e5bd91dSBram Moolenaar  delete('Xfinished')
29087e5bd91dSBram Moolenaarenddef
29097e5bd91dSBram Moolenaar
2910a5d0077eSBram Moolenaardef Test_forward_declaration()
2911cfcd011fSBram Moolenaar  var lines =<< trim END
2912a5d0077eSBram Moolenaar    vim9script
2913a5d0077eSBram Moolenaar    def GetValue(): string
2914a5d0077eSBram Moolenaar      return theVal
2915a5d0077eSBram Moolenaar    enddef
2916cfcd011fSBram Moolenaar    var theVal = 'something'
2917822ba247SBram Moolenaar    g:initVal = GetValue()
2918a5d0077eSBram Moolenaar    theVal = 'else'
2919a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2920a5d0077eSBram Moolenaar  END
2921a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2922a5d0077eSBram Moolenaar  source Xforward
2923a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2924a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2925a5d0077eSBram Moolenaar
2926a5d0077eSBram Moolenaar  unlet g:initVal
2927a5d0077eSBram Moolenaar  unlet g:laterVal
2928a5d0077eSBram Moolenaar  delete('Xforward')
2929a5d0077eSBram Moolenaarenddef
2930a5d0077eSBram Moolenaar
29319721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2932a6294955SBram Moolenaar  var vim9_lines =<< trim END
2933a6294955SBram Moolenaar    vim9script
2934a6294955SBram Moolenaar    var local = 'local'
2935a6294955SBram Moolenaar    g:global = 'global'
2936a6294955SBram Moolenaar    export var exported = 'exported'
2937a6294955SBram Moolenaar    export def GetText(): string
2938a6294955SBram Moolenaar       return 'text'
2939a6294955SBram Moolenaar    enddef
2940a6294955SBram Moolenaar  END
2941a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
2942a6294955SBram Moolenaar
2943cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
29449721fb4eSBram Moolenaar    source Xvim9_script.vim
29459721fb4eSBram Moolenaar
29469721fb4eSBram Moolenaar    call assert_false(exists('local'))
29479721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29489721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29499721fb4eSBram Moolenaar    call assert_equal('global', global)
29509721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29519721fb4eSBram Moolenaar
29529721fb4eSBram Moolenaar    " imported variable becomes script-local
29539721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29549721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29559721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29569721fb4eSBram Moolenaar
29579721fb4eSBram Moolenaar    " imported function becomes script-local
29589721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29599721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29609721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29619721fb4eSBram Moolenaar  END
29629721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29639721fb4eSBram Moolenaar
29649721fb4eSBram Moolenaar  source Xlegacy_script.vim
29659721fb4eSBram Moolenaar  assert_equal('global', g:global)
2966f5be8cdbSBram Moolenaar  unlet g:global
29679721fb4eSBram Moolenaar
29689721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29699721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29709721fb4eSBram Moolenaarenddef
2971a5d0077eSBram Moolenaar
29727d699701SBram Moolenaarfunc Test_vim9script_not_global()
29737d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
29747d699701SBram Moolenaar  let vim9lines =<< trim END
29757d699701SBram Moolenaar    vim9script
2976cfcd011fSBram Moolenaar    var name = 'local'
29777d699701SBram Moolenaar    func TheFunc()
29787d699701SBram Moolenaar      echo 'local'
29797d699701SBram Moolenaar    endfunc
29807d699701SBram Moolenaar    def DefFunc()
29817d699701SBram Moolenaar      echo 'local'
29827d699701SBram Moolenaar    enddef
29837d699701SBram Moolenaar  END
29847d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
29857d699701SBram Moolenaar  source Xvim9script.vim
29867d699701SBram Moolenaar  try
29877d699701SBram Moolenaar    echo g:var
29887d699701SBram Moolenaar    assert_report('did not fail')
29897d699701SBram Moolenaar  catch /E121:/
29907d699701SBram Moolenaar    " caught
29917d699701SBram Moolenaar  endtry
29927d699701SBram Moolenaar  try
29937d699701SBram Moolenaar    call TheFunc()
29947d699701SBram Moolenaar    assert_report('did not fail')
29957d699701SBram Moolenaar  catch /E117:/
29967d699701SBram Moolenaar    " caught
29977d699701SBram Moolenaar  endtry
29987d699701SBram Moolenaar  try
29997d699701SBram Moolenaar    call DefFunc()
30007d699701SBram Moolenaar    assert_report('did not fail')
30017d699701SBram Moolenaar  catch /E117:/
30027d699701SBram Moolenaar    " caught
30037d699701SBram Moolenaar  endtry
30047d699701SBram Moolenaar
300525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
30067d699701SBram Moolenaarendfunc
30077d699701SBram Moolenaar
3008eeb27bfeSBram Moolenaardef Test_vim9_copen()
3009eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3010eeb27bfeSBram Moolenaar  copen
3011eeb27bfeSBram Moolenaar  quit
3012eeb27bfeSBram Moolenaarenddef
3013eeb27bfeSBram Moolenaar
301403290b84SBram Moolenaar" test using an auto-loaded function and variable
30152d6b20d6SBram Moolenaardef Test_vim9_autoload()
3016cfcd011fSBram Moolenaar  var lines =<< trim END
30172d6b20d6SBram Moolenaar     vim9script
301803290b84SBram Moolenaar     def some#gettest(): string
301903290b84SBram Moolenaar       return 'test'
302003290b84SBram Moolenaar     enddef
302103290b84SBram Moolenaar     g:some#name = 'name'
302203290b84SBram Moolenaar  END
302303290b84SBram Moolenaar
302403290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
302503290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
302603290b84SBram Moolenaar  var save_rtp = &rtp
302703290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
302803290b84SBram Moolenaar
302903290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
303003290b84SBram Moolenaar  assert_equal('name', g:some#name)
303103290b84SBram Moolenaar  g:some#other = 'other'
303203290b84SBram Moolenaar  assert_equal('other', g:some#other)
303303290b84SBram Moolenaar
303417f700acSBram Moolenaar  # upper case script name works
303517f700acSBram Moolenaar  lines =<< trim END
303617f700acSBram Moolenaar     vim9script
303717f700acSBram Moolenaar     def Other#getOther(): string
303817f700acSBram Moolenaar       return 'other'
303917f700acSBram Moolenaar     enddef
304017f700acSBram Moolenaar  END
304117f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
304217f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
304317f700acSBram Moolenaar
304403290b84SBram Moolenaar  delete('Xdir', 'rf')
304503290b84SBram Moolenaar  &rtp = save_rtp
304603290b84SBram Moolenaarenddef
304703290b84SBram Moolenaar
304803290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
304903290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
305003290b84SBram Moolenaar  var lines =<< trim END
305103290b84SBram Moolenaar     vim9script
30522d6b20d6SBram Moolenaar     def foo#test()
30532d6b20d6SBram Moolenaar         echomsg getreg('"')
30542d6b20d6SBram Moolenaar     enddef
30552d6b20d6SBram Moolenaar  END
30562d6b20d6SBram Moolenaar
30572d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
30582d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3059cfcd011fSBram Moolenaar  var save_rtp = &rtp
30602d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
30612d6b20d6SBram Moolenaar  augroup test
30622d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
30632d6b20d6SBram Moolenaar  augroup END
30642d6b20d6SBram Moolenaar
30652d6b20d6SBram Moolenaar  normal Y
30662d6b20d6SBram Moolenaar
30672d6b20d6SBram Moolenaar  augroup test
30682d6b20d6SBram Moolenaar    autocmd!
30692d6b20d6SBram Moolenaar  augroup END
30702d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
30712d6b20d6SBram Moolenaar  &rtp = save_rtp
30722d6b20d6SBram Moolenaarenddef
30732d6b20d6SBram Moolenaar
307477e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
307577e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3076cfcd011fSBram Moolenaar  var lines =<< trim END
307777e5dcc3SBram Moolenaar      vim9script
307877e5dcc3SBram Moolenaar      def crash#func()
307977e5dcc3SBram Moolenaar          try
308077e5dcc3SBram Moolenaar              for x in List()
308177e5dcc3SBram Moolenaar              endfor
308277e5dcc3SBram Moolenaar          catch
308377e5dcc3SBram Moolenaar          endtry
308477e5dcc3SBram Moolenaar          g:ok = true
308577e5dcc3SBram Moolenaar      enddef
308677e5dcc3SBram Moolenaar      fu List()
308777e5dcc3SBram Moolenaar          invalid
308877e5dcc3SBram Moolenaar      endfu
308977e5dcc3SBram Moolenaar      try
309048e11c10SBram Moolenaar          alsoinvalid
309177e5dcc3SBram Moolenaar      catch /wontmatch/
309277e5dcc3SBram Moolenaar      endtry
309377e5dcc3SBram Moolenaar  END
309477e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
309577e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
309677e5dcc3SBram Moolenaar
309777e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
309877e5dcc3SBram Moolenaar  lines =<< trim END
309977e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
310077e5dcc3SBram Moolenaar    call crash#func()
310177e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
31029c4f5520SBram Moolenaar    qall!
310377e5dcc3SBram Moolenaar  END
310477e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
310577e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
310677e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
310777e5dcc3SBram Moolenaar
310877e5dcc3SBram Moolenaar  delete('Xdidit')
310977e5dcc3SBram Moolenaar  delete('Xscript')
311077e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
311103290b84SBram Moolenaar
311203290b84SBram Moolenaar  lines =<< trim END
311303290b84SBram Moolenaar    vim9script
311403290b84SBram Moolenaar    var foo#bar = 'asdf'
311503290b84SBram Moolenaar  END
311603290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
311777e5dcc3SBram Moolenaarenddef
311877e5dcc3SBram Moolenaar
311981e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
312081e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
312181e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3122cfcd011fSBram Moolenaar  var lines =<< trim END
312381e17fbeSBram Moolenaar    let s:counter = 1
312481e17fbeSBram Moolenaar    def s:Func()
312581e17fbeSBram Moolenaar      au! CursorHold
312681e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
312781e17fbeSBram Moolenaar    enddef
312881e17fbeSBram Moolenaar    call s:Func()
312981e17fbeSBram Moolenaar    doau CursorHold
313081e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
313181e17fbeSBram Moolenaar    au! CursorHold
313281e17fbeSBram Moolenaar  END
313381e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
313481e17fbeSBram Moolenaarenddef
313581e17fbeSBram Moolenaar
31363896a105SBram Moolenaardef Test_cmdline_win()
31373896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31383896a105SBram Moolenaar  # the command line window.
31393896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3140cfcd011fSBram Moolenaar  var export_lines =<< trim END
31413896a105SBram Moolenaar    vim9script
3142cfcd011fSBram Moolenaar    export var That = 'yes'
31433896a105SBram Moolenaar  END
31443896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3145cfcd011fSBram Moolenaar  var import_lines =<< trim END
31463896a105SBram Moolenaar    vim9script
31473896a105SBram Moolenaar    import That from './Xexport.vim'
31483896a105SBram Moolenaar  END
31493896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3150cfcd011fSBram Moolenaar  var save_rtp = &rtp
31513896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
31523896a105SBram Moolenaar  syntax on
31533896a105SBram Moolenaar  augroup CmdWin
31543896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
31553896a105SBram Moolenaar  augroup END
31563896a105SBram Moolenaar  # this will open and also close the cmdline window
31573896a105SBram Moolenaar  feedkeys('q:', 'xt')
31583896a105SBram Moolenaar  assert_equal('yes', g:got_there)
31593896a105SBram Moolenaar
31603896a105SBram Moolenaar  augroup CmdWin
31613896a105SBram Moolenaar    au!
31623896a105SBram Moolenaar  augroup END
31633896a105SBram Moolenaar  &rtp = save_rtp
31643896a105SBram Moolenaar  delete('rtp', 'rf')
31653896a105SBram Moolenaarenddef
31663896a105SBram Moolenaar
3167e3d4685fSBram Moolenaardef Test_invalid_sid()
3168e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
316925859dd7SBram Moolenaar
31709c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3171d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3172e3d4685fSBram Moolenaar  endif
3173e3d4685fSBram Moolenaar  delete('Xdidit')
3174e3d4685fSBram Moolenaarenddef
3175e3d4685fSBram Moolenaar
31769ec7026fSBram Moolenaardef Test_restoring_cpo()
31779ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
31789ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
31799ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
31809ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
31819ec7026fSBram Moolenaar  endif
31829ec7026fSBram Moolenaar  delete('Xsourced')
31839ec7026fSBram Moolenaar  delete('Xclose')
3184090728adSBram Moolenaar  delete('Xdone')
31850123cc1eSBram Moolenaar
31860123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
31870123cc1eSBram Moolenaar  set cpo=aABceFsMny>
31880123cc1eSBram Moolenaar  edit XanotherScript
31890123cc1eSBram Moolenaar  so %
31900123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
31910123cc1eSBram Moolenaar  :1del
31920123cc1eSBram Moolenaar  w
31930123cc1eSBram Moolenaar  so %
31940123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
31950123cc1eSBram Moolenaar
31960123cc1eSBram Moolenaar  delete('XanotherScript')
31970123cc1eSBram Moolenaar  set cpo&vim
31989ec7026fSBram Moolenaarenddef
31999ec7026fSBram Moolenaar
32009ec7026fSBram Moolenaar
3201f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3202cfcd011fSBram Moolenaar  var lines =<< trim END
3203cfcd011fSBram Moolenaar    var name: any
3204cfcd011fSBram Moolenaar    assert_equal(0, name)
3205f0afd9e1SBram Moolenaar  END
3206f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3207f0afd9e1SBram Moolenaarenddef
3208f0afd9e1SBram Moolenaar
32097e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
321058dbef33SBram Moolenaar  CheckRunVimInTerminal
321158dbef33SBram Moolenaar
32127e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
32137e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
32147e9210eaSBram Moolenaarendfunc
32157e9210eaSBram Moolenaar
32167e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
32179c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3218cfcd011fSBram Moolenaar  var lines =<< trim END
32199c4f5520SBram Moolenaar    func CheckAndQuit()
32209c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
32219c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
32229c4f5520SBram Moolenaar    endfunc
32239c4f5520SBram Moolenaar  END
32249c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
32259c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3226e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
32279c4f5520SBram Moolenaar  # define Afunc() on the command line
32289c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
32299c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
32302949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
32319c4f5520SBram Moolenaar
32329c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
32339c4f5520SBram Moolenaar  delete('XcallFunc')
32349c4f5520SBram Moolenaar  delete('Xdidcmd')
32359c4f5520SBram Moolenaarenddef
32369c4f5520SBram Moolenaar
3237fcdc5d83SBram Moolenaardef Test_script_var_scope()
3238fcdc5d83SBram Moolenaar  var lines =<< trim END
3239fcdc5d83SBram Moolenaar      vim9script
3240fcdc5d83SBram Moolenaar      if true
3241fcdc5d83SBram Moolenaar        if true
3242fcdc5d83SBram Moolenaar          var one = 'one'
3243fcdc5d83SBram Moolenaar          echo one
3244fcdc5d83SBram Moolenaar        endif
3245fcdc5d83SBram Moolenaar        echo one
3246fcdc5d83SBram Moolenaar      endif
3247fcdc5d83SBram Moolenaar  END
3248fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3249fcdc5d83SBram Moolenaar
3250fcdc5d83SBram Moolenaar  lines =<< trim END
3251fcdc5d83SBram Moolenaar      vim9script
3252fcdc5d83SBram Moolenaar      if true
3253fcdc5d83SBram Moolenaar        if false
3254fcdc5d83SBram Moolenaar          var one = 'one'
3255fcdc5d83SBram Moolenaar          echo one
3256fcdc5d83SBram Moolenaar        else
3257fcdc5d83SBram Moolenaar          var one = 'one'
3258fcdc5d83SBram Moolenaar          echo one
3259fcdc5d83SBram Moolenaar        endif
3260fcdc5d83SBram Moolenaar        echo one
3261fcdc5d83SBram Moolenaar      endif
3262fcdc5d83SBram Moolenaar  END
3263fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3264fcdc5d83SBram Moolenaar
3265fcdc5d83SBram Moolenaar  lines =<< trim END
3266fcdc5d83SBram Moolenaar      vim9script
3267fcdc5d83SBram Moolenaar      while true
3268fcdc5d83SBram Moolenaar        var one = 'one'
3269fcdc5d83SBram Moolenaar        echo one
3270fcdc5d83SBram Moolenaar        break
3271fcdc5d83SBram Moolenaar      endwhile
3272fcdc5d83SBram Moolenaar      echo one
3273fcdc5d83SBram Moolenaar  END
3274fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3275fcdc5d83SBram Moolenaar
3276fcdc5d83SBram Moolenaar  lines =<< trim END
3277fcdc5d83SBram Moolenaar      vim9script
3278fcdc5d83SBram Moolenaar      for i in range(1)
3279fcdc5d83SBram Moolenaar        var one = 'one'
3280fcdc5d83SBram Moolenaar        echo one
3281fcdc5d83SBram Moolenaar      endfor
3282fcdc5d83SBram Moolenaar      echo one
3283fcdc5d83SBram Moolenaar  END
3284fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
32859becdf2bSBram Moolenaar
32869becdf2bSBram Moolenaar  lines =<< trim END
32879becdf2bSBram Moolenaar      vim9script
32889becdf2bSBram Moolenaar      {
32899becdf2bSBram Moolenaar        var one = 'one'
32909becdf2bSBram Moolenaar        assert_equal('one', one)
32919becdf2bSBram Moolenaar      }
32929becdf2bSBram Moolenaar      assert_false(exists('one'))
32939becdf2bSBram Moolenaar      assert_false(exists('s:one'))
32949becdf2bSBram Moolenaar  END
32959becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
32969becdf2bSBram Moolenaar
32979becdf2bSBram Moolenaar  lines =<< trim END
32989becdf2bSBram Moolenaar      vim9script
32999becdf2bSBram Moolenaar      {
33009becdf2bSBram Moolenaar        var one = 'one'
33019becdf2bSBram Moolenaar        echo one
33029becdf2bSBram Moolenaar      }
33039becdf2bSBram Moolenaar      echo one
33049becdf2bSBram Moolenaar  END
33059becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3306fcdc5d83SBram Moolenaarenddef
3307fcdc5d83SBram Moolenaar
3308352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3309352134bbSBram Moolenaar  var lines =<< trim END
3310352134bbSBram Moolenaar    vim9script
3311352134bbSBram Moolenaar    def Callback(...l: any)
3312352134bbSBram Moolenaar      try
3313352134bbSBram Moolenaar        var x: string
3314352134bbSBram Moolenaar        var y: string
3315352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3316352134bbSBram Moolenaar        [x, y] = ['']
3317352134bbSBram Moolenaar      catch
3318352134bbSBram Moolenaar        g:caught = 'yes'
3319352134bbSBram Moolenaar      endtry
3320352134bbSBram Moolenaar    enddef
3321e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3322352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3323352134bbSBram Moolenaar  END
3324352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3325352134bbSBram Moolenaar
3326352134bbSBram Moolenaar  unlet g:caught
3327352134bbSBram Moolenaarenddef
3328352134bbSBram Moolenaar
3329631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3330631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3331631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3332631e8f93SBram Moolenaar  endif
3333631e8f93SBram Moolenaar  var lines =<< trim END
3334631e8f93SBram Moolenaar      vim9script
3335631e8f93SBram Moolenaar      var source: list<number>
3336631e8f93SBram Moolenaar      def Out_cb(...l: any)
3337631e8f93SBram Moolenaar          eval [][0]
3338631e8f93SBram Moolenaar      enddef
3339631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3340631e8f93SBram Moolenaar          sleep 1m
3341631e8f93SBram Moolenaar          source += l
3342631e8f93SBram Moolenaar      enddef
3343e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
33446f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
33456f17a3f0SBram Moolenaar        sleep 10m
33466f17a3f0SBram Moolenaar      endwhile
3347206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3348206c2a6eSBram Moolenaar      sleep 100m
3349631e8f93SBram Moolenaar  END
3350631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3351631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3352631e8f93SBram Moolenaar  delete('Xdef')
3353631e8f93SBram Moolenaarenddef
3354631e8f93SBram Moolenaar
33554324d87aSBram Moolenaardef InvokeNormal()
33564324d87aSBram Moolenaar  exe "norm! :m+1\r"
33574324d87aSBram Moolenaarenddef
33584324d87aSBram Moolenaar
33594324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
33604324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
33614324d87aSBram Moolenaar  new
33624324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
33634324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
33644324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
33654324d87aSBram Moolenaar  xunmap <F3>
3366b5b9480eSBram Moolenaarenddef
3367b5b9480eSBram Moolenaar
3368b5b9480eSBram Moolenaardef Test_white_space_after_command()
3369b5b9480eSBram Moolenaar  var lines =<< trim END
3370b5b9480eSBram Moolenaar    exit_cb: Func})
3371b5b9480eSBram Moolenaar  END
3372b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3373f8103f27SBram Moolenaar
3374f8103f27SBram Moolenaar  lines =<< trim END
3375f8103f27SBram Moolenaar    e#
3376f8103f27SBram Moolenaar  END
3377f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
33784324d87aSBram Moolenaarenddef
33794324d87aSBram Moolenaar
33804aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
33814aab88d9SBram Moolenaar  var lines =<< trim END
33824aab88d9SBram Moolenaar      vim9script
33834aab88d9SBram Moolenaar      if exists('g:guard')
33844aab88d9SBram Moolenaar        finish
33854aab88d9SBram Moolenaar      endif
33864aab88d9SBram Moolenaar      g:guard = 1
33874aab88d9SBram Moolenaar      var name = 'thename'
33884aab88d9SBram Moolenaar      def g:GetName(): string
33894aab88d9SBram Moolenaar        return name
33904aab88d9SBram Moolenaar      enddef
33914aab88d9SBram Moolenaar      def g:SetName(arg: string)
33924aab88d9SBram Moolenaar        name = arg
33934aab88d9SBram Moolenaar      enddef
33944aab88d9SBram Moolenaar  END
33954aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
33964aab88d9SBram Moolenaar  so XscriptTwice.vim
33974aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
33984aab88d9SBram Moolenaar  g:SetName('newname')
33994aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
34004aab88d9SBram Moolenaar  so XscriptTwice.vim
34014aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34024aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
34034aab88d9SBram Moolenaar
34044aab88d9SBram Moolenaar  delfunc g:GetName
34054aab88d9SBram Moolenaar  delfunc g:SetName
34064aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
34074aab88d9SBram Moolenaar  unlet g:guard
34084aab88d9SBram Moolenaarenddef
34094aab88d9SBram Moolenaar
34104aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
34114aab88d9SBram Moolenaar  var exportlines =<< trim END
34124aab88d9SBram Moolenaar      vim9script
34134aab88d9SBram Moolenaar      if exists('g:guard')
34144aab88d9SBram Moolenaar        finish
34154aab88d9SBram Moolenaar      endif
34164aab88d9SBram Moolenaar      g:guard = 1
34174aab88d9SBram Moolenaar      export var name = 'someName'
34184aab88d9SBram Moolenaar  END
34194aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
34204aab88d9SBram Moolenaar
34214aab88d9SBram Moolenaar  var lines =<< trim END
34224aab88d9SBram Moolenaar      vim9script
34234aab88d9SBram Moolenaar      import name from './XexportScript.vim'
34244aab88d9SBram Moolenaar      def g:GetName(): string
34254aab88d9SBram Moolenaar        return name
34264aab88d9SBram Moolenaar      enddef
34274aab88d9SBram Moolenaar  END
34284aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
34294aab88d9SBram Moolenaar  so XscriptImport.vim
34304aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
34314aab88d9SBram Moolenaar
34324aab88d9SBram Moolenaar  so XexportScript.vim
34334aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34344aab88d9SBram Moolenaar
34354aab88d9SBram Moolenaar  delfunc g:GetName
34364aab88d9SBram Moolenaar  delete('XexportScript.vim')
34374aab88d9SBram Moolenaar  delete('XscriptImport.vim')
34384aab88d9SBram Moolenaar  unlet g:guard
34394aab88d9SBram Moolenaarenddef
34404aab88d9SBram Moolenaar
3441585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3442585fea7bSBram Moolenaardef Test_substitute_cmd()
3443585fea7bSBram Moolenaar  new
3444585fea7bSBram Moolenaar  setline(1, 'something')
3445585fea7bSBram Moolenaar  :substitute(some(other(
3446585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3447585fea7bSBram Moolenaar  bwipe!
3448585fea7bSBram Moolenaar
3449f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3450cfcd011fSBram Moolenaar  var lines =<< trim END
3451585fea7bSBram Moolenaar    vim9script
3452585fea7bSBram Moolenaar    new
3453585fea7bSBram Moolenaar    setline(1, 'something')
3454585fea7bSBram Moolenaar    :substitute(some(other(
3455585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3456585fea7bSBram Moolenaar    bwipe!
3457585fea7bSBram Moolenaar  END
3458585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3459585fea7bSBram Moolenaar  source Xvim9lines
3460585fea7bSBram Moolenaar
3461585fea7bSBram Moolenaar  delete('Xvim9lines')
3462585fea7bSBram Moolenaarenddef
3463585fea7bSBram Moolenaar
34648a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3465