18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5cfe435d7SBram Moolenaarsource vim9.vim
68a7d6542SBram Moolenaar
78a7d6542SBram Moolenaardef Test_syntax()
88a7d6542SBram Moolenaar  let var = 234
98a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
108a7d6542SBram Moolenaarenddef
118a7d6542SBram Moolenaar
126e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
136e587dcbSBram Moolenaarlet s:addToMe = 111
14401d9ffbSBram Moolenaarlet g:existing = 'yes'
15a8c17704SBram Moolenaarlet g:inc_counter = 1
16a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
17a6e67e4fSBram Moolenaarlet g:alist = [7]
18a6e67e4fSBram Moolenaarlet g:astring = 'text'
196e587dcbSBram Moolenaar
208a7d6542SBram Moolenaardef Test_assignment()
218a7d6542SBram Moolenaar  let bool1: bool = true
228a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
238a7d6542SBram Moolenaar  let bool2: bool = false
248a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
258a7d6542SBram Moolenaar
26f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
27f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
281cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
29f93c7feaSBram Moolenaar
309be61bbbSBram Moolenaar  let a: number = 6
319be61bbbSBram Moolenaar  assert_equal(6, a)
329be61bbbSBram Moolenaar
3342a480bfSBram Moolenaar  if has('channel')
3442a480bfSBram Moolenaar    let chan1: channel
35fbdd08edSBram Moolenaar    let job1: job
36f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
3742a480bfSBram Moolenaar  endif
38fbdd08edSBram Moolenaar  if has('float')
39fbdd08edSBram Moolenaar    let float1: float = 3.4
40fbdd08edSBram Moolenaar  endif
415deeb3f1SBram Moolenaar  let Funky1: func
425deeb3f1SBram Moolenaar  let Funky2: func = function('len')
434c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4442a480bfSBram Moolenaar
45401d9ffbSBram Moolenaar  g:newvar = 'new'
46401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
47401d9ffbSBram Moolenaar
48401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
49401d9ffbSBram Moolenaar  g:existing = 'no'
50401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
51401d9ffbSBram Moolenaar
52b283a8a6SBram Moolenaar  v:char = 'abc'
536e587dcbSBram Moolenaar  assert_equal('abc', v:char)
54b283a8a6SBram Moolenaar
55b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
566e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
57b283a8a6SBram Moolenaar  $ENVVAR = ''
586e587dcbSBram Moolenaar
59fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
60fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
61fd1823e0SBram Moolenaar  s:addToMe += 222
62fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
630bbf722aSBram Moolenaar  s:newVar = 'new'
640bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
65a8c17704SBram Moolenaar
66a8c17704SBram Moolenaar  set ts=7
67a8c17704SBram Moolenaar  &ts += 1
68a8c17704SBram Moolenaar  assert_equal(8, &ts)
6980c34ca3SBram Moolenaar  &ts -= 3
7080c34ca3SBram Moolenaar  assert_equal(5, &ts)
7180c34ca3SBram Moolenaar  &ts *= 2
7280c34ca3SBram Moolenaar  assert_equal(10, &ts)
7380c34ca3SBram Moolenaar  &ts /= 3
7480c34ca3SBram Moolenaar  assert_equal(3, &ts)
7580c34ca3SBram Moolenaar  set ts=10
7680c34ca3SBram Moolenaar  &ts %= 4
7780c34ca3SBram Moolenaar  assert_equal(2, &ts)
78a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
79a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
80a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
81a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
82a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
83a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
84a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
85a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
86cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
87585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
8880c34ca3SBram Moolenaar  &ts = 8
89a8c17704SBram Moolenaar
90a8c17704SBram Moolenaar  g:inc_counter += 1
91a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
92a8c17704SBram Moolenaar
93a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
94a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
95a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
96a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
97a8c17704SBram Moolenaar
98a8c17704SBram Moolenaar  @a = 'areg'
99a8c17704SBram Moolenaar  @a ..= 'add'
100a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
101a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
102a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
103e69f6d04SBram Moolenaar
104e69f6d04SBram Moolenaar  v:errmsg = 'none'
105e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
106e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
107e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
108e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1095deeb3f1SBram Moolenaarenddef
1105deeb3f1SBram Moolenaar
11184370087SBram Moolenaardef Test_assignment_list()
11284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
11384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
11484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
11584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
11684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
11784370087SBram Moolenaar
11884370087SBram Moolenaar  let listS: list<string> = []
11984370087SBram Moolenaar  let listN: list<number> = []
12084370087SBram Moolenaar
12184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
12284370087SBram Moolenaar  list2[-1] = 99
12384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
12484370087SBram Moolenaar  list2[-2] = 88
12584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
12684370087SBram Moolenaar  list2[-3] = 77
12784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
12884370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
12984370087SBram Moolenaar
13084370087SBram Moolenaar  # type becomes list<any>
13184370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
13284370087SBram Moolenaarenddef
13384370087SBram Moolenaar
13484370087SBram Moolenaardef Test_assignment_dict()
13584370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
13684370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
13784370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
13884370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
13974fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
14084370087SBram Moolenaar
14184370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
14284370087SBram Moolenaar
14384370087SBram Moolenaar  # type becomes dict<any>
14484370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
14584370087SBram Moolenaarenddef
14684370087SBram Moolenaar
147d3aac291SBram Moolenaardef Test_assignment_local()
148d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
149d3aac291SBram Moolenaar  " changed.
150d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
151d3aac291SBram Moolenaar    let b:existing = 'yes'
152d3aac291SBram Moolenaar    let w:existing = 'yes'
153d3aac291SBram Moolenaar    let t:existing = 'yes'
154d3aac291SBram Moolenaar
155d3aac291SBram Moolenaar    def Test_assignment_local_internal()
156d3aac291SBram Moolenaar      b:newvar = 'new'
157d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
158d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
159d3aac291SBram Moolenaar      b:existing = 'no'
160d3aac291SBram Moolenaar      assert_equal('no', b:existing)
161396f3138SBram Moolenaar      b:existing ..= 'NO'
162396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
163d3aac291SBram Moolenaar
164d3aac291SBram Moolenaar      w:newvar = 'new'
165d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
166d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
167d3aac291SBram Moolenaar      w:existing = 'no'
168d3aac291SBram Moolenaar      assert_equal('no', w:existing)
169396f3138SBram Moolenaar      w:existing ..= 'NO'
170396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
171d3aac291SBram Moolenaar
172d3aac291SBram Moolenaar      t:newvar = 'new'
173d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
174d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
175d3aac291SBram Moolenaar      t:existing = 'no'
176d3aac291SBram Moolenaar      assert_equal('no', t:existing)
177396f3138SBram Moolenaar      t:existing ..= 'NO'
178396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
179d3aac291SBram Moolenaar    enddef
180d3aac291SBram Moolenaar    call Test_assignment_local_internal()
181d3aac291SBram Moolenaar  END
182d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
183d3aac291SBram Moolenaarenddef
184d3aac291SBram Moolenaar
1855deeb3f1SBram Moolenaardef Test_assignment_default()
186e69f6d04SBram Moolenaar
187cb711abfSBram Moolenaar  # Test default values.
188e69f6d04SBram Moolenaar  let thebool: bool
189e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
190e69f6d04SBram Moolenaar
191e69f6d04SBram Moolenaar  let thenumber: number
192e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
193e69f6d04SBram Moolenaar
194e69f6d04SBram Moolenaar  if has('float')
195e69f6d04SBram Moolenaar    let thefloat: float
196e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
197e69f6d04SBram Moolenaar  endif
198e69f6d04SBram Moolenaar
199e69f6d04SBram Moolenaar  let thestring: string
200e69f6d04SBram Moolenaar  assert_equal('', thestring)
201e69f6d04SBram Moolenaar
202e69f6d04SBram Moolenaar  let theblob: blob
203e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
204e69f6d04SBram Moolenaar
2055deeb3f1SBram Moolenaar  let Thefunc: func
2065deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
207e69f6d04SBram Moolenaar
208e69f6d04SBram Moolenaar  let thelist: list<any>
209e69f6d04SBram Moolenaar  assert_equal([], thelist)
210e69f6d04SBram Moolenaar
211e69f6d04SBram Moolenaar  let thedict: dict<any>
212e69f6d04SBram Moolenaar  assert_equal({}, thedict)
213e69f6d04SBram Moolenaar
2142c869deeSBram Moolenaar  if has('channel')
215e69f6d04SBram Moolenaar    let thejob: job
216e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
217e69f6d04SBram Moolenaar
218e69f6d04SBram Moolenaar    let thechannel: channel
219e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
2202c869deeSBram Moolenaar  endif
221585fea7bSBram Moolenaar
222585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
223585fea7bSBram Moolenaar  assert_equal(5678, nr)
2248a7d6542SBram Moolenaarenddef
2258a7d6542SBram Moolenaar
22647a519a9SBram Moolenaardef Test_assignment_var_list()
22747a519a9SBram Moolenaar  let v1: string
22847a519a9SBram Moolenaar  let v2: string
229*9af78769SBram Moolenaar  let vrem: list<string>
230*9af78769SBram Moolenaar  [v1] = ['aaa']
231*9af78769SBram Moolenaar  assert_equal('aaa', v1)
232*9af78769SBram Moolenaar
23347a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
23447a519a9SBram Moolenaar  assert_equal('one', v1)
23547a519a9SBram Moolenaar  assert_equal('two', v2)
236*9af78769SBram Moolenaar
237*9af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
238*9af78769SBram Moolenaar  assert_equal('one', v1)
239*9af78769SBram Moolenaar  assert_equal('two', v2)
240*9af78769SBram Moolenaar  assert_equal([], vrem)
241*9af78769SBram Moolenaar
242*9af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
243*9af78769SBram Moolenaar  assert_equal('one', v1)
244*9af78769SBram Moolenaar  assert_equal('two', v2)
245*9af78769SBram Moolenaar  assert_equal(['three'], vrem)
24647a519a9SBram Moolenaarenddef
24747a519a9SBram Moolenaar
248cab27678SBram Moolenaardef Mess(): string
249cab27678SBram Moolenaar  v:foldstart = 123
250cab27678SBram Moolenaar  return 'xxx'
251cab27678SBram Moolenaarenddef
252cab27678SBram Moolenaar
253d72c1bf0SBram Moolenaardef Test_assignment_failure()
2548a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
2558a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
2568a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
2578a7d6542SBram Moolenaar
2588a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
2598a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
2608a7d6542SBram Moolenaar
261*9af78769SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
262*9af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
263*9af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
264*9af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
265*9af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
266*9af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
267*9af78769SBram Moolenaar                            'let y: number',
268*9af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
269*9af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
270*9af78769SBram Moolenaar                            'let y: number',
271*9af78769SBram Moolenaar                            'let z: list<number>',
272*9af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
2739be61bbbSBram Moolenaar
274e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
2759be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
2769be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
2779be61bbbSBram Moolenaar
2789be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
2799be61bbbSBram Moolenaar
2809be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
2819be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
2829be61bbbSBram Moolenaar
2839be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
284d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
285d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
286d3aac291SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1080:')
2879be61bbbSBram Moolenaar
2889be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2899be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2909be61bbbSBram Moolenaar
291822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
29233fa29cfSBram Moolenaar
2938a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2948a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2958a7d6542SBram Moolenaar
2968a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2978a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2988a7d6542SBram Moolenaar
2998a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
3008a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
30142a480bfSBram Moolenaar
302d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
30342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
304cab27678SBram Moolenaar
305cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
306cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
307d72c1bf0SBram Moolenaarenddef
308d72c1bf0SBram Moolenaar
309d72c1bf0SBram Moolenaardef Test_unlet()
310d72c1bf0SBram Moolenaar  g:somevar = 'yes'
311d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
312d72c1bf0SBram Moolenaar  unlet g:somevar
313d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
314d72c1bf0SBram Moolenaar  unlet! g:somevar
315d72c1bf0SBram Moolenaar
316d72c1bf0SBram Moolenaar  call CheckScriptFailure([
317d72c1bf0SBram Moolenaar        'vim9script',
318d72c1bf0SBram Moolenaar        'let svar = 123',
319d72c1bf0SBram Moolenaar        'unlet svar',
320d72c1bf0SBram Moolenaar        ], 'E1081:')
321d72c1bf0SBram Moolenaar  call CheckScriptFailure([
322d72c1bf0SBram Moolenaar        'vim9script',
323d72c1bf0SBram Moolenaar        'let svar = 123',
324d72c1bf0SBram Moolenaar        'unlet s:svar',
325d72c1bf0SBram Moolenaar        ], 'E1081:')
326d72c1bf0SBram Moolenaar  call CheckScriptFailure([
327d72c1bf0SBram Moolenaar        'vim9script',
328d72c1bf0SBram Moolenaar        'let svar = 123',
329d72c1bf0SBram Moolenaar        'def Func()',
330d72c1bf0SBram Moolenaar        '  unlet svar',
331d72c1bf0SBram Moolenaar        'enddef',
332822ba247SBram Moolenaar        'defcompile',
333d72c1bf0SBram Moolenaar        ], 'E1081:')
334d72c1bf0SBram Moolenaar  call CheckScriptFailure([
335d72c1bf0SBram Moolenaar        'vim9script',
336d72c1bf0SBram Moolenaar        'let svar = 123',
337d72c1bf0SBram Moolenaar        'def Func()',
338d72c1bf0SBram Moolenaar        '  unlet s:svar',
339d72c1bf0SBram Moolenaar        'enddef',
340822ba247SBram Moolenaar        'defcompile',
341d72c1bf0SBram Moolenaar        ], 'E1081:')
3427bdaea6eSBram Moolenaar
3437bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
3447bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
3457bdaea6eSBram Moolenaar  unlet $ENVVAR
3467bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
347d72c1bf0SBram Moolenaarenddef
348599c89c8SBram Moolenaar
3494c17ad94SBram Moolenaardef Test_delfunction()
3504c17ad94SBram Moolenaar  " Check function is defined in script namespace
3514c17ad94SBram Moolenaar  CheckScriptSuccess([
3524c17ad94SBram Moolenaar      'vim9script',
3534c17ad94SBram Moolenaar      'func CheckMe()',
3544c17ad94SBram Moolenaar      '  return 123',
3554c17ad94SBram Moolenaar      'endfunc',
3564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
3574c17ad94SBram Moolenaar      ])
3584c17ad94SBram Moolenaar
3594c17ad94SBram Moolenaar  " Check function in script namespace cannot be deleted
3604c17ad94SBram Moolenaar  CheckScriptFailure([
3614c17ad94SBram Moolenaar      'vim9script',
3624c17ad94SBram Moolenaar      'func DeleteMe1()',
3634c17ad94SBram Moolenaar      'endfunc',
3644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
3654c17ad94SBram Moolenaar      ], 'E1084:')
3664c17ad94SBram Moolenaar  CheckScriptFailure([
3674c17ad94SBram Moolenaar      'vim9script',
3684c17ad94SBram Moolenaar      'func DeleteMe2()',
3694c17ad94SBram Moolenaar      'endfunc',
3704c17ad94SBram Moolenaar      'def DoThat()',
3714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
3724c17ad94SBram Moolenaar      'enddef',
3734c17ad94SBram Moolenaar      'DoThat()',
3744c17ad94SBram Moolenaar      ], 'E1084:')
3754c17ad94SBram Moolenaar  CheckScriptFailure([
3764c17ad94SBram Moolenaar      'vim9script',
3774c17ad94SBram Moolenaar      'def DeleteMe3()',
3784c17ad94SBram Moolenaar      'enddef',
3794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
3804c17ad94SBram Moolenaar      ], 'E1084:')
3814c17ad94SBram Moolenaar  CheckScriptFailure([
3824c17ad94SBram Moolenaar      'vim9script',
3834c17ad94SBram Moolenaar      'def DeleteMe4()',
3844c17ad94SBram Moolenaar      'enddef',
3854c17ad94SBram Moolenaar      'def DoThat()',
3864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
3874c17ad94SBram Moolenaar      'enddef',
3884c17ad94SBram Moolenaar      'DoThat()',
3894c17ad94SBram Moolenaar      ], 'E1084:')
3904c17ad94SBram Moolenaarenddef
3914c17ad94SBram Moolenaar
392599c89c8SBram Moolenaarfunc Test_wrong_type()
393599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
394599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
395599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
396599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
397599c89c8SBram Moolenaar
398599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
399599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
40042a480bfSBram Moolenaar
40142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
40242a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
40342a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
40442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
40542a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
40642a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
40742a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
40842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
40942a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
41042a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
41142a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
412a0a9f43aSBram Moolenaar
413a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
414a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4158a7d6542SBram Moolenaarendfunc
4168a7d6542SBram Moolenaar
4178a7d6542SBram Moolenaarfunc Test_const()
4188a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
4198a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
4208a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
4219be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
4228a7d6542SBram Moolenaarendfunc
4238a7d6542SBram Moolenaar
4248a7d6542SBram Moolenaardef Test_block()
4258a7d6542SBram Moolenaar  let outer = 1
4268a7d6542SBram Moolenaar  {
4278a7d6542SBram Moolenaar    let inner = 2
4288a7d6542SBram Moolenaar    assert_equal(1, outer)
4298a7d6542SBram Moolenaar    assert_equal(2, inner)
4308a7d6542SBram Moolenaar  }
4318a7d6542SBram Moolenaar  assert_equal(1, outer)
4328a7d6542SBram Moolenaarenddef
4338a7d6542SBram Moolenaar
4348a7d6542SBram Moolenaarfunc Test_block_failure()
4358a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
436585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
437585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
4388a7d6542SBram Moolenaarendfunc
4398a7d6542SBram Moolenaar
440585fea7bSBram Moolenaardef Test_cmd_modifier()
441585fea7bSBram Moolenaar  tab echo '0'
442585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
443585fea7bSBram Moolenaarenddef
444585fea7bSBram Moolenaar
4458a7d6542SBram Moolenaardef Test_try_catch()
4468a7d6542SBram Moolenaar  let l = []
4477a092245SBram Moolenaar  try # comment
4488a7d6542SBram Moolenaar    add(l, '1')
4498a7d6542SBram Moolenaar    throw 'wrong'
4508a7d6542SBram Moolenaar    add(l, '2')
4517a092245SBram Moolenaar  catch # comment
4528a7d6542SBram Moolenaar    add(l, v:exception)
4537a092245SBram Moolenaar  finally # comment
4548a7d6542SBram Moolenaar    add(l, '3')
4557a092245SBram Moolenaar  endtry # comment
4568a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4578a7d6542SBram Moolenaarenddef
4588a7d6542SBram Moolenaar
459257cc5eeSBram Moolenaardef ThrowFromDef()
460a72cfb80SBram Moolenaar  throw "getout" # comment
461257cc5eeSBram Moolenaarenddef
462257cc5eeSBram Moolenaar
463257cc5eeSBram Moolenaarfunc CatchInFunc()
464257cc5eeSBram Moolenaar  try
465257cc5eeSBram Moolenaar    call ThrowFromDef()
466257cc5eeSBram Moolenaar  catch
467257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
468257cc5eeSBram Moolenaar  endtry
469257cc5eeSBram Moolenaarendfunc
470257cc5eeSBram Moolenaar
471257cc5eeSBram Moolenaardef CatchInDef()
472257cc5eeSBram Moolenaar  try
473257cc5eeSBram Moolenaar    ThrowFromDef()
474257cc5eeSBram Moolenaar  catch
475257cc5eeSBram Moolenaar    g:thrown_def = v:exception
476257cc5eeSBram Moolenaar  endtry
477257cc5eeSBram Moolenaarenddef
478257cc5eeSBram Moolenaar
479f575adffSBram Moolenaardef ReturnFinally(): string
480f575adffSBram Moolenaar  try
481f575adffSBram Moolenaar    return 'intry'
482f575adffSBram Moolenaar  finally
483f575adffSBram Moolenaar    g:in_finally = 'finally'
484f575adffSBram Moolenaar  endtry
485f575adffSBram Moolenaar  return 'end'
486f575adffSBram Moolenaarenddef
487f575adffSBram Moolenaar
488257cc5eeSBram Moolenaardef Test_try_catch_nested()
489257cc5eeSBram Moolenaar  CatchInFunc()
490257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
491257cc5eeSBram Moolenaar
492257cc5eeSBram Moolenaar  CatchInDef()
493257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
494f575adffSBram Moolenaar
495f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
496f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
497f575adffSBram Moolenaarenddef
498f575adffSBram Moolenaar
499f575adffSBram Moolenaardef Test_try_catch_match()
500f575adffSBram Moolenaar  let seq = 'a'
501f575adffSBram Moolenaar  try
502f575adffSBram Moolenaar    throw 'something'
503f575adffSBram Moolenaar  catch /nothing/
504f575adffSBram Moolenaar    seq ..= 'x'
505f575adffSBram Moolenaar  catch /some/
506f575adffSBram Moolenaar    seq ..= 'b'
507f575adffSBram Moolenaar  catch /asdf/
508f575adffSBram Moolenaar    seq ..= 'x'
509e8c4abbbSBram Moolenaar  catch ?a\?sdf?
510e8c4abbbSBram Moolenaar    seq ..= 'y'
511f575adffSBram Moolenaar  finally
512f575adffSBram Moolenaar    seq ..= 'c'
513f575adffSBram Moolenaar  endtry
514f575adffSBram Moolenaar  assert_equal('abc', seq)
515257cc5eeSBram Moolenaarenddef
516257cc5eeSBram Moolenaar
517e8c4abbbSBram Moolenaardef Test_try_catch_fails()
518e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
519e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
520e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
521585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
522585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
523585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
524585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
525585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
526585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
527585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
528585fea7bSBram Moolenaar
529a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
530585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
531e8c4abbbSBram Moolenaarenddef
532e8c4abbbSBram Moolenaar
5332a1381c3SBram Moolenaarif has('channel')
53440ee466cSBram Moolenaar  let someJob = test_null_job()
53540ee466cSBram Moolenaar
53640ee466cSBram Moolenaar  def FuncWithError()
53740ee466cSBram Moolenaar    echomsg g:someJob
53840ee466cSBram Moolenaar  enddef
53940ee466cSBram Moolenaar
54040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
54140ee466cSBram Moolenaar    try
54240ee466cSBram Moolenaar      call FuncWithError()
54340ee466cSBram Moolenaar    catch
54440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
54540ee466cSBram Moolenaar    endtry
54640ee466cSBram Moolenaar  endfunc
5472a1381c3SBram Moolenaarendif
54840ee466cSBram Moolenaar
5498a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
5508a7d6542SBram Moolenaar  vim9script
5518a7d6542SBram Moolenaar  let name: string = 'bob'
5528a7d6542SBram Moolenaar  def Concat(arg: string): string
5538a7d6542SBram Moolenaar    return name .. arg
5548a7d6542SBram Moolenaar  enddef
555227a69deSBram Moolenaar  g:result = Concat('bie')
556227a69deSBram Moolenaar  g:localname = name
5578a7d6542SBram Moolenaar
5588a7d6542SBram Moolenaar  export const CONST = 1234
5598a7d6542SBram Moolenaar  export let exported = 9876
5606e587dcbSBram Moolenaar  export let exp_name = 'John'
5618a7d6542SBram Moolenaar  export def Exported(): string
5628a7d6542SBram Moolenaar    return 'Exported'
5638a7d6542SBram Moolenaar  enddef
5648a7d6542SBram MoolenaarEND
5658a7d6542SBram Moolenaar
5665269bd2aSBram Moolenaardef Test_vim9_import_export()
5678a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5688a7d6542SBram Moolenaar    vim9script
5698a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5708a7d6542SBram Moolenaar    g:imported = exported
5716e587dcbSBram Moolenaar    exported += 3
5726e587dcbSBram Moolenaar    g:imported_added = exported
5738a7d6542SBram Moolenaar    g:imported_func = Exported()
5746e587dcbSBram Moolenaar
5756e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5766e587dcbSBram Moolenaar    g:imported_name = exp_name
5776e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5786e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5795381c7a1SBram Moolenaar    g:imported_later = exported
5808a7d6542SBram Moolenaar  END
5818a7d6542SBram Moolenaar
5828a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5838a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5848a7d6542SBram Moolenaar
5858a7d6542SBram Moolenaar  source Ximport.vim
5868a7d6542SBram Moolenaar
5878a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5888a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5898a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5906e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5915381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5928a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5936e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5946e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5958a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5968a7d6542SBram Moolenaar
5978a7d6542SBram Moolenaar  unlet g:result
5988a7d6542SBram Moolenaar  unlet g:localname
5998a7d6542SBram Moolenaar  unlet g:imported
6006e587dcbSBram Moolenaar  unlet g:imported_added
6015381c7a1SBram Moolenaar  unlet g:imported_later
6028a7d6542SBram Moolenaar  unlet g:imported_func
6036e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
6048a7d6542SBram Moolenaar  delete('Ximport.vim')
605f2d5c240SBram Moolenaar
6065381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
6075381c7a1SBram Moolenaar    vim9script
6085381c7a1SBram Moolenaar    def ImportInDef()
6095381c7a1SBram Moolenaar      import exported from './Xexport.vim'
6105381c7a1SBram Moolenaar      g:imported = exported
6115381c7a1SBram Moolenaar      exported += 7
6125381c7a1SBram Moolenaar      g:imported_added = exported
6135381c7a1SBram Moolenaar    enddef
6145381c7a1SBram Moolenaar    ImportInDef()
6155381c7a1SBram Moolenaar  END
6165381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
6175381c7a1SBram Moolenaar  source Ximport2.vim
6185381c7a1SBram Moolenaar  " TODO: this should be 9879
6195381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
6205381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
6215381c7a1SBram Moolenaar  unlet g:imported
6225381c7a1SBram Moolenaar  unlet g:imported_added
6235381c7a1SBram Moolenaar  delete('Ximport2.vim')
6245381c7a1SBram Moolenaar
625f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
626f2d5c240SBram Moolenaar    vim9script
627f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
628f2d5c240SBram Moolenaar    def UseExport()
629f2d5c240SBram Moolenaar      g:imported = Export.exported
630f2d5c240SBram Moolenaar    enddef
631f2d5c240SBram Moolenaar    UseExport()
632f2d5c240SBram Moolenaar  END
633f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
634f2d5c240SBram Moolenaar  source Ximport.vim
6355381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
636f2d5c240SBram Moolenaar
637599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
638599c89c8SBram Moolenaar    vim9script
639599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
640599c89c8SBram Moolenaar    def Func()
641599c89c8SBram Moolenaar      let dummy = 1
642599c89c8SBram Moolenaar      let imported = Export + dummy
643599c89c8SBram Moolenaar    enddef
644822ba247SBram Moolenaar    defcompile
645599c89c8SBram Moolenaar  END
646599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
647599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
648599c89c8SBram Moolenaar
649599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
650599c89c8SBram Moolenaar    vim9script
651599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
652599c89c8SBram Moolenaar    def Func()
653599c89c8SBram Moolenaar      let imported = Export . exported
654599c89c8SBram Moolenaar    enddef
655822ba247SBram Moolenaar    defcompile
656599c89c8SBram Moolenaar  END
657599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
658599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
659599c89c8SBram Moolenaar
660599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
661599c89c8SBram Moolenaar    vim9script
662599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
663599c89c8SBram Moolenaar    def Func()
664599c89c8SBram Moolenaar      let imported = Export.
665599c89c8SBram Moolenaar    enddef
666822ba247SBram Moolenaar    defcompile
667599c89c8SBram Moolenaar  END
668599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
669599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
670599c89c8SBram Moolenaar
671f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
672f2d5c240SBram Moolenaar    vim9script
673f2d5c240SBram Moolenaar    import * from './Xexport.vim'
674f2d5c240SBram Moolenaar  END
675f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
676f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
677f2d5c240SBram Moolenaar
678fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
679fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
680fa29c8abSBram Moolenaar    vim9script
681fa29c8abSBram Moolenaar    import name from './Xexport.vim'
682fa29c8abSBram Moolenaar  END
683fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
684fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
685fa29c8abSBram Moolenaar
6865269bd2aSBram Moolenaar  " try to import something that is already defined
6875269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6885269bd2aSBram Moolenaar    vim9script
6895269bd2aSBram Moolenaar    let exported = 'something'
6905269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6915269bd2aSBram Moolenaar  END
6925269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6935269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6945269bd2aSBram Moolenaar
6955269bd2aSBram Moolenaar  " try to import something that is already defined
6965269bd2aSBram Moolenaar  import_already_defined =<< trim END
6975269bd2aSBram Moolenaar    vim9script
6985269bd2aSBram Moolenaar    let exported = 'something'
6995269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
7005269bd2aSBram Moolenaar  END
7015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
7025269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
7035269bd2aSBram Moolenaar
7045269bd2aSBram Moolenaar  " try to import something that is already defined
7055269bd2aSBram Moolenaar  import_already_defined =<< trim END
7065269bd2aSBram Moolenaar    vim9script
7075269bd2aSBram Moolenaar    let exported = 'something'
7085269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
7095269bd2aSBram Moolenaar  END
7105269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
7115269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
7125269bd2aSBram Moolenaar
713fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
714fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
715fa29c8abSBram Moolenaar    vim9script
716fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
717fa29c8abSBram Moolenaar  END
718fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
719fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
720fa29c8abSBram Moolenaar
721fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
722fa29c8abSBram Moolenaar    vim9script
723fa29c8abSBram Moolenaar    import name './Xexport.vim'
724fa29c8abSBram Moolenaar  END
725fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
726fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
727fa29c8abSBram Moolenaar
728fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
729fa29c8abSBram Moolenaar    vim9script
730fa29c8abSBram Moolenaar    import name from Xexport.vim
731fa29c8abSBram Moolenaar  END
732fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
733fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
734fa29c8abSBram Moolenaar
735fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
736fa29c8abSBram Moolenaar    vim9script
737fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
738fa29c8abSBram Moolenaar  END
739fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
740fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
741fa29c8abSBram Moolenaar
742fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
743fa29c8abSBram Moolenaar    vim9script
744fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
745fa29c8abSBram Moolenaar  END
7465269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
7475269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
748fa29c8abSBram Moolenaar
749f2d5c240SBram Moolenaar  delete('Ximport.vim')
7505269bd2aSBram Moolenaar  delete('Ximport3.vim')
7518a7d6542SBram Moolenaar  delete('Xexport.vim')
7528a7d6542SBram Moolenaar
753750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
754750802b5SBram Moolenaar  set cpo&vi
755750802b5SBram Moolenaar  let cpo_before = &cpo
756750802b5SBram Moolenaar  let lines =<< trim END
757750802b5SBram Moolenaar    vim9script
758750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
759750802b5SBram Moolenaar  END
760750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
761750802b5SBram Moolenaar  source Xvim9_script
762750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
763750802b5SBram Moolenaar  set cpo&vim
764750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
765750802b5SBram Moolenaar  delete('Xvim9_script')
766750802b5SBram Moolenaarenddef
767750802b5SBram Moolenaar
768750802b5SBram Moolenaardef Test_vim9script_fails()
7698a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7708a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
771750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
7729721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
773750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
774750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
775750802b5SBram Moolenaar
776750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
777a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
7788a7d6542SBram Moolenaarenddef
7798a7d6542SBram Moolenaar
7804c17ad94SBram Moolenaardef Test_vim9script_reload_import()
7818a7d6542SBram Moolenaar  let lines =<< trim END
7828a7d6542SBram Moolenaar    vim9script
7838a7d6542SBram Moolenaar    const var = ''
7848a7d6542SBram Moolenaar    let valone = 1234
7858a7d6542SBram Moolenaar    def MyFunc(arg: string)
7868a7d6542SBram Moolenaar       valone = 5678
7878a7d6542SBram Moolenaar    enddef
7888a7d6542SBram Moolenaar  END
7898a7d6542SBram Moolenaar  let morelines =<< trim END
7908a7d6542SBram Moolenaar    let valtwo = 222
7918a7d6542SBram Moolenaar    export def GetValtwo(): number
7928a7d6542SBram Moolenaar      return valtwo
7938a7d6542SBram Moolenaar    enddef
7948a7d6542SBram Moolenaar  END
79503afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7968a7d6542SBram Moolenaar  source Xreload.vim
7978a7d6542SBram Moolenaar  source Xreload.vim
7988a7d6542SBram Moolenaar  source Xreload.vim
7998a7d6542SBram Moolenaar
8008a7d6542SBram Moolenaar  let testlines =<< trim END
8018a7d6542SBram Moolenaar    vim9script
8028a7d6542SBram Moolenaar    def TheFunc()
8038a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8048a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8058a7d6542SBram Moolenaar    enddef
8068a7d6542SBram Moolenaar    TheFunc()
8078a7d6542SBram Moolenaar  END
8088a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8098a7d6542SBram Moolenaar  source Ximport.vim
8108a7d6542SBram Moolenaar
81103afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
81203afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
8138a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8148a7d6542SBram Moolenaar  source Ximport.vim
8158a7d6542SBram Moolenaar
8168a7d6542SBram Moolenaar  " cannot declare a var twice
8178a7d6542SBram Moolenaar  lines =<< trim END
8188a7d6542SBram Moolenaar    vim9script
8198a7d6542SBram Moolenaar    let valone = 1234
8208a7d6542SBram Moolenaar    let valone = 5678
8218a7d6542SBram Moolenaar  END
8228a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8238a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8248a7d6542SBram Moolenaar
8258a7d6542SBram Moolenaar  delete('Xreload.vim')
8268a7d6542SBram Moolenaar  delete('Ximport.vim')
8278a7d6542SBram Moolenaarenddef
8288a7d6542SBram Moolenaar
8294c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
8304c17ad94SBram Moolenaar  let first_lines =<< trim END
8314c17ad94SBram Moolenaar    vim9script
8324c17ad94SBram Moolenaar    def FuncYes(): string
8334c17ad94SBram Moolenaar      return 'yes'
8344c17ad94SBram Moolenaar    enddef
8354c17ad94SBram Moolenaar  END
83603afdcf1SBram Moolenaar  let withno_lines =<< trim END
8374c17ad94SBram Moolenaar    def FuncNo(): string
8384c17ad94SBram Moolenaar      return 'no'
8394c17ad94SBram Moolenaar    enddef
8404c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
8414c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
8424c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
84303afdcf1SBram Moolenaar    enddef
84403afdcf1SBram Moolenaar  END
84503afdcf1SBram Moolenaar  let nono_lines =<< trim END
84603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
84703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
8484c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
8494c17ad94SBram Moolenaar    enddef
8504c17ad94SBram Moolenaar  END
8514c17ad94SBram Moolenaar
8524c17ad94SBram Moolenaar  # FuncNo() is defined
85303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8544c17ad94SBram Moolenaar  source Xreloaded.vim
8554c17ad94SBram Moolenaar  g:DoCheck(true)
8564c17ad94SBram Moolenaar
8574c17ad94SBram Moolenaar  # FuncNo() is not redefined
85803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
8594c17ad94SBram Moolenaar  source Xreloaded.vim
86003afdcf1SBram Moolenaar  g:DoCheck()
8614c17ad94SBram Moolenaar
8624c17ad94SBram Moolenaar  # FuncNo() is back
86303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8644c17ad94SBram Moolenaar  source Xreloaded.vim
86503afdcf1SBram Moolenaar  g:DoCheck()
8664c17ad94SBram Moolenaar
8674c17ad94SBram Moolenaar  delete('Xreloaded.vim')
8684c17ad94SBram Moolenaarenddef
8694c17ad94SBram Moolenaar
87089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
87189483d40SBram Moolenaar  # write the script with a script-local variable
87289483d40SBram Moolenaar  let lines =<< trim END
87389483d40SBram Moolenaar    vim9script
87489483d40SBram Moolenaar    let var = 'string'
87589483d40SBram Moolenaar  END
87689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
87789483d40SBram Moolenaar  source XreloadVar.vim
87889483d40SBram Moolenaar
87989483d40SBram Moolenaar  # now write the script using the same variable locally - works
88089483d40SBram Moolenaar  lines =<< trim END
88189483d40SBram Moolenaar    vim9script
88289483d40SBram Moolenaar    def Func()
88389483d40SBram Moolenaar      let var = 'string'
88489483d40SBram Moolenaar    enddef
88589483d40SBram Moolenaar  END
88689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
88789483d40SBram Moolenaar  source XreloadVar.vim
88889483d40SBram Moolenaar
88989483d40SBram Moolenaar  delete('XreloadVar.vim')
89089483d40SBram Moolenaarenddef
89189483d40SBram Moolenaar
8928a7d6542SBram Moolenaardef Test_import_absolute()
8938a7d6542SBram Moolenaar  let import_lines = [
894e6085c53SBram Moolenaar        'vim9script',
895e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
896e6085c53SBram Moolenaar        'def UseExported()',
897e6085c53SBram Moolenaar        '  g:imported_abs = exported',
898e6085c53SBram Moolenaar        '  exported = 8888',
899e6085c53SBram Moolenaar        '  g:imported_after = exported',
900e6085c53SBram Moolenaar        'enddef',
901e6085c53SBram Moolenaar        'UseExported()',
902e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
903e6085c53SBram Moolenaar        ]
9048a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
9058a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
9068a7d6542SBram Moolenaar
9078a7d6542SBram Moolenaar  source Ximport_abs.vim
9088a7d6542SBram Moolenaar
9098a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
9104e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
911675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
912675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
913675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
914675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
915675f716eSBram Moolenaar          'exported = 8888.*' ..
916675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
917675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
918675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
919675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
920e6085c53SBram Moolenaar        g:import_disassembled)
9218a7d6542SBram Moolenaar  unlet g:imported_abs
9224e12a5dfSBram Moolenaar  unlet g:import_disassembled
9238a7d6542SBram Moolenaar
9248a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
9258a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
9268a7d6542SBram Moolenaarenddef
9278a7d6542SBram Moolenaar
9288a7d6542SBram Moolenaardef Test_import_rtp()
9298a7d6542SBram Moolenaar  let import_lines = [
930e6085c53SBram Moolenaar        'vim9script',
931e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
932e6085c53SBram Moolenaar        'g:imported_rtp = exported',
933e6085c53SBram Moolenaar        ]
9348a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
9358a7d6542SBram Moolenaar  mkdir('import')
9368a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
9378a7d6542SBram Moolenaar
9388a7d6542SBram Moolenaar  let save_rtp = &rtp
9398a7d6542SBram Moolenaar  &rtp = getcwd()
9408a7d6542SBram Moolenaar  source Ximport_rtp.vim
9418a7d6542SBram Moolenaar  &rtp = save_rtp
9428a7d6542SBram Moolenaar
9438a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
9448a7d6542SBram Moolenaar  unlet g:imported_rtp
9458a7d6542SBram Moolenaar
9468a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
94789483d40SBram Moolenaar  delete('import', 'rf')
9488a7d6542SBram Moolenaarenddef
9498a7d6542SBram Moolenaar
95025e0f586SBram Moolenaardef Test_import_compile_error()
95125e0f586SBram Moolenaar  let export_lines = [
95225e0f586SBram Moolenaar        'vim9script',
95325e0f586SBram Moolenaar        'export def ExpFunc(): string',
95425e0f586SBram Moolenaar        '  return notDefined',
95525e0f586SBram Moolenaar        'enddef',
95625e0f586SBram Moolenaar        ]
95725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
95825e0f586SBram Moolenaar
95925e0f586SBram Moolenaar  let import_lines = [
96025e0f586SBram Moolenaar        'vim9script',
96125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
96225e0f586SBram Moolenaar        'def ImpFunc()',
96325e0f586SBram Moolenaar        '  echo ExpFunc()',
96425e0f586SBram Moolenaar        'enddef',
96525e0f586SBram Moolenaar        'defcompile',
96625e0f586SBram Moolenaar        ]
96725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
96825e0f586SBram Moolenaar
96925e0f586SBram Moolenaar  try
97025e0f586SBram Moolenaar    source Ximport.vim
97125e0f586SBram Moolenaar  catch /E1001/
97225e0f586SBram Moolenaar    " Error should be fore the Xexported.vim file.
97325e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
97425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
97525e0f586SBram Moolenaar  endtry
97625e0f586SBram Moolenaar
97725e0f586SBram Moolenaar  delete('Xexported.vim')
97825e0f586SBram Moolenaar  delete('Ximport.vim')
97925e0f586SBram Moolenaarenddef
98025e0f586SBram Moolenaar
9818a7d6542SBram Moolenaardef Test_fixed_size_list()
9828a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
9838a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
9848a7d6542SBram Moolenaar  l->remove(0)
9858a7d6542SBram Moolenaar  l->add(5)
9868a7d6542SBram Moolenaar  l->insert(99, 1)
9870f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
9888a7d6542SBram Moolenaarenddef
9898a7d6542SBram Moolenaar
990158906cfSBram Moolenaardef IfElse(what: number): string
991158906cfSBram Moolenaar  let res = ''
992158906cfSBram Moolenaar  if what == 1
993158906cfSBram Moolenaar    res = "one"
994158906cfSBram Moolenaar  elseif what == 2
995158906cfSBram Moolenaar    res = "two"
996a259d8d3SBram Moolenaar  else
997158906cfSBram Moolenaar    res = "three"
998a259d8d3SBram Moolenaar  endif
999158906cfSBram Moolenaar  return res
1000a259d8d3SBram Moolenaarenddef
1001a259d8d3SBram Moolenaar
1002158906cfSBram Moolenaardef Test_if_elseif_else()
1003158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1004158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1005158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
10060f18b6d1SBram Moolenaarenddef
10070f18b6d1SBram Moolenaar
1008e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1009e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1010e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1011e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1012e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1013585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1014e8c4abbbSBram Moolenaarenddef
1015e8c4abbbSBram Moolenaar
10166d69bf60SBram Moolenaarlet g:bool_true = v:true
10176d69bf60SBram Moolenaarlet g:bool_false = v:false
10186d69bf60SBram Moolenaar
10196d69bf60SBram Moolenaardef Test_if_const_expr()
10206d69bf60SBram Moolenaar  let res = false
10216d69bf60SBram Moolenaar  if true ? true : false
10226d69bf60SBram Moolenaar    res = true
10236d69bf60SBram Moolenaar  endif
10246d69bf60SBram Moolenaar  assert_equal(true, res)
10256d69bf60SBram Moolenaar
1026585fea7bSBram Moolenaar  g:glob = 2
1027585fea7bSBram Moolenaar  if false
1028585fea7bSBram Moolenaar    execute('let g:glob = 3')
1029585fea7bSBram Moolenaar  endif
1030585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1031585fea7bSBram Moolenaar  if true
1032585fea7bSBram Moolenaar    execute('let g:glob = 3')
1033585fea7bSBram Moolenaar  endif
1034585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1035585fea7bSBram Moolenaar
10366d69bf60SBram Moolenaar  res = false
10376d69bf60SBram Moolenaar  if g:bool_true ? true : false
10386d69bf60SBram Moolenaar    res = true
10396d69bf60SBram Moolenaar  endif
10406d69bf60SBram Moolenaar  assert_equal(true, res)
10416d69bf60SBram Moolenaar
10426d69bf60SBram Moolenaar  res = false
10436d69bf60SBram Moolenaar  if true ? g:bool_true : false
10446d69bf60SBram Moolenaar    res = true
10456d69bf60SBram Moolenaar  endif
10466d69bf60SBram Moolenaar  assert_equal(true, res)
10476d69bf60SBram Moolenaar
10486d69bf60SBram Moolenaar  res = false
10496d69bf60SBram Moolenaar  if true ? true : g:bool_false
10506d69bf60SBram Moolenaar    res = true
10516d69bf60SBram Moolenaar  endif
10526d69bf60SBram Moolenaar  assert_equal(true, res)
10536d69bf60SBram Moolenaar
10546d69bf60SBram Moolenaar  res = false
10556d69bf60SBram Moolenaar  if true ? false : true
10566d69bf60SBram Moolenaar    res = true
10576d69bf60SBram Moolenaar  endif
10586d69bf60SBram Moolenaar  assert_equal(false, res)
10596d69bf60SBram Moolenaar
10606d69bf60SBram Moolenaar  res = false
10616d69bf60SBram Moolenaar  if false ? false : true
10626d69bf60SBram Moolenaar    res = true
10636d69bf60SBram Moolenaar  endif
10646d69bf60SBram Moolenaar  assert_equal(true, res)
10656d69bf60SBram Moolenaar
10666d69bf60SBram Moolenaar  res = false
10676d69bf60SBram Moolenaar  if false ? true : false
10686d69bf60SBram Moolenaar    res = true
10696d69bf60SBram Moolenaar  endif
10706d69bf60SBram Moolenaar  assert_equal(false, res)
10716d69bf60SBram Moolenaar
10726d69bf60SBram Moolenaar  res = false
1073e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1074e8c4abbbSBram Moolenaar    res = true
1075e8c4abbbSBram Moolenaar  endif
1076e8c4abbbSBram Moolenaar  assert_equal(false, res)
1077e8c4abbbSBram Moolenaar
1078e8c4abbbSBram Moolenaar  res = false
10796d69bf60SBram Moolenaar  if true && true
10806d69bf60SBram Moolenaar    res = true
10816d69bf60SBram Moolenaar  endif
10826d69bf60SBram Moolenaar  assert_equal(true, res)
10836d69bf60SBram Moolenaar
10846d69bf60SBram Moolenaar  res = false
10856d69bf60SBram Moolenaar  if true && false
10866d69bf60SBram Moolenaar    res = true
10876d69bf60SBram Moolenaar  endif
10886d69bf60SBram Moolenaar  assert_equal(false, res)
10896d69bf60SBram Moolenaar
10906d69bf60SBram Moolenaar  res = false
10916d69bf60SBram Moolenaar  if g:bool_true && false
10926d69bf60SBram Moolenaar    res = true
10936d69bf60SBram Moolenaar  endif
10946d69bf60SBram Moolenaar  assert_equal(false, res)
10956d69bf60SBram Moolenaar
10966d69bf60SBram Moolenaar  res = false
10976d69bf60SBram Moolenaar  if true && g:bool_false
10986d69bf60SBram Moolenaar    res = true
10996d69bf60SBram Moolenaar  endif
11006d69bf60SBram Moolenaar  assert_equal(false, res)
11016d69bf60SBram Moolenaar
11026d69bf60SBram Moolenaar  res = false
11036d69bf60SBram Moolenaar  if false && false
11046d69bf60SBram Moolenaar    res = true
11056d69bf60SBram Moolenaar  endif
11066d69bf60SBram Moolenaar  assert_equal(false, res)
11076d69bf60SBram Moolenaar
11086d69bf60SBram Moolenaar  res = false
11096d69bf60SBram Moolenaar  if true || false
11106d69bf60SBram Moolenaar    res = true
11116d69bf60SBram Moolenaar  endif
11126d69bf60SBram Moolenaar  assert_equal(true, res)
11136d69bf60SBram Moolenaar
11146d69bf60SBram Moolenaar  res = false
11156d69bf60SBram Moolenaar  if g:bool_true || false
11166d69bf60SBram Moolenaar    res = true
11176d69bf60SBram Moolenaar  endif
11186d69bf60SBram Moolenaar  assert_equal(true, res)
11196d69bf60SBram Moolenaar
11206d69bf60SBram Moolenaar  res = false
11216d69bf60SBram Moolenaar  if true || g:bool_false
11226d69bf60SBram Moolenaar    res = true
11236d69bf60SBram Moolenaar  endif
11246d69bf60SBram Moolenaar  assert_equal(true, res)
11256d69bf60SBram Moolenaar
11266d69bf60SBram Moolenaar  res = false
11276d69bf60SBram Moolenaar  if false || false
11286d69bf60SBram Moolenaar    res = true
11296d69bf60SBram Moolenaar  endif
11306d69bf60SBram Moolenaar  assert_equal(false, res)
113180c34ca3SBram Moolenaarenddef
11326d69bf60SBram Moolenaar
113380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
113480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
113580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1136e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1137e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
11386d69bf60SBram Moolenaarenddef
11396d69bf60SBram Moolenaar
1140ad39c094SBram Moolenaardef Test_execute_cmd()
1141ad39c094SBram Moolenaar  new
1142ad39c094SBram Moolenaar  setline(1, 'default')
1143ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1144ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1145a72cfb80SBram Moolenaar
1146a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1147a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1148a72cfb80SBram Moolenaar
1149ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1150ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1151a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1152ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1153a72cfb80SBram Moolenaar
1154ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1155ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1156a72cfb80SBram Moolenaar
1157ad39c094SBram Moolenaar  let cmd_first = 'call '
1158ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1159ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1160ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1161ad39c094SBram Moolenaar  bwipe!
1162585fea7bSBram Moolenaar
1163585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1164a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1165ad39c094SBram Moolenaarenddef
1166ad39c094SBram Moolenaar
1167ad39c094SBram Moolenaardef Test_echo_cmd()
1168a72cfb80SBram Moolenaar  echo 'some' # comment
1169585fea7bSBram Moolenaar  echon 'thing'
1170ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1171ad39c094SBram Moolenaar
1172a72cfb80SBram Moolenaar  echo "some" # comment
1173a72cfb80SBram Moolenaar  echon "thing"
1174a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1175a72cfb80SBram Moolenaar
1176ad39c094SBram Moolenaar  let str1 = 'some'
1177ad39c094SBram Moolenaar  let str2 = 'more'
1178ad39c094SBram Moolenaar  echo str1 str2
1179ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1180a72cfb80SBram Moolenaar
1181a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1182ad39c094SBram Moolenaarenddef
1183ad39c094SBram Moolenaar
1184f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1185f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1186f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1187f93c7feaSBram Moolenaar  echo 'clear'
1188f93c7feaSBram Moolenaar  1messages
1189f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1190f93c7feaSBram Moolenaar
1191f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1192f93c7feaSBram Moolenaarenddef
1193f93c7feaSBram Moolenaar
1194f93c7feaSBram Moolenaardef Test_echoerr_cmd()
119540ee466cSBram Moolenaar  try
119640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
119740ee466cSBram Moolenaar  catch
119840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
119940ee466cSBram Moolenaar  endtry
1200f93c7feaSBram Moolenaarenddef
1201f93c7feaSBram Moolenaar
120241fe0617SBram Moolenaardef Test_for_outside_of_function()
120341fe0617SBram Moolenaar  let lines =<< trim END
120441fe0617SBram Moolenaar    vim9script
120541fe0617SBram Moolenaar    new
120641fe0617SBram Moolenaar    for var in range(0, 3)
120741fe0617SBram Moolenaar      append(line('$'), var)
120841fe0617SBram Moolenaar    endfor
120941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
121041fe0617SBram Moolenaar    bwipe!
121141fe0617SBram Moolenaar  END
121241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
121341fe0617SBram Moolenaar  source Xvim9for.vim
121441fe0617SBram Moolenaar  delete('Xvim9for.vim')
121541fe0617SBram Moolenaarenddef
12168a7d6542SBram Moolenaar
1217e8c4abbbSBram Moolenaardef Test_for_loop()
1218e8c4abbbSBram Moolenaar  let result = ''
1219e8c4abbbSBram Moolenaar  for cnt in range(7)
1220e8c4abbbSBram Moolenaar    if cnt == 4
1221e8c4abbbSBram Moolenaar      break
1222e8c4abbbSBram Moolenaar    endif
1223e8c4abbbSBram Moolenaar    if cnt == 2
1224e8c4abbbSBram Moolenaar      continue
1225e8c4abbbSBram Moolenaar    endif
1226e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1227e8c4abbbSBram Moolenaar  endfor
1228e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1229e8c4abbbSBram Moolenaarenddef
1230e8c4abbbSBram Moolenaar
1231e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1232675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1233675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1234675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1235822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1236675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1237675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1238675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1239675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1240e8c4abbbSBram Moolenaarenddef
1241e8c4abbbSBram Moolenaar
1242d0df1aacSBram Moolenaardef Test_while_loop()
1243d0df1aacSBram Moolenaar  let result = ''
1244d0df1aacSBram Moolenaar  let cnt = 0
1245d0df1aacSBram Moolenaar  while cnt < 555
1246d0df1aacSBram Moolenaar    if cnt == 3
1247d0df1aacSBram Moolenaar      break
1248d0df1aacSBram Moolenaar    endif
1249d0df1aacSBram Moolenaar    cnt += 1
1250d0df1aacSBram Moolenaar    if cnt == 2
1251d0df1aacSBram Moolenaar      continue
1252d0df1aacSBram Moolenaar    endif
1253d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1254d0df1aacSBram Moolenaar  endwhile
1255d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1256d0df1aacSBram Moolenaarenddef
1257d0df1aacSBram Moolenaar
1258e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1259675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1260675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1261675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1262675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1263675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1264675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1265675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1266bd5da371SBram Moolenaarenddef
1267bd5da371SBram Moolenaar
12689645e2d9SBram Moolenaardef Test_interrupt_loop()
126997acfc78SBram Moolenaar  let caught = false
12709645e2d9SBram Moolenaar  let x = 0
127197acfc78SBram Moolenaar  try
12729645e2d9SBram Moolenaar    while 1
12739645e2d9SBram Moolenaar      x += 1
12749645e2d9SBram Moolenaar      if x == 100
12759645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
12769645e2d9SBram Moolenaar      endif
12779645e2d9SBram Moolenaar    endwhile
127897acfc78SBram Moolenaar  catch
127997acfc78SBram Moolenaar    caught = true
128097acfc78SBram Moolenaar    assert_equal(100, x)
128197acfc78SBram Moolenaar  endtry
128297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
12839645e2d9SBram Moolenaarenddef
128420431c9dSBram Moolenaar
12854fdae999SBram Moolenaardef Test_automatic_line_continuation()
12864fdae999SBram Moolenaar  let mylist = [
12874fdae999SBram Moolenaar      'one',
12884fdae999SBram Moolenaar      'two',
12894fdae999SBram Moolenaar      'three',
12904fdae999SBram Moolenaar      ] " comment
12914fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
12924fdae999SBram Moolenaar
12934fdae999SBram Moolenaar  let mydict = {
12944fdae999SBram Moolenaar      'one': 1,
12954fdae999SBram Moolenaar      'two': 2,
12964fdae999SBram Moolenaar      'three':
12974fdae999SBram Moolenaar          3,
12984fdae999SBram Moolenaar      } " comment
12994fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
13004fdae999SBram Moolenaar  mydict = #{
13012c330432SBram Moolenaar      one: 1,  # comment
13022c330432SBram Moolenaar      two:     # comment
13032c330432SBram Moolenaar           2,  # comment
13042c330432SBram Moolenaar      three: 3 # comment
13052c330432SBram Moolenaar      }
13062c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
13072c330432SBram Moolenaar  mydict = #{
13082c330432SBram Moolenaar      one: 1,
13094fdae999SBram Moolenaar      two:
13104fdae999SBram Moolenaar           2,
13112c330432SBram Moolenaar      three: 3
13124fdae999SBram Moolenaar      }
13134fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1314e6085c53SBram Moolenaar
1315e6085c53SBram Moolenaar  assert_equal(
1316e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1317e6085c53SBram Moolenaar        split('one two three')
1318e6085c53SBram Moolenaar        )
13194fdae999SBram Moolenaarenddef
13204fdae999SBram Moolenaar
13217a092245SBram Moolenaardef Test_vim9_comment()
13227a092245SBram Moolenaar  CheckScriptSuccess([
13237a092245SBram Moolenaar      'vim9script',
13247a092245SBram Moolenaar      '# something',
13257a092245SBram Moolenaar      ])
13267a092245SBram Moolenaar  CheckScriptFailure([
13277a092245SBram Moolenaar      'vim9script',
13287a092245SBram Moolenaar      ':# something',
13297a092245SBram Moolenaar      ], 'E488:')
13307a092245SBram Moolenaar  CheckScriptFailure([
13317a092245SBram Moolenaar      '# something',
13327a092245SBram Moolenaar      ], 'E488:')
13337a092245SBram Moolenaar  CheckScriptFailure([
13347a092245SBram Moolenaar      ':# something',
13357a092245SBram Moolenaar      ], 'E488:')
13367a092245SBram Moolenaar
13374a8d9f2eSBram Moolenaar  { # block start
13384a8d9f2eSBram Moolenaar  } # block end
13394a8d9f2eSBram Moolenaar  CheckDefFailure([
13404a8d9f2eSBram Moolenaar      '{# comment',
13414a8d9f2eSBram Moolenaar      ], 'E488:')
13424a8d9f2eSBram Moolenaar  CheckDefFailure([
13434a8d9f2eSBram Moolenaar      '{',
13444a8d9f2eSBram Moolenaar      '}# comment',
13454a8d9f2eSBram Moolenaar      ], 'E488:')
13464a8d9f2eSBram Moolenaar
13474a8d9f2eSBram Moolenaar  echo "yes" # comment
13484a8d9f2eSBram Moolenaar  CheckDefFailure([
13494a8d9f2eSBram Moolenaar      'echo "yes"# comment',
13504a8d9f2eSBram Moolenaar      ], 'E488:')
13517a092245SBram Moolenaar  CheckScriptSuccess([
13527a092245SBram Moolenaar      'vim9script',
13537a092245SBram Moolenaar      'echo "yes" # something',
13547a092245SBram Moolenaar      ])
13557a092245SBram Moolenaar  CheckScriptFailure([
13567a092245SBram Moolenaar      'vim9script',
13577a092245SBram Moolenaar      'echo "yes"# something',
13587a092245SBram Moolenaar      ], 'E121:')
13597a092245SBram Moolenaar  CheckScriptFailure([
13607a092245SBram Moolenaar      'vim9script',
13617a092245SBram Moolenaar      'echo# something',
13627a092245SBram Moolenaar      ], 'E121:')
13637a092245SBram Moolenaar  CheckScriptFailure([
13647a092245SBram Moolenaar      'echo "yes" # something',
13657a092245SBram Moolenaar      ], 'E121:')
13667a092245SBram Moolenaar
13674a8d9f2eSBram Moolenaar  exe "echo" # comment
13684a8d9f2eSBram Moolenaar  CheckDefFailure([
13694a8d9f2eSBram Moolenaar      'exe "echo"# comment',
13704a8d9f2eSBram Moolenaar      ], 'E488:')
13714a8d9f2eSBram Moolenaar  CheckScriptSuccess([
13724a8d9f2eSBram Moolenaar      'vim9script',
13734a8d9f2eSBram Moolenaar      'exe "echo" # something',
13744a8d9f2eSBram Moolenaar      ])
13754a8d9f2eSBram Moolenaar  CheckScriptFailure([
13764a8d9f2eSBram Moolenaar      'vim9script',
13774a8d9f2eSBram Moolenaar      'exe "echo"# something',
13784a8d9f2eSBram Moolenaar      ], 'E121:')
13794a8d9f2eSBram Moolenaar  CheckDefFailure([
13804a8d9f2eSBram Moolenaar      'exe # comment',
13814a8d9f2eSBram Moolenaar      ], 'E1015:')
13824a8d9f2eSBram Moolenaar  CheckScriptFailure([
13834a8d9f2eSBram Moolenaar      'vim9script',
13844a8d9f2eSBram Moolenaar      'exe# something',
13854a8d9f2eSBram Moolenaar      ], 'E121:')
13864a8d9f2eSBram Moolenaar  CheckScriptFailure([
13874a8d9f2eSBram Moolenaar      'exe "echo" # something',
13884a8d9f2eSBram Moolenaar      ], 'E121:')
13894a8d9f2eSBram Moolenaar
13907a092245SBram Moolenaar  CheckDefFailure([
13917a092245SBram Moolenaar      'try# comment',
13927a092245SBram Moolenaar      '  echo "yes"',
13937a092245SBram Moolenaar      'catch',
13947a092245SBram Moolenaar      'endtry',
13957a092245SBram Moolenaar      ], 'E488:')
13962c5ed4e3SBram Moolenaar  CheckScriptFailure([
13972c5ed4e3SBram Moolenaar      'vim9script',
13982c5ed4e3SBram Moolenaar      'try# comment',
13992c5ed4e3SBram Moolenaar      'echo "yes"',
14002c5ed4e3SBram Moolenaar      ], 'E488:')
14017a092245SBram Moolenaar  CheckDefFailure([
14027a092245SBram Moolenaar      'try',
1403a72cfb80SBram Moolenaar      '  throw#comment',
1404a72cfb80SBram Moolenaar      'catch',
1405a72cfb80SBram Moolenaar      'endtry',
1406a72cfb80SBram Moolenaar      ], 'E1015:')
1407a72cfb80SBram Moolenaar  CheckDefFailure([
1408a72cfb80SBram Moolenaar      'try',
1409a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1410a72cfb80SBram Moolenaar      'catch',
1411a72cfb80SBram Moolenaar      'endtry',
1412a72cfb80SBram Moolenaar      ], 'E488:')
1413a72cfb80SBram Moolenaar  CheckDefFailure([
1414a72cfb80SBram Moolenaar      'try',
14157a092245SBram Moolenaar      '  echo "yes"',
14167a092245SBram Moolenaar      'catch# comment',
14177a092245SBram Moolenaar      'endtry',
14187a092245SBram Moolenaar      ], 'E488:')
14192c5ed4e3SBram Moolenaar  CheckScriptFailure([
14202c5ed4e3SBram Moolenaar      'vim9script',
14212c5ed4e3SBram Moolenaar      'try',
14222c5ed4e3SBram Moolenaar      '  echo "yes"',
14232c5ed4e3SBram Moolenaar      'catch# comment',
14242c5ed4e3SBram Moolenaar      'endtry',
14252c5ed4e3SBram Moolenaar      ], 'E654:')
14262c5ed4e3SBram Moolenaar  CheckDefFailure([
14272c5ed4e3SBram Moolenaar      'try',
14282c5ed4e3SBram Moolenaar      '  echo "yes"',
14292c5ed4e3SBram Moolenaar      'catch /pat/# comment',
14302c5ed4e3SBram Moolenaar      'endtry',
14312c5ed4e3SBram Moolenaar      ], 'E488:')
14327a092245SBram Moolenaar  CheckDefFailure([
14337a092245SBram Moolenaar      'try',
14347a092245SBram Moolenaar      'echo "yes"',
14357a092245SBram Moolenaar      'catch',
14367a092245SBram Moolenaar      'endtry# comment',
14377a092245SBram Moolenaar      ], 'E488:')
14382c5ed4e3SBram Moolenaar  CheckScriptFailure([
14392c5ed4e3SBram Moolenaar      'vim9script',
14402c5ed4e3SBram Moolenaar      'try',
14412c5ed4e3SBram Moolenaar      '  echo "yes"',
14422c5ed4e3SBram Moolenaar      'catch',
14432c5ed4e3SBram Moolenaar      'endtry# comment',
14442c5ed4e3SBram Moolenaar      ], 'E600:')
14452c5ed4e3SBram Moolenaar
14462c5ed4e3SBram Moolenaar  CheckScriptSuccess([
14472c5ed4e3SBram Moolenaar      'vim9script',
14482c5ed4e3SBram Moolenaar      'hi # comment',
14492c5ed4e3SBram Moolenaar      ])
14502c5ed4e3SBram Moolenaar  CheckScriptFailure([
14512c5ed4e3SBram Moolenaar      'vim9script',
14522c5ed4e3SBram Moolenaar      'hi# comment',
14532c5ed4e3SBram Moolenaar      ], 'E416:')
14541966c248SBram Moolenaar  CheckScriptSuccess([
14551966c248SBram Moolenaar      'vim9script',
14561966c248SBram Moolenaar      'hi Search # comment',
14571966c248SBram Moolenaar      ])
14581966c248SBram Moolenaar  CheckScriptFailure([
14591966c248SBram Moolenaar      'vim9script',
14601966c248SBram Moolenaar      'hi Search# comment',
14611966c248SBram Moolenaar      ], 'E416:')
14621966c248SBram Moolenaar  CheckScriptSuccess([
14631966c248SBram Moolenaar      'vim9script',
14641966c248SBram Moolenaar      'hi link This Search # comment',
14651966c248SBram Moolenaar      ])
14661966c248SBram Moolenaar  CheckScriptFailure([
14671966c248SBram Moolenaar      'vim9script',
14681966c248SBram Moolenaar      'hi link This That# comment',
14691966c248SBram Moolenaar      ], 'E413:')
14701966c248SBram Moolenaar  CheckScriptSuccess([
14711966c248SBram Moolenaar      'vim9script',
14721966c248SBram Moolenaar      'hi clear This # comment',
14731966c248SBram Moolenaar      'hi clear # comment',
14741966c248SBram Moolenaar      ])
14751966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
14761966c248SBram Moolenaar  " hi clear This# comment',
14771966c248SBram Moolenaar  CheckScriptFailure([
14781966c248SBram Moolenaar      'vim9script',
14791966c248SBram Moolenaar      'hi clear# comment',
14801966c248SBram Moolenaar      ], 'E416:')
14811966c248SBram Moolenaar
14821966c248SBram Moolenaar  CheckScriptSuccess([
14831966c248SBram Moolenaar      'vim9script',
14841966c248SBram Moolenaar      'hi Group term=bold',
14851966c248SBram Moolenaar      'match Group /todo/ # comment',
14861966c248SBram Moolenaar      ])
14871966c248SBram Moolenaar  CheckScriptFailure([
14881966c248SBram Moolenaar      'vim9script',
14891966c248SBram Moolenaar      'hi Group term=bold',
14901966c248SBram Moolenaar      'match Group /todo/# comment',
14911966c248SBram Moolenaar      ], 'E488:')
14921966c248SBram Moolenaar  CheckScriptSuccess([
14931966c248SBram Moolenaar      'vim9script',
14941966c248SBram Moolenaar      'match # comment',
14951966c248SBram Moolenaar      ])
14961966c248SBram Moolenaar  CheckScriptFailure([
14971966c248SBram Moolenaar      'vim9script',
14981966c248SBram Moolenaar      'match# comment',
14991966c248SBram Moolenaar      ], 'E475:')
15001966c248SBram Moolenaar  CheckScriptSuccess([
15011966c248SBram Moolenaar      'vim9script',
15021966c248SBram Moolenaar      'match none # comment',
15031966c248SBram Moolenaar      ])
15041966c248SBram Moolenaar  CheckScriptFailure([
15051966c248SBram Moolenaar      'vim9script',
15061966c248SBram Moolenaar      'match none# comment',
15071966c248SBram Moolenaar      ], 'E475:')
15081966c248SBram Moolenaar
15091966c248SBram Moolenaar  CheckScriptSuccess([
15101966c248SBram Moolenaar      'vim9script',
15111966c248SBram Moolenaar      'menutrans clear # comment',
15121966c248SBram Moolenaar      ])
15131966c248SBram Moolenaar  CheckScriptFailure([
15141966c248SBram Moolenaar      'vim9script',
15151966c248SBram Moolenaar      'menutrans clear# comment text',
15161966c248SBram Moolenaar      ], 'E474:')
15171966c248SBram Moolenaar
15181966c248SBram Moolenaar  CheckScriptSuccess([
15191966c248SBram Moolenaar      'vim9script',
15201966c248SBram Moolenaar      'syntax clear # comment',
15211966c248SBram Moolenaar      ])
15221966c248SBram Moolenaar  CheckScriptFailure([
15231966c248SBram Moolenaar      'vim9script',
15241966c248SBram Moolenaar      'syntax clear# comment text',
15251966c248SBram Moolenaar      ], 'E28:')
15261966c248SBram Moolenaar  CheckScriptSuccess([
15271966c248SBram Moolenaar      'vim9script',
15281966c248SBram Moolenaar      'syntax keyword Word some',
15291966c248SBram Moolenaar      'syntax clear Word # comment',
15301966c248SBram Moolenaar      ])
15311966c248SBram Moolenaar  CheckScriptFailure([
15321966c248SBram Moolenaar      'vim9script',
15331966c248SBram Moolenaar      'syntax keyword Word some',
15341966c248SBram Moolenaar      'syntax clear Word# comment text',
15351966c248SBram Moolenaar      ], 'E28:')
15361966c248SBram Moolenaar
15371966c248SBram Moolenaar  CheckScriptSuccess([
15381966c248SBram Moolenaar      'vim9script',
15391966c248SBram Moolenaar      'syntax list # comment',
15401966c248SBram Moolenaar      ])
15411966c248SBram Moolenaar  CheckScriptFailure([
15421966c248SBram Moolenaar      'vim9script',
15431966c248SBram Moolenaar      'syntax list# comment text',
15441966c248SBram Moolenaar      ], 'E28:')
15451966c248SBram Moolenaar
15461966c248SBram Moolenaar  CheckScriptSuccess([
15471966c248SBram Moolenaar      'vim9script',
15481966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
15491966c248SBram Moolenaar      ])
15501966c248SBram Moolenaar  CheckScriptFailure([
15511966c248SBram Moolenaar      'vim9script',
15521966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
15531966c248SBram Moolenaar      ], 'E475:')
15541966c248SBram Moolenaar
15551966c248SBram Moolenaar  CheckScriptSuccess([
15561966c248SBram Moolenaar      'vim9script',
15571966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
15581966c248SBram Moolenaar      ])
15591966c248SBram Moolenaar  CheckScriptFailure([
15601966c248SBram Moolenaar      'vim9script',
15611966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
15621966c248SBram Moolenaar      ], 'E789:')
15631966c248SBram Moolenaar
15641966c248SBram Moolenaar  CheckScriptSuccess([
15651966c248SBram Moolenaar      'vim9script',
15661966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
15671966c248SBram Moolenaar      ])
15681966c248SBram Moolenaar  CheckScriptFailure([
15691966c248SBram Moolenaar      'vim9script',
15701966c248SBram Moolenaar      'syntax match Word /pat/# comment',
15711966c248SBram Moolenaar      ], 'E402:')
15721966c248SBram Moolenaar
15731966c248SBram Moolenaar  CheckScriptSuccess([
15741966c248SBram Moolenaar      'vim9script',
15751966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
15761966c248SBram Moolenaar      ])
15771966c248SBram Moolenaar  CheckScriptFailure([
15781966c248SBram Moolenaar      'vim9script',
15791966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
15801966c248SBram Moolenaar      ], 'E475:')
15811966c248SBram Moolenaar  CheckScriptFailure([
15821966c248SBram Moolenaar      'vim9script',
15831966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
15841966c248SBram Moolenaar      ], 'E406:')
15851966c248SBram Moolenaar  CheckScriptFailure([
15861966c248SBram Moolenaar      'vim9script',
15871966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
15881966c248SBram Moolenaar      ], 'E475:')
15891966c248SBram Moolenaar
15901966c248SBram Moolenaar  CheckScriptSuccess([
15911966c248SBram Moolenaar      'vim9script',
15921966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
15931966c248SBram Moolenaar      ])
15941966c248SBram Moolenaar  CheckScriptFailure([
15951966c248SBram Moolenaar      'vim9script',
15961966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
15971966c248SBram Moolenaar      ], 'E475:')
15981966c248SBram Moolenaar
15991966c248SBram Moolenaar  CheckScriptSuccess([
16001966c248SBram Moolenaar      'vim9script',
16011966c248SBram Moolenaar      'syntax sync # comment',
16021966c248SBram Moolenaar      ])
16031966c248SBram Moolenaar  CheckScriptFailure([
16041966c248SBram Moolenaar      'vim9script',
16051966c248SBram Moolenaar      'syntax sync# comment',
16061966c248SBram Moolenaar      ], 'E404:')
16071966c248SBram Moolenaar  CheckScriptSuccess([
16081966c248SBram Moolenaar      'vim9script',
16091966c248SBram Moolenaar      'syntax sync ccomment # comment',
16101966c248SBram Moolenaar      ])
16111966c248SBram Moolenaar  CheckScriptFailure([
16121966c248SBram Moolenaar      'vim9script',
16131966c248SBram Moolenaar      'syntax sync ccomment# comment',
16141966c248SBram Moolenaar      ], 'E404:')
16151966c248SBram Moolenaar
16161966c248SBram Moolenaar  CheckScriptSuccess([
16171966c248SBram Moolenaar      'vim9script',
16181966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
16191966c248SBram Moolenaar      ])
16201966c248SBram Moolenaar  CheckScriptFailure([
16211966c248SBram Moolenaar      'vim9script',
16221966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
16231966c248SBram Moolenaar      ], 'E475:')
1624a72cfb80SBram Moolenaar
1625a72cfb80SBram Moolenaar  CheckScriptSuccess([
1626a72cfb80SBram Moolenaar      'vim9script',
1627a72cfb80SBram Moolenaar      'command Echo echo # comment',
1628a72cfb80SBram Moolenaar      'command Echo # comment',
1629a72cfb80SBram Moolenaar      ])
1630a72cfb80SBram Moolenaar  CheckScriptFailure([
1631a72cfb80SBram Moolenaar      'vim9script',
1632a72cfb80SBram Moolenaar      'command Echo echo# comment',
1633a72cfb80SBram Moolenaar      'Echo',
1634a72cfb80SBram Moolenaar      ], 'E121:')
1635a72cfb80SBram Moolenaar  CheckScriptFailure([
1636a72cfb80SBram Moolenaar      'vim9script',
1637a72cfb80SBram Moolenaar      'command Echo# comment',
1638a72cfb80SBram Moolenaar      ], 'E182:')
1639a72cfb80SBram Moolenaar  CheckScriptFailure([
1640a72cfb80SBram Moolenaar      'vim9script',
1641a72cfb80SBram Moolenaar      'command Echo echo',
1642a72cfb80SBram Moolenaar      'command Echo# comment',
1643a72cfb80SBram Moolenaar      ], 'E182:')
1644a72cfb80SBram Moolenaar
1645a72cfb80SBram Moolenaar  CheckScriptSuccess([
1646a72cfb80SBram Moolenaar      'vim9script',
1647a72cfb80SBram Moolenaar      'function # comment',
1648a72cfb80SBram Moolenaar      ])
1649a72cfb80SBram Moolenaar  CheckScriptFailure([
1650a72cfb80SBram Moolenaar      'vim9script',
1651a72cfb80SBram Moolenaar      'function# comment',
1652a72cfb80SBram Moolenaar      ], 'E129:')
1653a72cfb80SBram Moolenaar  CheckScriptSuccess([
1654a72cfb80SBram Moolenaar      'vim9script',
1655a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1656a72cfb80SBram Moolenaar      ])
1657a72cfb80SBram Moolenaar  CheckScriptFailure([
1658a72cfb80SBram Moolenaar      'vim9script',
1659a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1660a72cfb80SBram Moolenaar      ], 'E488:')
1661a72cfb80SBram Moolenaar
1662a72cfb80SBram Moolenaar  CheckScriptSuccess([
1663a72cfb80SBram Moolenaar      'vim9script',
16644c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1665a72cfb80SBram Moolenaar      'endfunc',
16664c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1667a72cfb80SBram Moolenaar      ])
1668a72cfb80SBram Moolenaar  CheckScriptFailure([
1669a72cfb80SBram Moolenaar      'vim9script',
16704c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1671a72cfb80SBram Moolenaar      'endfunc',
16724c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1673a72cfb80SBram Moolenaar      ], 'E488:')
1674a72cfb80SBram Moolenaar
1675a72cfb80SBram Moolenaar  CheckScriptSuccess([
1676a72cfb80SBram Moolenaar      'vim9script',
1677a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1678a72cfb80SBram Moolenaar      ])
1679a72cfb80SBram Moolenaar  CheckScriptFailure([
1680a72cfb80SBram Moolenaar      'vim9script',
1681a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1682a72cfb80SBram Moolenaar      ], 'E488:')
16832c5ed4e3SBram Moolenaarenddef
16842c5ed4e3SBram Moolenaar
16852c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
16862c5ed4e3SBram Moolenaar  CheckCanRunGui
16872c5ed4e3SBram Moolenaar
16882c5ed4e3SBram Moolenaar  CheckScriptFailure([
16892c5ed4e3SBram Moolenaar      'vim9script',
16902c5ed4e3SBram Moolenaar      'gui#comment'
16912c5ed4e3SBram Moolenaar      ], 'E499:')
16922c5ed4e3SBram Moolenaar  CheckScriptFailure([
16932c5ed4e3SBram Moolenaar      'vim9script',
16942c5ed4e3SBram Moolenaar      'gui -f#comment'
16952c5ed4e3SBram Moolenaar      ], 'E499:')
16967a092245SBram Moolenaarenddef
16977a092245SBram Moolenaar
1698a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1699a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1700a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1701a26b9700SBram Moolenaar
1702a26b9700SBram Moolenaar  edit test.vim
1703a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1704a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1705a26b9700SBram Moolenaar
1706a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1707a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1708a26b9700SBram Moolenaar
1709a26b9700SBram Moolenaar  g:entered = 0
1710a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1711a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1712a26b9700SBram Moolenaar
1713a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1714a26b9700SBram Moolenaar
1715a26b9700SBram Moolenaar  au! TabEnter
1716a26b9700SBram Moolenaar  unlet g:entered
1717d72c1bf0SBram Moolenaar
1718d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1719d72c1bf0SBram Moolenaar      'vim9script',
1720d72c1bf0SBram Moolenaar      'let g:var = 123',
1721d72c1bf0SBram Moolenaar      'let w:var = 777',
1722d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1723d72c1bf0SBram Moolenaar      ])
1724d72c1bf0SBram Moolenaar
1725d72c1bf0SBram Moolenaar  CheckScriptFailure([
1726d72c1bf0SBram Moolenaar      'vim9script',
1727d72c1bf0SBram Moolenaar      'let g:var = 123',
172832e35117SBram Moolenaar      'unlet g:var# comment1',
1729d72c1bf0SBram Moolenaar      ], 'E108:')
1730d72c1bf0SBram Moolenaar
1731d72c1bf0SBram Moolenaar  CheckScriptFailure([
1732d72c1bf0SBram Moolenaar      'let g:var = 123',
1733d72c1bf0SBram Moolenaar      'unlet g:var # something',
1734d72c1bf0SBram Moolenaar      ], 'E488:')
1735faac4104SBram Moolenaar
1736faac4104SBram Moolenaar  CheckScriptSuccess([
1737faac4104SBram Moolenaar      'vim9script',
173832e35117SBram Moolenaar      'if 1 # comment2',
1739faac4104SBram Moolenaar      '  echo "yes"',
1740faac4104SBram Moolenaar      'elseif 2 #comment',
1741faac4104SBram Moolenaar      '  echo "no"',
1742faac4104SBram Moolenaar      'endif',
1743faac4104SBram Moolenaar      ])
1744faac4104SBram Moolenaar
1745faac4104SBram Moolenaar  CheckScriptFailure([
1746faac4104SBram Moolenaar      'vim9script',
174732e35117SBram Moolenaar      'if 1# comment3',
1748faac4104SBram Moolenaar      '  echo "yes"',
1749faac4104SBram Moolenaar      'endif',
1750faac4104SBram Moolenaar      ], 'E15:')
1751faac4104SBram Moolenaar
1752faac4104SBram Moolenaar  CheckScriptFailure([
1753faac4104SBram Moolenaar      'vim9script',
175432e35117SBram Moolenaar      'if 0 # comment4',
1755faac4104SBram Moolenaar      '  echo "yes"',
1756faac4104SBram Moolenaar      'elseif 2#comment',
1757faac4104SBram Moolenaar      '  echo "no"',
1758faac4104SBram Moolenaar      'endif',
1759faac4104SBram Moolenaar      ], 'E15:')
1760faac4104SBram Moolenaar
1761faac4104SBram Moolenaar  CheckScriptSuccess([
1762faac4104SBram Moolenaar      'vim9script',
176332e35117SBram Moolenaar      'let v = 1 # comment5',
1764faac4104SBram Moolenaar      ])
1765faac4104SBram Moolenaar
1766faac4104SBram Moolenaar  CheckScriptFailure([
1767faac4104SBram Moolenaar      'vim9script',
176832e35117SBram Moolenaar      'let v = 1# comment6',
176932e35117SBram Moolenaar      ], 'E15:')
1770faac4104SBram Moolenaar
1771faac4104SBram Moolenaar  CheckScriptSuccess([
1772faac4104SBram Moolenaar      'vim9script',
1773faac4104SBram Moolenaar      'new'
1774faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1775faac4104SBram Moolenaar      '$',
1776faac4104SBram Moolenaar      'dsearch /pat/ #comment',
1777faac4104SBram Moolenaar      'bwipe!',
1778faac4104SBram Moolenaar      ])
1779faac4104SBram Moolenaar
1780faac4104SBram Moolenaar  CheckScriptFailure([
1781faac4104SBram Moolenaar      'vim9script',
1782faac4104SBram Moolenaar      'new'
1783faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1784faac4104SBram Moolenaar      '$',
1785faac4104SBram Moolenaar      'dsearch /pat/#comment',
1786faac4104SBram Moolenaar      'bwipe!',
1787faac4104SBram Moolenaar      ], 'E488:')
178874fae513SBram Moolenaar
178974fae513SBram Moolenaar  CheckScriptFailure([
179074fae513SBram Moolenaar      'vim9script',
179174fae513SBram Moolenaar      'func! SomeFunc()',
179274fae513SBram Moolenaar      ], 'E477:')
1793a26b9700SBram Moolenaarenddef
1794a26b9700SBram Moolenaar
17957e5bd91dSBram Moolenaardef Test_finish()
17967e5bd91dSBram Moolenaar  let lines =<< trim END
17977e5bd91dSBram Moolenaar    vim9script
17987e5bd91dSBram Moolenaar    let g:res = 'one'
17997e5bd91dSBram Moolenaar    if v:false | finish | endif
18007e5bd91dSBram Moolenaar    let g:res = 'two'
18017e5bd91dSBram Moolenaar    finish
18027e5bd91dSBram Moolenaar    let g:res = 'three'
18037e5bd91dSBram Moolenaar  END
18047e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
18057e5bd91dSBram Moolenaar  source Xfinished
18067e5bd91dSBram Moolenaar  assert_equal('two', g:res)
18077e5bd91dSBram Moolenaar
18087e5bd91dSBram Moolenaar  unlet g:res
18097e5bd91dSBram Moolenaar  delete('Xfinished')
18107e5bd91dSBram Moolenaarenddef
18117e5bd91dSBram Moolenaar
181232e35117SBram Moolenaardef Test_let_func_call()
181332e35117SBram Moolenaar  let lines =<< trim END
181432e35117SBram Moolenaar    vim9script
181532e35117SBram Moolenaar    func GetValue()
181632e35117SBram Moolenaar      if exists('g:count')
181732e35117SBram Moolenaar        let g:count += 1
181832e35117SBram Moolenaar      else
181932e35117SBram Moolenaar        let g:count = 1
182032e35117SBram Moolenaar      endif
182132e35117SBram Moolenaar      return 'this'
182232e35117SBram Moolenaar    endfunc
182332e35117SBram Moolenaar    let val: string = GetValue()
1824df671b46SBram Moolenaar    " env var is always a string
1825df671b46SBram Moolenaar    let env = $TERM
182632e35117SBram Moolenaar  END
182732e35117SBram Moolenaar  writefile(lines, 'Xfinished')
182832e35117SBram Moolenaar  source Xfinished
1829a5d0077eSBram Moolenaar  " GetValue() is not called during discovery phase
183032e35117SBram Moolenaar  assert_equal(1, g:count)
183132e35117SBram Moolenaar
183232e35117SBram Moolenaar  unlet g:count
183332e35117SBram Moolenaar  delete('Xfinished')
183432e35117SBram Moolenaarenddef
183532e35117SBram Moolenaar
183632e35117SBram Moolenaardef Test_let_missing_type()
183732e35117SBram Moolenaar  let lines =<< trim END
183832e35117SBram Moolenaar    vim9script
1839df671b46SBram Moolenaar    let var = g:unknown
1840227a69deSBram Moolenaar  END
1841822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
1842227a69deSBram Moolenaar
1843227a69deSBram Moolenaar  lines =<< trim END
1844227a69deSBram Moolenaar    vim9script
1845227a69deSBram Moolenaar    let nr: number = 123
1846227a69deSBram Moolenaar    let var = nr
1847227a69deSBram Moolenaar  END
1848822ba247SBram Moolenaar  CheckScriptSuccess(lines)
184932e35117SBram Moolenaarenddef
185032e35117SBram Moolenaar
1851c82a5b5dSBram Moolenaardef Test_let_declaration()
1852c82a5b5dSBram Moolenaar  let lines =<< trim END
1853c82a5b5dSBram Moolenaar    vim9script
1854c82a5b5dSBram Moolenaar    let var: string
1855c82a5b5dSBram Moolenaar    g:var_uninit = var
1856c82a5b5dSBram Moolenaar    var = 'text'
1857c82a5b5dSBram Moolenaar    g:var_test = var
1858984dddbeSBram Moolenaar    " prefixing s: is optional
1859984dddbeSBram Moolenaar    s:var = 'prefixed'
1860984dddbeSBram Moolenaar    g:var_prefixed = s:var
1861984dddbeSBram Moolenaar
1862984dddbeSBram Moolenaar    let s:other: number
1863984dddbeSBram Moolenaar    other = 1234
1864984dddbeSBram Moolenaar    g:other_var = other
1865c82a5b5dSBram Moolenaar  END
1866c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
1867c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
1868c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
1869984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
1870984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
1871c82a5b5dSBram Moolenaar
1872c82a5b5dSBram Moolenaar  unlet g:var_uninit
1873c82a5b5dSBram Moolenaar  unlet g:var_test
1874984dddbeSBram Moolenaar  unlet g:var_prefixed
1875984dddbeSBram Moolenaar  unlet g:other_var
1876c82a5b5dSBram Moolenaarenddef
1877c82a5b5dSBram Moolenaar
187834db91f7SBram Moolenaardef Test_let_type_check()
187934db91f7SBram Moolenaar  let lines =<< trim END
188034db91f7SBram Moolenaar    vim9script
188134db91f7SBram Moolenaar    let var: string
188234db91f7SBram Moolenaar    var = 1234
188334db91f7SBram Moolenaar  END
188434db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
1885984dddbeSBram Moolenaar
1886984dddbeSBram Moolenaar  lines =<< trim END
1887984dddbeSBram Moolenaar    vim9script
1888984dddbeSBram Moolenaar    let var:string
1889984dddbeSBram Moolenaar  END
1890984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
189134db91f7SBram Moolenaarenddef
189234db91f7SBram Moolenaar
1893a5d0077eSBram Moolenaardef Test_forward_declaration()
1894a5d0077eSBram Moolenaar  let lines =<< trim END
1895a5d0077eSBram Moolenaar    vim9script
1896a5d0077eSBram Moolenaar    def GetValue(): string
1897a5d0077eSBram Moolenaar      return theVal
1898a5d0077eSBram Moolenaar    enddef
1899a5d0077eSBram Moolenaar    let theVal = 'something'
1900822ba247SBram Moolenaar    g:initVal = GetValue()
1901a5d0077eSBram Moolenaar    theVal = 'else'
1902a5d0077eSBram Moolenaar    g:laterVal = GetValue()
1903a5d0077eSBram Moolenaar  END
1904a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
1905a5d0077eSBram Moolenaar  source Xforward
1906a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
1907a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
1908a5d0077eSBram Moolenaar
1909a5d0077eSBram Moolenaar  unlet g:initVal
1910a5d0077eSBram Moolenaar  unlet g:laterVal
1911a5d0077eSBram Moolenaar  delete('Xforward')
1912a5d0077eSBram Moolenaarenddef
1913a5d0077eSBram Moolenaar
19149721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
19159721fb4eSBram Moolenaar  let legacy_lines =<< trim END
19169721fb4eSBram Moolenaar    source Xvim9_script.vim
19179721fb4eSBram Moolenaar
19189721fb4eSBram Moolenaar    call assert_false(exists('local'))
19199721fb4eSBram Moolenaar    call assert_false(exists('exported'))
19209721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
19219721fb4eSBram Moolenaar    call assert_equal('global', global)
19229721fb4eSBram Moolenaar    call assert_equal('global', g:global)
19239721fb4eSBram Moolenaar
19249721fb4eSBram Moolenaar    " imported variable becomes script-local
19259721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
19269721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
19279721fb4eSBram Moolenaar    call assert_false(exists('exported'))
19289721fb4eSBram Moolenaar
19299721fb4eSBram Moolenaar    " imported function becomes script-local
19309721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
19319721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
19329721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
19339721fb4eSBram Moolenaar  END
19349721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
19359721fb4eSBram Moolenaar
19369721fb4eSBram Moolenaar  let vim9_lines =<< trim END
19379721fb4eSBram Moolenaar    vim9script
19389721fb4eSBram Moolenaar    let local = 'local'
19399721fb4eSBram Moolenaar    g:global = 'global'
19409721fb4eSBram Moolenaar    export let exported = 'exported'
19419721fb4eSBram Moolenaar    export def GetText(): string
19429721fb4eSBram Moolenaar       return 'text'
19439721fb4eSBram Moolenaar    enddef
19449721fb4eSBram Moolenaar  END
19459721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
19469721fb4eSBram Moolenaar
19479721fb4eSBram Moolenaar  source Xlegacy_script.vim
19489721fb4eSBram Moolenaar
19499721fb4eSBram Moolenaar  assert_equal('global', g:global)
19509721fb4eSBram Moolenaar"  unlet g:global
19519721fb4eSBram Moolenaar
19529721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
19539721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
19549721fb4eSBram Moolenaarenddef
1955a5d0077eSBram Moolenaar
1956585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1957585fea7bSBram Moolenaardef Test_substitute_cmd()
1958585fea7bSBram Moolenaar  new
1959585fea7bSBram Moolenaar  setline(1, 'something')
1960585fea7bSBram Moolenaar  :substitute(some(other(
1961585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1962585fea7bSBram Moolenaar  bwipe!
1963585fea7bSBram Moolenaar
1964585fea7bSBram Moolenaar  " also when the context is Vim9 script
1965585fea7bSBram Moolenaar  let lines =<< trim END
1966585fea7bSBram Moolenaar    vim9script
1967585fea7bSBram Moolenaar    new
1968585fea7bSBram Moolenaar    setline(1, 'something')
1969585fea7bSBram Moolenaar    :substitute(some(other(
1970585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1971585fea7bSBram Moolenaar    bwipe!
1972585fea7bSBram Moolenaar  END
1973585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1974585fea7bSBram Moolenaar  source Xvim9lines
1975585fea7bSBram Moolenaar
1976585fea7bSBram Moolenaar  delete('Xvim9lines')
1977585fea7bSBram Moolenaarenddef
1978585fea7bSBram Moolenaar
19798a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1980