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
3089af78769SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
3099af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3109af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
3119af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3129af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
3139af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3149af78769SBram Moolenaar                            'let y: number',
3159af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
3169af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3179af78769SBram Moolenaar                            'let y: number',
3189af78769SBram Moolenaar                            'let z: list<number>',
3199af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
3209be61bbbSBram Moolenaar
321e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
3229be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
3239be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
3249be61bbbSBram Moolenaar
3259be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
3269be61bbbSBram Moolenaar
3279be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
3289be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
3299be61bbbSBram Moolenaar
3309be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
331d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
332d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
333d3aac291SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1080:')
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
4718a7d6542SBram Moolenaardef Test_block()
4728a7d6542SBram Moolenaar  let outer = 1
4738a7d6542SBram Moolenaar  {
4748a7d6542SBram Moolenaar    let inner = 2
4758a7d6542SBram Moolenaar    assert_equal(1, outer)
4768a7d6542SBram Moolenaar    assert_equal(2, inner)
4778a7d6542SBram Moolenaar  }
4788a7d6542SBram Moolenaar  assert_equal(1, outer)
4798a7d6542SBram Moolenaarenddef
4808a7d6542SBram Moolenaar
4818a7d6542SBram Moolenaarfunc Test_block_failure()
4828a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
483585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
484585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
4858a7d6542SBram Moolenaarendfunc
4868a7d6542SBram Moolenaar
487585fea7bSBram Moolenaardef Test_cmd_modifier()
488585fea7bSBram Moolenaar  tab echo '0'
489585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
490585fea7bSBram Moolenaarenddef
491585fea7bSBram Moolenaar
4928a7d6542SBram Moolenaardef Test_try_catch()
4938a7d6542SBram Moolenaar  let l = []
4947a092245SBram Moolenaar  try # comment
4958a7d6542SBram Moolenaar    add(l, '1')
4968a7d6542SBram Moolenaar    throw 'wrong'
4978a7d6542SBram Moolenaar    add(l, '2')
4987a092245SBram Moolenaar  catch # comment
4998a7d6542SBram Moolenaar    add(l, v:exception)
5007a092245SBram Moolenaar  finally # comment
5018a7d6542SBram Moolenaar    add(l, '3')
5027a092245SBram Moolenaar  endtry # comment
5038a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
5048a7d6542SBram Moolenaarenddef
5058a7d6542SBram Moolenaar
506257cc5eeSBram Moolenaardef ThrowFromDef()
507a72cfb80SBram Moolenaar  throw "getout" # comment
508257cc5eeSBram Moolenaarenddef
509257cc5eeSBram Moolenaar
510257cc5eeSBram Moolenaarfunc CatchInFunc()
511257cc5eeSBram Moolenaar  try
512257cc5eeSBram Moolenaar    call ThrowFromDef()
513257cc5eeSBram Moolenaar  catch
514257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
515257cc5eeSBram Moolenaar  endtry
516257cc5eeSBram Moolenaarendfunc
517257cc5eeSBram Moolenaar
518257cc5eeSBram Moolenaardef CatchInDef()
519257cc5eeSBram Moolenaar  try
520257cc5eeSBram Moolenaar    ThrowFromDef()
521257cc5eeSBram Moolenaar  catch
522257cc5eeSBram Moolenaar    g:thrown_def = v:exception
523257cc5eeSBram Moolenaar  endtry
524257cc5eeSBram Moolenaarenddef
525257cc5eeSBram Moolenaar
526f575adffSBram Moolenaardef ReturnFinally(): string
527f575adffSBram Moolenaar  try
528f575adffSBram Moolenaar    return 'intry'
529f575adffSBram Moolenaar  finally
530f575adffSBram Moolenaar    g:in_finally = 'finally'
531f575adffSBram Moolenaar  endtry
532f575adffSBram Moolenaar  return 'end'
533f575adffSBram Moolenaarenddef
534f575adffSBram Moolenaar
535257cc5eeSBram Moolenaardef Test_try_catch_nested()
536257cc5eeSBram Moolenaar  CatchInFunc()
537257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
538257cc5eeSBram Moolenaar
539257cc5eeSBram Moolenaar  CatchInDef()
540257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
541f575adffSBram Moolenaar
542f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
543f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
544f575adffSBram Moolenaarenddef
545f575adffSBram Moolenaar
546f575adffSBram Moolenaardef Test_try_catch_match()
547f575adffSBram Moolenaar  let seq = 'a'
548f575adffSBram Moolenaar  try
549f575adffSBram Moolenaar    throw 'something'
550f575adffSBram Moolenaar  catch /nothing/
551f575adffSBram Moolenaar    seq ..= 'x'
552f575adffSBram Moolenaar  catch /some/
553f575adffSBram Moolenaar    seq ..= 'b'
554f575adffSBram Moolenaar  catch /asdf/
555f575adffSBram Moolenaar    seq ..= 'x'
556e8c4abbbSBram Moolenaar  catch ?a\?sdf?
557e8c4abbbSBram Moolenaar    seq ..= 'y'
558f575adffSBram Moolenaar  finally
559f575adffSBram Moolenaar    seq ..= 'c'
560f575adffSBram Moolenaar  endtry
561f575adffSBram Moolenaar  assert_equal('abc', seq)
562257cc5eeSBram Moolenaarenddef
563257cc5eeSBram Moolenaar
564e8c4abbbSBram Moolenaardef Test_try_catch_fails()
565e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
566e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
567e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
568585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
569585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
570585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
571585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
572585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
573585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
574585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
575585fea7bSBram Moolenaar
576a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
577585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
578e8c4abbbSBram Moolenaarenddef
579e8c4abbbSBram Moolenaar
5802a1381c3SBram Moolenaarif has('channel')
58140ee466cSBram Moolenaar  let someJob = test_null_job()
58240ee466cSBram Moolenaar
58340ee466cSBram Moolenaar  def FuncWithError()
58440ee466cSBram Moolenaar    echomsg g:someJob
58540ee466cSBram Moolenaar  enddef
58640ee466cSBram Moolenaar
58740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
58840ee466cSBram Moolenaar    try
58940ee466cSBram Moolenaar      call FuncWithError()
59040ee466cSBram Moolenaar    catch
59140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
59240ee466cSBram Moolenaar    endtry
59340ee466cSBram Moolenaar  endfunc
5942a1381c3SBram Moolenaarendif
59540ee466cSBram Moolenaar
5968a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
5978a7d6542SBram Moolenaar  vim9script
5988a7d6542SBram Moolenaar  let name: string = 'bob'
5998a7d6542SBram Moolenaar  def Concat(arg: string): string
6008a7d6542SBram Moolenaar    return name .. arg
6018a7d6542SBram Moolenaar  enddef
602227a69deSBram Moolenaar  g:result = Concat('bie')
603227a69deSBram Moolenaar  g:localname = name
6048a7d6542SBram Moolenaar
6058a7d6542SBram Moolenaar  export const CONST = 1234
6068a7d6542SBram Moolenaar  export let exported = 9876
6076e587dcbSBram Moolenaar  export let exp_name = 'John'
6088a7d6542SBram Moolenaar  export def Exported(): string
6098a7d6542SBram Moolenaar    return 'Exported'
6108a7d6542SBram Moolenaar  enddef
6118a7d6542SBram MoolenaarEND
6128a7d6542SBram Moolenaar
6135269bd2aSBram Moolenaardef Test_vim9_import_export()
6148a7d6542SBram Moolenaar  let import_script_lines =<< trim END
6158a7d6542SBram Moolenaar    vim9script
6168a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
6178a7d6542SBram Moolenaar    g:imported = exported
6186e587dcbSBram Moolenaar    exported += 3
6196e587dcbSBram Moolenaar    g:imported_added = exported
6208a7d6542SBram Moolenaar    g:imported_func = Exported()
6216e587dcbSBram Moolenaar
6226e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
6236e587dcbSBram Moolenaar    g:imported_name = exp_name
6246e587dcbSBram Moolenaar    exp_name ..= ' Doe'
6256e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
6265381c7a1SBram Moolenaar    g:imported_later = exported
6278a7d6542SBram Moolenaar  END
6288a7d6542SBram Moolenaar
6298a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
6308a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
6318a7d6542SBram Moolenaar
6328a7d6542SBram Moolenaar  source Ximport.vim
6338a7d6542SBram Moolenaar
6348a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
6358a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
6368a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
6376e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
6385381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
6398a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
6406e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
6416e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
6428a7d6542SBram Moolenaar  assert_false(exists('g:name'))
6438a7d6542SBram Moolenaar
6448a7d6542SBram Moolenaar  unlet g:result
6458a7d6542SBram Moolenaar  unlet g:localname
6468a7d6542SBram Moolenaar  unlet g:imported
6476e587dcbSBram Moolenaar  unlet g:imported_added
6485381c7a1SBram Moolenaar  unlet g:imported_later
6498a7d6542SBram Moolenaar  unlet g:imported_func
6506e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
6518a7d6542SBram Moolenaar  delete('Ximport.vim')
652f2d5c240SBram Moolenaar
6535381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
6545381c7a1SBram Moolenaar    vim9script
6555381c7a1SBram Moolenaar    def ImportInDef()
6565381c7a1SBram Moolenaar      import exported from './Xexport.vim'
6575381c7a1SBram Moolenaar      g:imported = exported
6585381c7a1SBram Moolenaar      exported += 7
6595381c7a1SBram Moolenaar      g:imported_added = exported
6605381c7a1SBram Moolenaar    enddef
6615381c7a1SBram Moolenaar    ImportInDef()
6625381c7a1SBram Moolenaar  END
6635381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
6645381c7a1SBram Moolenaar  source Ximport2.vim
6655381c7a1SBram Moolenaar  " TODO: this should be 9879
6665381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
6675381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
6685381c7a1SBram Moolenaar  unlet g:imported
6695381c7a1SBram Moolenaar  unlet g:imported_added
6705381c7a1SBram Moolenaar  delete('Ximport2.vim')
6715381c7a1SBram Moolenaar
672f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
673f2d5c240SBram Moolenaar    vim9script
674f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
675f2d5c240SBram Moolenaar    def UseExport()
676f2d5c240SBram Moolenaar      g:imported = Export.exported
677f2d5c240SBram Moolenaar    enddef
678f2d5c240SBram Moolenaar    UseExport()
679f2d5c240SBram Moolenaar  END
680f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
681f2d5c240SBram Moolenaar  source Ximport.vim
6825381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
683f2d5c240SBram Moolenaar
684599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
685599c89c8SBram Moolenaar    vim9script
686599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
687599c89c8SBram Moolenaar    def Func()
688599c89c8SBram Moolenaar      let dummy = 1
689599c89c8SBram Moolenaar      let imported = Export + dummy
690599c89c8SBram Moolenaar    enddef
691822ba247SBram Moolenaar    defcompile
692599c89c8SBram Moolenaar  END
693599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
694599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
695599c89c8SBram Moolenaar
696599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
697599c89c8SBram Moolenaar    vim9script
698599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
699599c89c8SBram Moolenaar    def Func()
700599c89c8SBram Moolenaar      let imported = Export . exported
701599c89c8SBram Moolenaar    enddef
702822ba247SBram Moolenaar    defcompile
703599c89c8SBram Moolenaar  END
704599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
705599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
706599c89c8SBram Moolenaar
707599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
708599c89c8SBram Moolenaar    vim9script
709599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
710599c89c8SBram Moolenaar    def Func()
711599c89c8SBram Moolenaar      let imported = Export.
712599c89c8SBram Moolenaar    enddef
713822ba247SBram Moolenaar    defcompile
714599c89c8SBram Moolenaar  END
715599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
716599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
717599c89c8SBram Moolenaar
718f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
719f2d5c240SBram Moolenaar    vim9script
720f2d5c240SBram Moolenaar    import * from './Xexport.vim'
721f2d5c240SBram Moolenaar  END
722f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
723f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
724f2d5c240SBram Moolenaar
725fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
726fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
727fa29c8abSBram Moolenaar    vim9script
728fa29c8abSBram Moolenaar    import name from './Xexport.vim'
729fa29c8abSBram Moolenaar  END
730fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
731fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
732fa29c8abSBram Moolenaar
7335269bd2aSBram Moolenaar  " try to import something that is already defined
7345269bd2aSBram Moolenaar  let import_already_defined =<< trim END
7355269bd2aSBram Moolenaar    vim9script
7365269bd2aSBram Moolenaar    let exported = 'something'
7375269bd2aSBram Moolenaar    import exported from './Xexport.vim'
7385269bd2aSBram Moolenaar  END
7395269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
7405269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
7415269bd2aSBram Moolenaar
7425269bd2aSBram Moolenaar  " try to import something that is already defined
7435269bd2aSBram Moolenaar  import_already_defined =<< trim END
7445269bd2aSBram Moolenaar    vim9script
7455269bd2aSBram Moolenaar    let exported = 'something'
7465269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
7475269bd2aSBram Moolenaar  END
7485269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
7495269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
7505269bd2aSBram Moolenaar
7515269bd2aSBram Moolenaar  " try to import something that is already defined
7525269bd2aSBram Moolenaar  import_already_defined =<< trim END
7535269bd2aSBram Moolenaar    vim9script
7545269bd2aSBram Moolenaar    let exported = 'something'
7555269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
7565269bd2aSBram Moolenaar  END
7575269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
7585269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
7595269bd2aSBram Moolenaar
760fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
761fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
762fa29c8abSBram Moolenaar    vim9script
763fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
764fa29c8abSBram Moolenaar  END
765fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
766fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
767fa29c8abSBram Moolenaar
768fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
769fa29c8abSBram Moolenaar    vim9script
770fa29c8abSBram Moolenaar    import name './Xexport.vim'
771fa29c8abSBram Moolenaar  END
772fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
773fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
774fa29c8abSBram Moolenaar
775fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
776fa29c8abSBram Moolenaar    vim9script
777fa29c8abSBram Moolenaar    import name from Xexport.vim
778fa29c8abSBram Moolenaar  END
779fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
780fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
781fa29c8abSBram Moolenaar
782fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
783fa29c8abSBram Moolenaar    vim9script
784fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
785fa29c8abSBram Moolenaar  END
786fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
787fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
788fa29c8abSBram Moolenaar
789fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
790fa29c8abSBram Moolenaar    vim9script
791fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
792fa29c8abSBram Moolenaar  END
7935269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
7945269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
795fa29c8abSBram Moolenaar
796f2d5c240SBram Moolenaar  delete('Ximport.vim')
7975269bd2aSBram Moolenaar  delete('Ximport3.vim')
7988a7d6542SBram Moolenaar  delete('Xexport.vim')
7998a7d6542SBram Moolenaar
800750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
801750802b5SBram Moolenaar  set cpo&vi
802750802b5SBram Moolenaar  let cpo_before = &cpo
803750802b5SBram Moolenaar  let lines =<< trim END
804750802b5SBram Moolenaar    vim9script
805750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
806750802b5SBram Moolenaar  END
807750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
808750802b5SBram Moolenaar  source Xvim9_script
809750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
810750802b5SBram Moolenaar  set cpo&vim
811750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
812750802b5SBram Moolenaar  delete('Xvim9_script')
813750802b5SBram Moolenaarenddef
814750802b5SBram Moolenaar
815750802b5SBram Moolenaardef Test_vim9script_fails()
8168a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
8178a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
818750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
8199721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
820750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
821750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
822750802b5SBram Moolenaar
823c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
824c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
825c785b9a7SBram Moolenaar
826750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
827a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
8288a7d6542SBram Moolenaarenddef
8298a7d6542SBram Moolenaar
830f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
831101f4810SBram Moolenaar  CheckRunVimInTerminal
832101f4810SBram Moolenaar
8339bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
8349bb3eb3eSBram Moolenaar  call Run_Test_import_fails_without_script()
8359bb3eb3eSBram Moolenaarendfunc
8369bb3eb3eSBram Moolenaar
8379bb3eb3eSBram Moolenaardef Run_Test_import_fails_without_script()
838101f4810SBram Moolenaar  let export =<< trim END
839101f4810SBram Moolenaar    vim9script
840101f4810SBram Moolenaar    export def Foo(): number
841101f4810SBram Moolenaar        return 0
842101f4810SBram Moolenaar    enddef
843101f4810SBram Moolenaar  END
8449bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
845101f4810SBram Moolenaar
8469bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
8479bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
8489bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
849101f4810SBram Moolenaar
8509bb3eb3eSBram Moolenaar  delete('Xexport.vim')
8519bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
8529bb3eb3eSBram Moolenaarenddef
853101f4810SBram Moolenaar
8544c17ad94SBram Moolenaardef Test_vim9script_reload_import()
8558a7d6542SBram Moolenaar  let lines =<< trim END
8568a7d6542SBram Moolenaar    vim9script
8578a7d6542SBram Moolenaar    const var = ''
8588a7d6542SBram Moolenaar    let valone = 1234
8598a7d6542SBram Moolenaar    def MyFunc(arg: string)
8608a7d6542SBram Moolenaar       valone = 5678
8618a7d6542SBram Moolenaar    enddef
8628a7d6542SBram Moolenaar  END
8638a7d6542SBram Moolenaar  let morelines =<< trim END
8648a7d6542SBram Moolenaar    let valtwo = 222
8658a7d6542SBram Moolenaar    export def GetValtwo(): number
8668a7d6542SBram Moolenaar      return valtwo
8678a7d6542SBram Moolenaar    enddef
8688a7d6542SBram Moolenaar  END
86903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
8708a7d6542SBram Moolenaar  source Xreload.vim
8718a7d6542SBram Moolenaar  source Xreload.vim
8728a7d6542SBram Moolenaar  source Xreload.vim
8738a7d6542SBram Moolenaar
8748a7d6542SBram Moolenaar  let testlines =<< trim END
8758a7d6542SBram Moolenaar    vim9script
8768a7d6542SBram Moolenaar    def TheFunc()
8778a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8788a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8798a7d6542SBram Moolenaar    enddef
8808a7d6542SBram Moolenaar    TheFunc()
8818a7d6542SBram Moolenaar  END
8828a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8838a7d6542SBram Moolenaar  source Ximport.vim
8848a7d6542SBram Moolenaar
88503afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
88603afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
8878a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8888a7d6542SBram Moolenaar  source Ximport.vim
8898a7d6542SBram Moolenaar
8908a7d6542SBram Moolenaar  " cannot declare a var twice
8918a7d6542SBram Moolenaar  lines =<< trim END
8928a7d6542SBram Moolenaar    vim9script
8938a7d6542SBram Moolenaar    let valone = 1234
8948a7d6542SBram Moolenaar    let valone = 5678
8958a7d6542SBram Moolenaar  END
8968a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8978a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8988a7d6542SBram Moolenaar
8998a7d6542SBram Moolenaar  delete('Xreload.vim')
9008a7d6542SBram Moolenaar  delete('Ximport.vim')
9018a7d6542SBram Moolenaarenddef
9028a7d6542SBram Moolenaar
9034c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
9044c17ad94SBram Moolenaar  let first_lines =<< trim END
9054c17ad94SBram Moolenaar    vim9script
9064c17ad94SBram Moolenaar    def FuncYes(): string
9074c17ad94SBram Moolenaar      return 'yes'
9084c17ad94SBram Moolenaar    enddef
9094c17ad94SBram Moolenaar  END
91003afdcf1SBram Moolenaar  let withno_lines =<< trim END
9114c17ad94SBram Moolenaar    def FuncNo(): string
9124c17ad94SBram Moolenaar      return 'no'
9134c17ad94SBram Moolenaar    enddef
9144c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
9154c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
9164c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
91703afdcf1SBram Moolenaar    enddef
91803afdcf1SBram Moolenaar  END
91903afdcf1SBram Moolenaar  let nono_lines =<< trim END
92003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
92103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
9224c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
9234c17ad94SBram Moolenaar    enddef
9244c17ad94SBram Moolenaar  END
9254c17ad94SBram Moolenaar
9264c17ad94SBram Moolenaar  # FuncNo() is defined
92703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
9284c17ad94SBram Moolenaar  source Xreloaded.vim
9294c17ad94SBram Moolenaar  g:DoCheck(true)
9304c17ad94SBram Moolenaar
9314c17ad94SBram Moolenaar  # FuncNo() is not redefined
93203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
9334c17ad94SBram Moolenaar  source Xreloaded.vim
93403afdcf1SBram Moolenaar  g:DoCheck()
9354c17ad94SBram Moolenaar
9364c17ad94SBram Moolenaar  # FuncNo() is back
93703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
9384c17ad94SBram Moolenaar  source Xreloaded.vim
93903afdcf1SBram Moolenaar  g:DoCheck()
9404c17ad94SBram Moolenaar
9414c17ad94SBram Moolenaar  delete('Xreloaded.vim')
9424c17ad94SBram Moolenaarenddef
9434c17ad94SBram Moolenaar
94489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
94589483d40SBram Moolenaar  # write the script with a script-local variable
94689483d40SBram Moolenaar  let lines =<< trim END
94789483d40SBram Moolenaar    vim9script
94889483d40SBram Moolenaar    let var = 'string'
94989483d40SBram Moolenaar  END
95089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
95189483d40SBram Moolenaar  source XreloadVar.vim
95289483d40SBram Moolenaar
95389483d40SBram Moolenaar  # now write the script using the same variable locally - works
95489483d40SBram Moolenaar  lines =<< trim END
95589483d40SBram Moolenaar    vim9script
95689483d40SBram Moolenaar    def Func()
95789483d40SBram Moolenaar      let var = 'string'
95889483d40SBram Moolenaar    enddef
95989483d40SBram Moolenaar  END
96089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
96189483d40SBram Moolenaar  source XreloadVar.vim
96289483d40SBram Moolenaar
96389483d40SBram Moolenaar  delete('XreloadVar.vim')
96489483d40SBram Moolenaarenddef
96589483d40SBram Moolenaar
9668a7d6542SBram Moolenaardef Test_import_absolute()
9678a7d6542SBram Moolenaar  let import_lines = [
968e6085c53SBram Moolenaar        'vim9script',
969e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
970e6085c53SBram Moolenaar        'def UseExported()',
971e6085c53SBram Moolenaar        '  g:imported_abs = exported',
972e6085c53SBram Moolenaar        '  exported = 8888',
973e6085c53SBram Moolenaar        '  g:imported_after = exported',
974e6085c53SBram Moolenaar        'enddef',
975e6085c53SBram Moolenaar        'UseExported()',
976e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
977e6085c53SBram Moolenaar        ]
9788a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
9798a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
9808a7d6542SBram Moolenaar
9818a7d6542SBram Moolenaar  source Ximport_abs.vim
9828a7d6542SBram Moolenaar
9838a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
9844e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
985675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
986675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
987675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
988675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
989675f716eSBram Moolenaar          'exported = 8888.*' ..
990675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
991675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
992675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
993675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
994e6085c53SBram Moolenaar        g:import_disassembled)
9958a7d6542SBram Moolenaar  unlet g:imported_abs
9964e12a5dfSBram Moolenaar  unlet g:import_disassembled
9978a7d6542SBram Moolenaar
9988a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
9998a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
10008a7d6542SBram Moolenaarenddef
10018a7d6542SBram Moolenaar
10028a7d6542SBram Moolenaardef Test_import_rtp()
10038a7d6542SBram Moolenaar  let import_lines = [
1004e6085c53SBram Moolenaar        'vim9script',
1005e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1006e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1007e6085c53SBram Moolenaar        ]
10088a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
10098a7d6542SBram Moolenaar  mkdir('import')
10108a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
10118a7d6542SBram Moolenaar
10128a7d6542SBram Moolenaar  let save_rtp = &rtp
10138a7d6542SBram Moolenaar  &rtp = getcwd()
10148a7d6542SBram Moolenaar  source Ximport_rtp.vim
10158a7d6542SBram Moolenaar  &rtp = save_rtp
10168a7d6542SBram Moolenaar
10178a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
10188a7d6542SBram Moolenaar  unlet g:imported_rtp
10198a7d6542SBram Moolenaar
10208a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
102189483d40SBram Moolenaar  delete('import', 'rf')
10228a7d6542SBram Moolenaarenddef
10238a7d6542SBram Moolenaar
102425e0f586SBram Moolenaardef Test_import_compile_error()
102525e0f586SBram Moolenaar  let export_lines = [
102625e0f586SBram Moolenaar        'vim9script',
102725e0f586SBram Moolenaar        'export def ExpFunc(): string',
102825e0f586SBram Moolenaar        '  return notDefined',
102925e0f586SBram Moolenaar        'enddef',
103025e0f586SBram Moolenaar        ]
103125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
103225e0f586SBram Moolenaar
103325e0f586SBram Moolenaar  let import_lines = [
103425e0f586SBram Moolenaar        'vim9script',
103525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
103625e0f586SBram Moolenaar        'def ImpFunc()',
103725e0f586SBram Moolenaar        '  echo ExpFunc()',
103825e0f586SBram Moolenaar        'enddef',
103925e0f586SBram Moolenaar        'defcompile',
104025e0f586SBram Moolenaar        ]
104125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
104225e0f586SBram Moolenaar
104325e0f586SBram Moolenaar  try
104425e0f586SBram Moolenaar    source Ximport.vim
104525e0f586SBram Moolenaar  catch /E1001/
104625e0f586SBram Moolenaar    " Error should be fore the Xexported.vim file.
104725e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
104825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
104925e0f586SBram Moolenaar  endtry
105025e0f586SBram Moolenaar
105125e0f586SBram Moolenaar  delete('Xexported.vim')
105225e0f586SBram Moolenaar  delete('Ximport.vim')
105325e0f586SBram Moolenaarenddef
105425e0f586SBram Moolenaar
10558a7d6542SBram Moolenaardef Test_fixed_size_list()
10568a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
10578a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
10588a7d6542SBram Moolenaar  l->remove(0)
10598a7d6542SBram Moolenaar  l->add(5)
10608a7d6542SBram Moolenaar  l->insert(99, 1)
10610f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
10628a7d6542SBram Moolenaarenddef
10638a7d6542SBram Moolenaar
1064158906cfSBram Moolenaardef IfElse(what: number): string
1065158906cfSBram Moolenaar  let res = ''
1066158906cfSBram Moolenaar  if what == 1
1067158906cfSBram Moolenaar    res = "one"
1068158906cfSBram Moolenaar  elseif what == 2
1069158906cfSBram Moolenaar    res = "two"
1070a259d8d3SBram Moolenaar  else
1071158906cfSBram Moolenaar    res = "three"
1072a259d8d3SBram Moolenaar  endif
1073158906cfSBram Moolenaar  return res
1074a259d8d3SBram Moolenaarenddef
1075a259d8d3SBram Moolenaar
1076158906cfSBram Moolenaardef Test_if_elseif_else()
1077158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1078158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1079158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
10800f18b6d1SBram Moolenaarenddef
10810f18b6d1SBram Moolenaar
1082e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1083e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1084e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1085e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1086e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1087585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1088e8c4abbbSBram Moolenaarenddef
1089e8c4abbbSBram Moolenaar
10906d69bf60SBram Moolenaarlet g:bool_true = v:true
10916d69bf60SBram Moolenaarlet g:bool_false = v:false
10926d69bf60SBram Moolenaar
10936d69bf60SBram Moolenaardef Test_if_const_expr()
10946d69bf60SBram Moolenaar  let res = false
10956d69bf60SBram Moolenaar  if true ? true : false
10966d69bf60SBram Moolenaar    res = true
10976d69bf60SBram Moolenaar  endif
10986d69bf60SBram Moolenaar  assert_equal(true, res)
10996d69bf60SBram Moolenaar
1100585fea7bSBram Moolenaar  g:glob = 2
1101585fea7bSBram Moolenaar  if false
1102*6797966dSBram Moolenaar    execute('g:glob = 3')
1103585fea7bSBram Moolenaar  endif
1104585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1105585fea7bSBram Moolenaar  if true
1106*6797966dSBram Moolenaar    execute('g:glob = 3')
1107585fea7bSBram Moolenaar  endif
1108585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1109585fea7bSBram Moolenaar
11106d69bf60SBram Moolenaar  res = false
11116d69bf60SBram Moolenaar  if g:bool_true ? true : false
11126d69bf60SBram Moolenaar    res = true
11136d69bf60SBram Moolenaar  endif
11146d69bf60SBram Moolenaar  assert_equal(true, res)
11156d69bf60SBram Moolenaar
11166d69bf60SBram Moolenaar  res = false
11176d69bf60SBram Moolenaar  if true ? g:bool_true : false
11186d69bf60SBram Moolenaar    res = true
11196d69bf60SBram Moolenaar  endif
11206d69bf60SBram Moolenaar  assert_equal(true, res)
11216d69bf60SBram Moolenaar
11226d69bf60SBram Moolenaar  res = false
11236d69bf60SBram Moolenaar  if true ? true : g:bool_false
11246d69bf60SBram Moolenaar    res = true
11256d69bf60SBram Moolenaar  endif
11266d69bf60SBram Moolenaar  assert_equal(true, res)
11276d69bf60SBram Moolenaar
11286d69bf60SBram Moolenaar  res = false
11296d69bf60SBram Moolenaar  if true ? false : true
11306d69bf60SBram Moolenaar    res = true
11316d69bf60SBram Moolenaar  endif
11326d69bf60SBram Moolenaar  assert_equal(false, res)
11336d69bf60SBram Moolenaar
11346d69bf60SBram Moolenaar  res = false
11356d69bf60SBram Moolenaar  if false ? false : true
11366d69bf60SBram Moolenaar    res = true
11376d69bf60SBram Moolenaar  endif
11386d69bf60SBram Moolenaar  assert_equal(true, res)
11396d69bf60SBram Moolenaar
11406d69bf60SBram Moolenaar  res = false
11416d69bf60SBram Moolenaar  if false ? true : false
11426d69bf60SBram Moolenaar    res = true
11436d69bf60SBram Moolenaar  endif
11446d69bf60SBram Moolenaar  assert_equal(false, res)
11456d69bf60SBram Moolenaar
11466d69bf60SBram Moolenaar  res = false
1147e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1148e8c4abbbSBram Moolenaar    res = true
1149e8c4abbbSBram Moolenaar  endif
1150e8c4abbbSBram Moolenaar  assert_equal(false, res)
1151e8c4abbbSBram Moolenaar
1152e8c4abbbSBram Moolenaar  res = false
11536d69bf60SBram Moolenaar  if true && true
11546d69bf60SBram Moolenaar    res = true
11556d69bf60SBram Moolenaar  endif
11566d69bf60SBram Moolenaar  assert_equal(true, res)
11576d69bf60SBram Moolenaar
11586d69bf60SBram Moolenaar  res = false
11596d69bf60SBram Moolenaar  if true && false
11606d69bf60SBram Moolenaar    res = true
11616d69bf60SBram Moolenaar  endif
11626d69bf60SBram Moolenaar  assert_equal(false, res)
11636d69bf60SBram Moolenaar
11646d69bf60SBram Moolenaar  res = false
11656d69bf60SBram Moolenaar  if g:bool_true && false
11666d69bf60SBram Moolenaar    res = true
11676d69bf60SBram Moolenaar  endif
11686d69bf60SBram Moolenaar  assert_equal(false, res)
11696d69bf60SBram Moolenaar
11706d69bf60SBram Moolenaar  res = false
11716d69bf60SBram Moolenaar  if true && g:bool_false
11726d69bf60SBram Moolenaar    res = true
11736d69bf60SBram Moolenaar  endif
11746d69bf60SBram Moolenaar  assert_equal(false, res)
11756d69bf60SBram Moolenaar
11766d69bf60SBram Moolenaar  res = false
11776d69bf60SBram Moolenaar  if false && false
11786d69bf60SBram Moolenaar    res = true
11796d69bf60SBram Moolenaar  endif
11806d69bf60SBram Moolenaar  assert_equal(false, res)
11816d69bf60SBram Moolenaar
11826d69bf60SBram Moolenaar  res = false
11836d69bf60SBram Moolenaar  if true || false
11846d69bf60SBram Moolenaar    res = true
11856d69bf60SBram Moolenaar  endif
11866d69bf60SBram Moolenaar  assert_equal(true, res)
11876d69bf60SBram Moolenaar
11886d69bf60SBram Moolenaar  res = false
11896d69bf60SBram Moolenaar  if g:bool_true || false
11906d69bf60SBram Moolenaar    res = true
11916d69bf60SBram Moolenaar  endif
11926d69bf60SBram Moolenaar  assert_equal(true, res)
11936d69bf60SBram Moolenaar
11946d69bf60SBram Moolenaar  res = false
11956d69bf60SBram Moolenaar  if true || g:bool_false
11966d69bf60SBram Moolenaar    res = true
11976d69bf60SBram Moolenaar  endif
11986d69bf60SBram Moolenaar  assert_equal(true, res)
11996d69bf60SBram Moolenaar
12006d69bf60SBram Moolenaar  res = false
12016d69bf60SBram Moolenaar  if false || false
12026d69bf60SBram Moolenaar    res = true
12036d69bf60SBram Moolenaar  endif
12046d69bf60SBram Moolenaar  assert_equal(false, res)
120580c34ca3SBram Moolenaarenddef
12066d69bf60SBram Moolenaar
120780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
120880c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
120980c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1210e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1211e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
12126d69bf60SBram Moolenaarenddef
12136d69bf60SBram Moolenaar
121472abcf42SBram Moolenaardef RunNested(i: number): number
121572abcf42SBram Moolenaar  let x: number = 0
121672abcf42SBram Moolenaar  if i % 2
121772abcf42SBram Moolenaar    if 1
121872abcf42SBram Moolenaar      " comment
121972abcf42SBram Moolenaar    else
122072abcf42SBram Moolenaar      " comment
122172abcf42SBram Moolenaar    endif
122272abcf42SBram Moolenaar    x += 1
122372abcf42SBram Moolenaar  else
122472abcf42SBram Moolenaar    x += 1000
122572abcf42SBram Moolenaar  endif
122672abcf42SBram Moolenaar  return x
122772abcf42SBram Moolenaarenddef
122872abcf42SBram Moolenaar
122972abcf42SBram Moolenaardef Test_nested_if()
123072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
123172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
123272abcf42SBram Moolenaarenddef
123372abcf42SBram Moolenaar
1234ad39c094SBram Moolenaardef Test_execute_cmd()
1235ad39c094SBram Moolenaar  new
1236ad39c094SBram Moolenaar  setline(1, 'default')
1237ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1238ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1239a72cfb80SBram Moolenaar
1240a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1241a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1242a72cfb80SBram Moolenaar
1243ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1244ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1245a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1246ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1247a72cfb80SBram Moolenaar
1248ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1249ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1250a72cfb80SBram Moolenaar
1251ad39c094SBram Moolenaar  let cmd_first = 'call '
1252ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1253ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1254ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1255ad39c094SBram Moolenaar  bwipe!
1256585fea7bSBram Moolenaar
1257585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1258a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1259ad39c094SBram Moolenaarenddef
1260ad39c094SBram Moolenaar
1261ad39c094SBram Moolenaardef Test_echo_cmd()
1262a72cfb80SBram Moolenaar  echo 'some' # comment
1263585fea7bSBram Moolenaar  echon 'thing'
1264ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1265ad39c094SBram Moolenaar
1266a72cfb80SBram Moolenaar  echo "some" # comment
1267a72cfb80SBram Moolenaar  echon "thing"
1268a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1269a72cfb80SBram Moolenaar
1270ad39c094SBram Moolenaar  let str1 = 'some'
1271ad39c094SBram Moolenaar  let str2 = 'more'
1272ad39c094SBram Moolenaar  echo str1 str2
1273ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1274a72cfb80SBram Moolenaar
1275a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1276ad39c094SBram Moolenaarenddef
1277ad39c094SBram Moolenaar
1278f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1279f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1280f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1281f93c7feaSBram Moolenaar  echo 'clear'
1282f93c7feaSBram Moolenaar  1messages
1283f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1284f93c7feaSBram Moolenaar
1285f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1286f93c7feaSBram Moolenaarenddef
1287f93c7feaSBram Moolenaar
1288f93c7feaSBram Moolenaardef Test_echoerr_cmd()
128940ee466cSBram Moolenaar  try
129040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
129140ee466cSBram Moolenaar  catch
129240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
129340ee466cSBram Moolenaar  endtry
1294f93c7feaSBram Moolenaarenddef
1295f93c7feaSBram Moolenaar
129641fe0617SBram Moolenaardef Test_for_outside_of_function()
129741fe0617SBram Moolenaar  let lines =<< trim END
129841fe0617SBram Moolenaar    vim9script
129941fe0617SBram Moolenaar    new
130041fe0617SBram Moolenaar    for var in range(0, 3)
130141fe0617SBram Moolenaar      append(line('$'), var)
130241fe0617SBram Moolenaar    endfor
130341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
130441fe0617SBram Moolenaar    bwipe!
130541fe0617SBram Moolenaar  END
130641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
130741fe0617SBram Moolenaar  source Xvim9for.vim
130841fe0617SBram Moolenaar  delete('Xvim9for.vim')
130941fe0617SBram Moolenaarenddef
13108a7d6542SBram Moolenaar
1311e8c4abbbSBram Moolenaardef Test_for_loop()
1312e8c4abbbSBram Moolenaar  let result = ''
1313e8c4abbbSBram Moolenaar  for cnt in range(7)
1314e8c4abbbSBram Moolenaar    if cnt == 4
1315e8c4abbbSBram Moolenaar      break
1316e8c4abbbSBram Moolenaar    endif
1317e8c4abbbSBram Moolenaar    if cnt == 2
1318e8c4abbbSBram Moolenaar      continue
1319e8c4abbbSBram Moolenaar    endif
1320e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1321e8c4abbbSBram Moolenaar  endfor
1322e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1323e8c4abbbSBram Moolenaarenddef
1324e8c4abbbSBram Moolenaar
1325e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1326675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1327675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1328675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1329822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1330675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1331675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1332675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1333675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1334e8c4abbbSBram Moolenaarenddef
1335e8c4abbbSBram Moolenaar
1336d0df1aacSBram Moolenaardef Test_while_loop()
1337d0df1aacSBram Moolenaar  let result = ''
1338d0df1aacSBram Moolenaar  let cnt = 0
1339d0df1aacSBram Moolenaar  while cnt < 555
1340d0df1aacSBram Moolenaar    if cnt == 3
1341d0df1aacSBram Moolenaar      break
1342d0df1aacSBram Moolenaar    endif
1343d0df1aacSBram Moolenaar    cnt += 1
1344d0df1aacSBram Moolenaar    if cnt == 2
1345d0df1aacSBram Moolenaar      continue
1346d0df1aacSBram Moolenaar    endif
1347d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1348d0df1aacSBram Moolenaar  endwhile
1349d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1350d0df1aacSBram Moolenaarenddef
1351d0df1aacSBram Moolenaar
1352e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1353675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1354675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1355675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1356675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1357675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1358675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1359675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1360bd5da371SBram Moolenaarenddef
1361bd5da371SBram Moolenaar
13629645e2d9SBram Moolenaardef Test_interrupt_loop()
136397acfc78SBram Moolenaar  let caught = false
13649645e2d9SBram Moolenaar  let x = 0
136597acfc78SBram Moolenaar  try
13669645e2d9SBram Moolenaar    while 1
13679645e2d9SBram Moolenaar      x += 1
13689645e2d9SBram Moolenaar      if x == 100
13699645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
13709645e2d9SBram Moolenaar      endif
13719645e2d9SBram Moolenaar    endwhile
137297acfc78SBram Moolenaar  catch
137397acfc78SBram Moolenaar    caught = true
137497acfc78SBram Moolenaar    assert_equal(100, x)
137597acfc78SBram Moolenaar  endtry
137697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
13779645e2d9SBram Moolenaarenddef
137820431c9dSBram Moolenaar
13794fdae999SBram Moolenaardef Test_automatic_line_continuation()
13804fdae999SBram Moolenaar  let mylist = [
13814fdae999SBram Moolenaar      'one',
13824fdae999SBram Moolenaar      'two',
13834fdae999SBram Moolenaar      'three',
13844fdae999SBram Moolenaar      ] " comment
13854fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
13864fdae999SBram Moolenaar
13874fdae999SBram Moolenaar  let mydict = {
13884fdae999SBram Moolenaar      'one': 1,
13894fdae999SBram Moolenaar      'two': 2,
13904fdae999SBram Moolenaar      'three':
13914fdae999SBram Moolenaar          3,
13924fdae999SBram Moolenaar      } " comment
13934fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
13944fdae999SBram Moolenaar  mydict = #{
13952c330432SBram Moolenaar      one: 1,  # comment
13962c330432SBram Moolenaar      two:     # comment
13972c330432SBram Moolenaar           2,  # comment
13982c330432SBram Moolenaar      three: 3 # comment
13992c330432SBram Moolenaar      }
14002c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
14012c330432SBram Moolenaar  mydict = #{
14022c330432SBram Moolenaar      one: 1,
14034fdae999SBram Moolenaar      two:
14044fdae999SBram Moolenaar           2,
14052c330432SBram Moolenaar      three: 3
14064fdae999SBram Moolenaar      }
14074fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1408e6085c53SBram Moolenaar
1409e6085c53SBram Moolenaar  assert_equal(
1410e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1411e6085c53SBram Moolenaar        split('one two three')
1412e6085c53SBram Moolenaar        )
14134fdae999SBram Moolenaarenddef
14144fdae999SBram Moolenaar
14157a092245SBram Moolenaardef Test_vim9_comment()
14167a092245SBram Moolenaar  CheckScriptSuccess([
14177a092245SBram Moolenaar      'vim9script',
14187a092245SBram Moolenaar      '# something',
14197a092245SBram Moolenaar      ])
14207a092245SBram Moolenaar  CheckScriptFailure([
14217a092245SBram Moolenaar      'vim9script',
14227a092245SBram Moolenaar      ':# something',
14237a092245SBram Moolenaar      ], 'E488:')
14247a092245SBram Moolenaar  CheckScriptFailure([
14257a092245SBram Moolenaar      '# something',
14267a092245SBram Moolenaar      ], 'E488:')
14277a092245SBram Moolenaar  CheckScriptFailure([
14287a092245SBram Moolenaar      ':# something',
14297a092245SBram Moolenaar      ], 'E488:')
14307a092245SBram Moolenaar
14314a8d9f2eSBram Moolenaar  { # block start
14324a8d9f2eSBram Moolenaar  } # block end
14334a8d9f2eSBram Moolenaar  CheckDefFailure([
14344a8d9f2eSBram Moolenaar      '{# comment',
14354a8d9f2eSBram Moolenaar      ], 'E488:')
14364a8d9f2eSBram Moolenaar  CheckDefFailure([
14374a8d9f2eSBram Moolenaar      '{',
14384a8d9f2eSBram Moolenaar      '}# comment',
14394a8d9f2eSBram Moolenaar      ], 'E488:')
14404a8d9f2eSBram Moolenaar
14414a8d9f2eSBram Moolenaar  echo "yes" # comment
14424a8d9f2eSBram Moolenaar  CheckDefFailure([
14434a8d9f2eSBram Moolenaar      'echo "yes"# comment',
14444a8d9f2eSBram Moolenaar      ], 'E488:')
14457a092245SBram Moolenaar  CheckScriptSuccess([
14467a092245SBram Moolenaar      'vim9script',
14477a092245SBram Moolenaar      'echo "yes" # something',
14487a092245SBram Moolenaar      ])
14497a092245SBram Moolenaar  CheckScriptFailure([
14507a092245SBram Moolenaar      'vim9script',
14517a092245SBram Moolenaar      'echo "yes"# something',
14527a092245SBram Moolenaar      ], 'E121:')
14537a092245SBram Moolenaar  CheckScriptFailure([
14547a092245SBram Moolenaar      'vim9script',
14557a092245SBram Moolenaar      'echo# something',
14567a092245SBram Moolenaar      ], 'E121:')
14577a092245SBram Moolenaar  CheckScriptFailure([
14587a092245SBram Moolenaar      'echo "yes" # something',
14597a092245SBram Moolenaar      ], 'E121:')
14607a092245SBram Moolenaar
14614a8d9f2eSBram Moolenaar  exe "echo" # comment
14624a8d9f2eSBram Moolenaar  CheckDefFailure([
14634a8d9f2eSBram Moolenaar      'exe "echo"# comment',
14644a8d9f2eSBram Moolenaar      ], 'E488:')
14654a8d9f2eSBram Moolenaar  CheckScriptSuccess([
14664a8d9f2eSBram Moolenaar      'vim9script',
14674a8d9f2eSBram Moolenaar      'exe "echo" # something',
14684a8d9f2eSBram Moolenaar      ])
14694a8d9f2eSBram Moolenaar  CheckScriptFailure([
14704a8d9f2eSBram Moolenaar      'vim9script',
14714a8d9f2eSBram Moolenaar      'exe "echo"# something',
14724a8d9f2eSBram Moolenaar      ], 'E121:')
14734a8d9f2eSBram Moolenaar  CheckDefFailure([
14744a8d9f2eSBram Moolenaar      'exe # comment',
14754a8d9f2eSBram Moolenaar      ], 'E1015:')
14764a8d9f2eSBram Moolenaar  CheckScriptFailure([
14774a8d9f2eSBram Moolenaar      'vim9script',
14784a8d9f2eSBram Moolenaar      'exe# something',
14794a8d9f2eSBram Moolenaar      ], 'E121:')
14804a8d9f2eSBram Moolenaar  CheckScriptFailure([
14814a8d9f2eSBram Moolenaar      'exe "echo" # something',
14824a8d9f2eSBram Moolenaar      ], 'E121:')
14834a8d9f2eSBram Moolenaar
14847a092245SBram Moolenaar  CheckDefFailure([
14857a092245SBram Moolenaar      'try# comment',
14867a092245SBram Moolenaar      '  echo "yes"',
14877a092245SBram Moolenaar      'catch',
14887a092245SBram Moolenaar      'endtry',
14897a092245SBram Moolenaar      ], 'E488:')
14902c5ed4e3SBram Moolenaar  CheckScriptFailure([
14912c5ed4e3SBram Moolenaar      'vim9script',
14922c5ed4e3SBram Moolenaar      'try# comment',
14932c5ed4e3SBram Moolenaar      'echo "yes"',
14942c5ed4e3SBram Moolenaar      ], 'E488:')
14957a092245SBram Moolenaar  CheckDefFailure([
14967a092245SBram Moolenaar      'try',
1497a72cfb80SBram Moolenaar      '  throw#comment',
1498a72cfb80SBram Moolenaar      'catch',
1499a72cfb80SBram Moolenaar      'endtry',
1500a72cfb80SBram Moolenaar      ], 'E1015:')
1501a72cfb80SBram Moolenaar  CheckDefFailure([
1502a72cfb80SBram Moolenaar      'try',
1503a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1504a72cfb80SBram Moolenaar      'catch',
1505a72cfb80SBram Moolenaar      'endtry',
1506a72cfb80SBram Moolenaar      ], 'E488:')
1507a72cfb80SBram Moolenaar  CheckDefFailure([
1508a72cfb80SBram Moolenaar      'try',
15097a092245SBram Moolenaar      '  echo "yes"',
15107a092245SBram Moolenaar      'catch# comment',
15117a092245SBram Moolenaar      'endtry',
15127a092245SBram Moolenaar      ], 'E488:')
15132c5ed4e3SBram Moolenaar  CheckScriptFailure([
15142c5ed4e3SBram Moolenaar      'vim9script',
15152c5ed4e3SBram Moolenaar      'try',
15162c5ed4e3SBram Moolenaar      '  echo "yes"',
15172c5ed4e3SBram Moolenaar      'catch# comment',
15182c5ed4e3SBram Moolenaar      'endtry',
15192c5ed4e3SBram Moolenaar      ], 'E654:')
15202c5ed4e3SBram Moolenaar  CheckDefFailure([
15212c5ed4e3SBram Moolenaar      'try',
15222c5ed4e3SBram Moolenaar      '  echo "yes"',
15232c5ed4e3SBram Moolenaar      'catch /pat/# comment',
15242c5ed4e3SBram Moolenaar      'endtry',
15252c5ed4e3SBram Moolenaar      ], 'E488:')
15267a092245SBram Moolenaar  CheckDefFailure([
15277a092245SBram Moolenaar      'try',
15287a092245SBram Moolenaar      'echo "yes"',
15297a092245SBram Moolenaar      'catch',
15307a092245SBram Moolenaar      'endtry# comment',
15317a092245SBram Moolenaar      ], 'E488:')
15322c5ed4e3SBram Moolenaar  CheckScriptFailure([
15332c5ed4e3SBram Moolenaar      'vim9script',
15342c5ed4e3SBram Moolenaar      'try',
15352c5ed4e3SBram Moolenaar      '  echo "yes"',
15362c5ed4e3SBram Moolenaar      'catch',
15372c5ed4e3SBram Moolenaar      'endtry# comment',
15382c5ed4e3SBram Moolenaar      ], 'E600:')
15392c5ed4e3SBram Moolenaar
15402c5ed4e3SBram Moolenaar  CheckScriptSuccess([
15412c5ed4e3SBram Moolenaar      'vim9script',
15422c5ed4e3SBram Moolenaar      'hi # comment',
15432c5ed4e3SBram Moolenaar      ])
15442c5ed4e3SBram Moolenaar  CheckScriptFailure([
15452c5ed4e3SBram Moolenaar      'vim9script',
15462c5ed4e3SBram Moolenaar      'hi# comment',
15472c5ed4e3SBram Moolenaar      ], 'E416:')
15481966c248SBram Moolenaar  CheckScriptSuccess([
15491966c248SBram Moolenaar      'vim9script',
15501966c248SBram Moolenaar      'hi Search # comment',
15511966c248SBram Moolenaar      ])
15521966c248SBram Moolenaar  CheckScriptFailure([
15531966c248SBram Moolenaar      'vim9script',
15541966c248SBram Moolenaar      'hi Search# comment',
15551966c248SBram Moolenaar      ], 'E416:')
15561966c248SBram Moolenaar  CheckScriptSuccess([
15571966c248SBram Moolenaar      'vim9script',
15581966c248SBram Moolenaar      'hi link This Search # comment',
15591966c248SBram Moolenaar      ])
15601966c248SBram Moolenaar  CheckScriptFailure([
15611966c248SBram Moolenaar      'vim9script',
15621966c248SBram Moolenaar      'hi link This That# comment',
15631966c248SBram Moolenaar      ], 'E413:')
15641966c248SBram Moolenaar  CheckScriptSuccess([
15651966c248SBram Moolenaar      'vim9script',
15661966c248SBram Moolenaar      'hi clear This # comment',
15671966c248SBram Moolenaar      'hi clear # comment',
15681966c248SBram Moolenaar      ])
15691966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
15701966c248SBram Moolenaar  " hi clear This# comment',
15711966c248SBram Moolenaar  CheckScriptFailure([
15721966c248SBram Moolenaar      'vim9script',
15731966c248SBram Moolenaar      'hi clear# comment',
15741966c248SBram Moolenaar      ], 'E416:')
15751966c248SBram Moolenaar
15761966c248SBram Moolenaar  CheckScriptSuccess([
15771966c248SBram Moolenaar      'vim9script',
15781966c248SBram Moolenaar      'hi Group term=bold',
15791966c248SBram Moolenaar      'match Group /todo/ # comment',
15801966c248SBram Moolenaar      ])
15811966c248SBram Moolenaar  CheckScriptFailure([
15821966c248SBram Moolenaar      'vim9script',
15831966c248SBram Moolenaar      'hi Group term=bold',
15841966c248SBram Moolenaar      'match Group /todo/# comment',
15851966c248SBram Moolenaar      ], 'E488:')
15861966c248SBram Moolenaar  CheckScriptSuccess([
15871966c248SBram Moolenaar      'vim9script',
15881966c248SBram Moolenaar      'match # comment',
15891966c248SBram Moolenaar      ])
15901966c248SBram Moolenaar  CheckScriptFailure([
15911966c248SBram Moolenaar      'vim9script',
15921966c248SBram Moolenaar      'match# comment',
15931966c248SBram Moolenaar      ], 'E475:')
15941966c248SBram Moolenaar  CheckScriptSuccess([
15951966c248SBram Moolenaar      'vim9script',
15961966c248SBram Moolenaar      'match none # comment',
15971966c248SBram Moolenaar      ])
15981966c248SBram Moolenaar  CheckScriptFailure([
15991966c248SBram Moolenaar      'vim9script',
16001966c248SBram Moolenaar      'match none# comment',
16011966c248SBram Moolenaar      ], 'E475:')
16021966c248SBram Moolenaar
16031966c248SBram Moolenaar  CheckScriptSuccess([
16041966c248SBram Moolenaar      'vim9script',
16051966c248SBram Moolenaar      'menutrans clear # comment',
16061966c248SBram Moolenaar      ])
16071966c248SBram Moolenaar  CheckScriptFailure([
16081966c248SBram Moolenaar      'vim9script',
16091966c248SBram Moolenaar      'menutrans clear# comment text',
16101966c248SBram Moolenaar      ], 'E474:')
16111966c248SBram Moolenaar
16121966c248SBram Moolenaar  CheckScriptSuccess([
16131966c248SBram Moolenaar      'vim9script',
16141966c248SBram Moolenaar      'syntax clear # comment',
16151966c248SBram Moolenaar      ])
16161966c248SBram Moolenaar  CheckScriptFailure([
16171966c248SBram Moolenaar      'vim9script',
16181966c248SBram Moolenaar      'syntax clear# comment text',
16191966c248SBram Moolenaar      ], 'E28:')
16201966c248SBram Moolenaar  CheckScriptSuccess([
16211966c248SBram Moolenaar      'vim9script',
16221966c248SBram Moolenaar      'syntax keyword Word some',
16231966c248SBram Moolenaar      'syntax clear Word # comment',
16241966c248SBram Moolenaar      ])
16251966c248SBram Moolenaar  CheckScriptFailure([
16261966c248SBram Moolenaar      'vim9script',
16271966c248SBram Moolenaar      'syntax keyword Word some',
16281966c248SBram Moolenaar      'syntax clear Word# comment text',
16291966c248SBram Moolenaar      ], 'E28:')
16301966c248SBram Moolenaar
16311966c248SBram Moolenaar  CheckScriptSuccess([
16321966c248SBram Moolenaar      'vim9script',
16331966c248SBram Moolenaar      'syntax list # comment',
16341966c248SBram Moolenaar      ])
16351966c248SBram Moolenaar  CheckScriptFailure([
16361966c248SBram Moolenaar      'vim9script',
16371966c248SBram Moolenaar      'syntax list# comment text',
16381966c248SBram Moolenaar      ], 'E28:')
16391966c248SBram Moolenaar
16401966c248SBram Moolenaar  CheckScriptSuccess([
16411966c248SBram Moolenaar      'vim9script',
16421966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
16431966c248SBram Moolenaar      ])
16441966c248SBram Moolenaar  CheckScriptFailure([
16451966c248SBram Moolenaar      'vim9script',
16461966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
16471966c248SBram Moolenaar      ], 'E475:')
16481966c248SBram Moolenaar
16491966c248SBram Moolenaar  CheckScriptSuccess([
16501966c248SBram Moolenaar      'vim9script',
16511966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
16521966c248SBram Moolenaar      ])
16531966c248SBram Moolenaar  CheckScriptFailure([
16541966c248SBram Moolenaar      'vim9script',
16551966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
16561966c248SBram Moolenaar      ], 'E789:')
16571966c248SBram Moolenaar
16581966c248SBram Moolenaar  CheckScriptSuccess([
16591966c248SBram Moolenaar      'vim9script',
16601966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
16611966c248SBram Moolenaar      ])
16621966c248SBram Moolenaar  CheckScriptFailure([
16631966c248SBram Moolenaar      'vim9script',
16641966c248SBram Moolenaar      'syntax match Word /pat/# comment',
16651966c248SBram Moolenaar      ], 'E402:')
16661966c248SBram Moolenaar
16671966c248SBram Moolenaar  CheckScriptSuccess([
16681966c248SBram Moolenaar      'vim9script',
16691966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
16701966c248SBram Moolenaar      ])
16711966c248SBram Moolenaar  CheckScriptFailure([
16721966c248SBram Moolenaar      'vim9script',
16731966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
16741966c248SBram Moolenaar      ], 'E475:')
16751966c248SBram Moolenaar  CheckScriptFailure([
16761966c248SBram Moolenaar      'vim9script',
16771966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
16781966c248SBram Moolenaar      ], 'E406:')
16791966c248SBram Moolenaar  CheckScriptFailure([
16801966c248SBram Moolenaar      'vim9script',
16811966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
16821966c248SBram Moolenaar      ], 'E475:')
16831966c248SBram Moolenaar
16841966c248SBram Moolenaar  CheckScriptSuccess([
16851966c248SBram Moolenaar      'vim9script',
16861966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
16871966c248SBram Moolenaar      ])
16881966c248SBram Moolenaar  CheckScriptFailure([
16891966c248SBram Moolenaar      'vim9script',
16901966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
16911966c248SBram Moolenaar      ], 'E475:')
16921966c248SBram Moolenaar
16931966c248SBram Moolenaar  CheckScriptSuccess([
16941966c248SBram Moolenaar      'vim9script',
16951966c248SBram Moolenaar      'syntax sync # comment',
16961966c248SBram Moolenaar      ])
16971966c248SBram Moolenaar  CheckScriptFailure([
16981966c248SBram Moolenaar      'vim9script',
16991966c248SBram Moolenaar      'syntax sync# comment',
17001966c248SBram Moolenaar      ], 'E404:')
17011966c248SBram Moolenaar  CheckScriptSuccess([
17021966c248SBram Moolenaar      'vim9script',
17031966c248SBram Moolenaar      'syntax sync ccomment # comment',
17041966c248SBram Moolenaar      ])
17051966c248SBram Moolenaar  CheckScriptFailure([
17061966c248SBram Moolenaar      'vim9script',
17071966c248SBram Moolenaar      'syntax sync ccomment# comment',
17081966c248SBram Moolenaar      ], 'E404:')
17091966c248SBram Moolenaar
17101966c248SBram Moolenaar  CheckScriptSuccess([
17111966c248SBram Moolenaar      'vim9script',
17121966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
17131966c248SBram Moolenaar      ])
17141966c248SBram Moolenaar  CheckScriptFailure([
17151966c248SBram Moolenaar      'vim9script',
17161966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
17171966c248SBram Moolenaar      ], 'E475:')
1718a72cfb80SBram Moolenaar
1719a72cfb80SBram Moolenaar  CheckScriptSuccess([
1720a72cfb80SBram Moolenaar      'vim9script',
1721a72cfb80SBram Moolenaar      'command Echo echo # comment',
1722a72cfb80SBram Moolenaar      'command Echo # comment',
1723a72cfb80SBram Moolenaar      ])
1724a72cfb80SBram Moolenaar  CheckScriptFailure([
1725a72cfb80SBram Moolenaar      'vim9script',
1726a72cfb80SBram Moolenaar      'command Echo echo# comment',
1727a72cfb80SBram Moolenaar      'Echo',
1728a72cfb80SBram Moolenaar      ], 'E121:')
1729a72cfb80SBram Moolenaar  CheckScriptFailure([
1730a72cfb80SBram Moolenaar      'vim9script',
1731a72cfb80SBram Moolenaar      'command Echo# comment',
1732a72cfb80SBram Moolenaar      ], 'E182:')
1733a72cfb80SBram Moolenaar  CheckScriptFailure([
1734a72cfb80SBram Moolenaar      'vim9script',
1735a72cfb80SBram Moolenaar      'command Echo echo',
1736a72cfb80SBram Moolenaar      'command Echo# comment',
1737a72cfb80SBram Moolenaar      ], 'E182:')
1738a72cfb80SBram Moolenaar
1739a72cfb80SBram Moolenaar  CheckScriptSuccess([
1740a72cfb80SBram Moolenaar      'vim9script',
1741a72cfb80SBram Moolenaar      'function # comment',
1742a72cfb80SBram Moolenaar      ])
1743a72cfb80SBram Moolenaar  CheckScriptFailure([
1744a72cfb80SBram Moolenaar      'vim9script',
1745a72cfb80SBram Moolenaar      'function# comment',
1746a72cfb80SBram Moolenaar      ], 'E129:')
1747a72cfb80SBram Moolenaar  CheckScriptSuccess([
1748a72cfb80SBram Moolenaar      'vim9script',
1749a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1750a72cfb80SBram Moolenaar      ])
1751a72cfb80SBram Moolenaar  CheckScriptFailure([
1752a72cfb80SBram Moolenaar      'vim9script',
1753a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1754a72cfb80SBram Moolenaar      ], 'E488:')
1755a72cfb80SBram Moolenaar
1756a72cfb80SBram Moolenaar  CheckScriptSuccess([
1757a72cfb80SBram Moolenaar      'vim9script',
17584c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1759a72cfb80SBram Moolenaar      'endfunc',
17604c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1761a72cfb80SBram Moolenaar      ])
1762a72cfb80SBram Moolenaar  CheckScriptFailure([
1763a72cfb80SBram Moolenaar      'vim9script',
17644c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1765a72cfb80SBram Moolenaar      'endfunc',
17664c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1767a72cfb80SBram Moolenaar      ], 'E488:')
1768a72cfb80SBram Moolenaar
1769a72cfb80SBram Moolenaar  CheckScriptSuccess([
1770a72cfb80SBram Moolenaar      'vim9script',
1771a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1772a72cfb80SBram Moolenaar      ])
1773a72cfb80SBram Moolenaar  CheckScriptFailure([
1774a72cfb80SBram Moolenaar      'vim9script',
1775a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1776a72cfb80SBram Moolenaar      ], 'E488:')
17772c5ed4e3SBram Moolenaarenddef
17782c5ed4e3SBram Moolenaar
17792c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
17802c5ed4e3SBram Moolenaar  CheckCanRunGui
17812c5ed4e3SBram Moolenaar
17822c5ed4e3SBram Moolenaar  CheckScriptFailure([
17832c5ed4e3SBram Moolenaar      'vim9script',
17842c5ed4e3SBram Moolenaar      'gui#comment'
17852c5ed4e3SBram Moolenaar      ], 'E499:')
17862c5ed4e3SBram Moolenaar  CheckScriptFailure([
17872c5ed4e3SBram Moolenaar      'vim9script',
17882c5ed4e3SBram Moolenaar      'gui -f#comment'
17892c5ed4e3SBram Moolenaar      ], 'E499:')
17907a092245SBram Moolenaarenddef
17917a092245SBram Moolenaar
1792a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1793*6797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
1794*6797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
1795a26b9700SBram Moolenaar
1796a26b9700SBram Moolenaar  edit test.vim
1797a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1798a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1799a26b9700SBram Moolenaar
1800a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1801a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1802a26b9700SBram Moolenaar
1803a26b9700SBram Moolenaar  g:entered = 0
1804a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1805a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1806a26b9700SBram Moolenaar
1807a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1808a26b9700SBram Moolenaar
1809a26b9700SBram Moolenaar  au! TabEnter
1810a26b9700SBram Moolenaar  unlet g:entered
1811d72c1bf0SBram Moolenaar
1812d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1813d72c1bf0SBram Moolenaar      'vim9script',
1814*6797966dSBram Moolenaar      'g:var = 123',
1815d72c1bf0SBram Moolenaar      'let w:var = 777',
1816d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1817d72c1bf0SBram Moolenaar      ])
1818d72c1bf0SBram Moolenaar
1819d72c1bf0SBram Moolenaar  CheckScriptFailure([
1820d72c1bf0SBram Moolenaar      'vim9script',
1821d72c1bf0SBram Moolenaar      'let g:var = 123',
1822*6797966dSBram Moolenaar      ], 'E1016:')
1823*6797966dSBram Moolenaar
1824*6797966dSBram Moolenaar  CheckScriptFailure([
1825*6797966dSBram Moolenaar      'vim9script',
1826*6797966dSBram Moolenaar      'g:var = 123',
182732e35117SBram Moolenaar      'unlet g:var# comment1',
1828d72c1bf0SBram Moolenaar      ], 'E108:')
1829d72c1bf0SBram Moolenaar
1830d72c1bf0SBram Moolenaar  CheckScriptFailure([
1831d72c1bf0SBram Moolenaar      'let g:var = 123',
1832d72c1bf0SBram Moolenaar      'unlet g:var # something',
1833d72c1bf0SBram Moolenaar      ], 'E488:')
1834faac4104SBram Moolenaar
1835faac4104SBram Moolenaar  CheckScriptSuccess([
1836faac4104SBram Moolenaar      'vim9script',
183732e35117SBram Moolenaar      'if 1 # comment2',
1838faac4104SBram Moolenaar      '  echo "yes"',
1839faac4104SBram Moolenaar      'elseif 2 #comment',
1840faac4104SBram Moolenaar      '  echo "no"',
1841faac4104SBram Moolenaar      'endif',
1842faac4104SBram Moolenaar      ])
1843faac4104SBram Moolenaar
1844faac4104SBram Moolenaar  CheckScriptFailure([
1845faac4104SBram Moolenaar      'vim9script',
184632e35117SBram Moolenaar      'if 1# comment3',
1847faac4104SBram Moolenaar      '  echo "yes"',
1848faac4104SBram Moolenaar      'endif',
1849faac4104SBram Moolenaar      ], 'E15:')
1850faac4104SBram Moolenaar
1851faac4104SBram Moolenaar  CheckScriptFailure([
1852faac4104SBram Moolenaar      'vim9script',
185332e35117SBram Moolenaar      'if 0 # comment4',
1854faac4104SBram Moolenaar      '  echo "yes"',
1855faac4104SBram Moolenaar      'elseif 2#comment',
1856faac4104SBram Moolenaar      '  echo "no"',
1857faac4104SBram Moolenaar      'endif',
1858faac4104SBram Moolenaar      ], 'E15:')
1859faac4104SBram Moolenaar
1860faac4104SBram Moolenaar  CheckScriptSuccess([
1861faac4104SBram Moolenaar      'vim9script',
186232e35117SBram Moolenaar      'let v = 1 # comment5',
1863faac4104SBram Moolenaar      ])
1864faac4104SBram Moolenaar
1865faac4104SBram Moolenaar  CheckScriptFailure([
1866faac4104SBram Moolenaar      'vim9script',
186732e35117SBram Moolenaar      'let v = 1# comment6',
186832e35117SBram Moolenaar      ], 'E15:')
1869faac4104SBram Moolenaar
1870faac4104SBram Moolenaar  CheckScriptSuccess([
1871faac4104SBram Moolenaar      'vim9script',
1872faac4104SBram Moolenaar      'new'
1873faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1874faac4104SBram Moolenaar      '$',
1875faac4104SBram Moolenaar      'dsearch /pat/ #comment',
1876faac4104SBram Moolenaar      'bwipe!',
1877faac4104SBram Moolenaar      ])
1878faac4104SBram Moolenaar
1879faac4104SBram Moolenaar  CheckScriptFailure([
1880faac4104SBram Moolenaar      'vim9script',
1881faac4104SBram Moolenaar      'new'
1882faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1883faac4104SBram Moolenaar      '$',
1884faac4104SBram Moolenaar      'dsearch /pat/#comment',
1885faac4104SBram Moolenaar      'bwipe!',
1886faac4104SBram Moolenaar      ], 'E488:')
188774fae513SBram Moolenaar
188874fae513SBram Moolenaar  CheckScriptFailure([
188974fae513SBram Moolenaar      'vim9script',
189074fae513SBram Moolenaar      'func! SomeFunc()',
189174fae513SBram Moolenaar      ], 'E477:')
1892a26b9700SBram Moolenaarenddef
1893a26b9700SBram Moolenaar
18947e5bd91dSBram Moolenaardef Test_finish()
18957e5bd91dSBram Moolenaar  let lines =<< trim END
18967e5bd91dSBram Moolenaar    vim9script
1897*6797966dSBram Moolenaar    g:res = 'one'
18987e5bd91dSBram Moolenaar    if v:false | finish | endif
1899*6797966dSBram Moolenaar    g:res = 'two'
19007e5bd91dSBram Moolenaar    finish
1901*6797966dSBram Moolenaar    g:res = 'three'
19027e5bd91dSBram Moolenaar  END
19037e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
19047e5bd91dSBram Moolenaar  source Xfinished
19057e5bd91dSBram Moolenaar  assert_equal('two', g:res)
19067e5bd91dSBram Moolenaar
19077e5bd91dSBram Moolenaar  unlet g:res
19087e5bd91dSBram Moolenaar  delete('Xfinished')
19097e5bd91dSBram Moolenaarenddef
19107e5bd91dSBram Moolenaar
191132e35117SBram Moolenaardef Test_let_func_call()
191232e35117SBram Moolenaar  let lines =<< trim END
191332e35117SBram Moolenaar    vim9script
191432e35117SBram Moolenaar    func GetValue()
191532e35117SBram Moolenaar      if exists('g:count')
191632e35117SBram Moolenaar        let g:count += 1
191732e35117SBram Moolenaar      else
191832e35117SBram Moolenaar        let g:count = 1
191932e35117SBram Moolenaar      endif
192032e35117SBram Moolenaar      return 'this'
192132e35117SBram Moolenaar    endfunc
192232e35117SBram Moolenaar    let val: string = GetValue()
1923df671b46SBram Moolenaar    " env var is always a string
1924df671b46SBram Moolenaar    let env = $TERM
192532e35117SBram Moolenaar  END
192632e35117SBram Moolenaar  writefile(lines, 'Xfinished')
192732e35117SBram Moolenaar  source Xfinished
1928a5d0077eSBram Moolenaar  " GetValue() is not called during discovery phase
192932e35117SBram Moolenaar  assert_equal(1, g:count)
193032e35117SBram Moolenaar
193132e35117SBram Moolenaar  unlet g:count
193232e35117SBram Moolenaar  delete('Xfinished')
193332e35117SBram Moolenaarenddef
193432e35117SBram Moolenaar
193532e35117SBram Moolenaardef Test_let_missing_type()
193632e35117SBram Moolenaar  let lines =<< trim END
193732e35117SBram Moolenaar    vim9script
1938df671b46SBram Moolenaar    let var = g:unknown
1939227a69deSBram Moolenaar  END
1940822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
1941227a69deSBram Moolenaar
1942227a69deSBram Moolenaar  lines =<< trim END
1943227a69deSBram Moolenaar    vim9script
1944227a69deSBram Moolenaar    let nr: number = 123
1945227a69deSBram Moolenaar    let var = nr
1946227a69deSBram Moolenaar  END
1947822ba247SBram Moolenaar  CheckScriptSuccess(lines)
194832e35117SBram Moolenaarenddef
194932e35117SBram Moolenaar
1950c82a5b5dSBram Moolenaardef Test_let_declaration()
1951c82a5b5dSBram Moolenaar  let lines =<< trim END
1952c82a5b5dSBram Moolenaar    vim9script
1953c82a5b5dSBram Moolenaar    let var: string
1954c82a5b5dSBram Moolenaar    g:var_uninit = var
1955c82a5b5dSBram Moolenaar    var = 'text'
1956c82a5b5dSBram Moolenaar    g:var_test = var
1957984dddbeSBram Moolenaar    " prefixing s: is optional
1958984dddbeSBram Moolenaar    s:var = 'prefixed'
1959984dddbeSBram Moolenaar    g:var_prefixed = s:var
1960984dddbeSBram Moolenaar
1961984dddbeSBram Moolenaar    let s:other: number
1962984dddbeSBram Moolenaar    other = 1234
1963984dddbeSBram Moolenaar    g:other_var = other
1964c82a5b5dSBram Moolenaar  END
1965c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
1966c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
1967c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
1968984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
1969984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
1970c82a5b5dSBram Moolenaar
1971c82a5b5dSBram Moolenaar  unlet g:var_uninit
1972c82a5b5dSBram Moolenaar  unlet g:var_test
1973984dddbeSBram Moolenaar  unlet g:var_prefixed
1974984dddbeSBram Moolenaar  unlet g:other_var
1975c82a5b5dSBram Moolenaarenddef
1976c82a5b5dSBram Moolenaar
1977c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
1978c5b1c20bSBram Moolenaar  let lines =<< trim END
1979c5b1c20bSBram Moolenaar    vim9script
1980c5b1c20bSBram Moolenaar    const var: string
1981c5b1c20bSBram Moolenaar  END
1982c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
1983c5b1c20bSBram Moolenaar
1984c5b1c20bSBram Moolenaar  lines =<< trim END
1985c5b1c20bSBram Moolenaar    vim9script
1986c5b1c20bSBram Moolenaar    let 9var: string
1987c5b1c20bSBram Moolenaar  END
1988c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
1989c5b1c20bSBram Moolenaarenddef
1990c5b1c20bSBram Moolenaar
199134db91f7SBram Moolenaardef Test_let_type_check()
199234db91f7SBram Moolenaar  let lines =<< trim END
199334db91f7SBram Moolenaar    vim9script
199434db91f7SBram Moolenaar    let var: string
199534db91f7SBram Moolenaar    var = 1234
199634db91f7SBram Moolenaar  END
199734db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
1998984dddbeSBram Moolenaar
1999984dddbeSBram Moolenaar  lines =<< trim END
2000984dddbeSBram Moolenaar    vim9script
2001984dddbeSBram Moolenaar    let var:string
2002984dddbeSBram Moolenaar  END
2003984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2004c5b1c20bSBram Moolenaar
2005c5b1c20bSBram Moolenaar  lines =<< trim END
2006c5b1c20bSBram Moolenaar    vim9script
2007c5b1c20bSBram Moolenaar    let var: asdf
2008c5b1c20bSBram Moolenaar  END
2009c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
201034db91f7SBram Moolenaarenddef
201134db91f7SBram Moolenaar
2012a5d0077eSBram Moolenaardef Test_forward_declaration()
2013a5d0077eSBram Moolenaar  let lines =<< trim END
2014a5d0077eSBram Moolenaar    vim9script
2015a5d0077eSBram Moolenaar    def GetValue(): string
2016a5d0077eSBram Moolenaar      return theVal
2017a5d0077eSBram Moolenaar    enddef
2018a5d0077eSBram Moolenaar    let theVal = 'something'
2019822ba247SBram Moolenaar    g:initVal = GetValue()
2020a5d0077eSBram Moolenaar    theVal = 'else'
2021a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2022a5d0077eSBram Moolenaar  END
2023a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2024a5d0077eSBram Moolenaar  source Xforward
2025a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2026a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2027a5d0077eSBram Moolenaar
2028a5d0077eSBram Moolenaar  unlet g:initVal
2029a5d0077eSBram Moolenaar  unlet g:laterVal
2030a5d0077eSBram Moolenaar  delete('Xforward')
2031a5d0077eSBram Moolenaarenddef
2032a5d0077eSBram Moolenaar
20339721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
20349721fb4eSBram Moolenaar  let legacy_lines =<< trim END
20359721fb4eSBram Moolenaar    source Xvim9_script.vim
20369721fb4eSBram Moolenaar
20379721fb4eSBram Moolenaar    call assert_false(exists('local'))
20389721fb4eSBram Moolenaar    call assert_false(exists('exported'))
20399721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
20409721fb4eSBram Moolenaar    call assert_equal('global', global)
20419721fb4eSBram Moolenaar    call assert_equal('global', g:global)
20429721fb4eSBram Moolenaar
20439721fb4eSBram Moolenaar    " imported variable becomes script-local
20449721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
20459721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
20469721fb4eSBram Moolenaar    call assert_false(exists('exported'))
20479721fb4eSBram Moolenaar
20489721fb4eSBram Moolenaar    " imported function becomes script-local
20499721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
20509721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
20519721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
20529721fb4eSBram Moolenaar  END
20539721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
20549721fb4eSBram Moolenaar
20559721fb4eSBram Moolenaar  let vim9_lines =<< trim END
20569721fb4eSBram Moolenaar    vim9script
20579721fb4eSBram Moolenaar    let local = 'local'
20589721fb4eSBram Moolenaar    g:global = 'global'
20599721fb4eSBram Moolenaar    export let exported = 'exported'
20609721fb4eSBram Moolenaar    export def GetText(): string
20619721fb4eSBram Moolenaar       return 'text'
20629721fb4eSBram Moolenaar    enddef
20639721fb4eSBram Moolenaar  END
20649721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
20659721fb4eSBram Moolenaar
20669721fb4eSBram Moolenaar  source Xlegacy_script.vim
20679721fb4eSBram Moolenaar
20689721fb4eSBram Moolenaar  assert_equal('global', g:global)
20699721fb4eSBram Moolenaar"  unlet g:global
20709721fb4eSBram Moolenaar
20719721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
20729721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
20739721fb4eSBram Moolenaarenddef
2074a5d0077eSBram Moolenaar
2075585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2076585fea7bSBram Moolenaardef Test_substitute_cmd()
2077585fea7bSBram Moolenaar  new
2078585fea7bSBram Moolenaar  setline(1, 'something')
2079585fea7bSBram Moolenaar  :substitute(some(other(
2080585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2081585fea7bSBram Moolenaar  bwipe!
2082585fea7bSBram Moolenaar
2083585fea7bSBram Moolenaar  " also when the context is Vim9 script
2084585fea7bSBram Moolenaar  let lines =<< trim END
2085585fea7bSBram Moolenaar    vim9script
2086585fea7bSBram Moolenaar    new
2087585fea7bSBram Moolenaar    setline(1, 'something')
2088585fea7bSBram Moolenaar    :substitute(some(other(
2089585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2090585fea7bSBram Moolenaar    bwipe!
2091585fea7bSBram Moolenaar  END
2092585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2093585fea7bSBram Moolenaar  source Xvim9lines
2094585fea7bSBram Moolenaar
2095585fea7bSBram Moolenaar  delete('Xvim9lines')
2096585fea7bSBram Moolenaarenddef
2097585fea7bSBram Moolenaar
20988a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2099