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
1163b74b6b4SBram 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
1253b74b6b4SBram 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
178c785b9a7SBram 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()
188d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
189d3aac291SBram 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')
262c785b9a7SBram 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
3085f195938SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E1001:')
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()
3974c17ad94SBram 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
4064c17ad94SBram 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()
589006ad48bSBram 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()
60337c83711SBram 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
7305381c7a1SBram 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
805fa29c8abSBram 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
8135269bd2aSBram 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
8225269bd2aSBram 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
8315269bd2aSBram 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
840fa29c8abSBram 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
880750802b5SBram 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:')
900750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
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
914*c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
9159bb3eb3eSBram Moolenaarendfunc
9169bb3eb3eSBram Moolenaar
917*c620c055SBram 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
96503afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
96603afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
9678a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
9688a7d6542SBram Moolenaar  source Ximport.vim
9698a7d6542SBram Moolenaar
9708a7d6542SBram 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
1016*c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1017*c620c055SBram Moolenaar" script where FastFilter() is called from.
1018*c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1019*c620c055SBram Moolenaar  let filterLines =<< trim END
1020*c620c055SBram Moolenaar    vim9script
1021*c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1022*c620c055SBram Moolenaar      return idx % 2 == 1
1023*c620c055SBram Moolenaar    enddef
1024*c620c055SBram Moolenaar    export def FastFilter(): list<number>
1025*c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1026*c620c055SBram Moolenaar    enddef
1027*c620c055SBram Moolenaar  END
1028*c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1029*c620c055SBram Moolenaar
1030*c620c055SBram Moolenaar  let lines =<< trim END
1031*c620c055SBram Moolenaar    vim9script
1032*c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1033*c620c055SBram Moolenaar    def Test()
1034*c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1035*c620c055SBram Moolenaar    enddef
1036*c620c055SBram Moolenaar    Test()
1037*c620c055SBram Moolenaar  END
1038*c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1039*c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1040*c620c055SBram Moolenaar
1041*c620c055SBram Moolenaar  delete('Xfilter.vim')
1042*c620c055SBram Moolenaar  delete('Ximport.vim')
1043*c620c055SBram Moolenaarenddef
1044*c620c055SBram 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/
118825e0f586SBram 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()
11988a7d6542SBram 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
136072abcf42SBram Moolenaar      " comment
136172abcf42SBram Moolenaar    else
136272abcf42SBram 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()
140447e880d6SBram 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()
144447e880d6SBram 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()
146447e880d6SBram 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',
15724fdae999SBram 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,
15804fdae999SBram 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',
17262c5ed4e3SBram Moolenaar      ], 'E600:')
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      ])
17571966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
17581966c248SBram 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
20945f195938SBram Moolenaar"  CheckScriptFailure([
20955f195938SBram Moolenaar"      'vim9script',
20965f195938SBram Moolenaar"      'new'
20975f195938SBram Moolenaar"      'call setline(1, ["# define pat", "last"])',
20985f195938SBram Moolenaar"      ':$',
20995f195938SBram Moolenaar"      'dsearch /pat/#comment',
21005f195938SBram Moolenaar"      'bwipe!',
21015f195938SBram Moolenaar"      ], 'E488:')
21025f195938SBram Moolenaar"
21035f195938SBram Moolenaar"  CheckScriptFailure([
21045f195938SBram Moolenaar"      'vim9script',
21055f195938SBram Moolenaar"      'func! SomeFunc()',
21065f195938SBram 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()
2138df671b46SBram Moolenaar    " env var is always a string
2139df671b46SBram Moolenaar    let env = $TERM
214032e35117SBram Moolenaar  END
214132e35117SBram Moolenaar  writefile(lines, 'Xfinished')
214232e35117SBram Moolenaar  source Xfinished
2143a5d0077eSBram 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
2172984dddbeSBram 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)
22849721fb4eSBram 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
2304585fea7bSBram 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