18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25c2af0affSBram Moolenaar  bwipe!
26025cb1caSBram Moolenaar
27025cb1caSBram Moolenaar  # won't generate anything
28025cb1caSBram Moolenaar  if false
29025cb1caSBram Moolenaar    :123
30025cb1caSBram Moolenaar  endif
315d72ce69SBram Moolenaarenddef
325d72ce69SBram Moolenaar
33a6e67e4fSBram Moolenaarlet g:alist = [7]
34a6e67e4fSBram Moolenaarlet g:astring = 'text'
35f0b9f43cSBram Moolenaarlet g:anumber = 123
366e587dcbSBram Moolenaar
374c17ad94SBram Moolenaardef Test_delfunction()
38f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
394c17ad94SBram Moolenaar  CheckScriptSuccess([
404c17ad94SBram Moolenaar      'vim9script',
414c17ad94SBram Moolenaar      'func CheckMe()',
424c17ad94SBram Moolenaar      '  return 123',
434c17ad94SBram Moolenaar      'endfunc',
444c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
454c17ad94SBram Moolenaar      ])
464c17ad94SBram Moolenaar
47f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
484c17ad94SBram Moolenaar  CheckScriptFailure([
494c17ad94SBram Moolenaar      'vim9script',
504c17ad94SBram Moolenaar      'func DeleteMe1()',
514c17ad94SBram Moolenaar      'endfunc',
524c17ad94SBram Moolenaar      'delfunction DeleteMe1',
534c17ad94SBram Moolenaar      ], 'E1084:')
544c17ad94SBram Moolenaar  CheckScriptFailure([
554c17ad94SBram Moolenaar      'vim9script',
564c17ad94SBram Moolenaar      'func DeleteMe2()',
574c17ad94SBram Moolenaar      'endfunc',
584c17ad94SBram Moolenaar      'def DoThat()',
594c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
604c17ad94SBram Moolenaar      'enddef',
614c17ad94SBram Moolenaar      'DoThat()',
624c17ad94SBram Moolenaar      ], 'E1084:')
634c17ad94SBram Moolenaar  CheckScriptFailure([
644c17ad94SBram Moolenaar      'vim9script',
654c17ad94SBram Moolenaar      'def DeleteMe3()',
664c17ad94SBram Moolenaar      'enddef',
674c17ad94SBram Moolenaar      'delfunction DeleteMe3',
684c17ad94SBram Moolenaar      ], 'E1084:')
694c17ad94SBram Moolenaar  CheckScriptFailure([
704c17ad94SBram Moolenaar      'vim9script',
714c17ad94SBram Moolenaar      'def DeleteMe4()',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'def DoThat()',
744c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
754c17ad94SBram Moolenaar      'enddef',
764c17ad94SBram Moolenaar      'DoThat()',
774c17ad94SBram Moolenaar      ], 'E1084:')
78925e9fd6SBram Moolenaar
79925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
80cfcd011fSBram Moolenaar  var lines =<< trim END
81925e9fd6SBram Moolenaar      vim9script
82925e9fd6SBram Moolenaar      def g:Global(): string
83925e9fd6SBram Moolenaar        return "yes"
84925e9fd6SBram Moolenaar      enddef
85925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
86925e9fd6SBram Moolenaar      def! g:Global(): string
87925e9fd6SBram Moolenaar        return "no"
88925e9fd6SBram Moolenaar      enddef
89925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
90925e9fd6SBram Moolenaar      delfunc g:Global
91925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
92925e9fd6SBram Moolenaar  END
93925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
94925e9fd6SBram Moolenaar
95925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
96925e9fd6SBram Moolenaar  lines =<< trim END
97925e9fd6SBram Moolenaar      vim9script
98925e9fd6SBram Moolenaar      func g:Global()
99925e9fd6SBram Moolenaar        return "yes"
100925e9fd6SBram Moolenaar      endfunc
101925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
102925e9fd6SBram Moolenaar      def! g:Global(): string
103925e9fd6SBram Moolenaar        return "no"
104925e9fd6SBram Moolenaar      enddef
105925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
106925e9fd6SBram Moolenaar      delfunc g:Global
107925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
108925e9fd6SBram Moolenaar  END
109925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
110925e9fd6SBram Moolenaar
111925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
112925e9fd6SBram Moolenaar  lines =<< trim END
113925e9fd6SBram Moolenaar      vim9script
114925e9fd6SBram Moolenaar      def g:Global(): string
115925e9fd6SBram Moolenaar        return "yes"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
118925e9fd6SBram Moolenaar      func! g:Global()
119925e9fd6SBram Moolenaar        return "no"
120925e9fd6SBram Moolenaar      endfunc
121925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
122925e9fd6SBram Moolenaar      delfunc g:Global
123925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
124925e9fd6SBram Moolenaar  END
125925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1264c17ad94SBram Moolenaarenddef
1274c17ad94SBram Moolenaar
12808052228SBram Moolenaardef Test_wrong_type()
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
131cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
133599c89c8SBram Moolenaar
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13642a480bfSBram Moolenaar
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
148a0a9f43aSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
15108052228SBram Moolenaarenddef
1528a7d6542SBram Moolenaar
15310c65860SBram Moolenaardef Test_script_wrong_type()
15410c65860SBram Moolenaar  var lines =<< trim END
15510c65860SBram Moolenaar      vim9script
15610c65860SBram Moolenaar      var s:dict: dict<string>
15710c65860SBram Moolenaar      s:dict['a'] = ['x']
15810c65860SBram Moolenaar  END
15910c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
16010c65860SBram Moolenaarenddef
16110c65860SBram Moolenaar
16208052228SBram Moolenaardef Test_const()
163cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
164cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
165cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16630fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16730fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
168dbeecb2bSBram Moolenaar
169cfcd011fSBram Moolenaar  var lines =<< trim END
17030fd8204SBram Moolenaar    final list = [1, 2, 3]
171dbeecb2bSBram Moolenaar    list[0] = 4
1720b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
17330fd8204SBram Moolenaar    const other = [5, 6, 7]
1740b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17571abe482SBram Moolenaar
176cfcd011fSBram Moolenaar    var varlist = [7, 8]
17730fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17871abe482SBram Moolenaar    varlist[0] = 77
17971abe482SBram Moolenaar    # TODO: does not work yet
18071abe482SBram Moolenaar    # constlist[1][1] = 88
181cfcd011fSBram Moolenaar    var cl = constlist[1]
18271abe482SBram Moolenaar    cl[1] = 88
18371abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
18471abe482SBram Moolenaar
185e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
186e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
18771abe482SBram Moolenaar    vardict['five'] = 55
18871abe482SBram Moolenaar    # TODO: does not work yet
18971abe482SBram Moolenaar    # constdict['two']['six'] = 66
190cfcd011fSBram Moolenaar    var cd = constdict['two']
19171abe482SBram Moolenaar    cd['six'] = 66
192e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
193dbeecb2bSBram Moolenaar  END
194dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19508052228SBram Moolenaarenddef
1968a7d6542SBram Moolenaar
1970b4c66c6SBram Moolenaardef Test_const_bang()
198cfcd011fSBram Moolenaar  var lines =<< trim END
19930fd8204SBram Moolenaar      const var = 234
2000b4c66c6SBram Moolenaar      var = 99
2010b4c66c6SBram Moolenaar  END
2020b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2030b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2040b4c66c6SBram Moolenaar
2050b4c66c6SBram Moolenaar  lines =<< trim END
20630fd8204SBram Moolenaar      const ll = [2, 3, 4]
2070b4c66c6SBram Moolenaar      ll[0] = 99
2080b4c66c6SBram Moolenaar  END
2090b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2100b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2110b4c66c6SBram Moolenaar
2120b4c66c6SBram Moolenaar  lines =<< trim END
21330fd8204SBram Moolenaar      const ll = [2, 3, 4]
2140b4c66c6SBram Moolenaar      ll[3] = 99
2150b4c66c6SBram Moolenaar  END
2160b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2170b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2180b4c66c6SBram Moolenaar
2190b4c66c6SBram Moolenaar  lines =<< trim END
220e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2210b4c66c6SBram Moolenaar      dd["one"] = 99
2220b4c66c6SBram Moolenaar  END
2230b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2240b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2250b4c66c6SBram Moolenaar
2260b4c66c6SBram Moolenaar  lines =<< trim END
227e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2280b4c66c6SBram Moolenaar      dd["three"] = 99
2290b4c66c6SBram Moolenaar  END
2300b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2310b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2320b4c66c6SBram Moolenaarenddef
2330b4c66c6SBram Moolenaar
234df069eecSBram Moolenaardef Test_range_no_colon()
235d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
236d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
237d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
238d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
239df069eecSBram Moolenaarenddef
240df069eecSBram Moolenaar
241df069eecSBram Moolenaar
2428a7d6542SBram Moolenaardef Test_block()
243cfcd011fSBram Moolenaar  var outer = 1
2448a7d6542SBram Moolenaar  {
245cfcd011fSBram Moolenaar    var inner = 2
2468a7d6542SBram Moolenaar    assert_equal(1, outer)
2478a7d6542SBram Moolenaar    assert_equal(2, inner)
2488a7d6542SBram Moolenaar  }
2498a7d6542SBram Moolenaar  assert_equal(1, outer)
2508a7d6542SBram Moolenaarenddef
2518a7d6542SBram Moolenaar
25208052228SBram Moolenaardef Test_block_failure()
253cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
25408052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25508052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25608052228SBram Moolenaarenddef
2578a7d6542SBram Moolenaar
258fbbcd003SBram Moolenaardef Test_block_local_vars()
259fbbcd003SBram Moolenaar  var lines =<< trim END
260fbbcd003SBram Moolenaar      vim9script
261ed234f24SBram Moolenaar      v:testing = 1
262fbbcd003SBram Moolenaar      if true
263ed234f24SBram Moolenaar        var text = ['hello']
264ed234f24SBram Moolenaar        def SayHello(): list<string>
265fbbcd003SBram Moolenaar          return text
266fbbcd003SBram Moolenaar        enddef
267fbbcd003SBram Moolenaar        def SetText(v: string)
268ed234f24SBram Moolenaar          text = [v]
269fbbcd003SBram Moolenaar        enddef
270fbbcd003SBram Moolenaar      endif
271fbbcd003SBram Moolenaar
272fbbcd003SBram Moolenaar      if true
273ed234f24SBram Moolenaar        var text = ['again']
274ed234f24SBram Moolenaar        def SayAgain(): list<string>
275fbbcd003SBram Moolenaar          return text
276fbbcd003SBram Moolenaar        enddef
277fbbcd003SBram Moolenaar      endif
278ed234f24SBram Moolenaar
279ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
280ed234f24SBram Moolenaar      test_garbagecollect_now()
281ed234f24SBram Moolenaar
282fbbcd003SBram Moolenaar      defcompile
283fbbcd003SBram Moolenaar
284ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
285ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
286fbbcd003SBram Moolenaar
287fbbcd003SBram Moolenaar      SetText('foobar')
288ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
289ed234f24SBram Moolenaar
290ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
291ed234f24SBram Moolenaar      qall!
292fbbcd003SBram Moolenaar  END
293ed234f24SBram Moolenaar
294ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
295ed234f24SBram Moolenaar  # context gets garbage collected.
296ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
297ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
298ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
299ed234f24SBram Moolenaar
300ed234f24SBram Moolenaar  delete('Xscript')
301ed234f24SBram Moolenaar  delete('Xdidit')
302fbbcd003SBram Moolenaarenddef
303fbbcd003SBram Moolenaar
30439ca4127SBram Moolenaardef Test_block_local_vars_with_func()
30539ca4127SBram Moolenaar  var lines =<< trim END
30639ca4127SBram Moolenaar      vim9script
30739ca4127SBram Moolenaar      if true
30839ca4127SBram Moolenaar        var foo = 'foo'
30939ca4127SBram Moolenaar        if true
31039ca4127SBram Moolenaar          var bar = 'bar'
31139ca4127SBram Moolenaar          def Func(): list<string>
31239ca4127SBram Moolenaar            return [foo, bar]
31339ca4127SBram Moolenaar          enddef
31439ca4127SBram Moolenaar        endif
31539ca4127SBram Moolenaar      endif
31639ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
31739ca4127SBram Moolenaar      # "foo" and "bar"
31839ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
31939ca4127SBram Moolenaar  END
32039ca4127SBram Moolenaar  CheckScriptSuccess(lines)
32139ca4127SBram Moolenaarenddef
32239ca4127SBram Moolenaar
323d032f34aSBram Moolenaarfunc g:NoSuchFunc()
324d032f34aSBram Moolenaar  echo 'none'
325d032f34aSBram Moolenaarendfunc
326d032f34aSBram Moolenaar
3278a7d6542SBram Moolenaardef Test_try_catch()
328cfcd011fSBram Moolenaar  var l = []
3297a092245SBram Moolenaar  try # comment
3308a7d6542SBram Moolenaar    add(l, '1')
3318a7d6542SBram Moolenaar    throw 'wrong'
3328a7d6542SBram Moolenaar    add(l, '2')
3337a092245SBram Moolenaar  catch # comment
3348a7d6542SBram Moolenaar    add(l, v:exception)
3357a092245SBram Moolenaar  finally # comment
3368a7d6542SBram Moolenaar    add(l, '3')
3377a092245SBram Moolenaar  endtry # comment
3388a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
33968d130c6SBram Moolenaar
340e859312eSBram Moolenaar  l = []
341e859312eSBram Moolenaar  try
342e859312eSBram Moolenaar    try
343e859312eSBram Moolenaar      add(l, '1')
344e859312eSBram Moolenaar      throw 'wrong'
345e859312eSBram Moolenaar      add(l, '2')
346e859312eSBram Moolenaar    catch /right/
347e859312eSBram Moolenaar      add(l, v:exception)
348e859312eSBram Moolenaar    endtry
349e859312eSBram Moolenaar  catch /wrong/
350e859312eSBram Moolenaar    add(l, 'caught')
351373863edSBram Moolenaar  fina
352e859312eSBram Moolenaar    add(l, 'finally')
353e859312eSBram Moolenaar  endtry
354e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
355e859312eSBram Moolenaar
356cfcd011fSBram Moolenaar  var n: number
35768d130c6SBram Moolenaar  try
35868d130c6SBram Moolenaar    n = l[3]
35968d130c6SBram Moolenaar  catch /E684:/
36068d130c6SBram Moolenaar    n = 99
36168d130c6SBram Moolenaar  endtry
36268d130c6SBram Moolenaar  assert_equal(99, n)
36368d130c6SBram Moolenaar
36468d130c6SBram Moolenaar  try
365cc673e74SBram Moolenaar    # string slice returns a string, not a number
36668d130c6SBram Moolenaar    n = g:astring[3]
3675e654230SBram Moolenaar  catch /E1012:/
36868d130c6SBram Moolenaar    n = 77
36968d130c6SBram Moolenaar  endtry
37068d130c6SBram Moolenaar  assert_equal(77, n)
37168d130c6SBram Moolenaar
37268d130c6SBram Moolenaar  try
37368d130c6SBram Moolenaar    n = l[g:astring]
3745e654230SBram Moolenaar  catch /E1012:/
37556acb094SBram Moolenaar    n = 88
37668d130c6SBram Moolenaar  endtry
37756acb094SBram Moolenaar  assert_equal(88, n)
37868d130c6SBram Moolenaar
37968d130c6SBram Moolenaar  try
38068d130c6SBram Moolenaar    n = s:does_not_exist
38168d130c6SBram Moolenaar  catch /E121:/
382f0b9f43cSBram Moolenaar    n = 111
383f0b9f43cSBram Moolenaar  endtry
384f0b9f43cSBram Moolenaar  assert_equal(111, n)
385f0b9f43cSBram Moolenaar
386f0b9f43cSBram Moolenaar  try
387f0b9f43cSBram Moolenaar    n = g:does_not_exist
388f0b9f43cSBram Moolenaar  catch /E121:/
38968d130c6SBram Moolenaar    n = 121
39068d130c6SBram Moolenaar  endtry
39168d130c6SBram Moolenaar  assert_equal(121, n)
39268d130c6SBram Moolenaar
393e0de171eSBram Moolenaar  var d = {one: 1}
39468d130c6SBram Moolenaar  try
39568d130c6SBram Moolenaar    n = d[g:astring]
39668d130c6SBram Moolenaar  catch /E716:/
39768d130c6SBram Moolenaar    n = 222
39868d130c6SBram Moolenaar  endtry
39968d130c6SBram Moolenaar  assert_equal(222, n)
400f0b9f43cSBram Moolenaar
401f0b9f43cSBram Moolenaar  try
402f0b9f43cSBram Moolenaar    n = -g:astring
403f0b9f43cSBram Moolenaar  catch /E39:/
404f0b9f43cSBram Moolenaar    n = 233
405f0b9f43cSBram Moolenaar  endtry
406f0b9f43cSBram Moolenaar  assert_equal(233, n)
407f0b9f43cSBram Moolenaar
408f0b9f43cSBram Moolenaar  try
409f0b9f43cSBram Moolenaar    n = +g:astring
410f0b9f43cSBram Moolenaar  catch /E1030:/
411f0b9f43cSBram Moolenaar    n = 244
412f0b9f43cSBram Moolenaar  endtry
413f0b9f43cSBram Moolenaar  assert_equal(244, n)
414f0b9f43cSBram Moolenaar
415f0b9f43cSBram Moolenaar  try
416f0b9f43cSBram Moolenaar    n = +g:alist
417f0b9f43cSBram Moolenaar  catch /E745:/
418f0b9f43cSBram Moolenaar    n = 255
419f0b9f43cSBram Moolenaar  endtry
420f0b9f43cSBram Moolenaar  assert_equal(255, n)
421f0b9f43cSBram Moolenaar
422cfcd011fSBram Moolenaar  var nd: dict<any>
423f0b9f43cSBram Moolenaar  try
4242bede173SBram Moolenaar    nd = {[g:anumber]: 1}
4255e654230SBram Moolenaar  catch /E1012:/
426f0b9f43cSBram Moolenaar    n = 266
427f0b9f43cSBram Moolenaar  endtry
428f0b9f43cSBram Moolenaar  assert_equal(266, n)
429f0b9f43cSBram Moolenaar
430f0b9f43cSBram Moolenaar  try
431f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
432f0b9f43cSBram Moolenaar  catch /E1093:/
433f0b9f43cSBram Moolenaar    n = 277
434f0b9f43cSBram Moolenaar  endtry
435f0b9f43cSBram Moolenaar  assert_equal(277, n)
436f0b9f43cSBram Moolenaar
437e859312eSBram Moolenaar  try
438e859312eSBram Moolenaar    &ts = g:astring
4395e654230SBram Moolenaar  catch /E1012:/
440e859312eSBram Moolenaar    n = 288
441e859312eSBram Moolenaar  endtry
442e859312eSBram Moolenaar  assert_equal(288, n)
443e859312eSBram Moolenaar
444e859312eSBram Moolenaar  try
445e859312eSBram Moolenaar    &backspace = 'asdf'
446e859312eSBram Moolenaar  catch /E474:/
447e859312eSBram Moolenaar    n = 299
448e859312eSBram Moolenaar  endtry
449e859312eSBram Moolenaar  assert_equal(299, n)
450e859312eSBram Moolenaar
451e859312eSBram Moolenaar  l = [1]
452e859312eSBram Moolenaar  try
453e859312eSBram Moolenaar    l[3] = 3
454e859312eSBram Moolenaar  catch /E684:/
455e859312eSBram Moolenaar    n = 300
456e859312eSBram Moolenaar  endtry
457e859312eSBram Moolenaar  assert_equal(300, n)
458e859312eSBram Moolenaar
459e859312eSBram Moolenaar  try
460e859312eSBram Moolenaar    unlet g:does_not_exist
461e859312eSBram Moolenaar  catch /E108:/
462e859312eSBram Moolenaar    n = 322
463e859312eSBram Moolenaar  endtry
464e859312eSBram Moolenaar  assert_equal(322, n)
465e859312eSBram Moolenaar
466e859312eSBram Moolenaar  try
4672bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
468e859312eSBram Moolenaar  catch /E721:/
469e859312eSBram Moolenaar    n = 333
470e859312eSBram Moolenaar  endtry
471e859312eSBram Moolenaar  assert_equal(333, n)
472e859312eSBram Moolenaar
473e859312eSBram Moolenaar  try
474e859312eSBram Moolenaar    l = DeletedFunc()
475e859312eSBram Moolenaar  catch /E933:/
476e859312eSBram Moolenaar    n = 344
477e859312eSBram Moolenaar  endtry
478e859312eSBram Moolenaar  assert_equal(344, n)
479d032f34aSBram Moolenaar
480d032f34aSBram Moolenaar  try
481d032f34aSBram Moolenaar    echo len(v:true)
482d032f34aSBram Moolenaar  catch /E701:/
483d032f34aSBram Moolenaar    n = 355
484d032f34aSBram Moolenaar  endtry
485d032f34aSBram Moolenaar  assert_equal(355, n)
486d032f34aSBram Moolenaar
487cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
488d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
489d032f34aSBram Moolenaar  try
490d032f34aSBram Moolenaar    echo P()
491d032f34aSBram Moolenaar  catch /E117:/
492d032f34aSBram Moolenaar    n = 366
493d032f34aSBram Moolenaar  endtry
494d032f34aSBram Moolenaar  assert_equal(366, n)
495d032f34aSBram Moolenaar
496d032f34aSBram Moolenaar  try
497d032f34aSBram Moolenaar    echo g:NoSuchFunc()
498d032f34aSBram Moolenaar  catch /E117:/
499d032f34aSBram Moolenaar    n = 377
500d032f34aSBram Moolenaar  endtry
501d032f34aSBram Moolenaar  assert_equal(377, n)
502d032f34aSBram Moolenaar
503d032f34aSBram Moolenaar  try
504d032f34aSBram Moolenaar    echo g:alist + 4
505d032f34aSBram Moolenaar  catch /E745:/
506d032f34aSBram Moolenaar    n = 388
507d032f34aSBram Moolenaar  endtry
508d032f34aSBram Moolenaar  assert_equal(388, n)
509d032f34aSBram Moolenaar
510d032f34aSBram Moolenaar  try
511d032f34aSBram Moolenaar    echo 4 + g:alist
512d032f34aSBram Moolenaar  catch /E745:/
513d032f34aSBram Moolenaar    n = 399
514d032f34aSBram Moolenaar  endtry
515d032f34aSBram Moolenaar  assert_equal(399, n)
516d032f34aSBram Moolenaar
517d032f34aSBram Moolenaar  try
518d032f34aSBram Moolenaar    echo g:alist.member
519d032f34aSBram Moolenaar  catch /E715:/
520d032f34aSBram Moolenaar    n = 400
521d032f34aSBram Moolenaar  endtry
522d032f34aSBram Moolenaar  assert_equal(400, n)
523d032f34aSBram Moolenaar
524d032f34aSBram Moolenaar  try
525d032f34aSBram Moolenaar    echo d.member
526d032f34aSBram Moolenaar  catch /E716:/
527d032f34aSBram Moolenaar    n = 411
528d032f34aSBram Moolenaar  endtry
529d032f34aSBram Moolenaar  assert_equal(411, n)
5308a7d6542SBram Moolenaarenddef
5318a7d6542SBram Moolenaar
532e859312eSBram Moolenaardef DeletedFunc(): list<any>
533e859312eSBram Moolenaar  return ['delete me']
534e859312eSBram Moolenaarenddef
535e859312eSBram Moolenaardefcompile
536e859312eSBram Moolenaardelfunc DeletedFunc
537e859312eSBram Moolenaar
538257cc5eeSBram Moolenaardef ThrowFromDef()
539a72cfb80SBram Moolenaar  throw "getout" # comment
540257cc5eeSBram Moolenaarenddef
541257cc5eeSBram Moolenaar
542257cc5eeSBram Moolenaarfunc CatchInFunc()
543257cc5eeSBram Moolenaar  try
544257cc5eeSBram Moolenaar    call ThrowFromDef()
545257cc5eeSBram Moolenaar  catch
546257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
547257cc5eeSBram Moolenaar  endtry
548257cc5eeSBram Moolenaarendfunc
549257cc5eeSBram Moolenaar
550257cc5eeSBram Moolenaardef CatchInDef()
551257cc5eeSBram Moolenaar  try
552257cc5eeSBram Moolenaar    ThrowFromDef()
553257cc5eeSBram Moolenaar  catch
554257cc5eeSBram Moolenaar    g:thrown_def = v:exception
555257cc5eeSBram Moolenaar  endtry
556257cc5eeSBram Moolenaarenddef
557257cc5eeSBram Moolenaar
558f575adffSBram Moolenaardef ReturnFinally(): string
559f575adffSBram Moolenaar  try
560f575adffSBram Moolenaar    return 'intry'
561373863edSBram Moolenaar  finall
562f575adffSBram Moolenaar    g:in_finally = 'finally'
563f575adffSBram Moolenaar  endtry
564f575adffSBram Moolenaar  return 'end'
565f575adffSBram Moolenaarenddef
566f575adffSBram Moolenaar
567257cc5eeSBram Moolenaardef Test_try_catch_nested()
568257cc5eeSBram Moolenaar  CatchInFunc()
569257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
570257cc5eeSBram Moolenaar
571257cc5eeSBram Moolenaar  CatchInDef()
572257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
573f575adffSBram Moolenaar
574f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
575f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
576f575adffSBram Moolenaarenddef
577f575adffSBram Moolenaar
5789939f57bSBram Moolenaardef TryOne(): number
5799939f57bSBram Moolenaar  try
5809939f57bSBram Moolenaar    return 0
5819939f57bSBram Moolenaar  catch
5829939f57bSBram Moolenaar  endtry
5839939f57bSBram Moolenaar  return 0
5849939f57bSBram Moolenaarenddef
5859939f57bSBram Moolenaar
5869939f57bSBram Moolenaardef TryTwo(n: number): string
5879939f57bSBram Moolenaar  try
588cfcd011fSBram Moolenaar    var x = {}
5899939f57bSBram Moolenaar  catch
5909939f57bSBram Moolenaar  endtry
5919939f57bSBram Moolenaar  return 'text'
5929939f57bSBram Moolenaarenddef
5939939f57bSBram Moolenaar
5949939f57bSBram Moolenaardef Test_try_catch_twice()
5959939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5969939f57bSBram Moolenaarenddef
5979939f57bSBram Moolenaar
598f575adffSBram Moolenaardef Test_try_catch_match()
599cfcd011fSBram Moolenaar  var seq = 'a'
600f575adffSBram Moolenaar  try
601f575adffSBram Moolenaar    throw 'something'
602f575adffSBram Moolenaar  catch /nothing/
603f575adffSBram Moolenaar    seq ..= 'x'
604f575adffSBram Moolenaar  catch /some/
605f575adffSBram Moolenaar    seq ..= 'b'
606f575adffSBram Moolenaar  catch /asdf/
607f575adffSBram Moolenaar    seq ..= 'x'
608e8c4abbbSBram Moolenaar  catch ?a\?sdf?
609e8c4abbbSBram Moolenaar    seq ..= 'y'
610f575adffSBram Moolenaar  finally
611f575adffSBram Moolenaar    seq ..= 'c'
612f575adffSBram Moolenaar  endtry
613f575adffSBram Moolenaar  assert_equal('abc', seq)
614257cc5eeSBram Moolenaarenddef
615257cc5eeSBram Moolenaar
616e8c4abbbSBram Moolenaardef Test_try_catch_fails()
617d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
618d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
619d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
620d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
621d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
622d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
623d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
624d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
62513106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
626d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
627585fea7bSBram Moolenaar
628e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
629d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
630e8c4abbbSBram Moolenaarenddef
631e8c4abbbSBram Moolenaar
632006ad48bSBram Moolenaardef Test_throw_vimscript()
633f5be8cdbSBram Moolenaar  # only checks line continuation
634cfcd011fSBram Moolenaar  var lines =<< trim END
635006ad48bSBram Moolenaar      vim9script
636006ad48bSBram Moolenaar      try
637006ad48bSBram Moolenaar        throw 'one'
638006ad48bSBram Moolenaar              .. 'two'
639006ad48bSBram Moolenaar      catch
640006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
641006ad48bSBram Moolenaar      endtry
642006ad48bSBram Moolenaar  END
643006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
6441e021e63SBram Moolenaar
6451e021e63SBram Moolenaar  lines =<< trim END
6461e021e63SBram Moolenaar    vim9script
647352134bbSBram Moolenaar    @r = ''
6481e021e63SBram Moolenaar    def Func()
6491e021e63SBram Moolenaar      throw @r
6501e021e63SBram Moolenaar    enddef
6511e021e63SBram Moolenaar    var result = ''
6521e021e63SBram Moolenaar    try
6531e021e63SBram Moolenaar      Func()
6541e021e63SBram Moolenaar    catch /E1129:/
6551e021e63SBram Moolenaar      result = 'caught'
6561e021e63SBram Moolenaar    endtry
6571e021e63SBram Moolenaar    assert_equal('caught', result)
6581e021e63SBram Moolenaar  END
6591e021e63SBram Moolenaar  CheckScriptSuccess(lines)
660006ad48bSBram Moolenaarenddef
661006ad48bSBram Moolenaar
662ed677f55SBram Moolenaardef Test_error_in_nested_function()
663ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
664cfcd011fSBram Moolenaar  var lines =<< trim END
665ed677f55SBram Moolenaar      vim9script
666ed677f55SBram Moolenaar      def Func()
667ed677f55SBram Moolenaar        Error()
668ed677f55SBram Moolenaar        g:test_var = 1
669ed677f55SBram Moolenaar      enddef
670ed677f55SBram Moolenaar      func Error() abort
671ed677f55SBram Moolenaar        eval [][0]
672ed677f55SBram Moolenaar      endfunc
673ed677f55SBram Moolenaar      Func()
674ed677f55SBram Moolenaar  END
675ed677f55SBram Moolenaar  g:test_var = 0
676ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
677ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
678ed677f55SBram Moolenaarenddef
679ed677f55SBram Moolenaar
68037c83711SBram Moolenaardef Test_cexpr_vimscript()
681f5be8cdbSBram Moolenaar  # only checks line continuation
68237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
683cfcd011fSBram Moolenaar  var lines =<< trim END
68437c83711SBram Moolenaar      vim9script
68537c83711SBram Moolenaar      cexpr 'File'
68637c83711SBram Moolenaar                .. ' someFile' ..
68737c83711SBram Moolenaar                   ' line 19'
68837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
68937c83711SBram Moolenaar  END
69037c83711SBram Moolenaar  CheckScriptSuccess(lines)
69137c83711SBram Moolenaar  set errorformat&
69237c83711SBram Moolenaarenddef
69337c83711SBram Moolenaar
694c9edd6b5SBram Moolenaardef Test_statusline_syntax()
695c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
696cfcd011fSBram Moolenaar  var lines =<< trim END
697c9edd6b5SBram Moolenaar      vim9script
698c9edd6b5SBram Moolenaar      func g:Status()
699c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
700c9edd6b5SBram Moolenaar      endfunc
701c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
702c9edd6b5SBram Moolenaar      redrawstatus
703c9edd6b5SBram Moolenaar      set laststatus statusline=
704c9edd6b5SBram Moolenaar  END
705c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
706c9edd6b5SBram Moolenaarenddef
707c9edd6b5SBram Moolenaar
708b209750bSBram Moolenaardef Test_list_vimscript()
709b209750bSBram Moolenaar  # checks line continuation and comments
710cfcd011fSBram Moolenaar  var lines =<< trim END
711b209750bSBram Moolenaar      vim9script
712cfcd011fSBram Moolenaar      var mylist = [
713b209750bSBram Moolenaar            'one',
714b209750bSBram Moolenaar            # comment
715b209750bSBram Moolenaar            'two', # empty line follows
716b209750bSBram Moolenaar
717b209750bSBram Moolenaar            'three',
718b209750bSBram Moolenaar            ]
719b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
720b209750bSBram Moolenaar  END
721b209750bSBram Moolenaar  CheckScriptSuccess(lines)
72266250c93SBram Moolenaar
72366250c93SBram Moolenaar  # check all lines from heredoc are kept
72466250c93SBram Moolenaar  lines =<< trim END
72566250c93SBram Moolenaar      # comment 1
72666250c93SBram Moolenaar      two
72766250c93SBram Moolenaar      # comment 3
72866250c93SBram Moolenaar
72966250c93SBram Moolenaar      five
73066250c93SBram Moolenaar      # comment 6
73166250c93SBram Moolenaar  END
73266250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
733b209750bSBram Moolenaarenddef
734b209750bSBram Moolenaar
7352a1381c3SBram Moolenaarif has('channel')
73640ee466cSBram Moolenaar  let someJob = test_null_job()
73740ee466cSBram Moolenaar
73840ee466cSBram Moolenaar  def FuncWithError()
73940ee466cSBram Moolenaar    echomsg g:someJob
74040ee466cSBram Moolenaar  enddef
74140ee466cSBram Moolenaar
74240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
74340ee466cSBram Moolenaar    try
74440ee466cSBram Moolenaar      call FuncWithError()
74540ee466cSBram Moolenaar    catch
74640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
74740ee466cSBram Moolenaar    endtry
74840ee466cSBram Moolenaar  endfunc
7492a1381c3SBram Moolenaarendif
75040ee466cSBram Moolenaar
7518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7528a7d6542SBram Moolenaar  vim9script
753cfcd011fSBram Moolenaar  var name: string = 'bob'
7548a7d6542SBram Moolenaar  def Concat(arg: string): string
7558a7d6542SBram Moolenaar    return name .. arg
7568a7d6542SBram Moolenaar  enddef
757227a69deSBram Moolenaar  g:result = Concat('bie')
758227a69deSBram Moolenaar  g:localname = name
7598a7d6542SBram Moolenaar
7608a7d6542SBram Moolenaar  export const CONST = 1234
761cfcd011fSBram Moolenaar  export var exported = 9876
762cfcd011fSBram Moolenaar  export var exp_name = 'John'
7638a7d6542SBram Moolenaar  export def Exported(): string
7648a7d6542SBram Moolenaar    return 'Exported'
7658a7d6542SBram Moolenaar  enddef
7668a7d6542SBram MoolenaarEND
7678a7d6542SBram Moolenaar
768b3ca9824SBram Moolenaardef Undo_export_script_lines()
769b3ca9824SBram Moolenaar  unlet g:result
770b3ca9824SBram Moolenaar  unlet g:localname
771b3ca9824SBram Moolenaarenddef
772b3ca9824SBram Moolenaar
7735269bd2aSBram Moolenaardef Test_vim9_import_export()
774cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7758a7d6542SBram Moolenaar    vim9script
7768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7778a7d6542SBram Moolenaar    g:imported = exported
7786e587dcbSBram Moolenaar    exported += 3
7796e587dcbSBram Moolenaar    g:imported_added = exported
7808a7d6542SBram Moolenaar    g:imported_func = Exported()
7816e587dcbSBram Moolenaar
78240f4f7a4SBram Moolenaar    def GetExported(): string
783e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
78440f4f7a4SBram Moolenaar      return local_dict.ref()
78540f4f7a4SBram Moolenaar    enddef
78640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
78740f4f7a4SBram Moolenaar
7886e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7896e587dcbSBram Moolenaar    g:imported_name = exp_name
7906e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7916e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7925381c7a1SBram Moolenaar    g:imported_later = exported
7938a7d6542SBram Moolenaar  END
7948a7d6542SBram Moolenaar
7958a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7968a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7978a7d6542SBram Moolenaar
7988a7d6542SBram Moolenaar  source Ximport.vim
7998a7d6542SBram Moolenaar
8008a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8018a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8028a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8036e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8045381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8058a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
80640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
8076e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8086e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8098a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8108a7d6542SBram Moolenaar
811b3ca9824SBram Moolenaar  Undo_export_script_lines()
8128a7d6542SBram Moolenaar  unlet g:imported
8136e587dcbSBram Moolenaar  unlet g:imported_added
8145381c7a1SBram Moolenaar  unlet g:imported_later
8158a7d6542SBram Moolenaar  unlet g:imported_func
8166e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
8178a7d6542SBram Moolenaar  delete('Ximport.vim')
818f2d5c240SBram Moolenaar
8191c991144SBram Moolenaar  # similar, with line breaks
820cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
8211c991144SBram Moolenaar    vim9script
8221c991144SBram Moolenaar    import {
8231c991144SBram Moolenaar        exported,
8241c991144SBram Moolenaar        Exported,
8251c991144SBram Moolenaar        }
8261c991144SBram Moolenaar        from
8271c991144SBram Moolenaar        './Xexport.vim'
8281c991144SBram Moolenaar    g:imported = exported
8291c991144SBram Moolenaar    exported += 5
8301c991144SBram Moolenaar    g:imported_added = exported
8311c991144SBram Moolenaar    g:imported_func = Exported()
8321c991144SBram Moolenaar  END
8331c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8341c991144SBram Moolenaar  source Ximport_lbr.vim
8351c991144SBram Moolenaar
8361c991144SBram Moolenaar  assert_equal(9876, g:imported)
8371c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8381c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8391c991144SBram Moolenaar
8401c991144SBram Moolenaar  # exported script not sourced again
8411c991144SBram Moolenaar  assert_false(exists('g:result'))
8421c991144SBram Moolenaar  unlet g:imported
8431c991144SBram Moolenaar  unlet g:imported_added
8441c991144SBram Moolenaar  unlet g:imported_func
8451c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8461c991144SBram Moolenaar
8471c991144SBram Moolenaar  # import inside :def function
848cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8495381c7a1SBram Moolenaar    vim9script
8505381c7a1SBram Moolenaar    def ImportInDef()
8515381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8525381c7a1SBram Moolenaar      g:imported = exported
8535381c7a1SBram Moolenaar      exported += 7
8545381c7a1SBram Moolenaar      g:imported_added = exported
8555381c7a1SBram Moolenaar    enddef
8565381c7a1SBram Moolenaar    ImportInDef()
8575381c7a1SBram Moolenaar  END
8585381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8595381c7a1SBram Moolenaar  source Ximport2.vim
860f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8615381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8625381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8635381c7a1SBram Moolenaar  unlet g:imported
8645381c7a1SBram Moolenaar  unlet g:imported_added
8655381c7a1SBram Moolenaar  delete('Ximport2.vim')
8665381c7a1SBram Moolenaar
867cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
868f2d5c240SBram Moolenaar    vim9script
869f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
870f2d5c240SBram Moolenaar    def UseExport()
871f2d5c240SBram Moolenaar      g:imported = Export.exported
872f2d5c240SBram Moolenaar    enddef
873f2d5c240SBram Moolenaar    UseExport()
874f2d5c240SBram Moolenaar  END
875f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
876f2d5c240SBram Moolenaar  source Ximport.vim
8775381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
878f2d5c240SBram Moolenaar
879cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
880599c89c8SBram Moolenaar    vim9script
881599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
882599c89c8SBram Moolenaar    def Func()
883cfcd011fSBram Moolenaar      var dummy = 1
884cfcd011fSBram Moolenaar      var imported = Export + dummy
885599c89c8SBram Moolenaar    enddef
886822ba247SBram Moolenaar    defcompile
887599c89c8SBram Moolenaar  END
888599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
88944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
890599c89c8SBram Moolenaar
891cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
892599c89c8SBram Moolenaar    vim9script
893599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
894599c89c8SBram Moolenaar    def Func()
895cfcd011fSBram Moolenaar      var imported = Export . exported
896599c89c8SBram Moolenaar    enddef
897822ba247SBram Moolenaar    defcompile
898599c89c8SBram Moolenaar  END
899599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
90044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
901599c89c8SBram Moolenaar
902a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
903a6294955SBram Moolenaar    vim9script
904a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
905a6294955SBram Moolenaar    var some = 'other'
906a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
907a6294955SBram Moolenaar    defcompile
908a6294955SBram Moolenaar  END
909a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
910a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
911a6294955SBram Moolenaar
912cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
913599c89c8SBram Moolenaar    vim9script
914599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
915599c89c8SBram Moolenaar    def Func()
916cfcd011fSBram Moolenaar      var imported = Export.
917599c89c8SBram Moolenaar    enddef
918822ba247SBram Moolenaar    defcompile
919599c89c8SBram Moolenaar  END
920599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
92144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
922599c89c8SBram Moolenaar
923cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
9241c991144SBram Moolenaar    vim9script
9251c991144SBram Moolenaar    import *
9261c991144SBram Moolenaar        as Export
9271c991144SBram Moolenaar        from
9281c991144SBram Moolenaar        './Xexport.vim'
9291c991144SBram Moolenaar    def UseExport()
9301c991144SBram Moolenaar      g:imported = Export.exported
9311c991144SBram Moolenaar    enddef
9321c991144SBram Moolenaar    UseExport()
9331c991144SBram Moolenaar  END
9341c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9351c991144SBram Moolenaar  source Ximport.vim
9361c991144SBram Moolenaar  assert_equal(9883, g:imported)
9371c991144SBram Moolenaar
938cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
939f2d5c240SBram Moolenaar    vim9script
940f2d5c240SBram Moolenaar    import * from './Xexport.vim'
941f2d5c240SBram Moolenaar  END
942f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
94344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
944f2d5c240SBram Moolenaar
945f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
946cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
947fa29c8abSBram Moolenaar    vim9script
948fa29c8abSBram Moolenaar    import name from './Xexport.vim'
949fa29c8abSBram Moolenaar  END
950fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
95144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
952fa29c8abSBram Moolenaar
953f5be8cdbSBram Moolenaar  # try to import something that is already defined
954cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9555269bd2aSBram Moolenaar    vim9script
956cfcd011fSBram Moolenaar    var exported = 'something'
9575269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9585269bd2aSBram Moolenaar  END
9595269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
96044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9615269bd2aSBram Moolenaar
962f5be8cdbSBram Moolenaar  # try to import something that is already defined
9635269bd2aSBram Moolenaar  import_already_defined =<< trim END
9645269bd2aSBram Moolenaar    vim9script
965cfcd011fSBram Moolenaar    var exported = 'something'
9665269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9675269bd2aSBram Moolenaar  END
9685269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
96944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9705269bd2aSBram Moolenaar
971f5be8cdbSBram Moolenaar  # try to import something that is already defined
9725269bd2aSBram Moolenaar  import_already_defined =<< trim END
9735269bd2aSBram Moolenaar    vim9script
974cfcd011fSBram Moolenaar    var exported = 'something'
9755269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9765269bd2aSBram Moolenaar  END
9775269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
97844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9795269bd2aSBram Moolenaar
980918a4249SBram Moolenaar  # try changing an imported const
981918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
982918a4249SBram Moolenaar    vim9script
983918a4249SBram Moolenaar    import CONST from './Xexport.vim'
984918a4249SBram Moolenaar    def Assign()
985918a4249SBram Moolenaar      CONST = 987
986918a4249SBram Moolenaar    enddef
987918a4249SBram Moolenaar    defcompile
988918a4249SBram Moolenaar  END
989918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
990918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
991918a4249SBram Moolenaar
992f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
993cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
994fa29c8abSBram Moolenaar    vim9script
995fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
996fa29c8abSBram Moolenaar  END
997fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
99844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
999fa29c8abSBram Moolenaar
1000cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1001fa29c8abSBram Moolenaar    vim9script
1002fa29c8abSBram Moolenaar    import name './Xexport.vim'
1003fa29c8abSBram Moolenaar  END
1004fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
100544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1006fa29c8abSBram Moolenaar
1007cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1008fa29c8abSBram Moolenaar    vim9script
1009fa29c8abSBram Moolenaar    import name from Xexport.vim
1010fa29c8abSBram Moolenaar  END
1011fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
101244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1013fa29c8abSBram Moolenaar
1014cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1015fa29c8abSBram Moolenaar    vim9script
1016fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1017fa29c8abSBram Moolenaar  END
1018fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
101944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1020fa29c8abSBram Moolenaar
1021cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1022fa29c8abSBram Moolenaar    vim9script
1023fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1024fa29c8abSBram Moolenaar  END
10255269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
102644d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1027fa29c8abSBram Moolenaar
1028f2d5c240SBram Moolenaar  delete('Ximport.vim')
10295269bd2aSBram Moolenaar  delete('Ximport3.vim')
10308a7d6542SBram Moolenaar  delete('Xexport.vim')
10318a7d6542SBram Moolenaar
1032f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1033750802b5SBram Moolenaar  set cpo&vi
1034cfcd011fSBram Moolenaar  var cpo_before = &cpo
1035cfcd011fSBram Moolenaar  var lines =<< trim END
1036750802b5SBram Moolenaar    vim9script
1037750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1038750802b5SBram Moolenaar  END
1039750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1040750802b5SBram Moolenaar  source Xvim9_script
1041750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1042750802b5SBram Moolenaar  set cpo&vim
1043750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1044750802b5SBram Moolenaar  delete('Xvim9_script')
1045750802b5SBram Moolenaarenddef
1046750802b5SBram Moolenaar
1047803af686SBram Moolenaarfunc g:Trigger()
1048803af686SBram Moolenaar  source Ximport.vim
1049803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1050803af686SBram Moolenaarendfunc
1051803af686SBram Moolenaar
1052803af686SBram Moolenaardef Test_import_export_expr_map()
1053803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1054cfcd011fSBram Moolenaar  var export_lines =<< trim END
1055803af686SBram Moolenaar    vim9script
1056803af686SBram Moolenaar    export def That(): string
1057803af686SBram Moolenaar      return 'yes'
1058803af686SBram Moolenaar    enddef
1059803af686SBram Moolenaar  END
1060803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1061803af686SBram Moolenaar
1062cfcd011fSBram Moolenaar  var import_lines =<< trim END
1063803af686SBram Moolenaar    vim9script
1064803af686SBram Moolenaar    import That from './Xexport_that.vim'
1065803af686SBram Moolenaar    assert_equal('yes', That())
1066803af686SBram Moolenaar  END
1067803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1068803af686SBram Moolenaar
1069803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1070803af686SBram Moolenaar  feedkeys('trigger', "xt")
1071803af686SBram Moolenaar
1072730b2483SBram Moolenaar  delete('Xexport_that.vim')
1073803af686SBram Moolenaar  delete('Ximport.vim')
1074803af686SBram Moolenaar  nunmap trigger
1075803af686SBram Moolenaarenddef
1076803af686SBram Moolenaar
10778e1986e3SBram Moolenaardef Test_import_in_filetype()
10788e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10798e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1080cfcd011fSBram Moolenaar  var export_lines =<< trim END
10818e1986e3SBram Moolenaar    vim9script
1082cfcd011fSBram Moolenaar    export var That = 'yes'
10838e1986e3SBram Moolenaar  END
1084730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10858e1986e3SBram Moolenaar
1086cfcd011fSBram Moolenaar  var import_lines =<< trim END
10878e1986e3SBram Moolenaar    vim9script
1088730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10898e1986e3SBram Moolenaar    assert_equal('yes', That)
10908e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10918e1986e3SBram Moolenaar  END
10928e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10938e1986e3SBram Moolenaar
1094cfcd011fSBram Moolenaar  var save_rtp = &rtp
10958e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10968e1986e3SBram Moolenaar
10978e1986e3SBram Moolenaar  filetype plugin on
10988e1986e3SBram Moolenaar  copen
10998e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
11008e1986e3SBram Moolenaar
11018e1986e3SBram Moolenaar  quit!
1102730b2483SBram Moolenaar  delete('Xexport_ft.vim')
11038e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
11048e1986e3SBram Moolenaar  &rtp = save_rtp
11058e1986e3SBram Moolenaarenddef
11068e1986e3SBram Moolenaar
1107efa94447SBram Moolenaardef Test_use_import_in_mapping()
1108cfcd011fSBram Moolenaar  var lines =<< trim END
1109efa94447SBram Moolenaar      vim9script
1110efa94447SBram Moolenaar      export def Funcx()
1111efa94447SBram Moolenaar        g:result = 42
1112efa94447SBram Moolenaar      enddef
1113efa94447SBram Moolenaar  END
1114efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1115efa94447SBram Moolenaar  lines =<< trim END
1116efa94447SBram Moolenaar      vim9script
1117efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1118b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1119efa94447SBram Moolenaar  END
1120efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1121efa94447SBram Moolenaar
1122efa94447SBram Moolenaar  source Xmapscript.vim
1123b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1124efa94447SBram Moolenaar  assert_equal(42, g:result)
1125efa94447SBram Moolenaar
1126efa94447SBram Moolenaar  unlet g:result
1127efa94447SBram Moolenaar  delete('XsomeExport.vim')
1128efa94447SBram Moolenaar  delete('Xmapscript.vim')
1129b3ca9824SBram Moolenaar  nunmap <F3>
1130efa94447SBram Moolenaarenddef
1131efa94447SBram Moolenaar
1132750802b5SBram Moolenaardef Test_vim9script_fails()
11338a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11348a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1135cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
11369721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1137cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1138750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1139750802b5SBram Moolenaar
1140cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1141c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1142c785b9a7SBram Moolenaar
1143e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1144e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
11458a7d6542SBram Moolenaarenddef
11468a7d6542SBram Moolenaar
1147f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1148101f4810SBram Moolenaar  CheckRunVimInTerminal
1149101f4810SBram Moolenaar
11509bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1151c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11529bb3eb3eSBram Moolenaarendfunc
11539bb3eb3eSBram Moolenaar
1154c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1155cfcd011fSBram Moolenaar  var export =<< trim END
1156101f4810SBram Moolenaar    vim9script
1157101f4810SBram Moolenaar    export def Foo(): number
1158101f4810SBram Moolenaar        return 0
1159101f4810SBram Moolenaar    enddef
1160101f4810SBram Moolenaar  END
1161730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1162101f4810SBram Moolenaar
1163e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
11649bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
1165*2949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1166101f4810SBram Moolenaar
1167730b2483SBram Moolenaar  delete('XexportCmd.vim')
11689bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11699bb3eb3eSBram Moolenaarenddef
1170101f4810SBram Moolenaar
11712b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
11722b32700dSBram Moolenaar  var lines =<< trim END
1173a6294955SBram Moolenaar    vim9script
1174a6294955SBram Moolenaar    export var exported = 'thexport'
1175a6294955SBram Moolenaar  END
1176a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1177a6294955SBram Moolenaar  lines =<< trim END
11782b32700dSBram Moolenaar    vim9script noclear
11792b32700dSBram Moolenaar    g:loadCount += 1
11802b32700dSBram Moolenaar    var s:reloaded = 'init'
1181a6294955SBram Moolenaar    import exported from './XExportReload'
11822b32700dSBram Moolenaar
11832b32700dSBram Moolenaar    def Again(): string
11842b32700dSBram Moolenaar      return 'again'
11852b32700dSBram Moolenaar    enddef
11862b32700dSBram Moolenaar
11872b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
11882b32700dSBram Moolenaar    var s:loaded = true
11892b32700dSBram Moolenaar
11902b32700dSBram Moolenaar    var s:notReloaded = 'yes'
11912b32700dSBram Moolenaar    s:reloaded = 'first'
11922b32700dSBram Moolenaar    def g:Values(): list<string>
1193a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
11942b32700dSBram Moolenaar    enddef
11952b32700dSBram Moolenaar
11962b32700dSBram Moolenaar    def Once(): string
11972b32700dSBram Moolenaar      return 'once'
11982b32700dSBram Moolenaar    enddef
11992b32700dSBram Moolenaar  END
12002b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
12012b32700dSBram Moolenaar  g:loadCount = 0
12022b32700dSBram Moolenaar  source XReloaded
12032b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1204a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
12052b32700dSBram Moolenaar  source XReloaded
12062b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1207a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
12082b32700dSBram Moolenaar  source XReloaded
12092b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1210a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
12112b32700dSBram Moolenaar
12122b32700dSBram Moolenaar  delete('Xreloaded')
1213a6294955SBram Moolenaar  delete('XExportReload')
12142b32700dSBram Moolenaar  delfunc g:Values
12152b32700dSBram Moolenaar  unlet g:loadCount
12162b32700dSBram Moolenaarenddef
12172b32700dSBram Moolenaar
12184c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1219cfcd011fSBram Moolenaar  var lines =<< trim END
12208a7d6542SBram Moolenaar    vim9script
12218a7d6542SBram Moolenaar    const var = ''
1222cfcd011fSBram Moolenaar    var valone = 1234
12238a7d6542SBram Moolenaar    def MyFunc(arg: string)
12248a7d6542SBram Moolenaar       valone = 5678
12258a7d6542SBram Moolenaar    enddef
12268a7d6542SBram Moolenaar  END
1227cfcd011fSBram Moolenaar  var morelines =<< trim END
1228cfcd011fSBram Moolenaar    var valtwo = 222
12298a7d6542SBram Moolenaar    export def GetValtwo(): number
12308a7d6542SBram Moolenaar      return valtwo
12318a7d6542SBram Moolenaar    enddef
12328a7d6542SBram Moolenaar  END
123303afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
12348a7d6542SBram Moolenaar  source Xreload.vim
12358a7d6542SBram Moolenaar  source Xreload.vim
12368a7d6542SBram Moolenaar  source Xreload.vim
12378a7d6542SBram Moolenaar
1238cfcd011fSBram Moolenaar  var testlines =<< trim END
12398a7d6542SBram Moolenaar    vim9script
12408a7d6542SBram Moolenaar    def TheFunc()
12418a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
12428a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
12438a7d6542SBram Moolenaar    enddef
12448a7d6542SBram Moolenaar    TheFunc()
12458a7d6542SBram Moolenaar  END
12468a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
12478a7d6542SBram Moolenaar  source Ximport.vim
12488a7d6542SBram Moolenaar
1249f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1250f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
12518a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12528a7d6542SBram Moolenaar  source Ximport.vim
12538a7d6542SBram Moolenaar
1254f5be8cdbSBram Moolenaar  # cannot declare a var twice
12558a7d6542SBram Moolenaar  lines =<< trim END
12568a7d6542SBram Moolenaar    vim9script
1257cfcd011fSBram Moolenaar    var valone = 1234
1258cfcd011fSBram Moolenaar    var valone = 5678
12598a7d6542SBram Moolenaar  END
12608a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
126144d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
12628a7d6542SBram Moolenaar
12638a7d6542SBram Moolenaar  delete('Xreload.vim')
12648a7d6542SBram Moolenaar  delete('Ximport.vim')
12658a7d6542SBram Moolenaarenddef
12668a7d6542SBram Moolenaar
126707a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
126807a65d26SBram Moolenaar" compiled function using that variable must fail.
126907a65d26SBram Moolenaardef Test_script_reload_change_type()
127007a65d26SBram Moolenaar  var lines =<< trim END
127107a65d26SBram Moolenaar    vim9script noclear
127207a65d26SBram Moolenaar    var str = 'string'
127307a65d26SBram Moolenaar    def g:GetStr(): string
127407a65d26SBram Moolenaar      return str .. 'xxx'
127507a65d26SBram Moolenaar    enddef
127607a65d26SBram Moolenaar  END
127707a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
127807a65d26SBram Moolenaar  source Xreload.vim
127907a65d26SBram Moolenaar  echo g:GetStr()
128007a65d26SBram Moolenaar
128107a65d26SBram Moolenaar  lines =<< trim END
128207a65d26SBram Moolenaar    vim9script noclear
128307a65d26SBram Moolenaar    var str = 1234
128407a65d26SBram Moolenaar  END
128507a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
128607a65d26SBram Moolenaar  source Xreload.vim
128707a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
128807a65d26SBram Moolenaar
128907a65d26SBram Moolenaar  delfunc g:GetStr
129007a65d26SBram Moolenaar  delete('Xreload.vim')
129107a65d26SBram Moolenaarenddef
129207a65d26SBram Moolenaar
129395006e3dSBram Moolenaardef s:RetSome(): string
129495006e3dSBram Moolenaar  return 'some'
129595006e3dSBram Moolenaarenddef
129695006e3dSBram Moolenaar
1297fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1298fe465a01SBram Moolenaar" script-local name.
1299fe465a01SBram Moolenaardef Test_vim9script_funcref()
1300cfcd011fSBram Moolenaar  var sortlines =<< trim END
1301fe465a01SBram Moolenaar      vim9script
1302fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1303bed36b93SBram Moolenaar        return i2 - i1
1304fe465a01SBram Moolenaar      enddef
1305fe465a01SBram Moolenaar
1306fe465a01SBram Moolenaar      export def FastSort(): list<number>
1307fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1308fe465a01SBram Moolenaar      enddef
1309fe465a01SBram Moolenaar  END
1310fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1311fe465a01SBram Moolenaar
1312cfcd011fSBram Moolenaar  var lines =<< trim END
1313fe465a01SBram Moolenaar    vim9script
1314fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1315fe465a01SBram Moolenaar    def Test()
1316fe465a01SBram Moolenaar      g:result = FastSort()
1317fe465a01SBram Moolenaar    enddef
1318fe465a01SBram Moolenaar    Test()
1319fe465a01SBram Moolenaar  END
1320fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1321fe465a01SBram Moolenaar
1322fe465a01SBram Moolenaar  source Xscript.vim
1323fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1324fe465a01SBram Moolenaar
1325fe465a01SBram Moolenaar  unlet g:result
1326fe465a01SBram Moolenaar  delete('Xsort.vim')
1327fe465a01SBram Moolenaar  delete('Xscript.vim')
132895006e3dSBram Moolenaar
1329cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
133095006e3dSBram Moolenaar  assert_equal('some', Funcref())
1331fe465a01SBram Moolenaarenddef
1332fe465a01SBram Moolenaar
1333601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1334601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1335601e76acSBram Moolenaar" function reference.
1336c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1337cfcd011fSBram Moolenaar  var filterLines =<< trim END
1338c620c055SBram Moolenaar    vim9script
1339c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1340c620c055SBram Moolenaar      return idx % 2 == 1
1341c620c055SBram Moolenaar    enddef
1342c620c055SBram Moolenaar    export def FastFilter(): list<number>
1343c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1344c620c055SBram Moolenaar    enddef
1345601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1346601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1347601e76acSBram Moolenaar    enddef
1348c620c055SBram Moolenaar  END
1349c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1350c620c055SBram Moolenaar
1351cfcd011fSBram Moolenaar  var lines =<< trim END
1352c620c055SBram Moolenaar    vim9script
1353601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1354c620c055SBram Moolenaar    def Test()
1355cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1356c620c055SBram Moolenaar    enddef
1357c620c055SBram Moolenaar    Test()
1358601e76acSBram Moolenaar    def TestDirect()
1359cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1360601e76acSBram Moolenaar    enddef
1361601e76acSBram Moolenaar    TestDirect()
1362c620c055SBram Moolenaar  END
1363601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1364c620c055SBram Moolenaar  delete('Xfilter.vim')
1365c620c055SBram Moolenaarenddef
1366c620c055SBram Moolenaar
13674c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1368cfcd011fSBram Moolenaar  var first_lines =<< trim END
13694c17ad94SBram Moolenaar    vim9script
13704c17ad94SBram Moolenaar    def FuncYes(): string
13714c17ad94SBram Moolenaar      return 'yes'
13724c17ad94SBram Moolenaar    enddef
13734c17ad94SBram Moolenaar  END
1374cfcd011fSBram Moolenaar  var withno_lines =<< trim END
13754c17ad94SBram Moolenaar    def FuncNo(): string
13764c17ad94SBram Moolenaar      return 'no'
13774c17ad94SBram Moolenaar    enddef
13784c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
13794c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
13804c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
138103afdcf1SBram Moolenaar    enddef
138203afdcf1SBram Moolenaar  END
1383cfcd011fSBram Moolenaar  var nono_lines =<< trim END
138403afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
138503afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
138644d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
13874c17ad94SBram Moolenaar    enddef
13884c17ad94SBram Moolenaar  END
13894c17ad94SBram Moolenaar
13904c17ad94SBram Moolenaar  # FuncNo() is defined
139103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13924c17ad94SBram Moolenaar  source Xreloaded.vim
13934c17ad94SBram Moolenaar  g:DoCheck(true)
13944c17ad94SBram Moolenaar
13954c17ad94SBram Moolenaar  # FuncNo() is not redefined
139603afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13974c17ad94SBram Moolenaar  source Xreloaded.vim
13985082471fSBram Moolenaar  g:DoCheck(false)
13994c17ad94SBram Moolenaar
14004c17ad94SBram Moolenaar  # FuncNo() is back
140103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14024c17ad94SBram Moolenaar  source Xreloaded.vim
14035082471fSBram Moolenaar  g:DoCheck(false)
14044c17ad94SBram Moolenaar
14054c17ad94SBram Moolenaar  delete('Xreloaded.vim')
14064c17ad94SBram Moolenaarenddef
14074c17ad94SBram Moolenaar
140889483d40SBram Moolenaardef Test_vim9script_reload_delvar()
140989483d40SBram Moolenaar  # write the script with a script-local variable
1410cfcd011fSBram Moolenaar  var lines =<< trim END
141189483d40SBram Moolenaar    vim9script
1412cfcd011fSBram Moolenaar    var name = 'string'
141389483d40SBram Moolenaar  END
141489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
141589483d40SBram Moolenaar  source XreloadVar.vim
141689483d40SBram Moolenaar
141789483d40SBram Moolenaar  # now write the script using the same variable locally - works
141889483d40SBram Moolenaar  lines =<< trim END
141989483d40SBram Moolenaar    vim9script
142089483d40SBram Moolenaar    def Func()
1421cfcd011fSBram Moolenaar      var name = 'string'
142289483d40SBram Moolenaar    enddef
142389483d40SBram Moolenaar  END
142489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
142589483d40SBram Moolenaar  source XreloadVar.vim
142689483d40SBram Moolenaar
142789483d40SBram Moolenaar  delete('XreloadVar.vim')
142889483d40SBram Moolenaarenddef
142989483d40SBram Moolenaar
14308a7d6542SBram Moolenaardef Test_import_absolute()
1431cfcd011fSBram Moolenaar  var import_lines = [
1432e6085c53SBram Moolenaar        'vim9script',
1433e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1434e6085c53SBram Moolenaar        'def UseExported()',
1435e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1436e6085c53SBram Moolenaar        '  exported = 8888',
1437e6085c53SBram Moolenaar        '  g:imported_after = exported',
1438e6085c53SBram Moolenaar        'enddef',
1439e6085c53SBram Moolenaar        'UseExported()',
1440e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1441e6085c53SBram Moolenaar        ]
14428a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
14438a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
14448a7d6542SBram Moolenaar
14458a7d6542SBram Moolenaar  source Ximport_abs.vim
14468a7d6542SBram Moolenaar
14478a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
14484e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1449fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1450fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1451fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1452fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1453fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1454fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1455fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1456fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1457fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1458fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1459e6085c53SBram Moolenaar        g:import_disassembled)
1460b3ca9824SBram Moolenaar
1461b3ca9824SBram Moolenaar  Undo_export_script_lines()
14628a7d6542SBram Moolenaar  unlet g:imported_abs
14634e12a5dfSBram Moolenaar  unlet g:import_disassembled
14648a7d6542SBram Moolenaar
14658a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
14668a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
14678a7d6542SBram Moolenaarenddef
14688a7d6542SBram Moolenaar
14698a7d6542SBram Moolenaardef Test_import_rtp()
1470cfcd011fSBram Moolenaar  var import_lines = [
1471e6085c53SBram Moolenaar        'vim9script',
1472e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1473e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1474e6085c53SBram Moolenaar        ]
14758a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
14768a7d6542SBram Moolenaar  mkdir('import')
14778a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
14788a7d6542SBram Moolenaar
1479cfcd011fSBram Moolenaar  var save_rtp = &rtp
14808a7d6542SBram Moolenaar  &rtp = getcwd()
14818a7d6542SBram Moolenaar  source Ximport_rtp.vim
14828a7d6542SBram Moolenaar  &rtp = save_rtp
14838a7d6542SBram Moolenaar
14848a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
14858a7d6542SBram Moolenaar
1486b3ca9824SBram Moolenaar  Undo_export_script_lines()
1487b3ca9824SBram Moolenaar  unlet g:imported_rtp
14888a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
148989483d40SBram Moolenaar  delete('import', 'rf')
14908a7d6542SBram Moolenaarenddef
14918a7d6542SBram Moolenaar
149225e0f586SBram Moolenaardef Test_import_compile_error()
1493cfcd011fSBram Moolenaar  var export_lines = [
149425e0f586SBram Moolenaar        'vim9script',
149525e0f586SBram Moolenaar        'export def ExpFunc(): string',
149625e0f586SBram Moolenaar        '  return notDefined',
149725e0f586SBram Moolenaar        'enddef',
149825e0f586SBram Moolenaar        ]
149925e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
150025e0f586SBram Moolenaar
1501cfcd011fSBram Moolenaar  var import_lines = [
150225e0f586SBram Moolenaar        'vim9script',
150325e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
150425e0f586SBram Moolenaar        'def ImpFunc()',
150525e0f586SBram Moolenaar        '  echo ExpFunc()',
150625e0f586SBram Moolenaar        'enddef',
150725e0f586SBram Moolenaar        'defcompile',
150825e0f586SBram Moolenaar        ]
150925e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
151025e0f586SBram Moolenaar
151125e0f586SBram Moolenaar  try
151225e0f586SBram Moolenaar    source Ximport.vim
151325e0f586SBram Moolenaar  catch /E1001/
1514f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
15157707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
151625e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
151725e0f586SBram Moolenaar  endtry
151825e0f586SBram Moolenaar
151925e0f586SBram Moolenaar  delete('Xexported.vim')
152025e0f586SBram Moolenaar  delete('Ximport.vim')
152125e0f586SBram Moolenaarenddef
152225e0f586SBram Moolenaar
1523c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1524cfcd011fSBram Moolenaar  var lines = [
1525c4ce36d4SBram Moolenaar        'vim9script',
1526c4ce36d4SBram Moolenaar        'def Func()',
1527c4ce36d4SBram Moolenaar        '  eval [][0]',
1528c4ce36d4SBram Moolenaar        'enddef',
1529c4ce36d4SBram Moolenaar        'Func()',
1530c4ce36d4SBram Moolenaar        ]
1531c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1532c4ce36d4SBram Moolenaar
1533c4ce36d4SBram Moolenaar  for count in range(3)
1534c4ce36d4SBram Moolenaar    try
1535c4ce36d4SBram Moolenaar      source Xtestscript.vim
1536c4ce36d4SBram Moolenaar    catch /E684/
1537c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1538c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1539c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1540c4ce36d4SBram Moolenaar    endtry
1541c4ce36d4SBram Moolenaar  endfor
1542c4ce36d4SBram Moolenaar
1543c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1544c4ce36d4SBram Moolenaarenddef
1545c4ce36d4SBram Moolenaar
1546eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1547cfcd011fSBram Moolenaar  var export_lines =<< trim END
1548eef2102eSBram Moolenaar      vim9script
1549eef2102eSBram Moolenaar      export def Func()
1550eef2102eSBram Moolenaar        echo 'imported'
1551eef2102eSBram Moolenaar      enddef
1552eef2102eSBram Moolenaar  END
1553eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1554eef2102eSBram Moolenaar
1555cfcd011fSBram Moolenaar  var lines =<< trim END
1556eef2102eSBram Moolenaar    vim9script
1557eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1558eef2102eSBram Moolenaar    def Func()
1559eef2102eSBram Moolenaar      echo 'local to function'
1560eef2102eSBram Moolenaar    enddef
1561eef2102eSBram Moolenaar  END
1562eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1563eef2102eSBram Moolenaar
1564eef2102eSBram Moolenaar  lines =<< trim END
1565eef2102eSBram Moolenaar    vim9script
1566eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1567eef2102eSBram Moolenaar    def Outer()
1568eef2102eSBram Moolenaar      def Func()
1569eef2102eSBram Moolenaar        echo 'local to function'
1570eef2102eSBram Moolenaar      enddef
1571eef2102eSBram Moolenaar    enddef
1572eef2102eSBram Moolenaar    defcompile
1573eef2102eSBram Moolenaar  END
1574eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1575eef2102eSBram Moolenaar
1576eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1577eef2102eSBram Moolenaarenddef
1578eef2102eSBram Moolenaar
1579b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1580cfcd011fSBram Moolenaar  var lines =<< trim END
1581b9a2cac3SBram Moolenaar    vim9script
1582b9a2cac3SBram Moolenaar    def Func()
1583b9a2cac3SBram Moolenaar      echo 'one'
1584b9a2cac3SBram Moolenaar    enddef
1585b9a2cac3SBram Moolenaar    def Func()
1586b9a2cac3SBram Moolenaar      echo 'two'
1587b9a2cac3SBram Moolenaar    enddef
1588b9a2cac3SBram Moolenaar  END
1589b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1590fa211f3cSBram Moolenaar
1591fa211f3cSBram Moolenaar  lines =<< trim END
1592fa211f3cSBram Moolenaar    vim9script
1593fa211f3cSBram Moolenaar    def Foo(): string
1594fa211f3cSBram Moolenaar      return 'foo'
1595fa211f3cSBram Moolenaar      enddef
1596fa211f3cSBram Moolenaar    def Func()
1597cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1598fa211f3cSBram Moolenaar    enddef
1599fa211f3cSBram Moolenaar    defcompile
1600fa211f3cSBram Moolenaar  END
1601fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1602b9a2cac3SBram Moolenaarenddef
1603b9a2cac3SBram Moolenaar
16048a7d6542SBram Moolenaardef Test_fixed_size_list()
1605f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1606cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
16078a7d6542SBram Moolenaar  l->remove(0)
16088a7d6542SBram Moolenaar  l->add(5)
16098a7d6542SBram Moolenaar  l->insert(99, 1)
16100f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
16118a7d6542SBram Moolenaarenddef
16128a7d6542SBram Moolenaar
1613ae616494SBram Moolenaardef Test_no_insert_xit()
1614d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1615d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1616d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1617d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1618d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1619ae616494SBram Moolenaar
1620ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1621ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1622ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1623ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1624f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1625f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1626f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1627f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1628f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1629ae616494SBram Moolenaarenddef
1630ae616494SBram Moolenaar
1631158906cfSBram Moolenaardef IfElse(what: number): string
1632cfcd011fSBram Moolenaar  var res = ''
1633158906cfSBram Moolenaar  if what == 1
1634158906cfSBram Moolenaar    res = "one"
1635158906cfSBram Moolenaar  elseif what == 2
1636158906cfSBram Moolenaar    res = "two"
1637a259d8d3SBram Moolenaar  else
1638158906cfSBram Moolenaar    res = "three"
1639a259d8d3SBram Moolenaar  endif
1640158906cfSBram Moolenaar  return res
1641a259d8d3SBram Moolenaarenddef
1642a259d8d3SBram Moolenaar
1643158906cfSBram Moolenaardef Test_if_elseif_else()
1644158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1645158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1646158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
16470f18b6d1SBram Moolenaarenddef
16480f18b6d1SBram Moolenaar
1649e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1650d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1651d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1652d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1653d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1654d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1655e8c4abbbSBram Moolenaarenddef
1656e8c4abbbSBram Moolenaar
16576d69bf60SBram Moolenaarlet g:bool_true = v:true
16586d69bf60SBram Moolenaarlet g:bool_false = v:false
16596d69bf60SBram Moolenaar
16606d69bf60SBram Moolenaardef Test_if_const_expr()
1661cfcd011fSBram Moolenaar  var res = false
16626d69bf60SBram Moolenaar  if true ? true : false
16636d69bf60SBram Moolenaar    res = true
16646d69bf60SBram Moolenaar  endif
16656d69bf60SBram Moolenaar  assert_equal(true, res)
16666d69bf60SBram Moolenaar
1667585fea7bSBram Moolenaar  g:glob = 2
1668585fea7bSBram Moolenaar  if false
16696797966dSBram Moolenaar    execute('g:glob = 3')
1670585fea7bSBram Moolenaar  endif
1671585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1672585fea7bSBram Moolenaar  if true
16736797966dSBram Moolenaar    execute('g:glob = 3')
1674585fea7bSBram Moolenaar  endif
1675585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1676585fea7bSBram Moolenaar
16776d69bf60SBram Moolenaar  res = false
16786d69bf60SBram Moolenaar  if g:bool_true ? true : false
16796d69bf60SBram Moolenaar    res = true
16806d69bf60SBram Moolenaar  endif
16816d69bf60SBram Moolenaar  assert_equal(true, res)
16826d69bf60SBram Moolenaar
16836d69bf60SBram Moolenaar  res = false
16846d69bf60SBram Moolenaar  if true ? g:bool_true : false
16856d69bf60SBram Moolenaar    res = true
16866d69bf60SBram Moolenaar  endif
16876d69bf60SBram Moolenaar  assert_equal(true, res)
16886d69bf60SBram Moolenaar
16896d69bf60SBram Moolenaar  res = false
16906d69bf60SBram Moolenaar  if true ? true : g:bool_false
16916d69bf60SBram Moolenaar    res = true
16926d69bf60SBram Moolenaar  endif
16936d69bf60SBram Moolenaar  assert_equal(true, res)
16946d69bf60SBram Moolenaar
16956d69bf60SBram Moolenaar  res = false
16966d69bf60SBram Moolenaar  if true ? false : true
16976d69bf60SBram Moolenaar    res = true
16986d69bf60SBram Moolenaar  endif
16996d69bf60SBram Moolenaar  assert_equal(false, res)
17006d69bf60SBram Moolenaar
17016d69bf60SBram Moolenaar  res = false
17026d69bf60SBram Moolenaar  if false ? false : true
17036d69bf60SBram Moolenaar    res = true
17046d69bf60SBram Moolenaar  endif
17056d69bf60SBram Moolenaar  assert_equal(true, res)
17066d69bf60SBram Moolenaar
17076d69bf60SBram Moolenaar  res = false
17086d69bf60SBram Moolenaar  if false ? true : false
17096d69bf60SBram Moolenaar    res = true
17106d69bf60SBram Moolenaar  endif
17116d69bf60SBram Moolenaar  assert_equal(false, res)
17126d69bf60SBram Moolenaar
17136d69bf60SBram Moolenaar  res = false
1714e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1715e8c4abbbSBram Moolenaar    res = true
1716e8c4abbbSBram Moolenaar  endif
1717e8c4abbbSBram Moolenaar  assert_equal(false, res)
1718e8c4abbbSBram Moolenaar
1719e8c4abbbSBram Moolenaar  res = false
17206d69bf60SBram Moolenaar  if true && true
17216d69bf60SBram Moolenaar    res = true
17226d69bf60SBram Moolenaar  endif
17236d69bf60SBram Moolenaar  assert_equal(true, res)
17246d69bf60SBram Moolenaar
17256d69bf60SBram Moolenaar  res = false
17266d69bf60SBram Moolenaar  if true && false
17276d69bf60SBram Moolenaar    res = true
17286d69bf60SBram Moolenaar  endif
17296d69bf60SBram Moolenaar  assert_equal(false, res)
17306d69bf60SBram Moolenaar
17316d69bf60SBram Moolenaar  res = false
17326d69bf60SBram Moolenaar  if g:bool_true && false
17336d69bf60SBram Moolenaar    res = true
17346d69bf60SBram Moolenaar  endif
17356d69bf60SBram Moolenaar  assert_equal(false, res)
17366d69bf60SBram Moolenaar
17376d69bf60SBram Moolenaar  res = false
17386d69bf60SBram Moolenaar  if true && g:bool_false
17396d69bf60SBram Moolenaar    res = true
17406d69bf60SBram Moolenaar  endif
17416d69bf60SBram Moolenaar  assert_equal(false, res)
17426d69bf60SBram Moolenaar
17436d69bf60SBram Moolenaar  res = false
17446d69bf60SBram Moolenaar  if false && false
17456d69bf60SBram Moolenaar    res = true
17466d69bf60SBram Moolenaar  endif
17476d69bf60SBram Moolenaar  assert_equal(false, res)
17486d69bf60SBram Moolenaar
17496d69bf60SBram Moolenaar  res = false
17506d69bf60SBram Moolenaar  if true || false
17516d69bf60SBram Moolenaar    res = true
17526d69bf60SBram Moolenaar  endif
17536d69bf60SBram Moolenaar  assert_equal(true, res)
17546d69bf60SBram Moolenaar
17556d69bf60SBram Moolenaar  res = false
17566d69bf60SBram Moolenaar  if g:bool_true || false
17576d69bf60SBram Moolenaar    res = true
17586d69bf60SBram Moolenaar  endif
17596d69bf60SBram Moolenaar  assert_equal(true, res)
17606d69bf60SBram Moolenaar
17616d69bf60SBram Moolenaar  res = false
17626d69bf60SBram Moolenaar  if true || g:bool_false
17636d69bf60SBram Moolenaar    res = true
17646d69bf60SBram Moolenaar  endif
17656d69bf60SBram Moolenaar  assert_equal(true, res)
17666d69bf60SBram Moolenaar
17676d69bf60SBram Moolenaar  res = false
17686d69bf60SBram Moolenaar  if false || false
17696d69bf60SBram Moolenaar    res = true
17706d69bf60SBram Moolenaar  endif
17716d69bf60SBram Moolenaar  assert_equal(false, res)
17723988f64fSBram Moolenaar
17733988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
17743988f64fSBram Moolenaar  if false | eval 0 | endif
17753988f64fSBram Moolenaar  if false | eval burp + 234 | endif
17763988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
17773988f64fSBram Moolenaar  if false
17783988f64fSBram Moolenaar    burp
17793988f64fSBram Moolenaar  endif
178080c34ca3SBram Moolenaarenddef
17816d69bf60SBram Moolenaar
178280c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1783d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1784d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1785d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1786d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
17876d69bf60SBram Moolenaarenddef
17886d69bf60SBram Moolenaar
178972abcf42SBram Moolenaardef RunNested(i: number): number
1790cfcd011fSBram Moolenaar  var x: number = 0
179172abcf42SBram Moolenaar  if i % 2
179272abcf42SBram Moolenaar    if 1
1793f5be8cdbSBram Moolenaar      # comment
179472abcf42SBram Moolenaar    else
1795f5be8cdbSBram Moolenaar      # comment
179672abcf42SBram Moolenaar    endif
179772abcf42SBram Moolenaar    x += 1
179872abcf42SBram Moolenaar  else
179972abcf42SBram Moolenaar    x += 1000
180072abcf42SBram Moolenaar  endif
180172abcf42SBram Moolenaar  return x
180272abcf42SBram Moolenaarenddef
180372abcf42SBram Moolenaar
180472abcf42SBram Moolenaardef Test_nested_if()
180572abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
180672abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
180772abcf42SBram Moolenaarenddef
180872abcf42SBram Moolenaar
1809ad39c094SBram Moolenaardef Test_execute_cmd()
1810e4984290SBram Moolenaar  # missing argument is ignored
1811e4984290SBram Moolenaar  execute
1812e4984290SBram Moolenaar  execute # comment
1813e4984290SBram Moolenaar
1814ad39c094SBram Moolenaar  new
1815ad39c094SBram Moolenaar  setline(1, 'default')
1816d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1817ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1818a72cfb80SBram Moolenaar
1819d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1820a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1821a72cfb80SBram Moolenaar
1822cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1823cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1824a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1825ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1826a72cfb80SBram Moolenaar
1827d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1828ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1829a72cfb80SBram Moolenaar
1830cfcd011fSBram Moolenaar  var cmd_first = 'call '
1831cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1832ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1833ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1834ad39c094SBram Moolenaar  bwipe!
1835585fea7bSBram Moolenaar
1836cfcd011fSBram Moolenaar  var n = true
18372d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
18382d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
18392d6b20d6SBram Moolenaar
1840e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1841e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1842e5abf7afSBram Moolenaar
1843d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1844d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1845d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1846ad39c094SBram Moolenaarenddef
1847ad39c094SBram Moolenaar
184847e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1849f5be8cdbSBram Moolenaar  # only checks line continuation
1850cfcd011fSBram Moolenaar  var lines =<< trim END
185147e880d6SBram Moolenaar      vim9script
185247e880d6SBram Moolenaar      execute 'g:someVar'
185347e880d6SBram Moolenaar                .. ' = ' ..
185447e880d6SBram Moolenaar                   '28'
185547e880d6SBram Moolenaar      assert_equal(28, g:someVar)
185647e880d6SBram Moolenaar      unlet g:someVar
185747e880d6SBram Moolenaar  END
185847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
185947e880d6SBram Moolenaarenddef
186047e880d6SBram Moolenaar
1861ad39c094SBram Moolenaardef Test_echo_cmd()
1862a72cfb80SBram Moolenaar  echo 'some' # comment
1863585fea7bSBram Moolenaar  echon 'thing'
1864ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1865ad39c094SBram Moolenaar
1866a72cfb80SBram Moolenaar  echo "some" # comment
1867a72cfb80SBram Moolenaar  echon "thing"
1868a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1869a72cfb80SBram Moolenaar
1870cfcd011fSBram Moolenaar  var str1 = 'some'
1871cfcd011fSBram Moolenaar  var str2 = 'more'
1872ad39c094SBram Moolenaar  echo str1 str2
1873ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1874a72cfb80SBram Moolenaar
1875d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1876ad39c094SBram Moolenaarenddef
1877ad39c094SBram Moolenaar
1878f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1879f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1880f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1881f93c7feaSBram Moolenaar  echo 'clear'
1882df069eecSBram Moolenaar  :1messages
1883f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1884f93c7feaSBram Moolenaar
1885d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1886f93c7feaSBram Moolenaarenddef
1887f93c7feaSBram Moolenaar
188847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1889f5be8cdbSBram Moolenaar  # only checks line continuation
1890cfcd011fSBram Moolenaar  var lines =<< trim END
189147e880d6SBram Moolenaar      vim9script
189247e880d6SBram Moolenaar      echomsg 'here'
189347e880d6SBram Moolenaar                .. ' is ' ..
189447e880d6SBram Moolenaar                   'a message'
189547e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
189647e880d6SBram Moolenaar  END
189747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
189847e880d6SBram Moolenaarenddef
189947e880d6SBram Moolenaar
1900f93c7feaSBram Moolenaardef Test_echoerr_cmd()
190140ee466cSBram Moolenaar  try
190240ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
190340ee466cSBram Moolenaar  catch
190440ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
190540ee466cSBram Moolenaar  endtry
1906f93c7feaSBram Moolenaarenddef
1907f93c7feaSBram Moolenaar
190847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1909f5be8cdbSBram Moolenaar  # only checks line continuation
1910cfcd011fSBram Moolenaar  var lines =<< trim END
191147e880d6SBram Moolenaar      vim9script
191247e880d6SBram Moolenaar      try
191347e880d6SBram Moolenaar        echoerr 'this'
191447e880d6SBram Moolenaar                .. ' is ' ..
191547e880d6SBram Moolenaar                   'wrong'
191647e880d6SBram Moolenaar      catch
191747e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
191847e880d6SBram Moolenaar      endtry
191947e880d6SBram Moolenaar  END
192047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
192147e880d6SBram Moolenaarenddef
192247e880d6SBram Moolenaar
192341fe0617SBram Moolenaardef Test_for_outside_of_function()
1924cfcd011fSBram Moolenaar  var lines =<< trim END
192541fe0617SBram Moolenaar    vim9script
192641fe0617SBram Moolenaar    new
192741fe0617SBram Moolenaar    for var in range(0, 3)
192841fe0617SBram Moolenaar      append(line('$'), var)
192941fe0617SBram Moolenaar    endfor
193041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
193141fe0617SBram Moolenaar    bwipe!
193241fe0617SBram Moolenaar  END
193341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
193441fe0617SBram Moolenaar  source Xvim9for.vim
193541fe0617SBram Moolenaar  delete('Xvim9for.vim')
193641fe0617SBram Moolenaarenddef
19378a7d6542SBram Moolenaar
1938e8c4abbbSBram Moolenaardef Test_for_loop()
1939cfcd011fSBram Moolenaar  var result = ''
1940e8c4abbbSBram Moolenaar  for cnt in range(7)
1941e8c4abbbSBram Moolenaar    if cnt == 4
1942e8c4abbbSBram Moolenaar      break
1943e8c4abbbSBram Moolenaar    endif
1944e8c4abbbSBram Moolenaar    if cnt == 2
1945e8c4abbbSBram Moolenaar      continue
1946e8c4abbbSBram Moolenaar    endif
1947e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1948e8c4abbbSBram Moolenaar  endfor
1949e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
19500ad3e894SBram Moolenaar
1951cfcd011fSBram Moolenaar  var concat = ''
19520ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
19530ad3e894SBram Moolenaar    concat ..= str
19540ad3e894SBram Moolenaar  endfor
19550ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
195638bd8de5SBram Moolenaar
195738bd8de5SBram Moolenaar  var total = 0
195838bd8de5SBram Moolenaar  for nr in
195938bd8de5SBram Moolenaar      [1, 2, 3]
196038bd8de5SBram Moolenaar    total += nr
196138bd8de5SBram Moolenaar  endfor
196238bd8de5SBram Moolenaar  assert_equal(6, total)
196338bd8de5SBram Moolenaar
196438bd8de5SBram Moolenaar  total = 0
196538bd8de5SBram Moolenaar  for nr
196638bd8de5SBram Moolenaar    in [1, 2, 3]
196738bd8de5SBram Moolenaar    total += nr
196838bd8de5SBram Moolenaar  endfor
196938bd8de5SBram Moolenaar  assert_equal(6, total)
197038bd8de5SBram Moolenaar
197138bd8de5SBram Moolenaar  total = 0
197238bd8de5SBram Moolenaar  for nr
197338bd8de5SBram Moolenaar    in
197438bd8de5SBram Moolenaar    [1, 2, 3]
197538bd8de5SBram Moolenaar    total += nr
197638bd8de5SBram Moolenaar  endfor
197738bd8de5SBram Moolenaar  assert_equal(6, total)
1978e8c4abbbSBram Moolenaarenddef
1979e8c4abbbSBram Moolenaar
1980e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1981025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
1982025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
1983025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
1984675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1985675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1986cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1987822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
19882d870f8dSBram Moolenaar  delfunc! g:Func
1989451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1990675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1991675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1992675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1993e8c4abbbSBram Moolenaarenddef
1994e8c4abbbSBram Moolenaar
1995ea87069dSBram Moolenaardef Test_for_loop_script_var()
1996ea87069dSBram Moolenaar  # cannot use s:var in a :def function
1997ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
1998ea87069dSBram Moolenaar
1999ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2000ea87069dSBram Moolenaar  var lines =<< trim END
2001ea87069dSBram Moolenaar    vim9script
2002ea87069dSBram Moolenaar    var total = 0
2003ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2004ea87069dSBram Moolenaar      total += s:var
2005ea87069dSBram Moolenaar    endfor
2006ea87069dSBram Moolenaar    assert_equal(6, total)
2007ea87069dSBram Moolenaar
2008ea87069dSBram Moolenaar    total = 0
2009ea87069dSBram Moolenaar    for var in [1, 2, 3]
2010ea87069dSBram Moolenaar      total += var
2011ea87069dSBram Moolenaar    endfor
2012ea87069dSBram Moolenaar    assert_equal(6, total)
2013ea87069dSBram Moolenaar  END
2014ea87069dSBram Moolenaarenddef
2015ea87069dSBram Moolenaar
2016792f786aSBram Moolenaardef Test_for_loop_unpack()
20174b8a0651SBram Moolenaar  var lines =<< trim END
2018792f786aSBram Moolenaar      var result = []
2019792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2020792f786aSBram Moolenaar        result->add(v1)
2021792f786aSBram Moolenaar        result->add(v2)
2022792f786aSBram Moolenaar      endfor
2023792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2024792f786aSBram Moolenaar
2025792f786aSBram Moolenaar      result = []
2026792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2027792f786aSBram Moolenaar        result->add(v1)
2028792f786aSBram Moolenaar        result->add(v2)
2029792f786aSBram Moolenaar        result->add(v3)
2030792f786aSBram Moolenaar      endfor
2031792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2032792f786aSBram Moolenaar
20334b8a0651SBram Moolenaar      result = []
20344b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
20354b8a0651SBram Moolenaar        result->add(&ts)
20364b8a0651SBram Moolenaar        result->add(&sw)
20374b8a0651SBram Moolenaar      endfor
20384b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
20394b8a0651SBram Moolenaar
20404b8a0651SBram Moolenaar      var slist: list<string>
20414b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
20424b8a0651SBram Moolenaar        slist->add($LOOPVAR)
20434b8a0651SBram Moolenaar        slist->add(@r)
20444b8a0651SBram Moolenaar        slist->add(v:errmsg)
20454b8a0651SBram Moolenaar      endfor
20464b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
20474b8a0651SBram Moolenaar
20484b8a0651SBram Moolenaar      slist = []
20494b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
20504b8a0651SBram Moolenaar        slist->add(g:globalvar)
20514b8a0651SBram Moolenaar        slist->add(b:bufvar)
20524b8a0651SBram Moolenaar        slist->add(w:winvar)
20534b8a0651SBram Moolenaar        slist->add(t:tabvar)
20544b8a0651SBram Moolenaar      endfor
20554b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2056f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
20574b8a0651SBram Moolenaar  END
20584b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
20594b8a0651SBram Moolenaar
20604b8a0651SBram Moolenaar  lines =<< trim END
2061792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2062792f786aSBram Moolenaar        echo v1 v2
2063792f786aSBram Moolenaar      endfor
2064792f786aSBram Moolenaar  END
2065792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2066792f786aSBram Moolenaar
2067792f786aSBram Moolenaar  lines =<< trim END
2068792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2069792f786aSBram Moolenaar        echo v1 v2
2070792f786aSBram Moolenaar      endfor
2071792f786aSBram Moolenaar  END
2072792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2073792f786aSBram Moolenaar
2074792f786aSBram Moolenaar  lines =<< trim END
2075792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2076792f786aSBram Moolenaar        echo v1
2077792f786aSBram Moolenaar      endfor
2078792f786aSBram Moolenaar  END
2079792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2080792f786aSBram Moolenaarenddef
2081792f786aSBram Moolenaar
2082d0df1aacSBram Moolenaardef Test_while_loop()
2083cfcd011fSBram Moolenaar  var result = ''
2084cfcd011fSBram Moolenaar  var cnt = 0
2085d0df1aacSBram Moolenaar  while cnt < 555
2086d0df1aacSBram Moolenaar    if cnt == 3
2087d0df1aacSBram Moolenaar      break
2088d0df1aacSBram Moolenaar    endif
2089d0df1aacSBram Moolenaar    cnt += 1
2090d0df1aacSBram Moolenaar    if cnt == 2
2091d0df1aacSBram Moolenaar      continue
2092d0df1aacSBram Moolenaar    endif
2093d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2094d0df1aacSBram Moolenaar  endwhile
2095d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2096d0df1aacSBram Moolenaarenddef
2097d0df1aacSBram Moolenaar
2098e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2099675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2100675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2101675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2102675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2103675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2104675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2105675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2106bd5da371SBram Moolenaarenddef
2107bd5da371SBram Moolenaar
21089645e2d9SBram Moolenaardef Test_interrupt_loop()
2109cfcd011fSBram Moolenaar  var caught = false
2110cfcd011fSBram Moolenaar  var x = 0
211197acfc78SBram Moolenaar  try
21129645e2d9SBram Moolenaar    while 1
21139645e2d9SBram Moolenaar      x += 1
21149645e2d9SBram Moolenaar      if x == 100
21159645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
21169645e2d9SBram Moolenaar      endif
21179645e2d9SBram Moolenaar    endwhile
211897acfc78SBram Moolenaar  catch
211997acfc78SBram Moolenaar    caught = true
212097acfc78SBram Moolenaar    assert_equal(100, x)
212197acfc78SBram Moolenaar  endtry
212297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
212325859dd7SBram Moolenaar  # consume the CTRL-C
212425859dd7SBram Moolenaar  getchar(0)
21259645e2d9SBram Moolenaarenddef
212620431c9dSBram Moolenaar
21274fdae999SBram Moolenaardef Test_automatic_line_continuation()
2128cfcd011fSBram Moolenaar  var mylist = [
21294fdae999SBram Moolenaar      'one',
21304fdae999SBram Moolenaar      'two',
21314fdae999SBram Moolenaar      'three',
2132f5be8cdbSBram Moolenaar      ] # comment
21334fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
21344fdae999SBram Moolenaar
2135cfcd011fSBram Moolenaar  var mydict = {
2136e0de171eSBram Moolenaar      ['one']: 1,
2137e0de171eSBram Moolenaar      ['two']: 2,
2138e0de171eSBram Moolenaar      ['three']:
21394fdae999SBram Moolenaar          3,
2140f5be8cdbSBram Moolenaar      } # comment
2141e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2142e0de171eSBram Moolenaar  mydict = {
21432c330432SBram Moolenaar      one: 1,  # comment
21442c330432SBram Moolenaar      two:     # comment
21452c330432SBram Moolenaar           2,  # comment
21462c330432SBram Moolenaar      three: 3 # comment
21472c330432SBram Moolenaar      }
2148e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2149e0de171eSBram Moolenaar  mydict = {
21502c330432SBram Moolenaar      one: 1,
21514fdae999SBram Moolenaar      two:
21524fdae999SBram Moolenaar           2,
21532c330432SBram Moolenaar      three: 3
21544fdae999SBram Moolenaar      }
2155e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2156e6085c53SBram Moolenaar
2157e6085c53SBram Moolenaar  assert_equal(
2158e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2159e6085c53SBram Moolenaar        split('one two three')
2160e6085c53SBram Moolenaar        )
21614fdae999SBram Moolenaarenddef
21624fdae999SBram Moolenaar
21637a092245SBram Moolenaardef Test_vim9_comment()
21647a092245SBram Moolenaar  CheckScriptSuccess([
21657a092245SBram Moolenaar      'vim9script',
21667a092245SBram Moolenaar      '# something',
216793f82cbeSBram Moolenaar      '#something',
216893f82cbeSBram Moolenaar      '#{something',
21697a092245SBram Moolenaar      ])
217093f82cbeSBram Moolenaar
217193f82cbeSBram Moolenaar  split Xfile
217293f82cbeSBram Moolenaar  CheckScriptSuccess([
217393f82cbeSBram Moolenaar      'vim9script',
217493f82cbeSBram Moolenaar      'edit #something',
217593f82cbeSBram Moolenaar      ])
217693f82cbeSBram Moolenaar  CheckScriptSuccess([
217793f82cbeSBram Moolenaar      'vim9script',
217893f82cbeSBram Moolenaar      'edit #{something',
217993f82cbeSBram Moolenaar      ])
218093f82cbeSBram Moolenaar  close
218193f82cbeSBram Moolenaar
21827a092245SBram Moolenaar  CheckScriptFailure([
21837a092245SBram Moolenaar      'vim9script',
21847a092245SBram Moolenaar      ':# something',
21857a092245SBram Moolenaar      ], 'E488:')
21867a092245SBram Moolenaar  CheckScriptFailure([
21877a092245SBram Moolenaar      '# something',
21887a092245SBram Moolenaar      ], 'E488:')
21897a092245SBram Moolenaar  CheckScriptFailure([
21907a092245SBram Moolenaar      ':# something',
21917a092245SBram Moolenaar      ], 'E488:')
21927a092245SBram Moolenaar
21934a8d9f2eSBram Moolenaar  { # block start
21944a8d9f2eSBram Moolenaar  } # block end
21954a8d9f2eSBram Moolenaar  CheckDefFailure([
21964a8d9f2eSBram Moolenaar      '{# comment',
21974a8d9f2eSBram Moolenaar      ], 'E488:')
21984a8d9f2eSBram Moolenaar  CheckDefFailure([
21994a8d9f2eSBram Moolenaar      '{',
22004a8d9f2eSBram Moolenaar      '}# comment',
22014a8d9f2eSBram Moolenaar      ], 'E488:')
22024a8d9f2eSBram Moolenaar
22034a8d9f2eSBram Moolenaar  echo "yes" # comment
22044a8d9f2eSBram Moolenaar  CheckDefFailure([
22054a8d9f2eSBram Moolenaar      'echo "yes"# comment',
22064a8d9f2eSBram Moolenaar      ], 'E488:')
22077a092245SBram Moolenaar  CheckScriptSuccess([
22087a092245SBram Moolenaar      'vim9script',
22097a092245SBram Moolenaar      'echo "yes" # something',
22107a092245SBram Moolenaar      ])
22117a092245SBram Moolenaar  CheckScriptFailure([
22127a092245SBram Moolenaar      'vim9script',
22137a092245SBram Moolenaar      'echo "yes"# something',
22147a092245SBram Moolenaar      ], 'E121:')
22157a092245SBram Moolenaar  CheckScriptFailure([
22167a092245SBram Moolenaar      'vim9script',
22177a092245SBram Moolenaar      'echo# something',
2218f8103f27SBram Moolenaar      ], 'E1144:')
22197a092245SBram Moolenaar  CheckScriptFailure([
22207a092245SBram Moolenaar      'echo "yes" # something',
22217a092245SBram Moolenaar      ], 'E121:')
22227a092245SBram Moolenaar
22234a8d9f2eSBram Moolenaar  exe "echo" # comment
22244a8d9f2eSBram Moolenaar  CheckDefFailure([
22254a8d9f2eSBram Moolenaar      'exe "echo"# comment',
22264a8d9f2eSBram Moolenaar      ], 'E488:')
22274a8d9f2eSBram Moolenaar  CheckScriptSuccess([
22284a8d9f2eSBram Moolenaar      'vim9script',
22294a8d9f2eSBram Moolenaar      'exe "echo" # something',
22304a8d9f2eSBram Moolenaar      ])
22314a8d9f2eSBram Moolenaar  CheckScriptFailure([
22324a8d9f2eSBram Moolenaar      'vim9script',
22334a8d9f2eSBram Moolenaar      'exe "echo"# something',
22344a8d9f2eSBram Moolenaar      ], 'E121:')
22354a8d9f2eSBram Moolenaar  CheckScriptFailure([
22364a8d9f2eSBram Moolenaar      'vim9script',
22374a8d9f2eSBram Moolenaar      'exe# something',
2238f8103f27SBram Moolenaar      ], 'E1144:')
22394a8d9f2eSBram Moolenaar  CheckScriptFailure([
22404a8d9f2eSBram Moolenaar      'exe "echo" # something',
22414a8d9f2eSBram Moolenaar      ], 'E121:')
22424a8d9f2eSBram Moolenaar
22437a092245SBram Moolenaar  CheckDefFailure([
22447a092245SBram Moolenaar      'try# comment',
22457a092245SBram Moolenaar      '  echo "yes"',
22467a092245SBram Moolenaar      'catch',
22477a092245SBram Moolenaar      'endtry',
2248f8103f27SBram Moolenaar      ], 'E1144:')
22492c5ed4e3SBram Moolenaar  CheckScriptFailure([
22502c5ed4e3SBram Moolenaar      'vim9script',
22512c5ed4e3SBram Moolenaar      'try# comment',
22522c5ed4e3SBram Moolenaar      'echo "yes"',
2253f8103f27SBram Moolenaar      ], 'E1144:')
22547a092245SBram Moolenaar  CheckDefFailure([
22557a092245SBram Moolenaar      'try',
2256a72cfb80SBram Moolenaar      '  throw#comment',
2257a72cfb80SBram Moolenaar      'catch',
2258a72cfb80SBram Moolenaar      'endtry',
2259f8103f27SBram Moolenaar      ], 'E1144:')
2260a72cfb80SBram Moolenaar  CheckDefFailure([
2261a72cfb80SBram Moolenaar      'try',
2262a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2263a72cfb80SBram Moolenaar      'catch',
2264a72cfb80SBram Moolenaar      'endtry',
2265a72cfb80SBram Moolenaar      ], 'E488:')
2266a72cfb80SBram Moolenaar  CheckDefFailure([
2267a72cfb80SBram Moolenaar      'try',
22687a092245SBram Moolenaar      '  echo "yes"',
22697a092245SBram Moolenaar      'catch# comment',
22707a092245SBram Moolenaar      'endtry',
2271f8103f27SBram Moolenaar      ], 'E1144:')
22722c5ed4e3SBram Moolenaar  CheckScriptFailure([
22732c5ed4e3SBram Moolenaar      'vim9script',
22742c5ed4e3SBram Moolenaar      'try',
22752c5ed4e3SBram Moolenaar      '  echo "yes"',
22762c5ed4e3SBram Moolenaar      'catch# comment',
22772c5ed4e3SBram Moolenaar      'endtry',
2278f8103f27SBram Moolenaar      ], 'E1144:')
22792c5ed4e3SBram Moolenaar  CheckDefFailure([
22802c5ed4e3SBram Moolenaar      'try',
22812c5ed4e3SBram Moolenaar      '  echo "yes"',
22822c5ed4e3SBram Moolenaar      'catch /pat/# comment',
22832c5ed4e3SBram Moolenaar      'endtry',
22842c5ed4e3SBram Moolenaar      ], 'E488:')
22857a092245SBram Moolenaar  CheckDefFailure([
22867a092245SBram Moolenaar      'try',
22877a092245SBram Moolenaar      'echo "yes"',
22887a092245SBram Moolenaar      'catch',
22897a092245SBram Moolenaar      'endtry# comment',
2290f8103f27SBram Moolenaar      ], 'E1144:')
22912c5ed4e3SBram Moolenaar  CheckScriptFailure([
22922c5ed4e3SBram Moolenaar      'vim9script',
22932c5ed4e3SBram Moolenaar      'try',
22942c5ed4e3SBram Moolenaar      '  echo "yes"',
22952c5ed4e3SBram Moolenaar      'catch',
22962c5ed4e3SBram Moolenaar      'endtry# comment',
2297f8103f27SBram Moolenaar      ], 'E1144:')
22982c5ed4e3SBram Moolenaar
22992c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23002c5ed4e3SBram Moolenaar      'vim9script',
23012c5ed4e3SBram Moolenaar      'hi # comment',
23022c5ed4e3SBram Moolenaar      ])
23032c5ed4e3SBram Moolenaar  CheckScriptFailure([
23042c5ed4e3SBram Moolenaar      'vim9script',
23052c5ed4e3SBram Moolenaar      'hi# comment',
2306f8103f27SBram Moolenaar      ], 'E1144:')
23071966c248SBram Moolenaar  CheckScriptSuccess([
23081966c248SBram Moolenaar      'vim9script',
23091966c248SBram Moolenaar      'hi Search # comment',
23101966c248SBram Moolenaar      ])
23111966c248SBram Moolenaar  CheckScriptFailure([
23121966c248SBram Moolenaar      'vim9script',
23131966c248SBram Moolenaar      'hi Search# comment',
23141966c248SBram Moolenaar      ], 'E416:')
23151966c248SBram Moolenaar  CheckScriptSuccess([
23161966c248SBram Moolenaar      'vim9script',
23171966c248SBram Moolenaar      'hi link This Search # comment',
23181966c248SBram Moolenaar      ])
23191966c248SBram Moolenaar  CheckScriptFailure([
23201966c248SBram Moolenaar      'vim9script',
23211966c248SBram Moolenaar      'hi link This That# comment',
23221966c248SBram Moolenaar      ], 'E413:')
23231966c248SBram Moolenaar  CheckScriptSuccess([
23241966c248SBram Moolenaar      'vim9script',
23251966c248SBram Moolenaar      'hi clear This # comment',
23261966c248SBram Moolenaar      'hi clear # comment',
23271966c248SBram Moolenaar      ])
2328f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2329f5be8cdbSBram Moolenaar  # hi clear This# comment',
23301966c248SBram Moolenaar  CheckScriptFailure([
23311966c248SBram Moolenaar      'vim9script',
23321966c248SBram Moolenaar      'hi clear# comment',
23331966c248SBram Moolenaar      ], 'E416:')
23341966c248SBram Moolenaar
23351966c248SBram Moolenaar  CheckScriptSuccess([
23361966c248SBram Moolenaar      'vim9script',
23371966c248SBram Moolenaar      'hi Group term=bold',
23381966c248SBram Moolenaar      'match Group /todo/ # comment',
23391966c248SBram Moolenaar      ])
23401966c248SBram Moolenaar  CheckScriptFailure([
23411966c248SBram Moolenaar      'vim9script',
23421966c248SBram Moolenaar      'hi Group term=bold',
23431966c248SBram Moolenaar      'match Group /todo/# comment',
23441966c248SBram Moolenaar      ], 'E488:')
23451966c248SBram Moolenaar  CheckScriptSuccess([
23461966c248SBram Moolenaar      'vim9script',
23471966c248SBram Moolenaar      'match # comment',
23481966c248SBram Moolenaar      ])
23491966c248SBram Moolenaar  CheckScriptFailure([
23501966c248SBram Moolenaar      'vim9script',
23511966c248SBram Moolenaar      'match# comment',
2352f8103f27SBram Moolenaar      ], 'E1144:')
23531966c248SBram Moolenaar  CheckScriptSuccess([
23541966c248SBram Moolenaar      'vim9script',
23551966c248SBram Moolenaar      'match none # comment',
23561966c248SBram Moolenaar      ])
23571966c248SBram Moolenaar  CheckScriptFailure([
23581966c248SBram Moolenaar      'vim9script',
23591966c248SBram Moolenaar      'match none# comment',
23601966c248SBram Moolenaar      ], 'E475:')
23611966c248SBram Moolenaar
23621966c248SBram Moolenaar  CheckScriptSuccess([
23631966c248SBram Moolenaar      'vim9script',
23641966c248SBram Moolenaar      'menutrans clear # comment',
23651966c248SBram Moolenaar      ])
23661966c248SBram Moolenaar  CheckScriptFailure([
23671966c248SBram Moolenaar      'vim9script',
23681966c248SBram Moolenaar      'menutrans clear# comment text',
23691966c248SBram Moolenaar      ], 'E474:')
23701966c248SBram Moolenaar
23711966c248SBram Moolenaar  CheckScriptSuccess([
23721966c248SBram Moolenaar      'vim9script',
23731966c248SBram Moolenaar      'syntax clear # comment',
23741966c248SBram Moolenaar      ])
23751966c248SBram Moolenaar  CheckScriptFailure([
23761966c248SBram Moolenaar      'vim9script',
23771966c248SBram Moolenaar      'syntax clear# comment text',
23781966c248SBram Moolenaar      ], 'E28:')
23791966c248SBram Moolenaar  CheckScriptSuccess([
23801966c248SBram Moolenaar      'vim9script',
23811966c248SBram Moolenaar      'syntax keyword Word some',
23821966c248SBram Moolenaar      'syntax clear Word # comment',
23831966c248SBram Moolenaar      ])
23841966c248SBram Moolenaar  CheckScriptFailure([
23851966c248SBram Moolenaar      'vim9script',
23861966c248SBram Moolenaar      'syntax keyword Word some',
23871966c248SBram Moolenaar      'syntax clear Word# comment text',
23881966c248SBram Moolenaar      ], 'E28:')
23891966c248SBram Moolenaar
23901966c248SBram Moolenaar  CheckScriptSuccess([
23911966c248SBram Moolenaar      'vim9script',
23921966c248SBram Moolenaar      'syntax list # comment',
23931966c248SBram Moolenaar      ])
23941966c248SBram Moolenaar  CheckScriptFailure([
23951966c248SBram Moolenaar      'vim9script',
23961966c248SBram Moolenaar      'syntax list# comment text',
23971966c248SBram Moolenaar      ], 'E28:')
23981966c248SBram Moolenaar
23991966c248SBram Moolenaar  CheckScriptSuccess([
24001966c248SBram Moolenaar      'vim9script',
24011966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24021966c248SBram Moolenaar      ])
24031966c248SBram Moolenaar  CheckScriptFailure([
24041966c248SBram Moolenaar      'vim9script',
24051966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
24061966c248SBram Moolenaar      ], 'E475:')
24071966c248SBram Moolenaar
24081966c248SBram Moolenaar  CheckScriptSuccess([
24091966c248SBram Moolenaar      'vim9script',
24101966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
24111966c248SBram Moolenaar      ])
24121966c248SBram Moolenaar  CheckScriptFailure([
24131966c248SBram Moolenaar      'vim9script',
24141966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
24151966c248SBram Moolenaar      ], 'E789:')
24161966c248SBram Moolenaar
24171966c248SBram Moolenaar  CheckScriptSuccess([
24181966c248SBram Moolenaar      'vim9script',
24191966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
24201966c248SBram Moolenaar      ])
24211966c248SBram Moolenaar  CheckScriptFailure([
24221966c248SBram Moolenaar      'vim9script',
24231966c248SBram Moolenaar      'syntax match Word /pat/# comment',
24241966c248SBram Moolenaar      ], 'E402:')
24251966c248SBram Moolenaar
24261966c248SBram Moolenaar  CheckScriptSuccess([
24271966c248SBram Moolenaar      'vim9script',
24281966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
24291966c248SBram Moolenaar      ])
24301966c248SBram Moolenaar  CheckScriptFailure([
24311966c248SBram Moolenaar      'vim9script',
24321966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
24331966c248SBram Moolenaar      ], 'E475:')
24341966c248SBram Moolenaar  CheckScriptFailure([
24351966c248SBram Moolenaar      'vim9script',
24361966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
24371966c248SBram Moolenaar      ], 'E406:')
24381966c248SBram Moolenaar  CheckScriptFailure([
24391966c248SBram Moolenaar      'vim9script',
24401966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
24411966c248SBram Moolenaar      ], 'E475:')
24421966c248SBram Moolenaar
24431966c248SBram Moolenaar  CheckScriptSuccess([
24441966c248SBram Moolenaar      'vim9script',
24451966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
24461966c248SBram Moolenaar      ])
24471966c248SBram Moolenaar  CheckScriptFailure([
24481966c248SBram Moolenaar      'vim9script',
24491966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2450d032f34aSBram Moolenaar      ], 'E402:')
24511966c248SBram Moolenaar
24521966c248SBram Moolenaar  CheckScriptSuccess([
24531966c248SBram Moolenaar      'vim9script',
24541966c248SBram Moolenaar      'syntax sync # comment',
24551966c248SBram Moolenaar      ])
24561966c248SBram Moolenaar  CheckScriptFailure([
24571966c248SBram Moolenaar      'vim9script',
24581966c248SBram Moolenaar      'syntax sync# comment',
24591966c248SBram Moolenaar      ], 'E404:')
24601966c248SBram Moolenaar  CheckScriptSuccess([
24611966c248SBram Moolenaar      'vim9script',
24621966c248SBram Moolenaar      'syntax sync ccomment # comment',
24631966c248SBram Moolenaar      ])
24641966c248SBram Moolenaar  CheckScriptFailure([
24651966c248SBram Moolenaar      'vim9script',
24661966c248SBram Moolenaar      'syntax sync ccomment# comment',
24671966c248SBram Moolenaar      ], 'E404:')
24681966c248SBram Moolenaar
24691966c248SBram Moolenaar  CheckScriptSuccess([
24701966c248SBram Moolenaar      'vim9script',
24711966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
24721966c248SBram Moolenaar      ])
24731966c248SBram Moolenaar  CheckScriptFailure([
24741966c248SBram Moolenaar      'vim9script',
24751966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
24761966c248SBram Moolenaar      ], 'E475:')
2477a72cfb80SBram Moolenaar
2478a72cfb80SBram Moolenaar  CheckScriptSuccess([
2479a72cfb80SBram Moolenaar      'vim9script',
2480a72cfb80SBram Moolenaar      'command Echo echo # comment',
2481a72cfb80SBram Moolenaar      'command Echo # comment',
24822d870f8dSBram Moolenaar      'delcommand Echo',
2483a72cfb80SBram Moolenaar      ])
2484a72cfb80SBram Moolenaar  CheckScriptFailure([
2485a72cfb80SBram Moolenaar      'vim9script',
2486a72cfb80SBram Moolenaar      'command Echo echo# comment',
2487a72cfb80SBram Moolenaar      'Echo',
2488f8103f27SBram Moolenaar      ], 'E1144:')
24892d870f8dSBram Moolenaar  delcommand Echo
249070249ee8SBram Moolenaar
249170249ee8SBram Moolenaar  var curdir = getcwd()
249270249ee8SBram Moolenaar  CheckScriptSuccess([
249370249ee8SBram Moolenaar      'command Echo cd " comment',
249470249ee8SBram Moolenaar      'Echo',
249570249ee8SBram Moolenaar      'delcommand Echo',
249670249ee8SBram Moolenaar      ])
249770249ee8SBram Moolenaar  CheckScriptSuccess([
2498090728adSBram Moolenaar      'vim9script',
249970249ee8SBram Moolenaar      'command Echo cd # comment',
250070249ee8SBram Moolenaar      'Echo',
250170249ee8SBram Moolenaar      'delcommand Echo',
250270249ee8SBram Moolenaar      ])
250370249ee8SBram Moolenaar  CheckScriptFailure([
250470249ee8SBram Moolenaar      'vim9script',
250570249ee8SBram Moolenaar      'command Echo cd " comment',
250670249ee8SBram Moolenaar      'Echo',
250770249ee8SBram Moolenaar      ], 'E344:')
250870249ee8SBram Moolenaar  delcommand Echo
250970249ee8SBram Moolenaar  chdir(curdir)
251070249ee8SBram Moolenaar
2511a72cfb80SBram Moolenaar  CheckScriptFailure([
2512a72cfb80SBram Moolenaar      'vim9script',
2513a72cfb80SBram Moolenaar      'command Echo# comment',
2514a72cfb80SBram Moolenaar      ], 'E182:')
2515a72cfb80SBram Moolenaar  CheckScriptFailure([
2516a72cfb80SBram Moolenaar      'vim9script',
2517a72cfb80SBram Moolenaar      'command Echo echo',
2518a72cfb80SBram Moolenaar      'command Echo# comment',
2519a72cfb80SBram Moolenaar      ], 'E182:')
25202d870f8dSBram Moolenaar  delcommand Echo
2521a72cfb80SBram Moolenaar
2522a72cfb80SBram Moolenaar  CheckScriptSuccess([
2523a72cfb80SBram Moolenaar      'vim9script',
2524a72cfb80SBram Moolenaar      'function # comment',
2525a72cfb80SBram Moolenaar      ])
2526a72cfb80SBram Moolenaar  CheckScriptFailure([
2527a72cfb80SBram Moolenaar      'vim9script',
25289898107fSBram Moolenaar      'function " comment',
25299898107fSBram Moolenaar      ], 'E129:')
25309898107fSBram Moolenaar  CheckScriptFailure([
25319898107fSBram Moolenaar      'vim9script',
2532a72cfb80SBram Moolenaar      'function# comment',
2533f8103f27SBram Moolenaar      ], 'E1144:')
2534a72cfb80SBram Moolenaar  CheckScriptSuccess([
2535a72cfb80SBram Moolenaar      'vim9script',
2536a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2537a72cfb80SBram Moolenaar      ])
2538a72cfb80SBram Moolenaar  CheckScriptFailure([
2539a72cfb80SBram Moolenaar      'vim9script',
2540a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2541a72cfb80SBram Moolenaar      ], 'E488:')
2542a72cfb80SBram Moolenaar
2543a72cfb80SBram Moolenaar  CheckScriptSuccess([
2544a72cfb80SBram Moolenaar      'vim9script',
25454c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2546a72cfb80SBram Moolenaar      'endfunc',
25474c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2548a72cfb80SBram Moolenaar      ])
2549a72cfb80SBram Moolenaar  CheckScriptFailure([
2550a72cfb80SBram Moolenaar      'vim9script',
25514c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2552a72cfb80SBram Moolenaar      'endfunc',
25534c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2554a72cfb80SBram Moolenaar      ], 'E488:')
2555a72cfb80SBram Moolenaar
2556a72cfb80SBram Moolenaar  CheckScriptSuccess([
2557a72cfb80SBram Moolenaar      'vim9script',
2558a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2559a72cfb80SBram Moolenaar      ])
2560a72cfb80SBram Moolenaar  CheckScriptFailure([
2561a72cfb80SBram Moolenaar      'vim9script',
2562a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2563a72cfb80SBram Moolenaar      ], 'E488:')
2564e7e4838fSBram Moolenaar
2565e7e4838fSBram Moolenaar  CheckScriptFailure([
2566e7e4838fSBram Moolenaar      'def Test() " comment',
2567e7e4838fSBram Moolenaar      'enddef',
2568e7e4838fSBram Moolenaar      ], 'E488:')
2569e7e4838fSBram Moolenaar  CheckScriptFailure([
2570e7e4838fSBram Moolenaar      'vim9script',
2571e7e4838fSBram Moolenaar      'def Test() " comment',
2572e7e4838fSBram Moolenaar      'enddef',
2573e7e4838fSBram Moolenaar      ], 'E488:')
2574e7e4838fSBram Moolenaar
2575e7e4838fSBram Moolenaar  CheckScriptSuccess([
2576e7e4838fSBram Moolenaar      'func Test() " comment',
2577e7e4838fSBram Moolenaar      'endfunc',
25782d870f8dSBram Moolenaar      'delfunc Test',
2579e7e4838fSBram Moolenaar      ])
25809898107fSBram Moolenaar  CheckScriptSuccess([
2581e7e4838fSBram Moolenaar      'vim9script',
2582e7e4838fSBram Moolenaar      'func Test() " comment',
2583e7e4838fSBram Moolenaar      'endfunc',
25849898107fSBram Moolenaar      ])
2585e7e4838fSBram Moolenaar
2586e7e4838fSBram Moolenaar  CheckScriptSuccess([
2587e7e4838fSBram Moolenaar      'def Test() # comment',
2588e7e4838fSBram Moolenaar      'enddef',
2589e7e4838fSBram Moolenaar      ])
2590e7e4838fSBram Moolenaar  CheckScriptFailure([
2591e7e4838fSBram Moolenaar      'func Test() # comment',
2592e7e4838fSBram Moolenaar      'endfunc',
2593e7e4838fSBram Moolenaar      ], 'E488:')
25942c5ed4e3SBram Moolenaarenddef
25952c5ed4e3SBram Moolenaar
25962c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
25972c5ed4e3SBram Moolenaar  CheckCanRunGui
25982c5ed4e3SBram Moolenaar
25992c5ed4e3SBram Moolenaar  CheckScriptFailure([
26002c5ed4e3SBram Moolenaar      'vim9script',
26012c5ed4e3SBram Moolenaar      'gui#comment'
2602f8103f27SBram Moolenaar      ], 'E1144:')
26032c5ed4e3SBram Moolenaar  CheckScriptFailure([
26042c5ed4e3SBram Moolenaar      'vim9script',
26052c5ed4e3SBram Moolenaar      'gui -f#comment'
26062c5ed4e3SBram Moolenaar      ], 'E499:')
26077a092245SBram Moolenaarenddef
26087a092245SBram Moolenaar
2609a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
26106797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
26116797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2612a26b9700SBram Moolenaar
2613a26b9700SBram Moolenaar  edit test.vim
2614a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2615a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2616a26b9700SBram Moolenaar
2617a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2618a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2619a26b9700SBram Moolenaar
2620a26b9700SBram Moolenaar  g:entered = 0
2621a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2622a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2623a26b9700SBram Moolenaar
2624a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2625a26b9700SBram Moolenaar
2626a26b9700SBram Moolenaar  au! TabEnter
2627a26b9700SBram Moolenaar  unlet g:entered
2628d72c1bf0SBram Moolenaar
2629d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2630d72c1bf0SBram Moolenaar      'vim9script',
26316797966dSBram Moolenaar      'g:var = 123',
2632e55b1c09SBram Moolenaar      'b:var = 456',
2633e55b1c09SBram Moolenaar      'w:var = 777',
2634e55b1c09SBram Moolenaar      't:var = 888',
2635d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2636d72c1bf0SBram Moolenaar      ])
2637d72c1bf0SBram Moolenaar
2638d72c1bf0SBram Moolenaar  CheckScriptFailure([
2639d72c1bf0SBram Moolenaar      'vim9script',
2640cfcd011fSBram Moolenaar      'let var = 123',
2641cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2642cfcd011fSBram Moolenaar
2643cfcd011fSBram Moolenaar  CheckScriptFailure([
2644cfcd011fSBram Moolenaar      'vim9script',
2645cfcd011fSBram Moolenaar      'var g:var = 123',
2646e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2647e55b1c09SBram Moolenaar
2648e55b1c09SBram Moolenaar  CheckScriptFailure([
2649e55b1c09SBram Moolenaar      'vim9script',
2650cfcd011fSBram Moolenaar      'var b:var = 123',
2651e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2652e55b1c09SBram Moolenaar
2653e55b1c09SBram Moolenaar  CheckScriptFailure([
2654e55b1c09SBram Moolenaar      'vim9script',
2655cfcd011fSBram Moolenaar      'var w:var = 123',
2656e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2657e55b1c09SBram Moolenaar
2658e55b1c09SBram Moolenaar  CheckScriptFailure([
2659e55b1c09SBram Moolenaar      'vim9script',
2660cfcd011fSBram Moolenaar      'var t:var = 123',
2661e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2662e55b1c09SBram Moolenaar
2663e55b1c09SBram Moolenaar  CheckScriptFailure([
2664e55b1c09SBram Moolenaar      'vim9script',
2665cfcd011fSBram Moolenaar      'var v:version = 123',
2666e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2667e55b1c09SBram Moolenaar
2668e55b1c09SBram Moolenaar  CheckScriptFailure([
2669e55b1c09SBram Moolenaar      'vim9script',
2670cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2671e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
26726797966dSBram Moolenaar
26736797966dSBram Moolenaar  CheckScriptFailure([
26746797966dSBram Moolenaar      'vim9script',
26756797966dSBram Moolenaar      'g:var = 123',
267632e35117SBram Moolenaar      'unlet g:var# comment1',
2677d72c1bf0SBram Moolenaar      ], 'E108:')
2678d72c1bf0SBram Moolenaar
2679d72c1bf0SBram Moolenaar  CheckScriptFailure([
2680d72c1bf0SBram Moolenaar      'let g:var = 123',
2681d72c1bf0SBram Moolenaar      'unlet g:var # something',
2682d72c1bf0SBram Moolenaar      ], 'E488:')
2683faac4104SBram Moolenaar
2684faac4104SBram Moolenaar  CheckScriptSuccess([
2685faac4104SBram Moolenaar      'vim9script',
268632e35117SBram Moolenaar      'if 1 # comment2',
2687faac4104SBram Moolenaar      '  echo "yes"',
2688faac4104SBram Moolenaar      'elseif 2 #comment',
2689faac4104SBram Moolenaar      '  echo "no"',
2690faac4104SBram Moolenaar      'endif',
2691faac4104SBram Moolenaar      ])
2692faac4104SBram Moolenaar
2693faac4104SBram Moolenaar  CheckScriptFailure([
2694faac4104SBram Moolenaar      'vim9script',
269532e35117SBram Moolenaar      'if 1# comment3',
2696faac4104SBram Moolenaar      '  echo "yes"',
2697faac4104SBram Moolenaar      'endif',
2698faac4104SBram Moolenaar      ], 'E15:')
2699faac4104SBram Moolenaar
2700faac4104SBram Moolenaar  CheckScriptFailure([
2701faac4104SBram Moolenaar      'vim9script',
270232e35117SBram Moolenaar      'if 0 # comment4',
2703faac4104SBram Moolenaar      '  echo "yes"',
2704faac4104SBram Moolenaar      'elseif 2#comment',
2705faac4104SBram Moolenaar      '  echo "no"',
2706faac4104SBram Moolenaar      'endif',
2707faac4104SBram Moolenaar      ], 'E15:')
2708faac4104SBram Moolenaar
2709faac4104SBram Moolenaar  CheckScriptSuccess([
2710faac4104SBram Moolenaar      'vim9script',
2711cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2712faac4104SBram Moolenaar      ])
2713faac4104SBram Moolenaar
2714faac4104SBram Moolenaar  CheckScriptFailure([
2715faac4104SBram Moolenaar      'vim9script',
2716cfcd011fSBram Moolenaar      'var v = 1# comment6',
271732e35117SBram Moolenaar      ], 'E15:')
2718faac4104SBram Moolenaar
2719faac4104SBram Moolenaar  CheckScriptSuccess([
2720faac4104SBram Moolenaar      'vim9script',
2721faac4104SBram Moolenaar      'new'
2722d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2723df069eecSBram Moolenaar      ':$',
2724faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2725faac4104SBram Moolenaar      'bwipe!',
2726faac4104SBram Moolenaar      ])
2727faac4104SBram Moolenaar
2728f5be8cdbSBram Moolenaar  CheckScriptFailure([
2729f5be8cdbSBram Moolenaar      'vim9script',
2730f5be8cdbSBram Moolenaar      'new'
2731d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2732f5be8cdbSBram Moolenaar      ':$',
2733f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2734f5be8cdbSBram Moolenaar      'bwipe!',
2735f5be8cdbSBram Moolenaar      ], 'E488:')
2736f5be8cdbSBram Moolenaar
2737f5be8cdbSBram Moolenaar  CheckScriptFailure([
2738f5be8cdbSBram Moolenaar      'vim9script',
2739f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2740f5be8cdbSBram Moolenaar      ], 'E477:')
2741a26b9700SBram Moolenaarenddef
2742a26b9700SBram Moolenaar
27437e5bd91dSBram Moolenaardef Test_finish()
2744cfcd011fSBram Moolenaar  var lines =<< trim END
27457e5bd91dSBram Moolenaar    vim9script
27466797966dSBram Moolenaar    g:res = 'one'
27477e5bd91dSBram Moolenaar    if v:false | finish | endif
27486797966dSBram Moolenaar    g:res = 'two'
27497e5bd91dSBram Moolenaar    finish
27506797966dSBram Moolenaar    g:res = 'three'
27517e5bd91dSBram Moolenaar  END
27527e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
27537e5bd91dSBram Moolenaar  source Xfinished
27547e5bd91dSBram Moolenaar  assert_equal('two', g:res)
27557e5bd91dSBram Moolenaar
27567e5bd91dSBram Moolenaar  unlet g:res
27577e5bd91dSBram Moolenaar  delete('Xfinished')
27587e5bd91dSBram Moolenaarenddef
27597e5bd91dSBram Moolenaar
2760a5d0077eSBram Moolenaardef Test_forward_declaration()
2761cfcd011fSBram Moolenaar  var lines =<< trim END
2762a5d0077eSBram Moolenaar    vim9script
2763a5d0077eSBram Moolenaar    def GetValue(): string
2764a5d0077eSBram Moolenaar      return theVal
2765a5d0077eSBram Moolenaar    enddef
2766cfcd011fSBram Moolenaar    var theVal = 'something'
2767822ba247SBram Moolenaar    g:initVal = GetValue()
2768a5d0077eSBram Moolenaar    theVal = 'else'
2769a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2770a5d0077eSBram Moolenaar  END
2771a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2772a5d0077eSBram Moolenaar  source Xforward
2773a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2774a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2775a5d0077eSBram Moolenaar
2776a5d0077eSBram Moolenaar  unlet g:initVal
2777a5d0077eSBram Moolenaar  unlet g:laterVal
2778a5d0077eSBram Moolenaar  delete('Xforward')
2779a5d0077eSBram Moolenaarenddef
2780a5d0077eSBram Moolenaar
27819721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2782a6294955SBram Moolenaar  var vim9_lines =<< trim END
2783a6294955SBram Moolenaar    vim9script
2784a6294955SBram Moolenaar    var local = 'local'
2785a6294955SBram Moolenaar    g:global = 'global'
2786a6294955SBram Moolenaar    export var exported = 'exported'
2787a6294955SBram Moolenaar    export def GetText(): string
2788a6294955SBram Moolenaar       return 'text'
2789a6294955SBram Moolenaar    enddef
2790a6294955SBram Moolenaar  END
2791a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
2792a6294955SBram Moolenaar
2793cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
27949721fb4eSBram Moolenaar    source Xvim9_script.vim
27959721fb4eSBram Moolenaar
27969721fb4eSBram Moolenaar    call assert_false(exists('local'))
27979721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27989721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
27999721fb4eSBram Moolenaar    call assert_equal('global', global)
28009721fb4eSBram Moolenaar    call assert_equal('global', g:global)
28019721fb4eSBram Moolenaar
28029721fb4eSBram Moolenaar    " imported variable becomes script-local
28039721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
28049721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
28059721fb4eSBram Moolenaar    call assert_false(exists('exported'))
28069721fb4eSBram Moolenaar
28079721fb4eSBram Moolenaar    " imported function becomes script-local
28089721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
28099721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
28109721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
28119721fb4eSBram Moolenaar  END
28129721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
28139721fb4eSBram Moolenaar
28149721fb4eSBram Moolenaar  source Xlegacy_script.vim
28159721fb4eSBram Moolenaar  assert_equal('global', g:global)
2816f5be8cdbSBram Moolenaar  unlet g:global
28179721fb4eSBram Moolenaar
28189721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
28199721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
28209721fb4eSBram Moolenaarenddef
2821a5d0077eSBram Moolenaar
28227d699701SBram Moolenaarfunc Test_vim9script_not_global()
28237d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
28247d699701SBram Moolenaar  let vim9lines =<< trim END
28257d699701SBram Moolenaar    vim9script
2826cfcd011fSBram Moolenaar    var name = 'local'
28277d699701SBram Moolenaar    func TheFunc()
28287d699701SBram Moolenaar      echo 'local'
28297d699701SBram Moolenaar    endfunc
28307d699701SBram Moolenaar    def DefFunc()
28317d699701SBram Moolenaar      echo 'local'
28327d699701SBram Moolenaar    enddef
28337d699701SBram Moolenaar  END
28347d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
28357d699701SBram Moolenaar  source Xvim9script.vim
28367d699701SBram Moolenaar  try
28377d699701SBram Moolenaar    echo g:var
28387d699701SBram Moolenaar    assert_report('did not fail')
28397d699701SBram Moolenaar  catch /E121:/
28407d699701SBram Moolenaar    " caught
28417d699701SBram Moolenaar  endtry
28427d699701SBram Moolenaar  try
28437d699701SBram Moolenaar    call TheFunc()
28447d699701SBram Moolenaar    assert_report('did not fail')
28457d699701SBram Moolenaar  catch /E117:/
28467d699701SBram Moolenaar    " caught
28477d699701SBram Moolenaar  endtry
28487d699701SBram Moolenaar  try
28497d699701SBram Moolenaar    call DefFunc()
28507d699701SBram Moolenaar    assert_report('did not fail')
28517d699701SBram Moolenaar  catch /E117:/
28527d699701SBram Moolenaar    " caught
28537d699701SBram Moolenaar  endtry
28547d699701SBram Moolenaar
285525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
28567d699701SBram Moolenaarendfunc
28577d699701SBram Moolenaar
2858eeb27bfeSBram Moolenaardef Test_vim9_copen()
2859eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2860eeb27bfeSBram Moolenaar  copen
2861eeb27bfeSBram Moolenaar  quit
2862eeb27bfeSBram Moolenaarenddef
2863eeb27bfeSBram Moolenaar
286403290b84SBram Moolenaar" test using an auto-loaded function and variable
28652d6b20d6SBram Moolenaardef Test_vim9_autoload()
2866cfcd011fSBram Moolenaar  var lines =<< trim END
28672d6b20d6SBram Moolenaar     vim9script
286803290b84SBram Moolenaar     def some#gettest(): string
286903290b84SBram Moolenaar       return 'test'
287003290b84SBram Moolenaar     enddef
287103290b84SBram Moolenaar     g:some#name = 'name'
287203290b84SBram Moolenaar  END
287303290b84SBram Moolenaar
287403290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
287503290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
287603290b84SBram Moolenaar  var save_rtp = &rtp
287703290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
287803290b84SBram Moolenaar
287903290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
288003290b84SBram Moolenaar  assert_equal('name', g:some#name)
288103290b84SBram Moolenaar  g:some#other = 'other'
288203290b84SBram Moolenaar  assert_equal('other', g:some#other)
288303290b84SBram Moolenaar
288417f700acSBram Moolenaar  # upper case script name works
288517f700acSBram Moolenaar  lines =<< trim END
288617f700acSBram Moolenaar     vim9script
288717f700acSBram Moolenaar     def Other#getOther(): string
288817f700acSBram Moolenaar       return 'other'
288917f700acSBram Moolenaar     enddef
289017f700acSBram Moolenaar  END
289117f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
289217f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
289317f700acSBram Moolenaar
289403290b84SBram Moolenaar  delete('Xdir', 'rf')
289503290b84SBram Moolenaar  &rtp = save_rtp
289603290b84SBram Moolenaarenddef
289703290b84SBram Moolenaar
289803290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
289903290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
290003290b84SBram Moolenaar  var lines =<< trim END
290103290b84SBram Moolenaar     vim9script
29022d6b20d6SBram Moolenaar     def foo#test()
29032d6b20d6SBram Moolenaar         echomsg getreg('"')
29042d6b20d6SBram Moolenaar     enddef
29052d6b20d6SBram Moolenaar  END
29062d6b20d6SBram Moolenaar
29072d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
29082d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2909cfcd011fSBram Moolenaar  var save_rtp = &rtp
29102d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
29112d6b20d6SBram Moolenaar  augroup test
29122d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
29132d6b20d6SBram Moolenaar  augroup END
29142d6b20d6SBram Moolenaar
29152d6b20d6SBram Moolenaar  normal Y
29162d6b20d6SBram Moolenaar
29172d6b20d6SBram Moolenaar  augroup test
29182d6b20d6SBram Moolenaar    autocmd!
29192d6b20d6SBram Moolenaar  augroup END
29202d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
29212d6b20d6SBram Moolenaar  &rtp = save_rtp
29222d6b20d6SBram Moolenaarenddef
29232d6b20d6SBram Moolenaar
292477e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
292577e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2926cfcd011fSBram Moolenaar  var lines =<< trim END
292777e5dcc3SBram Moolenaar      vim9script
292877e5dcc3SBram Moolenaar      def crash#func()
292977e5dcc3SBram Moolenaar          try
293077e5dcc3SBram Moolenaar              for x in List()
293177e5dcc3SBram Moolenaar              endfor
293277e5dcc3SBram Moolenaar          catch
293377e5dcc3SBram Moolenaar          endtry
293477e5dcc3SBram Moolenaar          g:ok = true
293577e5dcc3SBram Moolenaar      enddef
293677e5dcc3SBram Moolenaar      fu List()
293777e5dcc3SBram Moolenaar          invalid
293877e5dcc3SBram Moolenaar      endfu
293977e5dcc3SBram Moolenaar      try
294077e5dcc3SBram Moolenaar          invalid
294177e5dcc3SBram Moolenaar      catch /wontmatch/
294277e5dcc3SBram Moolenaar      endtry
294377e5dcc3SBram Moolenaar  END
294477e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
294577e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
294677e5dcc3SBram Moolenaar
294777e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
294877e5dcc3SBram Moolenaar  lines =<< trim END
294977e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
295077e5dcc3SBram Moolenaar    call crash#func()
295177e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
29529c4f5520SBram Moolenaar    qall!
295377e5dcc3SBram Moolenaar  END
295477e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
295577e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
295677e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
295777e5dcc3SBram Moolenaar
295877e5dcc3SBram Moolenaar  delete('Xdidit')
295977e5dcc3SBram Moolenaar  delete('Xscript')
296077e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
296103290b84SBram Moolenaar
296203290b84SBram Moolenaar  lines =<< trim END
296303290b84SBram Moolenaar    vim9script
296403290b84SBram Moolenaar    var foo#bar = 'asdf'
296503290b84SBram Moolenaar  END
296603290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
296777e5dcc3SBram Moolenaarenddef
296877e5dcc3SBram Moolenaar
296981e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
297081e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
297181e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2972cfcd011fSBram Moolenaar  var lines =<< trim END
297381e17fbeSBram Moolenaar    let s:counter = 1
297481e17fbeSBram Moolenaar    def s:Func()
297581e17fbeSBram Moolenaar      au! CursorHold
297681e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
297781e17fbeSBram Moolenaar    enddef
297881e17fbeSBram Moolenaar    call s:Func()
297981e17fbeSBram Moolenaar    doau CursorHold
298081e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
298181e17fbeSBram Moolenaar    au! CursorHold
298281e17fbeSBram Moolenaar  END
298381e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
298481e17fbeSBram Moolenaarenddef
298581e17fbeSBram Moolenaar
29863896a105SBram Moolenaardef Test_cmdline_win()
29873896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
29883896a105SBram Moolenaar  # the command line window.
29893896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2990cfcd011fSBram Moolenaar  var export_lines =<< trim END
29913896a105SBram Moolenaar    vim9script
2992cfcd011fSBram Moolenaar    export var That = 'yes'
29933896a105SBram Moolenaar  END
29943896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2995cfcd011fSBram Moolenaar  var import_lines =<< trim END
29963896a105SBram Moolenaar    vim9script
29973896a105SBram Moolenaar    import That from './Xexport.vim'
29983896a105SBram Moolenaar  END
29993896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3000cfcd011fSBram Moolenaar  var save_rtp = &rtp
30013896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
30023896a105SBram Moolenaar  syntax on
30033896a105SBram Moolenaar  augroup CmdWin
30043896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
30053896a105SBram Moolenaar  augroup END
30063896a105SBram Moolenaar  # this will open and also close the cmdline window
30073896a105SBram Moolenaar  feedkeys('q:', 'xt')
30083896a105SBram Moolenaar  assert_equal('yes', g:got_there)
30093896a105SBram Moolenaar
30103896a105SBram Moolenaar  augroup CmdWin
30113896a105SBram Moolenaar    au!
30123896a105SBram Moolenaar  augroup END
30133896a105SBram Moolenaar  &rtp = save_rtp
30143896a105SBram Moolenaar  delete('rtp', 'rf')
30153896a105SBram Moolenaarenddef
30163896a105SBram Moolenaar
3017e3d4685fSBram Moolenaardef Test_invalid_sid()
3018e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
301925859dd7SBram Moolenaar
30209c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3021d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3022e3d4685fSBram Moolenaar  endif
3023e3d4685fSBram Moolenaar  delete('Xdidit')
3024e3d4685fSBram Moolenaarenddef
3025e3d4685fSBram Moolenaar
30269ec7026fSBram Moolenaardef Test_restoring_cpo()
30279ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
30289ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
30299ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
30309ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
30319ec7026fSBram Moolenaar  endif
30329ec7026fSBram Moolenaar  delete('Xsourced')
30339ec7026fSBram Moolenaar  delete('Xclose')
3034090728adSBram Moolenaar  delete('Xdone')
30359ec7026fSBram Moolenaarenddef
30369ec7026fSBram Moolenaar
30379ec7026fSBram Moolenaar
3038f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3039cfcd011fSBram Moolenaar  var lines =<< trim END
3040cfcd011fSBram Moolenaar    var name: any
3041cfcd011fSBram Moolenaar    assert_equal(0, name)
3042f0afd9e1SBram Moolenaar  END
3043f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3044f0afd9e1SBram Moolenaarenddef
3045f0afd9e1SBram Moolenaar
30467e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
304758dbef33SBram Moolenaar  CheckRunVimInTerminal
304858dbef33SBram Moolenaar
30497e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
30507e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
30517e9210eaSBram Moolenaarendfunc
30527e9210eaSBram Moolenaar
30537e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
30549c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3055cfcd011fSBram Moolenaar  var lines =<< trim END
30569c4f5520SBram Moolenaar    func CheckAndQuit()
30579c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
30589c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
30599c4f5520SBram Moolenaar    endfunc
30609c4f5520SBram Moolenaar  END
30619c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
30629c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3063e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
30649c4f5520SBram Moolenaar  # define Afunc() on the command line
30659c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
30669c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
3067*2949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
30689c4f5520SBram Moolenaar
30699c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
30709c4f5520SBram Moolenaar  delete('XcallFunc')
30719c4f5520SBram Moolenaar  delete('Xdidcmd')
30729c4f5520SBram Moolenaarenddef
30739c4f5520SBram Moolenaar
3074fcdc5d83SBram Moolenaardef Test_script_var_scope()
3075fcdc5d83SBram Moolenaar  var lines =<< trim END
3076fcdc5d83SBram Moolenaar      vim9script
3077fcdc5d83SBram Moolenaar      if true
3078fcdc5d83SBram Moolenaar        if true
3079fcdc5d83SBram Moolenaar          var one = 'one'
3080fcdc5d83SBram Moolenaar          echo one
3081fcdc5d83SBram Moolenaar        endif
3082fcdc5d83SBram Moolenaar        echo one
3083fcdc5d83SBram Moolenaar      endif
3084fcdc5d83SBram Moolenaar  END
3085fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3086fcdc5d83SBram Moolenaar
3087fcdc5d83SBram Moolenaar  lines =<< trim END
3088fcdc5d83SBram Moolenaar      vim9script
3089fcdc5d83SBram Moolenaar      if true
3090fcdc5d83SBram Moolenaar        if false
3091fcdc5d83SBram Moolenaar          var one = 'one'
3092fcdc5d83SBram Moolenaar          echo one
3093fcdc5d83SBram Moolenaar        else
3094fcdc5d83SBram Moolenaar          var one = 'one'
3095fcdc5d83SBram Moolenaar          echo one
3096fcdc5d83SBram Moolenaar        endif
3097fcdc5d83SBram Moolenaar        echo one
3098fcdc5d83SBram Moolenaar      endif
3099fcdc5d83SBram Moolenaar  END
3100fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3101fcdc5d83SBram Moolenaar
3102fcdc5d83SBram Moolenaar  lines =<< trim END
3103fcdc5d83SBram Moolenaar      vim9script
3104fcdc5d83SBram Moolenaar      while true
3105fcdc5d83SBram Moolenaar        var one = 'one'
3106fcdc5d83SBram Moolenaar        echo one
3107fcdc5d83SBram Moolenaar        break
3108fcdc5d83SBram Moolenaar      endwhile
3109fcdc5d83SBram Moolenaar      echo one
3110fcdc5d83SBram Moolenaar  END
3111fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3112fcdc5d83SBram Moolenaar
3113fcdc5d83SBram Moolenaar  lines =<< trim END
3114fcdc5d83SBram Moolenaar      vim9script
3115fcdc5d83SBram Moolenaar      for i in range(1)
3116fcdc5d83SBram Moolenaar        var one = 'one'
3117fcdc5d83SBram Moolenaar        echo one
3118fcdc5d83SBram Moolenaar      endfor
3119fcdc5d83SBram Moolenaar      echo one
3120fcdc5d83SBram Moolenaar  END
3121fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
31229becdf2bSBram Moolenaar
31239becdf2bSBram Moolenaar  lines =<< trim END
31249becdf2bSBram Moolenaar      vim9script
31259becdf2bSBram Moolenaar      {
31269becdf2bSBram Moolenaar        var one = 'one'
31279becdf2bSBram Moolenaar        assert_equal('one', one)
31289becdf2bSBram Moolenaar      }
31299becdf2bSBram Moolenaar      assert_false(exists('one'))
31309becdf2bSBram Moolenaar      assert_false(exists('s:one'))
31319becdf2bSBram Moolenaar  END
31329becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
31339becdf2bSBram Moolenaar
31349becdf2bSBram Moolenaar  lines =<< trim END
31359becdf2bSBram Moolenaar      vim9script
31369becdf2bSBram Moolenaar      {
31379becdf2bSBram Moolenaar        var one = 'one'
31389becdf2bSBram Moolenaar        echo one
31399becdf2bSBram Moolenaar      }
31409becdf2bSBram Moolenaar      echo one
31419becdf2bSBram Moolenaar  END
31429becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3143fcdc5d83SBram Moolenaarenddef
3144fcdc5d83SBram Moolenaar
3145352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3146352134bbSBram Moolenaar  var lines =<< trim END
3147352134bbSBram Moolenaar    vim9script
3148352134bbSBram Moolenaar    def Callback(...l: any)
3149352134bbSBram Moolenaar      try
3150352134bbSBram Moolenaar        var x: string
3151352134bbSBram Moolenaar        var y: string
3152352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3153352134bbSBram Moolenaar        [x, y] = ['']
3154352134bbSBram Moolenaar      catch
3155352134bbSBram Moolenaar        g:caught = 'yes'
3156352134bbSBram Moolenaar      endtry
3157352134bbSBram Moolenaar    enddef
3158e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3159352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3160352134bbSBram Moolenaar  END
3161352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3162352134bbSBram Moolenaar
3163352134bbSBram Moolenaar  unlet g:caught
3164352134bbSBram Moolenaarenddef
3165352134bbSBram Moolenaar
3166631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3167631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3168631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3169631e8f93SBram Moolenaar  endif
3170631e8f93SBram Moolenaar  var lines =<< trim END
3171631e8f93SBram Moolenaar      vim9script
3172631e8f93SBram Moolenaar      var source: list<number>
3173631e8f93SBram Moolenaar      def Out_cb(...l: any)
3174631e8f93SBram Moolenaar          eval [][0]
3175631e8f93SBram Moolenaar      enddef
3176631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3177631e8f93SBram Moolenaar          sleep 1m
3178631e8f93SBram Moolenaar          source += l
3179631e8f93SBram Moolenaar      enddef
3180e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
31816f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
31826f17a3f0SBram Moolenaar        sleep 10m
31836f17a3f0SBram Moolenaar      endwhile
31846f17a3f0SBram Moolenaar      sleep 10m
3185631e8f93SBram Moolenaar  END
3186631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3187631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3188631e8f93SBram Moolenaar  delete('Xdef')
3189631e8f93SBram Moolenaarenddef
3190631e8f93SBram Moolenaar
31914324d87aSBram Moolenaardef InvokeNormal()
31924324d87aSBram Moolenaar  exe "norm! :m+1\r"
31934324d87aSBram Moolenaarenddef
31944324d87aSBram Moolenaar
31954324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
31964324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
31974324d87aSBram Moolenaar  new
31984324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
31994324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
32004324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
32014324d87aSBram Moolenaar  xunmap <F3>
3202b5b9480eSBram Moolenaarenddef
3203b5b9480eSBram Moolenaar
3204b5b9480eSBram Moolenaardef Test_white_space_after_command()
3205b5b9480eSBram Moolenaar  var lines =<< trim END
3206b5b9480eSBram Moolenaar    exit_cb: Func})
3207b5b9480eSBram Moolenaar  END
3208b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3209f8103f27SBram Moolenaar
3210f8103f27SBram Moolenaar  lines =<< trim END
3211f8103f27SBram Moolenaar    e#
3212f8103f27SBram Moolenaar  END
3213f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
32144324d87aSBram Moolenaarenddef
32154324d87aSBram Moolenaar
32164aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
32174aab88d9SBram Moolenaar  var lines =<< trim END
32184aab88d9SBram Moolenaar      vim9script
32194aab88d9SBram Moolenaar      if exists('g:guard')
32204aab88d9SBram Moolenaar        finish
32214aab88d9SBram Moolenaar      endif
32224aab88d9SBram Moolenaar      g:guard = 1
32234aab88d9SBram Moolenaar      var name = 'thename'
32244aab88d9SBram Moolenaar      def g:GetName(): string
32254aab88d9SBram Moolenaar        return name
32264aab88d9SBram Moolenaar      enddef
32274aab88d9SBram Moolenaar      def g:SetName(arg: string)
32284aab88d9SBram Moolenaar        name = arg
32294aab88d9SBram Moolenaar      enddef
32304aab88d9SBram Moolenaar  END
32314aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
32324aab88d9SBram Moolenaar  so XscriptTwice.vim
32334aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
32344aab88d9SBram Moolenaar  g:SetName('newname')
32354aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
32364aab88d9SBram Moolenaar  so XscriptTwice.vim
32374aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
32384aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
32394aab88d9SBram Moolenaar
32404aab88d9SBram Moolenaar  delfunc g:GetName
32414aab88d9SBram Moolenaar  delfunc g:SetName
32424aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
32434aab88d9SBram Moolenaar  unlet g:guard
32444aab88d9SBram Moolenaarenddef
32454aab88d9SBram Moolenaar
32464aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
32474aab88d9SBram Moolenaar  var exportlines =<< trim END
32484aab88d9SBram Moolenaar      vim9script
32494aab88d9SBram Moolenaar      if exists('g:guard')
32504aab88d9SBram Moolenaar        finish
32514aab88d9SBram Moolenaar      endif
32524aab88d9SBram Moolenaar      g:guard = 1
32534aab88d9SBram Moolenaar      export var name = 'someName'
32544aab88d9SBram Moolenaar  END
32554aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
32564aab88d9SBram Moolenaar
32574aab88d9SBram Moolenaar  var lines =<< trim END
32584aab88d9SBram Moolenaar      vim9script
32594aab88d9SBram Moolenaar      import name from './XexportScript.vim'
32604aab88d9SBram Moolenaar      def g:GetName(): string
32614aab88d9SBram Moolenaar        return name
32624aab88d9SBram Moolenaar      enddef
32634aab88d9SBram Moolenaar  END
32644aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
32654aab88d9SBram Moolenaar  so XscriptImport.vim
32664aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
32674aab88d9SBram Moolenaar
32684aab88d9SBram Moolenaar  so XexportScript.vim
32694aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
32704aab88d9SBram Moolenaar
32714aab88d9SBram Moolenaar  delfunc g:GetName
32724aab88d9SBram Moolenaar  delete('XexportScript.vim')
32734aab88d9SBram Moolenaar  delete('XscriptImport.vim')
32744aab88d9SBram Moolenaar  unlet g:guard
32754aab88d9SBram Moolenaarenddef
32764aab88d9SBram Moolenaar
3277585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3278585fea7bSBram Moolenaardef Test_substitute_cmd()
3279585fea7bSBram Moolenaar  new
3280585fea7bSBram Moolenaar  setline(1, 'something')
3281585fea7bSBram Moolenaar  :substitute(some(other(
3282585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3283585fea7bSBram Moolenaar  bwipe!
3284585fea7bSBram Moolenaar
3285f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3286cfcd011fSBram Moolenaar  var lines =<< trim END
3287585fea7bSBram Moolenaar    vim9script
3288585fea7bSBram Moolenaar    new
3289585fea7bSBram Moolenaar    setline(1, 'something')
3290585fea7bSBram Moolenaar    :substitute(some(other(
3291585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3292585fea7bSBram Moolenaar    bwipe!
3293585fea7bSBram Moolenaar  END
3294585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3295585fea7bSBram Moolenaar  source Xvim9lines
3296585fea7bSBram Moolenaar
3297585fea7bSBram Moolenaar  delete('Xvim9lines')
3298585fea7bSBram Moolenaarenddef
3299585fea7bSBram Moolenaar
33008a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3301