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!
265d72ce69SBram Moolenaarenddef
275d72ce69SBram Moolenaar
28a6e67e4fSBram Moolenaarlet g:alist = [7]
29a6e67e4fSBram Moolenaarlet g:astring = 'text'
30f0b9f43cSBram Moolenaarlet g:anumber = 123
316e587dcbSBram Moolenaar
324c17ad94SBram Moolenaardef Test_delfunction()
33f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
344c17ad94SBram Moolenaar  CheckScriptSuccess([
354c17ad94SBram Moolenaar      'vim9script',
364c17ad94SBram Moolenaar      'func CheckMe()',
374c17ad94SBram Moolenaar      '  return 123',
384c17ad94SBram Moolenaar      'endfunc',
394c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
404c17ad94SBram Moolenaar      ])
414c17ad94SBram Moolenaar
42f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
434c17ad94SBram Moolenaar  CheckScriptFailure([
444c17ad94SBram Moolenaar      'vim9script',
454c17ad94SBram Moolenaar      'func DeleteMe1()',
464c17ad94SBram Moolenaar      'endfunc',
474c17ad94SBram Moolenaar      'delfunction DeleteMe1',
484c17ad94SBram Moolenaar      ], 'E1084:')
494c17ad94SBram Moolenaar  CheckScriptFailure([
504c17ad94SBram Moolenaar      'vim9script',
514c17ad94SBram Moolenaar      'func DeleteMe2()',
524c17ad94SBram Moolenaar      'endfunc',
534c17ad94SBram Moolenaar      'def DoThat()',
544c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
554c17ad94SBram Moolenaar      'enddef',
564c17ad94SBram Moolenaar      'DoThat()',
574c17ad94SBram Moolenaar      ], 'E1084:')
584c17ad94SBram Moolenaar  CheckScriptFailure([
594c17ad94SBram Moolenaar      'vim9script',
604c17ad94SBram Moolenaar      'def DeleteMe3()',
614c17ad94SBram Moolenaar      'enddef',
624c17ad94SBram Moolenaar      'delfunction DeleteMe3',
634c17ad94SBram Moolenaar      ], 'E1084:')
644c17ad94SBram Moolenaar  CheckScriptFailure([
654c17ad94SBram Moolenaar      'vim9script',
664c17ad94SBram Moolenaar      'def DeleteMe4()',
674c17ad94SBram Moolenaar      'enddef',
684c17ad94SBram Moolenaar      'def DoThat()',
694c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
704c17ad94SBram Moolenaar      'enddef',
714c17ad94SBram Moolenaar      'DoThat()',
724c17ad94SBram Moolenaar      ], 'E1084:')
73925e9fd6SBram Moolenaar
74925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
75cfcd011fSBram Moolenaar  var lines =<< trim END
76925e9fd6SBram Moolenaar      vim9script
77925e9fd6SBram Moolenaar      def g:Global(): string
78925e9fd6SBram Moolenaar        return "yes"
79925e9fd6SBram Moolenaar      enddef
80925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
81925e9fd6SBram Moolenaar      def! g:Global(): string
82925e9fd6SBram Moolenaar        return "no"
83925e9fd6SBram Moolenaar      enddef
84925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
85925e9fd6SBram Moolenaar      delfunc g:Global
86925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
87925e9fd6SBram Moolenaar  END
88925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
91925e9fd6SBram Moolenaar  lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      func g:Global()
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      endfunc
96925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
97925e9fd6SBram Moolenaar      def! g:Global(): string
98925e9fd6SBram Moolenaar        return "no"
99925e9fd6SBram Moolenaar      enddef
100925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
101925e9fd6SBram Moolenaar      delfunc g:Global
102925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
103925e9fd6SBram Moolenaar  END
104925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
105925e9fd6SBram Moolenaar
106925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      def g:Global(): string
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      enddef
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      func! g:Global()
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      endfunc
116925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
117925e9fd6SBram Moolenaar      delfunc g:Global
118925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
119925e9fd6SBram Moolenaar  END
120925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1214c17ad94SBram Moolenaarenddef
1224c17ad94SBram Moolenaar
12308052228SBram Moolenaardef Test_wrong_type()
124cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
125cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
126cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
127cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
128599c89c8SBram Moolenaar
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13142a480bfSBram Moolenaar
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
133cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
136cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
143a0a9f43aSBram Moolenaar
144cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
14608052228SBram Moolenaarenddef
1478a7d6542SBram Moolenaar
14810c65860SBram Moolenaardef Test_script_wrong_type()
14910c65860SBram Moolenaar  var lines =<< trim END
15010c65860SBram Moolenaar      vim9script
15110c65860SBram Moolenaar      var s:dict: dict<string>
15210c65860SBram Moolenaar      s:dict['a'] = ['x']
15310c65860SBram Moolenaar  END
15410c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
15510c65860SBram Moolenaarenddef
15610c65860SBram Moolenaar
15708052228SBram Moolenaardef Test_const()
158cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
160cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16130fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16230fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
163dbeecb2bSBram Moolenaar
164cfcd011fSBram Moolenaar  var lines =<< trim END
16530fd8204SBram Moolenaar    final list = [1, 2, 3]
166dbeecb2bSBram Moolenaar    list[0] = 4
1670b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
16830fd8204SBram Moolenaar    const other = [5, 6, 7]
1690b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17071abe482SBram Moolenaar
171cfcd011fSBram Moolenaar    var varlist = [7, 8]
17230fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17371abe482SBram Moolenaar    varlist[0] = 77
17471abe482SBram Moolenaar    # TODO: does not work yet
17571abe482SBram Moolenaar    # constlist[1][1] = 88
176cfcd011fSBram Moolenaar    var cl = constlist[1]
17771abe482SBram Moolenaar    cl[1] = 88
17871abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
17971abe482SBram Moolenaar
180cfcd011fSBram Moolenaar    var vardict = #{five: 5, six: 6}
18130fd8204SBram Moolenaar    const constdict = #{one: 1, two: vardict, three: 3}
18271abe482SBram Moolenaar    vardict['five'] = 55
18371abe482SBram Moolenaar    # TODO: does not work yet
18471abe482SBram Moolenaar    # constdict['two']['six'] = 66
185cfcd011fSBram Moolenaar    var cd = constdict['two']
18671abe482SBram Moolenaar    cd['six'] = 66
18771abe482SBram Moolenaar    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
188dbeecb2bSBram Moolenaar  END
189dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19008052228SBram Moolenaarenddef
1918a7d6542SBram Moolenaar
1920b4c66c6SBram Moolenaardef Test_const_bang()
193cfcd011fSBram Moolenaar  var lines =<< trim END
19430fd8204SBram Moolenaar      const var = 234
1950b4c66c6SBram Moolenaar      var = 99
1960b4c66c6SBram Moolenaar  END
1970b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
1980b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
1990b4c66c6SBram Moolenaar
2000b4c66c6SBram Moolenaar  lines =<< trim END
20130fd8204SBram Moolenaar      const ll = [2, 3, 4]
2020b4c66c6SBram Moolenaar      ll[0] = 99
2030b4c66c6SBram Moolenaar  END
2040b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2050b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2060b4c66c6SBram Moolenaar
2070b4c66c6SBram Moolenaar  lines =<< trim END
20830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2090b4c66c6SBram Moolenaar      ll[3] = 99
2100b4c66c6SBram Moolenaar  END
2110b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2120b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2130b4c66c6SBram Moolenaar
2140b4c66c6SBram Moolenaar  lines =<< trim END
21530fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2160b4c66c6SBram Moolenaar      dd["one"] = 99
2170b4c66c6SBram Moolenaar  END
2180b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2190b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2200b4c66c6SBram Moolenaar
2210b4c66c6SBram Moolenaar  lines =<< trim END
22230fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2230b4c66c6SBram Moolenaar      dd["three"] = 99
2240b4c66c6SBram Moolenaar  END
2250b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2260b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2270b4c66c6SBram Moolenaarenddef
2280b4c66c6SBram Moolenaar
229df069eecSBram Moolenaardef Test_range_no_colon()
230d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
231d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
232d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
233d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
234df069eecSBram Moolenaarenddef
235df069eecSBram Moolenaar
236df069eecSBram Moolenaar
2378a7d6542SBram Moolenaardef Test_block()
238cfcd011fSBram Moolenaar  var outer = 1
2398a7d6542SBram Moolenaar  {
240cfcd011fSBram Moolenaar    var inner = 2
2418a7d6542SBram Moolenaar    assert_equal(1, outer)
2428a7d6542SBram Moolenaar    assert_equal(2, inner)
2438a7d6542SBram Moolenaar  }
2448a7d6542SBram Moolenaar  assert_equal(1, outer)
2458a7d6542SBram Moolenaarenddef
2468a7d6542SBram Moolenaar
24708052228SBram Moolenaardef Test_block_failure()
248cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
24908052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25008052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25108052228SBram Moolenaarenddef
2528a7d6542SBram Moolenaar
253fbbcd003SBram Moolenaardef Test_block_local_vars()
254fbbcd003SBram Moolenaar  var lines =<< trim END
255fbbcd003SBram Moolenaar      vim9script
256ed234f24SBram Moolenaar      v:testing = 1
257fbbcd003SBram Moolenaar      if true
258ed234f24SBram Moolenaar        var text = ['hello']
259ed234f24SBram Moolenaar        def SayHello(): list<string>
260fbbcd003SBram Moolenaar          return text
261fbbcd003SBram Moolenaar        enddef
262fbbcd003SBram Moolenaar        def SetText(v: string)
263ed234f24SBram Moolenaar          text = [v]
264fbbcd003SBram Moolenaar        enddef
265fbbcd003SBram Moolenaar      endif
266fbbcd003SBram Moolenaar
267fbbcd003SBram Moolenaar      if true
268ed234f24SBram Moolenaar        var text = ['again']
269ed234f24SBram Moolenaar        def SayAgain(): list<string>
270fbbcd003SBram Moolenaar          return text
271fbbcd003SBram Moolenaar        enddef
272fbbcd003SBram Moolenaar      endif
273ed234f24SBram Moolenaar
274ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
275ed234f24SBram Moolenaar      test_garbagecollect_now()
276ed234f24SBram Moolenaar
277fbbcd003SBram Moolenaar      defcompile
278fbbcd003SBram Moolenaar
279ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
280ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
281fbbcd003SBram Moolenaar
282fbbcd003SBram Moolenaar      SetText('foobar')
283ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
284ed234f24SBram Moolenaar
285ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
286ed234f24SBram Moolenaar      qall!
287fbbcd003SBram Moolenaar  END
288ed234f24SBram Moolenaar
289ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
290ed234f24SBram Moolenaar  # context gets garbage collected.
291ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
292ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
293ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
294ed234f24SBram Moolenaar
295ed234f24SBram Moolenaar  delete('Xscript')
296ed234f24SBram Moolenaar  delete('Xdidit')
297fbbcd003SBram Moolenaarenddef
298fbbcd003SBram Moolenaar
29939ca4127SBram Moolenaardef Test_block_local_vars_with_func()
30039ca4127SBram Moolenaar  var lines =<< trim END
30139ca4127SBram Moolenaar      vim9script
30239ca4127SBram Moolenaar      if true
30339ca4127SBram Moolenaar        var foo = 'foo'
30439ca4127SBram Moolenaar        if true
30539ca4127SBram Moolenaar          var bar = 'bar'
30639ca4127SBram Moolenaar          def Func(): list<string>
30739ca4127SBram Moolenaar            return [foo, bar]
30839ca4127SBram Moolenaar          enddef
30939ca4127SBram Moolenaar        endif
31039ca4127SBram Moolenaar      endif
31139ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
31239ca4127SBram Moolenaar      # "foo" and "bar"
31339ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
31439ca4127SBram Moolenaar  END
31539ca4127SBram Moolenaar  CheckScriptSuccess(lines)
31639ca4127SBram Moolenaarenddef
31739ca4127SBram Moolenaar
318d032f34aSBram Moolenaarfunc g:NoSuchFunc()
319d032f34aSBram Moolenaar  echo 'none'
320d032f34aSBram Moolenaarendfunc
321d032f34aSBram Moolenaar
3228a7d6542SBram Moolenaardef Test_try_catch()
323cfcd011fSBram Moolenaar  var l = []
3247a092245SBram Moolenaar  try # comment
3258a7d6542SBram Moolenaar    add(l, '1')
3268a7d6542SBram Moolenaar    throw 'wrong'
3278a7d6542SBram Moolenaar    add(l, '2')
3287a092245SBram Moolenaar  catch # comment
3298a7d6542SBram Moolenaar    add(l, v:exception)
3307a092245SBram Moolenaar  finally # comment
3318a7d6542SBram Moolenaar    add(l, '3')
3327a092245SBram Moolenaar  endtry # comment
3338a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
33468d130c6SBram Moolenaar
335e859312eSBram Moolenaar  l = []
336e859312eSBram Moolenaar  try
337e859312eSBram Moolenaar    try
338e859312eSBram Moolenaar      add(l, '1')
339e859312eSBram Moolenaar      throw 'wrong'
340e859312eSBram Moolenaar      add(l, '2')
341e859312eSBram Moolenaar    catch /right/
342e859312eSBram Moolenaar      add(l, v:exception)
343e859312eSBram Moolenaar    endtry
344e859312eSBram Moolenaar  catch /wrong/
345e859312eSBram Moolenaar    add(l, 'caught')
346373863edSBram Moolenaar  fina
347e859312eSBram Moolenaar    add(l, 'finally')
348e859312eSBram Moolenaar  endtry
349e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
350e859312eSBram Moolenaar
351cfcd011fSBram Moolenaar  var n: number
35268d130c6SBram Moolenaar  try
35368d130c6SBram Moolenaar    n = l[3]
35468d130c6SBram Moolenaar  catch /E684:/
35568d130c6SBram Moolenaar    n = 99
35668d130c6SBram Moolenaar  endtry
35768d130c6SBram Moolenaar  assert_equal(99, n)
35868d130c6SBram Moolenaar
35968d130c6SBram Moolenaar  try
360cc673e74SBram Moolenaar    # string slice returns a string, not a number
36168d130c6SBram Moolenaar    n = g:astring[3]
3625e654230SBram Moolenaar  catch /E1012:/
36368d130c6SBram Moolenaar    n = 77
36468d130c6SBram Moolenaar  endtry
36568d130c6SBram Moolenaar  assert_equal(77, n)
36668d130c6SBram Moolenaar
36768d130c6SBram Moolenaar  try
36868d130c6SBram Moolenaar    n = l[g:astring]
3695e654230SBram Moolenaar  catch /E1012:/
37056acb094SBram Moolenaar    n = 88
37168d130c6SBram Moolenaar  endtry
37256acb094SBram Moolenaar  assert_equal(88, n)
37368d130c6SBram Moolenaar
37468d130c6SBram Moolenaar  try
37568d130c6SBram Moolenaar    n = s:does_not_exist
37668d130c6SBram Moolenaar  catch /E121:/
377f0b9f43cSBram Moolenaar    n = 111
378f0b9f43cSBram Moolenaar  endtry
379f0b9f43cSBram Moolenaar  assert_equal(111, n)
380f0b9f43cSBram Moolenaar
381f0b9f43cSBram Moolenaar  try
382f0b9f43cSBram Moolenaar    n = g:does_not_exist
383f0b9f43cSBram Moolenaar  catch /E121:/
38468d130c6SBram Moolenaar    n = 121
38568d130c6SBram Moolenaar  endtry
38668d130c6SBram Moolenaar  assert_equal(121, n)
38768d130c6SBram Moolenaar
388cfcd011fSBram Moolenaar  var d = #{one: 1}
38968d130c6SBram Moolenaar  try
39068d130c6SBram Moolenaar    n = d[g:astring]
39168d130c6SBram Moolenaar  catch /E716:/
39268d130c6SBram Moolenaar    n = 222
39368d130c6SBram Moolenaar  endtry
39468d130c6SBram Moolenaar  assert_equal(222, n)
395f0b9f43cSBram Moolenaar
396f0b9f43cSBram Moolenaar  try
397f0b9f43cSBram Moolenaar    n = -g:astring
398f0b9f43cSBram Moolenaar  catch /E39:/
399f0b9f43cSBram Moolenaar    n = 233
400f0b9f43cSBram Moolenaar  endtry
401f0b9f43cSBram Moolenaar  assert_equal(233, n)
402f0b9f43cSBram Moolenaar
403f0b9f43cSBram Moolenaar  try
404f0b9f43cSBram Moolenaar    n = +g:astring
405f0b9f43cSBram Moolenaar  catch /E1030:/
406f0b9f43cSBram Moolenaar    n = 244
407f0b9f43cSBram Moolenaar  endtry
408f0b9f43cSBram Moolenaar  assert_equal(244, n)
409f0b9f43cSBram Moolenaar
410f0b9f43cSBram Moolenaar  try
411f0b9f43cSBram Moolenaar    n = +g:alist
412f0b9f43cSBram Moolenaar  catch /E745:/
413f0b9f43cSBram Moolenaar    n = 255
414f0b9f43cSBram Moolenaar  endtry
415f0b9f43cSBram Moolenaar  assert_equal(255, n)
416f0b9f43cSBram Moolenaar
417cfcd011fSBram Moolenaar  var nd: dict<any>
418f0b9f43cSBram Moolenaar  try
419*2bede173SBram Moolenaar    nd = {[g:anumber]: 1}
4205e654230SBram Moolenaar  catch /E1012:/
421f0b9f43cSBram Moolenaar    n = 266
422f0b9f43cSBram Moolenaar  endtry
423f0b9f43cSBram Moolenaar  assert_equal(266, n)
424f0b9f43cSBram Moolenaar
425f0b9f43cSBram Moolenaar  try
426f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
427f0b9f43cSBram Moolenaar  catch /E1093:/
428f0b9f43cSBram Moolenaar    n = 277
429f0b9f43cSBram Moolenaar  endtry
430f0b9f43cSBram Moolenaar  assert_equal(277, n)
431f0b9f43cSBram Moolenaar
432e859312eSBram Moolenaar  try
433e859312eSBram Moolenaar    &ts = g:astring
4345e654230SBram Moolenaar  catch /E1012:/
435e859312eSBram Moolenaar    n = 288
436e859312eSBram Moolenaar  endtry
437e859312eSBram Moolenaar  assert_equal(288, n)
438e859312eSBram Moolenaar
439e859312eSBram Moolenaar  try
440e859312eSBram Moolenaar    &backspace = 'asdf'
441e859312eSBram Moolenaar  catch /E474:/
442e859312eSBram Moolenaar    n = 299
443e859312eSBram Moolenaar  endtry
444e859312eSBram Moolenaar  assert_equal(299, n)
445e859312eSBram Moolenaar
446e859312eSBram Moolenaar  l = [1]
447e859312eSBram Moolenaar  try
448e859312eSBram Moolenaar    l[3] = 3
449e859312eSBram Moolenaar  catch /E684:/
450e859312eSBram Moolenaar    n = 300
451e859312eSBram Moolenaar  endtry
452e859312eSBram Moolenaar  assert_equal(300, n)
453e859312eSBram Moolenaar
454e859312eSBram Moolenaar  try
455e859312eSBram Moolenaar    unlet g:does_not_exist
456e859312eSBram Moolenaar  catch /E108:/
457e859312eSBram Moolenaar    n = 322
458e859312eSBram Moolenaar  endtry
459e859312eSBram Moolenaar  assert_equal(322, n)
460e859312eSBram Moolenaar
461e859312eSBram Moolenaar  try
462*2bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
463e859312eSBram Moolenaar  catch /E721:/
464e859312eSBram Moolenaar    n = 333
465e859312eSBram Moolenaar  endtry
466e859312eSBram Moolenaar  assert_equal(333, n)
467e859312eSBram Moolenaar
468e859312eSBram Moolenaar  try
469e859312eSBram Moolenaar    l = DeletedFunc()
470e859312eSBram Moolenaar  catch /E933:/
471e859312eSBram Moolenaar    n = 344
472e859312eSBram Moolenaar  endtry
473e859312eSBram Moolenaar  assert_equal(344, n)
474d032f34aSBram Moolenaar
475d032f34aSBram Moolenaar  try
476d032f34aSBram Moolenaar    echo len(v:true)
477d032f34aSBram Moolenaar  catch /E701:/
478d032f34aSBram Moolenaar    n = 355
479d032f34aSBram Moolenaar  endtry
480d032f34aSBram Moolenaar  assert_equal(355, n)
481d032f34aSBram Moolenaar
482cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
483d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
484d032f34aSBram Moolenaar  try
485d032f34aSBram Moolenaar    echo P()
486d032f34aSBram Moolenaar  catch /E117:/
487d032f34aSBram Moolenaar    n = 366
488d032f34aSBram Moolenaar  endtry
489d032f34aSBram Moolenaar  assert_equal(366, n)
490d032f34aSBram Moolenaar
491d032f34aSBram Moolenaar  try
492d032f34aSBram Moolenaar    echo g:NoSuchFunc()
493d032f34aSBram Moolenaar  catch /E117:/
494d032f34aSBram Moolenaar    n = 377
495d032f34aSBram Moolenaar  endtry
496d032f34aSBram Moolenaar  assert_equal(377, n)
497d032f34aSBram Moolenaar
498d032f34aSBram Moolenaar  try
499d032f34aSBram Moolenaar    echo g:alist + 4
500d032f34aSBram Moolenaar  catch /E745:/
501d032f34aSBram Moolenaar    n = 388
502d032f34aSBram Moolenaar  endtry
503d032f34aSBram Moolenaar  assert_equal(388, n)
504d032f34aSBram Moolenaar
505d032f34aSBram Moolenaar  try
506d032f34aSBram Moolenaar    echo 4 + g:alist
507d032f34aSBram Moolenaar  catch /E745:/
508d032f34aSBram Moolenaar    n = 399
509d032f34aSBram Moolenaar  endtry
510d032f34aSBram Moolenaar  assert_equal(399, n)
511d032f34aSBram Moolenaar
512d032f34aSBram Moolenaar  try
513d032f34aSBram Moolenaar    echo g:alist.member
514d032f34aSBram Moolenaar  catch /E715:/
515d032f34aSBram Moolenaar    n = 400
516d032f34aSBram Moolenaar  endtry
517d032f34aSBram Moolenaar  assert_equal(400, n)
518d032f34aSBram Moolenaar
519d032f34aSBram Moolenaar  try
520d032f34aSBram Moolenaar    echo d.member
521d032f34aSBram Moolenaar  catch /E716:/
522d032f34aSBram Moolenaar    n = 411
523d032f34aSBram Moolenaar  endtry
524d032f34aSBram Moolenaar  assert_equal(411, n)
5258a7d6542SBram Moolenaarenddef
5268a7d6542SBram Moolenaar
527e859312eSBram Moolenaardef DeletedFunc(): list<any>
528e859312eSBram Moolenaar  return ['delete me']
529e859312eSBram Moolenaarenddef
530e859312eSBram Moolenaardefcompile
531e859312eSBram Moolenaardelfunc DeletedFunc
532e859312eSBram Moolenaar
533257cc5eeSBram Moolenaardef ThrowFromDef()
534a72cfb80SBram Moolenaar  throw "getout" # comment
535257cc5eeSBram Moolenaarenddef
536257cc5eeSBram Moolenaar
537257cc5eeSBram Moolenaarfunc CatchInFunc()
538257cc5eeSBram Moolenaar  try
539257cc5eeSBram Moolenaar    call ThrowFromDef()
540257cc5eeSBram Moolenaar  catch
541257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
542257cc5eeSBram Moolenaar  endtry
543257cc5eeSBram Moolenaarendfunc
544257cc5eeSBram Moolenaar
545257cc5eeSBram Moolenaardef CatchInDef()
546257cc5eeSBram Moolenaar  try
547257cc5eeSBram Moolenaar    ThrowFromDef()
548257cc5eeSBram Moolenaar  catch
549257cc5eeSBram Moolenaar    g:thrown_def = v:exception
550257cc5eeSBram Moolenaar  endtry
551257cc5eeSBram Moolenaarenddef
552257cc5eeSBram Moolenaar
553f575adffSBram Moolenaardef ReturnFinally(): string
554f575adffSBram Moolenaar  try
555f575adffSBram Moolenaar    return 'intry'
556373863edSBram Moolenaar  finall
557f575adffSBram Moolenaar    g:in_finally = 'finally'
558f575adffSBram Moolenaar  endtry
559f575adffSBram Moolenaar  return 'end'
560f575adffSBram Moolenaarenddef
561f575adffSBram Moolenaar
562257cc5eeSBram Moolenaardef Test_try_catch_nested()
563257cc5eeSBram Moolenaar  CatchInFunc()
564257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
565257cc5eeSBram Moolenaar
566257cc5eeSBram Moolenaar  CatchInDef()
567257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
568f575adffSBram Moolenaar
569f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
570f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
571f575adffSBram Moolenaarenddef
572f575adffSBram Moolenaar
5739939f57bSBram Moolenaardef TryOne(): number
5749939f57bSBram Moolenaar  try
5759939f57bSBram Moolenaar    return 0
5769939f57bSBram Moolenaar  catch
5779939f57bSBram Moolenaar  endtry
5789939f57bSBram Moolenaar  return 0
5799939f57bSBram Moolenaarenddef
5809939f57bSBram Moolenaar
5819939f57bSBram Moolenaardef TryTwo(n: number): string
5829939f57bSBram Moolenaar  try
583cfcd011fSBram Moolenaar    var x = {}
5849939f57bSBram Moolenaar  catch
5859939f57bSBram Moolenaar  endtry
5869939f57bSBram Moolenaar  return 'text'
5879939f57bSBram Moolenaarenddef
5889939f57bSBram Moolenaar
5899939f57bSBram Moolenaardef Test_try_catch_twice()
5909939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5919939f57bSBram Moolenaarenddef
5929939f57bSBram Moolenaar
593f575adffSBram Moolenaardef Test_try_catch_match()
594cfcd011fSBram Moolenaar  var seq = 'a'
595f575adffSBram Moolenaar  try
596f575adffSBram Moolenaar    throw 'something'
597f575adffSBram Moolenaar  catch /nothing/
598f575adffSBram Moolenaar    seq ..= 'x'
599f575adffSBram Moolenaar  catch /some/
600f575adffSBram Moolenaar    seq ..= 'b'
601f575adffSBram Moolenaar  catch /asdf/
602f575adffSBram Moolenaar    seq ..= 'x'
603e8c4abbbSBram Moolenaar  catch ?a\?sdf?
604e8c4abbbSBram Moolenaar    seq ..= 'y'
605f575adffSBram Moolenaar  finally
606f575adffSBram Moolenaar    seq ..= 'c'
607f575adffSBram Moolenaar  endtry
608f575adffSBram Moolenaar  assert_equal('abc', seq)
609257cc5eeSBram Moolenaarenddef
610257cc5eeSBram Moolenaar
611e8c4abbbSBram Moolenaardef Test_try_catch_fails()
612d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
613d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
614d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
615d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
616d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
617d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
618d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
619d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
62013106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
621d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
622585fea7bSBram Moolenaar
623d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
624d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
625e8c4abbbSBram Moolenaarenddef
626e8c4abbbSBram Moolenaar
627006ad48bSBram Moolenaardef Test_throw_vimscript()
628f5be8cdbSBram Moolenaar  # only checks line continuation
629cfcd011fSBram Moolenaar  var lines =<< trim END
630006ad48bSBram Moolenaar      vim9script
631006ad48bSBram Moolenaar      try
632006ad48bSBram Moolenaar        throw 'one'
633006ad48bSBram Moolenaar              .. 'two'
634006ad48bSBram Moolenaar      catch
635006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
636006ad48bSBram Moolenaar      endtry
637006ad48bSBram Moolenaar  END
638006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
6391e021e63SBram Moolenaar
6401e021e63SBram Moolenaar  lines =<< trim END
6411e021e63SBram Moolenaar    vim9script
642352134bbSBram Moolenaar    @r = ''
6431e021e63SBram Moolenaar    def Func()
6441e021e63SBram Moolenaar      throw @r
6451e021e63SBram Moolenaar    enddef
6461e021e63SBram Moolenaar    var result = ''
6471e021e63SBram Moolenaar    try
6481e021e63SBram Moolenaar      Func()
6491e021e63SBram Moolenaar    catch /E1129:/
6501e021e63SBram Moolenaar      result = 'caught'
6511e021e63SBram Moolenaar    endtry
6521e021e63SBram Moolenaar    assert_equal('caught', result)
6531e021e63SBram Moolenaar  END
6541e021e63SBram Moolenaar  CheckScriptSuccess(lines)
655006ad48bSBram Moolenaarenddef
656006ad48bSBram Moolenaar
657ed677f55SBram Moolenaardef Test_error_in_nested_function()
658ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
659cfcd011fSBram Moolenaar  var lines =<< trim END
660ed677f55SBram Moolenaar      vim9script
661ed677f55SBram Moolenaar      def Func()
662ed677f55SBram Moolenaar        Error()
663ed677f55SBram Moolenaar        g:test_var = 1
664ed677f55SBram Moolenaar      enddef
665ed677f55SBram Moolenaar      func Error() abort
666ed677f55SBram Moolenaar        eval [][0]
667ed677f55SBram Moolenaar      endfunc
668ed677f55SBram Moolenaar      Func()
669ed677f55SBram Moolenaar  END
670ed677f55SBram Moolenaar  g:test_var = 0
671ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
672ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
673ed677f55SBram Moolenaarenddef
674ed677f55SBram Moolenaar
67537c83711SBram Moolenaardef Test_cexpr_vimscript()
676f5be8cdbSBram Moolenaar  # only checks line continuation
67737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
678cfcd011fSBram Moolenaar  var lines =<< trim END
67937c83711SBram Moolenaar      vim9script
68037c83711SBram Moolenaar      cexpr 'File'
68137c83711SBram Moolenaar                .. ' someFile' ..
68237c83711SBram Moolenaar                   ' line 19'
68337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
68437c83711SBram Moolenaar  END
68537c83711SBram Moolenaar  CheckScriptSuccess(lines)
68637c83711SBram Moolenaar  set errorformat&
68737c83711SBram Moolenaarenddef
68837c83711SBram Moolenaar
689c9edd6b5SBram Moolenaardef Test_statusline_syntax()
690c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
691cfcd011fSBram Moolenaar  var lines =<< trim END
692c9edd6b5SBram Moolenaar      vim9script
693c9edd6b5SBram Moolenaar      func g:Status()
694c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
695c9edd6b5SBram Moolenaar      endfunc
696c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
697c9edd6b5SBram Moolenaar      redrawstatus
698c9edd6b5SBram Moolenaar      set laststatus statusline=
699c9edd6b5SBram Moolenaar  END
700c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
701c9edd6b5SBram Moolenaarenddef
702c9edd6b5SBram Moolenaar
703b209750bSBram Moolenaardef Test_list_vimscript()
704b209750bSBram Moolenaar  # checks line continuation and comments
705cfcd011fSBram Moolenaar  var lines =<< trim END
706b209750bSBram Moolenaar      vim9script
707cfcd011fSBram Moolenaar      var mylist = [
708b209750bSBram Moolenaar            'one',
709b209750bSBram Moolenaar            # comment
710b209750bSBram Moolenaar            'two', # empty line follows
711b209750bSBram Moolenaar
712b209750bSBram Moolenaar            'three',
713b209750bSBram Moolenaar            ]
714b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
715b209750bSBram Moolenaar  END
716b209750bSBram Moolenaar  CheckScriptSuccess(lines)
71766250c93SBram Moolenaar
71866250c93SBram Moolenaar  # check all lines from heredoc are kept
71966250c93SBram Moolenaar  lines =<< trim END
72066250c93SBram Moolenaar      # comment 1
72166250c93SBram Moolenaar      two
72266250c93SBram Moolenaar      # comment 3
72366250c93SBram Moolenaar
72466250c93SBram Moolenaar      five
72566250c93SBram Moolenaar      # comment 6
72666250c93SBram Moolenaar  END
72766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
728b209750bSBram Moolenaarenddef
729b209750bSBram Moolenaar
7302a1381c3SBram Moolenaarif has('channel')
73140ee466cSBram Moolenaar  let someJob = test_null_job()
73240ee466cSBram Moolenaar
73340ee466cSBram Moolenaar  def FuncWithError()
73440ee466cSBram Moolenaar    echomsg g:someJob
73540ee466cSBram Moolenaar  enddef
73640ee466cSBram Moolenaar
73740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
73840ee466cSBram Moolenaar    try
73940ee466cSBram Moolenaar      call FuncWithError()
74040ee466cSBram Moolenaar    catch
74140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
74240ee466cSBram Moolenaar    endtry
74340ee466cSBram Moolenaar  endfunc
7442a1381c3SBram Moolenaarendif
74540ee466cSBram Moolenaar
7468a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7478a7d6542SBram Moolenaar  vim9script
748cfcd011fSBram Moolenaar  var name: string = 'bob'
7498a7d6542SBram Moolenaar  def Concat(arg: string): string
7508a7d6542SBram Moolenaar    return name .. arg
7518a7d6542SBram Moolenaar  enddef
752227a69deSBram Moolenaar  g:result = Concat('bie')
753227a69deSBram Moolenaar  g:localname = name
7548a7d6542SBram Moolenaar
7558a7d6542SBram Moolenaar  export const CONST = 1234
756cfcd011fSBram Moolenaar  export var exported = 9876
757cfcd011fSBram Moolenaar  export var exp_name = 'John'
7588a7d6542SBram Moolenaar  export def Exported(): string
7598a7d6542SBram Moolenaar    return 'Exported'
7608a7d6542SBram Moolenaar  enddef
7618a7d6542SBram MoolenaarEND
7628a7d6542SBram Moolenaar
763b3ca9824SBram Moolenaardef Undo_export_script_lines()
764b3ca9824SBram Moolenaar  unlet g:result
765b3ca9824SBram Moolenaar  unlet g:localname
766b3ca9824SBram Moolenaarenddef
767b3ca9824SBram Moolenaar
7685269bd2aSBram Moolenaardef Test_vim9_import_export()
769cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7708a7d6542SBram Moolenaar    vim9script
7718a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7728a7d6542SBram Moolenaar    g:imported = exported
7736e587dcbSBram Moolenaar    exported += 3
7746e587dcbSBram Moolenaar    g:imported_added = exported
7758a7d6542SBram Moolenaar    g:imported_func = Exported()
7766e587dcbSBram Moolenaar
77740f4f7a4SBram Moolenaar    def GetExported(): string
778cfcd011fSBram Moolenaar      var local_dict = #{ref: Exported}
77940f4f7a4SBram Moolenaar      return local_dict.ref()
78040f4f7a4SBram Moolenaar    enddef
78140f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
78240f4f7a4SBram Moolenaar
7836e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7846e587dcbSBram Moolenaar    g:imported_name = exp_name
7856e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7866e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7875381c7a1SBram Moolenaar    g:imported_later = exported
7888a7d6542SBram Moolenaar  END
7898a7d6542SBram Moolenaar
7908a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7918a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7928a7d6542SBram Moolenaar
7938a7d6542SBram Moolenaar  source Ximport.vim
7948a7d6542SBram Moolenaar
7958a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7968a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7978a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7986e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7995381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8008a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
80140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
8026e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8036e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8048a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8058a7d6542SBram Moolenaar
806b3ca9824SBram Moolenaar  Undo_export_script_lines()
8078a7d6542SBram Moolenaar  unlet g:imported
8086e587dcbSBram Moolenaar  unlet g:imported_added
8095381c7a1SBram Moolenaar  unlet g:imported_later
8108a7d6542SBram Moolenaar  unlet g:imported_func
8116e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
8128a7d6542SBram Moolenaar  delete('Ximport.vim')
813f2d5c240SBram Moolenaar
8141c991144SBram Moolenaar  # similar, with line breaks
815cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
8161c991144SBram Moolenaar    vim9script
8171c991144SBram Moolenaar    import {
8181c991144SBram Moolenaar        exported,
8191c991144SBram Moolenaar        Exported,
8201c991144SBram Moolenaar        }
8211c991144SBram Moolenaar        from
8221c991144SBram Moolenaar        './Xexport.vim'
8231c991144SBram Moolenaar    g:imported = exported
8241c991144SBram Moolenaar    exported += 5
8251c991144SBram Moolenaar    g:imported_added = exported
8261c991144SBram Moolenaar    g:imported_func = Exported()
8271c991144SBram Moolenaar  END
8281c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8291c991144SBram Moolenaar  source Ximport_lbr.vim
8301c991144SBram Moolenaar
8311c991144SBram Moolenaar  assert_equal(9876, g:imported)
8321c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8331c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8341c991144SBram Moolenaar
8351c991144SBram Moolenaar  # exported script not sourced again
8361c991144SBram Moolenaar  assert_false(exists('g:result'))
8371c991144SBram Moolenaar  unlet g:imported
8381c991144SBram Moolenaar  unlet g:imported_added
8391c991144SBram Moolenaar  unlet g:imported_func
8401c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8411c991144SBram Moolenaar
8421c991144SBram Moolenaar  # import inside :def function
843cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8445381c7a1SBram Moolenaar    vim9script
8455381c7a1SBram Moolenaar    def ImportInDef()
8465381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8475381c7a1SBram Moolenaar      g:imported = exported
8485381c7a1SBram Moolenaar      exported += 7
8495381c7a1SBram Moolenaar      g:imported_added = exported
8505381c7a1SBram Moolenaar    enddef
8515381c7a1SBram Moolenaar    ImportInDef()
8525381c7a1SBram Moolenaar  END
8535381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8545381c7a1SBram Moolenaar  source Ximport2.vim
855f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8565381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8575381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8585381c7a1SBram Moolenaar  unlet g:imported
8595381c7a1SBram Moolenaar  unlet g:imported_added
8605381c7a1SBram Moolenaar  delete('Ximport2.vim')
8615381c7a1SBram Moolenaar
862cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
863f2d5c240SBram Moolenaar    vim9script
864f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
865f2d5c240SBram Moolenaar    def UseExport()
866f2d5c240SBram Moolenaar      g:imported = Export.exported
867f2d5c240SBram Moolenaar    enddef
868f2d5c240SBram Moolenaar    UseExport()
869f2d5c240SBram Moolenaar  END
870f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
871f2d5c240SBram Moolenaar  source Ximport.vim
8725381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
873f2d5c240SBram Moolenaar
874cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
875599c89c8SBram Moolenaar    vim9script
876599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
877599c89c8SBram Moolenaar    def Func()
878cfcd011fSBram Moolenaar      var dummy = 1
879cfcd011fSBram Moolenaar      var imported = Export + dummy
880599c89c8SBram Moolenaar    enddef
881822ba247SBram Moolenaar    defcompile
882599c89c8SBram Moolenaar  END
883599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
88444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
885599c89c8SBram Moolenaar
886cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
887599c89c8SBram Moolenaar    vim9script
888599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
889599c89c8SBram Moolenaar    def Func()
890cfcd011fSBram Moolenaar      var imported = Export . exported
891599c89c8SBram Moolenaar    enddef
892822ba247SBram Moolenaar    defcompile
893599c89c8SBram Moolenaar  END
894599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
89544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
896599c89c8SBram Moolenaar
897cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
898599c89c8SBram Moolenaar    vim9script
899599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
900599c89c8SBram Moolenaar    def Func()
901cfcd011fSBram Moolenaar      var imported = Export.
902599c89c8SBram Moolenaar    enddef
903822ba247SBram Moolenaar    defcompile
904599c89c8SBram Moolenaar  END
905599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
90644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
907599c89c8SBram Moolenaar
908cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
9091c991144SBram Moolenaar    vim9script
9101c991144SBram Moolenaar    import *
9111c991144SBram Moolenaar        as Export
9121c991144SBram Moolenaar        from
9131c991144SBram Moolenaar        './Xexport.vim'
9141c991144SBram Moolenaar    def UseExport()
9151c991144SBram Moolenaar      g:imported = Export.exported
9161c991144SBram Moolenaar    enddef
9171c991144SBram Moolenaar    UseExport()
9181c991144SBram Moolenaar  END
9191c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9201c991144SBram Moolenaar  source Ximport.vim
9211c991144SBram Moolenaar  assert_equal(9883, g:imported)
9221c991144SBram Moolenaar
923cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
924f2d5c240SBram Moolenaar    vim9script
925f2d5c240SBram Moolenaar    import * from './Xexport.vim'
926f2d5c240SBram Moolenaar  END
927f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
92844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
929f2d5c240SBram Moolenaar
930f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
931cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
932fa29c8abSBram Moolenaar    vim9script
933fa29c8abSBram Moolenaar    import name from './Xexport.vim'
934fa29c8abSBram Moolenaar  END
935fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
93644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
937fa29c8abSBram Moolenaar
938f5be8cdbSBram Moolenaar  # try to import something that is already defined
939cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9405269bd2aSBram Moolenaar    vim9script
941cfcd011fSBram Moolenaar    var exported = 'something'
9425269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9435269bd2aSBram Moolenaar  END
9445269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
94544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9465269bd2aSBram Moolenaar
947f5be8cdbSBram Moolenaar  # try to import something that is already defined
9485269bd2aSBram Moolenaar  import_already_defined =<< trim END
9495269bd2aSBram Moolenaar    vim9script
950cfcd011fSBram Moolenaar    var exported = 'something'
9515269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9525269bd2aSBram Moolenaar  END
9535269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
95444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9555269bd2aSBram Moolenaar
956f5be8cdbSBram Moolenaar  # try to import something that is already defined
9575269bd2aSBram Moolenaar  import_already_defined =<< trim END
9585269bd2aSBram Moolenaar    vim9script
959cfcd011fSBram Moolenaar    var exported = 'something'
9605269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9615269bd2aSBram Moolenaar  END
9625269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
96344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9645269bd2aSBram Moolenaar
965f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
966cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
967fa29c8abSBram Moolenaar    vim9script
968fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
969fa29c8abSBram Moolenaar  END
970fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
97144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
972fa29c8abSBram Moolenaar
973cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
974fa29c8abSBram Moolenaar    vim9script
975fa29c8abSBram Moolenaar    import name './Xexport.vim'
976fa29c8abSBram Moolenaar  END
977fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
97844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
979fa29c8abSBram Moolenaar
980cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
981fa29c8abSBram Moolenaar    vim9script
982fa29c8abSBram Moolenaar    import name from Xexport.vim
983fa29c8abSBram Moolenaar  END
984fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
98544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
986fa29c8abSBram Moolenaar
987cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
988fa29c8abSBram Moolenaar    vim9script
989fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
990fa29c8abSBram Moolenaar  END
991fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
99244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
993fa29c8abSBram Moolenaar
994cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
995fa29c8abSBram Moolenaar    vim9script
996fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
997fa29c8abSBram Moolenaar  END
9985269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
99944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1000fa29c8abSBram Moolenaar
1001f2d5c240SBram Moolenaar  delete('Ximport.vim')
10025269bd2aSBram Moolenaar  delete('Ximport3.vim')
10038a7d6542SBram Moolenaar  delete('Xexport.vim')
10048a7d6542SBram Moolenaar
1005f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1006750802b5SBram Moolenaar  set cpo&vi
1007cfcd011fSBram Moolenaar  var cpo_before = &cpo
1008cfcd011fSBram Moolenaar  var lines =<< trim END
1009750802b5SBram Moolenaar    vim9script
1010750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1011750802b5SBram Moolenaar  END
1012750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1013750802b5SBram Moolenaar  source Xvim9_script
1014750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1015750802b5SBram Moolenaar  set cpo&vim
1016750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1017750802b5SBram Moolenaar  delete('Xvim9_script')
1018750802b5SBram Moolenaarenddef
1019750802b5SBram Moolenaar
1020803af686SBram Moolenaarfunc g:Trigger()
1021803af686SBram Moolenaar  source Ximport.vim
1022803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1023803af686SBram Moolenaarendfunc
1024803af686SBram Moolenaar
1025803af686SBram Moolenaardef Test_import_export_expr_map()
1026803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1027cfcd011fSBram Moolenaar  var export_lines =<< trim END
1028803af686SBram Moolenaar    vim9script
1029803af686SBram Moolenaar    export def That(): string
1030803af686SBram Moolenaar      return 'yes'
1031803af686SBram Moolenaar    enddef
1032803af686SBram Moolenaar  END
1033803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1034803af686SBram Moolenaar
1035cfcd011fSBram Moolenaar  var import_lines =<< trim END
1036803af686SBram Moolenaar    vim9script
1037803af686SBram Moolenaar    import That from './Xexport_that.vim'
1038803af686SBram Moolenaar    assert_equal('yes', That())
1039803af686SBram Moolenaar  END
1040803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1041803af686SBram Moolenaar
1042803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1043803af686SBram Moolenaar  feedkeys('trigger', "xt")
1044803af686SBram Moolenaar
1045730b2483SBram Moolenaar  delete('Xexport_that.vim')
1046803af686SBram Moolenaar  delete('Ximport.vim')
1047803af686SBram Moolenaar  nunmap trigger
1048803af686SBram Moolenaarenddef
1049803af686SBram Moolenaar
10508e1986e3SBram Moolenaardef Test_import_in_filetype()
10518e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10528e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1053cfcd011fSBram Moolenaar  var export_lines =<< trim END
10548e1986e3SBram Moolenaar    vim9script
1055cfcd011fSBram Moolenaar    export var That = 'yes'
10568e1986e3SBram Moolenaar  END
1057730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10588e1986e3SBram Moolenaar
1059cfcd011fSBram Moolenaar  var import_lines =<< trim END
10608e1986e3SBram Moolenaar    vim9script
1061730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10628e1986e3SBram Moolenaar    assert_equal('yes', That)
10638e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10648e1986e3SBram Moolenaar  END
10658e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10668e1986e3SBram Moolenaar
1067cfcd011fSBram Moolenaar  var save_rtp = &rtp
10688e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10698e1986e3SBram Moolenaar
10708e1986e3SBram Moolenaar  filetype plugin on
10718e1986e3SBram Moolenaar  copen
10728e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10738e1986e3SBram Moolenaar
10748e1986e3SBram Moolenaar  quit!
1075730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10768e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10778e1986e3SBram Moolenaar  &rtp = save_rtp
10788e1986e3SBram Moolenaarenddef
10798e1986e3SBram Moolenaar
1080efa94447SBram Moolenaardef Test_use_import_in_mapping()
1081cfcd011fSBram Moolenaar  var lines =<< trim END
1082efa94447SBram Moolenaar      vim9script
1083efa94447SBram Moolenaar      export def Funcx()
1084efa94447SBram Moolenaar        g:result = 42
1085efa94447SBram Moolenaar      enddef
1086efa94447SBram Moolenaar  END
1087efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1088efa94447SBram Moolenaar  lines =<< trim END
1089efa94447SBram Moolenaar      vim9script
1090efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1091b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1092efa94447SBram Moolenaar  END
1093efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1094efa94447SBram Moolenaar
1095efa94447SBram Moolenaar  source Xmapscript.vim
1096b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1097efa94447SBram Moolenaar  assert_equal(42, g:result)
1098efa94447SBram Moolenaar
1099efa94447SBram Moolenaar  unlet g:result
1100efa94447SBram Moolenaar  delete('XsomeExport.vim')
1101efa94447SBram Moolenaar  delete('Xmapscript.vim')
1102b3ca9824SBram Moolenaar  nunmap <F3>
1103efa94447SBram Moolenaarenddef
1104efa94447SBram Moolenaar
1105750802b5SBram Moolenaardef Test_vim9script_fails()
11068a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11078a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1108cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
11099721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1110cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1111750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1112750802b5SBram Moolenaar
1113cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1114c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1115c785b9a7SBram Moolenaar
1116e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1117e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
11188a7d6542SBram Moolenaarenddef
11198a7d6542SBram Moolenaar
1120f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1121101f4810SBram Moolenaar  CheckRunVimInTerminal
1122101f4810SBram Moolenaar
11239bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1124c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11259bb3eb3eSBram Moolenaarendfunc
11269bb3eb3eSBram Moolenaar
1127c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1128cfcd011fSBram Moolenaar  var export =<< trim END
1129101f4810SBram Moolenaar    vim9script
1130101f4810SBram Moolenaar    export def Foo(): number
1131101f4810SBram Moolenaar        return 0
1132101f4810SBram Moolenaar    enddef
1133101f4810SBram Moolenaar  END
1134730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1135101f4810SBram Moolenaar
1136cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
11379bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11389bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1139101f4810SBram Moolenaar
1140730b2483SBram Moolenaar  delete('XexportCmd.vim')
11419bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11429bb3eb3eSBram Moolenaarenddef
1143101f4810SBram Moolenaar
11444c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1145cfcd011fSBram Moolenaar  var lines =<< trim END
11468a7d6542SBram Moolenaar    vim9script
11478a7d6542SBram Moolenaar    const var = ''
1148cfcd011fSBram Moolenaar    var valone = 1234
11498a7d6542SBram Moolenaar    def MyFunc(arg: string)
11508a7d6542SBram Moolenaar       valone = 5678
11518a7d6542SBram Moolenaar    enddef
11528a7d6542SBram Moolenaar  END
1153cfcd011fSBram Moolenaar  var morelines =<< trim END
1154cfcd011fSBram Moolenaar    var valtwo = 222
11558a7d6542SBram Moolenaar    export def GetValtwo(): number
11568a7d6542SBram Moolenaar      return valtwo
11578a7d6542SBram Moolenaar    enddef
11588a7d6542SBram Moolenaar  END
115903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11608a7d6542SBram Moolenaar  source Xreload.vim
11618a7d6542SBram Moolenaar  source Xreload.vim
11628a7d6542SBram Moolenaar  source Xreload.vim
11638a7d6542SBram Moolenaar
1164cfcd011fSBram Moolenaar  var testlines =<< trim END
11658a7d6542SBram Moolenaar    vim9script
11668a7d6542SBram Moolenaar    def TheFunc()
11678a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11688a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11698a7d6542SBram Moolenaar    enddef
11708a7d6542SBram Moolenaar    TheFunc()
11718a7d6542SBram Moolenaar  END
11728a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11738a7d6542SBram Moolenaar  source Ximport.vim
11748a7d6542SBram Moolenaar
1175f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1176f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11778a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11788a7d6542SBram Moolenaar  source Ximport.vim
11798a7d6542SBram Moolenaar
1180f5be8cdbSBram Moolenaar  # cannot declare a var twice
11818a7d6542SBram Moolenaar  lines =<< trim END
11828a7d6542SBram Moolenaar    vim9script
1183cfcd011fSBram Moolenaar    var valone = 1234
1184cfcd011fSBram Moolenaar    var valone = 5678
11858a7d6542SBram Moolenaar  END
11868a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
118744d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
11888a7d6542SBram Moolenaar
11898a7d6542SBram Moolenaar  delete('Xreload.vim')
11908a7d6542SBram Moolenaar  delete('Ximport.vim')
11918a7d6542SBram Moolenaarenddef
11928a7d6542SBram Moolenaar
119395006e3dSBram Moolenaardef s:RetSome(): string
119495006e3dSBram Moolenaar  return 'some'
119595006e3dSBram Moolenaarenddef
119695006e3dSBram Moolenaar
1197fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1198fe465a01SBram Moolenaar" script-local name.
1199fe465a01SBram Moolenaardef Test_vim9script_funcref()
1200cfcd011fSBram Moolenaar  var sortlines =<< trim END
1201fe465a01SBram Moolenaar      vim9script
1202fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1203bed36b93SBram Moolenaar        return i2 - i1
1204fe465a01SBram Moolenaar      enddef
1205fe465a01SBram Moolenaar
1206fe465a01SBram Moolenaar      export def FastSort(): list<number>
1207fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1208fe465a01SBram Moolenaar      enddef
1209fe465a01SBram Moolenaar  END
1210fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1211fe465a01SBram Moolenaar
1212cfcd011fSBram Moolenaar  var lines =<< trim END
1213fe465a01SBram Moolenaar    vim9script
1214fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1215fe465a01SBram Moolenaar    def Test()
1216fe465a01SBram Moolenaar      g:result = FastSort()
1217fe465a01SBram Moolenaar    enddef
1218fe465a01SBram Moolenaar    Test()
1219fe465a01SBram Moolenaar  END
1220fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1221fe465a01SBram Moolenaar
1222fe465a01SBram Moolenaar  source Xscript.vim
1223fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1224fe465a01SBram Moolenaar
1225fe465a01SBram Moolenaar  unlet g:result
1226fe465a01SBram Moolenaar  delete('Xsort.vim')
1227fe465a01SBram Moolenaar  delete('Xscript.vim')
122895006e3dSBram Moolenaar
1229cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
123095006e3dSBram Moolenaar  assert_equal('some', Funcref())
1231fe465a01SBram Moolenaarenddef
1232fe465a01SBram Moolenaar
1233601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1234601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1235601e76acSBram Moolenaar" function reference.
1236c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1237cfcd011fSBram Moolenaar  var filterLines =<< trim END
1238c620c055SBram Moolenaar    vim9script
1239c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1240c620c055SBram Moolenaar      return idx % 2 == 1
1241c620c055SBram Moolenaar    enddef
1242c620c055SBram Moolenaar    export def FastFilter(): list<number>
1243c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1244c620c055SBram Moolenaar    enddef
1245601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1246601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1247601e76acSBram Moolenaar    enddef
1248c620c055SBram Moolenaar  END
1249c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1250c620c055SBram Moolenaar
1251cfcd011fSBram Moolenaar  var lines =<< trim END
1252c620c055SBram Moolenaar    vim9script
1253601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1254c620c055SBram Moolenaar    def Test()
1255cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1256c620c055SBram Moolenaar    enddef
1257c620c055SBram Moolenaar    Test()
1258601e76acSBram Moolenaar    def TestDirect()
1259cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1260601e76acSBram Moolenaar    enddef
1261601e76acSBram Moolenaar    TestDirect()
1262c620c055SBram Moolenaar  END
1263601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1264c620c055SBram Moolenaar  delete('Xfilter.vim')
1265c620c055SBram Moolenaarenddef
1266c620c055SBram Moolenaar
12674c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1268cfcd011fSBram Moolenaar  var first_lines =<< trim END
12694c17ad94SBram Moolenaar    vim9script
12704c17ad94SBram Moolenaar    def FuncYes(): string
12714c17ad94SBram Moolenaar      return 'yes'
12724c17ad94SBram Moolenaar    enddef
12734c17ad94SBram Moolenaar  END
1274cfcd011fSBram Moolenaar  var withno_lines =<< trim END
12754c17ad94SBram Moolenaar    def FuncNo(): string
12764c17ad94SBram Moolenaar      return 'no'
12774c17ad94SBram Moolenaar    enddef
12784c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12794c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12804c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
128103afdcf1SBram Moolenaar    enddef
128203afdcf1SBram Moolenaar  END
1283cfcd011fSBram Moolenaar  var nono_lines =<< trim END
128403afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
128503afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
128644d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12874c17ad94SBram Moolenaar    enddef
12884c17ad94SBram Moolenaar  END
12894c17ad94SBram Moolenaar
12904c17ad94SBram Moolenaar  # FuncNo() is defined
129103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12924c17ad94SBram Moolenaar  source Xreloaded.vim
12934c17ad94SBram Moolenaar  g:DoCheck(true)
12944c17ad94SBram Moolenaar
12954c17ad94SBram Moolenaar  # FuncNo() is not redefined
129603afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12974c17ad94SBram Moolenaar  source Xreloaded.vim
129803afdcf1SBram Moolenaar  g:DoCheck()
12994c17ad94SBram Moolenaar
13004c17ad94SBram Moolenaar  # FuncNo() is back
130103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13024c17ad94SBram Moolenaar  source Xreloaded.vim
130303afdcf1SBram Moolenaar  g:DoCheck()
13044c17ad94SBram Moolenaar
13054c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13064c17ad94SBram Moolenaarenddef
13074c17ad94SBram Moolenaar
130889483d40SBram Moolenaardef Test_vim9script_reload_delvar()
130989483d40SBram Moolenaar  # write the script with a script-local variable
1310cfcd011fSBram Moolenaar  var lines =<< trim END
131189483d40SBram Moolenaar    vim9script
1312cfcd011fSBram Moolenaar    var name = 'string'
131389483d40SBram Moolenaar  END
131489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
131589483d40SBram Moolenaar  source XreloadVar.vim
131689483d40SBram Moolenaar
131789483d40SBram Moolenaar  # now write the script using the same variable locally - works
131889483d40SBram Moolenaar  lines =<< trim END
131989483d40SBram Moolenaar    vim9script
132089483d40SBram Moolenaar    def Func()
1321cfcd011fSBram Moolenaar      var name = 'string'
132289483d40SBram Moolenaar    enddef
132389483d40SBram Moolenaar  END
132489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
132589483d40SBram Moolenaar  source XreloadVar.vim
132689483d40SBram Moolenaar
132789483d40SBram Moolenaar  delete('XreloadVar.vim')
132889483d40SBram Moolenaarenddef
132989483d40SBram Moolenaar
13308a7d6542SBram Moolenaardef Test_import_absolute()
1331cfcd011fSBram Moolenaar  var import_lines = [
1332e6085c53SBram Moolenaar        'vim9script',
1333e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1334e6085c53SBram Moolenaar        'def UseExported()',
1335e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1336e6085c53SBram Moolenaar        '  exported = 8888',
1337e6085c53SBram Moolenaar        '  g:imported_after = exported',
1338e6085c53SBram Moolenaar        'enddef',
1339e6085c53SBram Moolenaar        'UseExported()',
1340e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1341e6085c53SBram Moolenaar        ]
13428a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13438a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13448a7d6542SBram Moolenaar
13458a7d6542SBram Moolenaar  source Ximport_abs.vim
13468a7d6542SBram Moolenaar
13478a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13484e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1349fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1350fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1351fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1352fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1353fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1354fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1355fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1356fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1357fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1358fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1359e6085c53SBram Moolenaar        g:import_disassembled)
1360b3ca9824SBram Moolenaar
1361b3ca9824SBram Moolenaar  Undo_export_script_lines()
13628a7d6542SBram Moolenaar  unlet g:imported_abs
13634e12a5dfSBram Moolenaar  unlet g:import_disassembled
13648a7d6542SBram Moolenaar
13658a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13668a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13678a7d6542SBram Moolenaarenddef
13688a7d6542SBram Moolenaar
13698a7d6542SBram Moolenaardef Test_import_rtp()
1370cfcd011fSBram Moolenaar  var import_lines = [
1371e6085c53SBram Moolenaar        'vim9script',
1372e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1373e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1374e6085c53SBram Moolenaar        ]
13758a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13768a7d6542SBram Moolenaar  mkdir('import')
13778a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13788a7d6542SBram Moolenaar
1379cfcd011fSBram Moolenaar  var save_rtp = &rtp
13808a7d6542SBram Moolenaar  &rtp = getcwd()
13818a7d6542SBram Moolenaar  source Ximport_rtp.vim
13828a7d6542SBram Moolenaar  &rtp = save_rtp
13838a7d6542SBram Moolenaar
13848a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13858a7d6542SBram Moolenaar
1386b3ca9824SBram Moolenaar  Undo_export_script_lines()
1387b3ca9824SBram Moolenaar  unlet g:imported_rtp
13888a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
138989483d40SBram Moolenaar  delete('import', 'rf')
13908a7d6542SBram Moolenaarenddef
13918a7d6542SBram Moolenaar
139225e0f586SBram Moolenaardef Test_import_compile_error()
1393cfcd011fSBram Moolenaar  var export_lines = [
139425e0f586SBram Moolenaar        'vim9script',
139525e0f586SBram Moolenaar        'export def ExpFunc(): string',
139625e0f586SBram Moolenaar        '  return notDefined',
139725e0f586SBram Moolenaar        'enddef',
139825e0f586SBram Moolenaar        ]
139925e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
140025e0f586SBram Moolenaar
1401cfcd011fSBram Moolenaar  var import_lines = [
140225e0f586SBram Moolenaar        'vim9script',
140325e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
140425e0f586SBram Moolenaar        'def ImpFunc()',
140525e0f586SBram Moolenaar        '  echo ExpFunc()',
140625e0f586SBram Moolenaar        'enddef',
140725e0f586SBram Moolenaar        'defcompile',
140825e0f586SBram Moolenaar        ]
140925e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
141025e0f586SBram Moolenaar
141125e0f586SBram Moolenaar  try
141225e0f586SBram Moolenaar    source Ximport.vim
141325e0f586SBram Moolenaar  catch /E1001/
1414f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
14157707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
141625e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
141725e0f586SBram Moolenaar  endtry
141825e0f586SBram Moolenaar
141925e0f586SBram Moolenaar  delete('Xexported.vim')
142025e0f586SBram Moolenaar  delete('Ximport.vim')
142125e0f586SBram Moolenaarenddef
142225e0f586SBram Moolenaar
1423c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1424cfcd011fSBram Moolenaar  var lines = [
1425c4ce36d4SBram Moolenaar        'vim9script',
1426c4ce36d4SBram Moolenaar        'def Func()',
1427c4ce36d4SBram Moolenaar        '  eval [][0]',
1428c4ce36d4SBram Moolenaar        'enddef',
1429c4ce36d4SBram Moolenaar        'Func()',
1430c4ce36d4SBram Moolenaar        ]
1431c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1432c4ce36d4SBram Moolenaar
1433c4ce36d4SBram Moolenaar  for count in range(3)
1434c4ce36d4SBram Moolenaar    try
1435c4ce36d4SBram Moolenaar      source Xtestscript.vim
1436c4ce36d4SBram Moolenaar    catch /E684/
1437c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1438c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1439c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1440c4ce36d4SBram Moolenaar    endtry
1441c4ce36d4SBram Moolenaar  endfor
1442c4ce36d4SBram Moolenaar
1443c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1444c4ce36d4SBram Moolenaarenddef
1445c4ce36d4SBram Moolenaar
1446eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1447cfcd011fSBram Moolenaar  var export_lines =<< trim END
1448eef2102eSBram Moolenaar      vim9script
1449eef2102eSBram Moolenaar      export def Func()
1450eef2102eSBram Moolenaar        echo 'imported'
1451eef2102eSBram Moolenaar      enddef
1452eef2102eSBram Moolenaar  END
1453eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1454eef2102eSBram Moolenaar
1455cfcd011fSBram Moolenaar  var lines =<< trim END
1456eef2102eSBram Moolenaar    vim9script
1457eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1458eef2102eSBram Moolenaar    def Func()
1459eef2102eSBram Moolenaar      echo 'local to function'
1460eef2102eSBram Moolenaar    enddef
1461eef2102eSBram Moolenaar  END
1462eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1463eef2102eSBram Moolenaar
1464eef2102eSBram Moolenaar  lines =<< trim END
1465eef2102eSBram Moolenaar    vim9script
1466eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1467eef2102eSBram Moolenaar    def Outer()
1468eef2102eSBram Moolenaar      def Func()
1469eef2102eSBram Moolenaar        echo 'local to function'
1470eef2102eSBram Moolenaar      enddef
1471eef2102eSBram Moolenaar    enddef
1472eef2102eSBram Moolenaar    defcompile
1473eef2102eSBram Moolenaar  END
1474eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1475eef2102eSBram Moolenaar
1476eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1477eef2102eSBram Moolenaarenddef
1478eef2102eSBram Moolenaar
1479b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1480cfcd011fSBram Moolenaar  var lines =<< trim END
1481b9a2cac3SBram Moolenaar    vim9script
1482b9a2cac3SBram Moolenaar    def Func()
1483b9a2cac3SBram Moolenaar      echo 'one'
1484b9a2cac3SBram Moolenaar    enddef
1485b9a2cac3SBram Moolenaar    def Func()
1486b9a2cac3SBram Moolenaar      echo 'two'
1487b9a2cac3SBram Moolenaar    enddef
1488b9a2cac3SBram Moolenaar  END
1489b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1490fa211f3cSBram Moolenaar
1491fa211f3cSBram Moolenaar  lines =<< trim END
1492fa211f3cSBram Moolenaar    vim9script
1493fa211f3cSBram Moolenaar    def Foo(): string
1494fa211f3cSBram Moolenaar      return 'foo'
1495fa211f3cSBram Moolenaar      enddef
1496fa211f3cSBram Moolenaar    def Func()
1497cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1498fa211f3cSBram Moolenaar    enddef
1499fa211f3cSBram Moolenaar    defcompile
1500fa211f3cSBram Moolenaar  END
1501fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1502b9a2cac3SBram Moolenaarenddef
1503b9a2cac3SBram Moolenaar
15048a7d6542SBram Moolenaardef Test_fixed_size_list()
1505f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1506cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
15078a7d6542SBram Moolenaar  l->remove(0)
15088a7d6542SBram Moolenaar  l->add(5)
15098a7d6542SBram Moolenaar  l->insert(99, 1)
15100f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
15118a7d6542SBram Moolenaarenddef
15128a7d6542SBram Moolenaar
1513ae616494SBram Moolenaardef Test_no_insert_xit()
1514d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1515d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1516d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1517d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1518d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1519ae616494SBram Moolenaar
1520ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1521ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1522ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1523ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1524f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1525f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1526f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1527f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1528f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1529ae616494SBram Moolenaarenddef
1530ae616494SBram Moolenaar
1531158906cfSBram Moolenaardef IfElse(what: number): string
1532cfcd011fSBram Moolenaar  var res = ''
1533158906cfSBram Moolenaar  if what == 1
1534158906cfSBram Moolenaar    res = "one"
1535158906cfSBram Moolenaar  elseif what == 2
1536158906cfSBram Moolenaar    res = "two"
1537a259d8d3SBram Moolenaar  else
1538158906cfSBram Moolenaar    res = "three"
1539a259d8d3SBram Moolenaar  endif
1540158906cfSBram Moolenaar  return res
1541a259d8d3SBram Moolenaarenddef
1542a259d8d3SBram Moolenaar
1543158906cfSBram Moolenaardef Test_if_elseif_else()
1544158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1545158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1546158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15470f18b6d1SBram Moolenaarenddef
15480f18b6d1SBram Moolenaar
1549e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1550d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1551d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1552d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1553d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1554d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1555e8c4abbbSBram Moolenaarenddef
1556e8c4abbbSBram Moolenaar
15576d69bf60SBram Moolenaarlet g:bool_true = v:true
15586d69bf60SBram Moolenaarlet g:bool_false = v:false
15596d69bf60SBram Moolenaar
15606d69bf60SBram Moolenaardef Test_if_const_expr()
1561cfcd011fSBram Moolenaar  var res = false
15626d69bf60SBram Moolenaar  if true ? true : false
15636d69bf60SBram Moolenaar    res = true
15646d69bf60SBram Moolenaar  endif
15656d69bf60SBram Moolenaar  assert_equal(true, res)
15666d69bf60SBram Moolenaar
1567585fea7bSBram Moolenaar  g:glob = 2
1568585fea7bSBram Moolenaar  if false
15696797966dSBram Moolenaar    execute('g:glob = 3')
1570585fea7bSBram Moolenaar  endif
1571585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1572585fea7bSBram Moolenaar  if true
15736797966dSBram Moolenaar    execute('g:glob = 3')
1574585fea7bSBram Moolenaar  endif
1575585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1576585fea7bSBram Moolenaar
15776d69bf60SBram Moolenaar  res = false
15786d69bf60SBram Moolenaar  if g:bool_true ? true : false
15796d69bf60SBram Moolenaar    res = true
15806d69bf60SBram Moolenaar  endif
15816d69bf60SBram Moolenaar  assert_equal(true, res)
15826d69bf60SBram Moolenaar
15836d69bf60SBram Moolenaar  res = false
15846d69bf60SBram Moolenaar  if true ? g:bool_true : false
15856d69bf60SBram Moolenaar    res = true
15866d69bf60SBram Moolenaar  endif
15876d69bf60SBram Moolenaar  assert_equal(true, res)
15886d69bf60SBram Moolenaar
15896d69bf60SBram Moolenaar  res = false
15906d69bf60SBram Moolenaar  if true ? true : g:bool_false
15916d69bf60SBram Moolenaar    res = true
15926d69bf60SBram Moolenaar  endif
15936d69bf60SBram Moolenaar  assert_equal(true, res)
15946d69bf60SBram Moolenaar
15956d69bf60SBram Moolenaar  res = false
15966d69bf60SBram Moolenaar  if true ? false : true
15976d69bf60SBram Moolenaar    res = true
15986d69bf60SBram Moolenaar  endif
15996d69bf60SBram Moolenaar  assert_equal(false, res)
16006d69bf60SBram Moolenaar
16016d69bf60SBram Moolenaar  res = false
16026d69bf60SBram Moolenaar  if false ? false : true
16036d69bf60SBram Moolenaar    res = true
16046d69bf60SBram Moolenaar  endif
16056d69bf60SBram Moolenaar  assert_equal(true, res)
16066d69bf60SBram Moolenaar
16076d69bf60SBram Moolenaar  res = false
16086d69bf60SBram Moolenaar  if false ? true : false
16096d69bf60SBram Moolenaar    res = true
16106d69bf60SBram Moolenaar  endif
16116d69bf60SBram Moolenaar  assert_equal(false, res)
16126d69bf60SBram Moolenaar
16136d69bf60SBram Moolenaar  res = false
1614e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1615e8c4abbbSBram Moolenaar    res = true
1616e8c4abbbSBram Moolenaar  endif
1617e8c4abbbSBram Moolenaar  assert_equal(false, res)
1618e8c4abbbSBram Moolenaar
1619e8c4abbbSBram Moolenaar  res = false
16206d69bf60SBram Moolenaar  if true && true
16216d69bf60SBram Moolenaar    res = true
16226d69bf60SBram Moolenaar  endif
16236d69bf60SBram Moolenaar  assert_equal(true, res)
16246d69bf60SBram Moolenaar
16256d69bf60SBram Moolenaar  res = false
16266d69bf60SBram Moolenaar  if true && false
16276d69bf60SBram Moolenaar    res = true
16286d69bf60SBram Moolenaar  endif
16296d69bf60SBram Moolenaar  assert_equal(false, res)
16306d69bf60SBram Moolenaar
16316d69bf60SBram Moolenaar  res = false
16326d69bf60SBram Moolenaar  if g:bool_true && false
16336d69bf60SBram Moolenaar    res = true
16346d69bf60SBram Moolenaar  endif
16356d69bf60SBram Moolenaar  assert_equal(false, res)
16366d69bf60SBram Moolenaar
16376d69bf60SBram Moolenaar  res = false
16386d69bf60SBram Moolenaar  if true && g:bool_false
16396d69bf60SBram Moolenaar    res = true
16406d69bf60SBram Moolenaar  endif
16416d69bf60SBram Moolenaar  assert_equal(false, res)
16426d69bf60SBram Moolenaar
16436d69bf60SBram Moolenaar  res = false
16446d69bf60SBram Moolenaar  if false && false
16456d69bf60SBram Moolenaar    res = true
16466d69bf60SBram Moolenaar  endif
16476d69bf60SBram Moolenaar  assert_equal(false, res)
16486d69bf60SBram Moolenaar
16496d69bf60SBram Moolenaar  res = false
16506d69bf60SBram Moolenaar  if true || false
16516d69bf60SBram Moolenaar    res = true
16526d69bf60SBram Moolenaar  endif
16536d69bf60SBram Moolenaar  assert_equal(true, res)
16546d69bf60SBram Moolenaar
16556d69bf60SBram Moolenaar  res = false
16566d69bf60SBram Moolenaar  if g:bool_true || false
16576d69bf60SBram Moolenaar    res = true
16586d69bf60SBram Moolenaar  endif
16596d69bf60SBram Moolenaar  assert_equal(true, res)
16606d69bf60SBram Moolenaar
16616d69bf60SBram Moolenaar  res = false
16626d69bf60SBram Moolenaar  if true || g:bool_false
16636d69bf60SBram Moolenaar    res = true
16646d69bf60SBram Moolenaar  endif
16656d69bf60SBram Moolenaar  assert_equal(true, res)
16666d69bf60SBram Moolenaar
16676d69bf60SBram Moolenaar  res = false
16686d69bf60SBram Moolenaar  if false || false
16696d69bf60SBram Moolenaar    res = true
16706d69bf60SBram Moolenaar  endif
16716d69bf60SBram Moolenaar  assert_equal(false, res)
16723988f64fSBram Moolenaar
16733988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16743988f64fSBram Moolenaar  if false | eval 0 | endif
16753988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16763988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16773988f64fSBram Moolenaar  if false
16783988f64fSBram Moolenaar    burp
16793988f64fSBram Moolenaar  endif
168080c34ca3SBram Moolenaarenddef
16816d69bf60SBram Moolenaar
168280c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1683d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1684d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1685d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1686d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16876d69bf60SBram Moolenaarenddef
16886d69bf60SBram Moolenaar
168972abcf42SBram Moolenaardef RunNested(i: number): number
1690cfcd011fSBram Moolenaar  var x: number = 0
169172abcf42SBram Moolenaar  if i % 2
169272abcf42SBram Moolenaar    if 1
1693f5be8cdbSBram Moolenaar      # comment
169472abcf42SBram Moolenaar    else
1695f5be8cdbSBram Moolenaar      # comment
169672abcf42SBram Moolenaar    endif
169772abcf42SBram Moolenaar    x += 1
169872abcf42SBram Moolenaar  else
169972abcf42SBram Moolenaar    x += 1000
170072abcf42SBram Moolenaar  endif
170172abcf42SBram Moolenaar  return x
170272abcf42SBram Moolenaarenddef
170372abcf42SBram Moolenaar
170472abcf42SBram Moolenaardef Test_nested_if()
170572abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
170672abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
170772abcf42SBram Moolenaarenddef
170872abcf42SBram Moolenaar
1709ad39c094SBram Moolenaardef Test_execute_cmd()
1710ad39c094SBram Moolenaar  new
1711ad39c094SBram Moolenaar  setline(1, 'default')
1712d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1713ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1714a72cfb80SBram Moolenaar
1715d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1716a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1717a72cfb80SBram Moolenaar
1718cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1719cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1720a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1721ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1722a72cfb80SBram Moolenaar
1723d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1724ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1725a72cfb80SBram Moolenaar
1726cfcd011fSBram Moolenaar  var cmd_first = 'call '
1727cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1728ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1729ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1730ad39c094SBram Moolenaar  bwipe!
1731585fea7bSBram Moolenaar
1732cfcd011fSBram Moolenaar  var n = true
17332d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
17342d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
17352d6b20d6SBram Moolenaar
1736e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
1737e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1738e5abf7afSBram Moolenaar
1739d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1740d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1741d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1742ad39c094SBram Moolenaarenddef
1743ad39c094SBram Moolenaar
174447e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1745f5be8cdbSBram Moolenaar  # only checks line continuation
1746cfcd011fSBram Moolenaar  var lines =<< trim END
174747e880d6SBram Moolenaar      vim9script
174847e880d6SBram Moolenaar      execute 'g:someVar'
174947e880d6SBram Moolenaar                .. ' = ' ..
175047e880d6SBram Moolenaar                   '28'
175147e880d6SBram Moolenaar      assert_equal(28, g:someVar)
175247e880d6SBram Moolenaar      unlet g:someVar
175347e880d6SBram Moolenaar  END
175447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
175547e880d6SBram Moolenaarenddef
175647e880d6SBram Moolenaar
1757ad39c094SBram Moolenaardef Test_echo_cmd()
1758a72cfb80SBram Moolenaar  echo 'some' # comment
1759585fea7bSBram Moolenaar  echon 'thing'
1760ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1761ad39c094SBram Moolenaar
1762a72cfb80SBram Moolenaar  echo "some" # comment
1763a72cfb80SBram Moolenaar  echon "thing"
1764a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1765a72cfb80SBram Moolenaar
1766cfcd011fSBram Moolenaar  var str1 = 'some'
1767cfcd011fSBram Moolenaar  var str2 = 'more'
1768ad39c094SBram Moolenaar  echo str1 str2
1769ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1770a72cfb80SBram Moolenaar
1771d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1772ad39c094SBram Moolenaarenddef
1773ad39c094SBram Moolenaar
1774f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1775f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1776f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1777f93c7feaSBram Moolenaar  echo 'clear'
1778df069eecSBram Moolenaar  :1messages
1779f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1780f93c7feaSBram Moolenaar
1781d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1782f93c7feaSBram Moolenaarenddef
1783f93c7feaSBram Moolenaar
178447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1785f5be8cdbSBram Moolenaar  # only checks line continuation
1786cfcd011fSBram Moolenaar  var lines =<< trim END
178747e880d6SBram Moolenaar      vim9script
178847e880d6SBram Moolenaar      echomsg 'here'
178947e880d6SBram Moolenaar                .. ' is ' ..
179047e880d6SBram Moolenaar                   'a message'
179147e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
179247e880d6SBram Moolenaar  END
179347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
179447e880d6SBram Moolenaarenddef
179547e880d6SBram Moolenaar
1796f93c7feaSBram Moolenaardef Test_echoerr_cmd()
179740ee466cSBram Moolenaar  try
179840ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
179940ee466cSBram Moolenaar  catch
180040ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
180140ee466cSBram Moolenaar  endtry
1802f93c7feaSBram Moolenaarenddef
1803f93c7feaSBram Moolenaar
180447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1805f5be8cdbSBram Moolenaar  # only checks line continuation
1806cfcd011fSBram Moolenaar  var lines =<< trim END
180747e880d6SBram Moolenaar      vim9script
180847e880d6SBram Moolenaar      try
180947e880d6SBram Moolenaar        echoerr 'this'
181047e880d6SBram Moolenaar                .. ' is ' ..
181147e880d6SBram Moolenaar                   'wrong'
181247e880d6SBram Moolenaar      catch
181347e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
181447e880d6SBram Moolenaar      endtry
181547e880d6SBram Moolenaar  END
181647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
181747e880d6SBram Moolenaarenddef
181847e880d6SBram Moolenaar
181941fe0617SBram Moolenaardef Test_for_outside_of_function()
1820cfcd011fSBram Moolenaar  var lines =<< trim END
182141fe0617SBram Moolenaar    vim9script
182241fe0617SBram Moolenaar    new
182341fe0617SBram Moolenaar    for var in range(0, 3)
182441fe0617SBram Moolenaar      append(line('$'), var)
182541fe0617SBram Moolenaar    endfor
182641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
182741fe0617SBram Moolenaar    bwipe!
182841fe0617SBram Moolenaar  END
182941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
183041fe0617SBram Moolenaar  source Xvim9for.vim
183141fe0617SBram Moolenaar  delete('Xvim9for.vim')
183241fe0617SBram Moolenaarenddef
18338a7d6542SBram Moolenaar
1834e8c4abbbSBram Moolenaardef Test_for_loop()
1835cfcd011fSBram Moolenaar  var result = ''
1836e8c4abbbSBram Moolenaar  for cnt in range(7)
1837e8c4abbbSBram Moolenaar    if cnt == 4
1838e8c4abbbSBram Moolenaar      break
1839e8c4abbbSBram Moolenaar    endif
1840e8c4abbbSBram Moolenaar    if cnt == 2
1841e8c4abbbSBram Moolenaar      continue
1842e8c4abbbSBram Moolenaar    endif
1843e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1844e8c4abbbSBram Moolenaar  endfor
1845e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18460ad3e894SBram Moolenaar
1847cfcd011fSBram Moolenaar  var concat = ''
18480ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18490ad3e894SBram Moolenaar    concat ..= str
18500ad3e894SBram Moolenaar  endfor
18510ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1852e8c4abbbSBram Moolenaarenddef
1853e8c4abbbSBram Moolenaar
1854e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1855675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1856675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1857cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1858822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1859451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1860675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1861675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1862675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1863e8c4abbbSBram Moolenaarenddef
1864e8c4abbbSBram Moolenaar
1865d0df1aacSBram Moolenaardef Test_while_loop()
1866cfcd011fSBram Moolenaar  var result = ''
1867cfcd011fSBram Moolenaar  var cnt = 0
1868d0df1aacSBram Moolenaar  while cnt < 555
1869d0df1aacSBram Moolenaar    if cnt == 3
1870d0df1aacSBram Moolenaar      break
1871d0df1aacSBram Moolenaar    endif
1872d0df1aacSBram Moolenaar    cnt += 1
1873d0df1aacSBram Moolenaar    if cnt == 2
1874d0df1aacSBram Moolenaar      continue
1875d0df1aacSBram Moolenaar    endif
1876d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1877d0df1aacSBram Moolenaar  endwhile
1878d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1879d0df1aacSBram Moolenaarenddef
1880d0df1aacSBram Moolenaar
1881e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1882675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1883675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1884675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1885675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1886675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1887675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1888675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1889bd5da371SBram Moolenaarenddef
1890bd5da371SBram Moolenaar
18919645e2d9SBram Moolenaardef Test_interrupt_loop()
1892cfcd011fSBram Moolenaar  var caught = false
1893cfcd011fSBram Moolenaar  var x = 0
189497acfc78SBram Moolenaar  try
18959645e2d9SBram Moolenaar    while 1
18969645e2d9SBram Moolenaar      x += 1
18979645e2d9SBram Moolenaar      if x == 100
18989645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18999645e2d9SBram Moolenaar      endif
19009645e2d9SBram Moolenaar    endwhile
190197acfc78SBram Moolenaar  catch
190297acfc78SBram Moolenaar    caught = true
190397acfc78SBram Moolenaar    assert_equal(100, x)
190497acfc78SBram Moolenaar  endtry
190597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
190625859dd7SBram Moolenaar  # consume the CTRL-C
190725859dd7SBram Moolenaar  getchar(0)
19089645e2d9SBram Moolenaarenddef
190920431c9dSBram Moolenaar
19104fdae999SBram Moolenaardef Test_automatic_line_continuation()
1911cfcd011fSBram Moolenaar  var mylist = [
19124fdae999SBram Moolenaar      'one',
19134fdae999SBram Moolenaar      'two',
19144fdae999SBram Moolenaar      'three',
1915f5be8cdbSBram Moolenaar      ] # comment
19164fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
19174fdae999SBram Moolenaar
1918cfcd011fSBram Moolenaar  var mydict = {
19194fdae999SBram Moolenaar      'one': 1,
19204fdae999SBram Moolenaar      'two': 2,
19214fdae999SBram Moolenaar      'three':
19224fdae999SBram Moolenaar          3,
1923f5be8cdbSBram Moolenaar      } # comment
19244fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
19254fdae999SBram Moolenaar  mydict = #{
19262c330432SBram Moolenaar      one: 1,  # comment
19272c330432SBram Moolenaar      two:     # comment
19282c330432SBram Moolenaar           2,  # comment
19292c330432SBram Moolenaar      three: 3 # comment
19302c330432SBram Moolenaar      }
19312c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
19322c330432SBram Moolenaar  mydict = #{
19332c330432SBram Moolenaar      one: 1,
19344fdae999SBram Moolenaar      two:
19354fdae999SBram Moolenaar           2,
19362c330432SBram Moolenaar      three: 3
19374fdae999SBram Moolenaar      }
19384fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1939e6085c53SBram Moolenaar
1940e6085c53SBram Moolenaar  assert_equal(
1941e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1942e6085c53SBram Moolenaar        split('one two three')
1943e6085c53SBram Moolenaar        )
19444fdae999SBram Moolenaarenddef
19454fdae999SBram Moolenaar
19467a092245SBram Moolenaardef Test_vim9_comment()
19477a092245SBram Moolenaar  CheckScriptSuccess([
19487a092245SBram Moolenaar      'vim9script',
19497a092245SBram Moolenaar      '# something',
19507a092245SBram Moolenaar      ])
19517a092245SBram Moolenaar  CheckScriptFailure([
19527a092245SBram Moolenaar      'vim9script',
19537a092245SBram Moolenaar      ':# something',
19547a092245SBram Moolenaar      ], 'E488:')
19557a092245SBram Moolenaar  CheckScriptFailure([
19567a092245SBram Moolenaar      '# something',
19577a092245SBram Moolenaar      ], 'E488:')
19587a092245SBram Moolenaar  CheckScriptFailure([
19597a092245SBram Moolenaar      ':# something',
19607a092245SBram Moolenaar      ], 'E488:')
19617a092245SBram Moolenaar
19624a8d9f2eSBram Moolenaar  { # block start
19634a8d9f2eSBram Moolenaar  } # block end
19644a8d9f2eSBram Moolenaar  CheckDefFailure([
19654a8d9f2eSBram Moolenaar      '{# comment',
19664a8d9f2eSBram Moolenaar      ], 'E488:')
19674a8d9f2eSBram Moolenaar  CheckDefFailure([
19684a8d9f2eSBram Moolenaar      '{',
19694a8d9f2eSBram Moolenaar      '}# comment',
19704a8d9f2eSBram Moolenaar      ], 'E488:')
19714a8d9f2eSBram Moolenaar
19724a8d9f2eSBram Moolenaar  echo "yes" # comment
19734a8d9f2eSBram Moolenaar  CheckDefFailure([
19744a8d9f2eSBram Moolenaar      'echo "yes"# comment',
19754a8d9f2eSBram Moolenaar      ], 'E488:')
19767a092245SBram Moolenaar  CheckScriptSuccess([
19777a092245SBram Moolenaar      'vim9script',
19787a092245SBram Moolenaar      'echo "yes" # something',
19797a092245SBram Moolenaar      ])
19807a092245SBram Moolenaar  CheckScriptFailure([
19817a092245SBram Moolenaar      'vim9script',
19827a092245SBram Moolenaar      'echo "yes"# something',
19837a092245SBram Moolenaar      ], 'E121:')
19847a092245SBram Moolenaar  CheckScriptFailure([
19857a092245SBram Moolenaar      'vim9script',
19867a092245SBram Moolenaar      'echo# something',
19877a092245SBram Moolenaar      ], 'E121:')
19887a092245SBram Moolenaar  CheckScriptFailure([
19897a092245SBram Moolenaar      'echo "yes" # something',
19907a092245SBram Moolenaar      ], 'E121:')
19917a092245SBram Moolenaar
19924a8d9f2eSBram Moolenaar  exe "echo" # comment
19934a8d9f2eSBram Moolenaar  CheckDefFailure([
19944a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19954a8d9f2eSBram Moolenaar      ], 'E488:')
19964a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19974a8d9f2eSBram Moolenaar      'vim9script',
19984a8d9f2eSBram Moolenaar      'exe "echo" # something',
19994a8d9f2eSBram Moolenaar      ])
20004a8d9f2eSBram Moolenaar  CheckScriptFailure([
20014a8d9f2eSBram Moolenaar      'vim9script',
20024a8d9f2eSBram Moolenaar      'exe "echo"# something',
20034a8d9f2eSBram Moolenaar      ], 'E121:')
20044a8d9f2eSBram Moolenaar  CheckDefFailure([
20054a8d9f2eSBram Moolenaar      'exe # comment',
20064a8d9f2eSBram Moolenaar      ], 'E1015:')
20074a8d9f2eSBram Moolenaar  CheckScriptFailure([
20084a8d9f2eSBram Moolenaar      'vim9script',
20094a8d9f2eSBram Moolenaar      'exe# something',
20104a8d9f2eSBram Moolenaar      ], 'E121:')
20114a8d9f2eSBram Moolenaar  CheckScriptFailure([
20124a8d9f2eSBram Moolenaar      'exe "echo" # something',
20134a8d9f2eSBram Moolenaar      ], 'E121:')
20144a8d9f2eSBram Moolenaar
20157a092245SBram Moolenaar  CheckDefFailure([
20167a092245SBram Moolenaar      'try# comment',
20177a092245SBram Moolenaar      '  echo "yes"',
20187a092245SBram Moolenaar      'catch',
20197a092245SBram Moolenaar      'endtry',
20207a092245SBram Moolenaar      ], 'E488:')
20212c5ed4e3SBram Moolenaar  CheckScriptFailure([
20222c5ed4e3SBram Moolenaar      'vim9script',
20232c5ed4e3SBram Moolenaar      'try# comment',
20242c5ed4e3SBram Moolenaar      'echo "yes"',
20252c5ed4e3SBram Moolenaar      ], 'E488:')
20267a092245SBram Moolenaar  CheckDefFailure([
20277a092245SBram Moolenaar      'try',
2028a72cfb80SBram Moolenaar      '  throw#comment',
2029a72cfb80SBram Moolenaar      'catch',
2030a72cfb80SBram Moolenaar      'endtry',
2031a72cfb80SBram Moolenaar      ], 'E1015:')
2032a72cfb80SBram Moolenaar  CheckDefFailure([
2033a72cfb80SBram Moolenaar      'try',
2034a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2035a72cfb80SBram Moolenaar      'catch',
2036a72cfb80SBram Moolenaar      'endtry',
2037a72cfb80SBram Moolenaar      ], 'E488:')
2038a72cfb80SBram Moolenaar  CheckDefFailure([
2039a72cfb80SBram Moolenaar      'try',
20407a092245SBram Moolenaar      '  echo "yes"',
20417a092245SBram Moolenaar      'catch# comment',
20427a092245SBram Moolenaar      'endtry',
20437a092245SBram Moolenaar      ], 'E488:')
20442c5ed4e3SBram Moolenaar  CheckScriptFailure([
20452c5ed4e3SBram Moolenaar      'vim9script',
20462c5ed4e3SBram Moolenaar      'try',
20472c5ed4e3SBram Moolenaar      '  echo "yes"',
20482c5ed4e3SBram Moolenaar      'catch# comment',
20492c5ed4e3SBram Moolenaar      'endtry',
20502c5ed4e3SBram Moolenaar      ], 'E654:')
20512c5ed4e3SBram Moolenaar  CheckDefFailure([
20522c5ed4e3SBram Moolenaar      'try',
20532c5ed4e3SBram Moolenaar      '  echo "yes"',
20542c5ed4e3SBram Moolenaar      'catch /pat/# comment',
20552c5ed4e3SBram Moolenaar      'endtry',
20562c5ed4e3SBram Moolenaar      ], 'E488:')
20577a092245SBram Moolenaar  CheckDefFailure([
20587a092245SBram Moolenaar      'try',
20597a092245SBram Moolenaar      'echo "yes"',
20607a092245SBram Moolenaar      'catch',
20617a092245SBram Moolenaar      'endtry# comment',
20627a092245SBram Moolenaar      ], 'E488:')
20632c5ed4e3SBram Moolenaar  CheckScriptFailure([
20642c5ed4e3SBram Moolenaar      'vim9script',
20652c5ed4e3SBram Moolenaar      'try',
20662c5ed4e3SBram Moolenaar      '  echo "yes"',
20672c5ed4e3SBram Moolenaar      'catch',
20682c5ed4e3SBram Moolenaar      'endtry# comment',
20699b7bf9e9SBram Moolenaar      ], 'E488:')
20702c5ed4e3SBram Moolenaar
20712c5ed4e3SBram Moolenaar  CheckScriptSuccess([
20722c5ed4e3SBram Moolenaar      'vim9script',
20732c5ed4e3SBram Moolenaar      'hi # comment',
20742c5ed4e3SBram Moolenaar      ])
20752c5ed4e3SBram Moolenaar  CheckScriptFailure([
20762c5ed4e3SBram Moolenaar      'vim9script',
20772c5ed4e3SBram Moolenaar      'hi# comment',
20782c5ed4e3SBram Moolenaar      ], 'E416:')
20791966c248SBram Moolenaar  CheckScriptSuccess([
20801966c248SBram Moolenaar      'vim9script',
20811966c248SBram Moolenaar      'hi Search # comment',
20821966c248SBram Moolenaar      ])
20831966c248SBram Moolenaar  CheckScriptFailure([
20841966c248SBram Moolenaar      'vim9script',
20851966c248SBram Moolenaar      'hi Search# comment',
20861966c248SBram Moolenaar      ], 'E416:')
20871966c248SBram Moolenaar  CheckScriptSuccess([
20881966c248SBram Moolenaar      'vim9script',
20891966c248SBram Moolenaar      'hi link This Search # comment',
20901966c248SBram Moolenaar      ])
20911966c248SBram Moolenaar  CheckScriptFailure([
20921966c248SBram Moolenaar      'vim9script',
20931966c248SBram Moolenaar      'hi link This That# comment',
20941966c248SBram Moolenaar      ], 'E413:')
20951966c248SBram Moolenaar  CheckScriptSuccess([
20961966c248SBram Moolenaar      'vim9script',
20971966c248SBram Moolenaar      'hi clear This # comment',
20981966c248SBram Moolenaar      'hi clear # comment',
20991966c248SBram Moolenaar      ])
2100f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2101f5be8cdbSBram Moolenaar  # hi clear This# comment',
21021966c248SBram Moolenaar  CheckScriptFailure([
21031966c248SBram Moolenaar      'vim9script',
21041966c248SBram Moolenaar      'hi clear# comment',
21051966c248SBram Moolenaar      ], 'E416:')
21061966c248SBram Moolenaar
21071966c248SBram Moolenaar  CheckScriptSuccess([
21081966c248SBram Moolenaar      'vim9script',
21091966c248SBram Moolenaar      'hi Group term=bold',
21101966c248SBram Moolenaar      'match Group /todo/ # comment',
21111966c248SBram Moolenaar      ])
21121966c248SBram Moolenaar  CheckScriptFailure([
21131966c248SBram Moolenaar      'vim9script',
21141966c248SBram Moolenaar      'hi Group term=bold',
21151966c248SBram Moolenaar      'match Group /todo/# comment',
21161966c248SBram Moolenaar      ], 'E488:')
21171966c248SBram Moolenaar  CheckScriptSuccess([
21181966c248SBram Moolenaar      'vim9script',
21191966c248SBram Moolenaar      'match # comment',
21201966c248SBram Moolenaar      ])
21211966c248SBram Moolenaar  CheckScriptFailure([
21221966c248SBram Moolenaar      'vim9script',
21231966c248SBram Moolenaar      'match# comment',
21241966c248SBram Moolenaar      ], 'E475:')
21251966c248SBram Moolenaar  CheckScriptSuccess([
21261966c248SBram Moolenaar      'vim9script',
21271966c248SBram Moolenaar      'match none # comment',
21281966c248SBram Moolenaar      ])
21291966c248SBram Moolenaar  CheckScriptFailure([
21301966c248SBram Moolenaar      'vim9script',
21311966c248SBram Moolenaar      'match none# comment',
21321966c248SBram Moolenaar      ], 'E475:')
21331966c248SBram Moolenaar
21341966c248SBram Moolenaar  CheckScriptSuccess([
21351966c248SBram Moolenaar      'vim9script',
21361966c248SBram Moolenaar      'menutrans clear # comment',
21371966c248SBram Moolenaar      ])
21381966c248SBram Moolenaar  CheckScriptFailure([
21391966c248SBram Moolenaar      'vim9script',
21401966c248SBram Moolenaar      'menutrans clear# comment text',
21411966c248SBram Moolenaar      ], 'E474:')
21421966c248SBram Moolenaar
21431966c248SBram Moolenaar  CheckScriptSuccess([
21441966c248SBram Moolenaar      'vim9script',
21451966c248SBram Moolenaar      'syntax clear # comment',
21461966c248SBram Moolenaar      ])
21471966c248SBram Moolenaar  CheckScriptFailure([
21481966c248SBram Moolenaar      'vim9script',
21491966c248SBram Moolenaar      'syntax clear# comment text',
21501966c248SBram Moolenaar      ], 'E28:')
21511966c248SBram Moolenaar  CheckScriptSuccess([
21521966c248SBram Moolenaar      'vim9script',
21531966c248SBram Moolenaar      'syntax keyword Word some',
21541966c248SBram Moolenaar      'syntax clear Word # comment',
21551966c248SBram Moolenaar      ])
21561966c248SBram Moolenaar  CheckScriptFailure([
21571966c248SBram Moolenaar      'vim9script',
21581966c248SBram Moolenaar      'syntax keyword Word some',
21591966c248SBram Moolenaar      'syntax clear Word# comment text',
21601966c248SBram Moolenaar      ], 'E28:')
21611966c248SBram Moolenaar
21621966c248SBram Moolenaar  CheckScriptSuccess([
21631966c248SBram Moolenaar      'vim9script',
21641966c248SBram Moolenaar      'syntax list # comment',
21651966c248SBram Moolenaar      ])
21661966c248SBram Moolenaar  CheckScriptFailure([
21671966c248SBram Moolenaar      'vim9script',
21681966c248SBram Moolenaar      'syntax list# comment text',
21691966c248SBram Moolenaar      ], 'E28:')
21701966c248SBram Moolenaar
21711966c248SBram Moolenaar  CheckScriptSuccess([
21721966c248SBram Moolenaar      'vim9script',
21731966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
21741966c248SBram Moolenaar      ])
21751966c248SBram Moolenaar  CheckScriptFailure([
21761966c248SBram Moolenaar      'vim9script',
21771966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
21781966c248SBram Moolenaar      ], 'E475:')
21791966c248SBram Moolenaar
21801966c248SBram Moolenaar  CheckScriptSuccess([
21811966c248SBram Moolenaar      'vim9script',
21821966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21831966c248SBram Moolenaar      ])
21841966c248SBram Moolenaar  CheckScriptFailure([
21851966c248SBram Moolenaar      'vim9script',
21861966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21871966c248SBram Moolenaar      ], 'E789:')
21881966c248SBram Moolenaar
21891966c248SBram Moolenaar  CheckScriptSuccess([
21901966c248SBram Moolenaar      'vim9script',
21911966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21921966c248SBram Moolenaar      ])
21931966c248SBram Moolenaar  CheckScriptFailure([
21941966c248SBram Moolenaar      'vim9script',
21951966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21961966c248SBram Moolenaar      ], 'E402:')
21971966c248SBram Moolenaar
21981966c248SBram Moolenaar  CheckScriptSuccess([
21991966c248SBram Moolenaar      'vim9script',
22001966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
22011966c248SBram Moolenaar      ])
22021966c248SBram Moolenaar  CheckScriptFailure([
22031966c248SBram Moolenaar      'vim9script',
22041966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
22051966c248SBram Moolenaar      ], 'E475:')
22061966c248SBram Moolenaar  CheckScriptFailure([
22071966c248SBram Moolenaar      'vim9script',
22081966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
22091966c248SBram Moolenaar      ], 'E406:')
22101966c248SBram Moolenaar  CheckScriptFailure([
22111966c248SBram Moolenaar      'vim9script',
22121966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
22131966c248SBram Moolenaar      ], 'E475:')
22141966c248SBram Moolenaar
22151966c248SBram Moolenaar  CheckScriptSuccess([
22161966c248SBram Moolenaar      'vim9script',
22171966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
22181966c248SBram Moolenaar      ])
22191966c248SBram Moolenaar  CheckScriptFailure([
22201966c248SBram Moolenaar      'vim9script',
22211966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2222d032f34aSBram Moolenaar      ], 'E402:')
22231966c248SBram Moolenaar
22241966c248SBram Moolenaar  CheckScriptSuccess([
22251966c248SBram Moolenaar      'vim9script',
22261966c248SBram Moolenaar      'syntax sync # comment',
22271966c248SBram Moolenaar      ])
22281966c248SBram Moolenaar  CheckScriptFailure([
22291966c248SBram Moolenaar      'vim9script',
22301966c248SBram Moolenaar      'syntax sync# comment',
22311966c248SBram Moolenaar      ], 'E404:')
22321966c248SBram Moolenaar  CheckScriptSuccess([
22331966c248SBram Moolenaar      'vim9script',
22341966c248SBram Moolenaar      'syntax sync ccomment # comment',
22351966c248SBram Moolenaar      ])
22361966c248SBram Moolenaar  CheckScriptFailure([
22371966c248SBram Moolenaar      'vim9script',
22381966c248SBram Moolenaar      'syntax sync ccomment# comment',
22391966c248SBram Moolenaar      ], 'E404:')
22401966c248SBram Moolenaar
22411966c248SBram Moolenaar  CheckScriptSuccess([
22421966c248SBram Moolenaar      'vim9script',
22431966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
22441966c248SBram Moolenaar      ])
22451966c248SBram Moolenaar  CheckScriptFailure([
22461966c248SBram Moolenaar      'vim9script',
22471966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
22481966c248SBram Moolenaar      ], 'E475:')
2249a72cfb80SBram Moolenaar
2250a72cfb80SBram Moolenaar  CheckScriptSuccess([
2251a72cfb80SBram Moolenaar      'vim9script',
2252a72cfb80SBram Moolenaar      'command Echo echo # comment',
2253a72cfb80SBram Moolenaar      'command Echo # comment',
2254a72cfb80SBram Moolenaar      ])
2255a72cfb80SBram Moolenaar  CheckScriptFailure([
2256a72cfb80SBram Moolenaar      'vim9script',
2257a72cfb80SBram Moolenaar      'command Echo echo# comment',
2258a72cfb80SBram Moolenaar      'Echo',
2259a72cfb80SBram Moolenaar      ], 'E121:')
2260a72cfb80SBram Moolenaar  CheckScriptFailure([
2261a72cfb80SBram Moolenaar      'vim9script',
2262a72cfb80SBram Moolenaar      'command Echo# comment',
2263a72cfb80SBram Moolenaar      ], 'E182:')
2264a72cfb80SBram Moolenaar  CheckScriptFailure([
2265a72cfb80SBram Moolenaar      'vim9script',
2266a72cfb80SBram Moolenaar      'command Echo echo',
2267a72cfb80SBram Moolenaar      'command Echo# comment',
2268a72cfb80SBram Moolenaar      ], 'E182:')
2269a72cfb80SBram Moolenaar
2270a72cfb80SBram Moolenaar  CheckScriptSuccess([
2271a72cfb80SBram Moolenaar      'vim9script',
2272a72cfb80SBram Moolenaar      'function # comment',
2273a72cfb80SBram Moolenaar      ])
2274a72cfb80SBram Moolenaar  CheckScriptFailure([
2275a72cfb80SBram Moolenaar      'vim9script',
22769898107fSBram Moolenaar      'function " comment',
22779898107fSBram Moolenaar      ], 'E129:')
22789898107fSBram Moolenaar  CheckScriptFailure([
22799898107fSBram Moolenaar      'vim9script',
2280a72cfb80SBram Moolenaar      'function# comment',
2281a72cfb80SBram Moolenaar      ], 'E129:')
2282a72cfb80SBram Moolenaar  CheckScriptSuccess([
2283a72cfb80SBram Moolenaar      'vim9script',
2284a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2285a72cfb80SBram Moolenaar      ])
2286a72cfb80SBram Moolenaar  CheckScriptFailure([
2287a72cfb80SBram Moolenaar      'vim9script',
2288a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2289a72cfb80SBram Moolenaar      ], 'E488:')
2290a72cfb80SBram Moolenaar
2291a72cfb80SBram Moolenaar  CheckScriptSuccess([
2292a72cfb80SBram Moolenaar      'vim9script',
22934c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2294a72cfb80SBram Moolenaar      'endfunc',
22954c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2296a72cfb80SBram Moolenaar      ])
2297a72cfb80SBram Moolenaar  CheckScriptFailure([
2298a72cfb80SBram Moolenaar      'vim9script',
22994c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2300a72cfb80SBram Moolenaar      'endfunc',
23014c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2302a72cfb80SBram Moolenaar      ], 'E488:')
2303a72cfb80SBram Moolenaar
2304a72cfb80SBram Moolenaar  CheckScriptSuccess([
2305a72cfb80SBram Moolenaar      'vim9script',
2306a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2307a72cfb80SBram Moolenaar      ])
2308a72cfb80SBram Moolenaar  CheckScriptFailure([
2309a72cfb80SBram Moolenaar      'vim9script',
2310a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2311a72cfb80SBram Moolenaar      ], 'E488:')
2312e7e4838fSBram Moolenaar
2313e7e4838fSBram Moolenaar  CheckScriptFailure([
2314e7e4838fSBram Moolenaar      'def Test() " comment',
2315e7e4838fSBram Moolenaar      'enddef',
2316e7e4838fSBram Moolenaar      ], 'E488:')
2317e7e4838fSBram Moolenaar  CheckScriptFailure([
2318e7e4838fSBram Moolenaar      'vim9script',
2319e7e4838fSBram Moolenaar      'def Test() " comment',
2320e7e4838fSBram Moolenaar      'enddef',
2321e7e4838fSBram Moolenaar      ], 'E488:')
2322e7e4838fSBram Moolenaar
2323e7e4838fSBram Moolenaar  CheckScriptSuccess([
2324e7e4838fSBram Moolenaar      'func Test() " comment',
2325e7e4838fSBram Moolenaar      'endfunc',
2326e7e4838fSBram Moolenaar      ])
23279898107fSBram Moolenaar  CheckScriptSuccess([
2328e7e4838fSBram Moolenaar      'vim9script',
2329e7e4838fSBram Moolenaar      'func Test() " comment',
2330e7e4838fSBram Moolenaar      'endfunc',
23319898107fSBram Moolenaar      ])
2332e7e4838fSBram Moolenaar
2333e7e4838fSBram Moolenaar  CheckScriptSuccess([
2334e7e4838fSBram Moolenaar      'def Test() # comment',
2335e7e4838fSBram Moolenaar      'enddef',
2336e7e4838fSBram Moolenaar      ])
2337e7e4838fSBram Moolenaar  CheckScriptFailure([
2338e7e4838fSBram Moolenaar      'func Test() # comment',
2339e7e4838fSBram Moolenaar      'endfunc',
2340e7e4838fSBram Moolenaar      ], 'E488:')
23412c5ed4e3SBram Moolenaarenddef
23422c5ed4e3SBram Moolenaar
23432c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
23442c5ed4e3SBram Moolenaar  CheckCanRunGui
23452c5ed4e3SBram Moolenaar
23462c5ed4e3SBram Moolenaar  CheckScriptFailure([
23472c5ed4e3SBram Moolenaar      'vim9script',
23482c5ed4e3SBram Moolenaar      'gui#comment'
23492c5ed4e3SBram Moolenaar      ], 'E499:')
23502c5ed4e3SBram Moolenaar  CheckScriptFailure([
23512c5ed4e3SBram Moolenaar      'vim9script',
23522c5ed4e3SBram Moolenaar      'gui -f#comment'
23532c5ed4e3SBram Moolenaar      ], 'E499:')
23547a092245SBram Moolenaarenddef
23557a092245SBram Moolenaar
2356a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
23576797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
23586797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2359a26b9700SBram Moolenaar
2360a26b9700SBram Moolenaar  edit test.vim
2361a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2362a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2363a26b9700SBram Moolenaar
2364a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2365a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2366a26b9700SBram Moolenaar
2367a26b9700SBram Moolenaar  g:entered = 0
2368a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2369a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2370a26b9700SBram Moolenaar
2371a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2372a26b9700SBram Moolenaar
2373a26b9700SBram Moolenaar  au! TabEnter
2374a26b9700SBram Moolenaar  unlet g:entered
2375d72c1bf0SBram Moolenaar
2376d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2377d72c1bf0SBram Moolenaar      'vim9script',
23786797966dSBram Moolenaar      'g:var = 123',
2379e55b1c09SBram Moolenaar      'b:var = 456',
2380e55b1c09SBram Moolenaar      'w:var = 777',
2381e55b1c09SBram Moolenaar      't:var = 888',
2382d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2383d72c1bf0SBram Moolenaar      ])
2384d72c1bf0SBram Moolenaar
2385d72c1bf0SBram Moolenaar  CheckScriptFailure([
2386d72c1bf0SBram Moolenaar      'vim9script',
2387cfcd011fSBram Moolenaar      'let var = 123',
2388cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2389cfcd011fSBram Moolenaar
2390cfcd011fSBram Moolenaar  CheckScriptFailure([
2391cfcd011fSBram Moolenaar      'vim9script',
2392cfcd011fSBram Moolenaar      'var g:var = 123',
2393e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2394e55b1c09SBram Moolenaar
2395e55b1c09SBram Moolenaar  CheckScriptFailure([
2396e55b1c09SBram Moolenaar      'vim9script',
2397cfcd011fSBram Moolenaar      'var b:var = 123',
2398e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2399e55b1c09SBram Moolenaar
2400e55b1c09SBram Moolenaar  CheckScriptFailure([
2401e55b1c09SBram Moolenaar      'vim9script',
2402cfcd011fSBram Moolenaar      'var w:var = 123',
2403e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2404e55b1c09SBram Moolenaar
2405e55b1c09SBram Moolenaar  CheckScriptFailure([
2406e55b1c09SBram Moolenaar      'vim9script',
2407cfcd011fSBram Moolenaar      'var t:var = 123',
2408e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2409e55b1c09SBram Moolenaar
2410e55b1c09SBram Moolenaar  CheckScriptFailure([
2411e55b1c09SBram Moolenaar      'vim9script',
2412cfcd011fSBram Moolenaar      'var v:version = 123',
2413e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2414e55b1c09SBram Moolenaar
2415e55b1c09SBram Moolenaar  CheckScriptFailure([
2416e55b1c09SBram Moolenaar      'vim9script',
2417cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2418e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
24196797966dSBram Moolenaar
24206797966dSBram Moolenaar  CheckScriptFailure([
24216797966dSBram Moolenaar      'vim9script',
24226797966dSBram Moolenaar      'g:var = 123',
242332e35117SBram Moolenaar      'unlet g:var# comment1',
2424d72c1bf0SBram Moolenaar      ], 'E108:')
2425d72c1bf0SBram Moolenaar
2426d72c1bf0SBram Moolenaar  CheckScriptFailure([
2427d72c1bf0SBram Moolenaar      'let g:var = 123',
2428d72c1bf0SBram Moolenaar      'unlet g:var # something',
2429d72c1bf0SBram Moolenaar      ], 'E488:')
2430faac4104SBram Moolenaar
2431faac4104SBram Moolenaar  CheckScriptSuccess([
2432faac4104SBram Moolenaar      'vim9script',
243332e35117SBram Moolenaar      'if 1 # comment2',
2434faac4104SBram Moolenaar      '  echo "yes"',
2435faac4104SBram Moolenaar      'elseif 2 #comment',
2436faac4104SBram Moolenaar      '  echo "no"',
2437faac4104SBram Moolenaar      'endif',
2438faac4104SBram Moolenaar      ])
2439faac4104SBram Moolenaar
2440faac4104SBram Moolenaar  CheckScriptFailure([
2441faac4104SBram Moolenaar      'vim9script',
244232e35117SBram Moolenaar      'if 1# comment3',
2443faac4104SBram Moolenaar      '  echo "yes"',
2444faac4104SBram Moolenaar      'endif',
2445faac4104SBram Moolenaar      ], 'E15:')
2446faac4104SBram Moolenaar
2447faac4104SBram Moolenaar  CheckScriptFailure([
2448faac4104SBram Moolenaar      'vim9script',
244932e35117SBram Moolenaar      'if 0 # comment4',
2450faac4104SBram Moolenaar      '  echo "yes"',
2451faac4104SBram Moolenaar      'elseif 2#comment',
2452faac4104SBram Moolenaar      '  echo "no"',
2453faac4104SBram Moolenaar      'endif',
2454faac4104SBram Moolenaar      ], 'E15:')
2455faac4104SBram Moolenaar
2456faac4104SBram Moolenaar  CheckScriptSuccess([
2457faac4104SBram Moolenaar      'vim9script',
2458cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2459faac4104SBram Moolenaar      ])
2460faac4104SBram Moolenaar
2461faac4104SBram Moolenaar  CheckScriptFailure([
2462faac4104SBram Moolenaar      'vim9script',
2463cfcd011fSBram Moolenaar      'var v = 1# comment6',
246432e35117SBram Moolenaar      ], 'E15:')
2465faac4104SBram Moolenaar
2466faac4104SBram Moolenaar  CheckScriptSuccess([
2467faac4104SBram Moolenaar      'vim9script',
2468faac4104SBram Moolenaar      'new'
2469d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2470df069eecSBram Moolenaar      ':$',
2471faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2472faac4104SBram Moolenaar      'bwipe!',
2473faac4104SBram Moolenaar      ])
2474faac4104SBram Moolenaar
2475f5be8cdbSBram Moolenaar  CheckScriptFailure([
2476f5be8cdbSBram Moolenaar      'vim9script',
2477f5be8cdbSBram Moolenaar      'new'
2478d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2479f5be8cdbSBram Moolenaar      ':$',
2480f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2481f5be8cdbSBram Moolenaar      'bwipe!',
2482f5be8cdbSBram Moolenaar      ], 'E488:')
2483f5be8cdbSBram Moolenaar
2484f5be8cdbSBram Moolenaar  CheckScriptFailure([
2485f5be8cdbSBram Moolenaar      'vim9script',
2486f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2487f5be8cdbSBram Moolenaar      ], 'E477:')
2488a26b9700SBram Moolenaarenddef
2489a26b9700SBram Moolenaar
24907e5bd91dSBram Moolenaardef Test_finish()
2491cfcd011fSBram Moolenaar  var lines =<< trim END
24927e5bd91dSBram Moolenaar    vim9script
24936797966dSBram Moolenaar    g:res = 'one'
24947e5bd91dSBram Moolenaar    if v:false | finish | endif
24956797966dSBram Moolenaar    g:res = 'two'
24967e5bd91dSBram Moolenaar    finish
24976797966dSBram Moolenaar    g:res = 'three'
24987e5bd91dSBram Moolenaar  END
24997e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
25007e5bd91dSBram Moolenaar  source Xfinished
25017e5bd91dSBram Moolenaar  assert_equal('two', g:res)
25027e5bd91dSBram Moolenaar
25037e5bd91dSBram Moolenaar  unlet g:res
25047e5bd91dSBram Moolenaar  delete('Xfinished')
25057e5bd91dSBram Moolenaarenddef
25067e5bd91dSBram Moolenaar
2507a5d0077eSBram Moolenaardef Test_forward_declaration()
2508cfcd011fSBram Moolenaar  var lines =<< trim END
2509a5d0077eSBram Moolenaar    vim9script
2510a5d0077eSBram Moolenaar    def GetValue(): string
2511a5d0077eSBram Moolenaar      return theVal
2512a5d0077eSBram Moolenaar    enddef
2513cfcd011fSBram Moolenaar    var theVal = 'something'
2514822ba247SBram Moolenaar    g:initVal = GetValue()
2515a5d0077eSBram Moolenaar    theVal = 'else'
2516a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2517a5d0077eSBram Moolenaar  END
2518a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2519a5d0077eSBram Moolenaar  source Xforward
2520a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2521a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2522a5d0077eSBram Moolenaar
2523a5d0077eSBram Moolenaar  unlet g:initVal
2524a5d0077eSBram Moolenaar  unlet g:laterVal
2525a5d0077eSBram Moolenaar  delete('Xforward')
2526a5d0077eSBram Moolenaarenddef
2527a5d0077eSBram Moolenaar
25289721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2529cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
25309721fb4eSBram Moolenaar    source Xvim9_script.vim
25319721fb4eSBram Moolenaar
25329721fb4eSBram Moolenaar    call assert_false(exists('local'))
25339721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25349721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
25359721fb4eSBram Moolenaar    call assert_equal('global', global)
25369721fb4eSBram Moolenaar    call assert_equal('global', g:global)
25379721fb4eSBram Moolenaar
25389721fb4eSBram Moolenaar    " imported variable becomes script-local
25399721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
25409721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
25419721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25429721fb4eSBram Moolenaar
25439721fb4eSBram Moolenaar    " imported function becomes script-local
25449721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
25459721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
25469721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
25479721fb4eSBram Moolenaar  END
25489721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
25499721fb4eSBram Moolenaar
2550cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
25519721fb4eSBram Moolenaar    vim9script
2552cfcd011fSBram Moolenaar    var local = 'local'
25539721fb4eSBram Moolenaar    g:global = 'global'
2554cfcd011fSBram Moolenaar    export var exported = 'exported'
25559721fb4eSBram Moolenaar    export def GetText(): string
25569721fb4eSBram Moolenaar       return 'text'
25579721fb4eSBram Moolenaar    enddef
25589721fb4eSBram Moolenaar  END
25599721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25609721fb4eSBram Moolenaar
25619721fb4eSBram Moolenaar  source Xlegacy_script.vim
25629721fb4eSBram Moolenaar
25639721fb4eSBram Moolenaar  assert_equal('global', g:global)
2564f5be8cdbSBram Moolenaar  unlet g:global
25659721fb4eSBram Moolenaar
25669721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25679721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25689721fb4eSBram Moolenaarenddef
2569a5d0077eSBram Moolenaar
25707d699701SBram Moolenaarfunc Test_vim9script_not_global()
25717d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
25727d699701SBram Moolenaar  let vim9lines =<< trim END
25737d699701SBram Moolenaar    vim9script
2574cfcd011fSBram Moolenaar    var name = 'local'
25757d699701SBram Moolenaar    func TheFunc()
25767d699701SBram Moolenaar      echo 'local'
25777d699701SBram Moolenaar    endfunc
25787d699701SBram Moolenaar    def DefFunc()
25797d699701SBram Moolenaar      echo 'local'
25807d699701SBram Moolenaar    enddef
25817d699701SBram Moolenaar  END
25827d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
25837d699701SBram Moolenaar  source Xvim9script.vim
25847d699701SBram Moolenaar  try
25857d699701SBram Moolenaar    echo g:var
25867d699701SBram Moolenaar    assert_report('did not fail')
25877d699701SBram Moolenaar  catch /E121:/
25887d699701SBram Moolenaar    " caught
25897d699701SBram Moolenaar  endtry
25907d699701SBram Moolenaar  try
25917d699701SBram Moolenaar    call TheFunc()
25927d699701SBram Moolenaar    assert_report('did not fail')
25937d699701SBram Moolenaar  catch /E117:/
25947d699701SBram Moolenaar    " caught
25957d699701SBram Moolenaar  endtry
25967d699701SBram Moolenaar  try
25977d699701SBram Moolenaar    call DefFunc()
25987d699701SBram Moolenaar    assert_report('did not fail')
25997d699701SBram Moolenaar  catch /E117:/
26007d699701SBram Moolenaar    " caught
26017d699701SBram Moolenaar  endtry
26027d699701SBram Moolenaar
260325859dd7SBram Moolenaar  call delete('Xvim9script.vim')
26047d699701SBram Moolenaarendfunc
26057d699701SBram Moolenaar
2606eeb27bfeSBram Moolenaardef Test_vim9_copen()
2607eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2608eeb27bfeSBram Moolenaar  copen
2609eeb27bfeSBram Moolenaar  quit
2610eeb27bfeSBram Moolenaarenddef
2611eeb27bfeSBram Moolenaar
26122d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
26132d6b20d6SBram Moolenaardef Test_vim9_autoload()
2614cfcd011fSBram Moolenaar  var lines =<< trim END
26152d6b20d6SBram Moolenaar     vim9script
26162d6b20d6SBram Moolenaar     def foo#test()
26172d6b20d6SBram Moolenaar         echomsg getreg('"')
26182d6b20d6SBram Moolenaar     enddef
26192d6b20d6SBram Moolenaar  END
26202d6b20d6SBram Moolenaar
26212d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
26222d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2623cfcd011fSBram Moolenaar  var save_rtp = &rtp
26242d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
26252d6b20d6SBram Moolenaar  augroup test
26262d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
26272d6b20d6SBram Moolenaar  augroup END
26282d6b20d6SBram Moolenaar
26292d6b20d6SBram Moolenaar  normal Y
26302d6b20d6SBram Moolenaar
26312d6b20d6SBram Moolenaar  augroup test
26322d6b20d6SBram Moolenaar    autocmd!
26332d6b20d6SBram Moolenaar  augroup END
26342d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
26352d6b20d6SBram Moolenaar  &rtp = save_rtp
26362d6b20d6SBram Moolenaarenddef
26372d6b20d6SBram Moolenaar
263877e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
263977e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2640cfcd011fSBram Moolenaar  var lines =<< trim END
264177e5dcc3SBram Moolenaar      vim9script
264277e5dcc3SBram Moolenaar      def crash#func()
264377e5dcc3SBram Moolenaar          try
264477e5dcc3SBram Moolenaar              for x in List()
264577e5dcc3SBram Moolenaar              endfor
264677e5dcc3SBram Moolenaar          catch
264777e5dcc3SBram Moolenaar          endtry
264877e5dcc3SBram Moolenaar          g:ok = true
264977e5dcc3SBram Moolenaar      enddef
265077e5dcc3SBram Moolenaar      fu List()
265177e5dcc3SBram Moolenaar          invalid
265277e5dcc3SBram Moolenaar      endfu
265377e5dcc3SBram Moolenaar      try
265477e5dcc3SBram Moolenaar          invalid
265577e5dcc3SBram Moolenaar      catch /wontmatch/
265677e5dcc3SBram Moolenaar      endtry
265777e5dcc3SBram Moolenaar  END
265877e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
265977e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
266077e5dcc3SBram Moolenaar
266177e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
266277e5dcc3SBram Moolenaar  lines =<< trim END
266377e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
266477e5dcc3SBram Moolenaar    call crash#func()
266577e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
26669c4f5520SBram Moolenaar    qall!
266777e5dcc3SBram Moolenaar  END
266877e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
266977e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
267077e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
267177e5dcc3SBram Moolenaar
267277e5dcc3SBram Moolenaar  delete('Xdidit')
267377e5dcc3SBram Moolenaar  delete('Xscript')
267477e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
267577e5dcc3SBram Moolenaarenddef
267677e5dcc3SBram Moolenaar
267781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
267881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
267981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2680cfcd011fSBram Moolenaar  var lines =<< trim END
268181e17fbeSBram Moolenaar    let s:counter = 1
268281e17fbeSBram Moolenaar    def s:Func()
268381e17fbeSBram Moolenaar      au! CursorHold
268481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
268581e17fbeSBram Moolenaar    enddef
268681e17fbeSBram Moolenaar    call s:Func()
268781e17fbeSBram Moolenaar    doau CursorHold
268881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
268981e17fbeSBram Moolenaar    au! CursorHold
269081e17fbeSBram Moolenaar  END
269181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
269281e17fbeSBram Moolenaarenddef
269381e17fbeSBram Moolenaar
26943896a105SBram Moolenaardef Test_cmdline_win()
26953896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
26963896a105SBram Moolenaar  # the command line window.
26973896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2698cfcd011fSBram Moolenaar  var export_lines =<< trim END
26993896a105SBram Moolenaar    vim9script
2700cfcd011fSBram Moolenaar    export var That = 'yes'
27013896a105SBram Moolenaar  END
27023896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2703cfcd011fSBram Moolenaar  var import_lines =<< trim END
27043896a105SBram Moolenaar    vim9script
27053896a105SBram Moolenaar    import That from './Xexport.vim'
27063896a105SBram Moolenaar  END
27073896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2708cfcd011fSBram Moolenaar  var save_rtp = &rtp
27093896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
27103896a105SBram Moolenaar  syntax on
27113896a105SBram Moolenaar  augroup CmdWin
27123896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
27133896a105SBram Moolenaar  augroup END
27143896a105SBram Moolenaar  # this will open and also close the cmdline window
27153896a105SBram Moolenaar  feedkeys('q:', 'xt')
27163896a105SBram Moolenaar  assert_equal('yes', g:got_there)
27173896a105SBram Moolenaar
27183896a105SBram Moolenaar  augroup CmdWin
27193896a105SBram Moolenaar    au!
27203896a105SBram Moolenaar  augroup END
27213896a105SBram Moolenaar  &rtp = save_rtp
27223896a105SBram Moolenaar  delete('rtp', 'rf')
27233896a105SBram Moolenaarenddef
27243896a105SBram Moolenaar
2725e3d4685fSBram Moolenaardef Test_invalid_sid()
2726e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
272725859dd7SBram Moolenaar
27289c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2729d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2730e3d4685fSBram Moolenaar  endif
2731e3d4685fSBram Moolenaar  delete('Xdidit')
2732e3d4685fSBram Moolenaarenddef
2733e3d4685fSBram Moolenaar
2734f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2735cfcd011fSBram Moolenaar  var lines =<< trim END
2736cfcd011fSBram Moolenaar    var name: any
2737cfcd011fSBram Moolenaar    assert_equal(0, name)
2738f0afd9e1SBram Moolenaar  END
2739f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2740f0afd9e1SBram Moolenaarenddef
2741f0afd9e1SBram Moolenaar
27427e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
274358dbef33SBram Moolenaar  CheckRunVimInTerminal
274458dbef33SBram Moolenaar
27457e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
27467e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
27477e9210eaSBram Moolenaarendfunc
27487e9210eaSBram Moolenaar
27497e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
27509c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2751cfcd011fSBram Moolenaar  var lines =<< trim END
27529c4f5520SBram Moolenaar    func CheckAndQuit()
27539c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
27549c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
27559c4f5520SBram Moolenaar    endfunc
27569c4f5520SBram Moolenaar  END
27579c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
27589c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2759cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6})
27609c4f5520SBram Moolenaar  # define Afunc() on the command line
27619c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
27629c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
27639c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
27649c4f5520SBram Moolenaar
27659c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
27669c4f5520SBram Moolenaar  delete('XcallFunc')
27679c4f5520SBram Moolenaar  delete('Xdidcmd')
27689c4f5520SBram Moolenaarenddef
27699c4f5520SBram Moolenaar
2770fcdc5d83SBram Moolenaardef Test_script_var_scope()
2771fcdc5d83SBram Moolenaar  var lines =<< trim END
2772fcdc5d83SBram Moolenaar      vim9script
2773fcdc5d83SBram Moolenaar      if true
2774fcdc5d83SBram Moolenaar        if true
2775fcdc5d83SBram Moolenaar          var one = 'one'
2776fcdc5d83SBram Moolenaar          echo one
2777fcdc5d83SBram Moolenaar        endif
2778fcdc5d83SBram Moolenaar        echo one
2779fcdc5d83SBram Moolenaar      endif
2780fcdc5d83SBram Moolenaar  END
2781fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2782fcdc5d83SBram Moolenaar
2783fcdc5d83SBram Moolenaar  lines =<< trim END
2784fcdc5d83SBram Moolenaar      vim9script
2785fcdc5d83SBram Moolenaar      if true
2786fcdc5d83SBram Moolenaar        if false
2787fcdc5d83SBram Moolenaar          var one = 'one'
2788fcdc5d83SBram Moolenaar          echo one
2789fcdc5d83SBram Moolenaar        else
2790fcdc5d83SBram Moolenaar          var one = 'one'
2791fcdc5d83SBram Moolenaar          echo one
2792fcdc5d83SBram Moolenaar        endif
2793fcdc5d83SBram Moolenaar        echo one
2794fcdc5d83SBram Moolenaar      endif
2795fcdc5d83SBram Moolenaar  END
2796fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
2797fcdc5d83SBram Moolenaar
2798fcdc5d83SBram Moolenaar  lines =<< trim END
2799fcdc5d83SBram Moolenaar      vim9script
2800fcdc5d83SBram Moolenaar      while true
2801fcdc5d83SBram Moolenaar        var one = 'one'
2802fcdc5d83SBram Moolenaar        echo one
2803fcdc5d83SBram Moolenaar        break
2804fcdc5d83SBram Moolenaar      endwhile
2805fcdc5d83SBram Moolenaar      echo one
2806fcdc5d83SBram Moolenaar  END
2807fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2808fcdc5d83SBram Moolenaar
2809fcdc5d83SBram Moolenaar  lines =<< trim END
2810fcdc5d83SBram Moolenaar      vim9script
2811fcdc5d83SBram Moolenaar      for i in range(1)
2812fcdc5d83SBram Moolenaar        var one = 'one'
2813fcdc5d83SBram Moolenaar        echo one
2814fcdc5d83SBram Moolenaar      endfor
2815fcdc5d83SBram Moolenaar      echo one
2816fcdc5d83SBram Moolenaar  END
2817fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
28189becdf2bSBram Moolenaar
28199becdf2bSBram Moolenaar  lines =<< trim END
28209becdf2bSBram Moolenaar      vim9script
28219becdf2bSBram Moolenaar      {
28229becdf2bSBram Moolenaar        var one = 'one'
28239becdf2bSBram Moolenaar        assert_equal('one', one)
28249becdf2bSBram Moolenaar      }
28259becdf2bSBram Moolenaar      assert_false(exists('one'))
28269becdf2bSBram Moolenaar      assert_false(exists('s:one'))
28279becdf2bSBram Moolenaar  END
28289becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
28299becdf2bSBram Moolenaar
28309becdf2bSBram Moolenaar  lines =<< trim END
28319becdf2bSBram Moolenaar      vim9script
28329becdf2bSBram Moolenaar      {
28339becdf2bSBram Moolenaar        var one = 'one'
28349becdf2bSBram Moolenaar        echo one
28359becdf2bSBram Moolenaar      }
28369becdf2bSBram Moolenaar      echo one
28379becdf2bSBram Moolenaar  END
28389becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
2839fcdc5d83SBram Moolenaarenddef
2840fcdc5d83SBram Moolenaar
2841352134bbSBram Moolenaardef Test_catch_exception_in_callback()
2842352134bbSBram Moolenaar  var lines =<< trim END
2843352134bbSBram Moolenaar    vim9script
2844352134bbSBram Moolenaar    def Callback(...l: any)
2845352134bbSBram Moolenaar      try
2846352134bbSBram Moolenaar        var x: string
2847352134bbSBram Moolenaar        var y: string
2848352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
2849352134bbSBram Moolenaar        [x, y] = ['']
2850352134bbSBram Moolenaar      catch
2851352134bbSBram Moolenaar        g:caught = 'yes'
2852352134bbSBram Moolenaar      endtry
2853352134bbSBram Moolenaar    enddef
2854352134bbSBram Moolenaar    popup_menu('popup', #{callback: Callback})
2855352134bbSBram Moolenaar    feedkeys("\r", 'xt')
2856352134bbSBram Moolenaar  END
2857352134bbSBram Moolenaar  CheckScriptSuccess(lines)
2858352134bbSBram Moolenaar
2859352134bbSBram Moolenaar  unlet g:caught
2860352134bbSBram Moolenaarenddef
2861352134bbSBram Moolenaar
2862631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
2863631e8f93SBram Moolenaar  if !has('unix') || !has('job')
2864631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
2865631e8f93SBram Moolenaar  endif
2866631e8f93SBram Moolenaar  var lines =<< trim END
2867631e8f93SBram Moolenaar      vim9script
2868631e8f93SBram Moolenaar      var source: list<number>
2869631e8f93SBram Moolenaar      def Out_cb(...l: any)
2870631e8f93SBram Moolenaar          eval [][0]
2871631e8f93SBram Moolenaar      enddef
2872631e8f93SBram Moolenaar      def Exit_cb(...l: any)
2873631e8f93SBram Moolenaar          sleep 1m
2874631e8f93SBram Moolenaar          source += l
2875631e8f93SBram Moolenaar      enddef
2876631e8f93SBram Moolenaar      var myjob = job_start('echo burp', #{out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
2877631e8f93SBram Moolenaar      sleep 100m
2878631e8f93SBram Moolenaar  END
2879631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
2880631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
2881631e8f93SBram Moolenaar  delete('Xdef')
2882631e8f93SBram Moolenaarenddef
2883631e8f93SBram Moolenaar
2884b4bcea47SBram Moolenaardef Test_put_with_linebreak()
2885b4bcea47SBram Moolenaar  new
2886b4bcea47SBram Moolenaar  var lines =<< trim END
2887b4bcea47SBram Moolenaar    vim9script
2888b4bcea47SBram Moolenaar    pu=split('abc', '\zs')
2889b4bcea47SBram Moolenaar            ->join()
2890b4bcea47SBram Moolenaar  END
2891b4bcea47SBram Moolenaar  CheckScriptSuccess(lines)
2892b4bcea47SBram Moolenaar  getline(2)->assert_equal('a b c')
2893b4bcea47SBram Moolenaar  bwipe!
2894b4bcea47SBram Moolenaarenddef
2895b4bcea47SBram Moolenaar
2896585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2897585fea7bSBram Moolenaardef Test_substitute_cmd()
2898585fea7bSBram Moolenaar  new
2899585fea7bSBram Moolenaar  setline(1, 'something')
2900585fea7bSBram Moolenaar  :substitute(some(other(
2901585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2902585fea7bSBram Moolenaar  bwipe!
2903585fea7bSBram Moolenaar
2904f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2905cfcd011fSBram Moolenaar  var lines =<< trim END
2906585fea7bSBram Moolenaar    vim9script
2907585fea7bSBram Moolenaar    new
2908585fea7bSBram Moolenaar    setline(1, 'something')
2909585fea7bSBram Moolenaar    :substitute(some(other(
2910585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2911585fea7bSBram Moolenaar    bwipe!
2912585fea7bSBram Moolenaar  END
2913585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2914585fea7bSBram Moolenaar  source Xvim9lines
2915585fea7bSBram Moolenaar
2916585fea7bSBram Moolenaar  delete('Xvim9lines')
2917585fea7bSBram Moolenaarenddef
2918585fea7bSBram Moolenaar
29198a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2920