18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5673660abSBram Moolenaar
68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
8978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
98a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
108a7d6542SBram Moolenaar  call delete('Xdef')
118a7d6542SBram Moolenaarendfunc
128a7d6542SBram Moolenaar
138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
148a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
158a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
168a7d6542SBram Moolenaar  call delete('Xdef')
178a7d6542SBram Moolenaarendfunc
188a7d6542SBram Moolenaar
198a7d6542SBram Moolenaardef Test_syntax()
208a7d6542SBram Moolenaar  let var = 234
218a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
228a7d6542SBram Moolenaarenddef
238a7d6542SBram Moolenaar
248a7d6542SBram Moolenaarfunc Test_def_basic()
258a7d6542SBram Moolenaar  def SomeFunc(): string
268a7d6542SBram Moolenaar    return 'yes'
278a7d6542SBram Moolenaar  enddef
288a7d6542SBram Moolenaar  call assert_equal('yes', SomeFunc())
298a7d6542SBram Moolenaarendfunc
308a7d6542SBram Moolenaar
316e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
326e587dcbSBram Moolenaarlet s:addToMe = 111
33401d9ffbSBram Moolenaarlet g:existing = 'yes'
34a8c17704SBram Moolenaarlet g:inc_counter = 1
35a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
366e587dcbSBram Moolenaar
378a7d6542SBram Moolenaardef Test_assignment()
388a7d6542SBram Moolenaar  let bool1: bool = true
398a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
408a7d6542SBram Moolenaar  let bool2: bool = false
418a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
428a7d6542SBram Moolenaar
430c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
448a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
450c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
460c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
470c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
488a7d6542SBram Moolenaar
49436472f5SBram Moolenaar  let listS: list<string> = []
50436472f5SBram Moolenaar  let listN: list<number> = []
518a7d6542SBram Moolenaar
520c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
538a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
540c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
550c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
560c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
57b283a8a6SBram Moolenaar
589be61bbbSBram Moolenaar  let a: number = 6
599be61bbbSBram Moolenaar  assert_equal(6, a)
609be61bbbSBram Moolenaar
6142a480bfSBram Moolenaar  if has('channel')
6242a480bfSBram Moolenaar    let chan1: channel
63fbdd08edSBram Moolenaar    let job1: job
64f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6542a480bfSBram Moolenaar  endif
66fbdd08edSBram Moolenaar  if has('float')
67fbdd08edSBram Moolenaar    let float1: float = 3.4
68fbdd08edSBram Moolenaar  endif
69087d2e15SBram Moolenaar  let funky1: func
70087d2e15SBram Moolenaar  let funky2: func = function('len')
71087d2e15SBram Moolenaar  let party1: partial
72087d2e15SBram Moolenaar  let party2: partial = funcref('Test_syntax')
7342a480bfSBram Moolenaar
7461a6d4e4SBram Moolenaar  " type becomes list<any>
7561a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
765381c7a1SBram Moolenaar  " type becomes dict<any>
775381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7861a6d4e4SBram Moolenaar
79401d9ffbSBram Moolenaar  g:newvar = 'new'
80401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
81401d9ffbSBram Moolenaar
82401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
83401d9ffbSBram Moolenaar  g:existing = 'no'
84401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
85401d9ffbSBram Moolenaar
86b283a8a6SBram Moolenaar  v:char = 'abc'
876e587dcbSBram Moolenaar  assert_equal('abc', v:char)
88b283a8a6SBram Moolenaar
89b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
906e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
91b283a8a6SBram Moolenaar  $ENVVAR = ''
926e587dcbSBram Moolenaar
93fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
94fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
95fd1823e0SBram Moolenaar  s:addToMe += 222
96fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
970bbf722aSBram Moolenaar  s:newVar = 'new'
980bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
99a8c17704SBram Moolenaar
100a8c17704SBram Moolenaar  set ts=7
101a8c17704SBram Moolenaar  &ts += 1
102a8c17704SBram Moolenaar  assert_equal(8, &ts)
103*80c34ca3SBram Moolenaar  &ts -= 3
104*80c34ca3SBram Moolenaar  assert_equal(5, &ts)
105*80c34ca3SBram Moolenaar  &ts *= 2
106*80c34ca3SBram Moolenaar  assert_equal(10, &ts)
107*80c34ca3SBram Moolenaar  &ts /= 3
108*80c34ca3SBram Moolenaar  assert_equal(3, &ts)
109*80c34ca3SBram Moolenaar  set ts=10
110*80c34ca3SBram Moolenaar  &ts %= 4
111*80c34ca3SBram Moolenaar  assert_equal(2, &ts)
112a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
113a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
114a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
115*80c34ca3SBram Moolenaar  &ts = 8
116a8c17704SBram Moolenaar
117a8c17704SBram Moolenaar  g:inc_counter += 1
118a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
119a8c17704SBram Moolenaar
120a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
121a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
122a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
123a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
124a8c17704SBram Moolenaar
125a8c17704SBram Moolenaar  @a = 'areg'
126a8c17704SBram Moolenaar  @a ..= 'add'
127a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
128a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
129a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
130e69f6d04SBram Moolenaar
131e69f6d04SBram Moolenaar  v:errmsg = 'none'
132e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
133e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
134e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
135e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
136e69f6d04SBram Moolenaar
137e69f6d04SBram Moolenaar  " Test default values.
138e69f6d04SBram Moolenaar  let thebool: bool
139e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
140e69f6d04SBram Moolenaar
141e69f6d04SBram Moolenaar  let thenumber: number
142e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
143e69f6d04SBram Moolenaar
144e69f6d04SBram Moolenaar  if has('float')
145e69f6d04SBram Moolenaar    let thefloat: float
146e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
147e69f6d04SBram Moolenaar  endif
148e69f6d04SBram Moolenaar
149e69f6d04SBram Moolenaar  let thestring: string
150e69f6d04SBram Moolenaar  assert_equal('', thestring)
151e69f6d04SBram Moolenaar
152e69f6d04SBram Moolenaar  let theblob: blob
153e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
154e69f6d04SBram Moolenaar
155e69f6d04SBram Moolenaar  let thefunc: func
156e69f6d04SBram Moolenaar  assert_equal(test_null_function(), thefunc)
157e69f6d04SBram Moolenaar
158e69f6d04SBram Moolenaar  let thepartial: partial
159e69f6d04SBram Moolenaar  assert_equal(test_null_partial(), thepartial)
160e69f6d04SBram Moolenaar
161e69f6d04SBram Moolenaar  let thelist: list<any>
162e69f6d04SBram Moolenaar  assert_equal([], thelist)
163e69f6d04SBram Moolenaar
164e69f6d04SBram Moolenaar  let thedict: dict<any>
165e69f6d04SBram Moolenaar  assert_equal({}, thedict)
166e69f6d04SBram Moolenaar
167e69f6d04SBram Moolenaar  let thejob: job
168e69f6d04SBram Moolenaar  assert_equal(test_null_job(), thejob)
169e69f6d04SBram Moolenaar
170e69f6d04SBram Moolenaar  let thechannel: channel
171e69f6d04SBram Moolenaar  assert_equal(test_null_channel(), thechannel)
1728a7d6542SBram Moolenaarenddef
1738a7d6542SBram Moolenaar
1748a7d6542SBram Moolenaarfunc Test_assignment_failure()
1758a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1768a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1778a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1788a7d6542SBram Moolenaar
1798a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1808a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1818a7d6542SBram Moolenaar
1829be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1839be61bbbSBram Moolenaar
184e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1859be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1869be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1879be61bbbSBram Moolenaar
1889be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1899be61bbbSBram Moolenaar
1909be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1919be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1929be61bbbSBram Moolenaar
1939be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
1949be61bbbSBram Moolenaar
1959be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
1969be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
1979be61bbbSBram Moolenaar
19833fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
19933fa29cfSBram Moolenaar
2008a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2018a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2028a7d6542SBram Moolenaar
2038a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2048a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2058a7d6542SBram Moolenaar
2068a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2078a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
20842a480bfSBram Moolenaar
20942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
21042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
211599c89c8SBram Moolenaarendfunc
212599c89c8SBram Moolenaar
213599c89c8SBram Moolenaarfunc Test_wrong_type()
214599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
215599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
216599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
217599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
218599c89c8SBram Moolenaar
219599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
220599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
22142a480bfSBram Moolenaar
22242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
22342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
22442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
22542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
22642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
22742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
22842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
22942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
23042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
23142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
23242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2338a7d6542SBram Moolenaarendfunc
2348a7d6542SBram Moolenaar
2358a7d6542SBram Moolenaarfunc Test_const()
2368a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2378a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2388a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2399be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2408a7d6542SBram Moolenaarendfunc
2418a7d6542SBram Moolenaar
2428a7d6542SBram Moolenaardef Test_block()
2438a7d6542SBram Moolenaar  let outer = 1
2448a7d6542SBram Moolenaar  {
2458a7d6542SBram Moolenaar    let inner = 2
2468a7d6542SBram Moolenaar    assert_equal(1, outer)
2478a7d6542SBram Moolenaar    assert_equal(2, inner)
2488a7d6542SBram Moolenaar  }
2498a7d6542SBram Moolenaar  assert_equal(1, outer)
2508a7d6542SBram Moolenaarenddef
2518a7d6542SBram Moolenaar
2528a7d6542SBram Moolenaarfunc Test_block_failure()
2538a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
2548a7d6542SBram Moolenaarendfunc
2558a7d6542SBram Moolenaar
2568a7d6542SBram Moolenaardef ReturnString(): string
2578a7d6542SBram Moolenaar  return 'string'
2588a7d6542SBram Moolenaarenddef
2598a7d6542SBram Moolenaar
2608a7d6542SBram Moolenaardef ReturnNumber(): number
2618a7d6542SBram Moolenaar  return 123
2628a7d6542SBram Moolenaarenddef
2638a7d6542SBram Moolenaar
26409f28f49SBram Moolenaarlet g:notNumber = 'string'
26509f28f49SBram Moolenaar
26609f28f49SBram Moolenaardef ReturnGlobal(): number
26709f28f49SBram Moolenaar  return g:notNumber
26809f28f49SBram Moolenaarenddef
26909f28f49SBram Moolenaar
2709be61bbbSBram Moolenaardef Test_return_something()
2718a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
2728a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
27309f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
2748a7d6542SBram Moolenaarenddef
2758a7d6542SBram Moolenaar
2769be61bbbSBram Moolenaarlet s:nothing = 0
2779be61bbbSBram Moolenaardef ReturnNothing()
2789be61bbbSBram Moolenaar  s:nothing = 1
2799be61bbbSBram Moolenaar  if true
2809be61bbbSBram Moolenaar    return
2819be61bbbSBram Moolenaar  endif
2829be61bbbSBram Moolenaar  s:nothing = 2
2839be61bbbSBram Moolenaarenddef
2849be61bbbSBram Moolenaar
2859be61bbbSBram Moolenaardef Test_return_nothing()
2869be61bbbSBram Moolenaar  ReturnNothing()
2879be61bbbSBram Moolenaar  assert_equal(1, s:nothing)
2889be61bbbSBram Moolenaarenddef
2899be61bbbSBram Moolenaar
2908a7d6542SBram Moolenaarfunc Increment()
2918a7d6542SBram Moolenaar  let g:counter += 1
2928a7d6542SBram Moolenaarendfunc
2938a7d6542SBram Moolenaar
2948a7d6542SBram Moolenaardef Test_call_ufunc_count()
2958a7d6542SBram Moolenaar  g:counter = 1
2968a7d6542SBram Moolenaar  Increment()
2978a7d6542SBram Moolenaar  Increment()
2988a7d6542SBram Moolenaar  Increment()
2998a7d6542SBram Moolenaar  " works with and without :call
3008a7d6542SBram Moolenaar  assert_equal(4, g:counter)
301b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
3028a7d6542SBram Moolenaar  unlet g:counter
3038a7d6542SBram Moolenaarenddef
3048a7d6542SBram Moolenaar
3058a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
3068a7d6542SBram Moolenaar  let res = arg
3078a7d6542SBram Moolenaar  for s in rest
3088a7d6542SBram Moolenaar    res ..= ',' .. s
3098a7d6542SBram Moolenaar  endfor
3108a7d6542SBram Moolenaar  return res
3118a7d6542SBram Moolenaarenddef
3128a7d6542SBram Moolenaar
3138a7d6542SBram Moolenaardef Test_call_varargs()
3148a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
3158a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
3168a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
3178a7d6542SBram Moolenaarenddef
3188a7d6542SBram Moolenaar
319170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
320170fcfcfSBram Moolenaar  return name
321170fcfcfSBram Moolenaarenddef
322170fcfcfSBram Moolenaar
323170fcfcfSBram Moolenaardef Test_call_default_args()
324170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
325170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
326170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
327170fcfcfSBram Moolenaarenddef
328170fcfcfSBram Moolenaar
329170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
330170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
331170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
332170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
333170fcfcfSBram Moolenaarendfunc
334170fcfcfSBram Moolenaar
335b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
336b35efa5eSBram Moolenaar  echo a:arg
337b35efa5eSBram Moolenaarendfunc
338b35efa5eSBram Moolenaar
339bd5da371SBram Moolenaardef Test_call_wrong_args()
340b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
341b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
342bd5da371SBram Moolenaar  call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
343b35efa5eSBram Moolenaarenddef
344b35efa5eSBram Moolenaar
345170fcfcfSBram Moolenaar" Default arg and varargs
346170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
347170fcfcfSBram Moolenaar  let res = one .. ',' .. two
348170fcfcfSBram Moolenaar  for s in rest
349170fcfcfSBram Moolenaar    res ..= ',' .. s
350170fcfcfSBram Moolenaar  endfor
351170fcfcfSBram Moolenaar  return res
352170fcfcfSBram Moolenaarenddef
353170fcfcfSBram Moolenaar
354170fcfcfSBram Moolenaardef Test_call_def_varargs()
355170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
356170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
357170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
358170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
359170fcfcfSBram Moolenaarenddef
360170fcfcfSBram Moolenaar
36142a480bfSBram Moolenaardef Test_using_var_as_arg()
36242a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
36342a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
36442a480bfSBram Moolenaar  call delete('Xdef')
36542a480bfSBram Moolenaarenddef
36642a480bfSBram Moolenaar
367b35efa5eSBram Moolenaardef Test_call_func_defined_later()
368b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
369b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
370b35efa5eSBram Moolenaarenddef
371170fcfcfSBram Moolenaar
372b35efa5eSBram Moolenaarfunc DefinedLater(arg)
37326e117e9SBram Moolenaar  return a:arg
37426e117e9SBram Moolenaarendfunc
37526e117e9SBram Moolenaar
3767eeefd4aSBram Moolenaardef FuncWithForwardCall()
3777eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
3787eeefd4aSBram Moolenaarenddef
3797eeefd4aSBram Moolenaar
3807eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
3817eeefd4aSBram Moolenaar  return arg
3827eeefd4aSBram Moolenaarenddef
3837eeefd4aSBram Moolenaar
3847eeefd4aSBram Moolenaardef Test_error_in_nested_function()
3857eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
3867eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
3877eeefd4aSBram Moolenaarenddef
3887eeefd4aSBram Moolenaar
3898a7d6542SBram Moolenaardef Test_return_type_wrong()
390978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
391978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
392978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
393978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
394cf3f8bf4SBram Moolenaar
3959be61bbbSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
3969be61bbbSBram Moolenaar
397cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
398cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
3998a7d6542SBram Moolenaarenddef
4008a7d6542SBram Moolenaar
401bfe12043SBram Moolenaardef Test_arg_type_wrong()
402bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
403bfe12043SBram Moolenaarenddef
404bfe12043SBram Moolenaar
4058a7d6542SBram Moolenaardef Test_try_catch()
4068a7d6542SBram Moolenaar  let l = []
4078a7d6542SBram Moolenaar  try
4088a7d6542SBram Moolenaar    add(l, '1')
4098a7d6542SBram Moolenaar    throw 'wrong'
4108a7d6542SBram Moolenaar    add(l, '2')
4118a7d6542SBram Moolenaar  catch
4128a7d6542SBram Moolenaar    add(l, v:exception)
4138a7d6542SBram Moolenaar  finally
4148a7d6542SBram Moolenaar    add(l, '3')
4158a7d6542SBram Moolenaar  endtry
4168a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4178a7d6542SBram Moolenaarenddef
4188a7d6542SBram Moolenaar
419257cc5eeSBram Moolenaardef ThrowFromDef()
420257cc5eeSBram Moolenaar  throw 'getout'
421257cc5eeSBram Moolenaarenddef
422257cc5eeSBram Moolenaar
423257cc5eeSBram Moolenaarfunc CatchInFunc()
424257cc5eeSBram Moolenaar  try
425257cc5eeSBram Moolenaar    call ThrowFromDef()
426257cc5eeSBram Moolenaar  catch
427257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
428257cc5eeSBram Moolenaar  endtry
429257cc5eeSBram Moolenaarendfunc
430257cc5eeSBram Moolenaar
431257cc5eeSBram Moolenaardef CatchInDef()
432257cc5eeSBram Moolenaar  try
433257cc5eeSBram Moolenaar    ThrowFromDef()
434257cc5eeSBram Moolenaar  catch
435257cc5eeSBram Moolenaar    g:thrown_def = v:exception
436257cc5eeSBram Moolenaar  endtry
437257cc5eeSBram Moolenaarenddef
438257cc5eeSBram Moolenaar
439f575adffSBram Moolenaardef ReturnFinally(): string
440f575adffSBram Moolenaar  try
441f575adffSBram Moolenaar    return 'intry'
442f575adffSBram Moolenaar  finally
443f575adffSBram Moolenaar    g:in_finally = 'finally'
444f575adffSBram Moolenaar  endtry
445f575adffSBram Moolenaar  return 'end'
446f575adffSBram Moolenaarenddef
447f575adffSBram Moolenaar
448257cc5eeSBram Moolenaardef Test_try_catch_nested()
449257cc5eeSBram Moolenaar  CatchInFunc()
450257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
451257cc5eeSBram Moolenaar
452257cc5eeSBram Moolenaar  CatchInDef()
453257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
454f575adffSBram Moolenaar
455f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
456f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
457f575adffSBram Moolenaarenddef
458f575adffSBram Moolenaar
459f575adffSBram Moolenaardef Test_try_catch_match()
460f575adffSBram Moolenaar  let seq = 'a'
461f575adffSBram Moolenaar  try
462f575adffSBram Moolenaar    throw 'something'
463f575adffSBram Moolenaar  catch /nothing/
464f575adffSBram Moolenaar    seq ..= 'x'
465f575adffSBram Moolenaar  catch /some/
466f575adffSBram Moolenaar    seq ..= 'b'
467f575adffSBram Moolenaar  catch /asdf/
468f575adffSBram Moolenaar    seq ..= 'x'
469f575adffSBram Moolenaar  finally
470f575adffSBram Moolenaar    seq ..= 'c'
471f575adffSBram Moolenaar  endtry
472f575adffSBram Moolenaar  assert_equal('abc', seq)
473257cc5eeSBram Moolenaarenddef
474257cc5eeSBram Moolenaar
4758a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4768a7d6542SBram Moolenaar  vim9script
4778a7d6542SBram Moolenaar  let name: string = 'bob'
4788a7d6542SBram Moolenaar  def Concat(arg: string): string
4798a7d6542SBram Moolenaar    return name .. arg
4808a7d6542SBram Moolenaar  enddef
4818a7d6542SBram Moolenaar  let g:result = Concat('bie')
4828a7d6542SBram Moolenaar  let g:localname = name
4838a7d6542SBram Moolenaar
4848a7d6542SBram Moolenaar  export const CONST = 1234
4858a7d6542SBram Moolenaar  export let exported = 9876
4866e587dcbSBram Moolenaar  export let exp_name = 'John'
4878a7d6542SBram Moolenaar  export def Exported(): string
4888a7d6542SBram Moolenaar    return 'Exported'
4898a7d6542SBram Moolenaar  enddef
4908a7d6542SBram MoolenaarEND
4918a7d6542SBram Moolenaar
4925269bd2aSBram Moolenaardef Test_vim9_import_export()
4938a7d6542SBram Moolenaar  let import_script_lines =<< trim END
4948a7d6542SBram Moolenaar    vim9script
4958a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
4968a7d6542SBram Moolenaar    g:imported = exported
4976e587dcbSBram Moolenaar    exported += 3
4986e587dcbSBram Moolenaar    g:imported_added = exported
4998a7d6542SBram Moolenaar    g:imported_func = Exported()
5006e587dcbSBram Moolenaar
5016e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5026e587dcbSBram Moolenaar    g:imported_name = exp_name
5036e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5046e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5055381c7a1SBram Moolenaar    g:imported_later = exported
5068a7d6542SBram Moolenaar  END
5078a7d6542SBram Moolenaar
5088a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5098a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5108a7d6542SBram Moolenaar
5118a7d6542SBram Moolenaar  source Ximport.vim
5128a7d6542SBram Moolenaar
5138a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5148a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5158a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5166e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5175381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5188a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5196e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5206e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5218a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5228a7d6542SBram Moolenaar
5238a7d6542SBram Moolenaar  unlet g:result
5248a7d6542SBram Moolenaar  unlet g:localname
5258a7d6542SBram Moolenaar  unlet g:imported
5266e587dcbSBram Moolenaar  unlet g:imported_added
5275381c7a1SBram Moolenaar  unlet g:imported_later
5288a7d6542SBram Moolenaar  unlet g:imported_func
5296e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5308a7d6542SBram Moolenaar  delete('Ximport.vim')
531f2d5c240SBram Moolenaar
5325381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5335381c7a1SBram Moolenaar    vim9script
5345381c7a1SBram Moolenaar    def ImportInDef()
5355381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5365381c7a1SBram Moolenaar      g:imported = exported
5375381c7a1SBram Moolenaar      exported += 7
5385381c7a1SBram Moolenaar      g:imported_added = exported
5395381c7a1SBram Moolenaar    enddef
5405381c7a1SBram Moolenaar    ImportInDef()
5415381c7a1SBram Moolenaar  END
5425381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5435381c7a1SBram Moolenaar  source Ximport2.vim
5445381c7a1SBram Moolenaar  " TODO: this should be 9879
5455381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5465381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5475381c7a1SBram Moolenaar  unlet g:imported
5485381c7a1SBram Moolenaar  unlet g:imported_added
5495381c7a1SBram Moolenaar  delete('Ximport2.vim')
5505381c7a1SBram Moolenaar
551f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
552f2d5c240SBram Moolenaar    vim9script
553f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
554f2d5c240SBram Moolenaar    def UseExport()
555f2d5c240SBram Moolenaar      g:imported = Export.exported
556f2d5c240SBram Moolenaar    enddef
557f2d5c240SBram Moolenaar    UseExport()
558f2d5c240SBram Moolenaar  END
559f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
560f2d5c240SBram Moolenaar  source Ximport.vim
5615381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
562f2d5c240SBram Moolenaar
563599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
564599c89c8SBram Moolenaar    vim9script
565599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
566599c89c8SBram Moolenaar    def Func()
567599c89c8SBram Moolenaar      let dummy = 1
568599c89c8SBram Moolenaar      let imported = Export + dummy
569599c89c8SBram Moolenaar    enddef
570599c89c8SBram Moolenaar  END
571599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
572599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
573599c89c8SBram Moolenaar
574599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
575599c89c8SBram Moolenaar    vim9script
576599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
577599c89c8SBram Moolenaar    def Func()
578599c89c8SBram Moolenaar      let imported = Export . exported
579599c89c8SBram Moolenaar    enddef
580599c89c8SBram Moolenaar  END
581599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
582599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
583599c89c8SBram Moolenaar
584599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
585599c89c8SBram Moolenaar    vim9script
586599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
587599c89c8SBram Moolenaar    def Func()
588599c89c8SBram Moolenaar      let imported = Export.
589599c89c8SBram Moolenaar    enddef
590599c89c8SBram Moolenaar  END
591599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
592599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
593599c89c8SBram Moolenaar
594f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
595f2d5c240SBram Moolenaar    vim9script
596f2d5c240SBram Moolenaar    import * from './Xexport.vim'
597f2d5c240SBram Moolenaar    g:imported = exported
598f2d5c240SBram Moolenaar  END
599f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
600f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
601f2d5c240SBram Moolenaar
602fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
603fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
604fa29c8abSBram Moolenaar    vim9script
605fa29c8abSBram Moolenaar    import name from './Xexport.vim'
606fa29c8abSBram Moolenaar  END
607fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
608fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
609fa29c8abSBram Moolenaar
6105269bd2aSBram Moolenaar  " try to import something that is already defined
6115269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6125269bd2aSBram Moolenaar    vim9script
6135269bd2aSBram Moolenaar    let exported = 'something'
6145269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6155269bd2aSBram Moolenaar  END
6165269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6175269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6185269bd2aSBram Moolenaar
6195269bd2aSBram Moolenaar  " try to import something that is already defined
6205269bd2aSBram Moolenaar  import_already_defined =<< trim END
6215269bd2aSBram Moolenaar    vim9script
6225269bd2aSBram Moolenaar    let exported = 'something'
6235269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6245269bd2aSBram Moolenaar  END
6255269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6265269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6275269bd2aSBram Moolenaar
6285269bd2aSBram Moolenaar  " try to import something that is already defined
6295269bd2aSBram Moolenaar  import_already_defined =<< trim END
6305269bd2aSBram Moolenaar    vim9script
6315269bd2aSBram Moolenaar    let exported = 'something'
6325269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6335269bd2aSBram Moolenaar  END
6345269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6355269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6365269bd2aSBram Moolenaar
637fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
638fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
639fa29c8abSBram Moolenaar    vim9script
640fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
641fa29c8abSBram Moolenaar  END
642fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
643fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
644fa29c8abSBram Moolenaar
645fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
646fa29c8abSBram Moolenaar    vim9script
647fa29c8abSBram Moolenaar    import name './Xexport.vim'
648fa29c8abSBram Moolenaar  END
649fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
650fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
651fa29c8abSBram Moolenaar
652fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
653fa29c8abSBram Moolenaar    vim9script
654fa29c8abSBram Moolenaar    import name from Xexport.vim
655fa29c8abSBram Moolenaar  END
656fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
657fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
658fa29c8abSBram Moolenaar
659fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
660fa29c8abSBram Moolenaar    vim9script
661fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
662fa29c8abSBram Moolenaar  END
663fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
664fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
665fa29c8abSBram Moolenaar
666fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
667fa29c8abSBram Moolenaar    vim9script
668fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
669fa29c8abSBram Moolenaar  END
6705269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
6715269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
672fa29c8abSBram Moolenaar
673f2d5c240SBram Moolenaar  delete('Ximport.vim')
6745269bd2aSBram Moolenaar  delete('Ximport3.vim')
6758a7d6542SBram Moolenaar  delete('Xexport.vim')
6768a7d6542SBram Moolenaar
677750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
678750802b5SBram Moolenaar  set cpo&vi
679750802b5SBram Moolenaar  let cpo_before = &cpo
680750802b5SBram Moolenaar  let lines =<< trim END
681750802b5SBram Moolenaar    vim9script
682750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
683750802b5SBram Moolenaar  END
684750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
685750802b5SBram Moolenaar  source Xvim9_script
686750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
687750802b5SBram Moolenaar  set cpo&vim
688750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
689750802b5SBram Moolenaar  delete('Xvim9_script')
690750802b5SBram Moolenaarenddef
691750802b5SBram Moolenaar
692750802b5SBram Moolenaardef Test_vim9script_fails()
6938a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
6948a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
695750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
696f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
697750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
698750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
699750802b5SBram Moolenaar
700750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
701750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
7028a7d6542SBram Moolenaarenddef
7038a7d6542SBram Moolenaar
7048a7d6542SBram Moolenaardef Test_vim9script_call()
7058a7d6542SBram Moolenaar  let lines =<< trim END
7068a7d6542SBram Moolenaar    vim9script
7078a7d6542SBram Moolenaar    let var = ''
7088a7d6542SBram Moolenaar    def MyFunc(arg: string)
7098a7d6542SBram Moolenaar       var = arg
7108a7d6542SBram Moolenaar    enddef
7118a7d6542SBram Moolenaar    MyFunc('foobar')
7128a7d6542SBram Moolenaar    assert_equal('foobar', var)
7138a7d6542SBram Moolenaar
7148a7d6542SBram Moolenaar    let str = 'barfoo'
7158a7d6542SBram Moolenaar    str->MyFunc()
7168a7d6542SBram Moolenaar    assert_equal('barfoo', var)
7178a7d6542SBram Moolenaar
7188a7d6542SBram Moolenaar    let g:value = 'value'
7198a7d6542SBram Moolenaar    g:value->MyFunc()
7208a7d6542SBram Moolenaar    assert_equal('value', var)
7218a7d6542SBram Moolenaar
7228a7d6542SBram Moolenaar    let listvar = []
7238a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
7248a7d6542SBram Moolenaar       listvar = arg
7258a7d6542SBram Moolenaar    enddef
7268a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
7278a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
7288a7d6542SBram Moolenaar
7298a7d6542SBram Moolenaar    let dictvar = {}
7308a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
7318a7d6542SBram Moolenaar       dictvar = arg
7328a7d6542SBram Moolenaar    enddef
7338a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
7348a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
73533fa29cfSBram Moolenaar    def CompiledDict()
73633fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
73733fa29cfSBram Moolenaar    enddef
73833fa29cfSBram Moolenaar    CompiledDict()
73933fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
74033fa29cfSBram Moolenaar
7418a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
7428a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
7430c6ceaf9SBram Moolenaar
7440c6ceaf9SBram Moolenaar    ('text')->MyFunc()
7450c6ceaf9SBram Moolenaar    assert_equal('text', var)
7460c6ceaf9SBram Moolenaar    ("some")->MyFunc()
7470c6ceaf9SBram Moolenaar    assert_equal('some', var)
7488a7d6542SBram Moolenaar  END
7498a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
7508a7d6542SBram Moolenaar  source Xcall.vim
7518a7d6542SBram Moolenaar  delete('Xcall.vim')
7528a7d6542SBram Moolenaarenddef
7538a7d6542SBram Moolenaar
7548a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
7558a7d6542SBram Moolenaar  let lines =<< trim END
7568a7d6542SBram Moolenaar    vim9script
7578a7d6542SBram Moolenaar    let var = ''
7588a7d6542SBram Moolenaar    def MyFunc(arg: string)
7598a7d6542SBram Moolenaar       let var = 123
7608a7d6542SBram Moolenaar    enddef
7618a7d6542SBram Moolenaar  END
7628a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
7638a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
7648a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
7658a7d6542SBram Moolenaarenddef
7668a7d6542SBram Moolenaar
7678a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
7688a7d6542SBram Moolenaar  let lines =<< trim END
7698a7d6542SBram Moolenaar    vim9script
7708a7d6542SBram Moolenaar    const var = ''
7718a7d6542SBram Moolenaar    def MyFunc(arg: string)
7728a7d6542SBram Moolenaar       var = 'asdf'
7738a7d6542SBram Moolenaar    enddef
7748a7d6542SBram Moolenaar  END
7758a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
7768a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
7778a7d6542SBram Moolenaar  delete('Xcall_const.vim')
7788a7d6542SBram Moolenaarenddef
7798a7d6542SBram Moolenaar
7808a7d6542SBram Moolenaardef Test_vim9script_reload()
7818a7d6542SBram Moolenaar  let lines =<< trim END
7828a7d6542SBram Moolenaar    vim9script
7838a7d6542SBram Moolenaar    const var = ''
7848a7d6542SBram Moolenaar    let valone = 1234
7858a7d6542SBram Moolenaar    def MyFunc(arg: string)
7868a7d6542SBram Moolenaar       valone = 5678
7878a7d6542SBram Moolenaar    enddef
7888a7d6542SBram Moolenaar  END
7898a7d6542SBram Moolenaar  let morelines =<< trim END
7908a7d6542SBram Moolenaar    let valtwo = 222
7918a7d6542SBram Moolenaar    export def GetValtwo(): number
7928a7d6542SBram Moolenaar      return valtwo
7938a7d6542SBram Moolenaar    enddef
7948a7d6542SBram Moolenaar  END
7958a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7968a7d6542SBram Moolenaar  source Xreload.vim
7978a7d6542SBram Moolenaar  source Xreload.vim
7988a7d6542SBram Moolenaar  source Xreload.vim
7998a7d6542SBram Moolenaar
8008a7d6542SBram Moolenaar  let testlines =<< trim END
8018a7d6542SBram Moolenaar    vim9script
8028a7d6542SBram Moolenaar    def TheFunc()
8038a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8048a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8058a7d6542SBram Moolenaar    enddef
8068a7d6542SBram Moolenaar    TheFunc()
8078a7d6542SBram Moolenaar  END
8088a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8098a7d6542SBram Moolenaar  source Ximport.vim
8108a7d6542SBram Moolenaar
8118a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
8128a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
8138a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8148a7d6542SBram Moolenaar  source Xreload.vim
8158a7d6542SBram Moolenaar  source Ximport.vim
8168a7d6542SBram Moolenaar
8178a7d6542SBram Moolenaar  " cannot declare a var twice
8188a7d6542SBram Moolenaar  lines =<< trim END
8198a7d6542SBram Moolenaar    vim9script
8208a7d6542SBram Moolenaar    let valone = 1234
8218a7d6542SBram Moolenaar    let valone = 5678
8228a7d6542SBram Moolenaar  END
8238a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8248a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8258a7d6542SBram Moolenaar
8268a7d6542SBram Moolenaar  delete('Xreload.vim')
8278a7d6542SBram Moolenaar  delete('Ximport.vim')
8288a7d6542SBram Moolenaarenddef
8298a7d6542SBram Moolenaar
8308a7d6542SBram Moolenaardef Test_import_absolute()
8318a7d6542SBram Moolenaar  let import_lines = [
8328a7d6542SBram Moolenaar        \ 'vim9script',
8338a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
834b283a8a6SBram Moolenaar        \ 'def UseExported()',
8358a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
8364e12a5dfSBram Moolenaar        \ '  exported = 8888',
8374e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
838b283a8a6SBram Moolenaar        \ 'enddef',
839b283a8a6SBram Moolenaar        \ 'UseExported()',
8404e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
8418a7d6542SBram Moolenaar        \ ]
8428a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8438a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8448a7d6542SBram Moolenaar
8458a7d6542SBram Moolenaar  source Ximport_abs.vim
8468a7d6542SBram Moolenaar
8478a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8484e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
849b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
850b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
851b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8524e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
8534e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
8544e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
8554e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
8564e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8574e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
8584e12a5dfSBram Moolenaar        \, g:import_disassembled)
8598a7d6542SBram Moolenaar  unlet g:imported_abs
8604e12a5dfSBram Moolenaar  unlet g:import_disassembled
8618a7d6542SBram Moolenaar
8628a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8638a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8648a7d6542SBram Moolenaarenddef
8658a7d6542SBram Moolenaar
8668a7d6542SBram Moolenaardef Test_import_rtp()
8678a7d6542SBram Moolenaar  let import_lines = [
8688a7d6542SBram Moolenaar        \ 'vim9script',
8698a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
8708a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
8718a7d6542SBram Moolenaar        \ ]
8728a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
8738a7d6542SBram Moolenaar  mkdir('import')
8748a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
8758a7d6542SBram Moolenaar
8768a7d6542SBram Moolenaar  let save_rtp = &rtp
8778a7d6542SBram Moolenaar  &rtp = getcwd()
8788a7d6542SBram Moolenaar  source Ximport_rtp.vim
8798a7d6542SBram Moolenaar  &rtp = save_rtp
8808a7d6542SBram Moolenaar
8818a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
8828a7d6542SBram Moolenaar  unlet g:imported_rtp
8838a7d6542SBram Moolenaar
8848a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
8858a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
8868a7d6542SBram Moolenaar  delete('import', 'd')
8878a7d6542SBram Moolenaarenddef
8888a7d6542SBram Moolenaar
8898a7d6542SBram Moolenaardef Test_fixed_size_list()
8908a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
8918a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
8928a7d6542SBram Moolenaar  l->remove(0)
8938a7d6542SBram Moolenaar  l->add(5)
8948a7d6542SBram Moolenaar  l->insert(99, 1)
8950f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
8968a7d6542SBram Moolenaarenddef
8978a7d6542SBram Moolenaar
898673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
899673660abSBram Moolenaar" recognized.
900673660abSBram Moolenaarfunc Test_function_python()
901673660abSBram Moolenaar  CheckFeature python3
902673660abSBram Moolenaar  let py = 'python3'
903673660abSBram Moolenaar  execute py "<< EOF"
904673660abSBram Moolenaardef do_something():
905673660abSBram Moolenaar  return 1
906673660abSBram MoolenaarEOF
907673660abSBram Moolenaarendfunc
908673660abSBram Moolenaar
909158906cfSBram Moolenaardef IfElse(what: number): string
910158906cfSBram Moolenaar  let res = ''
911158906cfSBram Moolenaar  if what == 1
912158906cfSBram Moolenaar    res = "one"
913158906cfSBram Moolenaar  elseif what == 2
914158906cfSBram Moolenaar    res = "two"
915a259d8d3SBram Moolenaar  else
916158906cfSBram Moolenaar    res = "three"
917a259d8d3SBram Moolenaar  endif
918158906cfSBram Moolenaar  return res
919a259d8d3SBram Moolenaarenddef
920a259d8d3SBram Moolenaar
921158906cfSBram Moolenaardef Test_if_elseif_else()
922158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
923158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
924158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
9250f18b6d1SBram Moolenaarenddef
9260f18b6d1SBram Moolenaar
9276d69bf60SBram Moolenaarlet g:bool_true = v:true
9286d69bf60SBram Moolenaarlet g:bool_false = v:false
9296d69bf60SBram Moolenaar
9306d69bf60SBram Moolenaardef Test_if_const_expr()
9316d69bf60SBram Moolenaar  let res = false
9326d69bf60SBram Moolenaar  if true ? true : false
9336d69bf60SBram Moolenaar    res = true
9346d69bf60SBram Moolenaar  endif
9356d69bf60SBram Moolenaar  assert_equal(true, res)
9366d69bf60SBram Moolenaar
9376d69bf60SBram Moolenaar  res = false
9386d69bf60SBram Moolenaar  if g:bool_true ? true : false
9396d69bf60SBram Moolenaar    res = true
9406d69bf60SBram Moolenaar  endif
9416d69bf60SBram Moolenaar  assert_equal(true, res)
9426d69bf60SBram Moolenaar
9436d69bf60SBram Moolenaar  res = false
9446d69bf60SBram Moolenaar  if true ? g:bool_true : false
9456d69bf60SBram Moolenaar    res = true
9466d69bf60SBram Moolenaar  endif
9476d69bf60SBram Moolenaar  assert_equal(true, res)
9486d69bf60SBram Moolenaar
9496d69bf60SBram Moolenaar  res = false
9506d69bf60SBram Moolenaar  if true ? true : g:bool_false
9516d69bf60SBram Moolenaar    res = true
9526d69bf60SBram Moolenaar  endif
9536d69bf60SBram Moolenaar  assert_equal(true, res)
9546d69bf60SBram Moolenaar
9556d69bf60SBram Moolenaar  res = false
9566d69bf60SBram Moolenaar  if true ? false : true
9576d69bf60SBram Moolenaar    res = true
9586d69bf60SBram Moolenaar  endif
9596d69bf60SBram Moolenaar  assert_equal(false, res)
9606d69bf60SBram Moolenaar
9616d69bf60SBram Moolenaar  res = false
9626d69bf60SBram Moolenaar  if false ? false : true
9636d69bf60SBram Moolenaar    res = true
9646d69bf60SBram Moolenaar  endif
9656d69bf60SBram Moolenaar  assert_equal(true, res)
9666d69bf60SBram Moolenaar
9676d69bf60SBram Moolenaar  res = false
9686d69bf60SBram Moolenaar  if false ? true : false
9696d69bf60SBram Moolenaar    res = true
9706d69bf60SBram Moolenaar  endif
9716d69bf60SBram Moolenaar  assert_equal(false, res)
9726d69bf60SBram Moolenaar
9736d69bf60SBram Moolenaar  res = false
9746d69bf60SBram Moolenaar  if true && true
9756d69bf60SBram Moolenaar    res = true
9766d69bf60SBram Moolenaar  endif
9776d69bf60SBram Moolenaar  assert_equal(true, res)
9786d69bf60SBram Moolenaar
9796d69bf60SBram Moolenaar  res = false
9806d69bf60SBram Moolenaar  if true && false
9816d69bf60SBram Moolenaar    res = true
9826d69bf60SBram Moolenaar  endif
9836d69bf60SBram Moolenaar  assert_equal(false, res)
9846d69bf60SBram Moolenaar
9856d69bf60SBram Moolenaar  res = false
9866d69bf60SBram Moolenaar  if g:bool_true && false
9876d69bf60SBram Moolenaar    res = true
9886d69bf60SBram Moolenaar  endif
9896d69bf60SBram Moolenaar  assert_equal(false, res)
9906d69bf60SBram Moolenaar
9916d69bf60SBram Moolenaar  res = false
9926d69bf60SBram Moolenaar  if true && g:bool_false
9936d69bf60SBram Moolenaar    res = true
9946d69bf60SBram Moolenaar  endif
9956d69bf60SBram Moolenaar  assert_equal(false, res)
9966d69bf60SBram Moolenaar
9976d69bf60SBram Moolenaar  res = false
9986d69bf60SBram Moolenaar  if false && false
9996d69bf60SBram Moolenaar    res = true
10006d69bf60SBram Moolenaar  endif
10016d69bf60SBram Moolenaar  assert_equal(false, res)
10026d69bf60SBram Moolenaar
10036d69bf60SBram Moolenaar  res = false
10046d69bf60SBram Moolenaar  if true || false
10056d69bf60SBram Moolenaar    res = true
10066d69bf60SBram Moolenaar  endif
10076d69bf60SBram Moolenaar  assert_equal(true, res)
10086d69bf60SBram Moolenaar
10096d69bf60SBram Moolenaar  res = false
10106d69bf60SBram Moolenaar  if g:bool_true || false
10116d69bf60SBram Moolenaar    res = true
10126d69bf60SBram Moolenaar  endif
10136d69bf60SBram Moolenaar  assert_equal(true, res)
10146d69bf60SBram Moolenaar
10156d69bf60SBram Moolenaar  res = false
10166d69bf60SBram Moolenaar  if true || g:bool_false
10176d69bf60SBram Moolenaar    res = true
10186d69bf60SBram Moolenaar  endif
10196d69bf60SBram Moolenaar  assert_equal(true, res)
10206d69bf60SBram Moolenaar
10216d69bf60SBram Moolenaar  res = false
10226d69bf60SBram Moolenaar  if false || false
10236d69bf60SBram Moolenaar    res = true
10246d69bf60SBram Moolenaar  endif
10256d69bf60SBram Moolenaar  assert_equal(false, res)
1026*80c34ca3SBram Moolenaarenddef
10276d69bf60SBram Moolenaar
1028*80c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1029*80c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1030*80c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
10316d69bf60SBram Moolenaarenddef
10326d69bf60SBram Moolenaar
103363ce4849SBram Moolenaardef Test_delfunc()
103463ce4849SBram Moolenaar  let lines =<< trim END
103563ce4849SBram Moolenaar    vim9script
103663ce4849SBram Moolenaar    def GoneSoon()
103763ce4849SBram Moolenaar      echo 'hello'
103863ce4849SBram Moolenaar    enddef
103963ce4849SBram Moolenaar
104063ce4849SBram Moolenaar    def CallGoneSoon()
104163ce4849SBram Moolenaar      GoneSoon()
104263ce4849SBram Moolenaar    enddef
104363ce4849SBram Moolenaar
104463ce4849SBram Moolenaar    delfunc GoneSoon
104563ce4849SBram Moolenaar    CallGoneSoon()
104663ce4849SBram Moolenaar  END
104763ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
104863ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
104963ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
105063ce4849SBram Moolenaar
105163ce4849SBram Moolenaar  delete('XToDelFunc')
105263ce4849SBram Moolenaarenddef
105363ce4849SBram Moolenaar
1054ad39c094SBram Moolenaardef Test_execute_cmd()
1055ad39c094SBram Moolenaar  new
1056ad39c094SBram Moolenaar  setline(1, 'default')
1057ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1058ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1059ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1060ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1061ad39c094SBram Moolenaar  execute cmd1 cmd2
1062ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1063ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1064ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1065ad39c094SBram Moolenaar  let cmd_first = 'call '
1066ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1067ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1068ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1069ad39c094SBram Moolenaar  bwipe!
1070ad39c094SBram Moolenaarenddef
1071ad39c094SBram Moolenaar
1072ad39c094SBram Moolenaardef Test_echo_cmd()
1073ad39c094SBram Moolenaar  echo 'something'
1074ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1075ad39c094SBram Moolenaar
1076ad39c094SBram Moolenaar  let str1 = 'some'
1077ad39c094SBram Moolenaar  let str2 = 'more'
1078ad39c094SBram Moolenaar  echo str1 str2
1079ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1080ad39c094SBram Moolenaarenddef
1081ad39c094SBram 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
1097d0df1aacSBram Moolenaardef Test_while_loop()
1098d0df1aacSBram Moolenaar  let result = ''
1099d0df1aacSBram Moolenaar  let cnt = 0
1100d0df1aacSBram Moolenaar  while cnt < 555
1101d0df1aacSBram Moolenaar    if cnt == 3
1102d0df1aacSBram Moolenaar      break
1103d0df1aacSBram Moolenaar    endif
1104d0df1aacSBram Moolenaar    cnt += 1
1105d0df1aacSBram Moolenaar    if cnt == 2
1106d0df1aacSBram Moolenaar      continue
1107d0df1aacSBram Moolenaar    endif
1108d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1109d0df1aacSBram Moolenaar  endwhile
1110d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1111d0df1aacSBram Moolenaarenddef
1112d0df1aacSBram Moolenaar
1113bd5da371SBram Moolenaardef Test_for_loop_fails()
1114bd5da371SBram Moolenaar  call CheckDefFailure(['for # in range(5)'], 'E690:')
1115bd5da371SBram Moolenaar  call CheckDefFailure(['for i In range(5)'], 'E690:')
1116bd5da371SBram Moolenaar  call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1117bd5da371SBram Moolenaar  call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1118bd5da371SBram Moolenaar  call CheckDefFailure(['for i in "text"'], 'E1024:')
1119bd5da371SBram Moolenaarenddef
1120bd5da371SBram Moolenaar
11219645e2d9SBram Moolenaardef Test_interrupt_loop()
112297acfc78SBram Moolenaar  let caught = false
11239645e2d9SBram Moolenaar  let x = 0
112497acfc78SBram Moolenaar  try
11259645e2d9SBram Moolenaar    while 1
11269645e2d9SBram Moolenaar      x += 1
11279645e2d9SBram Moolenaar      if x == 100
11289645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
11299645e2d9SBram Moolenaar      endif
11309645e2d9SBram Moolenaar    endwhile
113197acfc78SBram Moolenaar  catch
113297acfc78SBram Moolenaar    caught = true
113397acfc78SBram Moolenaar    assert_equal(100, x)
113497acfc78SBram Moolenaar  endtry
113597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
11369645e2d9SBram Moolenaarenddef
113720431c9dSBram Moolenaar
1138d0df1aacSBram Moolenaardef Test_substitute_cmd()
1139d0df1aacSBram Moolenaar  new
1140d0df1aacSBram Moolenaar  setline(1, 'something')
1141d0df1aacSBram Moolenaar  :substitute(some(other(
1142d0df1aacSBram Moolenaar  assert_equal('otherthing', getline(1))
1143d0df1aacSBram Moolenaar  bwipe!
1144d0df1aacSBram Moolenaar
1145d0df1aacSBram Moolenaar  " also when the context is Vim9 script
1146d0df1aacSBram Moolenaar  let lines =<< trim END
1147d0df1aacSBram Moolenaar    vim9script
1148d0df1aacSBram Moolenaar    new
1149d0df1aacSBram Moolenaar    setline(1, 'something')
1150d0df1aacSBram Moolenaar    :substitute(some(other(
1151d0df1aacSBram Moolenaar    assert_equal('otherthing', getline(1))
1152d0df1aacSBram Moolenaar    bwipe!
1153d0df1aacSBram Moolenaar  END
1154d0df1aacSBram Moolenaar  writefile(lines, 'Xvim9lines')
1155d0df1aacSBram Moolenaar  source Xvim9lines
1156d0df1aacSBram Moolenaar
1157d0df1aacSBram Moolenaar  delete('Xvim9lines')
1158d0df1aacSBram Moolenaarenddef
1159d0df1aacSBram Moolenaar
116020431c9dSBram Moolenaardef Test_redef_failure()
116120431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
116220431c9dSBram Moolenaar  so Xdef
116320431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
116420431c9dSBram Moolenaar  so Xdef
116520431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
116620431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
116720431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
116820431c9dSBram Moolenaar  so Xdef
116920431c9dSBram Moolenaar  call delete('Xdef')
117020431c9dSBram Moolenaar
117120431c9dSBram Moolenaar  call assert_equal(0, Func0())
117220431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
117320431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
117420431c9dSBram Moolenaar
117520431c9dSBram Moolenaar  delfunc! Func0
117620431c9dSBram Moolenaar  delfunc! Func1
117720431c9dSBram Moolenaar  delfunc! Func2
117820431c9dSBram Moolenaarenddef
117920431c9dSBram Moolenaar
11807d941ee0SBram Moolenaar" Test for internal functions returning different types
11817d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
11827d941ee0SBram Moolenaar  let lines =<< trim END
11837d941ee0SBram Moolenaar    def RetFloat(): float
11847d941ee0SBram Moolenaar      return ceil(1.456)
11857d941ee0SBram Moolenaar    enddef
11867d941ee0SBram Moolenaar
11877d941ee0SBram Moolenaar    def RetListAny(): list<any>
11887d941ee0SBram Moolenaar      return items({'k' : 'v'})
11897d941ee0SBram Moolenaar    enddef
11907d941ee0SBram Moolenaar
11917d941ee0SBram Moolenaar    def RetListString(): list<string>
11927d941ee0SBram Moolenaar      return split('a:b:c', ':')
11937d941ee0SBram Moolenaar    enddef
11947d941ee0SBram Moolenaar
11957d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
11967d941ee0SBram Moolenaar      return getbufinfo()
11977d941ee0SBram Moolenaar    enddef
11987d941ee0SBram Moolenaar
11997d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
12007d941ee0SBram Moolenaar      return wordcount()
12017d941ee0SBram Moolenaar    enddef
12027d941ee0SBram Moolenaar
12037d941ee0SBram Moolenaar    def RetDictString(): dict<string>
12047d941ee0SBram Moolenaar      return environ()
12057d941ee0SBram Moolenaar    enddef
12067d941ee0SBram Moolenaar  END
12077d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
12087d941ee0SBram Moolenaar  source Xscript
12097d941ee0SBram Moolenaar
12107d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
12117d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
12127d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
12137d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
12147d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
12157d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
12167d941ee0SBram Moolenaar  call delete('Xscript')
12177d941ee0SBram Moolenaarendfunc
12187d941ee0SBram Moolenaar
12197d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
12207d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
12217d941ee0SBram Moolenaar  let l =<< trim END
12227d941ee0SBram Moolenaar    def! FArgErr(): float
12237d941ee0SBram Moolenaar      return ceil(1.1, 2)
12247d941ee0SBram Moolenaar    enddef
12257d941ee0SBram Moolenaar  END
12267d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12277d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
12287d941ee0SBram Moolenaar  let l =<< trim END
12297d941ee0SBram Moolenaar    def! FArgErr(): float
12307d941ee0SBram Moolenaar      return ceil()
12317d941ee0SBram Moolenaar    enddef
12327d941ee0SBram Moolenaar  END
12337d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12347d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
12357d941ee0SBram Moolenaar  call delete('Xinvalidarg')
12367d941ee0SBram Moolenaarendfunc
12377d941ee0SBram Moolenaar
12388a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1239