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
781*f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
782101f4810SBram Moolenaar  CheckRunVimInTerminal
783101f4810SBram Moolenaar
784101f4810SBram Moolenaar  let export =<< trim END
785101f4810SBram Moolenaar    vim9script
786101f4810SBram Moolenaar    export def Foo(): number
787101f4810SBram Moolenaar        return 0
788101f4810SBram Moolenaar    enddef
789101f4810SBram Moolenaar  END
790*f7d267efSBram Moolenaar  call writefile(export, 'Xexport.vim')
791101f4810SBram Moolenaar
792*f7d267efSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{rows: 6, wait_for_ruler: 0})
793*f7d267efSBram Moolenaar  call WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
794101f4810SBram Moolenaar
795*f7d267efSBram Moolenaar  call delete('Xexport.vim')
796*f7d267efSBram Moolenaar  call StopVimInTerminal(buf)
797*f7d267efSBram Moolenaarendfunc
798101f4810SBram Moolenaar
7994c17ad94SBram Moolenaardef Test_vim9script_reload_import()
8008a7d6542SBram Moolenaar  let lines =<< trim END
8018a7d6542SBram Moolenaar    vim9script
8028a7d6542SBram Moolenaar    const var = ''
8038a7d6542SBram Moolenaar    let valone = 1234
8048a7d6542SBram Moolenaar    def MyFunc(arg: string)
8058a7d6542SBram Moolenaar       valone = 5678
8068a7d6542SBram Moolenaar    enddef
8078a7d6542SBram Moolenaar  END
8088a7d6542SBram Moolenaar  let morelines =<< trim END
8098a7d6542SBram Moolenaar    let valtwo = 222
8108a7d6542SBram Moolenaar    export def GetValtwo(): number
8118a7d6542SBram Moolenaar      return valtwo
8128a7d6542SBram Moolenaar    enddef
8138a7d6542SBram Moolenaar  END
81403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
8158a7d6542SBram Moolenaar  source Xreload.vim
8168a7d6542SBram Moolenaar  source Xreload.vim
8178a7d6542SBram Moolenaar  source Xreload.vim
8188a7d6542SBram Moolenaar
8198a7d6542SBram Moolenaar  let testlines =<< trim END
8208a7d6542SBram Moolenaar    vim9script
8218a7d6542SBram Moolenaar    def TheFunc()
8228a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8238a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8248a7d6542SBram Moolenaar    enddef
8258a7d6542SBram Moolenaar    TheFunc()
8268a7d6542SBram Moolenaar  END
8278a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8288a7d6542SBram Moolenaar  source Ximport.vim
8298a7d6542SBram Moolenaar
83003afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
83103afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
8328a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8338a7d6542SBram Moolenaar  source Ximport.vim
8348a7d6542SBram Moolenaar
8358a7d6542SBram Moolenaar  " cannot declare a var twice
8368a7d6542SBram Moolenaar  lines =<< trim END
8378a7d6542SBram Moolenaar    vim9script
8388a7d6542SBram Moolenaar    let valone = 1234
8398a7d6542SBram Moolenaar    let valone = 5678
8408a7d6542SBram Moolenaar  END
8418a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8428a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8438a7d6542SBram Moolenaar
8448a7d6542SBram Moolenaar  delete('Xreload.vim')
8458a7d6542SBram Moolenaar  delete('Ximport.vim')
8468a7d6542SBram Moolenaarenddef
8478a7d6542SBram Moolenaar
8484c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
8494c17ad94SBram Moolenaar  let first_lines =<< trim END
8504c17ad94SBram Moolenaar    vim9script
8514c17ad94SBram Moolenaar    def FuncYes(): string
8524c17ad94SBram Moolenaar      return 'yes'
8534c17ad94SBram Moolenaar    enddef
8544c17ad94SBram Moolenaar  END
85503afdcf1SBram Moolenaar  let withno_lines =<< trim END
8564c17ad94SBram Moolenaar    def FuncNo(): string
8574c17ad94SBram Moolenaar      return 'no'
8584c17ad94SBram Moolenaar    enddef
8594c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
8604c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
8614c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
86203afdcf1SBram Moolenaar    enddef
86303afdcf1SBram Moolenaar  END
86403afdcf1SBram Moolenaar  let nono_lines =<< trim END
86503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
86603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
8674c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
8684c17ad94SBram Moolenaar    enddef
8694c17ad94SBram Moolenaar  END
8704c17ad94SBram Moolenaar
8714c17ad94SBram Moolenaar  # FuncNo() is defined
87203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8734c17ad94SBram Moolenaar  source Xreloaded.vim
8744c17ad94SBram Moolenaar  g:DoCheck(true)
8754c17ad94SBram Moolenaar
8764c17ad94SBram Moolenaar  # FuncNo() is not redefined
87703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
8784c17ad94SBram Moolenaar  source Xreloaded.vim
87903afdcf1SBram Moolenaar  g:DoCheck()
8804c17ad94SBram Moolenaar
8814c17ad94SBram Moolenaar  # FuncNo() is back
88203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8834c17ad94SBram Moolenaar  source Xreloaded.vim
88403afdcf1SBram Moolenaar  g:DoCheck()
8854c17ad94SBram Moolenaar
8864c17ad94SBram Moolenaar  delete('Xreloaded.vim')
8874c17ad94SBram Moolenaarenddef
8884c17ad94SBram Moolenaar
88989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
89089483d40SBram Moolenaar  # write the script with a script-local variable
89189483d40SBram Moolenaar  let lines =<< trim END
89289483d40SBram Moolenaar    vim9script
89389483d40SBram Moolenaar    let var = 'string'
89489483d40SBram Moolenaar  END
89589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
89689483d40SBram Moolenaar  source XreloadVar.vim
89789483d40SBram Moolenaar
89889483d40SBram Moolenaar  # now write the script using the same variable locally - works
89989483d40SBram Moolenaar  lines =<< trim END
90089483d40SBram Moolenaar    vim9script
90189483d40SBram Moolenaar    def Func()
90289483d40SBram Moolenaar      let var = 'string'
90389483d40SBram Moolenaar    enddef
90489483d40SBram Moolenaar  END
90589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
90689483d40SBram Moolenaar  source XreloadVar.vim
90789483d40SBram Moolenaar
90889483d40SBram Moolenaar  delete('XreloadVar.vim')
90989483d40SBram Moolenaarenddef
91089483d40SBram Moolenaar
9118a7d6542SBram Moolenaardef Test_import_absolute()
9128a7d6542SBram Moolenaar  let import_lines = [
913e6085c53SBram Moolenaar        'vim9script',
914e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
915e6085c53SBram Moolenaar        'def UseExported()',
916e6085c53SBram Moolenaar        '  g:imported_abs = exported',
917e6085c53SBram Moolenaar        '  exported = 8888',
918e6085c53SBram Moolenaar        '  g:imported_after = exported',
919e6085c53SBram Moolenaar        'enddef',
920e6085c53SBram Moolenaar        'UseExported()',
921e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
922e6085c53SBram Moolenaar        ]
9238a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
9248a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
9258a7d6542SBram Moolenaar
9268a7d6542SBram Moolenaar  source Ximport_abs.vim
9278a7d6542SBram Moolenaar
9288a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
9294e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
930675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
931675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
932675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
933675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
934675f716eSBram Moolenaar          'exported = 8888.*' ..
935675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
936675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
937675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
938675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
939e6085c53SBram Moolenaar        g:import_disassembled)
9408a7d6542SBram Moolenaar  unlet g:imported_abs
9414e12a5dfSBram Moolenaar  unlet g:import_disassembled
9428a7d6542SBram Moolenaar
9438a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
9448a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
9458a7d6542SBram Moolenaarenddef
9468a7d6542SBram Moolenaar
9478a7d6542SBram Moolenaardef Test_import_rtp()
9488a7d6542SBram Moolenaar  let import_lines = [
949e6085c53SBram Moolenaar        'vim9script',
950e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
951e6085c53SBram Moolenaar        'g:imported_rtp = exported',
952e6085c53SBram Moolenaar        ]
9538a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
9548a7d6542SBram Moolenaar  mkdir('import')
9558a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
9568a7d6542SBram Moolenaar
9578a7d6542SBram Moolenaar  let save_rtp = &rtp
9588a7d6542SBram Moolenaar  &rtp = getcwd()
9598a7d6542SBram Moolenaar  source Ximport_rtp.vim
9608a7d6542SBram Moolenaar  &rtp = save_rtp
9618a7d6542SBram Moolenaar
9628a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
9638a7d6542SBram Moolenaar  unlet g:imported_rtp
9648a7d6542SBram Moolenaar
9658a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
96689483d40SBram Moolenaar  delete('import', 'rf')
9678a7d6542SBram Moolenaarenddef
9688a7d6542SBram Moolenaar
96925e0f586SBram Moolenaardef Test_import_compile_error()
97025e0f586SBram Moolenaar  let export_lines = [
97125e0f586SBram Moolenaar        'vim9script',
97225e0f586SBram Moolenaar        'export def ExpFunc(): string',
97325e0f586SBram Moolenaar        '  return notDefined',
97425e0f586SBram Moolenaar        'enddef',
97525e0f586SBram Moolenaar        ]
97625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
97725e0f586SBram Moolenaar
97825e0f586SBram Moolenaar  let import_lines = [
97925e0f586SBram Moolenaar        'vim9script',
98025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
98125e0f586SBram Moolenaar        'def ImpFunc()',
98225e0f586SBram Moolenaar        '  echo ExpFunc()',
98325e0f586SBram Moolenaar        'enddef',
98425e0f586SBram Moolenaar        'defcompile',
98525e0f586SBram Moolenaar        ]
98625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
98725e0f586SBram Moolenaar
98825e0f586SBram Moolenaar  try
98925e0f586SBram Moolenaar    source Ximport.vim
99025e0f586SBram Moolenaar  catch /E1001/
99125e0f586SBram Moolenaar    " Error should be fore the Xexported.vim file.
99225e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
99325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
99425e0f586SBram Moolenaar  endtry
99525e0f586SBram Moolenaar
99625e0f586SBram Moolenaar  delete('Xexported.vim')
99725e0f586SBram Moolenaar  delete('Ximport.vim')
99825e0f586SBram Moolenaarenddef
99925e0f586SBram Moolenaar
10008a7d6542SBram Moolenaardef Test_fixed_size_list()
10018a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
10028a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
10038a7d6542SBram Moolenaar  l->remove(0)
10048a7d6542SBram Moolenaar  l->add(5)
10058a7d6542SBram Moolenaar  l->insert(99, 1)
10060f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
10078a7d6542SBram Moolenaarenddef
10088a7d6542SBram Moolenaar
1009158906cfSBram Moolenaardef IfElse(what: number): string
1010158906cfSBram Moolenaar  let res = ''
1011158906cfSBram Moolenaar  if what == 1
1012158906cfSBram Moolenaar    res = "one"
1013158906cfSBram Moolenaar  elseif what == 2
1014158906cfSBram Moolenaar    res = "two"
1015a259d8d3SBram Moolenaar  else
1016158906cfSBram Moolenaar    res = "three"
1017a259d8d3SBram Moolenaar  endif
1018158906cfSBram Moolenaar  return res
1019a259d8d3SBram Moolenaarenddef
1020a259d8d3SBram Moolenaar
1021158906cfSBram Moolenaardef Test_if_elseif_else()
1022158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1023158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1024158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
10250f18b6d1SBram Moolenaarenddef
10260f18b6d1SBram Moolenaar
1027e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1028e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1029e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1030e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1031e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1032585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1033e8c4abbbSBram Moolenaarenddef
1034e8c4abbbSBram Moolenaar
10356d69bf60SBram Moolenaarlet g:bool_true = v:true
10366d69bf60SBram Moolenaarlet g:bool_false = v:false
10376d69bf60SBram Moolenaar
10386d69bf60SBram Moolenaardef Test_if_const_expr()
10396d69bf60SBram Moolenaar  let res = false
10406d69bf60SBram Moolenaar  if true ? true : false
10416d69bf60SBram Moolenaar    res = true
10426d69bf60SBram Moolenaar  endif
10436d69bf60SBram Moolenaar  assert_equal(true, res)
10446d69bf60SBram Moolenaar
1045585fea7bSBram Moolenaar  g:glob = 2
1046585fea7bSBram Moolenaar  if false
1047585fea7bSBram Moolenaar    execute('let g:glob = 3')
1048585fea7bSBram Moolenaar  endif
1049585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1050585fea7bSBram Moolenaar  if true
1051585fea7bSBram Moolenaar    execute('let g:glob = 3')
1052585fea7bSBram Moolenaar  endif
1053585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1054585fea7bSBram Moolenaar
10556d69bf60SBram Moolenaar  res = false
10566d69bf60SBram Moolenaar  if g:bool_true ? true : false
10576d69bf60SBram Moolenaar    res = true
10586d69bf60SBram Moolenaar  endif
10596d69bf60SBram Moolenaar  assert_equal(true, res)
10606d69bf60SBram Moolenaar
10616d69bf60SBram Moolenaar  res = false
10626d69bf60SBram Moolenaar  if true ? g:bool_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 ? true : g:bool_false
10696d69bf60SBram Moolenaar    res = true
10706d69bf60SBram Moolenaar  endif
10716d69bf60SBram Moolenaar  assert_equal(true, res)
10726d69bf60SBram Moolenaar
10736d69bf60SBram Moolenaar  res = false
10746d69bf60SBram Moolenaar  if true ? false : true
10756d69bf60SBram Moolenaar    res = true
10766d69bf60SBram Moolenaar  endif
10776d69bf60SBram Moolenaar  assert_equal(false, res)
10786d69bf60SBram Moolenaar
10796d69bf60SBram Moolenaar  res = false
10806d69bf60SBram Moolenaar  if false ? false : true
10816d69bf60SBram Moolenaar    res = true
10826d69bf60SBram Moolenaar  endif
10836d69bf60SBram Moolenaar  assert_equal(true, res)
10846d69bf60SBram Moolenaar
10856d69bf60SBram Moolenaar  res = false
10866d69bf60SBram Moolenaar  if false ? true : false
10876d69bf60SBram Moolenaar    res = true
10886d69bf60SBram Moolenaar  endif
10896d69bf60SBram Moolenaar  assert_equal(false, res)
10906d69bf60SBram Moolenaar
10916d69bf60SBram Moolenaar  res = false
1092e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1093e8c4abbbSBram Moolenaar    res = true
1094e8c4abbbSBram Moolenaar  endif
1095e8c4abbbSBram Moolenaar  assert_equal(false, res)
1096e8c4abbbSBram Moolenaar
1097e8c4abbbSBram Moolenaar  res = false
10986d69bf60SBram Moolenaar  if true && true
10996d69bf60SBram Moolenaar    res = true
11006d69bf60SBram Moolenaar  endif
11016d69bf60SBram Moolenaar  assert_equal(true, res)
11026d69bf60SBram Moolenaar
11036d69bf60SBram Moolenaar  res = false
11046d69bf60SBram Moolenaar  if true && false
11056d69bf60SBram Moolenaar    res = true
11066d69bf60SBram Moolenaar  endif
11076d69bf60SBram Moolenaar  assert_equal(false, res)
11086d69bf60SBram Moolenaar
11096d69bf60SBram Moolenaar  res = false
11106d69bf60SBram Moolenaar  if g:bool_true && false
11116d69bf60SBram Moolenaar    res = true
11126d69bf60SBram Moolenaar  endif
11136d69bf60SBram Moolenaar  assert_equal(false, res)
11146d69bf60SBram Moolenaar
11156d69bf60SBram Moolenaar  res = false
11166d69bf60SBram Moolenaar  if true && g:bool_false
11176d69bf60SBram Moolenaar    res = true
11186d69bf60SBram Moolenaar  endif
11196d69bf60SBram Moolenaar  assert_equal(false, res)
11206d69bf60SBram Moolenaar
11216d69bf60SBram Moolenaar  res = false
11226d69bf60SBram Moolenaar  if false && false
11236d69bf60SBram Moolenaar    res = true
11246d69bf60SBram Moolenaar  endif
11256d69bf60SBram Moolenaar  assert_equal(false, res)
11266d69bf60SBram Moolenaar
11276d69bf60SBram Moolenaar  res = false
11286d69bf60SBram Moolenaar  if true || false
11296d69bf60SBram Moolenaar    res = true
11306d69bf60SBram Moolenaar  endif
11316d69bf60SBram Moolenaar  assert_equal(true, res)
11326d69bf60SBram Moolenaar
11336d69bf60SBram Moolenaar  res = false
11346d69bf60SBram Moolenaar  if g:bool_true || false
11356d69bf60SBram Moolenaar    res = true
11366d69bf60SBram Moolenaar  endif
11376d69bf60SBram Moolenaar  assert_equal(true, res)
11386d69bf60SBram Moolenaar
11396d69bf60SBram Moolenaar  res = false
11406d69bf60SBram Moolenaar  if true || g:bool_false
11416d69bf60SBram Moolenaar    res = true
11426d69bf60SBram Moolenaar  endif
11436d69bf60SBram Moolenaar  assert_equal(true, res)
11446d69bf60SBram Moolenaar
11456d69bf60SBram Moolenaar  res = false
11466d69bf60SBram Moolenaar  if false || false
11476d69bf60SBram Moolenaar    res = true
11486d69bf60SBram Moolenaar  endif
11496d69bf60SBram Moolenaar  assert_equal(false, res)
115080c34ca3SBram Moolenaarenddef
11516d69bf60SBram Moolenaar
115280c34ca3SBram Moolenaardef Test_if_const_expr_fails()
115380c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
115480c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1155e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1156e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
11576d69bf60SBram Moolenaarenddef
11586d69bf60SBram Moolenaar
1159ad39c094SBram Moolenaardef Test_execute_cmd()
1160ad39c094SBram Moolenaar  new
1161ad39c094SBram Moolenaar  setline(1, 'default')
1162ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1163ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1164a72cfb80SBram Moolenaar
1165a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1166a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1167a72cfb80SBram Moolenaar
1168ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1169ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1170a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1171ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1172a72cfb80SBram Moolenaar
1173ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1174ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1175a72cfb80SBram Moolenaar
1176ad39c094SBram Moolenaar  let cmd_first = 'call '
1177ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1178ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1179ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1180ad39c094SBram Moolenaar  bwipe!
1181585fea7bSBram Moolenaar
1182585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1183a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1184ad39c094SBram Moolenaarenddef
1185ad39c094SBram Moolenaar
1186ad39c094SBram Moolenaardef Test_echo_cmd()
1187a72cfb80SBram Moolenaar  echo 'some' # comment
1188585fea7bSBram Moolenaar  echon 'thing'
1189ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1190ad39c094SBram Moolenaar
1191a72cfb80SBram Moolenaar  echo "some" # comment
1192a72cfb80SBram Moolenaar  echon "thing"
1193a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1194a72cfb80SBram Moolenaar
1195ad39c094SBram Moolenaar  let str1 = 'some'
1196ad39c094SBram Moolenaar  let str2 = 'more'
1197ad39c094SBram Moolenaar  echo str1 str2
1198ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1199a72cfb80SBram Moolenaar
1200a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1201ad39c094SBram Moolenaarenddef
1202ad39c094SBram Moolenaar
1203f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1204f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1205f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1206f93c7feaSBram Moolenaar  echo 'clear'
1207f93c7feaSBram Moolenaar  1messages
1208f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1209f93c7feaSBram Moolenaar
1210f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1211f93c7feaSBram Moolenaarenddef
1212f93c7feaSBram Moolenaar
1213f93c7feaSBram Moolenaardef Test_echoerr_cmd()
121440ee466cSBram Moolenaar  try
121540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
121640ee466cSBram Moolenaar  catch
121740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
121840ee466cSBram Moolenaar  endtry
1219f93c7feaSBram Moolenaarenddef
1220f93c7feaSBram Moolenaar
122141fe0617SBram Moolenaardef Test_for_outside_of_function()
122241fe0617SBram Moolenaar  let lines =<< trim END
122341fe0617SBram Moolenaar    vim9script
122441fe0617SBram Moolenaar    new
122541fe0617SBram Moolenaar    for var in range(0, 3)
122641fe0617SBram Moolenaar      append(line('$'), var)
122741fe0617SBram Moolenaar    endfor
122841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
122941fe0617SBram Moolenaar    bwipe!
123041fe0617SBram Moolenaar  END
123141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
123241fe0617SBram Moolenaar  source Xvim9for.vim
123341fe0617SBram Moolenaar  delete('Xvim9for.vim')
123441fe0617SBram Moolenaarenddef
12358a7d6542SBram Moolenaar
1236e8c4abbbSBram Moolenaardef Test_for_loop()
1237e8c4abbbSBram Moolenaar  let result = ''
1238e8c4abbbSBram Moolenaar  for cnt in range(7)
1239e8c4abbbSBram Moolenaar    if cnt == 4
1240e8c4abbbSBram Moolenaar      break
1241e8c4abbbSBram Moolenaar    endif
1242e8c4abbbSBram Moolenaar    if cnt == 2
1243e8c4abbbSBram Moolenaar      continue
1244e8c4abbbSBram Moolenaar    endif
1245e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1246e8c4abbbSBram Moolenaar  endfor
1247e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1248e8c4abbbSBram Moolenaarenddef
1249e8c4abbbSBram Moolenaar
1250e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1251675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1252675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1253675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1254822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1255675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1256675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1257675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1258675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1259e8c4abbbSBram Moolenaarenddef
1260e8c4abbbSBram Moolenaar
1261d0df1aacSBram Moolenaardef Test_while_loop()
1262d0df1aacSBram Moolenaar  let result = ''
1263d0df1aacSBram Moolenaar  let cnt = 0
1264d0df1aacSBram Moolenaar  while cnt < 555
1265d0df1aacSBram Moolenaar    if cnt == 3
1266d0df1aacSBram Moolenaar      break
1267d0df1aacSBram Moolenaar    endif
1268d0df1aacSBram Moolenaar    cnt += 1
1269d0df1aacSBram Moolenaar    if cnt == 2
1270d0df1aacSBram Moolenaar      continue
1271d0df1aacSBram Moolenaar    endif
1272d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1273d0df1aacSBram Moolenaar  endwhile
1274d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1275d0df1aacSBram Moolenaarenddef
1276d0df1aacSBram Moolenaar
1277e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1278675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1279675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1280675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1281675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1282675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1283675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1284675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1285bd5da371SBram Moolenaarenddef
1286bd5da371SBram Moolenaar
12879645e2d9SBram Moolenaardef Test_interrupt_loop()
128897acfc78SBram Moolenaar  let caught = false
12899645e2d9SBram Moolenaar  let x = 0
129097acfc78SBram Moolenaar  try
12919645e2d9SBram Moolenaar    while 1
12929645e2d9SBram Moolenaar      x += 1
12939645e2d9SBram Moolenaar      if x == 100
12949645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
12959645e2d9SBram Moolenaar      endif
12969645e2d9SBram Moolenaar    endwhile
129797acfc78SBram Moolenaar  catch
129897acfc78SBram Moolenaar    caught = true
129997acfc78SBram Moolenaar    assert_equal(100, x)
130097acfc78SBram Moolenaar  endtry
130197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
13029645e2d9SBram Moolenaarenddef
130320431c9dSBram Moolenaar
13044fdae999SBram Moolenaardef Test_automatic_line_continuation()
13054fdae999SBram Moolenaar  let mylist = [
13064fdae999SBram Moolenaar      'one',
13074fdae999SBram Moolenaar      'two',
13084fdae999SBram Moolenaar      'three',
13094fdae999SBram Moolenaar      ] " comment
13104fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
13114fdae999SBram Moolenaar
13124fdae999SBram Moolenaar  let mydict = {
13134fdae999SBram Moolenaar      'one': 1,
13144fdae999SBram Moolenaar      'two': 2,
13154fdae999SBram Moolenaar      'three':
13164fdae999SBram Moolenaar          3,
13174fdae999SBram Moolenaar      } " comment
13184fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
13194fdae999SBram Moolenaar  mydict = #{
13202c330432SBram Moolenaar      one: 1,  # comment
13212c330432SBram Moolenaar      two:     # comment
13222c330432SBram Moolenaar           2,  # comment
13232c330432SBram Moolenaar      three: 3 # comment
13242c330432SBram Moolenaar      }
13252c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
13262c330432SBram Moolenaar  mydict = #{
13272c330432SBram Moolenaar      one: 1,
13284fdae999SBram Moolenaar      two:
13294fdae999SBram Moolenaar           2,
13302c330432SBram Moolenaar      three: 3
13314fdae999SBram Moolenaar      }
13324fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1333e6085c53SBram Moolenaar
1334e6085c53SBram Moolenaar  assert_equal(
1335e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1336e6085c53SBram Moolenaar        split('one two three')
1337e6085c53SBram Moolenaar        )
13384fdae999SBram Moolenaarenddef
13394fdae999SBram Moolenaar
13407a092245SBram Moolenaardef Test_vim9_comment()
13417a092245SBram Moolenaar  CheckScriptSuccess([
13427a092245SBram Moolenaar      'vim9script',
13437a092245SBram Moolenaar      '# something',
13447a092245SBram Moolenaar      ])
13457a092245SBram Moolenaar  CheckScriptFailure([
13467a092245SBram Moolenaar      'vim9script',
13477a092245SBram Moolenaar      ':# something',
13487a092245SBram Moolenaar      ], 'E488:')
13497a092245SBram Moolenaar  CheckScriptFailure([
13507a092245SBram Moolenaar      '# something',
13517a092245SBram Moolenaar      ], 'E488:')
13527a092245SBram Moolenaar  CheckScriptFailure([
13537a092245SBram Moolenaar      ':# something',
13547a092245SBram Moolenaar      ], 'E488:')
13557a092245SBram Moolenaar
13564a8d9f2eSBram Moolenaar  { # block start
13574a8d9f2eSBram Moolenaar  } # block end
13584a8d9f2eSBram Moolenaar  CheckDefFailure([
13594a8d9f2eSBram Moolenaar      '{# comment',
13604a8d9f2eSBram Moolenaar      ], 'E488:')
13614a8d9f2eSBram Moolenaar  CheckDefFailure([
13624a8d9f2eSBram Moolenaar      '{',
13634a8d9f2eSBram Moolenaar      '}# comment',
13644a8d9f2eSBram Moolenaar      ], 'E488:')
13654a8d9f2eSBram Moolenaar
13664a8d9f2eSBram Moolenaar  echo "yes" # comment
13674a8d9f2eSBram Moolenaar  CheckDefFailure([
13684a8d9f2eSBram Moolenaar      'echo "yes"# comment',
13694a8d9f2eSBram Moolenaar      ], 'E488:')
13707a092245SBram Moolenaar  CheckScriptSuccess([
13717a092245SBram Moolenaar      'vim9script',
13727a092245SBram Moolenaar      'echo "yes" # something',
13737a092245SBram Moolenaar      ])
13747a092245SBram Moolenaar  CheckScriptFailure([
13757a092245SBram Moolenaar      'vim9script',
13767a092245SBram Moolenaar      'echo "yes"# something',
13777a092245SBram Moolenaar      ], 'E121:')
13787a092245SBram Moolenaar  CheckScriptFailure([
13797a092245SBram Moolenaar      'vim9script',
13807a092245SBram Moolenaar      'echo# something',
13817a092245SBram Moolenaar      ], 'E121:')
13827a092245SBram Moolenaar  CheckScriptFailure([
13837a092245SBram Moolenaar      'echo "yes" # something',
13847a092245SBram Moolenaar      ], 'E121:')
13857a092245SBram Moolenaar
13864a8d9f2eSBram Moolenaar  exe "echo" # comment
13874a8d9f2eSBram Moolenaar  CheckDefFailure([
13884a8d9f2eSBram Moolenaar      'exe "echo"# comment',
13894a8d9f2eSBram Moolenaar      ], 'E488:')
13904a8d9f2eSBram Moolenaar  CheckScriptSuccess([
13914a8d9f2eSBram Moolenaar      'vim9script',
13924a8d9f2eSBram Moolenaar      'exe "echo" # something',
13934a8d9f2eSBram Moolenaar      ])
13944a8d9f2eSBram Moolenaar  CheckScriptFailure([
13954a8d9f2eSBram Moolenaar      'vim9script',
13964a8d9f2eSBram Moolenaar      'exe "echo"# something',
13974a8d9f2eSBram Moolenaar      ], 'E121:')
13984a8d9f2eSBram Moolenaar  CheckDefFailure([
13994a8d9f2eSBram Moolenaar      'exe # comment',
14004a8d9f2eSBram Moolenaar      ], 'E1015:')
14014a8d9f2eSBram Moolenaar  CheckScriptFailure([
14024a8d9f2eSBram Moolenaar      'vim9script',
14034a8d9f2eSBram Moolenaar      'exe# something',
14044a8d9f2eSBram Moolenaar      ], 'E121:')
14054a8d9f2eSBram Moolenaar  CheckScriptFailure([
14064a8d9f2eSBram Moolenaar      'exe "echo" # something',
14074a8d9f2eSBram Moolenaar      ], 'E121:')
14084a8d9f2eSBram Moolenaar
14097a092245SBram Moolenaar  CheckDefFailure([
14107a092245SBram Moolenaar      'try# comment',
14117a092245SBram Moolenaar      '  echo "yes"',
14127a092245SBram Moolenaar      'catch',
14137a092245SBram Moolenaar      'endtry',
14147a092245SBram Moolenaar      ], 'E488:')
14152c5ed4e3SBram Moolenaar  CheckScriptFailure([
14162c5ed4e3SBram Moolenaar      'vim9script',
14172c5ed4e3SBram Moolenaar      'try# comment',
14182c5ed4e3SBram Moolenaar      'echo "yes"',
14192c5ed4e3SBram Moolenaar      ], 'E488:')
14207a092245SBram Moolenaar  CheckDefFailure([
14217a092245SBram Moolenaar      'try',
1422a72cfb80SBram Moolenaar      '  throw#comment',
1423a72cfb80SBram Moolenaar      'catch',
1424a72cfb80SBram Moolenaar      'endtry',
1425a72cfb80SBram Moolenaar      ], 'E1015:')
1426a72cfb80SBram Moolenaar  CheckDefFailure([
1427a72cfb80SBram Moolenaar      'try',
1428a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1429a72cfb80SBram Moolenaar      'catch',
1430a72cfb80SBram Moolenaar      'endtry',
1431a72cfb80SBram Moolenaar      ], 'E488:')
1432a72cfb80SBram Moolenaar  CheckDefFailure([
1433a72cfb80SBram Moolenaar      'try',
14347a092245SBram Moolenaar      '  echo "yes"',
14357a092245SBram Moolenaar      'catch# comment',
14367a092245SBram Moolenaar      'endtry',
14377a092245SBram Moolenaar      ], 'E488:')
14382c5ed4e3SBram Moolenaar  CheckScriptFailure([
14392c5ed4e3SBram Moolenaar      'vim9script',
14402c5ed4e3SBram Moolenaar      'try',
14412c5ed4e3SBram Moolenaar      '  echo "yes"',
14422c5ed4e3SBram Moolenaar      'catch# comment',
14432c5ed4e3SBram Moolenaar      'endtry',
14442c5ed4e3SBram Moolenaar      ], 'E654:')
14452c5ed4e3SBram Moolenaar  CheckDefFailure([
14462c5ed4e3SBram Moolenaar      'try',
14472c5ed4e3SBram Moolenaar      '  echo "yes"',
14482c5ed4e3SBram Moolenaar      'catch /pat/# comment',
14492c5ed4e3SBram Moolenaar      'endtry',
14502c5ed4e3SBram Moolenaar      ], 'E488:')
14517a092245SBram Moolenaar  CheckDefFailure([
14527a092245SBram Moolenaar      'try',
14537a092245SBram Moolenaar      'echo "yes"',
14547a092245SBram Moolenaar      'catch',
14557a092245SBram Moolenaar      'endtry# comment',
14567a092245SBram Moolenaar      ], 'E488:')
14572c5ed4e3SBram Moolenaar  CheckScriptFailure([
14582c5ed4e3SBram Moolenaar      'vim9script',
14592c5ed4e3SBram Moolenaar      'try',
14602c5ed4e3SBram Moolenaar      '  echo "yes"',
14612c5ed4e3SBram Moolenaar      'catch',
14622c5ed4e3SBram Moolenaar      'endtry# comment',
14632c5ed4e3SBram Moolenaar      ], 'E600:')
14642c5ed4e3SBram Moolenaar
14652c5ed4e3SBram Moolenaar  CheckScriptSuccess([
14662c5ed4e3SBram Moolenaar      'vim9script',
14672c5ed4e3SBram Moolenaar      'hi # comment',
14682c5ed4e3SBram Moolenaar      ])
14692c5ed4e3SBram Moolenaar  CheckScriptFailure([
14702c5ed4e3SBram Moolenaar      'vim9script',
14712c5ed4e3SBram Moolenaar      'hi# comment',
14722c5ed4e3SBram Moolenaar      ], 'E416:')
14731966c248SBram Moolenaar  CheckScriptSuccess([
14741966c248SBram Moolenaar      'vim9script',
14751966c248SBram Moolenaar      'hi Search # comment',
14761966c248SBram Moolenaar      ])
14771966c248SBram Moolenaar  CheckScriptFailure([
14781966c248SBram Moolenaar      'vim9script',
14791966c248SBram Moolenaar      'hi Search# comment',
14801966c248SBram Moolenaar      ], 'E416:')
14811966c248SBram Moolenaar  CheckScriptSuccess([
14821966c248SBram Moolenaar      'vim9script',
14831966c248SBram Moolenaar      'hi link This Search # comment',
14841966c248SBram Moolenaar      ])
14851966c248SBram Moolenaar  CheckScriptFailure([
14861966c248SBram Moolenaar      'vim9script',
14871966c248SBram Moolenaar      'hi link This That# comment',
14881966c248SBram Moolenaar      ], 'E413:')
14891966c248SBram Moolenaar  CheckScriptSuccess([
14901966c248SBram Moolenaar      'vim9script',
14911966c248SBram Moolenaar      'hi clear This # comment',
14921966c248SBram Moolenaar      'hi clear # comment',
14931966c248SBram Moolenaar      ])
14941966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
14951966c248SBram Moolenaar  " hi clear This# comment',
14961966c248SBram Moolenaar  CheckScriptFailure([
14971966c248SBram Moolenaar      'vim9script',
14981966c248SBram Moolenaar      'hi clear# comment',
14991966c248SBram Moolenaar      ], 'E416:')
15001966c248SBram Moolenaar
15011966c248SBram Moolenaar  CheckScriptSuccess([
15021966c248SBram Moolenaar      'vim9script',
15031966c248SBram Moolenaar      'hi Group term=bold',
15041966c248SBram Moolenaar      'match Group /todo/ # comment',
15051966c248SBram Moolenaar      ])
15061966c248SBram Moolenaar  CheckScriptFailure([
15071966c248SBram Moolenaar      'vim9script',
15081966c248SBram Moolenaar      'hi Group term=bold',
15091966c248SBram Moolenaar      'match Group /todo/# comment',
15101966c248SBram Moolenaar      ], 'E488:')
15111966c248SBram Moolenaar  CheckScriptSuccess([
15121966c248SBram Moolenaar      'vim9script',
15131966c248SBram Moolenaar      'match # comment',
15141966c248SBram Moolenaar      ])
15151966c248SBram Moolenaar  CheckScriptFailure([
15161966c248SBram Moolenaar      'vim9script',
15171966c248SBram Moolenaar      'match# comment',
15181966c248SBram Moolenaar      ], 'E475:')
15191966c248SBram Moolenaar  CheckScriptSuccess([
15201966c248SBram Moolenaar      'vim9script',
15211966c248SBram Moolenaar      'match none # comment',
15221966c248SBram Moolenaar      ])
15231966c248SBram Moolenaar  CheckScriptFailure([
15241966c248SBram Moolenaar      'vim9script',
15251966c248SBram Moolenaar      'match none# comment',
15261966c248SBram Moolenaar      ], 'E475:')
15271966c248SBram Moolenaar
15281966c248SBram Moolenaar  CheckScriptSuccess([
15291966c248SBram Moolenaar      'vim9script',
15301966c248SBram Moolenaar      'menutrans clear # comment',
15311966c248SBram Moolenaar      ])
15321966c248SBram Moolenaar  CheckScriptFailure([
15331966c248SBram Moolenaar      'vim9script',
15341966c248SBram Moolenaar      'menutrans clear# comment text',
15351966c248SBram Moolenaar      ], 'E474:')
15361966c248SBram Moolenaar
15371966c248SBram Moolenaar  CheckScriptSuccess([
15381966c248SBram Moolenaar      'vim9script',
15391966c248SBram Moolenaar      'syntax clear # comment',
15401966c248SBram Moolenaar      ])
15411966c248SBram Moolenaar  CheckScriptFailure([
15421966c248SBram Moolenaar      'vim9script',
15431966c248SBram Moolenaar      'syntax clear# comment text',
15441966c248SBram Moolenaar      ], 'E28:')
15451966c248SBram Moolenaar  CheckScriptSuccess([
15461966c248SBram Moolenaar      'vim9script',
15471966c248SBram Moolenaar      'syntax keyword Word some',
15481966c248SBram Moolenaar      'syntax clear Word # comment',
15491966c248SBram Moolenaar      ])
15501966c248SBram Moolenaar  CheckScriptFailure([
15511966c248SBram Moolenaar      'vim9script',
15521966c248SBram Moolenaar      'syntax keyword Word some',
15531966c248SBram Moolenaar      'syntax clear Word# comment text',
15541966c248SBram Moolenaar      ], 'E28:')
15551966c248SBram Moolenaar
15561966c248SBram Moolenaar  CheckScriptSuccess([
15571966c248SBram Moolenaar      'vim9script',
15581966c248SBram Moolenaar      'syntax list # comment',
15591966c248SBram Moolenaar      ])
15601966c248SBram Moolenaar  CheckScriptFailure([
15611966c248SBram Moolenaar      'vim9script',
15621966c248SBram Moolenaar      'syntax list# comment text',
15631966c248SBram Moolenaar      ], 'E28:')
15641966c248SBram Moolenaar
15651966c248SBram Moolenaar  CheckScriptSuccess([
15661966c248SBram Moolenaar      'vim9script',
15671966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
15681966c248SBram Moolenaar      ])
15691966c248SBram Moolenaar  CheckScriptFailure([
15701966c248SBram Moolenaar      'vim9script',
15711966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
15721966c248SBram Moolenaar      ], 'E475:')
15731966c248SBram Moolenaar
15741966c248SBram Moolenaar  CheckScriptSuccess([
15751966c248SBram Moolenaar      'vim9script',
15761966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
15771966c248SBram Moolenaar      ])
15781966c248SBram Moolenaar  CheckScriptFailure([
15791966c248SBram Moolenaar      'vim9script',
15801966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
15811966c248SBram Moolenaar      ], 'E789:')
15821966c248SBram Moolenaar
15831966c248SBram Moolenaar  CheckScriptSuccess([
15841966c248SBram Moolenaar      'vim9script',
15851966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
15861966c248SBram Moolenaar      ])
15871966c248SBram Moolenaar  CheckScriptFailure([
15881966c248SBram Moolenaar      'vim9script',
15891966c248SBram Moolenaar      'syntax match Word /pat/# comment',
15901966c248SBram Moolenaar      ], 'E402:')
15911966c248SBram Moolenaar
15921966c248SBram Moolenaar  CheckScriptSuccess([
15931966c248SBram Moolenaar      'vim9script',
15941966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
15951966c248SBram Moolenaar      ])
15961966c248SBram Moolenaar  CheckScriptFailure([
15971966c248SBram Moolenaar      'vim9script',
15981966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
15991966c248SBram Moolenaar      ], 'E475:')
16001966c248SBram Moolenaar  CheckScriptFailure([
16011966c248SBram Moolenaar      'vim9script',
16021966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
16031966c248SBram Moolenaar      ], 'E406:')
16041966c248SBram Moolenaar  CheckScriptFailure([
16051966c248SBram Moolenaar      'vim9script',
16061966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
16071966c248SBram Moolenaar      ], 'E475:')
16081966c248SBram Moolenaar
16091966c248SBram Moolenaar  CheckScriptSuccess([
16101966c248SBram Moolenaar      'vim9script',
16111966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
16121966c248SBram Moolenaar      ])
16131966c248SBram Moolenaar  CheckScriptFailure([
16141966c248SBram Moolenaar      'vim9script',
16151966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
16161966c248SBram Moolenaar      ], 'E475:')
16171966c248SBram Moolenaar
16181966c248SBram Moolenaar  CheckScriptSuccess([
16191966c248SBram Moolenaar      'vim9script',
16201966c248SBram Moolenaar      'syntax sync # comment',
16211966c248SBram Moolenaar      ])
16221966c248SBram Moolenaar  CheckScriptFailure([
16231966c248SBram Moolenaar      'vim9script',
16241966c248SBram Moolenaar      'syntax sync# comment',
16251966c248SBram Moolenaar      ], 'E404:')
16261966c248SBram Moolenaar  CheckScriptSuccess([
16271966c248SBram Moolenaar      'vim9script',
16281966c248SBram Moolenaar      'syntax sync ccomment # comment',
16291966c248SBram Moolenaar      ])
16301966c248SBram Moolenaar  CheckScriptFailure([
16311966c248SBram Moolenaar      'vim9script',
16321966c248SBram Moolenaar      'syntax sync ccomment# comment',
16331966c248SBram Moolenaar      ], 'E404:')
16341966c248SBram Moolenaar
16351966c248SBram Moolenaar  CheckScriptSuccess([
16361966c248SBram Moolenaar      'vim9script',
16371966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
16381966c248SBram Moolenaar      ])
16391966c248SBram Moolenaar  CheckScriptFailure([
16401966c248SBram Moolenaar      'vim9script',
16411966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
16421966c248SBram Moolenaar      ], 'E475:')
1643a72cfb80SBram Moolenaar
1644a72cfb80SBram Moolenaar  CheckScriptSuccess([
1645a72cfb80SBram Moolenaar      'vim9script',
1646a72cfb80SBram Moolenaar      'command Echo echo # comment',
1647a72cfb80SBram Moolenaar      'command Echo # comment',
1648a72cfb80SBram Moolenaar      ])
1649a72cfb80SBram Moolenaar  CheckScriptFailure([
1650a72cfb80SBram Moolenaar      'vim9script',
1651a72cfb80SBram Moolenaar      'command Echo echo# comment',
1652a72cfb80SBram Moolenaar      'Echo',
1653a72cfb80SBram Moolenaar      ], 'E121:')
1654a72cfb80SBram Moolenaar  CheckScriptFailure([
1655a72cfb80SBram Moolenaar      'vim9script',
1656a72cfb80SBram Moolenaar      'command Echo# comment',
1657a72cfb80SBram Moolenaar      ], 'E182:')
1658a72cfb80SBram Moolenaar  CheckScriptFailure([
1659a72cfb80SBram Moolenaar      'vim9script',
1660a72cfb80SBram Moolenaar      'command Echo echo',
1661a72cfb80SBram Moolenaar      'command Echo# comment',
1662a72cfb80SBram Moolenaar      ], 'E182:')
1663a72cfb80SBram Moolenaar
1664a72cfb80SBram Moolenaar  CheckScriptSuccess([
1665a72cfb80SBram Moolenaar      'vim9script',
1666a72cfb80SBram Moolenaar      'function # comment',
1667a72cfb80SBram Moolenaar      ])
1668a72cfb80SBram Moolenaar  CheckScriptFailure([
1669a72cfb80SBram Moolenaar      'vim9script',
1670a72cfb80SBram Moolenaar      'function# comment',
1671a72cfb80SBram Moolenaar      ], 'E129:')
1672a72cfb80SBram Moolenaar  CheckScriptSuccess([
1673a72cfb80SBram Moolenaar      'vim9script',
1674a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1675a72cfb80SBram Moolenaar      ])
1676a72cfb80SBram Moolenaar  CheckScriptFailure([
1677a72cfb80SBram Moolenaar      'vim9script',
1678a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1679a72cfb80SBram Moolenaar      ], 'E488:')
1680a72cfb80SBram Moolenaar
1681a72cfb80SBram Moolenaar  CheckScriptSuccess([
1682a72cfb80SBram Moolenaar      'vim9script',
16834c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1684a72cfb80SBram Moolenaar      'endfunc',
16854c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1686a72cfb80SBram Moolenaar      ])
1687a72cfb80SBram Moolenaar  CheckScriptFailure([
1688a72cfb80SBram Moolenaar      'vim9script',
16894c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1690a72cfb80SBram Moolenaar      'endfunc',
16914c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1692a72cfb80SBram Moolenaar      ], 'E488:')
1693a72cfb80SBram Moolenaar
1694a72cfb80SBram Moolenaar  CheckScriptSuccess([
1695a72cfb80SBram Moolenaar      'vim9script',
1696a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1697a72cfb80SBram Moolenaar      ])
1698a72cfb80SBram Moolenaar  CheckScriptFailure([
1699a72cfb80SBram Moolenaar      'vim9script',
1700a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1701a72cfb80SBram Moolenaar      ], 'E488:')
17022c5ed4e3SBram Moolenaarenddef
17032c5ed4e3SBram Moolenaar
17042c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
17052c5ed4e3SBram Moolenaar  CheckCanRunGui
17062c5ed4e3SBram Moolenaar
17072c5ed4e3SBram Moolenaar  CheckScriptFailure([
17082c5ed4e3SBram Moolenaar      'vim9script',
17092c5ed4e3SBram Moolenaar      'gui#comment'
17102c5ed4e3SBram Moolenaar      ], 'E499:')
17112c5ed4e3SBram Moolenaar  CheckScriptFailure([
17122c5ed4e3SBram Moolenaar      'vim9script',
17132c5ed4e3SBram Moolenaar      'gui -f#comment'
17142c5ed4e3SBram Moolenaar      ], 'E499:')
17157a092245SBram Moolenaarenddef
17167a092245SBram Moolenaar
1717a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1718a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1719a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1720a26b9700SBram Moolenaar
1721a26b9700SBram Moolenaar  edit test.vim
1722a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1723a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1724a26b9700SBram Moolenaar
1725a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1726a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1727a26b9700SBram Moolenaar
1728a26b9700SBram Moolenaar  g:entered = 0
1729a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1730a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1731a26b9700SBram Moolenaar
1732a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1733a26b9700SBram Moolenaar
1734a26b9700SBram Moolenaar  au! TabEnter
1735a26b9700SBram Moolenaar  unlet g:entered
1736d72c1bf0SBram Moolenaar
1737d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1738d72c1bf0SBram Moolenaar      'vim9script',
1739d72c1bf0SBram Moolenaar      'let g:var = 123',
1740d72c1bf0SBram Moolenaar      'let w:var = 777',
1741d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1742d72c1bf0SBram Moolenaar      ])
1743d72c1bf0SBram Moolenaar
1744d72c1bf0SBram Moolenaar  CheckScriptFailure([
1745d72c1bf0SBram Moolenaar      'vim9script',
1746d72c1bf0SBram Moolenaar      'let g:var = 123',
174732e35117SBram Moolenaar      'unlet g:var# comment1',
1748d72c1bf0SBram Moolenaar      ], 'E108:')
1749d72c1bf0SBram Moolenaar
1750d72c1bf0SBram Moolenaar  CheckScriptFailure([
1751d72c1bf0SBram Moolenaar      'let g:var = 123',
1752d72c1bf0SBram Moolenaar      'unlet g:var # something',
1753d72c1bf0SBram Moolenaar      ], 'E488:')
1754faac4104SBram Moolenaar
1755faac4104SBram Moolenaar  CheckScriptSuccess([
1756faac4104SBram Moolenaar      'vim9script',
175732e35117SBram Moolenaar      'if 1 # comment2',
1758faac4104SBram Moolenaar      '  echo "yes"',
1759faac4104SBram Moolenaar      'elseif 2 #comment',
1760faac4104SBram Moolenaar      '  echo "no"',
1761faac4104SBram Moolenaar      'endif',
1762faac4104SBram Moolenaar      ])
1763faac4104SBram Moolenaar
1764faac4104SBram Moolenaar  CheckScriptFailure([
1765faac4104SBram Moolenaar      'vim9script',
176632e35117SBram Moolenaar      'if 1# comment3',
1767faac4104SBram Moolenaar      '  echo "yes"',
1768faac4104SBram Moolenaar      'endif',
1769faac4104SBram Moolenaar      ], 'E15:')
1770faac4104SBram Moolenaar
1771faac4104SBram Moolenaar  CheckScriptFailure([
1772faac4104SBram Moolenaar      'vim9script',
177332e35117SBram Moolenaar      'if 0 # comment4',
1774faac4104SBram Moolenaar      '  echo "yes"',
1775faac4104SBram Moolenaar      'elseif 2#comment',
1776faac4104SBram Moolenaar      '  echo "no"',
1777faac4104SBram Moolenaar      'endif',
1778faac4104SBram Moolenaar      ], 'E15:')
1779faac4104SBram Moolenaar
1780faac4104SBram Moolenaar  CheckScriptSuccess([
1781faac4104SBram Moolenaar      'vim9script',
178232e35117SBram Moolenaar      'let v = 1 # comment5',
1783faac4104SBram Moolenaar      ])
1784faac4104SBram Moolenaar
1785faac4104SBram Moolenaar  CheckScriptFailure([
1786faac4104SBram Moolenaar      'vim9script',
178732e35117SBram Moolenaar      'let v = 1# comment6',
178832e35117SBram Moolenaar      ], 'E15:')
1789faac4104SBram Moolenaar
1790faac4104SBram Moolenaar  CheckScriptSuccess([
1791faac4104SBram Moolenaar      'vim9script',
1792faac4104SBram Moolenaar      'new'
1793faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1794faac4104SBram Moolenaar      '$',
1795faac4104SBram Moolenaar      'dsearch /pat/ #comment',
1796faac4104SBram Moolenaar      'bwipe!',
1797faac4104SBram Moolenaar      ])
1798faac4104SBram Moolenaar
1799faac4104SBram Moolenaar  CheckScriptFailure([
1800faac4104SBram Moolenaar      'vim9script',
1801faac4104SBram Moolenaar      'new'
1802faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1803faac4104SBram Moolenaar      '$',
1804faac4104SBram Moolenaar      'dsearch /pat/#comment',
1805faac4104SBram Moolenaar      'bwipe!',
1806faac4104SBram Moolenaar      ], 'E488:')
180774fae513SBram Moolenaar
180874fae513SBram Moolenaar  CheckScriptFailure([
180974fae513SBram Moolenaar      'vim9script',
181074fae513SBram Moolenaar      'func! SomeFunc()',
181174fae513SBram Moolenaar      ], 'E477:')
1812a26b9700SBram Moolenaarenddef
1813a26b9700SBram Moolenaar
18147e5bd91dSBram Moolenaardef Test_finish()
18157e5bd91dSBram Moolenaar  let lines =<< trim END
18167e5bd91dSBram Moolenaar    vim9script
18177e5bd91dSBram Moolenaar    let g:res = 'one'
18187e5bd91dSBram Moolenaar    if v:false | finish | endif
18197e5bd91dSBram Moolenaar    let g:res = 'two'
18207e5bd91dSBram Moolenaar    finish
18217e5bd91dSBram Moolenaar    let g:res = 'three'
18227e5bd91dSBram Moolenaar  END
18237e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
18247e5bd91dSBram Moolenaar  source Xfinished
18257e5bd91dSBram Moolenaar  assert_equal('two', g:res)
18267e5bd91dSBram Moolenaar
18277e5bd91dSBram Moolenaar  unlet g:res
18287e5bd91dSBram Moolenaar  delete('Xfinished')
18297e5bd91dSBram Moolenaarenddef
18307e5bd91dSBram Moolenaar
183132e35117SBram Moolenaardef Test_let_func_call()
183232e35117SBram Moolenaar  let lines =<< trim END
183332e35117SBram Moolenaar    vim9script
183432e35117SBram Moolenaar    func GetValue()
183532e35117SBram Moolenaar      if exists('g:count')
183632e35117SBram Moolenaar        let g:count += 1
183732e35117SBram Moolenaar      else
183832e35117SBram Moolenaar        let g:count = 1
183932e35117SBram Moolenaar      endif
184032e35117SBram Moolenaar      return 'this'
184132e35117SBram Moolenaar    endfunc
184232e35117SBram Moolenaar    let val: string = GetValue()
1843df671b46SBram Moolenaar    " env var is always a string
1844df671b46SBram Moolenaar    let env = $TERM
184532e35117SBram Moolenaar  END
184632e35117SBram Moolenaar  writefile(lines, 'Xfinished')
184732e35117SBram Moolenaar  source Xfinished
1848a5d0077eSBram Moolenaar  " GetValue() is not called during discovery phase
184932e35117SBram Moolenaar  assert_equal(1, g:count)
185032e35117SBram Moolenaar
185132e35117SBram Moolenaar  unlet g:count
185232e35117SBram Moolenaar  delete('Xfinished')
185332e35117SBram Moolenaarenddef
185432e35117SBram Moolenaar
185532e35117SBram Moolenaardef Test_let_missing_type()
185632e35117SBram Moolenaar  let lines =<< trim END
185732e35117SBram Moolenaar    vim9script
1858df671b46SBram Moolenaar    let var = g:unknown
1859227a69deSBram Moolenaar  END
1860822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
1861227a69deSBram Moolenaar
1862227a69deSBram Moolenaar  lines =<< trim END
1863227a69deSBram Moolenaar    vim9script
1864227a69deSBram Moolenaar    let nr: number = 123
1865227a69deSBram Moolenaar    let var = nr
1866227a69deSBram Moolenaar  END
1867822ba247SBram Moolenaar  CheckScriptSuccess(lines)
186832e35117SBram Moolenaarenddef
186932e35117SBram Moolenaar
1870c82a5b5dSBram Moolenaardef Test_let_declaration()
1871c82a5b5dSBram Moolenaar  let lines =<< trim END
1872c82a5b5dSBram Moolenaar    vim9script
1873c82a5b5dSBram Moolenaar    let var: string
1874c82a5b5dSBram Moolenaar    g:var_uninit = var
1875c82a5b5dSBram Moolenaar    var = 'text'
1876c82a5b5dSBram Moolenaar    g:var_test = var
1877984dddbeSBram Moolenaar    " prefixing s: is optional
1878984dddbeSBram Moolenaar    s:var = 'prefixed'
1879984dddbeSBram Moolenaar    g:var_prefixed = s:var
1880984dddbeSBram Moolenaar
1881984dddbeSBram Moolenaar    let s:other: number
1882984dddbeSBram Moolenaar    other = 1234
1883984dddbeSBram Moolenaar    g:other_var = other
1884c82a5b5dSBram Moolenaar  END
1885c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
1886c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
1887c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
1888984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
1889984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
1890c82a5b5dSBram Moolenaar
1891c82a5b5dSBram Moolenaar  unlet g:var_uninit
1892c82a5b5dSBram Moolenaar  unlet g:var_test
1893984dddbeSBram Moolenaar  unlet g:var_prefixed
1894984dddbeSBram Moolenaar  unlet g:other_var
1895c82a5b5dSBram Moolenaarenddef
1896c82a5b5dSBram Moolenaar
189734db91f7SBram Moolenaardef Test_let_type_check()
189834db91f7SBram Moolenaar  let lines =<< trim END
189934db91f7SBram Moolenaar    vim9script
190034db91f7SBram Moolenaar    let var: string
190134db91f7SBram Moolenaar    var = 1234
190234db91f7SBram Moolenaar  END
190334db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
1904984dddbeSBram Moolenaar
1905984dddbeSBram Moolenaar  lines =<< trim END
1906984dddbeSBram Moolenaar    vim9script
1907984dddbeSBram Moolenaar    let var:string
1908984dddbeSBram Moolenaar  END
1909984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
191034db91f7SBram Moolenaarenddef
191134db91f7SBram Moolenaar
1912a5d0077eSBram Moolenaardef Test_forward_declaration()
1913a5d0077eSBram Moolenaar  let lines =<< trim END
1914a5d0077eSBram Moolenaar    vim9script
1915a5d0077eSBram Moolenaar    def GetValue(): string
1916a5d0077eSBram Moolenaar      return theVal
1917a5d0077eSBram Moolenaar    enddef
1918a5d0077eSBram Moolenaar    let theVal = 'something'
1919822ba247SBram Moolenaar    g:initVal = GetValue()
1920a5d0077eSBram Moolenaar    theVal = 'else'
1921a5d0077eSBram Moolenaar    g:laterVal = GetValue()
1922a5d0077eSBram Moolenaar  END
1923a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
1924a5d0077eSBram Moolenaar  source Xforward
1925a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
1926a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
1927a5d0077eSBram Moolenaar
1928a5d0077eSBram Moolenaar  unlet g:initVal
1929a5d0077eSBram Moolenaar  unlet g:laterVal
1930a5d0077eSBram Moolenaar  delete('Xforward')
1931a5d0077eSBram Moolenaarenddef
1932a5d0077eSBram Moolenaar
19339721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
19349721fb4eSBram Moolenaar  let legacy_lines =<< trim END
19359721fb4eSBram Moolenaar    source Xvim9_script.vim
19369721fb4eSBram Moolenaar
19379721fb4eSBram Moolenaar    call assert_false(exists('local'))
19389721fb4eSBram Moolenaar    call assert_false(exists('exported'))
19399721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
19409721fb4eSBram Moolenaar    call assert_equal('global', global)
19419721fb4eSBram Moolenaar    call assert_equal('global', g:global)
19429721fb4eSBram Moolenaar
19439721fb4eSBram Moolenaar    " imported variable becomes script-local
19449721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
19459721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
19469721fb4eSBram Moolenaar    call assert_false(exists('exported'))
19479721fb4eSBram Moolenaar
19489721fb4eSBram Moolenaar    " imported function becomes script-local
19499721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
19509721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
19519721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
19529721fb4eSBram Moolenaar  END
19539721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
19549721fb4eSBram Moolenaar
19559721fb4eSBram Moolenaar  let vim9_lines =<< trim END
19569721fb4eSBram Moolenaar    vim9script
19579721fb4eSBram Moolenaar    let local = 'local'
19589721fb4eSBram Moolenaar    g:global = 'global'
19599721fb4eSBram Moolenaar    export let exported = 'exported'
19609721fb4eSBram Moolenaar    export def GetText(): string
19619721fb4eSBram Moolenaar       return 'text'
19629721fb4eSBram Moolenaar    enddef
19639721fb4eSBram Moolenaar  END
19649721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
19659721fb4eSBram Moolenaar
19669721fb4eSBram Moolenaar  source Xlegacy_script.vim
19679721fb4eSBram Moolenaar
19689721fb4eSBram Moolenaar  assert_equal('global', g:global)
19699721fb4eSBram Moolenaar"  unlet g:global
19709721fb4eSBram Moolenaar
19719721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
19729721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
19739721fb4eSBram Moolenaarenddef
1974a5d0077eSBram Moolenaar
1975585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1976585fea7bSBram Moolenaardef Test_substitute_cmd()
1977585fea7bSBram Moolenaar  new
1978585fea7bSBram Moolenaar  setline(1, 'something')
1979585fea7bSBram Moolenaar  :substitute(some(other(
1980585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1981585fea7bSBram Moolenaar  bwipe!
1982585fea7bSBram Moolenaar
1983585fea7bSBram Moolenaar  " also when the context is Vim9 script
1984585fea7bSBram Moolenaar  let lines =<< trim END
1985585fea7bSBram Moolenaar    vim9script
1986585fea7bSBram Moolenaar    new
1987585fea7bSBram Moolenaar    setline(1, 'something')
1988585fea7bSBram Moolenaar    :substitute(some(other(
1989585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1990585fea7bSBram Moolenaar    bwipe!
1991585fea7bSBram Moolenaar  END
1992585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1993585fea7bSBram Moolenaar  source Xvim9lines
1994585fea7bSBram Moolenaar
1995585fea7bSBram Moolenaar  delete('Xvim9lines')
1996585fea7bSBram Moolenaarenddef
1997585fea7bSBram Moolenaar
19988a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1999