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
116*f5be8cdbSBram 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
125*f5be8cdbSBram 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
178*f5be8cdbSBram 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()
188*f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
189*f5be8cdbSBram 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')
262*f5be8cdbSBram 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()
397*f5be8cdbSBram 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
406*f5be8cdbSBram 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)
5128a7d6542SBram Moolenaarenddef
5138a7d6542SBram Moolenaar
514257cc5eeSBram Moolenaardef ThrowFromDef()
515a72cfb80SBram Moolenaar  throw "getout" # comment
516257cc5eeSBram Moolenaarenddef
517257cc5eeSBram Moolenaar
518257cc5eeSBram Moolenaarfunc CatchInFunc()
519257cc5eeSBram Moolenaar  try
520257cc5eeSBram Moolenaar    call ThrowFromDef()
521257cc5eeSBram Moolenaar  catch
522257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
523257cc5eeSBram Moolenaar  endtry
524257cc5eeSBram Moolenaarendfunc
525257cc5eeSBram Moolenaar
526257cc5eeSBram Moolenaardef CatchInDef()
527257cc5eeSBram Moolenaar  try
528257cc5eeSBram Moolenaar    ThrowFromDef()
529257cc5eeSBram Moolenaar  catch
530257cc5eeSBram Moolenaar    g:thrown_def = v:exception
531257cc5eeSBram Moolenaar  endtry
532257cc5eeSBram Moolenaarenddef
533257cc5eeSBram Moolenaar
534f575adffSBram Moolenaardef ReturnFinally(): string
535f575adffSBram Moolenaar  try
536f575adffSBram Moolenaar    return 'intry'
537f575adffSBram Moolenaar  finally
538f575adffSBram Moolenaar    g:in_finally = 'finally'
539f575adffSBram Moolenaar  endtry
540f575adffSBram Moolenaar  return 'end'
541f575adffSBram Moolenaarenddef
542f575adffSBram Moolenaar
543257cc5eeSBram Moolenaardef Test_try_catch_nested()
544257cc5eeSBram Moolenaar  CatchInFunc()
545257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
546257cc5eeSBram Moolenaar
547257cc5eeSBram Moolenaar  CatchInDef()
548257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
549f575adffSBram Moolenaar
550f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
551f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
552f575adffSBram Moolenaarenddef
553f575adffSBram Moolenaar
554f575adffSBram Moolenaardef Test_try_catch_match()
555f575adffSBram Moolenaar  let seq = 'a'
556f575adffSBram Moolenaar  try
557f575adffSBram Moolenaar    throw 'something'
558f575adffSBram Moolenaar  catch /nothing/
559f575adffSBram Moolenaar    seq ..= 'x'
560f575adffSBram Moolenaar  catch /some/
561f575adffSBram Moolenaar    seq ..= 'b'
562f575adffSBram Moolenaar  catch /asdf/
563f575adffSBram Moolenaar    seq ..= 'x'
564e8c4abbbSBram Moolenaar  catch ?a\?sdf?
565e8c4abbbSBram Moolenaar    seq ..= 'y'
566f575adffSBram Moolenaar  finally
567f575adffSBram Moolenaar    seq ..= 'c'
568f575adffSBram Moolenaar  endtry
569f575adffSBram Moolenaar  assert_equal('abc', seq)
570257cc5eeSBram Moolenaarenddef
571257cc5eeSBram Moolenaar
572e8c4abbbSBram Moolenaardef Test_try_catch_fails()
573e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
574e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
575e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
576585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
577585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
578585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
579585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
580585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
581585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
582585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
583585fea7bSBram Moolenaar
584a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
585585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
586e8c4abbbSBram Moolenaarenddef
587e8c4abbbSBram Moolenaar
588006ad48bSBram Moolenaardef Test_throw_vimscript()
589*f5be8cdbSBram Moolenaar  # only checks line continuation
590006ad48bSBram Moolenaar  let lines =<< trim END
591006ad48bSBram Moolenaar      vim9script
592006ad48bSBram Moolenaar      try
593006ad48bSBram Moolenaar        throw 'one'
594006ad48bSBram Moolenaar              .. 'two'
595006ad48bSBram Moolenaar      catch
596006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
597006ad48bSBram Moolenaar      endtry
598006ad48bSBram Moolenaar  END
599006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
600006ad48bSBram Moolenaarenddef
601006ad48bSBram Moolenaar
60237c83711SBram Moolenaardef Test_cexpr_vimscript()
603*f5be8cdbSBram Moolenaar  # only checks line continuation
60437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
60537c83711SBram Moolenaar  let lines =<< trim END
60637c83711SBram Moolenaar      vim9script
60737c83711SBram Moolenaar      cexpr 'File'
60837c83711SBram Moolenaar                .. ' someFile' ..
60937c83711SBram Moolenaar                   ' line 19'
61037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
61137c83711SBram Moolenaar  END
61237c83711SBram Moolenaar  CheckScriptSuccess(lines)
61337c83711SBram Moolenaar  set errorformat&
61437c83711SBram Moolenaarenddef
61537c83711SBram Moolenaar
6162a1381c3SBram Moolenaarif has('channel')
61740ee466cSBram Moolenaar  let someJob = test_null_job()
61840ee466cSBram Moolenaar
61940ee466cSBram Moolenaar  def FuncWithError()
62040ee466cSBram Moolenaar    echomsg g:someJob
62140ee466cSBram Moolenaar  enddef
62240ee466cSBram Moolenaar
62340ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
62440ee466cSBram Moolenaar    try
62540ee466cSBram Moolenaar      call FuncWithError()
62640ee466cSBram Moolenaar    catch
62740ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
62840ee466cSBram Moolenaar    endtry
62940ee466cSBram Moolenaar  endfunc
6302a1381c3SBram Moolenaarendif
63140ee466cSBram Moolenaar
6328a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
6338a7d6542SBram Moolenaar  vim9script
6348a7d6542SBram Moolenaar  let name: string = 'bob'
6358a7d6542SBram Moolenaar  def Concat(arg: string): string
6368a7d6542SBram Moolenaar    return name .. arg
6378a7d6542SBram Moolenaar  enddef
638227a69deSBram Moolenaar  g:result = Concat('bie')
639227a69deSBram Moolenaar  g:localname = name
6408a7d6542SBram Moolenaar
6418a7d6542SBram Moolenaar  export const CONST = 1234
6428a7d6542SBram Moolenaar  export let exported = 9876
6436e587dcbSBram Moolenaar  export let exp_name = 'John'
6448a7d6542SBram Moolenaar  export def Exported(): string
6458a7d6542SBram Moolenaar    return 'Exported'
6468a7d6542SBram Moolenaar  enddef
6478a7d6542SBram MoolenaarEND
6488a7d6542SBram Moolenaar
6495269bd2aSBram Moolenaardef Test_vim9_import_export()
6508a7d6542SBram Moolenaar  let import_script_lines =<< trim END
6518a7d6542SBram Moolenaar    vim9script
6528a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
6538a7d6542SBram Moolenaar    g:imported = exported
6546e587dcbSBram Moolenaar    exported += 3
6556e587dcbSBram Moolenaar    g:imported_added = exported
6568a7d6542SBram Moolenaar    g:imported_func = Exported()
6576e587dcbSBram Moolenaar
6586e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
6596e587dcbSBram Moolenaar    g:imported_name = exp_name
6606e587dcbSBram Moolenaar    exp_name ..= ' Doe'
6616e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
6625381c7a1SBram Moolenaar    g:imported_later = exported
6638a7d6542SBram Moolenaar  END
6648a7d6542SBram Moolenaar
6658a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
6668a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
6678a7d6542SBram Moolenaar
6688a7d6542SBram Moolenaar  source Ximport.vim
6698a7d6542SBram Moolenaar
6708a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
6718a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
6728a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
6736e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
6745381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
6758a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
6766e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
6776e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
6788a7d6542SBram Moolenaar  assert_false(exists('g:name'))
6798a7d6542SBram Moolenaar
6808a7d6542SBram Moolenaar  unlet g:result
6818a7d6542SBram Moolenaar  unlet g:localname
6828a7d6542SBram Moolenaar  unlet g:imported
6836e587dcbSBram Moolenaar  unlet g:imported_added
6845381c7a1SBram Moolenaar  unlet g:imported_later
6858a7d6542SBram Moolenaar  unlet g:imported_func
6866e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
6878a7d6542SBram Moolenaar  delete('Ximport.vim')
688f2d5c240SBram Moolenaar
6891c991144SBram Moolenaar  # similar, with line breaks
6901c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
6911c991144SBram Moolenaar    vim9script
6921c991144SBram Moolenaar    import {
6931c991144SBram Moolenaar        exported,
6941c991144SBram Moolenaar        Exported,
6951c991144SBram Moolenaar        }
6961c991144SBram Moolenaar        from
6971c991144SBram Moolenaar        './Xexport.vim'
6981c991144SBram Moolenaar    g:imported = exported
6991c991144SBram Moolenaar    exported += 5
7001c991144SBram Moolenaar    g:imported_added = exported
7011c991144SBram Moolenaar    g:imported_func = Exported()
7021c991144SBram Moolenaar  END
7031c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
7041c991144SBram Moolenaar  source Ximport_lbr.vim
7051c991144SBram Moolenaar
7061c991144SBram Moolenaar  assert_equal(9876, g:imported)
7071c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
7081c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
7091c991144SBram Moolenaar
7101c991144SBram Moolenaar  # exported script not sourced again
7111c991144SBram Moolenaar  assert_false(exists('g:result'))
7121c991144SBram Moolenaar  unlet g:imported
7131c991144SBram Moolenaar  unlet g:imported_added
7141c991144SBram Moolenaar  unlet g:imported_func
7151c991144SBram Moolenaar  delete('Ximport_lbr.vim')
7161c991144SBram Moolenaar
7171c991144SBram Moolenaar  # import inside :def function
7185381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
7195381c7a1SBram Moolenaar    vim9script
7205381c7a1SBram Moolenaar    def ImportInDef()
7215381c7a1SBram Moolenaar      import exported from './Xexport.vim'
7225381c7a1SBram Moolenaar      g:imported = exported
7235381c7a1SBram Moolenaar      exported += 7
7245381c7a1SBram Moolenaar      g:imported_added = exported
7255381c7a1SBram Moolenaar    enddef
7265381c7a1SBram Moolenaar    ImportInDef()
7275381c7a1SBram Moolenaar  END
7285381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
7295381c7a1SBram Moolenaar  source Ximport2.vim
730*f5be8cdbSBram Moolenaar  # TODO: this should be 9879
7315381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
7325381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
7335381c7a1SBram Moolenaar  unlet g:imported
7345381c7a1SBram Moolenaar  unlet g:imported_added
7355381c7a1SBram Moolenaar  delete('Ximport2.vim')
7365381c7a1SBram Moolenaar
737f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
738f2d5c240SBram Moolenaar    vim9script
739f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
740f2d5c240SBram Moolenaar    def UseExport()
741f2d5c240SBram Moolenaar      g:imported = Export.exported
742f2d5c240SBram Moolenaar    enddef
743f2d5c240SBram Moolenaar    UseExport()
744f2d5c240SBram Moolenaar  END
745f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
746f2d5c240SBram Moolenaar  source Ximport.vim
7475381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
748f2d5c240SBram Moolenaar
749599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
750599c89c8SBram Moolenaar    vim9script
751599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
752599c89c8SBram Moolenaar    def Func()
753599c89c8SBram Moolenaar      let dummy = 1
754599c89c8SBram Moolenaar      let imported = Export + dummy
755599c89c8SBram Moolenaar    enddef
756822ba247SBram Moolenaar    defcompile
757599c89c8SBram Moolenaar  END
758599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
759599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
760599c89c8SBram Moolenaar
761599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
762599c89c8SBram Moolenaar    vim9script
763599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
764599c89c8SBram Moolenaar    def Func()
765599c89c8SBram Moolenaar      let imported = Export . exported
766599c89c8SBram Moolenaar    enddef
767822ba247SBram Moolenaar    defcompile
768599c89c8SBram Moolenaar  END
769599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
770599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
771599c89c8SBram Moolenaar
772599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
773599c89c8SBram Moolenaar    vim9script
774599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
775599c89c8SBram Moolenaar    def Func()
776599c89c8SBram Moolenaar      let imported = Export.
777599c89c8SBram Moolenaar    enddef
778822ba247SBram Moolenaar    defcompile
779599c89c8SBram Moolenaar  END
780599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
781599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
782599c89c8SBram Moolenaar
7831c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
7841c991144SBram Moolenaar    vim9script
7851c991144SBram Moolenaar    import *
7861c991144SBram Moolenaar        as Export
7871c991144SBram Moolenaar        from
7881c991144SBram Moolenaar        './Xexport.vim'
7891c991144SBram Moolenaar    def UseExport()
7901c991144SBram Moolenaar      g:imported = Export.exported
7911c991144SBram Moolenaar    enddef
7921c991144SBram Moolenaar    UseExport()
7931c991144SBram Moolenaar  END
7941c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
7951c991144SBram Moolenaar  source Ximport.vim
7961c991144SBram Moolenaar  assert_equal(9883, g:imported)
7971c991144SBram Moolenaar
798f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
799f2d5c240SBram Moolenaar    vim9script
800f2d5c240SBram Moolenaar    import * from './Xexport.vim'
801f2d5c240SBram Moolenaar  END
802f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
803f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
804f2d5c240SBram Moolenaar
805*f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
806fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
807fa29c8abSBram Moolenaar    vim9script
808fa29c8abSBram Moolenaar    import name from './Xexport.vim'
809fa29c8abSBram Moolenaar  END
810fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
811fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
812fa29c8abSBram Moolenaar
813*f5be8cdbSBram Moolenaar  # try to import something that is already defined
8145269bd2aSBram Moolenaar  let import_already_defined =<< trim END
8155269bd2aSBram Moolenaar    vim9script
8165269bd2aSBram Moolenaar    let exported = 'something'
8175269bd2aSBram Moolenaar    import exported from './Xexport.vim'
8185269bd2aSBram Moolenaar  END
8195269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
8205269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
8215269bd2aSBram Moolenaar
822*f5be8cdbSBram Moolenaar  # try to import something that is already defined
8235269bd2aSBram Moolenaar  import_already_defined =<< trim END
8245269bd2aSBram Moolenaar    vim9script
8255269bd2aSBram Moolenaar    let exported = 'something'
8265269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
8275269bd2aSBram Moolenaar  END
8285269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
8295269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
8305269bd2aSBram Moolenaar
831*f5be8cdbSBram Moolenaar  # try to import something that is already defined
8325269bd2aSBram Moolenaar  import_already_defined =<< trim END
8335269bd2aSBram Moolenaar    vim9script
8345269bd2aSBram Moolenaar    let exported = 'something'
8355269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
8365269bd2aSBram Moolenaar  END
8375269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
8385269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
8395269bd2aSBram Moolenaar
840*f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
841fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
842fa29c8abSBram Moolenaar    vim9script
843fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
844fa29c8abSBram Moolenaar  END
845fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
846fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
847fa29c8abSBram Moolenaar
848fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
849fa29c8abSBram Moolenaar    vim9script
850fa29c8abSBram Moolenaar    import name './Xexport.vim'
851fa29c8abSBram Moolenaar  END
852fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
853fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
854fa29c8abSBram Moolenaar
855fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
856fa29c8abSBram Moolenaar    vim9script
857fa29c8abSBram Moolenaar    import name from Xexport.vim
858fa29c8abSBram Moolenaar  END
859fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
860fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
861fa29c8abSBram Moolenaar
862fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
863fa29c8abSBram Moolenaar    vim9script
864fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
865fa29c8abSBram Moolenaar  END
866fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
867fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
868fa29c8abSBram Moolenaar
869fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
870fa29c8abSBram Moolenaar    vim9script
871fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
872fa29c8abSBram Moolenaar  END
8735269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
8745269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
875fa29c8abSBram Moolenaar
876f2d5c240SBram Moolenaar  delete('Ximport.vim')
8775269bd2aSBram Moolenaar  delete('Ximport3.vim')
8788a7d6542SBram Moolenaar  delete('Xexport.vim')
8798a7d6542SBram Moolenaar
880*f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
881750802b5SBram Moolenaar  set cpo&vi
882750802b5SBram Moolenaar  let cpo_before = &cpo
883750802b5SBram Moolenaar  let lines =<< trim END
884750802b5SBram Moolenaar    vim9script
885750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
886750802b5SBram Moolenaar  END
887750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
888750802b5SBram Moolenaar  source Xvim9_script
889750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
890750802b5SBram Moolenaar  set cpo&vim
891750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
892750802b5SBram Moolenaar  delete('Xvim9_script')
893750802b5SBram Moolenaarenddef
894750802b5SBram Moolenaar
895750802b5SBram Moolenaardef Test_vim9script_fails()
8968a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
8978a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
898750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
8999721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
9009b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
901750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
902750802b5SBram Moolenaar
903c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
904c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
905c785b9a7SBram Moolenaar
906750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
907a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
9088a7d6542SBram Moolenaarenddef
9098a7d6542SBram Moolenaar
910f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
911101f4810SBram Moolenaar  CheckRunVimInTerminal
912101f4810SBram Moolenaar
9139bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
914c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
9159bb3eb3eSBram Moolenaarendfunc
9169bb3eb3eSBram Moolenaar
917c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
918101f4810SBram Moolenaar  let export =<< trim END
919101f4810SBram Moolenaar    vim9script
920101f4810SBram Moolenaar    export def Foo(): number
921101f4810SBram Moolenaar        return 0
922101f4810SBram Moolenaar    enddef
923101f4810SBram Moolenaar  END
9249bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
925101f4810SBram Moolenaar
9269bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
9279bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
9289bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
929101f4810SBram Moolenaar
9309bb3eb3eSBram Moolenaar  delete('Xexport.vim')
9319bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
9329bb3eb3eSBram Moolenaarenddef
933101f4810SBram Moolenaar
9344c17ad94SBram Moolenaardef Test_vim9script_reload_import()
9358a7d6542SBram Moolenaar  let lines =<< trim END
9368a7d6542SBram Moolenaar    vim9script
9378a7d6542SBram Moolenaar    const var = ''
9388a7d6542SBram Moolenaar    let valone = 1234
9398a7d6542SBram Moolenaar    def MyFunc(arg: string)
9408a7d6542SBram Moolenaar       valone = 5678
9418a7d6542SBram Moolenaar    enddef
9428a7d6542SBram Moolenaar  END
9438a7d6542SBram Moolenaar  let morelines =<< trim END
9448a7d6542SBram Moolenaar    let valtwo = 222
9458a7d6542SBram Moolenaar    export def GetValtwo(): number
9468a7d6542SBram Moolenaar      return valtwo
9478a7d6542SBram Moolenaar    enddef
9488a7d6542SBram Moolenaar  END
94903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
9508a7d6542SBram Moolenaar  source Xreload.vim
9518a7d6542SBram Moolenaar  source Xreload.vim
9528a7d6542SBram Moolenaar  source Xreload.vim
9538a7d6542SBram Moolenaar
9548a7d6542SBram Moolenaar  let testlines =<< trim END
9558a7d6542SBram Moolenaar    vim9script
9568a7d6542SBram Moolenaar    def TheFunc()
9578a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
9588a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
9598a7d6542SBram Moolenaar    enddef
9608a7d6542SBram Moolenaar    TheFunc()
9618a7d6542SBram Moolenaar  END
9628a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
9638a7d6542SBram Moolenaar  source Ximport.vim
9648a7d6542SBram Moolenaar
965*f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
966*f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
9678a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
9688a7d6542SBram Moolenaar  source Ximport.vim
9698a7d6542SBram Moolenaar
970*f5be8cdbSBram Moolenaar  # cannot declare a var twice
9718a7d6542SBram Moolenaar  lines =<< trim END
9728a7d6542SBram Moolenaar    vim9script
9738a7d6542SBram Moolenaar    let valone = 1234
9748a7d6542SBram Moolenaar    let valone = 5678
9758a7d6542SBram Moolenaar  END
9768a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
9778a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
9788a7d6542SBram Moolenaar
9798a7d6542SBram Moolenaar  delete('Xreload.vim')
9808a7d6542SBram Moolenaar  delete('Ximport.vim')
9818a7d6542SBram Moolenaarenddef
9828a7d6542SBram Moolenaar
983fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
984fe465a01SBram Moolenaar" script-local name.
985fe465a01SBram Moolenaardef Test_vim9script_funcref()
986fe465a01SBram Moolenaar  let sortlines =<< trim END
987fe465a01SBram Moolenaar      vim9script
988fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
989bed36b93SBram Moolenaar        return i2 - i1
990fe465a01SBram Moolenaar      enddef
991fe465a01SBram Moolenaar
992fe465a01SBram Moolenaar      export def FastSort(): list<number>
993fe465a01SBram Moolenaar        return range(5)->sort(Compare)
994fe465a01SBram Moolenaar      enddef
995fe465a01SBram Moolenaar  END
996fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
997fe465a01SBram Moolenaar
998fe465a01SBram Moolenaar  let lines =<< trim END
999fe465a01SBram Moolenaar    vim9script
1000fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1001fe465a01SBram Moolenaar    def Test()
1002fe465a01SBram Moolenaar      g:result = FastSort()
1003fe465a01SBram Moolenaar    enddef
1004fe465a01SBram Moolenaar    Test()
1005fe465a01SBram Moolenaar  END
1006fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1007fe465a01SBram Moolenaar
1008fe465a01SBram Moolenaar  source Xscript.vim
1009fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1010fe465a01SBram Moolenaar
1011fe465a01SBram Moolenaar  unlet g:result
1012fe465a01SBram Moolenaar  delete('Xsort.vim')
1013fe465a01SBram Moolenaar  delete('Xscript.vim')
1014fe465a01SBram Moolenaarenddef
1015fe465a01SBram Moolenaar
1016c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1017c620c055SBram Moolenaar" script where FastFilter() is called from.
1018c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1019c620c055SBram Moolenaar  let filterLines =<< trim END
1020c620c055SBram Moolenaar    vim9script
1021c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1022c620c055SBram Moolenaar      return idx % 2 == 1
1023c620c055SBram Moolenaar    enddef
1024c620c055SBram Moolenaar    export def FastFilter(): list<number>
1025c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1026c620c055SBram Moolenaar    enddef
1027c620c055SBram Moolenaar  END
1028c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1029c620c055SBram Moolenaar
1030c620c055SBram Moolenaar  let lines =<< trim END
1031c620c055SBram Moolenaar    vim9script
1032c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1033c620c055SBram Moolenaar    def Test()
1034c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1035c620c055SBram Moolenaar    enddef
1036c620c055SBram Moolenaar    Test()
1037c620c055SBram Moolenaar  END
1038c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1039c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1040c620c055SBram Moolenaar
1041c620c055SBram Moolenaar  delete('Xfilter.vim')
1042c620c055SBram Moolenaar  delete('Ximport.vim')
1043c620c055SBram Moolenaarenddef
1044c620c055SBram Moolenaar
10454c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
10464c17ad94SBram Moolenaar  let first_lines =<< trim END
10474c17ad94SBram Moolenaar    vim9script
10484c17ad94SBram Moolenaar    def FuncYes(): string
10494c17ad94SBram Moolenaar      return 'yes'
10504c17ad94SBram Moolenaar    enddef
10514c17ad94SBram Moolenaar  END
105203afdcf1SBram Moolenaar  let withno_lines =<< trim END
10534c17ad94SBram Moolenaar    def FuncNo(): string
10544c17ad94SBram Moolenaar      return 'no'
10554c17ad94SBram Moolenaar    enddef
10564c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
10574c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
10584c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
105903afdcf1SBram Moolenaar    enddef
106003afdcf1SBram Moolenaar  END
106103afdcf1SBram Moolenaar  let nono_lines =<< trim END
106203afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
106303afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
10644c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
10654c17ad94SBram Moolenaar    enddef
10664c17ad94SBram Moolenaar  END
10674c17ad94SBram Moolenaar
10684c17ad94SBram Moolenaar  # FuncNo() is defined
106903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
10704c17ad94SBram Moolenaar  source Xreloaded.vim
10714c17ad94SBram Moolenaar  g:DoCheck(true)
10724c17ad94SBram Moolenaar
10734c17ad94SBram Moolenaar  # FuncNo() is not redefined
107403afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
10754c17ad94SBram Moolenaar  source Xreloaded.vim
107603afdcf1SBram Moolenaar  g:DoCheck()
10774c17ad94SBram Moolenaar
10784c17ad94SBram Moolenaar  # FuncNo() is back
107903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
10804c17ad94SBram Moolenaar  source Xreloaded.vim
108103afdcf1SBram Moolenaar  g:DoCheck()
10824c17ad94SBram Moolenaar
10834c17ad94SBram Moolenaar  delete('Xreloaded.vim')
10844c17ad94SBram Moolenaarenddef
10854c17ad94SBram Moolenaar
108689483d40SBram Moolenaardef Test_vim9script_reload_delvar()
108789483d40SBram Moolenaar  # write the script with a script-local variable
108889483d40SBram Moolenaar  let lines =<< trim END
108989483d40SBram Moolenaar    vim9script
109089483d40SBram Moolenaar    let var = 'string'
109189483d40SBram Moolenaar  END
109289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
109389483d40SBram Moolenaar  source XreloadVar.vim
109489483d40SBram Moolenaar
109589483d40SBram Moolenaar  # now write the script using the same variable locally - works
109689483d40SBram Moolenaar  lines =<< trim END
109789483d40SBram Moolenaar    vim9script
109889483d40SBram Moolenaar    def Func()
109989483d40SBram Moolenaar      let var = 'string'
110089483d40SBram Moolenaar    enddef
110189483d40SBram Moolenaar  END
110289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
110389483d40SBram Moolenaar  source XreloadVar.vim
110489483d40SBram Moolenaar
110589483d40SBram Moolenaar  delete('XreloadVar.vim')
110689483d40SBram Moolenaarenddef
110789483d40SBram Moolenaar
11088a7d6542SBram Moolenaardef Test_import_absolute()
11098a7d6542SBram Moolenaar  let import_lines = [
1110e6085c53SBram Moolenaar        'vim9script',
1111e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1112e6085c53SBram Moolenaar        'def UseExported()',
1113e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1114e6085c53SBram Moolenaar        '  exported = 8888',
1115e6085c53SBram Moolenaar        '  g:imported_after = exported',
1116e6085c53SBram Moolenaar        'enddef',
1117e6085c53SBram Moolenaar        'UseExported()',
1118e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1119e6085c53SBram Moolenaar        ]
11208a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
11218a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
11228a7d6542SBram Moolenaar
11238a7d6542SBram Moolenaar  source Ximport_abs.vim
11248a7d6542SBram Moolenaar
11258a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
11264e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1127675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1128675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1129675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1130675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1131675f716eSBram Moolenaar          'exported = 8888.*' ..
1132675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1133675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1134675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1135675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1136e6085c53SBram Moolenaar        g:import_disassembled)
11378a7d6542SBram Moolenaar  unlet g:imported_abs
11384e12a5dfSBram Moolenaar  unlet g:import_disassembled
11398a7d6542SBram Moolenaar
11408a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
11418a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
11428a7d6542SBram Moolenaarenddef
11438a7d6542SBram Moolenaar
11448a7d6542SBram Moolenaardef Test_import_rtp()
11458a7d6542SBram Moolenaar  let import_lines = [
1146e6085c53SBram Moolenaar        'vim9script',
1147e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1148e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1149e6085c53SBram Moolenaar        ]
11508a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
11518a7d6542SBram Moolenaar  mkdir('import')
11528a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
11538a7d6542SBram Moolenaar
11548a7d6542SBram Moolenaar  let save_rtp = &rtp
11558a7d6542SBram Moolenaar  &rtp = getcwd()
11568a7d6542SBram Moolenaar  source Ximport_rtp.vim
11578a7d6542SBram Moolenaar  &rtp = save_rtp
11588a7d6542SBram Moolenaar
11598a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
11608a7d6542SBram Moolenaar  unlet g:imported_rtp
11618a7d6542SBram Moolenaar
11628a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
116389483d40SBram Moolenaar  delete('import', 'rf')
11648a7d6542SBram Moolenaarenddef
11658a7d6542SBram Moolenaar
116625e0f586SBram Moolenaardef Test_import_compile_error()
116725e0f586SBram Moolenaar  let export_lines = [
116825e0f586SBram Moolenaar        'vim9script',
116925e0f586SBram Moolenaar        'export def ExpFunc(): string',
117025e0f586SBram Moolenaar        '  return notDefined',
117125e0f586SBram Moolenaar        'enddef',
117225e0f586SBram Moolenaar        ]
117325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
117425e0f586SBram Moolenaar
117525e0f586SBram Moolenaar  let import_lines = [
117625e0f586SBram Moolenaar        'vim9script',
117725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
117825e0f586SBram Moolenaar        'def ImpFunc()',
117925e0f586SBram Moolenaar        '  echo ExpFunc()',
118025e0f586SBram Moolenaar        'enddef',
118125e0f586SBram Moolenaar        'defcompile',
118225e0f586SBram Moolenaar        ]
118325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
118425e0f586SBram Moolenaar
118525e0f586SBram Moolenaar  try
118625e0f586SBram Moolenaar    source Ximport.vim
118725e0f586SBram Moolenaar  catch /E1001/
1188*f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
118925e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
119025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
119125e0f586SBram Moolenaar  endtry
119225e0f586SBram Moolenaar
119325e0f586SBram Moolenaar  delete('Xexported.vim')
119425e0f586SBram Moolenaar  delete('Ximport.vim')
119525e0f586SBram Moolenaarenddef
119625e0f586SBram Moolenaar
11978a7d6542SBram Moolenaardef Test_fixed_size_list()
1198*f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
11998a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
12008a7d6542SBram Moolenaar  l->remove(0)
12018a7d6542SBram Moolenaar  l->add(5)
12028a7d6542SBram Moolenaar  l->insert(99, 1)
12030f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
12048a7d6542SBram Moolenaarenddef
12058a7d6542SBram Moolenaar
1206158906cfSBram Moolenaardef IfElse(what: number): string
1207158906cfSBram Moolenaar  let res = ''
1208158906cfSBram Moolenaar  if what == 1
1209158906cfSBram Moolenaar    res = "one"
1210158906cfSBram Moolenaar  elseif what == 2
1211158906cfSBram Moolenaar    res = "two"
1212a259d8d3SBram Moolenaar  else
1213158906cfSBram Moolenaar    res = "three"
1214a259d8d3SBram Moolenaar  endif
1215158906cfSBram Moolenaar  return res
1216a259d8d3SBram Moolenaarenddef
1217a259d8d3SBram Moolenaar
1218158906cfSBram Moolenaardef Test_if_elseif_else()
1219158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1220158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1221158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
12220f18b6d1SBram Moolenaarenddef
12230f18b6d1SBram Moolenaar
1224e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1225e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1226e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1227e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1228e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1229585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1230e8c4abbbSBram Moolenaarenddef
1231e8c4abbbSBram Moolenaar
12326d69bf60SBram Moolenaarlet g:bool_true = v:true
12336d69bf60SBram Moolenaarlet g:bool_false = v:false
12346d69bf60SBram Moolenaar
12356d69bf60SBram Moolenaardef Test_if_const_expr()
12366d69bf60SBram Moolenaar  let res = false
12376d69bf60SBram Moolenaar  if true ? true : false
12386d69bf60SBram Moolenaar    res = true
12396d69bf60SBram Moolenaar  endif
12406d69bf60SBram Moolenaar  assert_equal(true, res)
12416d69bf60SBram Moolenaar
1242585fea7bSBram Moolenaar  g:glob = 2
1243585fea7bSBram Moolenaar  if false
12446797966dSBram Moolenaar    execute('g:glob = 3')
1245585fea7bSBram Moolenaar  endif
1246585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1247585fea7bSBram Moolenaar  if true
12486797966dSBram Moolenaar    execute('g:glob = 3')
1249585fea7bSBram Moolenaar  endif
1250585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1251585fea7bSBram Moolenaar
12526d69bf60SBram Moolenaar  res = false
12536d69bf60SBram Moolenaar  if g:bool_true ? true : false
12546d69bf60SBram Moolenaar    res = true
12556d69bf60SBram Moolenaar  endif
12566d69bf60SBram Moolenaar  assert_equal(true, res)
12576d69bf60SBram Moolenaar
12586d69bf60SBram Moolenaar  res = false
12596d69bf60SBram Moolenaar  if true ? g:bool_true : false
12606d69bf60SBram Moolenaar    res = true
12616d69bf60SBram Moolenaar  endif
12626d69bf60SBram Moolenaar  assert_equal(true, res)
12636d69bf60SBram Moolenaar
12646d69bf60SBram Moolenaar  res = false
12656d69bf60SBram Moolenaar  if true ? true : g:bool_false
12666d69bf60SBram Moolenaar    res = true
12676d69bf60SBram Moolenaar  endif
12686d69bf60SBram Moolenaar  assert_equal(true, res)
12696d69bf60SBram Moolenaar
12706d69bf60SBram Moolenaar  res = false
12716d69bf60SBram Moolenaar  if true ? false : true
12726d69bf60SBram Moolenaar    res = true
12736d69bf60SBram Moolenaar  endif
12746d69bf60SBram Moolenaar  assert_equal(false, res)
12756d69bf60SBram Moolenaar
12766d69bf60SBram Moolenaar  res = false
12776d69bf60SBram Moolenaar  if false ? false : true
12786d69bf60SBram Moolenaar    res = true
12796d69bf60SBram Moolenaar  endif
12806d69bf60SBram Moolenaar  assert_equal(true, res)
12816d69bf60SBram Moolenaar
12826d69bf60SBram Moolenaar  res = false
12836d69bf60SBram Moolenaar  if false ? true : false
12846d69bf60SBram Moolenaar    res = true
12856d69bf60SBram Moolenaar  endif
12866d69bf60SBram Moolenaar  assert_equal(false, res)
12876d69bf60SBram Moolenaar
12886d69bf60SBram Moolenaar  res = false
1289e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1290e8c4abbbSBram Moolenaar    res = true
1291e8c4abbbSBram Moolenaar  endif
1292e8c4abbbSBram Moolenaar  assert_equal(false, res)
1293e8c4abbbSBram Moolenaar
1294e8c4abbbSBram Moolenaar  res = false
12956d69bf60SBram Moolenaar  if true && true
12966d69bf60SBram Moolenaar    res = true
12976d69bf60SBram Moolenaar  endif
12986d69bf60SBram Moolenaar  assert_equal(true, res)
12996d69bf60SBram Moolenaar
13006d69bf60SBram Moolenaar  res = false
13016d69bf60SBram Moolenaar  if true && false
13026d69bf60SBram Moolenaar    res = true
13036d69bf60SBram Moolenaar  endif
13046d69bf60SBram Moolenaar  assert_equal(false, res)
13056d69bf60SBram Moolenaar
13066d69bf60SBram Moolenaar  res = false
13076d69bf60SBram Moolenaar  if g:bool_true && false
13086d69bf60SBram Moolenaar    res = true
13096d69bf60SBram Moolenaar  endif
13106d69bf60SBram Moolenaar  assert_equal(false, res)
13116d69bf60SBram Moolenaar
13126d69bf60SBram Moolenaar  res = false
13136d69bf60SBram Moolenaar  if true && g:bool_false
13146d69bf60SBram Moolenaar    res = true
13156d69bf60SBram Moolenaar  endif
13166d69bf60SBram Moolenaar  assert_equal(false, res)
13176d69bf60SBram Moolenaar
13186d69bf60SBram Moolenaar  res = false
13196d69bf60SBram Moolenaar  if false && false
13206d69bf60SBram Moolenaar    res = true
13216d69bf60SBram Moolenaar  endif
13226d69bf60SBram Moolenaar  assert_equal(false, res)
13236d69bf60SBram Moolenaar
13246d69bf60SBram Moolenaar  res = false
13256d69bf60SBram Moolenaar  if true || false
13266d69bf60SBram Moolenaar    res = true
13276d69bf60SBram Moolenaar  endif
13286d69bf60SBram Moolenaar  assert_equal(true, res)
13296d69bf60SBram Moolenaar
13306d69bf60SBram Moolenaar  res = false
13316d69bf60SBram Moolenaar  if g:bool_true || false
13326d69bf60SBram Moolenaar    res = true
13336d69bf60SBram Moolenaar  endif
13346d69bf60SBram Moolenaar  assert_equal(true, res)
13356d69bf60SBram Moolenaar
13366d69bf60SBram Moolenaar  res = false
13376d69bf60SBram Moolenaar  if true || g:bool_false
13386d69bf60SBram Moolenaar    res = true
13396d69bf60SBram Moolenaar  endif
13406d69bf60SBram Moolenaar  assert_equal(true, res)
13416d69bf60SBram Moolenaar
13426d69bf60SBram Moolenaar  res = false
13436d69bf60SBram Moolenaar  if false || false
13446d69bf60SBram Moolenaar    res = true
13456d69bf60SBram Moolenaar  endif
13466d69bf60SBram Moolenaar  assert_equal(false, res)
134780c34ca3SBram Moolenaarenddef
13486d69bf60SBram Moolenaar
134980c34ca3SBram Moolenaardef Test_if_const_expr_fails()
135080c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
135180c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1352e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1353e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
13546d69bf60SBram Moolenaarenddef
13556d69bf60SBram Moolenaar
135672abcf42SBram Moolenaardef RunNested(i: number): number
135772abcf42SBram Moolenaar  let x: number = 0
135872abcf42SBram Moolenaar  if i % 2
135972abcf42SBram Moolenaar    if 1
1360*f5be8cdbSBram Moolenaar      # comment
136172abcf42SBram Moolenaar    else
1362*f5be8cdbSBram Moolenaar      # comment
136372abcf42SBram Moolenaar    endif
136472abcf42SBram Moolenaar    x += 1
136572abcf42SBram Moolenaar  else
136672abcf42SBram Moolenaar    x += 1000
136772abcf42SBram Moolenaar  endif
136872abcf42SBram Moolenaar  return x
136972abcf42SBram Moolenaarenddef
137072abcf42SBram Moolenaar
137172abcf42SBram Moolenaardef Test_nested_if()
137272abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
137372abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
137472abcf42SBram Moolenaarenddef
137572abcf42SBram Moolenaar
1376ad39c094SBram Moolenaardef Test_execute_cmd()
1377ad39c094SBram Moolenaar  new
1378ad39c094SBram Moolenaar  setline(1, 'default')
1379ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1380ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1381a72cfb80SBram Moolenaar
1382a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1383a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1384a72cfb80SBram Moolenaar
1385ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1386ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1387a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1388ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1389a72cfb80SBram Moolenaar
1390ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1391ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1392a72cfb80SBram Moolenaar
1393ad39c094SBram Moolenaar  let cmd_first = 'call '
1394ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1395ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1396ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1397ad39c094SBram Moolenaar  bwipe!
1398585fea7bSBram Moolenaar
1399585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1400a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1401ad39c094SBram Moolenaarenddef
1402ad39c094SBram Moolenaar
140347e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1404*f5be8cdbSBram Moolenaar  # only checks line continuation
140547e880d6SBram Moolenaar  let lines =<< trim END
140647e880d6SBram Moolenaar      vim9script
140747e880d6SBram Moolenaar      execute 'g:someVar'
140847e880d6SBram Moolenaar                .. ' = ' ..
140947e880d6SBram Moolenaar                   '28'
141047e880d6SBram Moolenaar      assert_equal(28, g:someVar)
141147e880d6SBram Moolenaar      unlet g:someVar
141247e880d6SBram Moolenaar  END
141347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
141447e880d6SBram Moolenaarenddef
141547e880d6SBram Moolenaar
1416ad39c094SBram Moolenaardef Test_echo_cmd()
1417a72cfb80SBram Moolenaar  echo 'some' # comment
1418585fea7bSBram Moolenaar  echon 'thing'
1419ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1420ad39c094SBram Moolenaar
1421a72cfb80SBram Moolenaar  echo "some" # comment
1422a72cfb80SBram Moolenaar  echon "thing"
1423a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1424a72cfb80SBram Moolenaar
1425ad39c094SBram Moolenaar  let str1 = 'some'
1426ad39c094SBram Moolenaar  let str2 = 'more'
1427ad39c094SBram Moolenaar  echo str1 str2
1428ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1429a72cfb80SBram Moolenaar
1430a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1431ad39c094SBram Moolenaarenddef
1432ad39c094SBram Moolenaar
1433f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1434f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1435f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1436f93c7feaSBram Moolenaar  echo 'clear'
1437df069eecSBram Moolenaar  :1messages
1438f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1439f93c7feaSBram Moolenaar
1440f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1441f93c7feaSBram Moolenaarenddef
1442f93c7feaSBram Moolenaar
144347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1444*f5be8cdbSBram Moolenaar  # only checks line continuation
144547e880d6SBram Moolenaar  let lines =<< trim END
144647e880d6SBram Moolenaar      vim9script
144747e880d6SBram Moolenaar      echomsg 'here'
144847e880d6SBram Moolenaar                .. ' is ' ..
144947e880d6SBram Moolenaar                   'a message'
145047e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
145147e880d6SBram Moolenaar  END
145247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
145347e880d6SBram Moolenaarenddef
145447e880d6SBram Moolenaar
1455f93c7feaSBram Moolenaardef Test_echoerr_cmd()
145640ee466cSBram Moolenaar  try
145740ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
145840ee466cSBram Moolenaar  catch
145940ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
146040ee466cSBram Moolenaar  endtry
1461f93c7feaSBram Moolenaarenddef
1462f93c7feaSBram Moolenaar
146347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1464*f5be8cdbSBram Moolenaar  # only checks line continuation
146547e880d6SBram Moolenaar  let lines =<< trim END
146647e880d6SBram Moolenaar      vim9script
146747e880d6SBram Moolenaar      try
146847e880d6SBram Moolenaar        echoerr 'this'
146947e880d6SBram Moolenaar                .. ' is ' ..
147047e880d6SBram Moolenaar                   'wrong'
147147e880d6SBram Moolenaar      catch
147247e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
147347e880d6SBram Moolenaar      endtry
147447e880d6SBram Moolenaar  END
147547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
147647e880d6SBram Moolenaarenddef
147747e880d6SBram Moolenaar
147841fe0617SBram Moolenaardef Test_for_outside_of_function()
147941fe0617SBram Moolenaar  let lines =<< trim END
148041fe0617SBram Moolenaar    vim9script
148141fe0617SBram Moolenaar    new
148241fe0617SBram Moolenaar    for var in range(0, 3)
148341fe0617SBram Moolenaar      append(line('$'), var)
148441fe0617SBram Moolenaar    endfor
148541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
148641fe0617SBram Moolenaar    bwipe!
148741fe0617SBram Moolenaar  END
148841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
148941fe0617SBram Moolenaar  source Xvim9for.vim
149041fe0617SBram Moolenaar  delete('Xvim9for.vim')
149141fe0617SBram Moolenaarenddef
14928a7d6542SBram Moolenaar
1493e8c4abbbSBram Moolenaardef Test_for_loop()
1494e8c4abbbSBram Moolenaar  let result = ''
1495e8c4abbbSBram Moolenaar  for cnt in range(7)
1496e8c4abbbSBram Moolenaar    if cnt == 4
1497e8c4abbbSBram Moolenaar      break
1498e8c4abbbSBram Moolenaar    endif
1499e8c4abbbSBram Moolenaar    if cnt == 2
1500e8c4abbbSBram Moolenaar      continue
1501e8c4abbbSBram Moolenaar    endif
1502e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1503e8c4abbbSBram Moolenaar  endfor
1504e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
15050ad3e894SBram Moolenaar
15060ad3e894SBram Moolenaar  let concat = ''
15070ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
15080ad3e894SBram Moolenaar    concat ..= str
15090ad3e894SBram Moolenaar  endfor
15100ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1511e8c4abbbSBram Moolenaarenddef
1512e8c4abbbSBram Moolenaar
1513e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1514675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1515675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1516675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1517822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
15180ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1519675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1520675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1521675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1522e8c4abbbSBram Moolenaarenddef
1523e8c4abbbSBram Moolenaar
1524d0df1aacSBram Moolenaardef Test_while_loop()
1525d0df1aacSBram Moolenaar  let result = ''
1526d0df1aacSBram Moolenaar  let cnt = 0
1527d0df1aacSBram Moolenaar  while cnt < 555
1528d0df1aacSBram Moolenaar    if cnt == 3
1529d0df1aacSBram Moolenaar      break
1530d0df1aacSBram Moolenaar    endif
1531d0df1aacSBram Moolenaar    cnt += 1
1532d0df1aacSBram Moolenaar    if cnt == 2
1533d0df1aacSBram Moolenaar      continue
1534d0df1aacSBram Moolenaar    endif
1535d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1536d0df1aacSBram Moolenaar  endwhile
1537d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1538d0df1aacSBram Moolenaarenddef
1539d0df1aacSBram Moolenaar
1540e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1541675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1542675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1543675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1544675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1545675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1546675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1547675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1548bd5da371SBram Moolenaarenddef
1549bd5da371SBram Moolenaar
15509645e2d9SBram Moolenaardef Test_interrupt_loop()
155197acfc78SBram Moolenaar  let caught = false
15529645e2d9SBram Moolenaar  let x = 0
155397acfc78SBram Moolenaar  try
15549645e2d9SBram Moolenaar    while 1
15559645e2d9SBram Moolenaar      x += 1
15569645e2d9SBram Moolenaar      if x == 100
15579645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
15589645e2d9SBram Moolenaar      endif
15599645e2d9SBram Moolenaar    endwhile
156097acfc78SBram Moolenaar  catch
156197acfc78SBram Moolenaar    caught = true
156297acfc78SBram Moolenaar    assert_equal(100, x)
156397acfc78SBram Moolenaar  endtry
156497acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
15659645e2d9SBram Moolenaarenddef
156620431c9dSBram Moolenaar
15674fdae999SBram Moolenaardef Test_automatic_line_continuation()
15684fdae999SBram Moolenaar  let mylist = [
15694fdae999SBram Moolenaar      'one',
15704fdae999SBram Moolenaar      'two',
15714fdae999SBram Moolenaar      'three',
1572*f5be8cdbSBram Moolenaar      ] # comment
15734fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
15744fdae999SBram Moolenaar
15754fdae999SBram Moolenaar  let mydict = {
15764fdae999SBram Moolenaar      'one': 1,
15774fdae999SBram Moolenaar      'two': 2,
15784fdae999SBram Moolenaar      'three':
15794fdae999SBram Moolenaar          3,
1580*f5be8cdbSBram Moolenaar      } # comment
15814fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
15824fdae999SBram Moolenaar  mydict = #{
15832c330432SBram Moolenaar      one: 1,  # comment
15842c330432SBram Moolenaar      two:     # comment
15852c330432SBram Moolenaar           2,  # comment
15862c330432SBram Moolenaar      three: 3 # comment
15872c330432SBram Moolenaar      }
15882c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
15892c330432SBram Moolenaar  mydict = #{
15902c330432SBram Moolenaar      one: 1,
15914fdae999SBram Moolenaar      two:
15924fdae999SBram Moolenaar           2,
15932c330432SBram Moolenaar      three: 3
15944fdae999SBram Moolenaar      }
15954fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1596e6085c53SBram Moolenaar
1597e6085c53SBram Moolenaar  assert_equal(
1598e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1599e6085c53SBram Moolenaar        split('one two three')
1600e6085c53SBram Moolenaar        )
16014fdae999SBram Moolenaarenddef
16024fdae999SBram Moolenaar
16037a092245SBram Moolenaardef Test_vim9_comment()
16047a092245SBram Moolenaar  CheckScriptSuccess([
16057a092245SBram Moolenaar      'vim9script',
16067a092245SBram Moolenaar      '# something',
16077a092245SBram Moolenaar      ])
16087a092245SBram Moolenaar  CheckScriptFailure([
16097a092245SBram Moolenaar      'vim9script',
16107a092245SBram Moolenaar      ':# something',
16117a092245SBram Moolenaar      ], 'E488:')
16127a092245SBram Moolenaar  CheckScriptFailure([
16137a092245SBram Moolenaar      '# something',
16147a092245SBram Moolenaar      ], 'E488:')
16157a092245SBram Moolenaar  CheckScriptFailure([
16167a092245SBram Moolenaar      ':# something',
16177a092245SBram Moolenaar      ], 'E488:')
16187a092245SBram Moolenaar
16194a8d9f2eSBram Moolenaar  { # block start
16204a8d9f2eSBram Moolenaar  } # block end
16214a8d9f2eSBram Moolenaar  CheckDefFailure([
16224a8d9f2eSBram Moolenaar      '{# comment',
16234a8d9f2eSBram Moolenaar      ], 'E488:')
16244a8d9f2eSBram Moolenaar  CheckDefFailure([
16254a8d9f2eSBram Moolenaar      '{',
16264a8d9f2eSBram Moolenaar      '}# comment',
16274a8d9f2eSBram Moolenaar      ], 'E488:')
16284a8d9f2eSBram Moolenaar
16294a8d9f2eSBram Moolenaar  echo "yes" # comment
16304a8d9f2eSBram Moolenaar  CheckDefFailure([
16314a8d9f2eSBram Moolenaar      'echo "yes"# comment',
16324a8d9f2eSBram Moolenaar      ], 'E488:')
16337a092245SBram Moolenaar  CheckScriptSuccess([
16347a092245SBram Moolenaar      'vim9script',
16357a092245SBram Moolenaar      'echo "yes" # something',
16367a092245SBram Moolenaar      ])
16377a092245SBram Moolenaar  CheckScriptFailure([
16387a092245SBram Moolenaar      'vim9script',
16397a092245SBram Moolenaar      'echo "yes"# something',
16407a092245SBram Moolenaar      ], 'E121:')
16417a092245SBram Moolenaar  CheckScriptFailure([
16427a092245SBram Moolenaar      'vim9script',
16437a092245SBram Moolenaar      'echo# something',
16447a092245SBram Moolenaar      ], 'E121:')
16457a092245SBram Moolenaar  CheckScriptFailure([
16467a092245SBram Moolenaar      'echo "yes" # something',
16477a092245SBram Moolenaar      ], 'E121:')
16487a092245SBram Moolenaar
16494a8d9f2eSBram Moolenaar  exe "echo" # comment
16504a8d9f2eSBram Moolenaar  CheckDefFailure([
16514a8d9f2eSBram Moolenaar      'exe "echo"# comment',
16524a8d9f2eSBram Moolenaar      ], 'E488:')
16534a8d9f2eSBram Moolenaar  CheckScriptSuccess([
16544a8d9f2eSBram Moolenaar      'vim9script',
16554a8d9f2eSBram Moolenaar      'exe "echo" # something',
16564a8d9f2eSBram Moolenaar      ])
16574a8d9f2eSBram Moolenaar  CheckScriptFailure([
16584a8d9f2eSBram Moolenaar      'vim9script',
16594a8d9f2eSBram Moolenaar      'exe "echo"# something',
16604a8d9f2eSBram Moolenaar      ], 'E121:')
16614a8d9f2eSBram Moolenaar  CheckDefFailure([
16624a8d9f2eSBram Moolenaar      'exe # comment',
16634a8d9f2eSBram Moolenaar      ], 'E1015:')
16644a8d9f2eSBram Moolenaar  CheckScriptFailure([
16654a8d9f2eSBram Moolenaar      'vim9script',
16664a8d9f2eSBram Moolenaar      'exe# something',
16674a8d9f2eSBram Moolenaar      ], 'E121:')
16684a8d9f2eSBram Moolenaar  CheckScriptFailure([
16694a8d9f2eSBram Moolenaar      'exe "echo" # something',
16704a8d9f2eSBram Moolenaar      ], 'E121:')
16714a8d9f2eSBram Moolenaar
16727a092245SBram Moolenaar  CheckDefFailure([
16737a092245SBram Moolenaar      'try# comment',
16747a092245SBram Moolenaar      '  echo "yes"',
16757a092245SBram Moolenaar      'catch',
16767a092245SBram Moolenaar      'endtry',
16777a092245SBram Moolenaar      ], 'E488:')
16782c5ed4e3SBram Moolenaar  CheckScriptFailure([
16792c5ed4e3SBram Moolenaar      'vim9script',
16802c5ed4e3SBram Moolenaar      'try# comment',
16812c5ed4e3SBram Moolenaar      'echo "yes"',
16822c5ed4e3SBram Moolenaar      ], 'E488:')
16837a092245SBram Moolenaar  CheckDefFailure([
16847a092245SBram Moolenaar      'try',
1685a72cfb80SBram Moolenaar      '  throw#comment',
1686a72cfb80SBram Moolenaar      'catch',
1687a72cfb80SBram Moolenaar      'endtry',
1688a72cfb80SBram Moolenaar      ], 'E1015:')
1689a72cfb80SBram Moolenaar  CheckDefFailure([
1690a72cfb80SBram Moolenaar      'try',
1691a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1692a72cfb80SBram Moolenaar      'catch',
1693a72cfb80SBram Moolenaar      'endtry',
1694a72cfb80SBram Moolenaar      ], 'E488:')
1695a72cfb80SBram Moolenaar  CheckDefFailure([
1696a72cfb80SBram Moolenaar      'try',
16977a092245SBram Moolenaar      '  echo "yes"',
16987a092245SBram Moolenaar      'catch# comment',
16997a092245SBram Moolenaar      'endtry',
17007a092245SBram Moolenaar      ], 'E488:')
17012c5ed4e3SBram Moolenaar  CheckScriptFailure([
17022c5ed4e3SBram Moolenaar      'vim9script',
17032c5ed4e3SBram Moolenaar      'try',
17042c5ed4e3SBram Moolenaar      '  echo "yes"',
17052c5ed4e3SBram Moolenaar      'catch# comment',
17062c5ed4e3SBram Moolenaar      'endtry',
17072c5ed4e3SBram Moolenaar      ], 'E654:')
17082c5ed4e3SBram Moolenaar  CheckDefFailure([
17092c5ed4e3SBram Moolenaar      'try',
17102c5ed4e3SBram Moolenaar      '  echo "yes"',
17112c5ed4e3SBram Moolenaar      'catch /pat/# comment',
17122c5ed4e3SBram Moolenaar      'endtry',
17132c5ed4e3SBram Moolenaar      ], 'E488:')
17147a092245SBram Moolenaar  CheckDefFailure([
17157a092245SBram Moolenaar      'try',
17167a092245SBram Moolenaar      'echo "yes"',
17177a092245SBram Moolenaar      'catch',
17187a092245SBram Moolenaar      'endtry# comment',
17197a092245SBram Moolenaar      ], 'E488:')
17202c5ed4e3SBram Moolenaar  CheckScriptFailure([
17212c5ed4e3SBram Moolenaar      'vim9script',
17222c5ed4e3SBram Moolenaar      'try',
17232c5ed4e3SBram Moolenaar      '  echo "yes"',
17242c5ed4e3SBram Moolenaar      'catch',
17252c5ed4e3SBram Moolenaar      'endtry# comment',
17269b7bf9e9SBram Moolenaar      ], 'E488:')
17272c5ed4e3SBram Moolenaar
17282c5ed4e3SBram Moolenaar  CheckScriptSuccess([
17292c5ed4e3SBram Moolenaar      'vim9script',
17302c5ed4e3SBram Moolenaar      'hi # comment',
17312c5ed4e3SBram Moolenaar      ])
17322c5ed4e3SBram Moolenaar  CheckScriptFailure([
17332c5ed4e3SBram Moolenaar      'vim9script',
17342c5ed4e3SBram Moolenaar      'hi# comment',
17352c5ed4e3SBram Moolenaar      ], 'E416:')
17361966c248SBram Moolenaar  CheckScriptSuccess([
17371966c248SBram Moolenaar      'vim9script',
17381966c248SBram Moolenaar      'hi Search # comment',
17391966c248SBram Moolenaar      ])
17401966c248SBram Moolenaar  CheckScriptFailure([
17411966c248SBram Moolenaar      'vim9script',
17421966c248SBram Moolenaar      'hi Search# comment',
17431966c248SBram Moolenaar      ], 'E416:')
17441966c248SBram Moolenaar  CheckScriptSuccess([
17451966c248SBram Moolenaar      'vim9script',
17461966c248SBram Moolenaar      'hi link This Search # comment',
17471966c248SBram Moolenaar      ])
17481966c248SBram Moolenaar  CheckScriptFailure([
17491966c248SBram Moolenaar      'vim9script',
17501966c248SBram Moolenaar      'hi link This That# comment',
17511966c248SBram Moolenaar      ], 'E413:')
17521966c248SBram Moolenaar  CheckScriptSuccess([
17531966c248SBram Moolenaar      'vim9script',
17541966c248SBram Moolenaar      'hi clear This # comment',
17551966c248SBram Moolenaar      'hi clear # comment',
17561966c248SBram Moolenaar      ])
1757*f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
1758*f5be8cdbSBram Moolenaar  # hi clear This# comment',
17591966c248SBram Moolenaar  CheckScriptFailure([
17601966c248SBram Moolenaar      'vim9script',
17611966c248SBram Moolenaar      'hi clear# comment',
17621966c248SBram Moolenaar      ], 'E416:')
17631966c248SBram Moolenaar
17641966c248SBram Moolenaar  CheckScriptSuccess([
17651966c248SBram Moolenaar      'vim9script',
17661966c248SBram Moolenaar      'hi Group term=bold',
17671966c248SBram Moolenaar      'match Group /todo/ # comment',
17681966c248SBram Moolenaar      ])
17691966c248SBram Moolenaar  CheckScriptFailure([
17701966c248SBram Moolenaar      'vim9script',
17711966c248SBram Moolenaar      'hi Group term=bold',
17721966c248SBram Moolenaar      'match Group /todo/# comment',
17731966c248SBram Moolenaar      ], 'E488:')
17741966c248SBram Moolenaar  CheckScriptSuccess([
17751966c248SBram Moolenaar      'vim9script',
17761966c248SBram Moolenaar      'match # comment',
17771966c248SBram Moolenaar      ])
17781966c248SBram Moolenaar  CheckScriptFailure([
17791966c248SBram Moolenaar      'vim9script',
17801966c248SBram Moolenaar      'match# comment',
17811966c248SBram Moolenaar      ], 'E475:')
17821966c248SBram Moolenaar  CheckScriptSuccess([
17831966c248SBram Moolenaar      'vim9script',
17841966c248SBram Moolenaar      'match none # comment',
17851966c248SBram Moolenaar      ])
17861966c248SBram Moolenaar  CheckScriptFailure([
17871966c248SBram Moolenaar      'vim9script',
17881966c248SBram Moolenaar      'match none# comment',
17891966c248SBram Moolenaar      ], 'E475:')
17901966c248SBram Moolenaar
17911966c248SBram Moolenaar  CheckScriptSuccess([
17921966c248SBram Moolenaar      'vim9script',
17931966c248SBram Moolenaar      'menutrans clear # comment',
17941966c248SBram Moolenaar      ])
17951966c248SBram Moolenaar  CheckScriptFailure([
17961966c248SBram Moolenaar      'vim9script',
17971966c248SBram Moolenaar      'menutrans clear# comment text',
17981966c248SBram Moolenaar      ], 'E474:')
17991966c248SBram Moolenaar
18001966c248SBram Moolenaar  CheckScriptSuccess([
18011966c248SBram Moolenaar      'vim9script',
18021966c248SBram Moolenaar      'syntax clear # comment',
18031966c248SBram Moolenaar      ])
18041966c248SBram Moolenaar  CheckScriptFailure([
18051966c248SBram Moolenaar      'vim9script',
18061966c248SBram Moolenaar      'syntax clear# comment text',
18071966c248SBram Moolenaar      ], 'E28:')
18081966c248SBram Moolenaar  CheckScriptSuccess([
18091966c248SBram Moolenaar      'vim9script',
18101966c248SBram Moolenaar      'syntax keyword Word some',
18111966c248SBram Moolenaar      'syntax clear Word # comment',
18121966c248SBram Moolenaar      ])
18131966c248SBram Moolenaar  CheckScriptFailure([
18141966c248SBram Moolenaar      'vim9script',
18151966c248SBram Moolenaar      'syntax keyword Word some',
18161966c248SBram Moolenaar      'syntax clear Word# comment text',
18171966c248SBram Moolenaar      ], 'E28:')
18181966c248SBram Moolenaar
18191966c248SBram Moolenaar  CheckScriptSuccess([
18201966c248SBram Moolenaar      'vim9script',
18211966c248SBram Moolenaar      'syntax list # comment',
18221966c248SBram Moolenaar      ])
18231966c248SBram Moolenaar  CheckScriptFailure([
18241966c248SBram Moolenaar      'vim9script',
18251966c248SBram Moolenaar      'syntax list# comment text',
18261966c248SBram Moolenaar      ], 'E28:')
18271966c248SBram Moolenaar
18281966c248SBram Moolenaar  CheckScriptSuccess([
18291966c248SBram Moolenaar      'vim9script',
18301966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
18311966c248SBram Moolenaar      ])
18321966c248SBram Moolenaar  CheckScriptFailure([
18331966c248SBram Moolenaar      'vim9script',
18341966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
18351966c248SBram Moolenaar      ], 'E475:')
18361966c248SBram Moolenaar
18371966c248SBram Moolenaar  CheckScriptSuccess([
18381966c248SBram Moolenaar      'vim9script',
18391966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
18401966c248SBram Moolenaar      ])
18411966c248SBram Moolenaar  CheckScriptFailure([
18421966c248SBram Moolenaar      'vim9script',
18431966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
18441966c248SBram Moolenaar      ], 'E789:')
18451966c248SBram Moolenaar
18461966c248SBram Moolenaar  CheckScriptSuccess([
18471966c248SBram Moolenaar      'vim9script',
18481966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
18491966c248SBram Moolenaar      ])
18501966c248SBram Moolenaar  CheckScriptFailure([
18511966c248SBram Moolenaar      'vim9script',
18521966c248SBram Moolenaar      'syntax match Word /pat/# comment',
18531966c248SBram Moolenaar      ], 'E402:')
18541966c248SBram Moolenaar
18551966c248SBram Moolenaar  CheckScriptSuccess([
18561966c248SBram Moolenaar      'vim9script',
18571966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
18581966c248SBram Moolenaar      ])
18591966c248SBram Moolenaar  CheckScriptFailure([
18601966c248SBram Moolenaar      'vim9script',
18611966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
18621966c248SBram Moolenaar      ], 'E475:')
18631966c248SBram Moolenaar  CheckScriptFailure([
18641966c248SBram Moolenaar      'vim9script',
18651966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
18661966c248SBram Moolenaar      ], 'E406:')
18671966c248SBram Moolenaar  CheckScriptFailure([
18681966c248SBram Moolenaar      'vim9script',
18691966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
18701966c248SBram Moolenaar      ], 'E475:')
18711966c248SBram Moolenaar
18721966c248SBram Moolenaar  CheckScriptSuccess([
18731966c248SBram Moolenaar      'vim9script',
18741966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
18751966c248SBram Moolenaar      ])
18761966c248SBram Moolenaar  CheckScriptFailure([
18771966c248SBram Moolenaar      'vim9script',
18781966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
18791966c248SBram Moolenaar      ], 'E475:')
18801966c248SBram Moolenaar
18811966c248SBram Moolenaar  CheckScriptSuccess([
18821966c248SBram Moolenaar      'vim9script',
18831966c248SBram Moolenaar      'syntax sync # comment',
18841966c248SBram Moolenaar      ])
18851966c248SBram Moolenaar  CheckScriptFailure([
18861966c248SBram Moolenaar      'vim9script',
18871966c248SBram Moolenaar      'syntax sync# comment',
18881966c248SBram Moolenaar      ], 'E404:')
18891966c248SBram Moolenaar  CheckScriptSuccess([
18901966c248SBram Moolenaar      'vim9script',
18911966c248SBram Moolenaar      'syntax sync ccomment # comment',
18921966c248SBram Moolenaar      ])
18931966c248SBram Moolenaar  CheckScriptFailure([
18941966c248SBram Moolenaar      'vim9script',
18951966c248SBram Moolenaar      'syntax sync ccomment# comment',
18961966c248SBram Moolenaar      ], 'E404:')
18971966c248SBram Moolenaar
18981966c248SBram Moolenaar  CheckScriptSuccess([
18991966c248SBram Moolenaar      'vim9script',
19001966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
19011966c248SBram Moolenaar      ])
19021966c248SBram Moolenaar  CheckScriptFailure([
19031966c248SBram Moolenaar      'vim9script',
19041966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
19051966c248SBram Moolenaar      ], 'E475:')
1906a72cfb80SBram Moolenaar
1907a72cfb80SBram Moolenaar  CheckScriptSuccess([
1908a72cfb80SBram Moolenaar      'vim9script',
1909a72cfb80SBram Moolenaar      'command Echo echo # comment',
1910a72cfb80SBram Moolenaar      'command Echo # comment',
1911a72cfb80SBram Moolenaar      ])
1912a72cfb80SBram Moolenaar  CheckScriptFailure([
1913a72cfb80SBram Moolenaar      'vim9script',
1914a72cfb80SBram Moolenaar      'command Echo echo# comment',
1915a72cfb80SBram Moolenaar      'Echo',
1916a72cfb80SBram Moolenaar      ], 'E121:')
1917a72cfb80SBram Moolenaar  CheckScriptFailure([
1918a72cfb80SBram Moolenaar      'vim9script',
1919a72cfb80SBram Moolenaar      'command Echo# comment',
1920a72cfb80SBram Moolenaar      ], 'E182:')
1921a72cfb80SBram Moolenaar  CheckScriptFailure([
1922a72cfb80SBram Moolenaar      'vim9script',
1923a72cfb80SBram Moolenaar      'command Echo echo',
1924a72cfb80SBram Moolenaar      'command Echo# comment',
1925a72cfb80SBram Moolenaar      ], 'E182:')
1926a72cfb80SBram Moolenaar
1927a72cfb80SBram Moolenaar  CheckScriptSuccess([
1928a72cfb80SBram Moolenaar      'vim9script',
1929a72cfb80SBram Moolenaar      'function # comment',
1930a72cfb80SBram Moolenaar      ])
1931a72cfb80SBram Moolenaar  CheckScriptFailure([
1932a72cfb80SBram Moolenaar      'vim9script',
1933a72cfb80SBram Moolenaar      'function# comment',
1934a72cfb80SBram Moolenaar      ], 'E129:')
1935a72cfb80SBram Moolenaar  CheckScriptSuccess([
1936a72cfb80SBram Moolenaar      'vim9script',
1937a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1938a72cfb80SBram Moolenaar      ])
1939a72cfb80SBram Moolenaar  CheckScriptFailure([
1940a72cfb80SBram Moolenaar      'vim9script',
1941a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1942a72cfb80SBram Moolenaar      ], 'E488:')
1943a72cfb80SBram Moolenaar
1944a72cfb80SBram Moolenaar  CheckScriptSuccess([
1945a72cfb80SBram Moolenaar      'vim9script',
19464c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1947a72cfb80SBram Moolenaar      'endfunc',
19484c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1949a72cfb80SBram Moolenaar      ])
1950a72cfb80SBram Moolenaar  CheckScriptFailure([
1951a72cfb80SBram Moolenaar      'vim9script',
19524c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1953a72cfb80SBram Moolenaar      'endfunc',
19544c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1955a72cfb80SBram Moolenaar      ], 'E488:')
1956a72cfb80SBram Moolenaar
1957a72cfb80SBram Moolenaar  CheckScriptSuccess([
1958a72cfb80SBram Moolenaar      'vim9script',
1959a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1960a72cfb80SBram Moolenaar      ])
1961a72cfb80SBram Moolenaar  CheckScriptFailure([
1962a72cfb80SBram Moolenaar      'vim9script',
1963a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1964a72cfb80SBram Moolenaar      ], 'E488:')
19652c5ed4e3SBram Moolenaarenddef
19662c5ed4e3SBram Moolenaar
19672c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
19682c5ed4e3SBram Moolenaar  CheckCanRunGui
19692c5ed4e3SBram Moolenaar
19702c5ed4e3SBram Moolenaar  CheckScriptFailure([
19712c5ed4e3SBram Moolenaar      'vim9script',
19722c5ed4e3SBram Moolenaar      'gui#comment'
19732c5ed4e3SBram Moolenaar      ], 'E499:')
19742c5ed4e3SBram Moolenaar  CheckScriptFailure([
19752c5ed4e3SBram Moolenaar      'vim9script',
19762c5ed4e3SBram Moolenaar      'gui -f#comment'
19772c5ed4e3SBram Moolenaar      ], 'E499:')
19787a092245SBram Moolenaarenddef
19797a092245SBram Moolenaar
1980a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
19816797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
19826797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
1983a26b9700SBram Moolenaar
1984a26b9700SBram Moolenaar  edit test.vim
1985a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1986a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1987a26b9700SBram Moolenaar
1988a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1989a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1990a26b9700SBram Moolenaar
1991a26b9700SBram Moolenaar  g:entered = 0
1992a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1993a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1994a26b9700SBram Moolenaar
1995a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1996a26b9700SBram Moolenaar
1997a26b9700SBram Moolenaar  au! TabEnter
1998a26b9700SBram Moolenaar  unlet g:entered
1999d72c1bf0SBram Moolenaar
2000d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2001d72c1bf0SBram Moolenaar      'vim9script',
20026797966dSBram Moolenaar      'g:var = 123',
2003e55b1c09SBram Moolenaar      'b:var = 456',
2004e55b1c09SBram Moolenaar      'w:var = 777',
2005e55b1c09SBram Moolenaar      't:var = 888',
2006d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2007d72c1bf0SBram Moolenaar      ])
2008d72c1bf0SBram Moolenaar
2009d72c1bf0SBram Moolenaar  CheckScriptFailure([
2010d72c1bf0SBram Moolenaar      'vim9script',
2011d72c1bf0SBram Moolenaar      'let g:var = 123',
2012e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2013e55b1c09SBram Moolenaar
2014e55b1c09SBram Moolenaar  CheckScriptFailure([
2015e55b1c09SBram Moolenaar      'vim9script',
2016e55b1c09SBram Moolenaar      'let b:var = 123',
2017e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2018e55b1c09SBram Moolenaar
2019e55b1c09SBram Moolenaar  CheckScriptFailure([
2020e55b1c09SBram Moolenaar      'vim9script',
2021e55b1c09SBram Moolenaar      'let w:var = 123',
2022e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2023e55b1c09SBram Moolenaar
2024e55b1c09SBram Moolenaar  CheckScriptFailure([
2025e55b1c09SBram Moolenaar      'vim9script',
2026e55b1c09SBram Moolenaar      'let t:var = 123',
2027e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2028e55b1c09SBram Moolenaar
2029e55b1c09SBram Moolenaar  CheckScriptFailure([
2030e55b1c09SBram Moolenaar      'vim9script',
2031e55b1c09SBram Moolenaar      'let v:version = 123',
2032e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2033e55b1c09SBram Moolenaar
2034e55b1c09SBram Moolenaar  CheckScriptFailure([
2035e55b1c09SBram Moolenaar      'vim9script',
2036e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2037e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
20386797966dSBram Moolenaar
20396797966dSBram Moolenaar  CheckScriptFailure([
20406797966dSBram Moolenaar      'vim9script',
20416797966dSBram Moolenaar      'g:var = 123',
204232e35117SBram Moolenaar      'unlet g:var# comment1',
2043d72c1bf0SBram Moolenaar      ], 'E108:')
2044d72c1bf0SBram Moolenaar
2045d72c1bf0SBram Moolenaar  CheckScriptFailure([
2046d72c1bf0SBram Moolenaar      'let g:var = 123',
2047d72c1bf0SBram Moolenaar      'unlet g:var # something',
2048d72c1bf0SBram Moolenaar      ], 'E488:')
2049faac4104SBram Moolenaar
2050faac4104SBram Moolenaar  CheckScriptSuccess([
2051faac4104SBram Moolenaar      'vim9script',
205232e35117SBram Moolenaar      'if 1 # comment2',
2053faac4104SBram Moolenaar      '  echo "yes"',
2054faac4104SBram Moolenaar      'elseif 2 #comment',
2055faac4104SBram Moolenaar      '  echo "no"',
2056faac4104SBram Moolenaar      'endif',
2057faac4104SBram Moolenaar      ])
2058faac4104SBram Moolenaar
2059faac4104SBram Moolenaar  CheckScriptFailure([
2060faac4104SBram Moolenaar      'vim9script',
206132e35117SBram Moolenaar      'if 1# comment3',
2062faac4104SBram Moolenaar      '  echo "yes"',
2063faac4104SBram Moolenaar      'endif',
2064faac4104SBram Moolenaar      ], 'E15:')
2065faac4104SBram Moolenaar
2066faac4104SBram Moolenaar  CheckScriptFailure([
2067faac4104SBram Moolenaar      'vim9script',
206832e35117SBram Moolenaar      'if 0 # comment4',
2069faac4104SBram Moolenaar      '  echo "yes"',
2070faac4104SBram Moolenaar      'elseif 2#comment',
2071faac4104SBram Moolenaar      '  echo "no"',
2072faac4104SBram Moolenaar      'endif',
2073faac4104SBram Moolenaar      ], 'E15:')
2074faac4104SBram Moolenaar
2075faac4104SBram Moolenaar  CheckScriptSuccess([
2076faac4104SBram Moolenaar      'vim9script',
207732e35117SBram Moolenaar      'let v = 1 # comment5',
2078faac4104SBram Moolenaar      ])
2079faac4104SBram Moolenaar
2080faac4104SBram Moolenaar  CheckScriptFailure([
2081faac4104SBram Moolenaar      'vim9script',
208232e35117SBram Moolenaar      'let v = 1# comment6',
208332e35117SBram Moolenaar      ], 'E15:')
2084faac4104SBram Moolenaar
2085faac4104SBram Moolenaar  CheckScriptSuccess([
2086faac4104SBram Moolenaar      'vim9script',
2087faac4104SBram Moolenaar      'new'
2088faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2089df069eecSBram Moolenaar      ':$',
2090faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2091faac4104SBram Moolenaar      'bwipe!',
2092faac4104SBram Moolenaar      ])
2093faac4104SBram Moolenaar
2094*f5be8cdbSBram Moolenaar  CheckScriptFailure([
2095*f5be8cdbSBram Moolenaar      'vim9script',
2096*f5be8cdbSBram Moolenaar      'new'
2097*f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2098*f5be8cdbSBram Moolenaar      ':$',
2099*f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2100*f5be8cdbSBram Moolenaar      'bwipe!',
2101*f5be8cdbSBram Moolenaar      ], 'E488:')
2102*f5be8cdbSBram Moolenaar
2103*f5be8cdbSBram Moolenaar  CheckScriptFailure([
2104*f5be8cdbSBram Moolenaar      'vim9script',
2105*f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2106*f5be8cdbSBram Moolenaar      ], 'E477:')
2107a26b9700SBram Moolenaarenddef
2108a26b9700SBram Moolenaar
21097e5bd91dSBram Moolenaardef Test_finish()
21107e5bd91dSBram Moolenaar  let lines =<< trim END
21117e5bd91dSBram Moolenaar    vim9script
21126797966dSBram Moolenaar    g:res = 'one'
21137e5bd91dSBram Moolenaar    if v:false | finish | endif
21146797966dSBram Moolenaar    g:res = 'two'
21157e5bd91dSBram Moolenaar    finish
21166797966dSBram Moolenaar    g:res = 'three'
21177e5bd91dSBram Moolenaar  END
21187e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
21197e5bd91dSBram Moolenaar  source Xfinished
21207e5bd91dSBram Moolenaar  assert_equal('two', g:res)
21217e5bd91dSBram Moolenaar
21227e5bd91dSBram Moolenaar  unlet g:res
21237e5bd91dSBram Moolenaar  delete('Xfinished')
21247e5bd91dSBram Moolenaarenddef
21257e5bd91dSBram Moolenaar
212632e35117SBram Moolenaardef Test_let_func_call()
212732e35117SBram Moolenaar  let lines =<< trim END
212832e35117SBram Moolenaar    vim9script
212932e35117SBram Moolenaar    func GetValue()
213032e35117SBram Moolenaar      if exists('g:count')
213132e35117SBram Moolenaar        let g:count += 1
213232e35117SBram Moolenaar      else
213332e35117SBram Moolenaar        let g:count = 1
213432e35117SBram Moolenaar      endif
213532e35117SBram Moolenaar      return 'this'
213632e35117SBram Moolenaar    endfunc
213732e35117SBram Moolenaar    let val: string = GetValue()
2138*f5be8cdbSBram Moolenaar    # env var is always a string
2139df671b46SBram Moolenaar    let env = $TERM
214032e35117SBram Moolenaar  END
214132e35117SBram Moolenaar  writefile(lines, 'Xfinished')
214232e35117SBram Moolenaar  source Xfinished
2143*f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
214432e35117SBram Moolenaar  assert_equal(1, g:count)
214532e35117SBram Moolenaar
214632e35117SBram Moolenaar  unlet g:count
214732e35117SBram Moolenaar  delete('Xfinished')
214832e35117SBram Moolenaarenddef
214932e35117SBram Moolenaar
215032e35117SBram Moolenaardef Test_let_missing_type()
215132e35117SBram Moolenaar  let lines =<< trim END
215232e35117SBram Moolenaar    vim9script
2153df671b46SBram Moolenaar    let var = g:unknown
2154227a69deSBram Moolenaar  END
2155822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2156227a69deSBram Moolenaar
2157227a69deSBram Moolenaar  lines =<< trim END
2158227a69deSBram Moolenaar    vim9script
2159227a69deSBram Moolenaar    let nr: number = 123
2160227a69deSBram Moolenaar    let var = nr
2161227a69deSBram Moolenaar  END
2162822ba247SBram Moolenaar  CheckScriptSuccess(lines)
216332e35117SBram Moolenaarenddef
216432e35117SBram Moolenaar
2165c82a5b5dSBram Moolenaardef Test_let_declaration()
2166c82a5b5dSBram Moolenaar  let lines =<< trim END
2167c82a5b5dSBram Moolenaar    vim9script
2168c82a5b5dSBram Moolenaar    let var: string
2169c82a5b5dSBram Moolenaar    g:var_uninit = var
2170c82a5b5dSBram Moolenaar    var = 'text'
2171c82a5b5dSBram Moolenaar    g:var_test = var
2172*f5be8cdbSBram Moolenaar    # prefixing s: is optional
2173984dddbeSBram Moolenaar    s:var = 'prefixed'
2174984dddbeSBram Moolenaar    g:var_prefixed = s:var
2175984dddbeSBram Moolenaar
2176984dddbeSBram Moolenaar    let s:other: number
2177984dddbeSBram Moolenaar    other = 1234
2178984dddbeSBram Moolenaar    g:other_var = other
2179c82a5b5dSBram Moolenaar  END
2180c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2181c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2182c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2183984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2184984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2185c82a5b5dSBram Moolenaar
2186c82a5b5dSBram Moolenaar  unlet g:var_uninit
2187c82a5b5dSBram Moolenaar  unlet g:var_test
2188984dddbeSBram Moolenaar  unlet g:var_prefixed
2189984dddbeSBram Moolenaar  unlet g:other_var
2190c82a5b5dSBram Moolenaarenddef
2191c82a5b5dSBram Moolenaar
2192c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2193c5b1c20bSBram Moolenaar  let lines =<< trim END
2194c5b1c20bSBram Moolenaar    vim9script
2195c5b1c20bSBram Moolenaar    const var: string
2196c5b1c20bSBram Moolenaar  END
2197c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2198c5b1c20bSBram Moolenaar
2199c5b1c20bSBram Moolenaar  lines =<< trim END
2200c5b1c20bSBram Moolenaar    vim9script
2201c5b1c20bSBram Moolenaar    let 9var: string
2202c5b1c20bSBram Moolenaar  END
2203c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2204c5b1c20bSBram Moolenaarenddef
2205c5b1c20bSBram Moolenaar
220634db91f7SBram Moolenaardef Test_let_type_check()
220734db91f7SBram Moolenaar  let lines =<< trim END
220834db91f7SBram Moolenaar    vim9script
220934db91f7SBram Moolenaar    let var: string
221034db91f7SBram Moolenaar    var = 1234
221134db91f7SBram Moolenaar  END
221234db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2213984dddbeSBram Moolenaar
2214984dddbeSBram Moolenaar  lines =<< trim END
2215984dddbeSBram Moolenaar    vim9script
2216984dddbeSBram Moolenaar    let var:string
2217984dddbeSBram Moolenaar  END
2218984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2219c5b1c20bSBram Moolenaar
2220c5b1c20bSBram Moolenaar  lines =<< trim END
2221c5b1c20bSBram Moolenaar    vim9script
2222c5b1c20bSBram Moolenaar    let var: asdf
2223c5b1c20bSBram Moolenaar  END
2224c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
222534db91f7SBram Moolenaarenddef
222634db91f7SBram Moolenaar
2227a5d0077eSBram Moolenaardef Test_forward_declaration()
2228a5d0077eSBram Moolenaar  let lines =<< trim END
2229a5d0077eSBram Moolenaar    vim9script
2230a5d0077eSBram Moolenaar    def GetValue(): string
2231a5d0077eSBram Moolenaar      return theVal
2232a5d0077eSBram Moolenaar    enddef
2233a5d0077eSBram Moolenaar    let theVal = 'something'
2234822ba247SBram Moolenaar    g:initVal = GetValue()
2235a5d0077eSBram Moolenaar    theVal = 'else'
2236a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2237a5d0077eSBram Moolenaar  END
2238a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2239a5d0077eSBram Moolenaar  source Xforward
2240a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2241a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2242a5d0077eSBram Moolenaar
2243a5d0077eSBram Moolenaar  unlet g:initVal
2244a5d0077eSBram Moolenaar  unlet g:laterVal
2245a5d0077eSBram Moolenaar  delete('Xforward')
2246a5d0077eSBram Moolenaarenddef
2247a5d0077eSBram Moolenaar
22489721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
22499721fb4eSBram Moolenaar  let legacy_lines =<< trim END
22509721fb4eSBram Moolenaar    source Xvim9_script.vim
22519721fb4eSBram Moolenaar
22529721fb4eSBram Moolenaar    call assert_false(exists('local'))
22539721fb4eSBram Moolenaar    call assert_false(exists('exported'))
22549721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
22559721fb4eSBram Moolenaar    call assert_equal('global', global)
22569721fb4eSBram Moolenaar    call assert_equal('global', g:global)
22579721fb4eSBram Moolenaar
22589721fb4eSBram Moolenaar    " imported variable becomes script-local
22599721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
22609721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
22619721fb4eSBram Moolenaar    call assert_false(exists('exported'))
22629721fb4eSBram Moolenaar
22639721fb4eSBram Moolenaar    " imported function becomes script-local
22649721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
22659721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
22669721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
22679721fb4eSBram Moolenaar  END
22689721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
22699721fb4eSBram Moolenaar
22709721fb4eSBram Moolenaar  let vim9_lines =<< trim END
22719721fb4eSBram Moolenaar    vim9script
22729721fb4eSBram Moolenaar    let local = 'local'
22739721fb4eSBram Moolenaar    g:global = 'global'
22749721fb4eSBram Moolenaar    export let exported = 'exported'
22759721fb4eSBram Moolenaar    export def GetText(): string
22769721fb4eSBram Moolenaar       return 'text'
22779721fb4eSBram Moolenaar    enddef
22789721fb4eSBram Moolenaar  END
22799721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
22809721fb4eSBram Moolenaar
22819721fb4eSBram Moolenaar  source Xlegacy_script.vim
22829721fb4eSBram Moolenaar
22839721fb4eSBram Moolenaar  assert_equal('global', g:global)
2284*f5be8cdbSBram Moolenaar  unlet g:global
22859721fb4eSBram Moolenaar
22869721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
22879721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
22889721fb4eSBram Moolenaarenddef
2289a5d0077eSBram Moolenaar
2290eeb27bfeSBram Moolenaardef Test_vim9_copen()
2291eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2292eeb27bfeSBram Moolenaar  copen
2293eeb27bfeSBram Moolenaar  quit
2294eeb27bfeSBram Moolenaarenddef
2295eeb27bfeSBram Moolenaar
2296585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2297585fea7bSBram Moolenaardef Test_substitute_cmd()
2298585fea7bSBram Moolenaar  new
2299585fea7bSBram Moolenaar  setline(1, 'something')
2300585fea7bSBram Moolenaar  :substitute(some(other(
2301585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2302585fea7bSBram Moolenaar  bwipe!
2303585fea7bSBram Moolenaar
2304*f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2305585fea7bSBram Moolenaar  let lines =<< trim END
2306585fea7bSBram Moolenaar    vim9script
2307585fea7bSBram Moolenaar    new
2308585fea7bSBram Moolenaar    setline(1, 'something')
2309585fea7bSBram Moolenaar    :substitute(some(other(
2310585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2311585fea7bSBram Moolenaar    bwipe!
2312585fea7bSBram Moolenaar  END
2313585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2314585fea7bSBram Moolenaar  source Xvim9lines
2315585fea7bSBram Moolenaar
2316585fea7bSBram Moolenaar  delete('Xvim9lines')
2317585fea7bSBram Moolenaarenddef
2318585fea7bSBram Moolenaar
23198a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2320