18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
78a7d6542SBram Moolenaar
88a7d6542SBram Moolenaardef Test_syntax()
98a7d6542SBram Moolenaar  let var = 234
108a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
118a7d6542SBram Moolenaarenddef
128a7d6542SBram Moolenaar
136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
146e587dcbSBram Moolenaarlet s:addToMe = 111
15401d9ffbSBram Moolenaarlet g:existing = 'yes'
16a8c17704SBram Moolenaarlet g:inc_counter = 1
17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
18a6e67e4fSBram Moolenaarlet g:alist = [7]
19a6e67e4fSBram Moolenaarlet g:astring = 'text'
206e587dcbSBram Moolenaar
218a7d6542SBram Moolenaardef Test_assignment()
228a7d6542SBram Moolenaar  let bool1: bool = true
238a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
248a7d6542SBram Moolenaar  let bool2: bool = false
258a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
268a7d6542SBram Moolenaar
27f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
28f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
291cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
30f93c7feaSBram Moolenaar
319be61bbbSBram Moolenaar  let a: number = 6
329be61bbbSBram Moolenaar  assert_equal(6, a)
339be61bbbSBram Moolenaar
3442a480bfSBram Moolenaar  if has('channel')
3542a480bfSBram Moolenaar    let chan1: channel
36fbdd08edSBram Moolenaar    let job1: job
37f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
3842a480bfSBram Moolenaar  endif
39fbdd08edSBram Moolenaar  if has('float')
40fbdd08edSBram Moolenaar    let float1: float = 3.4
41fbdd08edSBram Moolenaar  endif
425deeb3f1SBram Moolenaar  let Funky1: func
435deeb3f1SBram Moolenaar  let Funky2: func = function('len')
444c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4542a480bfSBram Moolenaar
46401d9ffbSBram Moolenaar  g:newvar = 'new'
47401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
48401d9ffbSBram Moolenaar
49401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
50401d9ffbSBram Moolenaar  g:existing = 'no'
51401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
52401d9ffbSBram Moolenaar
53b283a8a6SBram Moolenaar  v:char = 'abc'
546e587dcbSBram Moolenaar  assert_equal('abc', v:char)
55b283a8a6SBram Moolenaar
56b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
576e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
58b283a8a6SBram Moolenaar  $ENVVAR = ''
596e587dcbSBram Moolenaar
60fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
61fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
62fd1823e0SBram Moolenaar  s:addToMe += 222
63fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
640bbf722aSBram Moolenaar  s:newVar = 'new'
650bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
66a8c17704SBram Moolenaar
67a8c17704SBram Moolenaar  set ts=7
68a8c17704SBram Moolenaar  &ts += 1
69a8c17704SBram Moolenaar  assert_equal(8, &ts)
7080c34ca3SBram Moolenaar  &ts -= 3
7180c34ca3SBram Moolenaar  assert_equal(5, &ts)
7280c34ca3SBram Moolenaar  &ts *= 2
7380c34ca3SBram Moolenaar  assert_equal(10, &ts)
7480c34ca3SBram Moolenaar  &ts /= 3
7580c34ca3SBram Moolenaar  assert_equal(3, &ts)
7680c34ca3SBram Moolenaar  set ts=10
7780c34ca3SBram Moolenaar  &ts %= 4
7880c34ca3SBram Moolenaar  assert_equal(2, &ts)
79a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
80a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
81a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
82a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
83a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
84a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
85a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
86a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
87cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
88585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
8980c34ca3SBram Moolenaar  &ts = 8
90a8c17704SBram Moolenaar
91a8c17704SBram Moolenaar  g:inc_counter += 1
92a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
93a8c17704SBram Moolenaar
94a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
95a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
96a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
97a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
98a8c17704SBram Moolenaar
99a8c17704SBram Moolenaar  @a = 'areg'
100a8c17704SBram Moolenaar  @a ..= 'add'
101a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
102a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
103a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
104e69f6d04SBram Moolenaar
105e69f6d04SBram Moolenaar  v:errmsg = 'none'
106e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
107e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
108e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
109e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1105deeb3f1SBram Moolenaarenddef
1115deeb3f1SBram Moolenaar
11284370087SBram Moolenaardef Test_assignment_list()
11384370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
11484370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
11584370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
11684370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
11784370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
11884370087SBram Moolenaar
11984370087SBram Moolenaar  let listS: list<string> = []
12084370087SBram Moolenaar  let listN: list<number> = []
12184370087SBram Moolenaar
12284370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
12384370087SBram Moolenaar  list2[-1] = 99
12484370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
12584370087SBram Moolenaar  list2[-2] = 88
12684370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
12784370087SBram Moolenaar  list2[-3] = 77
12884370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
12984370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
13084370087SBram Moolenaar
13184370087SBram Moolenaar  # type becomes list<any>
13284370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
13384370087SBram Moolenaarenddef
13484370087SBram Moolenaar
13584370087SBram Moolenaardef Test_assignment_dict()
13684370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
13784370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
13884370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
13984370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
14074fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
14184370087SBram Moolenaar
14284370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
14384370087SBram Moolenaar
14484370087SBram Moolenaar  # type becomes dict<any>
14584370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
14684370087SBram Moolenaarenddef
14784370087SBram Moolenaar
148d3aac291SBram Moolenaardef Test_assignment_local()
149d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
150d3aac291SBram Moolenaar  " changed.
151d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
152d3aac291SBram Moolenaar    let b:existing = 'yes'
153d3aac291SBram Moolenaar    let w:existing = 'yes'
154d3aac291SBram Moolenaar    let t:existing = 'yes'
155d3aac291SBram Moolenaar
156d3aac291SBram Moolenaar    def Test_assignment_local_internal()
157d3aac291SBram Moolenaar      b:newvar = 'new'
158d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
159d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
160d3aac291SBram Moolenaar      b:existing = 'no'
161d3aac291SBram Moolenaar      assert_equal('no', b:existing)
162396f3138SBram Moolenaar      b:existing ..= 'NO'
163396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
164d3aac291SBram Moolenaar
165d3aac291SBram Moolenaar      w:newvar = 'new'
166d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
167d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
168d3aac291SBram Moolenaar      w:existing = 'no'
169d3aac291SBram Moolenaar      assert_equal('no', w:existing)
170396f3138SBram Moolenaar      w:existing ..= 'NO'
171396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
172d3aac291SBram Moolenaar
173d3aac291SBram Moolenaar      t:newvar = 'new'
174d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
175d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
176d3aac291SBram Moolenaar      t:existing = 'no'
177d3aac291SBram Moolenaar      assert_equal('no', t:existing)
178396f3138SBram Moolenaar      t:existing ..= 'NO'
179396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
180d3aac291SBram Moolenaar    enddef
181d3aac291SBram Moolenaar    call Test_assignment_local_internal()
182d3aac291SBram Moolenaar  END
183d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
184d3aac291SBram Moolenaarenddef
185d3aac291SBram Moolenaar
1865deeb3f1SBram Moolenaardef Test_assignment_default()
187e69f6d04SBram Moolenaar
188cb711abfSBram Moolenaar  # Test default values.
189e69f6d04SBram Moolenaar  let thebool: bool
190e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
191e69f6d04SBram Moolenaar
192e69f6d04SBram Moolenaar  let thenumber: number
193e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
194e69f6d04SBram Moolenaar
195e69f6d04SBram Moolenaar  if has('float')
196e69f6d04SBram Moolenaar    let thefloat: float
197e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
198e69f6d04SBram Moolenaar  endif
199e69f6d04SBram Moolenaar
200e69f6d04SBram Moolenaar  let thestring: string
201e69f6d04SBram Moolenaar  assert_equal('', thestring)
202e69f6d04SBram Moolenaar
203e69f6d04SBram Moolenaar  let theblob: blob
204e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
205e69f6d04SBram Moolenaar
2065deeb3f1SBram Moolenaar  let Thefunc: func
2075deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
208e69f6d04SBram Moolenaar
209e69f6d04SBram Moolenaar  let thelist: list<any>
210e69f6d04SBram Moolenaar  assert_equal([], thelist)
211e69f6d04SBram Moolenaar
212e69f6d04SBram Moolenaar  let thedict: dict<any>
213e69f6d04SBram Moolenaar  assert_equal({}, thedict)
214e69f6d04SBram Moolenaar
2152c869deeSBram Moolenaar  if has('channel')
216e69f6d04SBram Moolenaar    let thejob: job
217e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
218e69f6d04SBram Moolenaar
219e69f6d04SBram Moolenaar    let thechannel: channel
220e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
2212c869deeSBram Moolenaar  endif
222585fea7bSBram Moolenaar
223585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
224585fea7bSBram Moolenaar  assert_equal(5678, nr)
2258a7d6542SBram Moolenaarenddef
2268a7d6542SBram Moolenaar
22747a519a9SBram Moolenaardef Test_assignment_var_list()
22847a519a9SBram Moolenaar  let v1: string
22947a519a9SBram Moolenaar  let v2: string
2309af78769SBram Moolenaar  let vrem: list<string>
2319af78769SBram Moolenaar  [v1] = ['aaa']
2329af78769SBram Moolenaar  assert_equal('aaa', v1)
2339af78769SBram Moolenaar
23447a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
23547a519a9SBram Moolenaar  assert_equal('one', v1)
23647a519a9SBram Moolenaar  assert_equal('two', v2)
2379af78769SBram Moolenaar
2389af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
2399af78769SBram Moolenaar  assert_equal('one', v1)
2409af78769SBram Moolenaar  assert_equal('two', v2)
2419af78769SBram Moolenaar  assert_equal([], vrem)
2429af78769SBram Moolenaar
2439af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
2449af78769SBram Moolenaar  assert_equal('one', v1)
2459af78769SBram Moolenaar  assert_equal('two', v2)
2469af78769SBram Moolenaar  assert_equal(['three'], vrem)
24747a519a9SBram Moolenaarenddef
24847a519a9SBram Moolenaar
249cab27678SBram Moolenaardef Mess(): string
250cab27678SBram Moolenaar  v:foldstart = 123
251cab27678SBram Moolenaar  return 'xxx'
252cab27678SBram Moolenaarenddef
253cab27678SBram Moolenaar
254d72c1bf0SBram Moolenaardef Test_assignment_failure()
2558a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
2568a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
2578a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
2588a7d6542SBram Moolenaar
2598a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
2608a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
2618a7d6542SBram Moolenaar
2629af78769SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
2639af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
2649af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
2659af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
2669af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
2679af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
2689af78769SBram Moolenaar                            'let y: number',
2699af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
2709af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
2719af78769SBram Moolenaar                            'let y: number',
2729af78769SBram Moolenaar                            'let z: list<number>',
2739af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
2749be61bbbSBram Moolenaar
275e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
2769be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
2779be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
2789be61bbbSBram Moolenaar
2799be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
2809be61bbbSBram Moolenaar
2819be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
2829be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
2839be61bbbSBram Moolenaar
2849be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
285d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
286d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
287d3aac291SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1080:')
2889be61bbbSBram Moolenaar
2899be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2909be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2919be61bbbSBram Moolenaar
292822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
29333fa29cfSBram Moolenaar
2948a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2958a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2968a7d6542SBram Moolenaar
2978a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2988a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2998a7d6542SBram Moolenaar
3008a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
3018a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
30242a480bfSBram Moolenaar
303d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
30442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
305cab27678SBram Moolenaar
306cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
307cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
308d72c1bf0SBram Moolenaarenddef
309d72c1bf0SBram Moolenaar
310d72c1bf0SBram Moolenaardef Test_unlet()
311d72c1bf0SBram Moolenaar  g:somevar = 'yes'
312d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
313d72c1bf0SBram Moolenaar  unlet g:somevar
314d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
315d72c1bf0SBram Moolenaar  unlet! g:somevar
316d72c1bf0SBram Moolenaar
317d72c1bf0SBram Moolenaar  call CheckScriptFailure([
318d72c1bf0SBram Moolenaar        'vim9script',
319d72c1bf0SBram Moolenaar        'let svar = 123',
320d72c1bf0SBram Moolenaar        'unlet svar',
321d72c1bf0SBram Moolenaar        ], 'E1081:')
322d72c1bf0SBram Moolenaar  call CheckScriptFailure([
323d72c1bf0SBram Moolenaar        'vim9script',
324d72c1bf0SBram Moolenaar        'let svar = 123',
325d72c1bf0SBram Moolenaar        'unlet s:svar',
326d72c1bf0SBram Moolenaar        ], 'E1081:')
327d72c1bf0SBram Moolenaar  call CheckScriptFailure([
328d72c1bf0SBram Moolenaar        'vim9script',
329d72c1bf0SBram Moolenaar        'let svar = 123',
330d72c1bf0SBram Moolenaar        'def Func()',
331d72c1bf0SBram Moolenaar        '  unlet svar',
332d72c1bf0SBram Moolenaar        'enddef',
333822ba247SBram Moolenaar        'defcompile',
334d72c1bf0SBram Moolenaar        ], 'E1081:')
335d72c1bf0SBram Moolenaar  call CheckScriptFailure([
336d72c1bf0SBram Moolenaar        'vim9script',
337d72c1bf0SBram Moolenaar        'let svar = 123',
338d72c1bf0SBram Moolenaar        'def Func()',
339d72c1bf0SBram Moolenaar        '  unlet s:svar',
340d72c1bf0SBram Moolenaar        'enddef',
341822ba247SBram Moolenaar        'defcompile',
342d72c1bf0SBram Moolenaar        ], 'E1081:')
3437bdaea6eSBram Moolenaar
3447bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
3457bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
3467bdaea6eSBram Moolenaar  unlet $ENVVAR
3477bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
348d72c1bf0SBram Moolenaarenddef
349599c89c8SBram Moolenaar
3504c17ad94SBram Moolenaardef Test_delfunction()
3514c17ad94SBram Moolenaar  " Check function is defined in script namespace
3524c17ad94SBram Moolenaar  CheckScriptSuccess([
3534c17ad94SBram Moolenaar      'vim9script',
3544c17ad94SBram Moolenaar      'func CheckMe()',
3554c17ad94SBram Moolenaar      '  return 123',
3564c17ad94SBram Moolenaar      'endfunc',
3574c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
3584c17ad94SBram Moolenaar      ])
3594c17ad94SBram Moolenaar
3604c17ad94SBram Moolenaar  " Check function in script namespace cannot be deleted
3614c17ad94SBram Moolenaar  CheckScriptFailure([
3624c17ad94SBram Moolenaar      'vim9script',
3634c17ad94SBram Moolenaar      'func DeleteMe1()',
3644c17ad94SBram Moolenaar      'endfunc',
3654c17ad94SBram Moolenaar      'delfunction DeleteMe1',
3664c17ad94SBram Moolenaar      ], 'E1084:')
3674c17ad94SBram Moolenaar  CheckScriptFailure([
3684c17ad94SBram Moolenaar      'vim9script',
3694c17ad94SBram Moolenaar      'func DeleteMe2()',
3704c17ad94SBram Moolenaar      'endfunc',
3714c17ad94SBram Moolenaar      'def DoThat()',
3724c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
3734c17ad94SBram Moolenaar      'enddef',
3744c17ad94SBram Moolenaar      'DoThat()',
3754c17ad94SBram Moolenaar      ], 'E1084:')
3764c17ad94SBram Moolenaar  CheckScriptFailure([
3774c17ad94SBram Moolenaar      'vim9script',
3784c17ad94SBram Moolenaar      'def DeleteMe3()',
3794c17ad94SBram Moolenaar      'enddef',
3804c17ad94SBram Moolenaar      'delfunction DeleteMe3',
3814c17ad94SBram Moolenaar      ], 'E1084:')
3824c17ad94SBram Moolenaar  CheckScriptFailure([
3834c17ad94SBram Moolenaar      'vim9script',
3844c17ad94SBram Moolenaar      'def DeleteMe4()',
3854c17ad94SBram Moolenaar      'enddef',
3864c17ad94SBram Moolenaar      'def DoThat()',
3874c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
3884c17ad94SBram Moolenaar      'enddef',
3894c17ad94SBram Moolenaar      'DoThat()',
3904c17ad94SBram Moolenaar      ], 'E1084:')
3914c17ad94SBram Moolenaarenddef
3924c17ad94SBram Moolenaar
393599c89c8SBram Moolenaarfunc Test_wrong_type()
394599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
395599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
396599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
397599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
398599c89c8SBram Moolenaar
399599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
400599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
40142a480bfSBram Moolenaar
40242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
40342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
40442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
40542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
40642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
40742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
40842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
40942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
41042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
41142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
41242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
413a0a9f43aSBram Moolenaar
414a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
415a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4168a7d6542SBram Moolenaarendfunc
4178a7d6542SBram Moolenaar
4188a7d6542SBram Moolenaarfunc Test_const()
4198a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
4208a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
4218a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
4229be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
4238a7d6542SBram Moolenaarendfunc
4248a7d6542SBram Moolenaar
4258a7d6542SBram Moolenaardef Test_block()
4268a7d6542SBram Moolenaar  let outer = 1
4278a7d6542SBram Moolenaar  {
4288a7d6542SBram Moolenaar    let inner = 2
4298a7d6542SBram Moolenaar    assert_equal(1, outer)
4308a7d6542SBram Moolenaar    assert_equal(2, inner)
4318a7d6542SBram Moolenaar  }
4328a7d6542SBram Moolenaar  assert_equal(1, outer)
4338a7d6542SBram Moolenaarenddef
4348a7d6542SBram Moolenaar
4358a7d6542SBram Moolenaarfunc Test_block_failure()
4368a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
437585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
438585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
4398a7d6542SBram Moolenaarendfunc
4408a7d6542SBram Moolenaar
441585fea7bSBram Moolenaardef Test_cmd_modifier()
442585fea7bSBram Moolenaar  tab echo '0'
443585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
444585fea7bSBram Moolenaarenddef
445585fea7bSBram Moolenaar
4468a7d6542SBram Moolenaardef Test_try_catch()
4478a7d6542SBram Moolenaar  let l = []
4487a092245SBram Moolenaar  try # comment
4498a7d6542SBram Moolenaar    add(l, '1')
4508a7d6542SBram Moolenaar    throw 'wrong'
4518a7d6542SBram Moolenaar    add(l, '2')
4527a092245SBram Moolenaar  catch # comment
4538a7d6542SBram Moolenaar    add(l, v:exception)
4547a092245SBram Moolenaar  finally # comment
4558a7d6542SBram Moolenaar    add(l, '3')
4567a092245SBram Moolenaar  endtry # comment
4578a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4588a7d6542SBram Moolenaarenddef
4598a7d6542SBram Moolenaar
460257cc5eeSBram Moolenaardef ThrowFromDef()
461a72cfb80SBram Moolenaar  throw "getout" # comment
462257cc5eeSBram Moolenaarenddef
463257cc5eeSBram Moolenaar
464257cc5eeSBram Moolenaarfunc CatchInFunc()
465257cc5eeSBram Moolenaar  try
466257cc5eeSBram Moolenaar    call ThrowFromDef()
467257cc5eeSBram Moolenaar  catch
468257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
469257cc5eeSBram Moolenaar  endtry
470257cc5eeSBram Moolenaarendfunc
471257cc5eeSBram Moolenaar
472257cc5eeSBram Moolenaardef CatchInDef()
473257cc5eeSBram Moolenaar  try
474257cc5eeSBram Moolenaar    ThrowFromDef()
475257cc5eeSBram Moolenaar  catch
476257cc5eeSBram Moolenaar    g:thrown_def = v:exception
477257cc5eeSBram Moolenaar  endtry
478257cc5eeSBram Moolenaarenddef
479257cc5eeSBram Moolenaar
480f575adffSBram Moolenaardef ReturnFinally(): string
481f575adffSBram Moolenaar  try
482f575adffSBram Moolenaar    return 'intry'
483f575adffSBram Moolenaar  finally
484f575adffSBram Moolenaar    g:in_finally = 'finally'
485f575adffSBram Moolenaar  endtry
486f575adffSBram Moolenaar  return 'end'
487f575adffSBram Moolenaarenddef
488f575adffSBram Moolenaar
489257cc5eeSBram Moolenaardef Test_try_catch_nested()
490257cc5eeSBram Moolenaar  CatchInFunc()
491257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
492257cc5eeSBram Moolenaar
493257cc5eeSBram Moolenaar  CatchInDef()
494257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
495f575adffSBram Moolenaar
496f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
497f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
498f575adffSBram Moolenaarenddef
499f575adffSBram Moolenaar
500f575adffSBram Moolenaardef Test_try_catch_match()
501f575adffSBram Moolenaar  let seq = 'a'
502f575adffSBram Moolenaar  try
503f575adffSBram Moolenaar    throw 'something'
504f575adffSBram Moolenaar  catch /nothing/
505f575adffSBram Moolenaar    seq ..= 'x'
506f575adffSBram Moolenaar  catch /some/
507f575adffSBram Moolenaar    seq ..= 'b'
508f575adffSBram Moolenaar  catch /asdf/
509f575adffSBram Moolenaar    seq ..= 'x'
510e8c4abbbSBram Moolenaar  catch ?a\?sdf?
511e8c4abbbSBram Moolenaar    seq ..= 'y'
512f575adffSBram Moolenaar  finally
513f575adffSBram Moolenaar    seq ..= 'c'
514f575adffSBram Moolenaar  endtry
515f575adffSBram Moolenaar  assert_equal('abc', seq)
516257cc5eeSBram Moolenaarenddef
517257cc5eeSBram Moolenaar
518e8c4abbbSBram Moolenaardef Test_try_catch_fails()
519e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
520e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
521e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
522585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
523585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
524585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
525585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
526585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
527585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
528585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
529585fea7bSBram Moolenaar
530a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
531585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
532e8c4abbbSBram Moolenaarenddef
533e8c4abbbSBram Moolenaar
5342a1381c3SBram Moolenaarif has('channel')
53540ee466cSBram Moolenaar  let someJob = test_null_job()
53640ee466cSBram Moolenaar
53740ee466cSBram Moolenaar  def FuncWithError()
53840ee466cSBram Moolenaar    echomsg g:someJob
53940ee466cSBram Moolenaar  enddef
54040ee466cSBram Moolenaar
54140ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
54240ee466cSBram Moolenaar    try
54340ee466cSBram Moolenaar      call FuncWithError()
54440ee466cSBram Moolenaar    catch
54540ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
54640ee466cSBram Moolenaar    endtry
54740ee466cSBram Moolenaar  endfunc
5482a1381c3SBram Moolenaarendif
54940ee466cSBram Moolenaar
5508a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
5518a7d6542SBram Moolenaar  vim9script
5528a7d6542SBram Moolenaar  let name: string = 'bob'
5538a7d6542SBram Moolenaar  def Concat(arg: string): string
5548a7d6542SBram Moolenaar    return name .. arg
5558a7d6542SBram Moolenaar  enddef
556227a69deSBram Moolenaar  g:result = Concat('bie')
557227a69deSBram Moolenaar  g:localname = name
5588a7d6542SBram Moolenaar
5598a7d6542SBram Moolenaar  export const CONST = 1234
5608a7d6542SBram Moolenaar  export let exported = 9876
5616e587dcbSBram Moolenaar  export let exp_name = 'John'
5628a7d6542SBram Moolenaar  export def Exported(): string
5638a7d6542SBram Moolenaar    return 'Exported'
5648a7d6542SBram Moolenaar  enddef
5658a7d6542SBram MoolenaarEND
5668a7d6542SBram Moolenaar
5675269bd2aSBram Moolenaardef Test_vim9_import_export()
5688a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5698a7d6542SBram Moolenaar    vim9script
5708a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5718a7d6542SBram Moolenaar    g:imported = exported
5726e587dcbSBram Moolenaar    exported += 3
5736e587dcbSBram Moolenaar    g:imported_added = exported
5748a7d6542SBram Moolenaar    g:imported_func = Exported()
5756e587dcbSBram Moolenaar
5766e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5776e587dcbSBram Moolenaar    g:imported_name = exp_name
5786e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5796e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5805381c7a1SBram Moolenaar    g:imported_later = exported
5818a7d6542SBram Moolenaar  END
5828a7d6542SBram Moolenaar
5838a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5848a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5858a7d6542SBram Moolenaar
5868a7d6542SBram Moolenaar  source Ximport.vim
5878a7d6542SBram Moolenaar
5888a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5898a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5908a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5916e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5925381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5938a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5946e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5956e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5968a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5978a7d6542SBram Moolenaar
5988a7d6542SBram Moolenaar  unlet g:result
5998a7d6542SBram Moolenaar  unlet g:localname
6008a7d6542SBram Moolenaar  unlet g:imported
6016e587dcbSBram Moolenaar  unlet g:imported_added
6025381c7a1SBram Moolenaar  unlet g:imported_later
6038a7d6542SBram Moolenaar  unlet g:imported_func
6046e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
6058a7d6542SBram Moolenaar  delete('Ximport.vim')
606f2d5c240SBram Moolenaar
6075381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
6085381c7a1SBram Moolenaar    vim9script
6095381c7a1SBram Moolenaar    def ImportInDef()
6105381c7a1SBram Moolenaar      import exported from './Xexport.vim'
6115381c7a1SBram Moolenaar      g:imported = exported
6125381c7a1SBram Moolenaar      exported += 7
6135381c7a1SBram Moolenaar      g:imported_added = exported
6145381c7a1SBram Moolenaar    enddef
6155381c7a1SBram Moolenaar    ImportInDef()
6165381c7a1SBram Moolenaar  END
6175381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
6185381c7a1SBram Moolenaar  source Ximport2.vim
6195381c7a1SBram Moolenaar  " TODO: this should be 9879
6205381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
6215381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
6225381c7a1SBram Moolenaar  unlet g:imported
6235381c7a1SBram Moolenaar  unlet g:imported_added
6245381c7a1SBram Moolenaar  delete('Ximport2.vim')
6255381c7a1SBram Moolenaar
626f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
627f2d5c240SBram Moolenaar    vim9script
628f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
629f2d5c240SBram Moolenaar    def UseExport()
630f2d5c240SBram Moolenaar      g:imported = Export.exported
631f2d5c240SBram Moolenaar    enddef
632f2d5c240SBram Moolenaar    UseExport()
633f2d5c240SBram Moolenaar  END
634f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
635f2d5c240SBram Moolenaar  source Ximport.vim
6365381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
637f2d5c240SBram Moolenaar
638599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
639599c89c8SBram Moolenaar    vim9script
640599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
641599c89c8SBram Moolenaar    def Func()
642599c89c8SBram Moolenaar      let dummy = 1
643599c89c8SBram Moolenaar      let imported = Export + dummy
644599c89c8SBram Moolenaar    enddef
645822ba247SBram Moolenaar    defcompile
646599c89c8SBram Moolenaar  END
647599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
648599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
649599c89c8SBram Moolenaar
650599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
651599c89c8SBram Moolenaar    vim9script
652599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
653599c89c8SBram Moolenaar    def Func()
654599c89c8SBram Moolenaar      let imported = Export . exported
655599c89c8SBram Moolenaar    enddef
656822ba247SBram Moolenaar    defcompile
657599c89c8SBram Moolenaar  END
658599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
659599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
660599c89c8SBram Moolenaar
661599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
662599c89c8SBram Moolenaar    vim9script
663599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
664599c89c8SBram Moolenaar    def Func()
665599c89c8SBram Moolenaar      let imported = Export.
666599c89c8SBram Moolenaar    enddef
667822ba247SBram Moolenaar    defcompile
668599c89c8SBram Moolenaar  END
669599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
670599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
671599c89c8SBram Moolenaar
672f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
673f2d5c240SBram Moolenaar    vim9script
674f2d5c240SBram Moolenaar    import * from './Xexport.vim'
675f2d5c240SBram Moolenaar  END
676f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
677f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
678f2d5c240SBram Moolenaar
679fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
680fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
681fa29c8abSBram Moolenaar    vim9script
682fa29c8abSBram Moolenaar    import name from './Xexport.vim'
683fa29c8abSBram Moolenaar  END
684fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
685fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
686fa29c8abSBram Moolenaar
6875269bd2aSBram Moolenaar  " try to import something that is already defined
6885269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6895269bd2aSBram Moolenaar    vim9script
6905269bd2aSBram Moolenaar    let exported = 'something'
6915269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6925269bd2aSBram Moolenaar  END
6935269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6945269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6955269bd2aSBram Moolenaar
6965269bd2aSBram Moolenaar  " try to import something that is already defined
6975269bd2aSBram Moolenaar  import_already_defined =<< trim END
6985269bd2aSBram Moolenaar    vim9script
6995269bd2aSBram Moolenaar    let exported = 'something'
7005269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
7015269bd2aSBram Moolenaar  END
7025269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
7035269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
7045269bd2aSBram Moolenaar
7055269bd2aSBram Moolenaar  " try to import something that is already defined
7065269bd2aSBram Moolenaar  import_already_defined =<< trim END
7075269bd2aSBram Moolenaar    vim9script
7085269bd2aSBram Moolenaar    let exported = 'something'
7095269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
7105269bd2aSBram Moolenaar  END
7115269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
7125269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
7135269bd2aSBram Moolenaar
714fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
715fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
716fa29c8abSBram Moolenaar    vim9script
717fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
718fa29c8abSBram Moolenaar  END
719fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
720fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
721fa29c8abSBram Moolenaar
722fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
723fa29c8abSBram Moolenaar    vim9script
724fa29c8abSBram Moolenaar    import name './Xexport.vim'
725fa29c8abSBram Moolenaar  END
726fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
727fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
728fa29c8abSBram Moolenaar
729fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
730fa29c8abSBram Moolenaar    vim9script
731fa29c8abSBram Moolenaar    import name from Xexport.vim
732fa29c8abSBram Moolenaar  END
733fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
734fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
735fa29c8abSBram Moolenaar
736fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
737fa29c8abSBram Moolenaar    vim9script
738fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
739fa29c8abSBram Moolenaar  END
740fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
741fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
742fa29c8abSBram Moolenaar
743fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
744fa29c8abSBram Moolenaar    vim9script
745fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
746fa29c8abSBram Moolenaar  END
7475269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
7485269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
749fa29c8abSBram Moolenaar
750f2d5c240SBram Moolenaar  delete('Ximport.vim')
7515269bd2aSBram Moolenaar  delete('Ximport3.vim')
7528a7d6542SBram Moolenaar  delete('Xexport.vim')
7538a7d6542SBram Moolenaar
754750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
755750802b5SBram Moolenaar  set cpo&vi
756750802b5SBram Moolenaar  let cpo_before = &cpo
757750802b5SBram Moolenaar  let lines =<< trim END
758750802b5SBram Moolenaar    vim9script
759750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
760750802b5SBram Moolenaar  END
761750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
762750802b5SBram Moolenaar  source Xvim9_script
763750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
764750802b5SBram Moolenaar  set cpo&vim
765750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
766750802b5SBram Moolenaar  delete('Xvim9_script')
767750802b5SBram Moolenaarenddef
768750802b5SBram Moolenaar
769750802b5SBram Moolenaardef Test_vim9script_fails()
7708a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7718a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
772750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
7739721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
774750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
775750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
776750802b5SBram Moolenaar
777750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
778a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
7798a7d6542SBram Moolenaarenddef
7808a7d6542SBram Moolenaar
781f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
782101f4810SBram Moolenaar  CheckRunVimInTerminal
783101f4810SBram Moolenaar
784*9bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
785*9bb3eb3eSBram Moolenaar  call Run_Test_import_fails_without_script()
786*9bb3eb3eSBram Moolenaarendfunc
787*9bb3eb3eSBram Moolenaar
788*9bb3eb3eSBram Moolenaardef Run_Test_import_fails_without_script()
789101f4810SBram Moolenaar  let export =<< trim END
790101f4810SBram Moolenaar    vim9script
791101f4810SBram Moolenaar    export def Foo(): number
792101f4810SBram Moolenaar        return 0
793101f4810SBram Moolenaar    enddef
794101f4810SBram Moolenaar  END
795*9bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
796101f4810SBram Moolenaar
797*9bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
798*9bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
799*9bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
800101f4810SBram Moolenaar
801*9bb3eb3eSBram Moolenaar  delete('Xexport.vim')
802*9bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
803*9bb3eb3eSBram Moolenaarenddef
804101f4810SBram Moolenaar
8054c17ad94SBram Moolenaardef Test_vim9script_reload_import()
8068a7d6542SBram Moolenaar  let lines =<< trim END
8078a7d6542SBram Moolenaar    vim9script
8088a7d6542SBram Moolenaar    const var = ''
8098a7d6542SBram Moolenaar    let valone = 1234
8108a7d6542SBram Moolenaar    def MyFunc(arg: string)
8118a7d6542SBram Moolenaar       valone = 5678
8128a7d6542SBram Moolenaar    enddef
8138a7d6542SBram Moolenaar  END
8148a7d6542SBram Moolenaar  let morelines =<< trim END
8158a7d6542SBram Moolenaar    let valtwo = 222
8168a7d6542SBram Moolenaar    export def GetValtwo(): number
8178a7d6542SBram Moolenaar      return valtwo
8188a7d6542SBram Moolenaar    enddef
8198a7d6542SBram Moolenaar  END
82003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
8218a7d6542SBram Moolenaar  source Xreload.vim
8228a7d6542SBram Moolenaar  source Xreload.vim
8238a7d6542SBram Moolenaar  source Xreload.vim
8248a7d6542SBram Moolenaar
8258a7d6542SBram Moolenaar  let testlines =<< trim END
8268a7d6542SBram Moolenaar    vim9script
8278a7d6542SBram Moolenaar    def TheFunc()
8288a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8298a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8308a7d6542SBram Moolenaar    enddef
8318a7d6542SBram Moolenaar    TheFunc()
8328a7d6542SBram Moolenaar  END
8338a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8348a7d6542SBram Moolenaar  source Ximport.vim
8358a7d6542SBram Moolenaar
83603afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
83703afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
8388a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8398a7d6542SBram Moolenaar  source Ximport.vim
8408a7d6542SBram Moolenaar
8418a7d6542SBram Moolenaar  " cannot declare a var twice
8428a7d6542SBram Moolenaar  lines =<< trim END
8438a7d6542SBram Moolenaar    vim9script
8448a7d6542SBram Moolenaar    let valone = 1234
8458a7d6542SBram Moolenaar    let valone = 5678
8468a7d6542SBram Moolenaar  END
8478a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8488a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8498a7d6542SBram Moolenaar
8508a7d6542SBram Moolenaar  delete('Xreload.vim')
8518a7d6542SBram Moolenaar  delete('Ximport.vim')
8528a7d6542SBram Moolenaarenddef
8538a7d6542SBram Moolenaar
8544c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
8554c17ad94SBram Moolenaar  let first_lines =<< trim END
8564c17ad94SBram Moolenaar    vim9script
8574c17ad94SBram Moolenaar    def FuncYes(): string
8584c17ad94SBram Moolenaar      return 'yes'
8594c17ad94SBram Moolenaar    enddef
8604c17ad94SBram Moolenaar  END
86103afdcf1SBram Moolenaar  let withno_lines =<< trim END
8624c17ad94SBram Moolenaar    def FuncNo(): string
8634c17ad94SBram Moolenaar      return 'no'
8644c17ad94SBram Moolenaar    enddef
8654c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
8664c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
8674c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
86803afdcf1SBram Moolenaar    enddef
86903afdcf1SBram Moolenaar  END
87003afdcf1SBram Moolenaar  let nono_lines =<< trim END
87103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
87203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
8734c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
8744c17ad94SBram Moolenaar    enddef
8754c17ad94SBram Moolenaar  END
8764c17ad94SBram Moolenaar
8774c17ad94SBram Moolenaar  # FuncNo() is defined
87803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8794c17ad94SBram Moolenaar  source Xreloaded.vim
8804c17ad94SBram Moolenaar  g:DoCheck(true)
8814c17ad94SBram Moolenaar
8824c17ad94SBram Moolenaar  # FuncNo() is not redefined
88303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
8844c17ad94SBram Moolenaar  source Xreloaded.vim
88503afdcf1SBram Moolenaar  g:DoCheck()
8864c17ad94SBram Moolenaar
8874c17ad94SBram Moolenaar  # FuncNo() is back
88803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8894c17ad94SBram Moolenaar  source Xreloaded.vim
89003afdcf1SBram Moolenaar  g:DoCheck()
8914c17ad94SBram Moolenaar
8924c17ad94SBram Moolenaar  delete('Xreloaded.vim')
8934c17ad94SBram Moolenaarenddef
8944c17ad94SBram Moolenaar
89589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
89689483d40SBram Moolenaar  # write the script with a script-local variable
89789483d40SBram Moolenaar  let lines =<< trim END
89889483d40SBram Moolenaar    vim9script
89989483d40SBram Moolenaar    let var = 'string'
90089483d40SBram Moolenaar  END
90189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
90289483d40SBram Moolenaar  source XreloadVar.vim
90389483d40SBram Moolenaar
90489483d40SBram Moolenaar  # now write the script using the same variable locally - works
90589483d40SBram Moolenaar  lines =<< trim END
90689483d40SBram Moolenaar    vim9script
90789483d40SBram Moolenaar    def Func()
90889483d40SBram Moolenaar      let var = 'string'
90989483d40SBram Moolenaar    enddef
91089483d40SBram Moolenaar  END
91189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
91289483d40SBram Moolenaar  source XreloadVar.vim
91389483d40SBram Moolenaar
91489483d40SBram Moolenaar  delete('XreloadVar.vim')
91589483d40SBram Moolenaarenddef
91689483d40SBram Moolenaar
9178a7d6542SBram Moolenaardef Test_import_absolute()
9188a7d6542SBram Moolenaar  let import_lines = [
919e6085c53SBram Moolenaar        'vim9script',
920e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
921e6085c53SBram Moolenaar        'def UseExported()',
922e6085c53SBram Moolenaar        '  g:imported_abs = exported',
923e6085c53SBram Moolenaar        '  exported = 8888',
924e6085c53SBram Moolenaar        '  g:imported_after = exported',
925e6085c53SBram Moolenaar        'enddef',
926e6085c53SBram Moolenaar        'UseExported()',
927e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
928e6085c53SBram Moolenaar        ]
9298a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
9308a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
9318a7d6542SBram Moolenaar
9328a7d6542SBram Moolenaar  source Ximport_abs.vim
9338a7d6542SBram Moolenaar
9348a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
9354e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
936675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
937675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
938675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
939675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
940675f716eSBram Moolenaar          'exported = 8888.*' ..
941675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
942675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
943675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
944675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
945e6085c53SBram Moolenaar        g:import_disassembled)
9468a7d6542SBram Moolenaar  unlet g:imported_abs
9474e12a5dfSBram Moolenaar  unlet g:import_disassembled
9488a7d6542SBram Moolenaar
9498a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
9508a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
9518a7d6542SBram Moolenaarenddef
9528a7d6542SBram Moolenaar
9538a7d6542SBram Moolenaardef Test_import_rtp()
9548a7d6542SBram Moolenaar  let import_lines = [
955e6085c53SBram Moolenaar        'vim9script',
956e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
957e6085c53SBram Moolenaar        'g:imported_rtp = exported',
958e6085c53SBram Moolenaar        ]
9598a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
9608a7d6542SBram Moolenaar  mkdir('import')
9618a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
9628a7d6542SBram Moolenaar
9638a7d6542SBram Moolenaar  let save_rtp = &rtp
9648a7d6542SBram Moolenaar  &rtp = getcwd()
9658a7d6542SBram Moolenaar  source Ximport_rtp.vim
9668a7d6542SBram Moolenaar  &rtp = save_rtp
9678a7d6542SBram Moolenaar
9688a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
9698a7d6542SBram Moolenaar  unlet g:imported_rtp
9708a7d6542SBram Moolenaar
9718a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
97289483d40SBram Moolenaar  delete('import', 'rf')
9738a7d6542SBram Moolenaarenddef
9748a7d6542SBram Moolenaar
97525e0f586SBram Moolenaardef Test_import_compile_error()
97625e0f586SBram Moolenaar  let export_lines = [
97725e0f586SBram Moolenaar        'vim9script',
97825e0f586SBram Moolenaar        'export def ExpFunc(): string',
97925e0f586SBram Moolenaar        '  return notDefined',
98025e0f586SBram Moolenaar        'enddef',
98125e0f586SBram Moolenaar        ]
98225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
98325e0f586SBram Moolenaar
98425e0f586SBram Moolenaar  let import_lines = [
98525e0f586SBram Moolenaar        'vim9script',
98625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
98725e0f586SBram Moolenaar        'def ImpFunc()',
98825e0f586SBram Moolenaar        '  echo ExpFunc()',
98925e0f586SBram Moolenaar        'enddef',
99025e0f586SBram Moolenaar        'defcompile',
99125e0f586SBram Moolenaar        ]
99225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
99325e0f586SBram Moolenaar
99425e0f586SBram Moolenaar  try
99525e0f586SBram Moolenaar    source Ximport.vim
99625e0f586SBram Moolenaar  catch /E1001/
99725e0f586SBram Moolenaar    " Error should be fore the Xexported.vim file.
99825e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
99925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
100025e0f586SBram Moolenaar  endtry
100125e0f586SBram Moolenaar
100225e0f586SBram Moolenaar  delete('Xexported.vim')
100325e0f586SBram Moolenaar  delete('Ximport.vim')
100425e0f586SBram Moolenaarenddef
100525e0f586SBram Moolenaar
10068a7d6542SBram Moolenaardef Test_fixed_size_list()
10078a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
10088a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
10098a7d6542SBram Moolenaar  l->remove(0)
10108a7d6542SBram Moolenaar  l->add(5)
10118a7d6542SBram Moolenaar  l->insert(99, 1)
10120f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
10138a7d6542SBram Moolenaarenddef
10148a7d6542SBram Moolenaar
1015158906cfSBram Moolenaardef IfElse(what: number): string
1016158906cfSBram Moolenaar  let res = ''
1017158906cfSBram Moolenaar  if what == 1
1018158906cfSBram Moolenaar    res = "one"
1019158906cfSBram Moolenaar  elseif what == 2
1020158906cfSBram Moolenaar    res = "two"
1021a259d8d3SBram Moolenaar  else
1022158906cfSBram Moolenaar    res = "three"
1023a259d8d3SBram Moolenaar  endif
1024158906cfSBram Moolenaar  return res
1025a259d8d3SBram Moolenaarenddef
1026a259d8d3SBram Moolenaar
1027158906cfSBram Moolenaardef Test_if_elseif_else()
1028158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1029158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1030158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
10310f18b6d1SBram Moolenaarenddef
10320f18b6d1SBram Moolenaar
1033e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1034e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1035e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1036e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1037e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1038585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1039e8c4abbbSBram Moolenaarenddef
1040e8c4abbbSBram Moolenaar
10416d69bf60SBram Moolenaarlet g:bool_true = v:true
10426d69bf60SBram Moolenaarlet g:bool_false = v:false
10436d69bf60SBram Moolenaar
10446d69bf60SBram Moolenaardef Test_if_const_expr()
10456d69bf60SBram Moolenaar  let res = false
10466d69bf60SBram Moolenaar  if true ? true : false
10476d69bf60SBram Moolenaar    res = true
10486d69bf60SBram Moolenaar  endif
10496d69bf60SBram Moolenaar  assert_equal(true, res)
10506d69bf60SBram Moolenaar
1051585fea7bSBram Moolenaar  g:glob = 2
1052585fea7bSBram Moolenaar  if false
1053585fea7bSBram Moolenaar    execute('let g:glob = 3')
1054585fea7bSBram Moolenaar  endif
1055585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1056585fea7bSBram Moolenaar  if true
1057585fea7bSBram Moolenaar    execute('let g:glob = 3')
1058585fea7bSBram Moolenaar  endif
1059585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1060585fea7bSBram Moolenaar
10616d69bf60SBram Moolenaar  res = false
10626d69bf60SBram Moolenaar  if g:bool_true ? true : false
10636d69bf60SBram Moolenaar    res = true
10646d69bf60SBram Moolenaar  endif
10656d69bf60SBram Moolenaar  assert_equal(true, res)
10666d69bf60SBram Moolenaar
10676d69bf60SBram Moolenaar  res = false
10686d69bf60SBram Moolenaar  if true ? g:bool_true : false
10696d69bf60SBram Moolenaar    res = true
10706d69bf60SBram Moolenaar  endif
10716d69bf60SBram Moolenaar  assert_equal(true, res)
10726d69bf60SBram Moolenaar
10736d69bf60SBram Moolenaar  res = false
10746d69bf60SBram Moolenaar  if true ? true : g:bool_false
10756d69bf60SBram Moolenaar    res = true
10766d69bf60SBram Moolenaar  endif
10776d69bf60SBram Moolenaar  assert_equal(true, res)
10786d69bf60SBram Moolenaar
10796d69bf60SBram Moolenaar  res = false
10806d69bf60SBram Moolenaar  if true ? false : true
10816d69bf60SBram Moolenaar    res = true
10826d69bf60SBram Moolenaar  endif
10836d69bf60SBram Moolenaar  assert_equal(false, res)
10846d69bf60SBram Moolenaar
10856d69bf60SBram Moolenaar  res = false
10866d69bf60SBram Moolenaar  if false ? false : true
10876d69bf60SBram Moolenaar    res = true
10886d69bf60SBram Moolenaar  endif
10896d69bf60SBram Moolenaar  assert_equal(true, res)
10906d69bf60SBram Moolenaar
10916d69bf60SBram Moolenaar  res = false
10926d69bf60SBram Moolenaar  if false ? true : false
10936d69bf60SBram Moolenaar    res = true
10946d69bf60SBram Moolenaar  endif
10956d69bf60SBram Moolenaar  assert_equal(false, res)
10966d69bf60SBram Moolenaar
10976d69bf60SBram Moolenaar  res = false
1098e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1099e8c4abbbSBram Moolenaar    res = true
1100e8c4abbbSBram Moolenaar  endif
1101e8c4abbbSBram Moolenaar  assert_equal(false, res)
1102e8c4abbbSBram Moolenaar
1103e8c4abbbSBram Moolenaar  res = false
11046d69bf60SBram Moolenaar  if true && true
11056d69bf60SBram Moolenaar    res = true
11066d69bf60SBram Moolenaar  endif
11076d69bf60SBram Moolenaar  assert_equal(true, res)
11086d69bf60SBram Moolenaar
11096d69bf60SBram Moolenaar  res = false
11106d69bf60SBram Moolenaar  if true && false
11116d69bf60SBram Moolenaar    res = true
11126d69bf60SBram Moolenaar  endif
11136d69bf60SBram Moolenaar  assert_equal(false, res)
11146d69bf60SBram Moolenaar
11156d69bf60SBram Moolenaar  res = false
11166d69bf60SBram Moolenaar  if g:bool_true && false
11176d69bf60SBram Moolenaar    res = true
11186d69bf60SBram Moolenaar  endif
11196d69bf60SBram Moolenaar  assert_equal(false, res)
11206d69bf60SBram Moolenaar
11216d69bf60SBram Moolenaar  res = false
11226d69bf60SBram Moolenaar  if true && g:bool_false
11236d69bf60SBram Moolenaar    res = true
11246d69bf60SBram Moolenaar  endif
11256d69bf60SBram Moolenaar  assert_equal(false, res)
11266d69bf60SBram Moolenaar
11276d69bf60SBram Moolenaar  res = false
11286d69bf60SBram Moolenaar  if false && false
11296d69bf60SBram Moolenaar    res = true
11306d69bf60SBram Moolenaar  endif
11316d69bf60SBram Moolenaar  assert_equal(false, res)
11326d69bf60SBram Moolenaar
11336d69bf60SBram Moolenaar  res = false
11346d69bf60SBram Moolenaar  if true || false
11356d69bf60SBram Moolenaar    res = true
11366d69bf60SBram Moolenaar  endif
11376d69bf60SBram Moolenaar  assert_equal(true, res)
11386d69bf60SBram Moolenaar
11396d69bf60SBram Moolenaar  res = false
11406d69bf60SBram Moolenaar  if g:bool_true || false
11416d69bf60SBram Moolenaar    res = true
11426d69bf60SBram Moolenaar  endif
11436d69bf60SBram Moolenaar  assert_equal(true, res)
11446d69bf60SBram Moolenaar
11456d69bf60SBram Moolenaar  res = false
11466d69bf60SBram Moolenaar  if true || g:bool_false
11476d69bf60SBram Moolenaar    res = true
11486d69bf60SBram Moolenaar  endif
11496d69bf60SBram Moolenaar  assert_equal(true, res)
11506d69bf60SBram Moolenaar
11516d69bf60SBram Moolenaar  res = false
11526d69bf60SBram Moolenaar  if false || false
11536d69bf60SBram Moolenaar    res = true
11546d69bf60SBram Moolenaar  endif
11556d69bf60SBram Moolenaar  assert_equal(false, res)
115680c34ca3SBram Moolenaarenddef
11576d69bf60SBram Moolenaar
115880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
115980c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
116080c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1161e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1162e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
11636d69bf60SBram Moolenaarenddef
11646d69bf60SBram Moolenaar
1165ad39c094SBram Moolenaardef Test_execute_cmd()
1166ad39c094SBram Moolenaar  new
1167ad39c094SBram Moolenaar  setline(1, 'default')
1168ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1169ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1170a72cfb80SBram Moolenaar
1171a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1172a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1173a72cfb80SBram Moolenaar
1174ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1175ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1176a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1177ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1178a72cfb80SBram Moolenaar
1179ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1180ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1181a72cfb80SBram Moolenaar
1182ad39c094SBram Moolenaar  let cmd_first = 'call '
1183ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1184ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1185ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1186ad39c094SBram Moolenaar  bwipe!
1187585fea7bSBram Moolenaar
1188585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1189a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1190ad39c094SBram Moolenaarenddef
1191ad39c094SBram Moolenaar
1192ad39c094SBram Moolenaardef Test_echo_cmd()
1193a72cfb80SBram Moolenaar  echo 'some' # comment
1194585fea7bSBram Moolenaar  echon 'thing'
1195ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1196ad39c094SBram Moolenaar
1197a72cfb80SBram Moolenaar  echo "some" # comment
1198a72cfb80SBram Moolenaar  echon "thing"
1199a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1200a72cfb80SBram Moolenaar
1201ad39c094SBram Moolenaar  let str1 = 'some'
1202ad39c094SBram Moolenaar  let str2 = 'more'
1203ad39c094SBram Moolenaar  echo str1 str2
1204ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1205a72cfb80SBram Moolenaar
1206a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1207ad39c094SBram Moolenaarenddef
1208ad39c094SBram Moolenaar
1209f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1210f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1211f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1212f93c7feaSBram Moolenaar  echo 'clear'
1213f93c7feaSBram Moolenaar  1messages
1214f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1215f93c7feaSBram Moolenaar
1216f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1217f93c7feaSBram Moolenaarenddef
1218f93c7feaSBram Moolenaar
1219f93c7feaSBram Moolenaardef Test_echoerr_cmd()
122040ee466cSBram Moolenaar  try
122140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
122240ee466cSBram Moolenaar  catch
122340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
122440ee466cSBram Moolenaar  endtry
1225f93c7feaSBram Moolenaarenddef
1226f93c7feaSBram Moolenaar
122741fe0617SBram Moolenaardef Test_for_outside_of_function()
122841fe0617SBram Moolenaar  let lines =<< trim END
122941fe0617SBram Moolenaar    vim9script
123041fe0617SBram Moolenaar    new
123141fe0617SBram Moolenaar    for var in range(0, 3)
123241fe0617SBram Moolenaar      append(line('$'), var)
123341fe0617SBram Moolenaar    endfor
123441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
123541fe0617SBram Moolenaar    bwipe!
123641fe0617SBram Moolenaar  END
123741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
123841fe0617SBram Moolenaar  source Xvim9for.vim
123941fe0617SBram Moolenaar  delete('Xvim9for.vim')
124041fe0617SBram Moolenaarenddef
12418a7d6542SBram Moolenaar
1242e8c4abbbSBram Moolenaardef Test_for_loop()
1243e8c4abbbSBram Moolenaar  let result = ''
1244e8c4abbbSBram Moolenaar  for cnt in range(7)
1245e8c4abbbSBram Moolenaar    if cnt == 4
1246e8c4abbbSBram Moolenaar      break
1247e8c4abbbSBram Moolenaar    endif
1248e8c4abbbSBram Moolenaar    if cnt == 2
1249e8c4abbbSBram Moolenaar      continue
1250e8c4abbbSBram Moolenaar    endif
1251e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1252e8c4abbbSBram Moolenaar  endfor
1253e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1254e8c4abbbSBram Moolenaarenddef
1255e8c4abbbSBram Moolenaar
1256e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1257675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1258675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1259675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1260822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1261675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1262675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1263675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1264675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1265e8c4abbbSBram Moolenaarenddef
1266e8c4abbbSBram Moolenaar
1267d0df1aacSBram Moolenaardef Test_while_loop()
1268d0df1aacSBram Moolenaar  let result = ''
1269d0df1aacSBram Moolenaar  let cnt = 0
1270d0df1aacSBram Moolenaar  while cnt < 555
1271d0df1aacSBram Moolenaar    if cnt == 3
1272d0df1aacSBram Moolenaar      break
1273d0df1aacSBram Moolenaar    endif
1274d0df1aacSBram Moolenaar    cnt += 1
1275d0df1aacSBram Moolenaar    if cnt == 2
1276d0df1aacSBram Moolenaar      continue
1277d0df1aacSBram Moolenaar    endif
1278d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1279d0df1aacSBram Moolenaar  endwhile
1280d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1281d0df1aacSBram Moolenaarenddef
1282d0df1aacSBram Moolenaar
1283e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1284675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1285675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1286675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1287675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1288675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1289675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1290675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1291bd5da371SBram Moolenaarenddef
1292bd5da371SBram Moolenaar
12939645e2d9SBram Moolenaardef Test_interrupt_loop()
129497acfc78SBram Moolenaar  let caught = false
12959645e2d9SBram Moolenaar  let x = 0
129697acfc78SBram Moolenaar  try
12979645e2d9SBram Moolenaar    while 1
12989645e2d9SBram Moolenaar      x += 1
12999645e2d9SBram Moolenaar      if x == 100
13009645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
13019645e2d9SBram Moolenaar      endif
13029645e2d9SBram Moolenaar    endwhile
130397acfc78SBram Moolenaar  catch
130497acfc78SBram Moolenaar    caught = true
130597acfc78SBram Moolenaar    assert_equal(100, x)
130697acfc78SBram Moolenaar  endtry
130797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
13089645e2d9SBram Moolenaarenddef
130920431c9dSBram Moolenaar
13104fdae999SBram Moolenaardef Test_automatic_line_continuation()
13114fdae999SBram Moolenaar  let mylist = [
13124fdae999SBram Moolenaar      'one',
13134fdae999SBram Moolenaar      'two',
13144fdae999SBram Moolenaar      'three',
13154fdae999SBram Moolenaar      ] " comment
13164fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
13174fdae999SBram Moolenaar
13184fdae999SBram Moolenaar  let mydict = {
13194fdae999SBram Moolenaar      'one': 1,
13204fdae999SBram Moolenaar      'two': 2,
13214fdae999SBram Moolenaar      'three':
13224fdae999SBram Moolenaar          3,
13234fdae999SBram Moolenaar      } " comment
13244fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
13254fdae999SBram Moolenaar  mydict = #{
13262c330432SBram Moolenaar      one: 1,  # comment
13272c330432SBram Moolenaar      two:     # comment
13282c330432SBram Moolenaar           2,  # comment
13292c330432SBram Moolenaar      three: 3 # comment
13302c330432SBram Moolenaar      }
13312c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
13322c330432SBram Moolenaar  mydict = #{
13332c330432SBram Moolenaar      one: 1,
13344fdae999SBram Moolenaar      two:
13354fdae999SBram Moolenaar           2,
13362c330432SBram Moolenaar      three: 3
13374fdae999SBram Moolenaar      }
13384fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1339e6085c53SBram Moolenaar
1340e6085c53SBram Moolenaar  assert_equal(
1341e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1342e6085c53SBram Moolenaar        split('one two three')
1343e6085c53SBram Moolenaar        )
13444fdae999SBram Moolenaarenddef
13454fdae999SBram Moolenaar
13467a092245SBram Moolenaardef Test_vim9_comment()
13477a092245SBram Moolenaar  CheckScriptSuccess([
13487a092245SBram Moolenaar      'vim9script',
13497a092245SBram Moolenaar      '# something',
13507a092245SBram Moolenaar      ])
13517a092245SBram Moolenaar  CheckScriptFailure([
13527a092245SBram Moolenaar      'vim9script',
13537a092245SBram Moolenaar      ':# something',
13547a092245SBram Moolenaar      ], 'E488:')
13557a092245SBram Moolenaar  CheckScriptFailure([
13567a092245SBram Moolenaar      '# something',
13577a092245SBram Moolenaar      ], 'E488:')
13587a092245SBram Moolenaar  CheckScriptFailure([
13597a092245SBram Moolenaar      ':# something',
13607a092245SBram Moolenaar      ], 'E488:')
13617a092245SBram Moolenaar
13624a8d9f2eSBram Moolenaar  { # block start
13634a8d9f2eSBram Moolenaar  } # block end
13644a8d9f2eSBram Moolenaar  CheckDefFailure([
13654a8d9f2eSBram Moolenaar      '{# comment',
13664a8d9f2eSBram Moolenaar      ], 'E488:')
13674a8d9f2eSBram Moolenaar  CheckDefFailure([
13684a8d9f2eSBram Moolenaar      '{',
13694a8d9f2eSBram Moolenaar      '}# comment',
13704a8d9f2eSBram Moolenaar      ], 'E488:')
13714a8d9f2eSBram Moolenaar
13724a8d9f2eSBram Moolenaar  echo "yes" # comment
13734a8d9f2eSBram Moolenaar  CheckDefFailure([
13744a8d9f2eSBram Moolenaar      'echo "yes"# comment',
13754a8d9f2eSBram Moolenaar      ], 'E488:')
13767a092245SBram Moolenaar  CheckScriptSuccess([
13777a092245SBram Moolenaar      'vim9script',
13787a092245SBram Moolenaar      'echo "yes" # something',
13797a092245SBram Moolenaar      ])
13807a092245SBram Moolenaar  CheckScriptFailure([
13817a092245SBram Moolenaar      'vim9script',
13827a092245SBram Moolenaar      'echo "yes"# something',
13837a092245SBram Moolenaar      ], 'E121:')
13847a092245SBram Moolenaar  CheckScriptFailure([
13857a092245SBram Moolenaar      'vim9script',
13867a092245SBram Moolenaar      'echo# something',
13877a092245SBram Moolenaar      ], 'E121:')
13887a092245SBram Moolenaar  CheckScriptFailure([
13897a092245SBram Moolenaar      'echo "yes" # something',
13907a092245SBram Moolenaar      ], 'E121:')
13917a092245SBram Moolenaar
13924a8d9f2eSBram Moolenaar  exe "echo" # comment
13934a8d9f2eSBram Moolenaar  CheckDefFailure([
13944a8d9f2eSBram Moolenaar      'exe "echo"# comment',
13954a8d9f2eSBram Moolenaar      ], 'E488:')
13964a8d9f2eSBram Moolenaar  CheckScriptSuccess([
13974a8d9f2eSBram Moolenaar      'vim9script',
13984a8d9f2eSBram Moolenaar      'exe "echo" # something',
13994a8d9f2eSBram Moolenaar      ])
14004a8d9f2eSBram Moolenaar  CheckScriptFailure([
14014a8d9f2eSBram Moolenaar      'vim9script',
14024a8d9f2eSBram Moolenaar      'exe "echo"# something',
14034a8d9f2eSBram Moolenaar      ], 'E121:')
14044a8d9f2eSBram Moolenaar  CheckDefFailure([
14054a8d9f2eSBram Moolenaar      'exe # comment',
14064a8d9f2eSBram Moolenaar      ], 'E1015:')
14074a8d9f2eSBram Moolenaar  CheckScriptFailure([
14084a8d9f2eSBram Moolenaar      'vim9script',
14094a8d9f2eSBram Moolenaar      'exe# something',
14104a8d9f2eSBram Moolenaar      ], 'E121:')
14114a8d9f2eSBram Moolenaar  CheckScriptFailure([
14124a8d9f2eSBram Moolenaar      'exe "echo" # something',
14134a8d9f2eSBram Moolenaar      ], 'E121:')
14144a8d9f2eSBram Moolenaar
14157a092245SBram Moolenaar  CheckDefFailure([
14167a092245SBram Moolenaar      'try# comment',
14177a092245SBram Moolenaar      '  echo "yes"',
14187a092245SBram Moolenaar      'catch',
14197a092245SBram Moolenaar      'endtry',
14207a092245SBram Moolenaar      ], 'E488:')
14212c5ed4e3SBram Moolenaar  CheckScriptFailure([
14222c5ed4e3SBram Moolenaar      'vim9script',
14232c5ed4e3SBram Moolenaar      'try# comment',
14242c5ed4e3SBram Moolenaar      'echo "yes"',
14252c5ed4e3SBram Moolenaar      ], 'E488:')
14267a092245SBram Moolenaar  CheckDefFailure([
14277a092245SBram Moolenaar      'try',
1428a72cfb80SBram Moolenaar      '  throw#comment',
1429a72cfb80SBram Moolenaar      'catch',
1430a72cfb80SBram Moolenaar      'endtry',
1431a72cfb80SBram Moolenaar      ], 'E1015:')
1432a72cfb80SBram Moolenaar  CheckDefFailure([
1433a72cfb80SBram Moolenaar      'try',
1434a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1435a72cfb80SBram Moolenaar      'catch',
1436a72cfb80SBram Moolenaar      'endtry',
1437a72cfb80SBram Moolenaar      ], 'E488:')
1438a72cfb80SBram Moolenaar  CheckDefFailure([
1439a72cfb80SBram Moolenaar      'try',
14407a092245SBram Moolenaar      '  echo "yes"',
14417a092245SBram Moolenaar      'catch# comment',
14427a092245SBram Moolenaar      'endtry',
14437a092245SBram Moolenaar      ], 'E488:')
14442c5ed4e3SBram Moolenaar  CheckScriptFailure([
14452c5ed4e3SBram Moolenaar      'vim9script',
14462c5ed4e3SBram Moolenaar      'try',
14472c5ed4e3SBram Moolenaar      '  echo "yes"',
14482c5ed4e3SBram Moolenaar      'catch# comment',
14492c5ed4e3SBram Moolenaar      'endtry',
14502c5ed4e3SBram Moolenaar      ], 'E654:')
14512c5ed4e3SBram Moolenaar  CheckDefFailure([
14522c5ed4e3SBram Moolenaar      'try',
14532c5ed4e3SBram Moolenaar      '  echo "yes"',
14542c5ed4e3SBram Moolenaar      'catch /pat/# comment',
14552c5ed4e3SBram Moolenaar      'endtry',
14562c5ed4e3SBram Moolenaar      ], 'E488:')
14577a092245SBram Moolenaar  CheckDefFailure([
14587a092245SBram Moolenaar      'try',
14597a092245SBram Moolenaar      'echo "yes"',
14607a092245SBram Moolenaar      'catch',
14617a092245SBram Moolenaar      'endtry# comment',
14627a092245SBram Moolenaar      ], 'E488:')
14632c5ed4e3SBram Moolenaar  CheckScriptFailure([
14642c5ed4e3SBram Moolenaar      'vim9script',
14652c5ed4e3SBram Moolenaar      'try',
14662c5ed4e3SBram Moolenaar      '  echo "yes"',
14672c5ed4e3SBram Moolenaar      'catch',
14682c5ed4e3SBram Moolenaar      'endtry# comment',
14692c5ed4e3SBram Moolenaar      ], 'E600:')
14702c5ed4e3SBram Moolenaar
14712c5ed4e3SBram Moolenaar  CheckScriptSuccess([
14722c5ed4e3SBram Moolenaar      'vim9script',
14732c5ed4e3SBram Moolenaar      'hi # comment',
14742c5ed4e3SBram Moolenaar      ])
14752c5ed4e3SBram Moolenaar  CheckScriptFailure([
14762c5ed4e3SBram Moolenaar      'vim9script',
14772c5ed4e3SBram Moolenaar      'hi# comment',
14782c5ed4e3SBram Moolenaar      ], 'E416:')
14791966c248SBram Moolenaar  CheckScriptSuccess([
14801966c248SBram Moolenaar      'vim9script',
14811966c248SBram Moolenaar      'hi Search # comment',
14821966c248SBram Moolenaar      ])
14831966c248SBram Moolenaar  CheckScriptFailure([
14841966c248SBram Moolenaar      'vim9script',
14851966c248SBram Moolenaar      'hi Search# comment',
14861966c248SBram Moolenaar      ], 'E416:')
14871966c248SBram Moolenaar  CheckScriptSuccess([
14881966c248SBram Moolenaar      'vim9script',
14891966c248SBram Moolenaar      'hi link This Search # comment',
14901966c248SBram Moolenaar      ])
14911966c248SBram Moolenaar  CheckScriptFailure([
14921966c248SBram Moolenaar      'vim9script',
14931966c248SBram Moolenaar      'hi link This That# comment',
14941966c248SBram Moolenaar      ], 'E413:')
14951966c248SBram Moolenaar  CheckScriptSuccess([
14961966c248SBram Moolenaar      'vim9script',
14971966c248SBram Moolenaar      'hi clear This # comment',
14981966c248SBram Moolenaar      'hi clear # comment',
14991966c248SBram Moolenaar      ])
15001966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
15011966c248SBram Moolenaar  " hi clear This# comment',
15021966c248SBram Moolenaar  CheckScriptFailure([
15031966c248SBram Moolenaar      'vim9script',
15041966c248SBram Moolenaar      'hi clear# comment',
15051966c248SBram Moolenaar      ], 'E416:')
15061966c248SBram Moolenaar
15071966c248SBram Moolenaar  CheckScriptSuccess([
15081966c248SBram Moolenaar      'vim9script',
15091966c248SBram Moolenaar      'hi Group term=bold',
15101966c248SBram Moolenaar      'match Group /todo/ # comment',
15111966c248SBram Moolenaar      ])
15121966c248SBram Moolenaar  CheckScriptFailure([
15131966c248SBram Moolenaar      'vim9script',
15141966c248SBram Moolenaar      'hi Group term=bold',
15151966c248SBram Moolenaar      'match Group /todo/# comment',
15161966c248SBram Moolenaar      ], 'E488:')
15171966c248SBram Moolenaar  CheckScriptSuccess([
15181966c248SBram Moolenaar      'vim9script',
15191966c248SBram Moolenaar      'match # comment',
15201966c248SBram Moolenaar      ])
15211966c248SBram Moolenaar  CheckScriptFailure([
15221966c248SBram Moolenaar      'vim9script',
15231966c248SBram Moolenaar      'match# comment',
15241966c248SBram Moolenaar      ], 'E475:')
15251966c248SBram Moolenaar  CheckScriptSuccess([
15261966c248SBram Moolenaar      'vim9script',
15271966c248SBram Moolenaar      'match none # comment',
15281966c248SBram Moolenaar      ])
15291966c248SBram Moolenaar  CheckScriptFailure([
15301966c248SBram Moolenaar      'vim9script',
15311966c248SBram Moolenaar      'match none# comment',
15321966c248SBram Moolenaar      ], 'E475:')
15331966c248SBram Moolenaar
15341966c248SBram Moolenaar  CheckScriptSuccess([
15351966c248SBram Moolenaar      'vim9script',
15361966c248SBram Moolenaar      'menutrans clear # comment',
15371966c248SBram Moolenaar      ])
15381966c248SBram Moolenaar  CheckScriptFailure([
15391966c248SBram Moolenaar      'vim9script',
15401966c248SBram Moolenaar      'menutrans clear# comment text',
15411966c248SBram Moolenaar      ], 'E474:')
15421966c248SBram Moolenaar
15431966c248SBram Moolenaar  CheckScriptSuccess([
15441966c248SBram Moolenaar      'vim9script',
15451966c248SBram Moolenaar      'syntax clear # comment',
15461966c248SBram Moolenaar      ])
15471966c248SBram Moolenaar  CheckScriptFailure([
15481966c248SBram Moolenaar      'vim9script',
15491966c248SBram Moolenaar      'syntax clear# comment text',
15501966c248SBram Moolenaar      ], 'E28:')
15511966c248SBram Moolenaar  CheckScriptSuccess([
15521966c248SBram Moolenaar      'vim9script',
15531966c248SBram Moolenaar      'syntax keyword Word some',
15541966c248SBram Moolenaar      'syntax clear Word # comment',
15551966c248SBram Moolenaar      ])
15561966c248SBram Moolenaar  CheckScriptFailure([
15571966c248SBram Moolenaar      'vim9script',
15581966c248SBram Moolenaar      'syntax keyword Word some',
15591966c248SBram Moolenaar      'syntax clear Word# comment text',
15601966c248SBram Moolenaar      ], 'E28:')
15611966c248SBram Moolenaar
15621966c248SBram Moolenaar  CheckScriptSuccess([
15631966c248SBram Moolenaar      'vim9script',
15641966c248SBram Moolenaar      'syntax list # comment',
15651966c248SBram Moolenaar      ])
15661966c248SBram Moolenaar  CheckScriptFailure([
15671966c248SBram Moolenaar      'vim9script',
15681966c248SBram Moolenaar      'syntax list# comment text',
15691966c248SBram Moolenaar      ], 'E28:')
15701966c248SBram Moolenaar
15711966c248SBram Moolenaar  CheckScriptSuccess([
15721966c248SBram Moolenaar      'vim9script',
15731966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
15741966c248SBram Moolenaar      ])
15751966c248SBram Moolenaar  CheckScriptFailure([
15761966c248SBram Moolenaar      'vim9script',
15771966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
15781966c248SBram Moolenaar      ], 'E475:')
15791966c248SBram Moolenaar
15801966c248SBram Moolenaar  CheckScriptSuccess([
15811966c248SBram Moolenaar      'vim9script',
15821966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
15831966c248SBram Moolenaar      ])
15841966c248SBram Moolenaar  CheckScriptFailure([
15851966c248SBram Moolenaar      'vim9script',
15861966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
15871966c248SBram Moolenaar      ], 'E789:')
15881966c248SBram Moolenaar
15891966c248SBram Moolenaar  CheckScriptSuccess([
15901966c248SBram Moolenaar      'vim9script',
15911966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
15921966c248SBram Moolenaar      ])
15931966c248SBram Moolenaar  CheckScriptFailure([
15941966c248SBram Moolenaar      'vim9script',
15951966c248SBram Moolenaar      'syntax match Word /pat/# comment',
15961966c248SBram Moolenaar      ], 'E402:')
15971966c248SBram Moolenaar
15981966c248SBram Moolenaar  CheckScriptSuccess([
15991966c248SBram Moolenaar      'vim9script',
16001966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
16011966c248SBram Moolenaar      ])
16021966c248SBram Moolenaar  CheckScriptFailure([
16031966c248SBram Moolenaar      'vim9script',
16041966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
16051966c248SBram Moolenaar      ], 'E475:')
16061966c248SBram Moolenaar  CheckScriptFailure([
16071966c248SBram Moolenaar      'vim9script',
16081966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
16091966c248SBram Moolenaar      ], 'E406:')
16101966c248SBram Moolenaar  CheckScriptFailure([
16111966c248SBram Moolenaar      'vim9script',
16121966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
16131966c248SBram Moolenaar      ], 'E475:')
16141966c248SBram Moolenaar
16151966c248SBram Moolenaar  CheckScriptSuccess([
16161966c248SBram Moolenaar      'vim9script',
16171966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
16181966c248SBram Moolenaar      ])
16191966c248SBram Moolenaar  CheckScriptFailure([
16201966c248SBram Moolenaar      'vim9script',
16211966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
16221966c248SBram Moolenaar      ], 'E475:')
16231966c248SBram Moolenaar
16241966c248SBram Moolenaar  CheckScriptSuccess([
16251966c248SBram Moolenaar      'vim9script',
16261966c248SBram Moolenaar      'syntax sync # comment',
16271966c248SBram Moolenaar      ])
16281966c248SBram Moolenaar  CheckScriptFailure([
16291966c248SBram Moolenaar      'vim9script',
16301966c248SBram Moolenaar      'syntax sync# comment',
16311966c248SBram Moolenaar      ], 'E404:')
16321966c248SBram Moolenaar  CheckScriptSuccess([
16331966c248SBram Moolenaar      'vim9script',
16341966c248SBram Moolenaar      'syntax sync ccomment # comment',
16351966c248SBram Moolenaar      ])
16361966c248SBram Moolenaar  CheckScriptFailure([
16371966c248SBram Moolenaar      'vim9script',
16381966c248SBram Moolenaar      'syntax sync ccomment# comment',
16391966c248SBram Moolenaar      ], 'E404:')
16401966c248SBram Moolenaar
16411966c248SBram Moolenaar  CheckScriptSuccess([
16421966c248SBram Moolenaar      'vim9script',
16431966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
16441966c248SBram Moolenaar      ])
16451966c248SBram Moolenaar  CheckScriptFailure([
16461966c248SBram Moolenaar      'vim9script',
16471966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
16481966c248SBram Moolenaar      ], 'E475:')
1649a72cfb80SBram Moolenaar
1650a72cfb80SBram Moolenaar  CheckScriptSuccess([
1651a72cfb80SBram Moolenaar      'vim9script',
1652a72cfb80SBram Moolenaar      'command Echo echo # comment',
1653a72cfb80SBram Moolenaar      'command Echo # comment',
1654a72cfb80SBram Moolenaar      ])
1655a72cfb80SBram Moolenaar  CheckScriptFailure([
1656a72cfb80SBram Moolenaar      'vim9script',
1657a72cfb80SBram Moolenaar      'command Echo echo# comment',
1658a72cfb80SBram Moolenaar      'Echo',
1659a72cfb80SBram Moolenaar      ], 'E121:')
1660a72cfb80SBram Moolenaar  CheckScriptFailure([
1661a72cfb80SBram Moolenaar      'vim9script',
1662a72cfb80SBram Moolenaar      'command Echo# comment',
1663a72cfb80SBram Moolenaar      ], 'E182:')
1664a72cfb80SBram Moolenaar  CheckScriptFailure([
1665a72cfb80SBram Moolenaar      'vim9script',
1666a72cfb80SBram Moolenaar      'command Echo echo',
1667a72cfb80SBram Moolenaar      'command Echo# comment',
1668a72cfb80SBram Moolenaar      ], 'E182:')
1669a72cfb80SBram Moolenaar
1670a72cfb80SBram Moolenaar  CheckScriptSuccess([
1671a72cfb80SBram Moolenaar      'vim9script',
1672a72cfb80SBram Moolenaar      'function # comment',
1673a72cfb80SBram Moolenaar      ])
1674a72cfb80SBram Moolenaar  CheckScriptFailure([
1675a72cfb80SBram Moolenaar      'vim9script',
1676a72cfb80SBram Moolenaar      'function# comment',
1677a72cfb80SBram Moolenaar      ], 'E129:')
1678a72cfb80SBram Moolenaar  CheckScriptSuccess([
1679a72cfb80SBram Moolenaar      'vim9script',
1680a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1681a72cfb80SBram Moolenaar      ])
1682a72cfb80SBram Moolenaar  CheckScriptFailure([
1683a72cfb80SBram Moolenaar      'vim9script',
1684a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1685a72cfb80SBram Moolenaar      ], 'E488:')
1686a72cfb80SBram Moolenaar
1687a72cfb80SBram Moolenaar  CheckScriptSuccess([
1688a72cfb80SBram Moolenaar      'vim9script',
16894c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1690a72cfb80SBram Moolenaar      'endfunc',
16914c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1692a72cfb80SBram Moolenaar      ])
1693a72cfb80SBram Moolenaar  CheckScriptFailure([
1694a72cfb80SBram Moolenaar      'vim9script',
16954c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1696a72cfb80SBram Moolenaar      'endfunc',
16974c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1698a72cfb80SBram Moolenaar      ], 'E488:')
1699a72cfb80SBram Moolenaar
1700a72cfb80SBram Moolenaar  CheckScriptSuccess([
1701a72cfb80SBram Moolenaar      'vim9script',
1702a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1703a72cfb80SBram Moolenaar      ])
1704a72cfb80SBram Moolenaar  CheckScriptFailure([
1705a72cfb80SBram Moolenaar      'vim9script',
1706a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1707a72cfb80SBram Moolenaar      ], 'E488:')
17082c5ed4e3SBram Moolenaarenddef
17092c5ed4e3SBram Moolenaar
17102c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
17112c5ed4e3SBram Moolenaar  CheckCanRunGui
17122c5ed4e3SBram Moolenaar
17132c5ed4e3SBram Moolenaar  CheckScriptFailure([
17142c5ed4e3SBram Moolenaar      'vim9script',
17152c5ed4e3SBram Moolenaar      'gui#comment'
17162c5ed4e3SBram Moolenaar      ], 'E499:')
17172c5ed4e3SBram Moolenaar  CheckScriptFailure([
17182c5ed4e3SBram Moolenaar      'vim9script',
17192c5ed4e3SBram Moolenaar      'gui -f#comment'
17202c5ed4e3SBram Moolenaar      ], 'E499:')
17217a092245SBram Moolenaarenddef
17227a092245SBram Moolenaar
1723a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1724a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1725a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1726a26b9700SBram Moolenaar
1727a26b9700SBram Moolenaar  edit test.vim
1728a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1729a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1730a26b9700SBram Moolenaar
1731a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1732a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1733a26b9700SBram Moolenaar
1734a26b9700SBram Moolenaar  g:entered = 0
1735a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1736a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1737a26b9700SBram Moolenaar
1738a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1739a26b9700SBram Moolenaar
1740a26b9700SBram Moolenaar  au! TabEnter
1741a26b9700SBram Moolenaar  unlet g:entered
1742d72c1bf0SBram Moolenaar
1743d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1744d72c1bf0SBram Moolenaar      'vim9script',
1745d72c1bf0SBram Moolenaar      'let g:var = 123',
1746d72c1bf0SBram Moolenaar      'let w:var = 777',
1747d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1748d72c1bf0SBram Moolenaar      ])
1749d72c1bf0SBram Moolenaar
1750d72c1bf0SBram Moolenaar  CheckScriptFailure([
1751d72c1bf0SBram Moolenaar      'vim9script',
1752d72c1bf0SBram Moolenaar      'let g:var = 123',
175332e35117SBram Moolenaar      'unlet g:var# comment1',
1754d72c1bf0SBram Moolenaar      ], 'E108:')
1755d72c1bf0SBram Moolenaar
1756d72c1bf0SBram Moolenaar  CheckScriptFailure([
1757d72c1bf0SBram Moolenaar      'let g:var = 123',
1758d72c1bf0SBram Moolenaar      'unlet g:var # something',
1759d72c1bf0SBram Moolenaar      ], 'E488:')
1760faac4104SBram Moolenaar
1761faac4104SBram Moolenaar  CheckScriptSuccess([
1762faac4104SBram Moolenaar      'vim9script',
176332e35117SBram Moolenaar      'if 1 # comment2',
1764faac4104SBram Moolenaar      '  echo "yes"',
1765faac4104SBram Moolenaar      'elseif 2 #comment',
1766faac4104SBram Moolenaar      '  echo "no"',
1767faac4104SBram Moolenaar      'endif',
1768faac4104SBram Moolenaar      ])
1769faac4104SBram Moolenaar
1770faac4104SBram Moolenaar  CheckScriptFailure([
1771faac4104SBram Moolenaar      'vim9script',
177232e35117SBram Moolenaar      'if 1# comment3',
1773faac4104SBram Moolenaar      '  echo "yes"',
1774faac4104SBram Moolenaar      'endif',
1775faac4104SBram Moolenaar      ], 'E15:')
1776faac4104SBram Moolenaar
1777faac4104SBram Moolenaar  CheckScriptFailure([
1778faac4104SBram Moolenaar      'vim9script',
177932e35117SBram Moolenaar      'if 0 # comment4',
1780faac4104SBram Moolenaar      '  echo "yes"',
1781faac4104SBram Moolenaar      'elseif 2#comment',
1782faac4104SBram Moolenaar      '  echo "no"',
1783faac4104SBram Moolenaar      'endif',
1784faac4104SBram Moolenaar      ], 'E15:')
1785faac4104SBram Moolenaar
1786faac4104SBram Moolenaar  CheckScriptSuccess([
1787faac4104SBram Moolenaar      'vim9script',
178832e35117SBram Moolenaar      'let v = 1 # comment5',
1789faac4104SBram Moolenaar      ])
1790faac4104SBram Moolenaar
1791faac4104SBram Moolenaar  CheckScriptFailure([
1792faac4104SBram Moolenaar      'vim9script',
179332e35117SBram Moolenaar      'let v = 1# comment6',
179432e35117SBram Moolenaar      ], 'E15:')
1795faac4104SBram Moolenaar
1796faac4104SBram Moolenaar  CheckScriptSuccess([
1797faac4104SBram Moolenaar      'vim9script',
1798faac4104SBram Moolenaar      'new'
1799faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1800faac4104SBram Moolenaar      '$',
1801faac4104SBram Moolenaar      'dsearch /pat/ #comment',
1802faac4104SBram Moolenaar      'bwipe!',
1803faac4104SBram Moolenaar      ])
1804faac4104SBram Moolenaar
1805faac4104SBram Moolenaar  CheckScriptFailure([
1806faac4104SBram Moolenaar      'vim9script',
1807faac4104SBram Moolenaar      'new'
1808faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1809faac4104SBram Moolenaar      '$',
1810faac4104SBram Moolenaar      'dsearch /pat/#comment',
1811faac4104SBram Moolenaar      'bwipe!',
1812faac4104SBram Moolenaar      ], 'E488:')
181374fae513SBram Moolenaar
181474fae513SBram Moolenaar  CheckScriptFailure([
181574fae513SBram Moolenaar      'vim9script',
181674fae513SBram Moolenaar      'func! SomeFunc()',
181774fae513SBram Moolenaar      ], 'E477:')
1818a26b9700SBram Moolenaarenddef
1819a26b9700SBram Moolenaar
18207e5bd91dSBram Moolenaardef Test_finish()
18217e5bd91dSBram Moolenaar  let lines =<< trim END
18227e5bd91dSBram Moolenaar    vim9script
18237e5bd91dSBram Moolenaar    let g:res = 'one'
18247e5bd91dSBram Moolenaar    if v:false | finish | endif
18257e5bd91dSBram Moolenaar    let g:res = 'two'
18267e5bd91dSBram Moolenaar    finish
18277e5bd91dSBram Moolenaar    let g:res = 'three'
18287e5bd91dSBram Moolenaar  END
18297e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
18307e5bd91dSBram Moolenaar  source Xfinished
18317e5bd91dSBram Moolenaar  assert_equal('two', g:res)
18327e5bd91dSBram Moolenaar
18337e5bd91dSBram Moolenaar  unlet g:res
18347e5bd91dSBram Moolenaar  delete('Xfinished')
18357e5bd91dSBram Moolenaarenddef
18367e5bd91dSBram Moolenaar
183732e35117SBram Moolenaardef Test_let_func_call()
183832e35117SBram Moolenaar  let lines =<< trim END
183932e35117SBram Moolenaar    vim9script
184032e35117SBram Moolenaar    func GetValue()
184132e35117SBram Moolenaar      if exists('g:count')
184232e35117SBram Moolenaar        let g:count += 1
184332e35117SBram Moolenaar      else
184432e35117SBram Moolenaar        let g:count = 1
184532e35117SBram Moolenaar      endif
184632e35117SBram Moolenaar      return 'this'
184732e35117SBram Moolenaar    endfunc
184832e35117SBram Moolenaar    let val: string = GetValue()
1849df671b46SBram Moolenaar    " env var is always a string
1850df671b46SBram Moolenaar    let env = $TERM
185132e35117SBram Moolenaar  END
185232e35117SBram Moolenaar  writefile(lines, 'Xfinished')
185332e35117SBram Moolenaar  source Xfinished
1854a5d0077eSBram Moolenaar  " GetValue() is not called during discovery phase
185532e35117SBram Moolenaar  assert_equal(1, g:count)
185632e35117SBram Moolenaar
185732e35117SBram Moolenaar  unlet g:count
185832e35117SBram Moolenaar  delete('Xfinished')
185932e35117SBram Moolenaarenddef
186032e35117SBram Moolenaar
186132e35117SBram Moolenaardef Test_let_missing_type()
186232e35117SBram Moolenaar  let lines =<< trim END
186332e35117SBram Moolenaar    vim9script
1864df671b46SBram Moolenaar    let var = g:unknown
1865227a69deSBram Moolenaar  END
1866822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
1867227a69deSBram Moolenaar
1868227a69deSBram Moolenaar  lines =<< trim END
1869227a69deSBram Moolenaar    vim9script
1870227a69deSBram Moolenaar    let nr: number = 123
1871227a69deSBram Moolenaar    let var = nr
1872227a69deSBram Moolenaar  END
1873822ba247SBram Moolenaar  CheckScriptSuccess(lines)
187432e35117SBram Moolenaarenddef
187532e35117SBram Moolenaar
1876c82a5b5dSBram Moolenaardef Test_let_declaration()
1877c82a5b5dSBram Moolenaar  let lines =<< trim END
1878c82a5b5dSBram Moolenaar    vim9script
1879c82a5b5dSBram Moolenaar    let var: string
1880c82a5b5dSBram Moolenaar    g:var_uninit = var
1881c82a5b5dSBram Moolenaar    var = 'text'
1882c82a5b5dSBram Moolenaar    g:var_test = var
1883984dddbeSBram Moolenaar    " prefixing s: is optional
1884984dddbeSBram Moolenaar    s:var = 'prefixed'
1885984dddbeSBram Moolenaar    g:var_prefixed = s:var
1886984dddbeSBram Moolenaar
1887984dddbeSBram Moolenaar    let s:other: number
1888984dddbeSBram Moolenaar    other = 1234
1889984dddbeSBram Moolenaar    g:other_var = other
1890c82a5b5dSBram Moolenaar  END
1891c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
1892c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
1893c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
1894984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
1895984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
1896c82a5b5dSBram Moolenaar
1897c82a5b5dSBram Moolenaar  unlet g:var_uninit
1898c82a5b5dSBram Moolenaar  unlet g:var_test
1899984dddbeSBram Moolenaar  unlet g:var_prefixed
1900984dddbeSBram Moolenaar  unlet g:other_var
1901c82a5b5dSBram Moolenaarenddef
1902c82a5b5dSBram Moolenaar
190334db91f7SBram Moolenaardef Test_let_type_check()
190434db91f7SBram Moolenaar  let lines =<< trim END
190534db91f7SBram Moolenaar    vim9script
190634db91f7SBram Moolenaar    let var: string
190734db91f7SBram Moolenaar    var = 1234
190834db91f7SBram Moolenaar  END
190934db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
1910984dddbeSBram Moolenaar
1911984dddbeSBram Moolenaar  lines =<< trim END
1912984dddbeSBram Moolenaar    vim9script
1913984dddbeSBram Moolenaar    let var:string
1914984dddbeSBram Moolenaar  END
1915984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
191634db91f7SBram Moolenaarenddef
191734db91f7SBram Moolenaar
1918a5d0077eSBram Moolenaardef Test_forward_declaration()
1919a5d0077eSBram Moolenaar  let lines =<< trim END
1920a5d0077eSBram Moolenaar    vim9script
1921a5d0077eSBram Moolenaar    def GetValue(): string
1922a5d0077eSBram Moolenaar      return theVal
1923a5d0077eSBram Moolenaar    enddef
1924a5d0077eSBram Moolenaar    let theVal = 'something'
1925822ba247SBram Moolenaar    g:initVal = GetValue()
1926a5d0077eSBram Moolenaar    theVal = 'else'
1927a5d0077eSBram Moolenaar    g:laterVal = GetValue()
1928a5d0077eSBram Moolenaar  END
1929a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
1930a5d0077eSBram Moolenaar  source Xforward
1931a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
1932a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
1933a5d0077eSBram Moolenaar
1934a5d0077eSBram Moolenaar  unlet g:initVal
1935a5d0077eSBram Moolenaar  unlet g:laterVal
1936a5d0077eSBram Moolenaar  delete('Xforward')
1937a5d0077eSBram Moolenaarenddef
1938a5d0077eSBram Moolenaar
19399721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
19409721fb4eSBram Moolenaar  let legacy_lines =<< trim END
19419721fb4eSBram Moolenaar    source Xvim9_script.vim
19429721fb4eSBram Moolenaar
19439721fb4eSBram Moolenaar    call assert_false(exists('local'))
19449721fb4eSBram Moolenaar    call assert_false(exists('exported'))
19459721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
19469721fb4eSBram Moolenaar    call assert_equal('global', global)
19479721fb4eSBram Moolenaar    call assert_equal('global', g:global)
19489721fb4eSBram Moolenaar
19499721fb4eSBram Moolenaar    " imported variable becomes script-local
19509721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
19519721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
19529721fb4eSBram Moolenaar    call assert_false(exists('exported'))
19539721fb4eSBram Moolenaar
19549721fb4eSBram Moolenaar    " imported function becomes script-local
19559721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
19569721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
19579721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
19589721fb4eSBram Moolenaar  END
19599721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
19609721fb4eSBram Moolenaar
19619721fb4eSBram Moolenaar  let vim9_lines =<< trim END
19629721fb4eSBram Moolenaar    vim9script
19639721fb4eSBram Moolenaar    let local = 'local'
19649721fb4eSBram Moolenaar    g:global = 'global'
19659721fb4eSBram Moolenaar    export let exported = 'exported'
19669721fb4eSBram Moolenaar    export def GetText(): string
19679721fb4eSBram Moolenaar       return 'text'
19689721fb4eSBram Moolenaar    enddef
19699721fb4eSBram Moolenaar  END
19709721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
19719721fb4eSBram Moolenaar
19729721fb4eSBram Moolenaar  source Xlegacy_script.vim
19739721fb4eSBram Moolenaar
19749721fb4eSBram Moolenaar  assert_equal('global', g:global)
19759721fb4eSBram Moolenaar"  unlet g:global
19769721fb4eSBram Moolenaar
19779721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
19789721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
19799721fb4eSBram Moolenaarenddef
1980a5d0077eSBram Moolenaar
1981585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1982585fea7bSBram Moolenaardef Test_substitute_cmd()
1983585fea7bSBram Moolenaar  new
1984585fea7bSBram Moolenaar  setline(1, 'something')
1985585fea7bSBram Moolenaar  :substitute(some(other(
1986585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1987585fea7bSBram Moolenaar  bwipe!
1988585fea7bSBram Moolenaar
1989585fea7bSBram Moolenaar  " also when the context is Vim9 script
1990585fea7bSBram Moolenaar  let lines =<< trim END
1991585fea7bSBram Moolenaar    vim9script
1992585fea7bSBram Moolenaar    new
1993585fea7bSBram Moolenaar    setline(1, 'something')
1994585fea7bSBram Moolenaar    :substitute(some(other(
1995585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1996585fea7bSBram Moolenaar    bwipe!
1997585fea7bSBram Moolenaar  END
1998585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1999585fea7bSBram Moolenaar  source Xvim9lines
2000585fea7bSBram Moolenaar
2001585fea7bSBram Moolenaar  delete('Xvim9lines')
2002585fea7bSBram Moolenaarenddef
2003585fea7bSBram Moolenaar
20048a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2005