18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5cfe435d7SBram Moolenaarsource vim9.vim
68a7d6542SBram Moolenaar
78a7d6542SBram Moolenaardef Test_syntax()
88a7d6542SBram Moolenaar  let var = 234
98a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
108a7d6542SBram Moolenaarenddef
118a7d6542SBram Moolenaar
126e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
136e587dcbSBram Moolenaarlet s:addToMe = 111
14401d9ffbSBram Moolenaarlet g:existing = 'yes'
15a8c17704SBram Moolenaarlet g:inc_counter = 1
16a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
176e587dcbSBram Moolenaar
188a7d6542SBram Moolenaardef Test_assignment()
198a7d6542SBram Moolenaar  let bool1: bool = true
208a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
218a7d6542SBram Moolenaar  let bool2: bool = false
228a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
238a7d6542SBram Moolenaar
240c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
258a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
260c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
270c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
280c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
298a7d6542SBram Moolenaar
30436472f5SBram Moolenaar  let listS: list<string> = []
31436472f5SBram Moolenaar  let listN: list<number> = []
328a7d6542SBram Moolenaar
330c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
348a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
350c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
360c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
370c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
38b283a8a6SBram Moolenaar
39f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
40f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
41f93c7feaSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1082:')
42f93c7feaSBram Moolenaar
439be61bbbSBram Moolenaar  let a: number = 6
449be61bbbSBram Moolenaar  assert_equal(6, a)
459be61bbbSBram Moolenaar
4642a480bfSBram Moolenaar  if has('channel')
4742a480bfSBram Moolenaar    let chan1: channel
48fbdd08edSBram Moolenaar    let job1: job
49f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
5042a480bfSBram Moolenaar  endif
51fbdd08edSBram Moolenaar  if has('float')
52fbdd08edSBram Moolenaar    let float1: float = 3.4
53fbdd08edSBram Moolenaar  endif
545deeb3f1SBram Moolenaar  let Funky1: func
555deeb3f1SBram Moolenaar  let Funky2: func = function('len')
564c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
5742a480bfSBram Moolenaar
58cb711abfSBram Moolenaar  # type becomes list<any>
5961a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
60cb711abfSBram Moolenaar  # type becomes dict<any>
615381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
6261a6d4e4SBram Moolenaar
63401d9ffbSBram Moolenaar  g:newvar = 'new'
64401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
65401d9ffbSBram Moolenaar
66401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
67401d9ffbSBram Moolenaar  g:existing = 'no'
68401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
69401d9ffbSBram Moolenaar
70b283a8a6SBram Moolenaar  v:char = 'abc'
716e587dcbSBram Moolenaar  assert_equal('abc', v:char)
72b283a8a6SBram Moolenaar
73b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
746e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
75b283a8a6SBram Moolenaar  $ENVVAR = ''
766e587dcbSBram Moolenaar
77fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
78fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
79fd1823e0SBram Moolenaar  s:addToMe += 222
80fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
810bbf722aSBram Moolenaar  s:newVar = 'new'
820bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
83a8c17704SBram Moolenaar
84a8c17704SBram Moolenaar  set ts=7
85a8c17704SBram Moolenaar  &ts += 1
86a8c17704SBram Moolenaar  assert_equal(8, &ts)
8780c34ca3SBram Moolenaar  &ts -= 3
8880c34ca3SBram Moolenaar  assert_equal(5, &ts)
8980c34ca3SBram Moolenaar  &ts *= 2
9080c34ca3SBram Moolenaar  assert_equal(10, &ts)
9180c34ca3SBram Moolenaar  &ts /= 3
9280c34ca3SBram Moolenaar  assert_equal(3, &ts)
9380c34ca3SBram Moolenaar  set ts=10
9480c34ca3SBram Moolenaar  &ts %= 4
9580c34ca3SBram Moolenaar  assert_equal(2, &ts)
96a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
97a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
98a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
99cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
100585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
10180c34ca3SBram Moolenaar  &ts = 8
102a8c17704SBram Moolenaar
103a8c17704SBram Moolenaar  g:inc_counter += 1
104a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
105a8c17704SBram Moolenaar
106a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
107a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
108a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
109a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
110a8c17704SBram Moolenaar
111a8c17704SBram Moolenaar  @a = 'areg'
112a8c17704SBram Moolenaar  @a ..= 'add'
113a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
114a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
115a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
116e69f6d04SBram Moolenaar
117e69f6d04SBram Moolenaar  v:errmsg = 'none'
118e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
119e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
120e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
121e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1225deeb3f1SBram Moolenaarenddef
1235deeb3f1SBram Moolenaar
124d3aac291SBram Moolenaardef Test_assignment_local()
125d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
126d3aac291SBram Moolenaar  " changed.
127d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
128d3aac291SBram Moolenaar    let b:existing = 'yes'
129d3aac291SBram Moolenaar    let w:existing = 'yes'
130d3aac291SBram Moolenaar    let t:existing = 'yes'
131d3aac291SBram Moolenaar
132d3aac291SBram Moolenaar    def Test_assignment_local_internal()
133d3aac291SBram Moolenaar      b:newvar = 'new'
134d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
135d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
136d3aac291SBram Moolenaar      b:existing = 'no'
137d3aac291SBram Moolenaar      assert_equal('no', b:existing)
138d3aac291SBram Moolenaar
139d3aac291SBram Moolenaar      w:newvar = 'new'
140d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
141d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
142d3aac291SBram Moolenaar      w:existing = 'no'
143d3aac291SBram Moolenaar      assert_equal('no', w:existing)
144d3aac291SBram Moolenaar
145d3aac291SBram Moolenaar      t:newvar = 'new'
146d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
147d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
148d3aac291SBram Moolenaar      t:existing = 'no'
149d3aac291SBram Moolenaar      assert_equal('no', t:existing)
150d3aac291SBram Moolenaar    enddef
151d3aac291SBram Moolenaar    call Test_assignment_local_internal()
152d3aac291SBram Moolenaar  END
153d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
154d3aac291SBram Moolenaarenddef
155d3aac291SBram Moolenaar
1565deeb3f1SBram Moolenaardef Test_assignment_default()
157e69f6d04SBram Moolenaar
158cb711abfSBram Moolenaar  # Test default values.
159e69f6d04SBram Moolenaar  let thebool: bool
160e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
161e69f6d04SBram Moolenaar
162e69f6d04SBram Moolenaar  let thenumber: number
163e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
164e69f6d04SBram Moolenaar
165e69f6d04SBram Moolenaar  if has('float')
166e69f6d04SBram Moolenaar    let thefloat: float
167e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
168e69f6d04SBram Moolenaar  endif
169e69f6d04SBram Moolenaar
170e69f6d04SBram Moolenaar  let thestring: string
171e69f6d04SBram Moolenaar  assert_equal('', thestring)
172e69f6d04SBram Moolenaar
173e69f6d04SBram Moolenaar  let theblob: blob
174e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
175e69f6d04SBram Moolenaar
1765deeb3f1SBram Moolenaar  let Thefunc: func
1775deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
178e69f6d04SBram Moolenaar
179e69f6d04SBram Moolenaar  let thelist: list<any>
180e69f6d04SBram Moolenaar  assert_equal([], thelist)
181e69f6d04SBram Moolenaar
182e69f6d04SBram Moolenaar  let thedict: dict<any>
183e69f6d04SBram Moolenaar  assert_equal({}, thedict)
184e69f6d04SBram Moolenaar
1852c869deeSBram Moolenaar  if has('channel')
186e69f6d04SBram Moolenaar    let thejob: job
187e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
188e69f6d04SBram Moolenaar
189e69f6d04SBram Moolenaar    let thechannel: channel
190e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
1912c869deeSBram Moolenaar  endif
192585fea7bSBram Moolenaar
193585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
194585fea7bSBram Moolenaar  assert_equal(5678, nr)
1958a7d6542SBram Moolenaarenddef
1968a7d6542SBram Moolenaar
197cab27678SBram Moolenaardef Mess(): string
198cab27678SBram Moolenaar  v:foldstart = 123
199cab27678SBram Moolenaar  return 'xxx'
200cab27678SBram Moolenaarenddef
201cab27678SBram Moolenaar
202d72c1bf0SBram Moolenaardef Test_assignment_failure()
2038a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
2048a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
2058a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
2068a7d6542SBram Moolenaar
2078a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
2088a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
2098a7d6542SBram Moolenaar
2109be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
2119be61bbbSBram Moolenaar
212e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
2139be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
2149be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
2159be61bbbSBram Moolenaar
2169be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
2179be61bbbSBram Moolenaar
2189be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
2199be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
2209be61bbbSBram Moolenaar
2219be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
222d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
223d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
224d3aac291SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1080:')
2259be61bbbSBram Moolenaar
2269be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2279be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2289be61bbbSBram Moolenaar
22933fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
23033fa29cfSBram Moolenaar
2318a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2328a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2338a7d6542SBram Moolenaar
2348a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2358a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2368a7d6542SBram Moolenaar
2378a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2388a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
23942a480bfSBram Moolenaar
240d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
24142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
242cab27678SBram Moolenaar
243cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
244cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
245d72c1bf0SBram Moolenaarenddef
246d72c1bf0SBram Moolenaar
247d72c1bf0SBram Moolenaardef Test_unlet()
248d72c1bf0SBram Moolenaar  g:somevar = 'yes'
249d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
250d72c1bf0SBram Moolenaar  unlet g:somevar
251d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
252d72c1bf0SBram Moolenaar  unlet! g:somevar
253d72c1bf0SBram Moolenaar
254d72c1bf0SBram Moolenaar  call CheckScriptFailure([
255d72c1bf0SBram Moolenaar        'vim9script',
256d72c1bf0SBram Moolenaar        'let svar = 123',
257d72c1bf0SBram Moolenaar        'unlet svar',
258d72c1bf0SBram Moolenaar        ], 'E1081:')
259d72c1bf0SBram Moolenaar  call CheckScriptFailure([
260d72c1bf0SBram Moolenaar        'vim9script',
261d72c1bf0SBram Moolenaar        'let svar = 123',
262d72c1bf0SBram Moolenaar        'unlet s:svar',
263d72c1bf0SBram Moolenaar        ], 'E1081:')
264d72c1bf0SBram Moolenaar  call CheckScriptFailure([
265d72c1bf0SBram Moolenaar        'vim9script',
266d72c1bf0SBram Moolenaar        'let svar = 123',
267d72c1bf0SBram Moolenaar        'def Func()',
268d72c1bf0SBram Moolenaar        '  unlet svar',
269d72c1bf0SBram Moolenaar        'enddef',
270d72c1bf0SBram Moolenaar        ], 'E1081:')
271d72c1bf0SBram Moolenaar  call CheckScriptFailure([
272d72c1bf0SBram Moolenaar        'vim9script',
273d72c1bf0SBram Moolenaar        'let svar = 123',
274d72c1bf0SBram Moolenaar        'def Func()',
275d72c1bf0SBram Moolenaar        '  unlet s:svar',
276d72c1bf0SBram Moolenaar        'enddef',
277d72c1bf0SBram Moolenaar        ], 'E1081:')
2787bdaea6eSBram Moolenaar
2797bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
2807bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
2817bdaea6eSBram Moolenaar  unlet $ENVVAR
2827bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
283d72c1bf0SBram Moolenaarenddef
284599c89c8SBram Moolenaar
2854c17ad94SBram Moolenaardef Test_delfunction()
2864c17ad94SBram Moolenaar  " Check function is defined in script namespace
2874c17ad94SBram Moolenaar  CheckScriptSuccess([
2884c17ad94SBram Moolenaar      'vim9script',
2894c17ad94SBram Moolenaar      'func CheckMe()',
2904c17ad94SBram Moolenaar      '  return 123',
2914c17ad94SBram Moolenaar      'endfunc',
2924c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
2934c17ad94SBram Moolenaar      ])
2944c17ad94SBram Moolenaar
2954c17ad94SBram Moolenaar  " Check function in script namespace cannot be deleted
2964c17ad94SBram Moolenaar  CheckScriptFailure([
2974c17ad94SBram Moolenaar      'vim9script',
2984c17ad94SBram Moolenaar      'func DeleteMe1()',
2994c17ad94SBram Moolenaar      'endfunc',
3004c17ad94SBram Moolenaar      'delfunction DeleteMe1',
3014c17ad94SBram Moolenaar      ], 'E1084:')
3024c17ad94SBram Moolenaar  CheckScriptFailure([
3034c17ad94SBram Moolenaar      'vim9script',
3044c17ad94SBram Moolenaar      'func DeleteMe2()',
3054c17ad94SBram Moolenaar      'endfunc',
3064c17ad94SBram Moolenaar      'def DoThat()',
3074c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
3084c17ad94SBram Moolenaar      'enddef',
3094c17ad94SBram Moolenaar      'DoThat()',
3104c17ad94SBram Moolenaar      ], 'E1084:')
3114c17ad94SBram Moolenaar  CheckScriptFailure([
3124c17ad94SBram Moolenaar      'vim9script',
3134c17ad94SBram Moolenaar      'def DeleteMe3()',
3144c17ad94SBram Moolenaar      'enddef',
3154c17ad94SBram Moolenaar      'delfunction DeleteMe3',
3164c17ad94SBram Moolenaar      ], 'E1084:')
3174c17ad94SBram Moolenaar  CheckScriptFailure([
3184c17ad94SBram Moolenaar      'vim9script',
3194c17ad94SBram Moolenaar      'def DeleteMe4()',
3204c17ad94SBram Moolenaar      'enddef',
3214c17ad94SBram Moolenaar      'def DoThat()',
3224c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
3234c17ad94SBram Moolenaar      'enddef',
3244c17ad94SBram Moolenaar      'DoThat()',
3254c17ad94SBram Moolenaar      ], 'E1084:')
3264c17ad94SBram Moolenaarenddef
3274c17ad94SBram Moolenaar
328599c89c8SBram Moolenaarfunc Test_wrong_type()
329599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
330599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
331599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
332599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
333599c89c8SBram Moolenaar
334599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
335599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
33642a480bfSBram Moolenaar
33742a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
33842a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
33942a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
34042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
34142a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
34242a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
34342a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
34442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
34542a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
34642a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
34742a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
348a0a9f43aSBram Moolenaar
349a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
350a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
3518a7d6542SBram Moolenaarendfunc
3528a7d6542SBram Moolenaar
3538a7d6542SBram Moolenaarfunc Test_const()
3548a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
3558a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
3568a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
3579be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
3588a7d6542SBram Moolenaarendfunc
3598a7d6542SBram Moolenaar
3608a7d6542SBram Moolenaardef Test_block()
3618a7d6542SBram Moolenaar  let outer = 1
3628a7d6542SBram Moolenaar  {
3638a7d6542SBram Moolenaar    let inner = 2
3648a7d6542SBram Moolenaar    assert_equal(1, outer)
3658a7d6542SBram Moolenaar    assert_equal(2, inner)
3668a7d6542SBram Moolenaar  }
3678a7d6542SBram Moolenaar  assert_equal(1, outer)
3688a7d6542SBram Moolenaarenddef
3698a7d6542SBram Moolenaar
3708a7d6542SBram Moolenaarfunc Test_block_failure()
3718a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
372585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
373585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
3748a7d6542SBram Moolenaarendfunc
3758a7d6542SBram Moolenaar
376585fea7bSBram Moolenaardef Test_cmd_modifier()
377585fea7bSBram Moolenaar  tab echo '0'
378585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
379585fea7bSBram Moolenaarenddef
380585fea7bSBram Moolenaar
3818a7d6542SBram Moolenaardef Test_try_catch()
3828a7d6542SBram Moolenaar  let l = []
3837a092245SBram Moolenaar  try # comment
3848a7d6542SBram Moolenaar    add(l, '1')
3858a7d6542SBram Moolenaar    throw 'wrong'
3868a7d6542SBram Moolenaar    add(l, '2')
3877a092245SBram Moolenaar  catch # comment
3888a7d6542SBram Moolenaar    add(l, v:exception)
3897a092245SBram Moolenaar  finally # comment
3908a7d6542SBram Moolenaar    add(l, '3')
3917a092245SBram Moolenaar  endtry # comment
3928a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
3938a7d6542SBram Moolenaarenddef
3948a7d6542SBram Moolenaar
395257cc5eeSBram Moolenaardef ThrowFromDef()
396a72cfb80SBram Moolenaar  throw "getout" # comment
397257cc5eeSBram Moolenaarenddef
398257cc5eeSBram Moolenaar
399257cc5eeSBram Moolenaarfunc CatchInFunc()
400257cc5eeSBram Moolenaar  try
401257cc5eeSBram Moolenaar    call ThrowFromDef()
402257cc5eeSBram Moolenaar  catch
403257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
404257cc5eeSBram Moolenaar  endtry
405257cc5eeSBram Moolenaarendfunc
406257cc5eeSBram Moolenaar
407257cc5eeSBram Moolenaardef CatchInDef()
408257cc5eeSBram Moolenaar  try
409257cc5eeSBram Moolenaar    ThrowFromDef()
410257cc5eeSBram Moolenaar  catch
411257cc5eeSBram Moolenaar    g:thrown_def = v:exception
412257cc5eeSBram Moolenaar  endtry
413257cc5eeSBram Moolenaarenddef
414257cc5eeSBram Moolenaar
415f575adffSBram Moolenaardef ReturnFinally(): string
416f575adffSBram Moolenaar  try
417f575adffSBram Moolenaar    return 'intry'
418f575adffSBram Moolenaar  finally
419f575adffSBram Moolenaar    g:in_finally = 'finally'
420f575adffSBram Moolenaar  endtry
421f575adffSBram Moolenaar  return 'end'
422f575adffSBram Moolenaarenddef
423f575adffSBram Moolenaar
424257cc5eeSBram Moolenaardef Test_try_catch_nested()
425257cc5eeSBram Moolenaar  CatchInFunc()
426257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
427257cc5eeSBram Moolenaar
428257cc5eeSBram Moolenaar  CatchInDef()
429257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
430f575adffSBram Moolenaar
431f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
432f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
433f575adffSBram Moolenaarenddef
434f575adffSBram Moolenaar
435f575adffSBram Moolenaardef Test_try_catch_match()
436f575adffSBram Moolenaar  let seq = 'a'
437f575adffSBram Moolenaar  try
438f575adffSBram Moolenaar    throw 'something'
439f575adffSBram Moolenaar  catch /nothing/
440f575adffSBram Moolenaar    seq ..= 'x'
441f575adffSBram Moolenaar  catch /some/
442f575adffSBram Moolenaar    seq ..= 'b'
443f575adffSBram Moolenaar  catch /asdf/
444f575adffSBram Moolenaar    seq ..= 'x'
445e8c4abbbSBram Moolenaar  catch ?a\?sdf?
446e8c4abbbSBram Moolenaar    seq ..= 'y'
447f575adffSBram Moolenaar  finally
448f575adffSBram Moolenaar    seq ..= 'c'
449f575adffSBram Moolenaar  endtry
450f575adffSBram Moolenaar  assert_equal('abc', seq)
451257cc5eeSBram Moolenaarenddef
452257cc5eeSBram Moolenaar
453e8c4abbbSBram Moolenaardef Test_try_catch_fails()
454e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
455e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
456e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
457585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
458585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
459585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
460585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
461585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
462585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
463585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
464585fea7bSBram Moolenaar
465a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
466585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
467e8c4abbbSBram Moolenaarenddef
468e8c4abbbSBram Moolenaar
469*40ee466cSBram Moolenaarlet someJob = test_null_job()
470*40ee466cSBram Moolenaar
471*40ee466cSBram Moolenaardef FuncWithError()
472*40ee466cSBram Moolenaar  echomsg g:someJob
473*40ee466cSBram Moolenaarenddef
474*40ee466cSBram Moolenaar
475*40ee466cSBram Moolenaarfunc Test_convert_emsg_to_exception()
476*40ee466cSBram Moolenaar  try
477*40ee466cSBram Moolenaar    call FuncWithError()
478*40ee466cSBram Moolenaar  catch
479*40ee466cSBram Moolenaar    call assert_match('Vim:E908:', v:exception)
480*40ee466cSBram Moolenaar  endtry
481*40ee466cSBram Moolenaarendfunc
482*40ee466cSBram Moolenaar
4838a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4848a7d6542SBram Moolenaar  vim9script
4858a7d6542SBram Moolenaar  let name: string = 'bob'
4868a7d6542SBram Moolenaar  def Concat(arg: string): string
4878a7d6542SBram Moolenaar    return name .. arg
4888a7d6542SBram Moolenaar  enddef
4898a7d6542SBram Moolenaar  let g:result = Concat('bie')
4908a7d6542SBram Moolenaar  let g:localname = name
4918a7d6542SBram Moolenaar
4928a7d6542SBram Moolenaar  export const CONST = 1234
4938a7d6542SBram Moolenaar  export let exported = 9876
4946e587dcbSBram Moolenaar  export let exp_name = 'John'
4958a7d6542SBram Moolenaar  export def Exported(): string
4968a7d6542SBram Moolenaar    return 'Exported'
4978a7d6542SBram Moolenaar  enddef
4988a7d6542SBram MoolenaarEND
4998a7d6542SBram Moolenaar
5005269bd2aSBram Moolenaardef Test_vim9_import_export()
5018a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5028a7d6542SBram Moolenaar    vim9script
5038a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5048a7d6542SBram Moolenaar    g:imported = exported
5056e587dcbSBram Moolenaar    exported += 3
5066e587dcbSBram Moolenaar    g:imported_added = exported
5078a7d6542SBram Moolenaar    g:imported_func = Exported()
5086e587dcbSBram Moolenaar
5096e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5106e587dcbSBram Moolenaar    g:imported_name = exp_name
5116e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5126e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5135381c7a1SBram Moolenaar    g:imported_later = exported
5148a7d6542SBram Moolenaar  END
5158a7d6542SBram Moolenaar
5168a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5178a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5188a7d6542SBram Moolenaar
5198a7d6542SBram Moolenaar  source Ximport.vim
5208a7d6542SBram Moolenaar
5218a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5228a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5238a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5246e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5255381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5268a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5276e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5286e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5298a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5308a7d6542SBram Moolenaar
5318a7d6542SBram Moolenaar  unlet g:result
5328a7d6542SBram Moolenaar  unlet g:localname
5338a7d6542SBram Moolenaar  unlet g:imported
5346e587dcbSBram Moolenaar  unlet g:imported_added
5355381c7a1SBram Moolenaar  unlet g:imported_later
5368a7d6542SBram Moolenaar  unlet g:imported_func
5376e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5388a7d6542SBram Moolenaar  delete('Ximport.vim')
539f2d5c240SBram Moolenaar
5405381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5415381c7a1SBram Moolenaar    vim9script
5425381c7a1SBram Moolenaar    def ImportInDef()
5435381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5445381c7a1SBram Moolenaar      g:imported = exported
5455381c7a1SBram Moolenaar      exported += 7
5465381c7a1SBram Moolenaar      g:imported_added = exported
5475381c7a1SBram Moolenaar    enddef
5485381c7a1SBram Moolenaar    ImportInDef()
5495381c7a1SBram Moolenaar  END
5505381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5515381c7a1SBram Moolenaar  source Ximport2.vim
5525381c7a1SBram Moolenaar  " TODO: this should be 9879
5535381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5545381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5555381c7a1SBram Moolenaar  unlet g:imported
5565381c7a1SBram Moolenaar  unlet g:imported_added
5575381c7a1SBram Moolenaar  delete('Ximport2.vim')
5585381c7a1SBram Moolenaar
559f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
560f2d5c240SBram Moolenaar    vim9script
561f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
562f2d5c240SBram Moolenaar    def UseExport()
563f2d5c240SBram Moolenaar      g:imported = Export.exported
564f2d5c240SBram Moolenaar    enddef
565f2d5c240SBram Moolenaar    UseExport()
566f2d5c240SBram Moolenaar  END
567f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
568f2d5c240SBram Moolenaar  source Ximport.vim
5695381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
570f2d5c240SBram Moolenaar
571599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
572599c89c8SBram Moolenaar    vim9script
573599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
574599c89c8SBram Moolenaar    def Func()
575599c89c8SBram Moolenaar      let dummy = 1
576599c89c8SBram Moolenaar      let imported = Export + dummy
577599c89c8SBram Moolenaar    enddef
578599c89c8SBram Moolenaar  END
579599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
580599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
581599c89c8SBram Moolenaar
582599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
583599c89c8SBram Moolenaar    vim9script
584599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
585599c89c8SBram Moolenaar    def Func()
586599c89c8SBram Moolenaar      let imported = Export . exported
587599c89c8SBram Moolenaar    enddef
588599c89c8SBram Moolenaar  END
589599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
590599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
591599c89c8SBram Moolenaar
592599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
593599c89c8SBram Moolenaar    vim9script
594599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
595599c89c8SBram Moolenaar    def Func()
596599c89c8SBram Moolenaar      let imported = Export.
597599c89c8SBram Moolenaar    enddef
598599c89c8SBram Moolenaar  END
599599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
600599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
601599c89c8SBram Moolenaar
602f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
603f2d5c240SBram Moolenaar    vim9script
604f2d5c240SBram Moolenaar    import * from './Xexport.vim'
605f2d5c240SBram Moolenaar    g:imported = exported
606f2d5c240SBram Moolenaar  END
607f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
608f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
609f2d5c240SBram Moolenaar
610fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
611fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
612fa29c8abSBram Moolenaar    vim9script
613fa29c8abSBram Moolenaar    import name from './Xexport.vim'
614fa29c8abSBram Moolenaar  END
615fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
616fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
617fa29c8abSBram Moolenaar
6185269bd2aSBram Moolenaar  " try to import something that is already defined
6195269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6205269bd2aSBram Moolenaar    vim9script
6215269bd2aSBram Moolenaar    let exported = 'something'
6225269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6235269bd2aSBram Moolenaar  END
6245269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6255269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6265269bd2aSBram Moolenaar
6275269bd2aSBram Moolenaar  " try to import something that is already defined
6285269bd2aSBram Moolenaar  import_already_defined =<< trim END
6295269bd2aSBram Moolenaar    vim9script
6305269bd2aSBram Moolenaar    let exported = 'something'
6315269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6325269bd2aSBram Moolenaar  END
6335269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6345269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6355269bd2aSBram Moolenaar
6365269bd2aSBram Moolenaar  " try to import something that is already defined
6375269bd2aSBram Moolenaar  import_already_defined =<< trim END
6385269bd2aSBram Moolenaar    vim9script
6395269bd2aSBram Moolenaar    let exported = 'something'
6405269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6415269bd2aSBram Moolenaar  END
6425269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6435269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6445269bd2aSBram Moolenaar
645fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
646fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
647fa29c8abSBram Moolenaar    vim9script
648fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
649fa29c8abSBram Moolenaar  END
650fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
651fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
652fa29c8abSBram Moolenaar
653fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
654fa29c8abSBram Moolenaar    vim9script
655fa29c8abSBram Moolenaar    import name './Xexport.vim'
656fa29c8abSBram Moolenaar  END
657fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
658fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
659fa29c8abSBram Moolenaar
660fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
661fa29c8abSBram Moolenaar    vim9script
662fa29c8abSBram Moolenaar    import name from Xexport.vim
663fa29c8abSBram Moolenaar  END
664fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
665fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
666fa29c8abSBram Moolenaar
667fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
668fa29c8abSBram Moolenaar    vim9script
669fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
670fa29c8abSBram Moolenaar  END
671fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
672fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
673fa29c8abSBram Moolenaar
674fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
675fa29c8abSBram Moolenaar    vim9script
676fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
677fa29c8abSBram Moolenaar  END
6785269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
6795269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
680fa29c8abSBram Moolenaar
681f2d5c240SBram Moolenaar  delete('Ximport.vim')
6825269bd2aSBram Moolenaar  delete('Ximport3.vim')
6838a7d6542SBram Moolenaar  delete('Xexport.vim')
6848a7d6542SBram Moolenaar
685750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
686750802b5SBram Moolenaar  set cpo&vi
687750802b5SBram Moolenaar  let cpo_before = &cpo
688750802b5SBram Moolenaar  let lines =<< trim END
689750802b5SBram Moolenaar    vim9script
690750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
691750802b5SBram Moolenaar  END
692750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
693750802b5SBram Moolenaar  source Xvim9_script
694750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
695750802b5SBram Moolenaar  set cpo&vim
696750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
697750802b5SBram Moolenaar  delete('Xvim9_script')
698750802b5SBram Moolenaarenddef
699750802b5SBram Moolenaar
700750802b5SBram Moolenaardef Test_vim9script_fails()
7018a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7028a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
703750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
704f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
705750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
706750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
707750802b5SBram Moolenaar
708750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
709a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
7108a7d6542SBram Moolenaarenddef
7118a7d6542SBram Moolenaar
7124c17ad94SBram Moolenaardef Test_vim9script_reload_import()
7138a7d6542SBram Moolenaar  let lines =<< trim END
7148a7d6542SBram Moolenaar    vim9script
7158a7d6542SBram Moolenaar    const var = ''
7168a7d6542SBram Moolenaar    let valone = 1234
7178a7d6542SBram Moolenaar    def MyFunc(arg: string)
7188a7d6542SBram Moolenaar       valone = 5678
7198a7d6542SBram Moolenaar    enddef
7208a7d6542SBram Moolenaar  END
7218a7d6542SBram Moolenaar  let morelines =<< trim END
7228a7d6542SBram Moolenaar    let valtwo = 222
7238a7d6542SBram Moolenaar    export def GetValtwo(): number
7248a7d6542SBram Moolenaar      return valtwo
7258a7d6542SBram Moolenaar    enddef
7268a7d6542SBram Moolenaar  END
72703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7288a7d6542SBram Moolenaar  source Xreload.vim
7298a7d6542SBram Moolenaar  source Xreload.vim
7308a7d6542SBram Moolenaar  source Xreload.vim
7318a7d6542SBram Moolenaar
7328a7d6542SBram Moolenaar  let testlines =<< trim END
7338a7d6542SBram Moolenaar    vim9script
7348a7d6542SBram Moolenaar    def TheFunc()
7358a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
7368a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
7378a7d6542SBram Moolenaar    enddef
7388a7d6542SBram Moolenaar    TheFunc()
7398a7d6542SBram Moolenaar  END
7408a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
7418a7d6542SBram Moolenaar  source Ximport.vim
7428a7d6542SBram Moolenaar
74303afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
74403afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
7458a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7468a7d6542SBram Moolenaar  source Ximport.vim
7478a7d6542SBram Moolenaar
7488a7d6542SBram Moolenaar  " cannot declare a var twice
7498a7d6542SBram Moolenaar  lines =<< trim END
7508a7d6542SBram Moolenaar    vim9script
7518a7d6542SBram Moolenaar    let valone = 1234
7528a7d6542SBram Moolenaar    let valone = 5678
7538a7d6542SBram Moolenaar  END
7548a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7558a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7568a7d6542SBram Moolenaar
7578a7d6542SBram Moolenaar  delete('Xreload.vim')
7588a7d6542SBram Moolenaar  delete('Ximport.vim')
7598a7d6542SBram Moolenaarenddef
7608a7d6542SBram Moolenaar
7614c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
7624c17ad94SBram Moolenaar  let first_lines =<< trim END
7634c17ad94SBram Moolenaar    vim9script
7644c17ad94SBram Moolenaar    def FuncYes(): string
7654c17ad94SBram Moolenaar      return 'yes'
7664c17ad94SBram Moolenaar    enddef
7674c17ad94SBram Moolenaar  END
76803afdcf1SBram Moolenaar  let withno_lines =<< trim END
7694c17ad94SBram Moolenaar    def FuncNo(): string
7704c17ad94SBram Moolenaar      return 'no'
7714c17ad94SBram Moolenaar    enddef
7724c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
7734c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
7744c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
77503afdcf1SBram Moolenaar    enddef
77603afdcf1SBram Moolenaar  END
77703afdcf1SBram Moolenaar  let nono_lines =<< trim END
77803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
77903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
7804c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
7814c17ad94SBram Moolenaar    enddef
7824c17ad94SBram Moolenaar  END
7834c17ad94SBram Moolenaar
7844c17ad94SBram Moolenaar  # FuncNo() is defined
78503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
7864c17ad94SBram Moolenaar  source Xreloaded.vim
7874c17ad94SBram Moolenaar  g:DoCheck(true)
7884c17ad94SBram Moolenaar
7894c17ad94SBram Moolenaar  # FuncNo() is not redefined
79003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
7914c17ad94SBram Moolenaar  source Xreloaded.vim
79203afdcf1SBram Moolenaar  g:DoCheck()
7934c17ad94SBram Moolenaar
7944c17ad94SBram Moolenaar  # FuncNo() is back
79503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
7964c17ad94SBram Moolenaar  source Xreloaded.vim
79703afdcf1SBram Moolenaar  g:DoCheck()
7984c17ad94SBram Moolenaar
7994c17ad94SBram Moolenaar  delete('Xreloaded.vim')
8004c17ad94SBram Moolenaarenddef
8014c17ad94SBram Moolenaar
8028a7d6542SBram Moolenaardef Test_import_absolute()
8038a7d6542SBram Moolenaar  let import_lines = [
804e6085c53SBram Moolenaar        'vim9script',
805e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
806e6085c53SBram Moolenaar        'def UseExported()',
807e6085c53SBram Moolenaar        '  g:imported_abs = exported',
808e6085c53SBram Moolenaar        '  exported = 8888',
809e6085c53SBram Moolenaar        '  g:imported_after = exported',
810e6085c53SBram Moolenaar        'enddef',
811e6085c53SBram Moolenaar        'UseExported()',
812e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
813e6085c53SBram Moolenaar        ]
8148a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8158a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8168a7d6542SBram Moolenaar
8178a7d6542SBram Moolenaar  source Ximport_abs.vim
8188a7d6542SBram Moolenaar
8198a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8204e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
821675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
822675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
823675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
824675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
825675f716eSBram Moolenaar          'exported = 8888.*' ..
826675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
827675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
828675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
829675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
830e6085c53SBram Moolenaar        g:import_disassembled)
8318a7d6542SBram Moolenaar  unlet g:imported_abs
8324e12a5dfSBram Moolenaar  unlet g:import_disassembled
8338a7d6542SBram Moolenaar
8348a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8358a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8368a7d6542SBram Moolenaarenddef
8378a7d6542SBram Moolenaar
8388a7d6542SBram Moolenaardef Test_import_rtp()
8398a7d6542SBram Moolenaar  let import_lines = [
840e6085c53SBram Moolenaar        'vim9script',
841e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
842e6085c53SBram Moolenaar        'g:imported_rtp = exported',
843e6085c53SBram Moolenaar        ]
8448a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
8458a7d6542SBram Moolenaar  mkdir('import')
8468a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
8478a7d6542SBram Moolenaar
8488a7d6542SBram Moolenaar  let save_rtp = &rtp
8498a7d6542SBram Moolenaar  &rtp = getcwd()
8508a7d6542SBram Moolenaar  source Ximport_rtp.vim
8518a7d6542SBram Moolenaar  &rtp = save_rtp
8528a7d6542SBram Moolenaar
8538a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
8548a7d6542SBram Moolenaar  unlet g:imported_rtp
8558a7d6542SBram Moolenaar
8568a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
8578a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
8588a7d6542SBram Moolenaar  delete('import', 'd')
8598a7d6542SBram Moolenaarenddef
8608a7d6542SBram Moolenaar
8618a7d6542SBram Moolenaardef Test_fixed_size_list()
8628a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
8638a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
8648a7d6542SBram Moolenaar  l->remove(0)
8658a7d6542SBram Moolenaar  l->add(5)
8668a7d6542SBram Moolenaar  l->insert(99, 1)
8670f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
8688a7d6542SBram Moolenaarenddef
8698a7d6542SBram Moolenaar
870158906cfSBram Moolenaardef IfElse(what: number): string
871158906cfSBram Moolenaar  let res = ''
872158906cfSBram Moolenaar  if what == 1
873158906cfSBram Moolenaar    res = "one"
874158906cfSBram Moolenaar  elseif what == 2
875158906cfSBram Moolenaar    res = "two"
876a259d8d3SBram Moolenaar  else
877158906cfSBram Moolenaar    res = "three"
878a259d8d3SBram Moolenaar  endif
879158906cfSBram Moolenaar  return res
880a259d8d3SBram Moolenaarenddef
881a259d8d3SBram Moolenaar
882158906cfSBram Moolenaardef Test_if_elseif_else()
883158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
884158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
885158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
8860f18b6d1SBram Moolenaarenddef
8870f18b6d1SBram Moolenaar
888e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
889e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
890e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
891e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
892e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
893585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
894e8c4abbbSBram Moolenaarenddef
895e8c4abbbSBram Moolenaar
8966d69bf60SBram Moolenaarlet g:bool_true = v:true
8976d69bf60SBram Moolenaarlet g:bool_false = v:false
8986d69bf60SBram Moolenaar
8996d69bf60SBram Moolenaardef Test_if_const_expr()
9006d69bf60SBram Moolenaar  let res = false
9016d69bf60SBram Moolenaar  if true ? true : false
9026d69bf60SBram Moolenaar    res = true
9036d69bf60SBram Moolenaar  endif
9046d69bf60SBram Moolenaar  assert_equal(true, res)
9056d69bf60SBram Moolenaar
906585fea7bSBram Moolenaar  g:glob = 2
907585fea7bSBram Moolenaar  if false
908585fea7bSBram Moolenaar    execute('let g:glob = 3')
909585fea7bSBram Moolenaar  endif
910585fea7bSBram Moolenaar  assert_equal(2, g:glob)
911585fea7bSBram Moolenaar  if true
912585fea7bSBram Moolenaar    execute('let g:glob = 3')
913585fea7bSBram Moolenaar  endif
914585fea7bSBram Moolenaar  assert_equal(3, g:glob)
915585fea7bSBram Moolenaar
9166d69bf60SBram Moolenaar  res = false
9176d69bf60SBram Moolenaar  if g:bool_true ? true : false
9186d69bf60SBram Moolenaar    res = true
9196d69bf60SBram Moolenaar  endif
9206d69bf60SBram Moolenaar  assert_equal(true, res)
9216d69bf60SBram Moolenaar
9226d69bf60SBram Moolenaar  res = false
9236d69bf60SBram Moolenaar  if true ? g:bool_true : false
9246d69bf60SBram Moolenaar    res = true
9256d69bf60SBram Moolenaar  endif
9266d69bf60SBram Moolenaar  assert_equal(true, res)
9276d69bf60SBram Moolenaar
9286d69bf60SBram Moolenaar  res = false
9296d69bf60SBram Moolenaar  if true ? true : g:bool_false
9306d69bf60SBram Moolenaar    res = true
9316d69bf60SBram Moolenaar  endif
9326d69bf60SBram Moolenaar  assert_equal(true, res)
9336d69bf60SBram Moolenaar
9346d69bf60SBram Moolenaar  res = false
9356d69bf60SBram Moolenaar  if true ? false : true
9366d69bf60SBram Moolenaar    res = true
9376d69bf60SBram Moolenaar  endif
9386d69bf60SBram Moolenaar  assert_equal(false, res)
9396d69bf60SBram Moolenaar
9406d69bf60SBram Moolenaar  res = false
9416d69bf60SBram Moolenaar  if false ? false : true
9426d69bf60SBram Moolenaar    res = true
9436d69bf60SBram Moolenaar  endif
9446d69bf60SBram Moolenaar  assert_equal(true, res)
9456d69bf60SBram Moolenaar
9466d69bf60SBram Moolenaar  res = false
9476d69bf60SBram Moolenaar  if false ? true : false
9486d69bf60SBram Moolenaar    res = true
9496d69bf60SBram Moolenaar  endif
9506d69bf60SBram Moolenaar  assert_equal(false, res)
9516d69bf60SBram Moolenaar
9526d69bf60SBram Moolenaar  res = false
953e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
954e8c4abbbSBram Moolenaar    res = true
955e8c4abbbSBram Moolenaar  endif
956e8c4abbbSBram Moolenaar  assert_equal(false, res)
957e8c4abbbSBram Moolenaar
958e8c4abbbSBram Moolenaar  res = false
9596d69bf60SBram Moolenaar  if true && true
9606d69bf60SBram Moolenaar    res = true
9616d69bf60SBram Moolenaar  endif
9626d69bf60SBram Moolenaar  assert_equal(true, res)
9636d69bf60SBram Moolenaar
9646d69bf60SBram Moolenaar  res = false
9656d69bf60SBram Moolenaar  if true && false
9666d69bf60SBram Moolenaar    res = true
9676d69bf60SBram Moolenaar  endif
9686d69bf60SBram Moolenaar  assert_equal(false, res)
9696d69bf60SBram Moolenaar
9706d69bf60SBram Moolenaar  res = false
9716d69bf60SBram Moolenaar  if g:bool_true && false
9726d69bf60SBram Moolenaar    res = true
9736d69bf60SBram Moolenaar  endif
9746d69bf60SBram Moolenaar  assert_equal(false, res)
9756d69bf60SBram Moolenaar
9766d69bf60SBram Moolenaar  res = false
9776d69bf60SBram Moolenaar  if true && g:bool_false
9786d69bf60SBram Moolenaar    res = true
9796d69bf60SBram Moolenaar  endif
9806d69bf60SBram Moolenaar  assert_equal(false, res)
9816d69bf60SBram Moolenaar
9826d69bf60SBram Moolenaar  res = false
9836d69bf60SBram Moolenaar  if false && false
9846d69bf60SBram Moolenaar    res = true
9856d69bf60SBram Moolenaar  endif
9866d69bf60SBram Moolenaar  assert_equal(false, res)
9876d69bf60SBram Moolenaar
9886d69bf60SBram Moolenaar  res = false
9896d69bf60SBram Moolenaar  if true || false
9906d69bf60SBram Moolenaar    res = true
9916d69bf60SBram Moolenaar  endif
9926d69bf60SBram Moolenaar  assert_equal(true, res)
9936d69bf60SBram Moolenaar
9946d69bf60SBram Moolenaar  res = false
9956d69bf60SBram Moolenaar  if g:bool_true || false
9966d69bf60SBram Moolenaar    res = true
9976d69bf60SBram Moolenaar  endif
9986d69bf60SBram Moolenaar  assert_equal(true, res)
9996d69bf60SBram Moolenaar
10006d69bf60SBram Moolenaar  res = false
10016d69bf60SBram Moolenaar  if true || g:bool_false
10026d69bf60SBram Moolenaar    res = true
10036d69bf60SBram Moolenaar  endif
10046d69bf60SBram Moolenaar  assert_equal(true, res)
10056d69bf60SBram Moolenaar
10066d69bf60SBram Moolenaar  res = false
10076d69bf60SBram Moolenaar  if false || false
10086d69bf60SBram Moolenaar    res = true
10096d69bf60SBram Moolenaar  endif
10106d69bf60SBram Moolenaar  assert_equal(false, res)
101180c34ca3SBram Moolenaarenddef
10126d69bf60SBram Moolenaar
101380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
101480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
101580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1016e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1017e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
10186d69bf60SBram Moolenaarenddef
10196d69bf60SBram Moolenaar
1020ad39c094SBram Moolenaardef Test_execute_cmd()
1021ad39c094SBram Moolenaar  new
1022ad39c094SBram Moolenaar  setline(1, 'default')
1023ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1024ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1025a72cfb80SBram Moolenaar
1026a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1027a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1028a72cfb80SBram Moolenaar
1029ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1030ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1031a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1032ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1033a72cfb80SBram Moolenaar
1034ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1035ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1036a72cfb80SBram Moolenaar
1037ad39c094SBram Moolenaar  let cmd_first = 'call '
1038ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1039ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1040ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1041ad39c094SBram Moolenaar  bwipe!
1042585fea7bSBram Moolenaar
1043585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1044a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1045ad39c094SBram Moolenaarenddef
1046ad39c094SBram Moolenaar
1047ad39c094SBram Moolenaardef Test_echo_cmd()
1048a72cfb80SBram Moolenaar  echo 'some' # comment
1049585fea7bSBram Moolenaar  echon 'thing'
1050ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1051ad39c094SBram Moolenaar
1052a72cfb80SBram Moolenaar  echo "some" # comment
1053a72cfb80SBram Moolenaar  echon "thing"
1054a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1055a72cfb80SBram Moolenaar
1056ad39c094SBram Moolenaar  let str1 = 'some'
1057ad39c094SBram Moolenaar  let str2 = 'more'
1058ad39c094SBram Moolenaar  echo str1 str2
1059ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1060a72cfb80SBram Moolenaar
1061a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1062ad39c094SBram Moolenaarenddef
1063ad39c094SBram Moolenaar
1064f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1065f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1066f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1067f93c7feaSBram Moolenaar  echo 'clear'
1068f93c7feaSBram Moolenaar  1messages
1069f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1070f93c7feaSBram Moolenaar
1071f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1072f93c7feaSBram Moolenaarenddef
1073f93c7feaSBram Moolenaar
1074f93c7feaSBram Moolenaardef Test_echoerr_cmd()
1075*40ee466cSBram Moolenaar  try
1076*40ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
1077*40ee466cSBram Moolenaar  catch
1078*40ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
1079*40ee466cSBram Moolenaar  endtry
1080f93c7feaSBram Moolenaarenddef
1081f93c7feaSBram Moolenaar
108241fe0617SBram Moolenaardef Test_for_outside_of_function()
108341fe0617SBram Moolenaar  let lines =<< trim END
108441fe0617SBram Moolenaar    vim9script
108541fe0617SBram Moolenaar    new
108641fe0617SBram Moolenaar    for var in range(0, 3)
108741fe0617SBram Moolenaar      append(line('$'), var)
108841fe0617SBram Moolenaar    endfor
108941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
109041fe0617SBram Moolenaar    bwipe!
109141fe0617SBram Moolenaar  END
109241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
109341fe0617SBram Moolenaar  source Xvim9for.vim
109441fe0617SBram Moolenaar  delete('Xvim9for.vim')
109541fe0617SBram Moolenaarenddef
10968a7d6542SBram Moolenaar
1097e8c4abbbSBram Moolenaardef Test_for_loop()
1098e8c4abbbSBram Moolenaar  let result = ''
1099e8c4abbbSBram Moolenaar  for cnt in range(7)
1100e8c4abbbSBram Moolenaar    if cnt == 4
1101e8c4abbbSBram Moolenaar      break
1102e8c4abbbSBram Moolenaar    endif
1103e8c4abbbSBram Moolenaar    if cnt == 2
1104e8c4abbbSBram Moolenaar      continue
1105e8c4abbbSBram Moolenaar    endif
1106e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1107e8c4abbbSBram Moolenaar  endfor
1108e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1109e8c4abbbSBram Moolenaarenddef
1110e8c4abbbSBram Moolenaar
1111e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1112675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1113675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1114675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
11156e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
1116675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1117675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1118675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1119675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1120e8c4abbbSBram Moolenaarenddef
1121e8c4abbbSBram Moolenaar
1122d0df1aacSBram Moolenaardef Test_while_loop()
1123d0df1aacSBram Moolenaar  let result = ''
1124d0df1aacSBram Moolenaar  let cnt = 0
1125d0df1aacSBram Moolenaar  while cnt < 555
1126d0df1aacSBram Moolenaar    if cnt == 3
1127d0df1aacSBram Moolenaar      break
1128d0df1aacSBram Moolenaar    endif
1129d0df1aacSBram Moolenaar    cnt += 1
1130d0df1aacSBram Moolenaar    if cnt == 2
1131d0df1aacSBram Moolenaar      continue
1132d0df1aacSBram Moolenaar    endif
1133d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1134d0df1aacSBram Moolenaar  endwhile
1135d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1136d0df1aacSBram Moolenaarenddef
1137d0df1aacSBram Moolenaar
1138e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1139675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1140675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1141675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1142675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1143675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1144675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1145675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1146bd5da371SBram Moolenaarenddef
1147bd5da371SBram Moolenaar
11489645e2d9SBram Moolenaardef Test_interrupt_loop()
114997acfc78SBram Moolenaar  let caught = false
11509645e2d9SBram Moolenaar  let x = 0
115197acfc78SBram Moolenaar  try
11529645e2d9SBram Moolenaar    while 1
11539645e2d9SBram Moolenaar      x += 1
11549645e2d9SBram Moolenaar      if x == 100
11559645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
11569645e2d9SBram Moolenaar      endif
11579645e2d9SBram Moolenaar    endwhile
115897acfc78SBram Moolenaar  catch
115997acfc78SBram Moolenaar    caught = true
116097acfc78SBram Moolenaar    assert_equal(100, x)
116197acfc78SBram Moolenaar  endtry
116297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
11639645e2d9SBram Moolenaarenddef
116420431c9dSBram Moolenaar
11654fdae999SBram Moolenaardef Test_automatic_line_continuation()
11664fdae999SBram Moolenaar  let mylist = [
11674fdae999SBram Moolenaar      'one',
11684fdae999SBram Moolenaar      'two',
11694fdae999SBram Moolenaar      'three',
11704fdae999SBram Moolenaar      ] " comment
11714fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
11724fdae999SBram Moolenaar
11734fdae999SBram Moolenaar  let mydict = {
11744fdae999SBram Moolenaar      'one': 1,
11754fdae999SBram Moolenaar      'two': 2,
11764fdae999SBram Moolenaar      'three':
11774fdae999SBram Moolenaar          3,
11784fdae999SBram Moolenaar      } " comment
11794fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
11804fdae999SBram Moolenaar  mydict = #{
11812c330432SBram Moolenaar      one: 1,  # comment
11822c330432SBram Moolenaar      two:     # comment
11832c330432SBram Moolenaar           2,  # comment
11842c330432SBram Moolenaar      three: 3 # comment
11852c330432SBram Moolenaar      }
11862c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
11872c330432SBram Moolenaar  mydict = #{
11882c330432SBram Moolenaar      one: 1,
11894fdae999SBram Moolenaar      two:
11904fdae999SBram Moolenaar           2,
11912c330432SBram Moolenaar      three: 3
11924fdae999SBram Moolenaar      }
11934fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1194e6085c53SBram Moolenaar
1195e6085c53SBram Moolenaar  assert_equal(
1196e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1197e6085c53SBram Moolenaar        split('one two three')
1198e6085c53SBram Moolenaar        )
11994fdae999SBram Moolenaarenddef
12004fdae999SBram Moolenaar
12017a092245SBram Moolenaardef Test_vim9_comment()
12027a092245SBram Moolenaar  CheckScriptSuccess([
12037a092245SBram Moolenaar      'vim9script',
12047a092245SBram Moolenaar      '# something',
12057a092245SBram Moolenaar      ])
12067a092245SBram Moolenaar  CheckScriptFailure([
12077a092245SBram Moolenaar      'vim9script',
12087a092245SBram Moolenaar      ':# something',
12097a092245SBram Moolenaar      ], 'E488:')
12107a092245SBram Moolenaar  CheckScriptFailure([
12117a092245SBram Moolenaar      '# something',
12127a092245SBram Moolenaar      ], 'E488:')
12137a092245SBram Moolenaar  CheckScriptFailure([
12147a092245SBram Moolenaar      ':# something',
12157a092245SBram Moolenaar      ], 'E488:')
12167a092245SBram Moolenaar
12174a8d9f2eSBram Moolenaar  { # block start
12184a8d9f2eSBram Moolenaar  } # block end
12194a8d9f2eSBram Moolenaar  CheckDefFailure([
12204a8d9f2eSBram Moolenaar      '{# comment',
12214a8d9f2eSBram Moolenaar      ], 'E488:')
12224a8d9f2eSBram Moolenaar  CheckDefFailure([
12234a8d9f2eSBram Moolenaar      '{',
12244a8d9f2eSBram Moolenaar      '}# comment',
12254a8d9f2eSBram Moolenaar      ], 'E488:')
12264a8d9f2eSBram Moolenaar
12274a8d9f2eSBram Moolenaar  echo "yes" # comment
12284a8d9f2eSBram Moolenaar  CheckDefFailure([
12294a8d9f2eSBram Moolenaar      'echo "yes"# comment',
12304a8d9f2eSBram Moolenaar      ], 'E488:')
12317a092245SBram Moolenaar  CheckScriptSuccess([
12327a092245SBram Moolenaar      'vim9script',
12337a092245SBram Moolenaar      'echo "yes" # something',
12347a092245SBram Moolenaar      ])
12357a092245SBram Moolenaar  CheckScriptFailure([
12367a092245SBram Moolenaar      'vim9script',
12377a092245SBram Moolenaar      'echo "yes"# something',
12387a092245SBram Moolenaar      ], 'E121:')
12397a092245SBram Moolenaar  CheckScriptFailure([
12407a092245SBram Moolenaar      'vim9script',
12417a092245SBram Moolenaar      'echo# something',
12427a092245SBram Moolenaar      ], 'E121:')
12437a092245SBram Moolenaar  CheckScriptFailure([
12447a092245SBram Moolenaar      'echo "yes" # something',
12457a092245SBram Moolenaar      ], 'E121:')
12467a092245SBram Moolenaar
12474a8d9f2eSBram Moolenaar  exe "echo" # comment
12484a8d9f2eSBram Moolenaar  CheckDefFailure([
12494a8d9f2eSBram Moolenaar      'exe "echo"# comment',
12504a8d9f2eSBram Moolenaar      ], 'E488:')
12514a8d9f2eSBram Moolenaar  CheckScriptSuccess([
12524a8d9f2eSBram Moolenaar      'vim9script',
12534a8d9f2eSBram Moolenaar      'exe "echo" # something',
12544a8d9f2eSBram Moolenaar      ])
12554a8d9f2eSBram Moolenaar  CheckScriptFailure([
12564a8d9f2eSBram Moolenaar      'vim9script',
12574a8d9f2eSBram Moolenaar      'exe "echo"# something',
12584a8d9f2eSBram Moolenaar      ], 'E121:')
12594a8d9f2eSBram Moolenaar  CheckDefFailure([
12604a8d9f2eSBram Moolenaar      'exe # comment',
12614a8d9f2eSBram Moolenaar      ], 'E1015:')
12624a8d9f2eSBram Moolenaar  CheckScriptFailure([
12634a8d9f2eSBram Moolenaar      'vim9script',
12644a8d9f2eSBram Moolenaar      'exe# something',
12654a8d9f2eSBram Moolenaar      ], 'E121:')
12664a8d9f2eSBram Moolenaar  CheckScriptFailure([
12674a8d9f2eSBram Moolenaar      'exe "echo" # something',
12684a8d9f2eSBram Moolenaar      ], 'E121:')
12694a8d9f2eSBram Moolenaar
12707a092245SBram Moolenaar  CheckDefFailure([
12717a092245SBram Moolenaar      'try# comment',
12727a092245SBram Moolenaar      '  echo "yes"',
12737a092245SBram Moolenaar      'catch',
12747a092245SBram Moolenaar      'endtry',
12757a092245SBram Moolenaar      ], 'E488:')
12762c5ed4e3SBram Moolenaar  CheckScriptFailure([
12772c5ed4e3SBram Moolenaar      'vim9script',
12782c5ed4e3SBram Moolenaar      'try# comment',
12792c5ed4e3SBram Moolenaar      'echo "yes"',
12802c5ed4e3SBram Moolenaar      ], 'E488:')
12817a092245SBram Moolenaar  CheckDefFailure([
12827a092245SBram Moolenaar      'try',
1283a72cfb80SBram Moolenaar      '  throw#comment',
1284a72cfb80SBram Moolenaar      'catch',
1285a72cfb80SBram Moolenaar      'endtry',
1286a72cfb80SBram Moolenaar      ], 'E1015:')
1287a72cfb80SBram Moolenaar  CheckDefFailure([
1288a72cfb80SBram Moolenaar      'try',
1289a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1290a72cfb80SBram Moolenaar      'catch',
1291a72cfb80SBram Moolenaar      'endtry',
1292a72cfb80SBram Moolenaar      ], 'E488:')
1293a72cfb80SBram Moolenaar  CheckDefFailure([
1294a72cfb80SBram Moolenaar      'try',
12957a092245SBram Moolenaar      '  echo "yes"',
12967a092245SBram Moolenaar      'catch# comment',
12977a092245SBram Moolenaar      'endtry',
12987a092245SBram Moolenaar      ], 'E488:')
12992c5ed4e3SBram Moolenaar  CheckScriptFailure([
13002c5ed4e3SBram Moolenaar      'vim9script',
13012c5ed4e3SBram Moolenaar      'try',
13022c5ed4e3SBram Moolenaar      '  echo "yes"',
13032c5ed4e3SBram Moolenaar      'catch# comment',
13042c5ed4e3SBram Moolenaar      'endtry',
13052c5ed4e3SBram Moolenaar      ], 'E654:')
13062c5ed4e3SBram Moolenaar  CheckDefFailure([
13072c5ed4e3SBram Moolenaar      'try',
13082c5ed4e3SBram Moolenaar      '  echo "yes"',
13092c5ed4e3SBram Moolenaar      'catch /pat/# comment',
13102c5ed4e3SBram Moolenaar      'endtry',
13112c5ed4e3SBram Moolenaar      ], 'E488:')
13122c5ed4e3SBram Moolenaar  CheckScriptFailure([
13132c5ed4e3SBram Moolenaar      'vim9script',
13142c5ed4e3SBram Moolenaar      'try',
13152c5ed4e3SBram Moolenaar      '  throw "pat"',
13162c5ed4e3SBram Moolenaar      'catch /pat/# comment',
13172c5ed4e3SBram Moolenaar      'endtry',
13182c5ed4e3SBram Moolenaar      ], 'E605:')
13197a092245SBram Moolenaar  CheckDefFailure([
13207a092245SBram Moolenaar      'try',
13217a092245SBram Moolenaar      'echo "yes"',
13227a092245SBram Moolenaar      'catch',
13237a092245SBram Moolenaar      'endtry# comment',
13247a092245SBram Moolenaar      ], 'E488:')
13252c5ed4e3SBram Moolenaar  CheckScriptFailure([
13262c5ed4e3SBram Moolenaar      'vim9script',
13272c5ed4e3SBram Moolenaar      'try',
13282c5ed4e3SBram Moolenaar      '  echo "yes"',
13292c5ed4e3SBram Moolenaar      'catch',
13302c5ed4e3SBram Moolenaar      'endtry# comment',
13312c5ed4e3SBram Moolenaar      ], 'E600:')
13322c5ed4e3SBram Moolenaar
13332c5ed4e3SBram Moolenaar  CheckScriptSuccess([
13342c5ed4e3SBram Moolenaar      'vim9script',
13352c5ed4e3SBram Moolenaar      'hi # comment',
13362c5ed4e3SBram Moolenaar      ])
13372c5ed4e3SBram Moolenaar  CheckScriptFailure([
13382c5ed4e3SBram Moolenaar      'vim9script',
13392c5ed4e3SBram Moolenaar      'hi# comment',
13402c5ed4e3SBram Moolenaar      ], 'E416:')
13411966c248SBram Moolenaar  CheckScriptSuccess([
13421966c248SBram Moolenaar      'vim9script',
13431966c248SBram Moolenaar      'hi Search # comment',
13441966c248SBram Moolenaar      ])
13451966c248SBram Moolenaar  CheckScriptFailure([
13461966c248SBram Moolenaar      'vim9script',
13471966c248SBram Moolenaar      'hi Search# comment',
13481966c248SBram Moolenaar      ], 'E416:')
13491966c248SBram Moolenaar  CheckScriptSuccess([
13501966c248SBram Moolenaar      'vim9script',
13511966c248SBram Moolenaar      'hi link This Search # comment',
13521966c248SBram Moolenaar      ])
13531966c248SBram Moolenaar  CheckScriptFailure([
13541966c248SBram Moolenaar      'vim9script',
13551966c248SBram Moolenaar      'hi link This That# comment',
13561966c248SBram Moolenaar      ], 'E413:')
13571966c248SBram Moolenaar  CheckScriptSuccess([
13581966c248SBram Moolenaar      'vim9script',
13591966c248SBram Moolenaar      'hi clear This # comment',
13601966c248SBram Moolenaar      'hi clear # comment',
13611966c248SBram Moolenaar      ])
13621966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
13631966c248SBram Moolenaar  " hi clear This# comment',
13641966c248SBram Moolenaar  CheckScriptFailure([
13651966c248SBram Moolenaar      'vim9script',
13661966c248SBram Moolenaar      'hi clear# comment',
13671966c248SBram Moolenaar      ], 'E416:')
13681966c248SBram Moolenaar
13691966c248SBram Moolenaar  CheckScriptSuccess([
13701966c248SBram Moolenaar      'vim9script',
13711966c248SBram Moolenaar      'hi Group term=bold',
13721966c248SBram Moolenaar      'match Group /todo/ # comment',
13731966c248SBram Moolenaar      ])
13741966c248SBram Moolenaar  CheckScriptFailure([
13751966c248SBram Moolenaar      'vim9script',
13761966c248SBram Moolenaar      'hi Group term=bold',
13771966c248SBram Moolenaar      'match Group /todo/# comment',
13781966c248SBram Moolenaar      ], 'E488:')
13791966c248SBram Moolenaar  CheckScriptSuccess([
13801966c248SBram Moolenaar      'vim9script',
13811966c248SBram Moolenaar      'match # comment',
13821966c248SBram Moolenaar      ])
13831966c248SBram Moolenaar  CheckScriptFailure([
13841966c248SBram Moolenaar      'vim9script',
13851966c248SBram Moolenaar      'match# comment',
13861966c248SBram Moolenaar      ], 'E475:')
13871966c248SBram Moolenaar  CheckScriptSuccess([
13881966c248SBram Moolenaar      'vim9script',
13891966c248SBram Moolenaar      'match none # comment',
13901966c248SBram Moolenaar      ])
13911966c248SBram Moolenaar  CheckScriptFailure([
13921966c248SBram Moolenaar      'vim9script',
13931966c248SBram Moolenaar      'match none# comment',
13941966c248SBram Moolenaar      ], 'E475:')
13951966c248SBram Moolenaar
13961966c248SBram Moolenaar  CheckScriptSuccess([
13971966c248SBram Moolenaar      'vim9script',
13981966c248SBram Moolenaar      'menutrans clear # comment',
13991966c248SBram Moolenaar      ])
14001966c248SBram Moolenaar  CheckScriptFailure([
14011966c248SBram Moolenaar      'vim9script',
14021966c248SBram Moolenaar      'menutrans clear# comment text',
14031966c248SBram Moolenaar      ], 'E474:')
14041966c248SBram Moolenaar
14051966c248SBram Moolenaar  CheckScriptSuccess([
14061966c248SBram Moolenaar      'vim9script',
14071966c248SBram Moolenaar      'syntax clear # comment',
14081966c248SBram Moolenaar      ])
14091966c248SBram Moolenaar  CheckScriptFailure([
14101966c248SBram Moolenaar      'vim9script',
14111966c248SBram Moolenaar      'syntax clear# comment text',
14121966c248SBram Moolenaar      ], 'E28:')
14131966c248SBram Moolenaar  CheckScriptSuccess([
14141966c248SBram Moolenaar      'vim9script',
14151966c248SBram Moolenaar      'syntax keyword Word some',
14161966c248SBram Moolenaar      'syntax clear Word # comment',
14171966c248SBram Moolenaar      ])
14181966c248SBram Moolenaar  CheckScriptFailure([
14191966c248SBram Moolenaar      'vim9script',
14201966c248SBram Moolenaar      'syntax keyword Word some',
14211966c248SBram Moolenaar      'syntax clear Word# comment text',
14221966c248SBram Moolenaar      ], 'E28:')
14231966c248SBram Moolenaar
14241966c248SBram Moolenaar  CheckScriptSuccess([
14251966c248SBram Moolenaar      'vim9script',
14261966c248SBram Moolenaar      'syntax list # comment',
14271966c248SBram Moolenaar      ])
14281966c248SBram Moolenaar  CheckScriptFailure([
14291966c248SBram Moolenaar      'vim9script',
14301966c248SBram Moolenaar      'syntax list# comment text',
14311966c248SBram Moolenaar      ], 'E28:')
14321966c248SBram Moolenaar
14331966c248SBram Moolenaar  CheckScriptSuccess([
14341966c248SBram Moolenaar      'vim9script',
14351966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
14361966c248SBram Moolenaar      ])
14371966c248SBram Moolenaar  CheckScriptFailure([
14381966c248SBram Moolenaar      'vim9script',
14391966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
14401966c248SBram Moolenaar      ], 'E475:')
14411966c248SBram Moolenaar
14421966c248SBram Moolenaar  CheckScriptSuccess([
14431966c248SBram Moolenaar      'vim9script',
14441966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
14451966c248SBram Moolenaar      ])
14461966c248SBram Moolenaar  CheckScriptFailure([
14471966c248SBram Moolenaar      'vim9script',
14481966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
14491966c248SBram Moolenaar      ], 'E789:')
14501966c248SBram Moolenaar
14511966c248SBram Moolenaar  CheckScriptSuccess([
14521966c248SBram Moolenaar      'vim9script',
14531966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
14541966c248SBram Moolenaar      ])
14551966c248SBram Moolenaar  CheckScriptFailure([
14561966c248SBram Moolenaar      'vim9script',
14571966c248SBram Moolenaar      'syntax match Word /pat/# comment',
14581966c248SBram Moolenaar      ], 'E402:')
14591966c248SBram Moolenaar
14601966c248SBram Moolenaar  CheckScriptSuccess([
14611966c248SBram Moolenaar      'vim9script',
14621966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
14631966c248SBram Moolenaar      ])
14641966c248SBram Moolenaar  CheckScriptFailure([
14651966c248SBram Moolenaar      'vim9script',
14661966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
14671966c248SBram Moolenaar      ], 'E475:')
14681966c248SBram Moolenaar  CheckScriptFailure([
14691966c248SBram Moolenaar      'vim9script',
14701966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
14711966c248SBram Moolenaar      ], 'E406:')
14721966c248SBram Moolenaar  CheckScriptFailure([
14731966c248SBram Moolenaar      'vim9script',
14741966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
14751966c248SBram Moolenaar      ], 'E475:')
14761966c248SBram Moolenaar
14771966c248SBram Moolenaar  CheckScriptSuccess([
14781966c248SBram Moolenaar      'vim9script',
14791966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
14801966c248SBram Moolenaar      ])
14811966c248SBram Moolenaar  CheckScriptFailure([
14821966c248SBram Moolenaar      'vim9script',
14831966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
14841966c248SBram Moolenaar      ], 'E475:')
14851966c248SBram Moolenaar
14861966c248SBram Moolenaar  CheckScriptSuccess([
14871966c248SBram Moolenaar      'vim9script',
14881966c248SBram Moolenaar      'syntax sync # comment',
14891966c248SBram Moolenaar      ])
14901966c248SBram Moolenaar  CheckScriptFailure([
14911966c248SBram Moolenaar      'vim9script',
14921966c248SBram Moolenaar      'syntax sync# comment',
14931966c248SBram Moolenaar      ], 'E404:')
14941966c248SBram Moolenaar  CheckScriptSuccess([
14951966c248SBram Moolenaar      'vim9script',
14961966c248SBram Moolenaar      'syntax sync ccomment # comment',
14971966c248SBram Moolenaar      ])
14981966c248SBram Moolenaar  CheckScriptFailure([
14991966c248SBram Moolenaar      'vim9script',
15001966c248SBram Moolenaar      'syntax sync ccomment# comment',
15011966c248SBram Moolenaar      ], 'E404:')
15021966c248SBram Moolenaar
15031966c248SBram Moolenaar  CheckScriptSuccess([
15041966c248SBram Moolenaar      'vim9script',
15051966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
15061966c248SBram Moolenaar      ])
15071966c248SBram Moolenaar  CheckScriptFailure([
15081966c248SBram Moolenaar      'vim9script',
15091966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
15101966c248SBram Moolenaar      ], 'E475:')
1511a72cfb80SBram Moolenaar
1512a72cfb80SBram Moolenaar  CheckScriptSuccess([
1513a72cfb80SBram Moolenaar      'vim9script',
1514a72cfb80SBram Moolenaar      'command Echo echo # comment',
1515a72cfb80SBram Moolenaar      'command Echo # comment',
1516a72cfb80SBram Moolenaar      ])
1517a72cfb80SBram Moolenaar  CheckScriptFailure([
1518a72cfb80SBram Moolenaar      'vim9script',
1519a72cfb80SBram Moolenaar      'command Echo echo# comment',
1520a72cfb80SBram Moolenaar      'Echo',
1521a72cfb80SBram Moolenaar      ], 'E121:')
1522a72cfb80SBram Moolenaar  CheckScriptFailure([
1523a72cfb80SBram Moolenaar      'vim9script',
1524a72cfb80SBram Moolenaar      'command Echo# comment',
1525a72cfb80SBram Moolenaar      ], 'E182:')
1526a72cfb80SBram Moolenaar  CheckScriptFailure([
1527a72cfb80SBram Moolenaar      'vim9script',
1528a72cfb80SBram Moolenaar      'command Echo echo',
1529a72cfb80SBram Moolenaar      'command Echo# comment',
1530a72cfb80SBram Moolenaar      ], 'E182:')
1531a72cfb80SBram Moolenaar
1532a72cfb80SBram Moolenaar  CheckScriptSuccess([
1533a72cfb80SBram Moolenaar      'vim9script',
1534a72cfb80SBram Moolenaar      'function # comment',
1535a72cfb80SBram Moolenaar      ])
1536a72cfb80SBram Moolenaar  CheckScriptFailure([
1537a72cfb80SBram Moolenaar      'vim9script',
1538a72cfb80SBram Moolenaar      'function# comment',
1539a72cfb80SBram Moolenaar      ], 'E129:')
1540a72cfb80SBram Moolenaar  CheckScriptSuccess([
1541a72cfb80SBram Moolenaar      'vim9script',
1542a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1543a72cfb80SBram Moolenaar      ])
1544a72cfb80SBram Moolenaar  CheckScriptFailure([
1545a72cfb80SBram Moolenaar      'vim9script',
1546a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1547a72cfb80SBram Moolenaar      ], 'E488:')
1548a72cfb80SBram Moolenaar
1549a72cfb80SBram Moolenaar  CheckScriptSuccess([
1550a72cfb80SBram Moolenaar      'vim9script',
15514c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1552a72cfb80SBram Moolenaar      'endfunc',
15534c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1554a72cfb80SBram Moolenaar      ])
1555a72cfb80SBram Moolenaar  CheckScriptFailure([
1556a72cfb80SBram Moolenaar      'vim9script',
15574c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1558a72cfb80SBram Moolenaar      'endfunc',
15594c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1560a72cfb80SBram Moolenaar      ], 'E488:')
1561a72cfb80SBram Moolenaar
1562a72cfb80SBram Moolenaar  CheckScriptSuccess([
1563a72cfb80SBram Moolenaar      'vim9script',
1564a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1565a72cfb80SBram Moolenaar      ])
1566a72cfb80SBram Moolenaar  CheckScriptFailure([
1567a72cfb80SBram Moolenaar      'vim9script',
1568a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1569a72cfb80SBram Moolenaar      ], 'E488:')
15702c5ed4e3SBram Moolenaarenddef
15712c5ed4e3SBram Moolenaar
15722c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
15732c5ed4e3SBram Moolenaar  CheckCanRunGui
15742c5ed4e3SBram Moolenaar
15752c5ed4e3SBram Moolenaar  CheckScriptFailure([
15762c5ed4e3SBram Moolenaar      'vim9script',
15772c5ed4e3SBram Moolenaar      'gui#comment'
15782c5ed4e3SBram Moolenaar      ], 'E499:')
15792c5ed4e3SBram Moolenaar  CheckScriptFailure([
15802c5ed4e3SBram Moolenaar      'vim9script',
15812c5ed4e3SBram Moolenaar      'gui -f#comment'
15822c5ed4e3SBram Moolenaar      ], 'E499:')
15837a092245SBram Moolenaarenddef
15847a092245SBram Moolenaar
1585a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1586a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1587a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1588a26b9700SBram Moolenaar
1589a26b9700SBram Moolenaar  edit test.vim
1590a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1591a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1592a26b9700SBram Moolenaar
1593a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1594a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1595a26b9700SBram Moolenaar
1596a26b9700SBram Moolenaar  g:entered = 0
1597a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1598a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1599a26b9700SBram Moolenaar
1600a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1601a26b9700SBram Moolenaar
1602a26b9700SBram Moolenaar  au! TabEnter
1603a26b9700SBram Moolenaar  unlet g:entered
1604d72c1bf0SBram Moolenaar
1605d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1606d72c1bf0SBram Moolenaar      'vim9script',
1607d72c1bf0SBram Moolenaar      'let g:var = 123',
1608d72c1bf0SBram Moolenaar      'let w:var = 777',
1609d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1610d72c1bf0SBram Moolenaar      ])
1611d72c1bf0SBram Moolenaar
1612d72c1bf0SBram Moolenaar  CheckScriptFailure([
1613d72c1bf0SBram Moolenaar      'vim9script',
1614d72c1bf0SBram Moolenaar      'let g:var = 123',
1615d72c1bf0SBram Moolenaar      'unlet g:var# comment',
1616d72c1bf0SBram Moolenaar      ], 'E108:')
1617d72c1bf0SBram Moolenaar
1618d72c1bf0SBram Moolenaar  CheckScriptFailure([
1619d72c1bf0SBram Moolenaar      'let g:var = 123',
1620d72c1bf0SBram Moolenaar      'unlet g:var # something',
1621d72c1bf0SBram Moolenaar      ], 'E488:')
1622faac4104SBram Moolenaar
1623faac4104SBram Moolenaar  CheckScriptSuccess([
1624faac4104SBram Moolenaar      'vim9script',
1625faac4104SBram Moolenaar      'if 1 # comment',
1626faac4104SBram Moolenaar      '  echo "yes"',
1627faac4104SBram Moolenaar      'elseif 2 #comment',
1628faac4104SBram Moolenaar      '  echo "no"',
1629faac4104SBram Moolenaar      'endif',
1630faac4104SBram Moolenaar      ])
1631faac4104SBram Moolenaar
1632faac4104SBram Moolenaar  CheckScriptFailure([
1633faac4104SBram Moolenaar      'vim9script',
1634faac4104SBram Moolenaar      'if 1# comment',
1635faac4104SBram Moolenaar      '  echo "yes"',
1636faac4104SBram Moolenaar      'endif',
1637faac4104SBram Moolenaar      ], 'E15:')
1638faac4104SBram Moolenaar
1639faac4104SBram Moolenaar  CheckScriptFailure([
1640faac4104SBram Moolenaar      'vim9script',
1641faac4104SBram Moolenaar      'if 0 # comment',
1642faac4104SBram Moolenaar      '  echo "yes"',
1643faac4104SBram Moolenaar      'elseif 2#comment',
1644faac4104SBram Moolenaar      '  echo "no"',
1645faac4104SBram Moolenaar      'endif',
1646faac4104SBram Moolenaar      ], 'E15:')
1647faac4104SBram Moolenaar
1648faac4104SBram Moolenaar  CheckScriptSuccess([
1649faac4104SBram Moolenaar      'vim9script',
1650faac4104SBram Moolenaar      'let # comment',
1651faac4104SBram Moolenaar      ])
1652faac4104SBram Moolenaar
1653faac4104SBram Moolenaar  CheckScriptFailure([
1654faac4104SBram Moolenaar      'vim9script',
1655faac4104SBram Moolenaar      'let# comment',
1656faac4104SBram Moolenaar      ], 'E121:')
1657faac4104SBram Moolenaar
1658faac4104SBram Moolenaar  CheckScriptSuccess([
1659faac4104SBram Moolenaar      'vim9script',
1660faac4104SBram Moolenaar      'let v:version # comment',
1661faac4104SBram Moolenaar      ])
1662faac4104SBram Moolenaar
1663faac4104SBram Moolenaar  CheckScriptFailure([
1664faac4104SBram Moolenaar      'vim9script',
1665faac4104SBram Moolenaar      'let v:version# comment',
1666faac4104SBram Moolenaar      ], 'E121:')
1667faac4104SBram Moolenaar
1668faac4104SBram Moolenaar  CheckScriptSuccess([
1669faac4104SBram Moolenaar      'vim9script',
1670faac4104SBram Moolenaar      'new'
1671faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1672faac4104SBram Moolenaar      '$',
1673faac4104SBram Moolenaar      'dsearch /pat/ #comment',
1674faac4104SBram Moolenaar      'bwipe!',
1675faac4104SBram Moolenaar      ])
1676faac4104SBram Moolenaar
1677faac4104SBram Moolenaar  CheckScriptFailure([
1678faac4104SBram Moolenaar      'vim9script',
1679faac4104SBram Moolenaar      'new'
1680faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1681faac4104SBram Moolenaar      '$',
1682faac4104SBram Moolenaar      'dsearch /pat/#comment',
1683faac4104SBram Moolenaar      'bwipe!',
1684faac4104SBram Moolenaar      ], 'E488:')
1685a26b9700SBram Moolenaarenddef
1686a26b9700SBram Moolenaar
1687585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1688585fea7bSBram Moolenaardef Test_substitute_cmd()
1689585fea7bSBram Moolenaar  new
1690585fea7bSBram Moolenaar  setline(1, 'something')
1691585fea7bSBram Moolenaar  :substitute(some(other(
1692585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1693585fea7bSBram Moolenaar  bwipe!
1694585fea7bSBram Moolenaar
1695585fea7bSBram Moolenaar  " also when the context is Vim9 script
1696585fea7bSBram Moolenaar  let lines =<< trim END
1697585fea7bSBram Moolenaar    vim9script
1698585fea7bSBram Moolenaar    new
1699585fea7bSBram Moolenaar    setline(1, 'something')
1700585fea7bSBram Moolenaar    :substitute(some(other(
1701585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1702585fea7bSBram Moolenaar    bwipe!
1703585fea7bSBram Moolenaar  END
1704585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1705585fea7bSBram Moolenaar  source Xvim9lines
1706585fea7bSBram Moolenaar
1707585fea7bSBram Moolenaar  delete('Xvim9lines')
1708585fea7bSBram Moolenaarenddef
1709585fea7bSBram Moolenaar
17108a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1711