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
78a7d6542SBram Moolenaar
88a7d6542SBram Moolenaardef Test_syntax()
98a7d6542SBram Moolenaar  let var = 234
108a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
118a7d6542SBram Moolenaarenddef
128a7d6542SBram Moolenaar
136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
146e587dcbSBram Moolenaarlet s:addToMe = 111
15401d9ffbSBram Moolenaarlet g:existing = 'yes'
16a8c17704SBram Moolenaarlet g:inc_counter = 1
17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
18a6e67e4fSBram Moolenaarlet g:alist = [7]
19a6e67e4fSBram Moolenaarlet g:astring = 'text'
206e587dcbSBram Moolenaar
218a7d6542SBram Moolenaardef Test_assignment()
228a7d6542SBram Moolenaar  let bool1: bool = true
238a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
248a7d6542SBram Moolenaar  let bool2: bool = false
258a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
268a7d6542SBram Moolenaar
27f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
28f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
291cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
30f93c7feaSBram Moolenaar
319be61bbbSBram Moolenaar  let a: number = 6
329be61bbbSBram Moolenaar  assert_equal(6, a)
339be61bbbSBram Moolenaar
3442a480bfSBram Moolenaar  if has('channel')
3542a480bfSBram Moolenaar    let chan1: channel
36fbdd08edSBram Moolenaar    let job1: job
37f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
3842a480bfSBram Moolenaar  endif
39fbdd08edSBram Moolenaar  if has('float')
40fbdd08edSBram Moolenaar    let float1: float = 3.4
41fbdd08edSBram Moolenaar  endif
425deeb3f1SBram Moolenaar  let Funky1: func
435deeb3f1SBram Moolenaar  let Funky2: func = function('len')
444c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4542a480bfSBram Moolenaar
46401d9ffbSBram Moolenaar  g:newvar = 'new'
47401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
48401d9ffbSBram Moolenaar
49401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
50401d9ffbSBram Moolenaar  g:existing = 'no'
51401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
52401d9ffbSBram Moolenaar
53b283a8a6SBram Moolenaar  v:char = 'abc'
546e587dcbSBram Moolenaar  assert_equal('abc', v:char)
55b283a8a6SBram Moolenaar
56b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
576e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
58b283a8a6SBram Moolenaar  $ENVVAR = ''
596e587dcbSBram Moolenaar
60fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
61fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
62fd1823e0SBram Moolenaar  s:addToMe += 222
63fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
640bbf722aSBram Moolenaar  s:newVar = 'new'
650bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
66a8c17704SBram Moolenaar
67a8c17704SBram Moolenaar  set ts=7
68a8c17704SBram Moolenaar  &ts += 1
69a8c17704SBram Moolenaar  assert_equal(8, &ts)
7080c34ca3SBram Moolenaar  &ts -= 3
7180c34ca3SBram Moolenaar  assert_equal(5, &ts)
7280c34ca3SBram Moolenaar  &ts *= 2
7380c34ca3SBram Moolenaar  assert_equal(10, &ts)
7480c34ca3SBram Moolenaar  &ts /= 3
7580c34ca3SBram Moolenaar  assert_equal(3, &ts)
7680c34ca3SBram Moolenaar  set ts=10
7780c34ca3SBram Moolenaar  &ts %= 4
7880c34ca3SBram Moolenaar  assert_equal(2, &ts)
79a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
80a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
81a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
82a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
83a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
84a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
85a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
86a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
87cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
88585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
8980c34ca3SBram Moolenaar  &ts = 8
90a8c17704SBram Moolenaar
91a8c17704SBram Moolenaar  g:inc_counter += 1
92a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
93a8c17704SBram Moolenaar
94a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
95a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
96a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
97a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
98a8c17704SBram Moolenaar
99a8c17704SBram Moolenaar  @a = 'areg'
100a8c17704SBram Moolenaar  @a ..= 'add'
101a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
102a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
103a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
104e69f6d04SBram Moolenaar
105e69f6d04SBram Moolenaar  v:errmsg = 'none'
106e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
107e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
108e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
109e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1105deeb3f1SBram Moolenaarenddef
1115deeb3f1SBram Moolenaar
1123b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1133b74b6b4SBram Moolenaar  let lines =<< trim END
1143b74b6b4SBram Moolenaar      vim9script
1153b74b6b4SBram Moolenaar
116f5be8cdbSBram Moolenaar      # single character variable declarations work
1173b74b6b4SBram Moolenaar      let a: string
1183b74b6b4SBram Moolenaar      let b: number
1193b74b6b4SBram Moolenaar      let l: list<any>
1203b74b6b4SBram Moolenaar      let s: string
1213b74b6b4SBram Moolenaar      let t: number
1223b74b6b4SBram Moolenaar      let v: number
1233b74b6b4SBram Moolenaar      let w: number
1243b74b6b4SBram Moolenaar
125f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1263b74b6b4SBram Moolenaar      a = 'script-a'
1273b74b6b4SBram Moolenaar      b = 111
1283b74b6b4SBram Moolenaar      l = [1, 2, 3]
1293b74b6b4SBram Moolenaar      s = 'script-s'
1303b74b6b4SBram Moolenaar      t = 222
1313b74b6b4SBram Moolenaar      v = 333
1323b74b6b4SBram Moolenaar      w = 444
1333b74b6b4SBram Moolenaar
1343b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1353b74b6b4SBram Moolenaar      assert_equal(111, b)
1363b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
1373b74b6b4SBram Moolenaar      assert_equal('script-s', s)
1383b74b6b4SBram Moolenaar      assert_equal(222, t)
1393b74b6b4SBram Moolenaar      assert_equal(333, v)
1403b74b6b4SBram Moolenaar      assert_equal(444, w)
1413b74b6b4SBram Moolenaar  END
1423b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
1433b74b6b4SBram Moolenaar  source Xsinglechar
1443b74b6b4SBram Moolenaar  delete('Xsinglechar')
1453b74b6b4SBram Moolenaarenddef
1463b74b6b4SBram Moolenaar
14784370087SBram Moolenaardef Test_assignment_list()
14884370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
14984370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
15084370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
15184370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
15284370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
15384370087SBram Moolenaar
15484370087SBram Moolenaar  let listS: list<string> = []
15584370087SBram Moolenaar  let listN: list<number> = []
15684370087SBram Moolenaar
15784370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
15884370087SBram Moolenaar  list2[-1] = 99
15984370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
16084370087SBram Moolenaar  list2[-2] = 88
16184370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
16284370087SBram Moolenaar  list2[-3] = 77
16384370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
16484370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
165c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
16684370087SBram Moolenaar
16784370087SBram Moolenaar  # type becomes list<any>
16884370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
16984370087SBram Moolenaarenddef
17084370087SBram Moolenaar
17184370087SBram Moolenaardef Test_assignment_dict()
17284370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
17384370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
17484370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
17584370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
17674fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
17784370087SBram Moolenaar
178f5be8cdbSBram Moolenaar  # overwrite
179c785b9a7SBram Moolenaar  dict3['key'] = 'another'
180c785b9a7SBram Moolenaar
18184370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
18284370087SBram Moolenaar
18384370087SBram Moolenaar  # type becomes dict<any>
18484370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
18584370087SBram Moolenaarenddef
18684370087SBram Moolenaar
187d3aac291SBram Moolenaardef Test_assignment_local()
188f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
189f5be8cdbSBram Moolenaar  # changed.
190d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
191d3aac291SBram Moolenaar    let b:existing = 'yes'
192d3aac291SBram Moolenaar    let w:existing = 'yes'
193d3aac291SBram Moolenaar    let t:existing = 'yes'
194d3aac291SBram Moolenaar
195d3aac291SBram Moolenaar    def Test_assignment_local_internal()
196d3aac291SBram Moolenaar      b:newvar = 'new'
197d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
198d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
199d3aac291SBram Moolenaar      b:existing = 'no'
200d3aac291SBram Moolenaar      assert_equal('no', b:existing)
201396f3138SBram Moolenaar      b:existing ..= 'NO'
202396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
203d3aac291SBram Moolenaar
204d3aac291SBram Moolenaar      w:newvar = 'new'
205d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
206d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
207d3aac291SBram Moolenaar      w:existing = 'no'
208d3aac291SBram Moolenaar      assert_equal('no', w:existing)
209396f3138SBram Moolenaar      w:existing ..= 'NO'
210396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
211d3aac291SBram Moolenaar
212d3aac291SBram Moolenaar      t:newvar = 'new'
213d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
214d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
215d3aac291SBram Moolenaar      t:existing = 'no'
216d3aac291SBram Moolenaar      assert_equal('no', t:existing)
217396f3138SBram Moolenaar      t:existing ..= 'NO'
218396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
219d3aac291SBram Moolenaar    enddef
220d3aac291SBram Moolenaar    call Test_assignment_local_internal()
221d3aac291SBram Moolenaar  END
222d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
223d3aac291SBram Moolenaarenddef
224d3aac291SBram Moolenaar
2255deeb3f1SBram Moolenaardef Test_assignment_default()
226e69f6d04SBram Moolenaar
227cb711abfSBram Moolenaar  # Test default values.
228e69f6d04SBram Moolenaar  let thebool: bool
229e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
230e69f6d04SBram Moolenaar
231e69f6d04SBram Moolenaar  let thenumber: number
232e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
233e69f6d04SBram Moolenaar
234e69f6d04SBram Moolenaar  if has('float')
235e69f6d04SBram Moolenaar    let thefloat: float
236e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
237e69f6d04SBram Moolenaar  endif
238e69f6d04SBram Moolenaar
239e69f6d04SBram Moolenaar  let thestring: string
240e69f6d04SBram Moolenaar  assert_equal('', thestring)
241e69f6d04SBram Moolenaar
242e69f6d04SBram Moolenaar  let theblob: blob
243e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
244e69f6d04SBram Moolenaar
2455deeb3f1SBram Moolenaar  let Thefunc: func
2465deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
247e69f6d04SBram Moolenaar
248e69f6d04SBram Moolenaar  let thelist: list<any>
249e69f6d04SBram Moolenaar  assert_equal([], thelist)
250e69f6d04SBram Moolenaar
251e69f6d04SBram Moolenaar  let thedict: dict<any>
252e69f6d04SBram Moolenaar  assert_equal({}, thedict)
253e69f6d04SBram Moolenaar
2542c869deeSBram Moolenaar  if has('channel')
255e69f6d04SBram Moolenaar    let thejob: job
256e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
257e69f6d04SBram Moolenaar
258e69f6d04SBram Moolenaar    let thechannel: channel
259e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
260c785b9a7SBram Moolenaar
261c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
262f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
263c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
264c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
265c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
266c785b9a7SBram Moolenaar    endif
2672c869deeSBram Moolenaar  endif
268585fea7bSBram Moolenaar
269585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
270585fea7bSBram Moolenaar  assert_equal(5678, nr)
2718a7d6542SBram Moolenaarenddef
2728a7d6542SBram Moolenaar
27347a519a9SBram Moolenaardef Test_assignment_var_list()
27447a519a9SBram Moolenaar  let v1: string
27547a519a9SBram Moolenaar  let v2: string
2769af78769SBram Moolenaar  let vrem: list<string>
2779af78769SBram Moolenaar  [v1] = ['aaa']
2789af78769SBram Moolenaar  assert_equal('aaa', v1)
2799af78769SBram Moolenaar
28047a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
28147a519a9SBram Moolenaar  assert_equal('one', v1)
28247a519a9SBram Moolenaar  assert_equal('two', v2)
2839af78769SBram Moolenaar
2849af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
2859af78769SBram Moolenaar  assert_equal('one', v1)
2869af78769SBram Moolenaar  assert_equal('two', v2)
2879af78769SBram Moolenaar  assert_equal([], vrem)
2889af78769SBram Moolenaar
2899af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
2909af78769SBram Moolenaar  assert_equal('one', v1)
2919af78769SBram Moolenaar  assert_equal('two', v2)
2929af78769SBram Moolenaar  assert_equal(['three'], vrem)
29347a519a9SBram Moolenaarenddef
29447a519a9SBram Moolenaar
295cab27678SBram Moolenaardef Mess(): string
296cab27678SBram Moolenaar  v:foldstart = 123
297cab27678SBram Moolenaar  return 'xxx'
298cab27678SBram Moolenaarenddef
299cab27678SBram Moolenaar
300d72c1bf0SBram Moolenaardef Test_assignment_failure()
3018a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
3028a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
3038a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
3048a7d6542SBram Moolenaar
3058a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
3068a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
3078a7d6542SBram Moolenaar
3089b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
3099af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3109af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
3119af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3129af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
3139af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3149af78769SBram Moolenaar                            'let y: number',
3159af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
3169af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3179af78769SBram Moolenaar                            'let y: number',
3189af78769SBram Moolenaar                            'let z: list<number>',
3199af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
3209be61bbbSBram Moolenaar
321e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
3229be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
3239be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
3249be61bbbSBram Moolenaar
325e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
3269be61bbbSBram Moolenaar
3279be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
3289be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
3299be61bbbSBram Moolenaar
330e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
331e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
332e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
333e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
3349be61bbbSBram Moolenaar
3359be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
3369be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
3379be61bbbSBram Moolenaar
338822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
33933fa29cfSBram Moolenaar
3408a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
3418a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
3428a7d6542SBram Moolenaar
3438a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
3448a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
3458a7d6542SBram Moolenaar
3468a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
3478a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
34842a480bfSBram Moolenaar
349d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
35042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
351cab27678SBram Moolenaar
352cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
353cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
354d72c1bf0SBram Moolenaarenddef
355d72c1bf0SBram Moolenaar
356d72c1bf0SBram Moolenaardef Test_unlet()
357d72c1bf0SBram Moolenaar  g:somevar = 'yes'
358d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
359d72c1bf0SBram Moolenaar  unlet g:somevar
360d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
361d72c1bf0SBram Moolenaar  unlet! g:somevar
362d72c1bf0SBram Moolenaar
363d72c1bf0SBram Moolenaar  call CheckScriptFailure([
364d72c1bf0SBram Moolenaar        'vim9script',
365d72c1bf0SBram Moolenaar        'let svar = 123',
366d72c1bf0SBram Moolenaar        'unlet svar',
367d72c1bf0SBram Moolenaar        ], 'E1081:')
368d72c1bf0SBram Moolenaar  call CheckScriptFailure([
369d72c1bf0SBram Moolenaar        'vim9script',
370d72c1bf0SBram Moolenaar        'let svar = 123',
371d72c1bf0SBram Moolenaar        'unlet s:svar',
372d72c1bf0SBram Moolenaar        ], 'E1081:')
373d72c1bf0SBram Moolenaar  call CheckScriptFailure([
374d72c1bf0SBram Moolenaar        'vim9script',
375d72c1bf0SBram Moolenaar        'let svar = 123',
376d72c1bf0SBram Moolenaar        'def Func()',
377d72c1bf0SBram Moolenaar        '  unlet svar',
378d72c1bf0SBram Moolenaar        'enddef',
379822ba247SBram Moolenaar        'defcompile',
380d72c1bf0SBram Moolenaar        ], 'E1081:')
381d72c1bf0SBram Moolenaar  call CheckScriptFailure([
382d72c1bf0SBram Moolenaar        'vim9script',
383d72c1bf0SBram Moolenaar        'let svar = 123',
384d72c1bf0SBram Moolenaar        'def Func()',
385d72c1bf0SBram Moolenaar        '  unlet s:svar',
386d72c1bf0SBram Moolenaar        'enddef',
387822ba247SBram Moolenaar        'defcompile',
388d72c1bf0SBram Moolenaar        ], 'E1081:')
3897bdaea6eSBram Moolenaar
3907bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
3917bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
3927bdaea6eSBram Moolenaar  unlet $ENVVAR
3937bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
394d72c1bf0SBram Moolenaarenddef
395599c89c8SBram Moolenaar
3964c17ad94SBram Moolenaardef Test_delfunction()
397f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
3984c17ad94SBram Moolenaar  CheckScriptSuccess([
3994c17ad94SBram Moolenaar      'vim9script',
4004c17ad94SBram Moolenaar      'func CheckMe()',
4014c17ad94SBram Moolenaar      '  return 123',
4024c17ad94SBram Moolenaar      'endfunc',
4034c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
4044c17ad94SBram Moolenaar      ])
4054c17ad94SBram Moolenaar
406f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
4074c17ad94SBram Moolenaar  CheckScriptFailure([
4084c17ad94SBram Moolenaar      'vim9script',
4094c17ad94SBram Moolenaar      'func DeleteMe1()',
4104c17ad94SBram Moolenaar      'endfunc',
4114c17ad94SBram Moolenaar      'delfunction DeleteMe1',
4124c17ad94SBram Moolenaar      ], 'E1084:')
4134c17ad94SBram Moolenaar  CheckScriptFailure([
4144c17ad94SBram Moolenaar      'vim9script',
4154c17ad94SBram Moolenaar      'func DeleteMe2()',
4164c17ad94SBram Moolenaar      'endfunc',
4174c17ad94SBram Moolenaar      'def DoThat()',
4184c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
4194c17ad94SBram Moolenaar      'enddef',
4204c17ad94SBram Moolenaar      'DoThat()',
4214c17ad94SBram Moolenaar      ], 'E1084:')
4224c17ad94SBram Moolenaar  CheckScriptFailure([
4234c17ad94SBram Moolenaar      'vim9script',
4244c17ad94SBram Moolenaar      'def DeleteMe3()',
4254c17ad94SBram Moolenaar      'enddef',
4264c17ad94SBram Moolenaar      'delfunction DeleteMe3',
4274c17ad94SBram Moolenaar      ], 'E1084:')
4284c17ad94SBram Moolenaar  CheckScriptFailure([
4294c17ad94SBram Moolenaar      'vim9script',
4304c17ad94SBram Moolenaar      'def DeleteMe4()',
4314c17ad94SBram Moolenaar      'enddef',
4324c17ad94SBram Moolenaar      'def DoThat()',
4334c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
4344c17ad94SBram Moolenaar      'enddef',
4354c17ad94SBram Moolenaar      'DoThat()',
4364c17ad94SBram Moolenaar      ], 'E1084:')
4374c17ad94SBram Moolenaarenddef
4384c17ad94SBram Moolenaar
439599c89c8SBram Moolenaarfunc Test_wrong_type()
440599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
441599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
442599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
443599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
444599c89c8SBram Moolenaar
445599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
446599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
44742a480bfSBram Moolenaar
44842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
44942a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
45042a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
45142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
45242a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
45342a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
45442a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
45542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
45642a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
45742a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
45842a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
459a0a9f43aSBram Moolenaar
460a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
461a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4628a7d6542SBram Moolenaarendfunc
4638a7d6542SBram Moolenaar
4648a7d6542SBram Moolenaarfunc Test_const()
4658a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
4668a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
4678a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
4689be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
4698a7d6542SBram Moolenaarendfunc
4708a7d6542SBram Moolenaar
471df069eecSBram Moolenaardef Test_range_no_colon()
472df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
473df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
474df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
475df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
476df069eecSBram Moolenaarenddef
477df069eecSBram Moolenaar
478df069eecSBram Moolenaar
4798a7d6542SBram Moolenaardef Test_block()
4808a7d6542SBram Moolenaar  let outer = 1
4818a7d6542SBram Moolenaar  {
4828a7d6542SBram Moolenaar    let inner = 2
4838a7d6542SBram Moolenaar    assert_equal(1, outer)
4848a7d6542SBram Moolenaar    assert_equal(2, inner)
4858a7d6542SBram Moolenaar  }
4868a7d6542SBram Moolenaar  assert_equal(1, outer)
4878a7d6542SBram Moolenaarenddef
4888a7d6542SBram Moolenaar
4898a7d6542SBram Moolenaarfunc Test_block_failure()
4908a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
491585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
492585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
4938a7d6542SBram Moolenaarendfunc
4948a7d6542SBram Moolenaar
495585fea7bSBram Moolenaardef Test_cmd_modifier()
496585fea7bSBram Moolenaar  tab echo '0'
497585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
498585fea7bSBram Moolenaarenddef
499585fea7bSBram Moolenaar
5008a7d6542SBram Moolenaardef Test_try_catch()
5018a7d6542SBram Moolenaar  let l = []
5027a092245SBram Moolenaar  try # comment
5038a7d6542SBram Moolenaar    add(l, '1')
5048a7d6542SBram Moolenaar    throw 'wrong'
5058a7d6542SBram Moolenaar    add(l, '2')
5067a092245SBram Moolenaar  catch # comment
5078a7d6542SBram Moolenaar    add(l, v:exception)
5087a092245SBram Moolenaar  finally # comment
5098a7d6542SBram Moolenaar    add(l, '3')
5107a092245SBram Moolenaar  endtry # comment
5118a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
512*68d130c6SBram Moolenaar
513*68d130c6SBram Moolenaar  let n: number
514*68d130c6SBram Moolenaar  try
515*68d130c6SBram Moolenaar    n = l[3]
516*68d130c6SBram Moolenaar  catch /E684:/
517*68d130c6SBram Moolenaar    n = 99
518*68d130c6SBram Moolenaar  endtry
519*68d130c6SBram Moolenaar  assert_equal(99, n)
520*68d130c6SBram Moolenaar
521*68d130c6SBram Moolenaar  try
522*68d130c6SBram Moolenaar    n = g:astring[3]
523*68d130c6SBram Moolenaar  catch /E714:/
524*68d130c6SBram Moolenaar    n = 77
525*68d130c6SBram Moolenaar  endtry
526*68d130c6SBram Moolenaar  assert_equal(77, n)
527*68d130c6SBram Moolenaar
528*68d130c6SBram Moolenaar  try
529*68d130c6SBram Moolenaar    n = l[g:astring]
530*68d130c6SBram Moolenaar  catch /E39:/
531*68d130c6SBram Moolenaar    n = 77
532*68d130c6SBram Moolenaar  endtry
533*68d130c6SBram Moolenaar  assert_equal(77, n)
534*68d130c6SBram Moolenaar
535*68d130c6SBram Moolenaar  try
536*68d130c6SBram Moolenaar    n = s:does_not_exist
537*68d130c6SBram Moolenaar  catch /E121:/
538*68d130c6SBram Moolenaar    n = 121
539*68d130c6SBram Moolenaar  endtry
540*68d130c6SBram Moolenaar  assert_equal(121, n)
541*68d130c6SBram Moolenaar
542*68d130c6SBram Moolenaar  let d = #{one: 1}
543*68d130c6SBram Moolenaar  try
544*68d130c6SBram Moolenaar    n = d[g:astring]
545*68d130c6SBram Moolenaar  catch /E716:/
546*68d130c6SBram Moolenaar    n = 222
547*68d130c6SBram Moolenaar  endtry
548*68d130c6SBram Moolenaar  assert_equal(222, n)
5498a7d6542SBram Moolenaarenddef
5508a7d6542SBram Moolenaar
551257cc5eeSBram Moolenaardef ThrowFromDef()
552a72cfb80SBram Moolenaar  throw "getout" # comment
553257cc5eeSBram Moolenaarenddef
554257cc5eeSBram Moolenaar
555257cc5eeSBram Moolenaarfunc CatchInFunc()
556257cc5eeSBram Moolenaar  try
557257cc5eeSBram Moolenaar    call ThrowFromDef()
558257cc5eeSBram Moolenaar  catch
559257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
560257cc5eeSBram Moolenaar  endtry
561257cc5eeSBram Moolenaarendfunc
562257cc5eeSBram Moolenaar
563257cc5eeSBram Moolenaardef CatchInDef()
564257cc5eeSBram Moolenaar  try
565257cc5eeSBram Moolenaar    ThrowFromDef()
566257cc5eeSBram Moolenaar  catch
567257cc5eeSBram Moolenaar    g:thrown_def = v:exception
568257cc5eeSBram Moolenaar  endtry
569257cc5eeSBram Moolenaarenddef
570257cc5eeSBram Moolenaar
571f575adffSBram Moolenaardef ReturnFinally(): string
572f575adffSBram Moolenaar  try
573f575adffSBram Moolenaar    return 'intry'
574f575adffSBram Moolenaar  finally
575f575adffSBram Moolenaar    g:in_finally = 'finally'
576f575adffSBram Moolenaar  endtry
577f575adffSBram Moolenaar  return 'end'
578f575adffSBram Moolenaarenddef
579f575adffSBram Moolenaar
580257cc5eeSBram Moolenaardef Test_try_catch_nested()
581257cc5eeSBram Moolenaar  CatchInFunc()
582257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
583257cc5eeSBram Moolenaar
584257cc5eeSBram Moolenaar  CatchInDef()
585257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
586f575adffSBram Moolenaar
587f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
588f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
589f575adffSBram Moolenaarenddef
590f575adffSBram Moolenaar
591f575adffSBram Moolenaardef Test_try_catch_match()
592f575adffSBram Moolenaar  let seq = 'a'
593f575adffSBram Moolenaar  try
594f575adffSBram Moolenaar    throw 'something'
595f575adffSBram Moolenaar  catch /nothing/
596f575adffSBram Moolenaar    seq ..= 'x'
597f575adffSBram Moolenaar  catch /some/
598f575adffSBram Moolenaar    seq ..= 'b'
599f575adffSBram Moolenaar  catch /asdf/
600f575adffSBram Moolenaar    seq ..= 'x'
601e8c4abbbSBram Moolenaar  catch ?a\?sdf?
602e8c4abbbSBram Moolenaar    seq ..= 'y'
603f575adffSBram Moolenaar  finally
604f575adffSBram Moolenaar    seq ..= 'c'
605f575adffSBram Moolenaar  endtry
606f575adffSBram Moolenaar  assert_equal('abc', seq)
607257cc5eeSBram Moolenaarenddef
608257cc5eeSBram Moolenaar
609e8c4abbbSBram Moolenaardef Test_try_catch_fails()
610e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
611e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
612e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
613585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
614585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
615585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
616585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
617585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
618585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
619585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
620585fea7bSBram Moolenaar
621a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
622585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
623e8c4abbbSBram Moolenaarenddef
624e8c4abbbSBram Moolenaar
625006ad48bSBram Moolenaardef Test_throw_vimscript()
626f5be8cdbSBram Moolenaar  # only checks line continuation
627006ad48bSBram Moolenaar  let lines =<< trim END
628006ad48bSBram Moolenaar      vim9script
629006ad48bSBram Moolenaar      try
630006ad48bSBram Moolenaar        throw 'one'
631006ad48bSBram Moolenaar              .. 'two'
632006ad48bSBram Moolenaar      catch
633006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
634006ad48bSBram Moolenaar      endtry
635006ad48bSBram Moolenaar  END
636006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
637006ad48bSBram Moolenaarenddef
638006ad48bSBram Moolenaar
63937c83711SBram Moolenaardef Test_cexpr_vimscript()
640f5be8cdbSBram Moolenaar  # only checks line continuation
64137c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
64237c83711SBram Moolenaar  let lines =<< trim END
64337c83711SBram Moolenaar      vim9script
64437c83711SBram Moolenaar      cexpr 'File'
64537c83711SBram Moolenaar                .. ' someFile' ..
64637c83711SBram Moolenaar                   ' line 19'
64737c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
64837c83711SBram Moolenaar  END
64937c83711SBram Moolenaar  CheckScriptSuccess(lines)
65037c83711SBram Moolenaar  set errorformat&
65137c83711SBram Moolenaarenddef
65237c83711SBram Moolenaar
6532a1381c3SBram Moolenaarif has('channel')
65440ee466cSBram Moolenaar  let someJob = test_null_job()
65540ee466cSBram Moolenaar
65640ee466cSBram Moolenaar  def FuncWithError()
65740ee466cSBram Moolenaar    echomsg g:someJob
65840ee466cSBram Moolenaar  enddef
65940ee466cSBram Moolenaar
66040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
66140ee466cSBram Moolenaar    try
66240ee466cSBram Moolenaar      call FuncWithError()
66340ee466cSBram Moolenaar    catch
66440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
66540ee466cSBram Moolenaar    endtry
66640ee466cSBram Moolenaar  endfunc
6672a1381c3SBram Moolenaarendif
66840ee466cSBram Moolenaar
6698a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
6708a7d6542SBram Moolenaar  vim9script
6718a7d6542SBram Moolenaar  let name: string = 'bob'
6728a7d6542SBram Moolenaar  def Concat(arg: string): string
6738a7d6542SBram Moolenaar    return name .. arg
6748a7d6542SBram Moolenaar  enddef
675227a69deSBram Moolenaar  g:result = Concat('bie')
676227a69deSBram Moolenaar  g:localname = name
6778a7d6542SBram Moolenaar
6788a7d6542SBram Moolenaar  export const CONST = 1234
6798a7d6542SBram Moolenaar  export let exported = 9876
6806e587dcbSBram Moolenaar  export let exp_name = 'John'
6818a7d6542SBram Moolenaar  export def Exported(): string
6828a7d6542SBram Moolenaar    return 'Exported'
6838a7d6542SBram Moolenaar  enddef
6848a7d6542SBram MoolenaarEND
6858a7d6542SBram Moolenaar
6865269bd2aSBram Moolenaardef Test_vim9_import_export()
6878a7d6542SBram Moolenaar  let import_script_lines =<< trim END
6888a7d6542SBram Moolenaar    vim9script
6898a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
6908a7d6542SBram Moolenaar    g:imported = exported
6916e587dcbSBram Moolenaar    exported += 3
6926e587dcbSBram Moolenaar    g:imported_added = exported
6938a7d6542SBram Moolenaar    g:imported_func = Exported()
6946e587dcbSBram Moolenaar
6956e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
6966e587dcbSBram Moolenaar    g:imported_name = exp_name
6976e587dcbSBram Moolenaar    exp_name ..= ' Doe'
6986e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
6995381c7a1SBram Moolenaar    g:imported_later = exported
7008a7d6542SBram Moolenaar  END
7018a7d6542SBram Moolenaar
7028a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7038a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7048a7d6542SBram Moolenaar
7058a7d6542SBram Moolenaar  source Ximport.vim
7068a7d6542SBram Moolenaar
7078a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7088a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7098a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7106e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7115381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
7128a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
7136e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
7146e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
7158a7d6542SBram Moolenaar  assert_false(exists('g:name'))
7168a7d6542SBram Moolenaar
7178a7d6542SBram Moolenaar  unlet g:result
7188a7d6542SBram Moolenaar  unlet g:localname
7198a7d6542SBram Moolenaar  unlet g:imported
7206e587dcbSBram Moolenaar  unlet g:imported_added
7215381c7a1SBram Moolenaar  unlet g:imported_later
7228a7d6542SBram Moolenaar  unlet g:imported_func
7236e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
7248a7d6542SBram Moolenaar  delete('Ximport.vim')
725f2d5c240SBram Moolenaar
7261c991144SBram Moolenaar  # similar, with line breaks
7271c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
7281c991144SBram Moolenaar    vim9script
7291c991144SBram Moolenaar    import {
7301c991144SBram Moolenaar        exported,
7311c991144SBram Moolenaar        Exported,
7321c991144SBram Moolenaar        }
7331c991144SBram Moolenaar        from
7341c991144SBram Moolenaar        './Xexport.vim'
7351c991144SBram Moolenaar    g:imported = exported
7361c991144SBram Moolenaar    exported += 5
7371c991144SBram Moolenaar    g:imported_added = exported
7381c991144SBram Moolenaar    g:imported_func = Exported()
7391c991144SBram Moolenaar  END
7401c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
7411c991144SBram Moolenaar  source Ximport_lbr.vim
7421c991144SBram Moolenaar
7431c991144SBram Moolenaar  assert_equal(9876, g:imported)
7441c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
7451c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
7461c991144SBram Moolenaar
7471c991144SBram Moolenaar  # exported script not sourced again
7481c991144SBram Moolenaar  assert_false(exists('g:result'))
7491c991144SBram Moolenaar  unlet g:imported
7501c991144SBram Moolenaar  unlet g:imported_added
7511c991144SBram Moolenaar  unlet g:imported_func
7521c991144SBram Moolenaar  delete('Ximport_lbr.vim')
7531c991144SBram Moolenaar
7541c991144SBram Moolenaar  # import inside :def function
7555381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
7565381c7a1SBram Moolenaar    vim9script
7575381c7a1SBram Moolenaar    def ImportInDef()
7585381c7a1SBram Moolenaar      import exported from './Xexport.vim'
7595381c7a1SBram Moolenaar      g:imported = exported
7605381c7a1SBram Moolenaar      exported += 7
7615381c7a1SBram Moolenaar      g:imported_added = exported
7625381c7a1SBram Moolenaar    enddef
7635381c7a1SBram Moolenaar    ImportInDef()
7645381c7a1SBram Moolenaar  END
7655381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
7665381c7a1SBram Moolenaar  source Ximport2.vim
767f5be8cdbSBram Moolenaar  # TODO: this should be 9879
7685381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
7695381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
7705381c7a1SBram Moolenaar  unlet g:imported
7715381c7a1SBram Moolenaar  unlet g:imported_added
7725381c7a1SBram Moolenaar  delete('Ximport2.vim')
7735381c7a1SBram Moolenaar
774f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
775f2d5c240SBram Moolenaar    vim9script
776f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
777f2d5c240SBram Moolenaar    def UseExport()
778f2d5c240SBram Moolenaar      g:imported = Export.exported
779f2d5c240SBram Moolenaar    enddef
780f2d5c240SBram Moolenaar    UseExport()
781f2d5c240SBram Moolenaar  END
782f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
783f2d5c240SBram Moolenaar  source Ximport.vim
7845381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
785f2d5c240SBram Moolenaar
786599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
787599c89c8SBram Moolenaar    vim9script
788599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
789599c89c8SBram Moolenaar    def Func()
790599c89c8SBram Moolenaar      let dummy = 1
791599c89c8SBram Moolenaar      let imported = Export + dummy
792599c89c8SBram Moolenaar    enddef
793822ba247SBram Moolenaar    defcompile
794599c89c8SBram Moolenaar  END
795599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
796599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
797599c89c8SBram Moolenaar
798599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
799599c89c8SBram Moolenaar    vim9script
800599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
801599c89c8SBram Moolenaar    def Func()
802599c89c8SBram Moolenaar      let imported = Export . exported
803599c89c8SBram Moolenaar    enddef
804822ba247SBram Moolenaar    defcompile
805599c89c8SBram Moolenaar  END
806599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
807599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
808599c89c8SBram Moolenaar
809599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
810599c89c8SBram Moolenaar    vim9script
811599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
812599c89c8SBram Moolenaar    def Func()
813599c89c8SBram Moolenaar      let imported = Export.
814599c89c8SBram Moolenaar    enddef
815822ba247SBram Moolenaar    defcompile
816599c89c8SBram Moolenaar  END
817599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
818599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
819599c89c8SBram Moolenaar
8201c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
8211c991144SBram Moolenaar    vim9script
8221c991144SBram Moolenaar    import *
8231c991144SBram Moolenaar        as Export
8241c991144SBram Moolenaar        from
8251c991144SBram Moolenaar        './Xexport.vim'
8261c991144SBram Moolenaar    def UseExport()
8271c991144SBram Moolenaar      g:imported = Export.exported
8281c991144SBram Moolenaar    enddef
8291c991144SBram Moolenaar    UseExport()
8301c991144SBram Moolenaar  END
8311c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
8321c991144SBram Moolenaar  source Ximport.vim
8331c991144SBram Moolenaar  assert_equal(9883, g:imported)
8341c991144SBram Moolenaar
835f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
836f2d5c240SBram Moolenaar    vim9script
837f2d5c240SBram Moolenaar    import * from './Xexport.vim'
838f2d5c240SBram Moolenaar  END
839f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
840f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
841f2d5c240SBram Moolenaar
842f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
843fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
844fa29c8abSBram Moolenaar    vim9script
845fa29c8abSBram Moolenaar    import name from './Xexport.vim'
846fa29c8abSBram Moolenaar  END
847fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
848fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
849fa29c8abSBram Moolenaar
850f5be8cdbSBram Moolenaar  # try to import something that is already defined
8515269bd2aSBram Moolenaar  let import_already_defined =<< trim END
8525269bd2aSBram Moolenaar    vim9script
8535269bd2aSBram Moolenaar    let exported = 'something'
8545269bd2aSBram Moolenaar    import exported from './Xexport.vim'
8555269bd2aSBram Moolenaar  END
8565269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
8575269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
8585269bd2aSBram Moolenaar
859f5be8cdbSBram Moolenaar  # try to import something that is already defined
8605269bd2aSBram Moolenaar  import_already_defined =<< trim END
8615269bd2aSBram Moolenaar    vim9script
8625269bd2aSBram Moolenaar    let exported = 'something'
8635269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
8645269bd2aSBram Moolenaar  END
8655269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
8665269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
8675269bd2aSBram Moolenaar
868f5be8cdbSBram Moolenaar  # try to import something that is already defined
8695269bd2aSBram Moolenaar  import_already_defined =<< trim END
8705269bd2aSBram Moolenaar    vim9script
8715269bd2aSBram Moolenaar    let exported = 'something'
8725269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
8735269bd2aSBram Moolenaar  END
8745269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
8755269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
8765269bd2aSBram Moolenaar
877f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
878fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
879fa29c8abSBram Moolenaar    vim9script
880fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
881fa29c8abSBram Moolenaar  END
882fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
883fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
884fa29c8abSBram Moolenaar
885fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
886fa29c8abSBram Moolenaar    vim9script
887fa29c8abSBram Moolenaar    import name './Xexport.vim'
888fa29c8abSBram Moolenaar  END
889fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
890fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
891fa29c8abSBram Moolenaar
892fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
893fa29c8abSBram Moolenaar    vim9script
894fa29c8abSBram Moolenaar    import name from Xexport.vim
895fa29c8abSBram Moolenaar  END
896fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
897fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
898fa29c8abSBram Moolenaar
899fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
900fa29c8abSBram Moolenaar    vim9script
901fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
902fa29c8abSBram Moolenaar  END
903fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
904fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
905fa29c8abSBram Moolenaar
906fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
907fa29c8abSBram Moolenaar    vim9script
908fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
909fa29c8abSBram Moolenaar  END
9105269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
9115269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
912fa29c8abSBram Moolenaar
913f2d5c240SBram Moolenaar  delete('Ximport.vim')
9145269bd2aSBram Moolenaar  delete('Ximport3.vim')
9158a7d6542SBram Moolenaar  delete('Xexport.vim')
9168a7d6542SBram Moolenaar
917f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
918750802b5SBram Moolenaar  set cpo&vi
919750802b5SBram Moolenaar  let cpo_before = &cpo
920750802b5SBram Moolenaar  let lines =<< trim END
921750802b5SBram Moolenaar    vim9script
922750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
923750802b5SBram Moolenaar  END
924750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
925750802b5SBram Moolenaar  source Xvim9_script
926750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
927750802b5SBram Moolenaar  set cpo&vim
928750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
929750802b5SBram Moolenaar  delete('Xvim9_script')
930750802b5SBram Moolenaarenddef
931750802b5SBram Moolenaar
932750802b5SBram Moolenaardef Test_vim9script_fails()
9338a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
9348a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
935750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
9369721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
9379b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
938750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
939750802b5SBram Moolenaar
940c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
941c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
942c785b9a7SBram Moolenaar
943750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
944a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
9458a7d6542SBram Moolenaarenddef
9468a7d6542SBram Moolenaar
947f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
948101f4810SBram Moolenaar  CheckRunVimInTerminal
949101f4810SBram Moolenaar
9509bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
951c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
9529bb3eb3eSBram Moolenaarendfunc
9539bb3eb3eSBram Moolenaar
954c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
955101f4810SBram Moolenaar  let export =<< trim END
956101f4810SBram Moolenaar    vim9script
957101f4810SBram Moolenaar    export def Foo(): number
958101f4810SBram Moolenaar        return 0
959101f4810SBram Moolenaar    enddef
960101f4810SBram Moolenaar  END
9619bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
962101f4810SBram Moolenaar
9639bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
9649bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
9659bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
966101f4810SBram Moolenaar
9679bb3eb3eSBram Moolenaar  delete('Xexport.vim')
9689bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
9699bb3eb3eSBram Moolenaarenddef
970101f4810SBram Moolenaar
9714c17ad94SBram Moolenaardef Test_vim9script_reload_import()
9728a7d6542SBram Moolenaar  let lines =<< trim END
9738a7d6542SBram Moolenaar    vim9script
9748a7d6542SBram Moolenaar    const var = ''
9758a7d6542SBram Moolenaar    let valone = 1234
9768a7d6542SBram Moolenaar    def MyFunc(arg: string)
9778a7d6542SBram Moolenaar       valone = 5678
9788a7d6542SBram Moolenaar    enddef
9798a7d6542SBram Moolenaar  END
9808a7d6542SBram Moolenaar  let morelines =<< trim END
9818a7d6542SBram Moolenaar    let valtwo = 222
9828a7d6542SBram Moolenaar    export def GetValtwo(): number
9838a7d6542SBram Moolenaar      return valtwo
9848a7d6542SBram Moolenaar    enddef
9858a7d6542SBram Moolenaar  END
98603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
9878a7d6542SBram Moolenaar  source Xreload.vim
9888a7d6542SBram Moolenaar  source Xreload.vim
9898a7d6542SBram Moolenaar  source Xreload.vim
9908a7d6542SBram Moolenaar
9918a7d6542SBram Moolenaar  let testlines =<< trim END
9928a7d6542SBram Moolenaar    vim9script
9938a7d6542SBram Moolenaar    def TheFunc()
9948a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
9958a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
9968a7d6542SBram Moolenaar    enddef
9978a7d6542SBram Moolenaar    TheFunc()
9988a7d6542SBram Moolenaar  END
9998a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
10008a7d6542SBram Moolenaar  source Ximport.vim
10018a7d6542SBram Moolenaar
1002f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1003f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
10048a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
10058a7d6542SBram Moolenaar  source Ximport.vim
10068a7d6542SBram Moolenaar
1007f5be8cdbSBram Moolenaar  # cannot declare a var twice
10088a7d6542SBram Moolenaar  lines =<< trim END
10098a7d6542SBram Moolenaar    vim9script
10108a7d6542SBram Moolenaar    let valone = 1234
10118a7d6542SBram Moolenaar    let valone = 5678
10128a7d6542SBram Moolenaar  END
10138a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
10148a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
10158a7d6542SBram Moolenaar
10168a7d6542SBram Moolenaar  delete('Xreload.vim')
10178a7d6542SBram Moolenaar  delete('Ximport.vim')
10188a7d6542SBram Moolenaarenddef
10198a7d6542SBram Moolenaar
1020fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1021fe465a01SBram Moolenaar" script-local name.
1022fe465a01SBram Moolenaardef Test_vim9script_funcref()
1023fe465a01SBram Moolenaar  let sortlines =<< trim END
1024fe465a01SBram Moolenaar      vim9script
1025fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1026bed36b93SBram Moolenaar        return i2 - i1
1027fe465a01SBram Moolenaar      enddef
1028fe465a01SBram Moolenaar
1029fe465a01SBram Moolenaar      export def FastSort(): list<number>
1030fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1031fe465a01SBram Moolenaar      enddef
1032fe465a01SBram Moolenaar  END
1033fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1034fe465a01SBram Moolenaar
1035fe465a01SBram Moolenaar  let lines =<< trim END
1036fe465a01SBram Moolenaar    vim9script
1037fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1038fe465a01SBram Moolenaar    def Test()
1039fe465a01SBram Moolenaar      g:result = FastSort()
1040fe465a01SBram Moolenaar    enddef
1041fe465a01SBram Moolenaar    Test()
1042fe465a01SBram Moolenaar  END
1043fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1044fe465a01SBram Moolenaar
1045fe465a01SBram Moolenaar  source Xscript.vim
1046fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1047fe465a01SBram Moolenaar
1048fe465a01SBram Moolenaar  unlet g:result
1049fe465a01SBram Moolenaar  delete('Xsort.vim')
1050fe465a01SBram Moolenaar  delete('Xscript.vim')
1051fe465a01SBram Moolenaarenddef
1052fe465a01SBram Moolenaar
1053c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1054c620c055SBram Moolenaar" script where FastFilter() is called from.
1055c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1056c620c055SBram Moolenaar  let filterLines =<< trim END
1057c620c055SBram Moolenaar    vim9script
1058c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1059c620c055SBram Moolenaar      return idx % 2 == 1
1060c620c055SBram Moolenaar    enddef
1061c620c055SBram Moolenaar    export def FastFilter(): list<number>
1062c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1063c620c055SBram Moolenaar    enddef
1064c620c055SBram Moolenaar  END
1065c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1066c620c055SBram Moolenaar
1067c620c055SBram Moolenaar  let lines =<< trim END
1068c620c055SBram Moolenaar    vim9script
1069c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1070c620c055SBram Moolenaar    def Test()
1071c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1072c620c055SBram Moolenaar    enddef
1073c620c055SBram Moolenaar    Test()
1074c620c055SBram Moolenaar  END
1075c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1076c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1077c620c055SBram Moolenaar
1078c620c055SBram Moolenaar  delete('Xfilter.vim')
1079c620c055SBram Moolenaar  delete('Ximport.vim')
1080c620c055SBram Moolenaarenddef
1081c620c055SBram Moolenaar
10824c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
10834c17ad94SBram Moolenaar  let first_lines =<< trim END
10844c17ad94SBram Moolenaar    vim9script
10854c17ad94SBram Moolenaar    def FuncYes(): string
10864c17ad94SBram Moolenaar      return 'yes'
10874c17ad94SBram Moolenaar    enddef
10884c17ad94SBram Moolenaar  END
108903afdcf1SBram Moolenaar  let withno_lines =<< trim END
10904c17ad94SBram Moolenaar    def FuncNo(): string
10914c17ad94SBram Moolenaar      return 'no'
10924c17ad94SBram Moolenaar    enddef
10934c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
10944c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
10954c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
109603afdcf1SBram Moolenaar    enddef
109703afdcf1SBram Moolenaar  END
109803afdcf1SBram Moolenaar  let nono_lines =<< trim END
109903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
110003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
11014c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
11024c17ad94SBram Moolenaar    enddef
11034c17ad94SBram Moolenaar  END
11044c17ad94SBram Moolenaar
11054c17ad94SBram Moolenaar  # FuncNo() is defined
110603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
11074c17ad94SBram Moolenaar  source Xreloaded.vim
11084c17ad94SBram Moolenaar  g:DoCheck(true)
11094c17ad94SBram Moolenaar
11104c17ad94SBram Moolenaar  # FuncNo() is not redefined
111103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
11124c17ad94SBram Moolenaar  source Xreloaded.vim
111303afdcf1SBram Moolenaar  g:DoCheck()
11144c17ad94SBram Moolenaar
11154c17ad94SBram Moolenaar  # FuncNo() is back
111603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
11174c17ad94SBram Moolenaar  source Xreloaded.vim
111803afdcf1SBram Moolenaar  g:DoCheck()
11194c17ad94SBram Moolenaar
11204c17ad94SBram Moolenaar  delete('Xreloaded.vim')
11214c17ad94SBram Moolenaarenddef
11224c17ad94SBram Moolenaar
112389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
112489483d40SBram Moolenaar  # write the script with a script-local variable
112589483d40SBram Moolenaar  let lines =<< trim END
112689483d40SBram Moolenaar    vim9script
112789483d40SBram Moolenaar    let var = 'string'
112889483d40SBram Moolenaar  END
112989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
113089483d40SBram Moolenaar  source XreloadVar.vim
113189483d40SBram Moolenaar
113289483d40SBram Moolenaar  # now write the script using the same variable locally - works
113389483d40SBram Moolenaar  lines =<< trim END
113489483d40SBram Moolenaar    vim9script
113589483d40SBram Moolenaar    def Func()
113689483d40SBram Moolenaar      let var = 'string'
113789483d40SBram Moolenaar    enddef
113889483d40SBram Moolenaar  END
113989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
114089483d40SBram Moolenaar  source XreloadVar.vim
114189483d40SBram Moolenaar
114289483d40SBram Moolenaar  delete('XreloadVar.vim')
114389483d40SBram Moolenaarenddef
114489483d40SBram Moolenaar
11458a7d6542SBram Moolenaardef Test_import_absolute()
11468a7d6542SBram Moolenaar  let import_lines = [
1147e6085c53SBram Moolenaar        'vim9script',
1148e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1149e6085c53SBram Moolenaar        'def UseExported()',
1150e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1151e6085c53SBram Moolenaar        '  exported = 8888',
1152e6085c53SBram Moolenaar        '  g:imported_after = exported',
1153e6085c53SBram Moolenaar        'enddef',
1154e6085c53SBram Moolenaar        'UseExported()',
1155e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1156e6085c53SBram Moolenaar        ]
11578a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
11588a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
11598a7d6542SBram Moolenaar
11608a7d6542SBram Moolenaar  source Ximport_abs.vim
11618a7d6542SBram Moolenaar
11628a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
11634e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1164675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1165675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1166675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1167675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1168675f716eSBram Moolenaar          'exported = 8888.*' ..
1169675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1170675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1171675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1172675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1173e6085c53SBram Moolenaar        g:import_disassembled)
11748a7d6542SBram Moolenaar  unlet g:imported_abs
11754e12a5dfSBram Moolenaar  unlet g:import_disassembled
11768a7d6542SBram Moolenaar
11778a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
11788a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
11798a7d6542SBram Moolenaarenddef
11808a7d6542SBram Moolenaar
11818a7d6542SBram Moolenaardef Test_import_rtp()
11828a7d6542SBram Moolenaar  let import_lines = [
1183e6085c53SBram Moolenaar        'vim9script',
1184e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1185e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1186e6085c53SBram Moolenaar        ]
11878a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
11888a7d6542SBram Moolenaar  mkdir('import')
11898a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
11908a7d6542SBram Moolenaar
11918a7d6542SBram Moolenaar  let save_rtp = &rtp
11928a7d6542SBram Moolenaar  &rtp = getcwd()
11938a7d6542SBram Moolenaar  source Ximport_rtp.vim
11948a7d6542SBram Moolenaar  &rtp = save_rtp
11958a7d6542SBram Moolenaar
11968a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
11978a7d6542SBram Moolenaar  unlet g:imported_rtp
11988a7d6542SBram Moolenaar
11998a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
120089483d40SBram Moolenaar  delete('import', 'rf')
12018a7d6542SBram Moolenaarenddef
12028a7d6542SBram Moolenaar
120325e0f586SBram Moolenaardef Test_import_compile_error()
120425e0f586SBram Moolenaar  let export_lines = [
120525e0f586SBram Moolenaar        'vim9script',
120625e0f586SBram Moolenaar        'export def ExpFunc(): string',
120725e0f586SBram Moolenaar        '  return notDefined',
120825e0f586SBram Moolenaar        'enddef',
120925e0f586SBram Moolenaar        ]
121025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
121125e0f586SBram Moolenaar
121225e0f586SBram Moolenaar  let import_lines = [
121325e0f586SBram Moolenaar        'vim9script',
121425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
121525e0f586SBram Moolenaar        'def ImpFunc()',
121625e0f586SBram Moolenaar        '  echo ExpFunc()',
121725e0f586SBram Moolenaar        'enddef',
121825e0f586SBram Moolenaar        'defcompile',
121925e0f586SBram Moolenaar        ]
122025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
122125e0f586SBram Moolenaar
122225e0f586SBram Moolenaar  try
122325e0f586SBram Moolenaar    source Ximport.vim
122425e0f586SBram Moolenaar  catch /E1001/
1225f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
122625e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
122725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
122825e0f586SBram Moolenaar  endtry
122925e0f586SBram Moolenaar
123025e0f586SBram Moolenaar  delete('Xexported.vim')
123125e0f586SBram Moolenaar  delete('Ximport.vim')
123225e0f586SBram Moolenaarenddef
123325e0f586SBram Moolenaar
12348a7d6542SBram Moolenaardef Test_fixed_size_list()
1235f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
12368a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
12378a7d6542SBram Moolenaar  l->remove(0)
12388a7d6542SBram Moolenaar  l->add(5)
12398a7d6542SBram Moolenaar  l->insert(99, 1)
12400f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
12418a7d6542SBram Moolenaarenddef
12428a7d6542SBram Moolenaar
1243158906cfSBram Moolenaardef IfElse(what: number): string
1244158906cfSBram Moolenaar  let res = ''
1245158906cfSBram Moolenaar  if what == 1
1246158906cfSBram Moolenaar    res = "one"
1247158906cfSBram Moolenaar  elseif what == 2
1248158906cfSBram Moolenaar    res = "two"
1249a259d8d3SBram Moolenaar  else
1250158906cfSBram Moolenaar    res = "three"
1251a259d8d3SBram Moolenaar  endif
1252158906cfSBram Moolenaar  return res
1253a259d8d3SBram Moolenaarenddef
1254a259d8d3SBram Moolenaar
1255158906cfSBram Moolenaardef Test_if_elseif_else()
1256158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1257158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1258158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
12590f18b6d1SBram Moolenaarenddef
12600f18b6d1SBram Moolenaar
1261e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1262e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1263e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1264e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1265e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1266585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1267e8c4abbbSBram Moolenaarenddef
1268e8c4abbbSBram Moolenaar
12696d69bf60SBram Moolenaarlet g:bool_true = v:true
12706d69bf60SBram Moolenaarlet g:bool_false = v:false
12716d69bf60SBram Moolenaar
12726d69bf60SBram Moolenaardef Test_if_const_expr()
12736d69bf60SBram Moolenaar  let res = false
12746d69bf60SBram Moolenaar  if true ? true : false
12756d69bf60SBram Moolenaar    res = true
12766d69bf60SBram Moolenaar  endif
12776d69bf60SBram Moolenaar  assert_equal(true, res)
12786d69bf60SBram Moolenaar
1279585fea7bSBram Moolenaar  g:glob = 2
1280585fea7bSBram Moolenaar  if false
12816797966dSBram Moolenaar    execute('g:glob = 3')
1282585fea7bSBram Moolenaar  endif
1283585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1284585fea7bSBram Moolenaar  if true
12856797966dSBram Moolenaar    execute('g:glob = 3')
1286585fea7bSBram Moolenaar  endif
1287585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1288585fea7bSBram Moolenaar
12896d69bf60SBram Moolenaar  res = false
12906d69bf60SBram Moolenaar  if g:bool_true ? true : false
12916d69bf60SBram Moolenaar    res = true
12926d69bf60SBram Moolenaar  endif
12936d69bf60SBram Moolenaar  assert_equal(true, res)
12946d69bf60SBram Moolenaar
12956d69bf60SBram Moolenaar  res = false
12966d69bf60SBram Moolenaar  if true ? g:bool_true : false
12976d69bf60SBram Moolenaar    res = true
12986d69bf60SBram Moolenaar  endif
12996d69bf60SBram Moolenaar  assert_equal(true, res)
13006d69bf60SBram Moolenaar
13016d69bf60SBram Moolenaar  res = false
13026d69bf60SBram Moolenaar  if true ? true : g:bool_false
13036d69bf60SBram Moolenaar    res = true
13046d69bf60SBram Moolenaar  endif
13056d69bf60SBram Moolenaar  assert_equal(true, res)
13066d69bf60SBram Moolenaar
13076d69bf60SBram Moolenaar  res = false
13086d69bf60SBram Moolenaar  if true ? false : true
13096d69bf60SBram Moolenaar    res = true
13106d69bf60SBram Moolenaar  endif
13116d69bf60SBram Moolenaar  assert_equal(false, res)
13126d69bf60SBram Moolenaar
13136d69bf60SBram Moolenaar  res = false
13146d69bf60SBram Moolenaar  if false ? false : true
13156d69bf60SBram Moolenaar    res = true
13166d69bf60SBram Moolenaar  endif
13176d69bf60SBram Moolenaar  assert_equal(true, res)
13186d69bf60SBram Moolenaar
13196d69bf60SBram Moolenaar  res = false
13206d69bf60SBram Moolenaar  if false ? true : false
13216d69bf60SBram Moolenaar    res = true
13226d69bf60SBram Moolenaar  endif
13236d69bf60SBram Moolenaar  assert_equal(false, res)
13246d69bf60SBram Moolenaar
13256d69bf60SBram Moolenaar  res = false
1326e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1327e8c4abbbSBram Moolenaar    res = true
1328e8c4abbbSBram Moolenaar  endif
1329e8c4abbbSBram Moolenaar  assert_equal(false, res)
1330e8c4abbbSBram Moolenaar
1331e8c4abbbSBram Moolenaar  res = false
13326d69bf60SBram Moolenaar  if true && true
13336d69bf60SBram Moolenaar    res = true
13346d69bf60SBram Moolenaar  endif
13356d69bf60SBram Moolenaar  assert_equal(true, res)
13366d69bf60SBram Moolenaar
13376d69bf60SBram Moolenaar  res = false
13386d69bf60SBram Moolenaar  if true && false
13396d69bf60SBram Moolenaar    res = true
13406d69bf60SBram Moolenaar  endif
13416d69bf60SBram Moolenaar  assert_equal(false, res)
13426d69bf60SBram Moolenaar
13436d69bf60SBram Moolenaar  res = false
13446d69bf60SBram Moolenaar  if g:bool_true && false
13456d69bf60SBram Moolenaar    res = true
13466d69bf60SBram Moolenaar  endif
13476d69bf60SBram Moolenaar  assert_equal(false, res)
13486d69bf60SBram Moolenaar
13496d69bf60SBram Moolenaar  res = false
13506d69bf60SBram Moolenaar  if true && g:bool_false
13516d69bf60SBram Moolenaar    res = true
13526d69bf60SBram Moolenaar  endif
13536d69bf60SBram Moolenaar  assert_equal(false, res)
13546d69bf60SBram Moolenaar
13556d69bf60SBram Moolenaar  res = false
13566d69bf60SBram Moolenaar  if false && false
13576d69bf60SBram Moolenaar    res = true
13586d69bf60SBram Moolenaar  endif
13596d69bf60SBram Moolenaar  assert_equal(false, res)
13606d69bf60SBram Moolenaar
13616d69bf60SBram Moolenaar  res = false
13626d69bf60SBram Moolenaar  if true || false
13636d69bf60SBram Moolenaar    res = true
13646d69bf60SBram Moolenaar  endif
13656d69bf60SBram Moolenaar  assert_equal(true, res)
13666d69bf60SBram Moolenaar
13676d69bf60SBram Moolenaar  res = false
13686d69bf60SBram Moolenaar  if g:bool_true || false
13696d69bf60SBram Moolenaar    res = true
13706d69bf60SBram Moolenaar  endif
13716d69bf60SBram Moolenaar  assert_equal(true, res)
13726d69bf60SBram Moolenaar
13736d69bf60SBram Moolenaar  res = false
13746d69bf60SBram Moolenaar  if true || g:bool_false
13756d69bf60SBram Moolenaar    res = true
13766d69bf60SBram Moolenaar  endif
13776d69bf60SBram Moolenaar  assert_equal(true, res)
13786d69bf60SBram Moolenaar
13796d69bf60SBram Moolenaar  res = false
13806d69bf60SBram Moolenaar  if false || false
13816d69bf60SBram Moolenaar    res = true
13826d69bf60SBram Moolenaar  endif
13836d69bf60SBram Moolenaar  assert_equal(false, res)
138480c34ca3SBram Moolenaarenddef
13856d69bf60SBram Moolenaar
138680c34ca3SBram Moolenaardef Test_if_const_expr_fails()
138780c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
138880c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1389e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1390e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
13916d69bf60SBram Moolenaarenddef
13926d69bf60SBram Moolenaar
139372abcf42SBram Moolenaardef RunNested(i: number): number
139472abcf42SBram Moolenaar  let x: number = 0
139572abcf42SBram Moolenaar  if i % 2
139672abcf42SBram Moolenaar    if 1
1397f5be8cdbSBram Moolenaar      # comment
139872abcf42SBram Moolenaar    else
1399f5be8cdbSBram Moolenaar      # comment
140072abcf42SBram Moolenaar    endif
140172abcf42SBram Moolenaar    x += 1
140272abcf42SBram Moolenaar  else
140372abcf42SBram Moolenaar    x += 1000
140472abcf42SBram Moolenaar  endif
140572abcf42SBram Moolenaar  return x
140672abcf42SBram Moolenaarenddef
140772abcf42SBram Moolenaar
140872abcf42SBram Moolenaardef Test_nested_if()
140972abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
141072abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
141172abcf42SBram Moolenaarenddef
141272abcf42SBram Moolenaar
1413ad39c094SBram Moolenaardef Test_execute_cmd()
1414ad39c094SBram Moolenaar  new
1415ad39c094SBram Moolenaar  setline(1, 'default')
1416ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1417ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1418a72cfb80SBram Moolenaar
1419a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1420a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1421a72cfb80SBram Moolenaar
1422ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1423ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1424a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1425ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1426a72cfb80SBram Moolenaar
1427ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1428ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1429a72cfb80SBram Moolenaar
1430ad39c094SBram Moolenaar  let cmd_first = 'call '
1431ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1432ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1433ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1434ad39c094SBram Moolenaar  bwipe!
1435585fea7bSBram Moolenaar
1436585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1437a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1438ad39c094SBram Moolenaarenddef
1439ad39c094SBram Moolenaar
144047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1441f5be8cdbSBram Moolenaar  # only checks line continuation
144247e880d6SBram Moolenaar  let lines =<< trim END
144347e880d6SBram Moolenaar      vim9script
144447e880d6SBram Moolenaar      execute 'g:someVar'
144547e880d6SBram Moolenaar                .. ' = ' ..
144647e880d6SBram Moolenaar                   '28'
144747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
144847e880d6SBram Moolenaar      unlet g:someVar
144947e880d6SBram Moolenaar  END
145047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
145147e880d6SBram Moolenaarenddef
145247e880d6SBram Moolenaar
1453ad39c094SBram Moolenaardef Test_echo_cmd()
1454a72cfb80SBram Moolenaar  echo 'some' # comment
1455585fea7bSBram Moolenaar  echon 'thing'
1456ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1457ad39c094SBram Moolenaar
1458a72cfb80SBram Moolenaar  echo "some" # comment
1459a72cfb80SBram Moolenaar  echon "thing"
1460a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1461a72cfb80SBram Moolenaar
1462ad39c094SBram Moolenaar  let str1 = 'some'
1463ad39c094SBram Moolenaar  let str2 = 'more'
1464ad39c094SBram Moolenaar  echo str1 str2
1465ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1466a72cfb80SBram Moolenaar
1467a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1468ad39c094SBram Moolenaarenddef
1469ad39c094SBram Moolenaar
1470f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1471f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1472f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1473f93c7feaSBram Moolenaar  echo 'clear'
1474df069eecSBram Moolenaar  :1messages
1475f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1476f93c7feaSBram Moolenaar
1477f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1478f93c7feaSBram Moolenaarenddef
1479f93c7feaSBram Moolenaar
148047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1481f5be8cdbSBram Moolenaar  # only checks line continuation
148247e880d6SBram Moolenaar  let lines =<< trim END
148347e880d6SBram Moolenaar      vim9script
148447e880d6SBram Moolenaar      echomsg 'here'
148547e880d6SBram Moolenaar                .. ' is ' ..
148647e880d6SBram Moolenaar                   'a message'
148747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
148847e880d6SBram Moolenaar  END
148947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
149047e880d6SBram Moolenaarenddef
149147e880d6SBram Moolenaar
1492f93c7feaSBram Moolenaardef Test_echoerr_cmd()
149340ee466cSBram Moolenaar  try
149440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
149540ee466cSBram Moolenaar  catch
149640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
149740ee466cSBram Moolenaar  endtry
1498f93c7feaSBram Moolenaarenddef
1499f93c7feaSBram Moolenaar
150047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1501f5be8cdbSBram Moolenaar  # only checks line continuation
150247e880d6SBram Moolenaar  let lines =<< trim END
150347e880d6SBram Moolenaar      vim9script
150447e880d6SBram Moolenaar      try
150547e880d6SBram Moolenaar        echoerr 'this'
150647e880d6SBram Moolenaar                .. ' is ' ..
150747e880d6SBram Moolenaar                   'wrong'
150847e880d6SBram Moolenaar      catch
150947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
151047e880d6SBram Moolenaar      endtry
151147e880d6SBram Moolenaar  END
151247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
151347e880d6SBram Moolenaarenddef
151447e880d6SBram Moolenaar
151541fe0617SBram Moolenaardef Test_for_outside_of_function()
151641fe0617SBram Moolenaar  let lines =<< trim END
151741fe0617SBram Moolenaar    vim9script
151841fe0617SBram Moolenaar    new
151941fe0617SBram Moolenaar    for var in range(0, 3)
152041fe0617SBram Moolenaar      append(line('$'), var)
152141fe0617SBram Moolenaar    endfor
152241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
152341fe0617SBram Moolenaar    bwipe!
152441fe0617SBram Moolenaar  END
152541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
152641fe0617SBram Moolenaar  source Xvim9for.vim
152741fe0617SBram Moolenaar  delete('Xvim9for.vim')
152841fe0617SBram Moolenaarenddef
15298a7d6542SBram Moolenaar
1530e8c4abbbSBram Moolenaardef Test_for_loop()
1531e8c4abbbSBram Moolenaar  let result = ''
1532e8c4abbbSBram Moolenaar  for cnt in range(7)
1533e8c4abbbSBram Moolenaar    if cnt == 4
1534e8c4abbbSBram Moolenaar      break
1535e8c4abbbSBram Moolenaar    endif
1536e8c4abbbSBram Moolenaar    if cnt == 2
1537e8c4abbbSBram Moolenaar      continue
1538e8c4abbbSBram Moolenaar    endif
1539e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1540e8c4abbbSBram Moolenaar  endfor
1541e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
15420ad3e894SBram Moolenaar
15430ad3e894SBram Moolenaar  let concat = ''
15440ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
15450ad3e894SBram Moolenaar    concat ..= str
15460ad3e894SBram Moolenaar  endfor
15470ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1548e8c4abbbSBram Moolenaarenddef
1549e8c4abbbSBram Moolenaar
1550e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1551675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1552675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1553675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1554822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
15550ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1556675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1557675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1558675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1559e8c4abbbSBram Moolenaarenddef
1560e8c4abbbSBram Moolenaar
1561d0df1aacSBram Moolenaardef Test_while_loop()
1562d0df1aacSBram Moolenaar  let result = ''
1563d0df1aacSBram Moolenaar  let cnt = 0
1564d0df1aacSBram Moolenaar  while cnt < 555
1565d0df1aacSBram Moolenaar    if cnt == 3
1566d0df1aacSBram Moolenaar      break
1567d0df1aacSBram Moolenaar    endif
1568d0df1aacSBram Moolenaar    cnt += 1
1569d0df1aacSBram Moolenaar    if cnt == 2
1570d0df1aacSBram Moolenaar      continue
1571d0df1aacSBram Moolenaar    endif
1572d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1573d0df1aacSBram Moolenaar  endwhile
1574d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1575d0df1aacSBram Moolenaarenddef
1576d0df1aacSBram Moolenaar
1577e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1578675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1579675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1580675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1581675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1582675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1583675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1584675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1585bd5da371SBram Moolenaarenddef
1586bd5da371SBram Moolenaar
15879645e2d9SBram Moolenaardef Test_interrupt_loop()
158897acfc78SBram Moolenaar  let caught = false
15899645e2d9SBram Moolenaar  let x = 0
159097acfc78SBram Moolenaar  try
15919645e2d9SBram Moolenaar    while 1
15929645e2d9SBram Moolenaar      x += 1
15939645e2d9SBram Moolenaar      if x == 100
15949645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
15959645e2d9SBram Moolenaar      endif
15969645e2d9SBram Moolenaar    endwhile
159797acfc78SBram Moolenaar  catch
159897acfc78SBram Moolenaar    caught = true
159997acfc78SBram Moolenaar    assert_equal(100, x)
160097acfc78SBram Moolenaar  endtry
160197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
16029645e2d9SBram Moolenaarenddef
160320431c9dSBram Moolenaar
16044fdae999SBram Moolenaardef Test_automatic_line_continuation()
16054fdae999SBram Moolenaar  let mylist = [
16064fdae999SBram Moolenaar      'one',
16074fdae999SBram Moolenaar      'two',
16084fdae999SBram Moolenaar      'three',
1609f5be8cdbSBram Moolenaar      ] # comment
16104fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
16114fdae999SBram Moolenaar
16124fdae999SBram Moolenaar  let mydict = {
16134fdae999SBram Moolenaar      'one': 1,
16144fdae999SBram Moolenaar      'two': 2,
16154fdae999SBram Moolenaar      'three':
16164fdae999SBram Moolenaar          3,
1617f5be8cdbSBram Moolenaar      } # comment
16184fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
16194fdae999SBram Moolenaar  mydict = #{
16202c330432SBram Moolenaar      one: 1,  # comment
16212c330432SBram Moolenaar      two:     # comment
16222c330432SBram Moolenaar           2,  # comment
16232c330432SBram Moolenaar      three: 3 # comment
16242c330432SBram Moolenaar      }
16252c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
16262c330432SBram Moolenaar  mydict = #{
16272c330432SBram Moolenaar      one: 1,
16284fdae999SBram Moolenaar      two:
16294fdae999SBram Moolenaar           2,
16302c330432SBram Moolenaar      three: 3
16314fdae999SBram Moolenaar      }
16324fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1633e6085c53SBram Moolenaar
1634e6085c53SBram Moolenaar  assert_equal(
1635e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1636e6085c53SBram Moolenaar        split('one two three')
1637e6085c53SBram Moolenaar        )
16384fdae999SBram Moolenaarenddef
16394fdae999SBram Moolenaar
16407a092245SBram Moolenaardef Test_vim9_comment()
16417a092245SBram Moolenaar  CheckScriptSuccess([
16427a092245SBram Moolenaar      'vim9script',
16437a092245SBram Moolenaar      '# something',
16447a092245SBram Moolenaar      ])
16457a092245SBram Moolenaar  CheckScriptFailure([
16467a092245SBram Moolenaar      'vim9script',
16477a092245SBram Moolenaar      ':# something',
16487a092245SBram Moolenaar      ], 'E488:')
16497a092245SBram Moolenaar  CheckScriptFailure([
16507a092245SBram Moolenaar      '# something',
16517a092245SBram Moolenaar      ], 'E488:')
16527a092245SBram Moolenaar  CheckScriptFailure([
16537a092245SBram Moolenaar      ':# something',
16547a092245SBram Moolenaar      ], 'E488:')
16557a092245SBram Moolenaar
16564a8d9f2eSBram Moolenaar  { # block start
16574a8d9f2eSBram Moolenaar  } # block end
16584a8d9f2eSBram Moolenaar  CheckDefFailure([
16594a8d9f2eSBram Moolenaar      '{# comment',
16604a8d9f2eSBram Moolenaar      ], 'E488:')
16614a8d9f2eSBram Moolenaar  CheckDefFailure([
16624a8d9f2eSBram Moolenaar      '{',
16634a8d9f2eSBram Moolenaar      '}# comment',
16644a8d9f2eSBram Moolenaar      ], 'E488:')
16654a8d9f2eSBram Moolenaar
16664a8d9f2eSBram Moolenaar  echo "yes" # comment
16674a8d9f2eSBram Moolenaar  CheckDefFailure([
16684a8d9f2eSBram Moolenaar      'echo "yes"# comment',
16694a8d9f2eSBram Moolenaar      ], 'E488:')
16707a092245SBram Moolenaar  CheckScriptSuccess([
16717a092245SBram Moolenaar      'vim9script',
16727a092245SBram Moolenaar      'echo "yes" # something',
16737a092245SBram Moolenaar      ])
16747a092245SBram Moolenaar  CheckScriptFailure([
16757a092245SBram Moolenaar      'vim9script',
16767a092245SBram Moolenaar      'echo "yes"# something',
16777a092245SBram Moolenaar      ], 'E121:')
16787a092245SBram Moolenaar  CheckScriptFailure([
16797a092245SBram Moolenaar      'vim9script',
16807a092245SBram Moolenaar      'echo# something',
16817a092245SBram Moolenaar      ], 'E121:')
16827a092245SBram Moolenaar  CheckScriptFailure([
16837a092245SBram Moolenaar      'echo "yes" # something',
16847a092245SBram Moolenaar      ], 'E121:')
16857a092245SBram Moolenaar
16864a8d9f2eSBram Moolenaar  exe "echo" # comment
16874a8d9f2eSBram Moolenaar  CheckDefFailure([
16884a8d9f2eSBram Moolenaar      'exe "echo"# comment',
16894a8d9f2eSBram Moolenaar      ], 'E488:')
16904a8d9f2eSBram Moolenaar  CheckScriptSuccess([
16914a8d9f2eSBram Moolenaar      'vim9script',
16924a8d9f2eSBram Moolenaar      'exe "echo" # something',
16934a8d9f2eSBram Moolenaar      ])
16944a8d9f2eSBram Moolenaar  CheckScriptFailure([
16954a8d9f2eSBram Moolenaar      'vim9script',
16964a8d9f2eSBram Moolenaar      'exe "echo"# something',
16974a8d9f2eSBram Moolenaar      ], 'E121:')
16984a8d9f2eSBram Moolenaar  CheckDefFailure([
16994a8d9f2eSBram Moolenaar      'exe # comment',
17004a8d9f2eSBram Moolenaar      ], 'E1015:')
17014a8d9f2eSBram Moolenaar  CheckScriptFailure([
17024a8d9f2eSBram Moolenaar      'vim9script',
17034a8d9f2eSBram Moolenaar      'exe# something',
17044a8d9f2eSBram Moolenaar      ], 'E121:')
17054a8d9f2eSBram Moolenaar  CheckScriptFailure([
17064a8d9f2eSBram Moolenaar      'exe "echo" # something',
17074a8d9f2eSBram Moolenaar      ], 'E121:')
17084a8d9f2eSBram Moolenaar
17097a092245SBram Moolenaar  CheckDefFailure([
17107a092245SBram Moolenaar      'try# comment',
17117a092245SBram Moolenaar      '  echo "yes"',
17127a092245SBram Moolenaar      'catch',
17137a092245SBram Moolenaar      'endtry',
17147a092245SBram Moolenaar      ], 'E488:')
17152c5ed4e3SBram Moolenaar  CheckScriptFailure([
17162c5ed4e3SBram Moolenaar      'vim9script',
17172c5ed4e3SBram Moolenaar      'try# comment',
17182c5ed4e3SBram Moolenaar      'echo "yes"',
17192c5ed4e3SBram Moolenaar      ], 'E488:')
17207a092245SBram Moolenaar  CheckDefFailure([
17217a092245SBram Moolenaar      'try',
1722a72cfb80SBram Moolenaar      '  throw#comment',
1723a72cfb80SBram Moolenaar      'catch',
1724a72cfb80SBram Moolenaar      'endtry',
1725a72cfb80SBram Moolenaar      ], 'E1015:')
1726a72cfb80SBram Moolenaar  CheckDefFailure([
1727a72cfb80SBram Moolenaar      'try',
1728a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1729a72cfb80SBram Moolenaar      'catch',
1730a72cfb80SBram Moolenaar      'endtry',
1731a72cfb80SBram Moolenaar      ], 'E488:')
1732a72cfb80SBram Moolenaar  CheckDefFailure([
1733a72cfb80SBram Moolenaar      'try',
17347a092245SBram Moolenaar      '  echo "yes"',
17357a092245SBram Moolenaar      'catch# comment',
17367a092245SBram Moolenaar      'endtry',
17377a092245SBram Moolenaar      ], 'E488:')
17382c5ed4e3SBram Moolenaar  CheckScriptFailure([
17392c5ed4e3SBram Moolenaar      'vim9script',
17402c5ed4e3SBram Moolenaar      'try',
17412c5ed4e3SBram Moolenaar      '  echo "yes"',
17422c5ed4e3SBram Moolenaar      'catch# comment',
17432c5ed4e3SBram Moolenaar      'endtry',
17442c5ed4e3SBram Moolenaar      ], 'E654:')
17452c5ed4e3SBram Moolenaar  CheckDefFailure([
17462c5ed4e3SBram Moolenaar      'try',
17472c5ed4e3SBram Moolenaar      '  echo "yes"',
17482c5ed4e3SBram Moolenaar      'catch /pat/# comment',
17492c5ed4e3SBram Moolenaar      'endtry',
17502c5ed4e3SBram Moolenaar      ], 'E488:')
17517a092245SBram Moolenaar  CheckDefFailure([
17527a092245SBram Moolenaar      'try',
17537a092245SBram Moolenaar      'echo "yes"',
17547a092245SBram Moolenaar      'catch',
17557a092245SBram Moolenaar      'endtry# comment',
17567a092245SBram Moolenaar      ], 'E488:')
17572c5ed4e3SBram Moolenaar  CheckScriptFailure([
17582c5ed4e3SBram Moolenaar      'vim9script',
17592c5ed4e3SBram Moolenaar      'try',
17602c5ed4e3SBram Moolenaar      '  echo "yes"',
17612c5ed4e3SBram Moolenaar      'catch',
17622c5ed4e3SBram Moolenaar      'endtry# comment',
17639b7bf9e9SBram Moolenaar      ], 'E488:')
17642c5ed4e3SBram Moolenaar
17652c5ed4e3SBram Moolenaar  CheckScriptSuccess([
17662c5ed4e3SBram Moolenaar      'vim9script',
17672c5ed4e3SBram Moolenaar      'hi # comment',
17682c5ed4e3SBram Moolenaar      ])
17692c5ed4e3SBram Moolenaar  CheckScriptFailure([
17702c5ed4e3SBram Moolenaar      'vim9script',
17712c5ed4e3SBram Moolenaar      'hi# comment',
17722c5ed4e3SBram Moolenaar      ], 'E416:')
17731966c248SBram Moolenaar  CheckScriptSuccess([
17741966c248SBram Moolenaar      'vim9script',
17751966c248SBram Moolenaar      'hi Search # comment',
17761966c248SBram Moolenaar      ])
17771966c248SBram Moolenaar  CheckScriptFailure([
17781966c248SBram Moolenaar      'vim9script',
17791966c248SBram Moolenaar      'hi Search# comment',
17801966c248SBram Moolenaar      ], 'E416:')
17811966c248SBram Moolenaar  CheckScriptSuccess([
17821966c248SBram Moolenaar      'vim9script',
17831966c248SBram Moolenaar      'hi link This Search # comment',
17841966c248SBram Moolenaar      ])
17851966c248SBram Moolenaar  CheckScriptFailure([
17861966c248SBram Moolenaar      'vim9script',
17871966c248SBram Moolenaar      'hi link This That# comment',
17881966c248SBram Moolenaar      ], 'E413:')
17891966c248SBram Moolenaar  CheckScriptSuccess([
17901966c248SBram Moolenaar      'vim9script',
17911966c248SBram Moolenaar      'hi clear This # comment',
17921966c248SBram Moolenaar      'hi clear # comment',
17931966c248SBram Moolenaar      ])
1794f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
1795f5be8cdbSBram Moolenaar  # hi clear This# comment',
17961966c248SBram Moolenaar  CheckScriptFailure([
17971966c248SBram Moolenaar      'vim9script',
17981966c248SBram Moolenaar      'hi clear# comment',
17991966c248SBram Moolenaar      ], 'E416:')
18001966c248SBram Moolenaar
18011966c248SBram Moolenaar  CheckScriptSuccess([
18021966c248SBram Moolenaar      'vim9script',
18031966c248SBram Moolenaar      'hi Group term=bold',
18041966c248SBram Moolenaar      'match Group /todo/ # comment',
18051966c248SBram Moolenaar      ])
18061966c248SBram Moolenaar  CheckScriptFailure([
18071966c248SBram Moolenaar      'vim9script',
18081966c248SBram Moolenaar      'hi Group term=bold',
18091966c248SBram Moolenaar      'match Group /todo/# comment',
18101966c248SBram Moolenaar      ], 'E488:')
18111966c248SBram Moolenaar  CheckScriptSuccess([
18121966c248SBram Moolenaar      'vim9script',
18131966c248SBram Moolenaar      'match # comment',
18141966c248SBram Moolenaar      ])
18151966c248SBram Moolenaar  CheckScriptFailure([
18161966c248SBram Moolenaar      'vim9script',
18171966c248SBram Moolenaar      'match# comment',
18181966c248SBram Moolenaar      ], 'E475:')
18191966c248SBram Moolenaar  CheckScriptSuccess([
18201966c248SBram Moolenaar      'vim9script',
18211966c248SBram Moolenaar      'match none # comment',
18221966c248SBram Moolenaar      ])
18231966c248SBram Moolenaar  CheckScriptFailure([
18241966c248SBram Moolenaar      'vim9script',
18251966c248SBram Moolenaar      'match none# comment',
18261966c248SBram Moolenaar      ], 'E475:')
18271966c248SBram Moolenaar
18281966c248SBram Moolenaar  CheckScriptSuccess([
18291966c248SBram Moolenaar      'vim9script',
18301966c248SBram Moolenaar      'menutrans clear # comment',
18311966c248SBram Moolenaar      ])
18321966c248SBram Moolenaar  CheckScriptFailure([
18331966c248SBram Moolenaar      'vim9script',
18341966c248SBram Moolenaar      'menutrans clear# comment text',
18351966c248SBram Moolenaar      ], 'E474:')
18361966c248SBram Moolenaar
18371966c248SBram Moolenaar  CheckScriptSuccess([
18381966c248SBram Moolenaar      'vim9script',
18391966c248SBram Moolenaar      'syntax clear # comment',
18401966c248SBram Moolenaar      ])
18411966c248SBram Moolenaar  CheckScriptFailure([
18421966c248SBram Moolenaar      'vim9script',
18431966c248SBram Moolenaar      'syntax clear# comment text',
18441966c248SBram Moolenaar      ], 'E28:')
18451966c248SBram Moolenaar  CheckScriptSuccess([
18461966c248SBram Moolenaar      'vim9script',
18471966c248SBram Moolenaar      'syntax keyword Word some',
18481966c248SBram Moolenaar      'syntax clear Word # comment',
18491966c248SBram Moolenaar      ])
18501966c248SBram Moolenaar  CheckScriptFailure([
18511966c248SBram Moolenaar      'vim9script',
18521966c248SBram Moolenaar      'syntax keyword Word some',
18531966c248SBram Moolenaar      'syntax clear Word# comment text',
18541966c248SBram Moolenaar      ], 'E28:')
18551966c248SBram Moolenaar
18561966c248SBram Moolenaar  CheckScriptSuccess([
18571966c248SBram Moolenaar      'vim9script',
18581966c248SBram Moolenaar      'syntax list # comment',
18591966c248SBram Moolenaar      ])
18601966c248SBram Moolenaar  CheckScriptFailure([
18611966c248SBram Moolenaar      'vim9script',
18621966c248SBram Moolenaar      'syntax list# comment text',
18631966c248SBram Moolenaar      ], 'E28:')
18641966c248SBram Moolenaar
18651966c248SBram Moolenaar  CheckScriptSuccess([
18661966c248SBram Moolenaar      'vim9script',
18671966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
18681966c248SBram Moolenaar      ])
18691966c248SBram Moolenaar  CheckScriptFailure([
18701966c248SBram Moolenaar      'vim9script',
18711966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
18721966c248SBram Moolenaar      ], 'E475:')
18731966c248SBram Moolenaar
18741966c248SBram Moolenaar  CheckScriptSuccess([
18751966c248SBram Moolenaar      'vim9script',
18761966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
18771966c248SBram Moolenaar      ])
18781966c248SBram Moolenaar  CheckScriptFailure([
18791966c248SBram Moolenaar      'vim9script',
18801966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
18811966c248SBram Moolenaar      ], 'E789:')
18821966c248SBram Moolenaar
18831966c248SBram Moolenaar  CheckScriptSuccess([
18841966c248SBram Moolenaar      'vim9script',
18851966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
18861966c248SBram Moolenaar      ])
18871966c248SBram Moolenaar  CheckScriptFailure([
18881966c248SBram Moolenaar      'vim9script',
18891966c248SBram Moolenaar      'syntax match Word /pat/# comment',
18901966c248SBram Moolenaar      ], 'E402:')
18911966c248SBram Moolenaar
18921966c248SBram Moolenaar  CheckScriptSuccess([
18931966c248SBram Moolenaar      'vim9script',
18941966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
18951966c248SBram Moolenaar      ])
18961966c248SBram Moolenaar  CheckScriptFailure([
18971966c248SBram Moolenaar      'vim9script',
18981966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
18991966c248SBram Moolenaar      ], 'E475:')
19001966c248SBram Moolenaar  CheckScriptFailure([
19011966c248SBram Moolenaar      'vim9script',
19021966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
19031966c248SBram Moolenaar      ], 'E406:')
19041966c248SBram Moolenaar  CheckScriptFailure([
19051966c248SBram Moolenaar      'vim9script',
19061966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
19071966c248SBram Moolenaar      ], 'E475:')
19081966c248SBram Moolenaar
19091966c248SBram Moolenaar  CheckScriptSuccess([
19101966c248SBram Moolenaar      'vim9script',
19111966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
19121966c248SBram Moolenaar      ])
19131966c248SBram Moolenaar  CheckScriptFailure([
19141966c248SBram Moolenaar      'vim9script',
19151966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
19161966c248SBram Moolenaar      ], 'E475:')
19171966c248SBram Moolenaar
19181966c248SBram Moolenaar  CheckScriptSuccess([
19191966c248SBram Moolenaar      'vim9script',
19201966c248SBram Moolenaar      'syntax sync # comment',
19211966c248SBram Moolenaar      ])
19221966c248SBram Moolenaar  CheckScriptFailure([
19231966c248SBram Moolenaar      'vim9script',
19241966c248SBram Moolenaar      'syntax sync# comment',
19251966c248SBram Moolenaar      ], 'E404:')
19261966c248SBram Moolenaar  CheckScriptSuccess([
19271966c248SBram Moolenaar      'vim9script',
19281966c248SBram Moolenaar      'syntax sync ccomment # comment',
19291966c248SBram Moolenaar      ])
19301966c248SBram Moolenaar  CheckScriptFailure([
19311966c248SBram Moolenaar      'vim9script',
19321966c248SBram Moolenaar      'syntax sync ccomment# comment',
19331966c248SBram Moolenaar      ], 'E404:')
19341966c248SBram Moolenaar
19351966c248SBram Moolenaar  CheckScriptSuccess([
19361966c248SBram Moolenaar      'vim9script',
19371966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
19381966c248SBram Moolenaar      ])
19391966c248SBram Moolenaar  CheckScriptFailure([
19401966c248SBram Moolenaar      'vim9script',
19411966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
19421966c248SBram Moolenaar      ], 'E475:')
1943a72cfb80SBram Moolenaar
1944a72cfb80SBram Moolenaar  CheckScriptSuccess([
1945a72cfb80SBram Moolenaar      'vim9script',
1946a72cfb80SBram Moolenaar      'command Echo echo # comment',
1947a72cfb80SBram Moolenaar      'command Echo # comment',
1948a72cfb80SBram Moolenaar      ])
1949a72cfb80SBram Moolenaar  CheckScriptFailure([
1950a72cfb80SBram Moolenaar      'vim9script',
1951a72cfb80SBram Moolenaar      'command Echo echo# comment',
1952a72cfb80SBram Moolenaar      'Echo',
1953a72cfb80SBram Moolenaar      ], 'E121:')
1954a72cfb80SBram Moolenaar  CheckScriptFailure([
1955a72cfb80SBram Moolenaar      'vim9script',
1956a72cfb80SBram Moolenaar      'command Echo# comment',
1957a72cfb80SBram Moolenaar      ], 'E182:')
1958a72cfb80SBram Moolenaar  CheckScriptFailure([
1959a72cfb80SBram Moolenaar      'vim9script',
1960a72cfb80SBram Moolenaar      'command Echo echo',
1961a72cfb80SBram Moolenaar      'command Echo# comment',
1962a72cfb80SBram Moolenaar      ], 'E182:')
1963a72cfb80SBram Moolenaar
1964a72cfb80SBram Moolenaar  CheckScriptSuccess([
1965a72cfb80SBram Moolenaar      'vim9script',
1966a72cfb80SBram Moolenaar      'function # comment',
1967a72cfb80SBram Moolenaar      ])
1968a72cfb80SBram Moolenaar  CheckScriptFailure([
1969a72cfb80SBram Moolenaar      'vim9script',
1970a72cfb80SBram Moolenaar      'function# comment',
1971a72cfb80SBram Moolenaar      ], 'E129:')
1972a72cfb80SBram Moolenaar  CheckScriptSuccess([
1973a72cfb80SBram Moolenaar      'vim9script',
1974a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1975a72cfb80SBram Moolenaar      ])
1976a72cfb80SBram Moolenaar  CheckScriptFailure([
1977a72cfb80SBram Moolenaar      'vim9script',
1978a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1979a72cfb80SBram Moolenaar      ], 'E488:')
1980a72cfb80SBram Moolenaar
1981a72cfb80SBram Moolenaar  CheckScriptSuccess([
1982a72cfb80SBram Moolenaar      'vim9script',
19834c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1984a72cfb80SBram Moolenaar      'endfunc',
19854c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1986a72cfb80SBram Moolenaar      ])
1987a72cfb80SBram Moolenaar  CheckScriptFailure([
1988a72cfb80SBram Moolenaar      'vim9script',
19894c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1990a72cfb80SBram Moolenaar      'endfunc',
19914c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1992a72cfb80SBram Moolenaar      ], 'E488:')
1993a72cfb80SBram Moolenaar
1994a72cfb80SBram Moolenaar  CheckScriptSuccess([
1995a72cfb80SBram Moolenaar      'vim9script',
1996a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1997a72cfb80SBram Moolenaar      ])
1998a72cfb80SBram Moolenaar  CheckScriptFailure([
1999a72cfb80SBram Moolenaar      'vim9script',
2000a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2001a72cfb80SBram Moolenaar      ], 'E488:')
20022c5ed4e3SBram Moolenaarenddef
20032c5ed4e3SBram Moolenaar
20042c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
20052c5ed4e3SBram Moolenaar  CheckCanRunGui
20062c5ed4e3SBram Moolenaar
20072c5ed4e3SBram Moolenaar  CheckScriptFailure([
20082c5ed4e3SBram Moolenaar      'vim9script',
20092c5ed4e3SBram Moolenaar      'gui#comment'
20102c5ed4e3SBram Moolenaar      ], 'E499:')
20112c5ed4e3SBram Moolenaar  CheckScriptFailure([
20122c5ed4e3SBram Moolenaar      'vim9script',
20132c5ed4e3SBram Moolenaar      'gui -f#comment'
20142c5ed4e3SBram Moolenaar      ], 'E499:')
20157a092245SBram Moolenaarenddef
20167a092245SBram Moolenaar
2017a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
20186797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
20196797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2020a26b9700SBram Moolenaar
2021a26b9700SBram Moolenaar  edit test.vim
2022a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2023a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2024a26b9700SBram Moolenaar
2025a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2026a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2027a26b9700SBram Moolenaar
2028a26b9700SBram Moolenaar  g:entered = 0
2029a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2030a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2031a26b9700SBram Moolenaar
2032a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2033a26b9700SBram Moolenaar
2034a26b9700SBram Moolenaar  au! TabEnter
2035a26b9700SBram Moolenaar  unlet g:entered
2036d72c1bf0SBram Moolenaar
2037d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2038d72c1bf0SBram Moolenaar      'vim9script',
20396797966dSBram Moolenaar      'g:var = 123',
2040e55b1c09SBram Moolenaar      'b:var = 456',
2041e55b1c09SBram Moolenaar      'w:var = 777',
2042e55b1c09SBram Moolenaar      't:var = 888',
2043d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2044d72c1bf0SBram Moolenaar      ])
2045d72c1bf0SBram Moolenaar
2046d72c1bf0SBram Moolenaar  CheckScriptFailure([
2047d72c1bf0SBram Moolenaar      'vim9script',
2048d72c1bf0SBram Moolenaar      'let g:var = 123',
2049e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2050e55b1c09SBram Moolenaar
2051e55b1c09SBram Moolenaar  CheckScriptFailure([
2052e55b1c09SBram Moolenaar      'vim9script',
2053e55b1c09SBram Moolenaar      'let b:var = 123',
2054e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2055e55b1c09SBram Moolenaar
2056e55b1c09SBram Moolenaar  CheckScriptFailure([
2057e55b1c09SBram Moolenaar      'vim9script',
2058e55b1c09SBram Moolenaar      'let w:var = 123',
2059e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2060e55b1c09SBram Moolenaar
2061e55b1c09SBram Moolenaar  CheckScriptFailure([
2062e55b1c09SBram Moolenaar      'vim9script',
2063e55b1c09SBram Moolenaar      'let t:var = 123',
2064e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2065e55b1c09SBram Moolenaar
2066e55b1c09SBram Moolenaar  CheckScriptFailure([
2067e55b1c09SBram Moolenaar      'vim9script',
2068e55b1c09SBram Moolenaar      'let v:version = 123',
2069e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2070e55b1c09SBram Moolenaar
2071e55b1c09SBram Moolenaar  CheckScriptFailure([
2072e55b1c09SBram Moolenaar      'vim9script',
2073e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2074e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
20756797966dSBram Moolenaar
20766797966dSBram Moolenaar  CheckScriptFailure([
20776797966dSBram Moolenaar      'vim9script',
20786797966dSBram Moolenaar      'g:var = 123',
207932e35117SBram Moolenaar      'unlet g:var# comment1',
2080d72c1bf0SBram Moolenaar      ], 'E108:')
2081d72c1bf0SBram Moolenaar
2082d72c1bf0SBram Moolenaar  CheckScriptFailure([
2083d72c1bf0SBram Moolenaar      'let g:var = 123',
2084d72c1bf0SBram Moolenaar      'unlet g:var # something',
2085d72c1bf0SBram Moolenaar      ], 'E488:')
2086faac4104SBram Moolenaar
2087faac4104SBram Moolenaar  CheckScriptSuccess([
2088faac4104SBram Moolenaar      'vim9script',
208932e35117SBram Moolenaar      'if 1 # comment2',
2090faac4104SBram Moolenaar      '  echo "yes"',
2091faac4104SBram Moolenaar      'elseif 2 #comment',
2092faac4104SBram Moolenaar      '  echo "no"',
2093faac4104SBram Moolenaar      'endif',
2094faac4104SBram Moolenaar      ])
2095faac4104SBram Moolenaar
2096faac4104SBram Moolenaar  CheckScriptFailure([
2097faac4104SBram Moolenaar      'vim9script',
209832e35117SBram Moolenaar      'if 1# comment3',
2099faac4104SBram Moolenaar      '  echo "yes"',
2100faac4104SBram Moolenaar      'endif',
2101faac4104SBram Moolenaar      ], 'E15:')
2102faac4104SBram Moolenaar
2103faac4104SBram Moolenaar  CheckScriptFailure([
2104faac4104SBram Moolenaar      'vim9script',
210532e35117SBram Moolenaar      'if 0 # comment4',
2106faac4104SBram Moolenaar      '  echo "yes"',
2107faac4104SBram Moolenaar      'elseif 2#comment',
2108faac4104SBram Moolenaar      '  echo "no"',
2109faac4104SBram Moolenaar      'endif',
2110faac4104SBram Moolenaar      ], 'E15:')
2111faac4104SBram Moolenaar
2112faac4104SBram Moolenaar  CheckScriptSuccess([
2113faac4104SBram Moolenaar      'vim9script',
211432e35117SBram Moolenaar      'let v = 1 # comment5',
2115faac4104SBram Moolenaar      ])
2116faac4104SBram Moolenaar
2117faac4104SBram Moolenaar  CheckScriptFailure([
2118faac4104SBram Moolenaar      'vim9script',
211932e35117SBram Moolenaar      'let v = 1# comment6',
212032e35117SBram Moolenaar      ], 'E15:')
2121faac4104SBram Moolenaar
2122faac4104SBram Moolenaar  CheckScriptSuccess([
2123faac4104SBram Moolenaar      'vim9script',
2124faac4104SBram Moolenaar      'new'
2125faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2126df069eecSBram Moolenaar      ':$',
2127faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2128faac4104SBram Moolenaar      'bwipe!',
2129faac4104SBram Moolenaar      ])
2130faac4104SBram Moolenaar
2131f5be8cdbSBram Moolenaar  CheckScriptFailure([
2132f5be8cdbSBram Moolenaar      'vim9script',
2133f5be8cdbSBram Moolenaar      'new'
2134f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2135f5be8cdbSBram Moolenaar      ':$',
2136f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2137f5be8cdbSBram Moolenaar      'bwipe!',
2138f5be8cdbSBram Moolenaar      ], 'E488:')
2139f5be8cdbSBram Moolenaar
2140f5be8cdbSBram Moolenaar  CheckScriptFailure([
2141f5be8cdbSBram Moolenaar      'vim9script',
2142f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2143f5be8cdbSBram Moolenaar      ], 'E477:')
2144a26b9700SBram Moolenaarenddef
2145a26b9700SBram Moolenaar
21467e5bd91dSBram Moolenaardef Test_finish()
21477e5bd91dSBram Moolenaar  let lines =<< trim END
21487e5bd91dSBram Moolenaar    vim9script
21496797966dSBram Moolenaar    g:res = 'one'
21507e5bd91dSBram Moolenaar    if v:false | finish | endif
21516797966dSBram Moolenaar    g:res = 'two'
21527e5bd91dSBram Moolenaar    finish
21536797966dSBram Moolenaar    g:res = 'three'
21547e5bd91dSBram Moolenaar  END
21557e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
21567e5bd91dSBram Moolenaar  source Xfinished
21577e5bd91dSBram Moolenaar  assert_equal('two', g:res)
21587e5bd91dSBram Moolenaar
21597e5bd91dSBram Moolenaar  unlet g:res
21607e5bd91dSBram Moolenaar  delete('Xfinished')
21617e5bd91dSBram Moolenaarenddef
21627e5bd91dSBram Moolenaar
216332e35117SBram Moolenaardef Test_let_func_call()
216432e35117SBram Moolenaar  let lines =<< trim END
216532e35117SBram Moolenaar    vim9script
216632e35117SBram Moolenaar    func GetValue()
216732e35117SBram Moolenaar      if exists('g:count')
216832e35117SBram Moolenaar        let g:count += 1
216932e35117SBram Moolenaar      else
217032e35117SBram Moolenaar        let g:count = 1
217132e35117SBram Moolenaar      endif
217232e35117SBram Moolenaar      return 'this'
217332e35117SBram Moolenaar    endfunc
217432e35117SBram Moolenaar    let val: string = GetValue()
2175f5be8cdbSBram Moolenaar    # env var is always a string
2176df671b46SBram Moolenaar    let env = $TERM
217732e35117SBram Moolenaar  END
217832e35117SBram Moolenaar  writefile(lines, 'Xfinished')
217932e35117SBram Moolenaar  source Xfinished
2180f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
218132e35117SBram Moolenaar  assert_equal(1, g:count)
218232e35117SBram Moolenaar
218332e35117SBram Moolenaar  unlet g:count
218432e35117SBram Moolenaar  delete('Xfinished')
218532e35117SBram Moolenaarenddef
218632e35117SBram Moolenaar
218732e35117SBram Moolenaardef Test_let_missing_type()
218832e35117SBram Moolenaar  let lines =<< trim END
218932e35117SBram Moolenaar    vim9script
2190df671b46SBram Moolenaar    let var = g:unknown
2191227a69deSBram Moolenaar  END
2192822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2193227a69deSBram Moolenaar
2194227a69deSBram Moolenaar  lines =<< trim END
2195227a69deSBram Moolenaar    vim9script
2196227a69deSBram Moolenaar    let nr: number = 123
2197227a69deSBram Moolenaar    let var = nr
2198227a69deSBram Moolenaar  END
2199822ba247SBram Moolenaar  CheckScriptSuccess(lines)
220032e35117SBram Moolenaarenddef
220132e35117SBram Moolenaar
2202c82a5b5dSBram Moolenaardef Test_let_declaration()
2203c82a5b5dSBram Moolenaar  let lines =<< trim END
2204c82a5b5dSBram Moolenaar    vim9script
2205c82a5b5dSBram Moolenaar    let var: string
2206c82a5b5dSBram Moolenaar    g:var_uninit = var
2207c82a5b5dSBram Moolenaar    var = 'text'
2208c82a5b5dSBram Moolenaar    g:var_test = var
2209f5be8cdbSBram Moolenaar    # prefixing s: is optional
2210984dddbeSBram Moolenaar    s:var = 'prefixed'
2211984dddbeSBram Moolenaar    g:var_prefixed = s:var
2212984dddbeSBram Moolenaar
2213984dddbeSBram Moolenaar    let s:other: number
2214984dddbeSBram Moolenaar    other = 1234
2215984dddbeSBram Moolenaar    g:other_var = other
2216c82a5b5dSBram Moolenaar  END
2217c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2218c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2219c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2220984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2221984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2222c82a5b5dSBram Moolenaar
2223c82a5b5dSBram Moolenaar  unlet g:var_uninit
2224c82a5b5dSBram Moolenaar  unlet g:var_test
2225984dddbeSBram Moolenaar  unlet g:var_prefixed
2226984dddbeSBram Moolenaar  unlet g:other_var
2227c82a5b5dSBram Moolenaarenddef
2228c82a5b5dSBram Moolenaar
2229c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2230c5b1c20bSBram Moolenaar  let lines =<< trim END
2231c5b1c20bSBram Moolenaar    vim9script
2232c5b1c20bSBram Moolenaar    const var: string
2233c5b1c20bSBram Moolenaar  END
2234c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2235c5b1c20bSBram Moolenaar
2236c5b1c20bSBram Moolenaar  lines =<< trim END
2237c5b1c20bSBram Moolenaar    vim9script
2238c5b1c20bSBram Moolenaar    let 9var: string
2239c5b1c20bSBram Moolenaar  END
2240c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2241c5b1c20bSBram Moolenaarenddef
2242c5b1c20bSBram Moolenaar
224334db91f7SBram Moolenaardef Test_let_type_check()
224434db91f7SBram Moolenaar  let lines =<< trim END
224534db91f7SBram Moolenaar    vim9script
224634db91f7SBram Moolenaar    let var: string
224734db91f7SBram Moolenaar    var = 1234
224834db91f7SBram Moolenaar  END
224934db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2250984dddbeSBram Moolenaar
2251984dddbeSBram Moolenaar  lines =<< trim END
2252984dddbeSBram Moolenaar    vim9script
2253984dddbeSBram Moolenaar    let var:string
2254984dddbeSBram Moolenaar  END
2255984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2256c5b1c20bSBram Moolenaar
2257c5b1c20bSBram Moolenaar  lines =<< trim END
2258c5b1c20bSBram Moolenaar    vim9script
2259c5b1c20bSBram Moolenaar    let var: asdf
2260c5b1c20bSBram Moolenaar  END
2261c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
226234db91f7SBram Moolenaarenddef
226334db91f7SBram Moolenaar
2264a5d0077eSBram Moolenaardef Test_forward_declaration()
2265a5d0077eSBram Moolenaar  let lines =<< trim END
2266a5d0077eSBram Moolenaar    vim9script
2267a5d0077eSBram Moolenaar    def GetValue(): string
2268a5d0077eSBram Moolenaar      return theVal
2269a5d0077eSBram Moolenaar    enddef
2270a5d0077eSBram Moolenaar    let theVal = 'something'
2271822ba247SBram Moolenaar    g:initVal = GetValue()
2272a5d0077eSBram Moolenaar    theVal = 'else'
2273a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2274a5d0077eSBram Moolenaar  END
2275a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2276a5d0077eSBram Moolenaar  source Xforward
2277a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2278a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2279a5d0077eSBram Moolenaar
2280a5d0077eSBram Moolenaar  unlet g:initVal
2281a5d0077eSBram Moolenaar  unlet g:laterVal
2282a5d0077eSBram Moolenaar  delete('Xforward')
2283a5d0077eSBram Moolenaarenddef
2284a5d0077eSBram Moolenaar
22859721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
22869721fb4eSBram Moolenaar  let legacy_lines =<< trim END
22879721fb4eSBram Moolenaar    source Xvim9_script.vim
22889721fb4eSBram Moolenaar
22899721fb4eSBram Moolenaar    call assert_false(exists('local'))
22909721fb4eSBram Moolenaar    call assert_false(exists('exported'))
22919721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
22929721fb4eSBram Moolenaar    call assert_equal('global', global)
22939721fb4eSBram Moolenaar    call assert_equal('global', g:global)
22949721fb4eSBram Moolenaar
22959721fb4eSBram Moolenaar    " imported variable becomes script-local
22969721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
22979721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
22989721fb4eSBram Moolenaar    call assert_false(exists('exported'))
22999721fb4eSBram Moolenaar
23009721fb4eSBram Moolenaar    " imported function becomes script-local
23019721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
23029721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
23039721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
23049721fb4eSBram Moolenaar  END
23059721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
23069721fb4eSBram Moolenaar
23079721fb4eSBram Moolenaar  let vim9_lines =<< trim END
23089721fb4eSBram Moolenaar    vim9script
23099721fb4eSBram Moolenaar    let local = 'local'
23109721fb4eSBram Moolenaar    g:global = 'global'
23119721fb4eSBram Moolenaar    export let exported = 'exported'
23129721fb4eSBram Moolenaar    export def GetText(): string
23139721fb4eSBram Moolenaar       return 'text'
23149721fb4eSBram Moolenaar    enddef
23159721fb4eSBram Moolenaar  END
23169721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
23179721fb4eSBram Moolenaar
23189721fb4eSBram Moolenaar  source Xlegacy_script.vim
23199721fb4eSBram Moolenaar
23209721fb4eSBram Moolenaar  assert_equal('global', g:global)
2321f5be8cdbSBram Moolenaar  unlet g:global
23229721fb4eSBram Moolenaar
23239721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
23249721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
23259721fb4eSBram Moolenaarenddef
2326a5d0077eSBram Moolenaar
2327eeb27bfeSBram Moolenaardef Test_vim9_copen()
2328eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2329eeb27bfeSBram Moolenaar  copen
2330eeb27bfeSBram Moolenaar  quit
2331eeb27bfeSBram Moolenaarenddef
2332eeb27bfeSBram Moolenaar
2333585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2334585fea7bSBram Moolenaardef Test_substitute_cmd()
2335585fea7bSBram Moolenaar  new
2336585fea7bSBram Moolenaar  setline(1, 'something')
2337585fea7bSBram Moolenaar  :substitute(some(other(
2338585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2339585fea7bSBram Moolenaar  bwipe!
2340585fea7bSBram Moolenaar
2341f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2342585fea7bSBram Moolenaar  let lines =<< trim END
2343585fea7bSBram Moolenaar    vim9script
2344585fea7bSBram Moolenaar    new
2345585fea7bSBram Moolenaar    setline(1, 'something')
2346585fea7bSBram Moolenaar    :substitute(some(other(
2347585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2348585fea7bSBram Moolenaar    bwipe!
2349585fea7bSBram Moolenaar  END
2350585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2351585fea7bSBram Moolenaar  source Xvim9lines
2352585fea7bSBram Moolenaar
2353585fea7bSBram Moolenaar  delete('Xvim9lines')
2354585fea7bSBram Moolenaarenddef
2355585fea7bSBram Moolenaar
23568a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2357