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)
10380c34ca3SBram Moolenaar  &ts -= 3
10480c34ca3SBram Moolenaar  assert_equal(5, &ts)
10580c34ca3SBram Moolenaar  &ts *= 2
10680c34ca3SBram Moolenaar  assert_equal(10, &ts)
10780c34ca3SBram Moolenaar  &ts /= 3
10880c34ca3SBram Moolenaar  assert_equal(3, &ts)
10980c34ca3SBram Moolenaar  set ts=10
11080c34ca3SBram Moolenaar  &ts %= 4
11180c34ca3SBram 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*585fea7bSBram Moolenaar  " test freeing ISN_STOREOPT
116*585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11780c34ca3SBram Moolenaar  &ts = 8
118a8c17704SBram Moolenaar
119a8c17704SBram Moolenaar  g:inc_counter += 1
120a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
121a8c17704SBram Moolenaar
122a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
123a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
124a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
125a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
126a8c17704SBram Moolenaar
127a8c17704SBram Moolenaar  @a = 'areg'
128a8c17704SBram Moolenaar  @a ..= 'add'
129a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
130a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
131a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
132e69f6d04SBram Moolenaar
133e69f6d04SBram Moolenaar  v:errmsg = 'none'
134e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
135e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
136e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
137e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
138e69f6d04SBram Moolenaar
139e69f6d04SBram Moolenaar  " Test default values.
140e69f6d04SBram Moolenaar  let thebool: bool
141e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
142e69f6d04SBram Moolenaar
143e69f6d04SBram Moolenaar  let thenumber: number
144e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
145e69f6d04SBram Moolenaar
146e69f6d04SBram Moolenaar  if has('float')
147e69f6d04SBram Moolenaar    let thefloat: float
148e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
149e69f6d04SBram Moolenaar  endif
150e69f6d04SBram Moolenaar
151e69f6d04SBram Moolenaar  let thestring: string
152e69f6d04SBram Moolenaar  assert_equal('', thestring)
153e69f6d04SBram Moolenaar
154e69f6d04SBram Moolenaar  let theblob: blob
155e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
156e69f6d04SBram Moolenaar
157e69f6d04SBram Moolenaar  let thefunc: func
158e69f6d04SBram Moolenaar  assert_equal(test_null_function(), thefunc)
159e69f6d04SBram Moolenaar
160e69f6d04SBram Moolenaar  let thepartial: partial
161e69f6d04SBram Moolenaar  assert_equal(test_null_partial(), thepartial)
162e69f6d04SBram Moolenaar
163e69f6d04SBram Moolenaar  let thelist: list<any>
164e69f6d04SBram Moolenaar  assert_equal([], thelist)
165e69f6d04SBram Moolenaar
166e69f6d04SBram Moolenaar  let thedict: dict<any>
167e69f6d04SBram Moolenaar  assert_equal({}, thedict)
168e69f6d04SBram Moolenaar
1692c869deeSBram Moolenaar  if has('channel')
170e69f6d04SBram Moolenaar    let thejob: job
171e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
172e69f6d04SBram Moolenaar
173e69f6d04SBram Moolenaar    let thechannel: channel
174e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
1752c869deeSBram Moolenaar  endif
176*585fea7bSBram Moolenaar
177*585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
178*585fea7bSBram Moolenaar  assert_equal(5678, nr)
1798a7d6542SBram Moolenaarenddef
1808a7d6542SBram Moolenaar
1818a7d6542SBram Moolenaarfunc Test_assignment_failure()
1828a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1838a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1848a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1858a7d6542SBram Moolenaar
1868a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1878a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1888a7d6542SBram Moolenaar
1899be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1909be61bbbSBram Moolenaar
191e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1929be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1939be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1949be61bbbSBram Moolenaar
1959be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1969be61bbbSBram Moolenaar
1979be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1989be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1999be61bbbSBram Moolenaar
2009be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
2019be61bbbSBram Moolenaar
2029be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2039be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2049be61bbbSBram Moolenaar
20533fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
20633fa29cfSBram Moolenaar
2078a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2088a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2098a7d6542SBram Moolenaar
2108a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2118a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2128a7d6542SBram Moolenaar
2138a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2148a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
21542a480bfSBram Moolenaar
21642a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
21742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
218599c89c8SBram Moolenaarendfunc
219599c89c8SBram Moolenaar
220599c89c8SBram Moolenaarfunc Test_wrong_type()
221599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
222599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
223599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
224599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
225599c89c8SBram Moolenaar
226599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
227599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
22842a480bfSBram Moolenaar
22942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
23042a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
23142a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
23242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
23342a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
23442a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
23542a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
23642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
23742a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
23842a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
23942a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2408a7d6542SBram Moolenaarendfunc
2418a7d6542SBram Moolenaar
2428a7d6542SBram Moolenaarfunc Test_const()
2438a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2448a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2458a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2469be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2478a7d6542SBram Moolenaarendfunc
2488a7d6542SBram Moolenaar
2498a7d6542SBram Moolenaardef Test_block()
2508a7d6542SBram Moolenaar  let outer = 1
2518a7d6542SBram Moolenaar  {
2528a7d6542SBram Moolenaar    let inner = 2
2538a7d6542SBram Moolenaar    assert_equal(1, outer)
2548a7d6542SBram Moolenaar    assert_equal(2, inner)
2558a7d6542SBram Moolenaar  }
2568a7d6542SBram Moolenaar  assert_equal(1, outer)
2578a7d6542SBram Moolenaarenddef
2588a7d6542SBram Moolenaar
2598a7d6542SBram Moolenaarfunc Test_block_failure()
2608a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
261*585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
262*585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
2638a7d6542SBram Moolenaarendfunc
2648a7d6542SBram Moolenaar
265*585fea7bSBram Moolenaardef Test_cmd_modifier()
266*585fea7bSBram Moolenaar  tab echo '0'
267*585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
268*585fea7bSBram Moolenaarenddef
269*585fea7bSBram Moolenaar
270*585fea7bSBram Moolenaar
2718a7d6542SBram Moolenaardef ReturnString(): string
2728a7d6542SBram Moolenaar  return 'string'
2738a7d6542SBram Moolenaarenddef
2748a7d6542SBram Moolenaar
2758a7d6542SBram Moolenaardef ReturnNumber(): number
2768a7d6542SBram Moolenaar  return 123
2778a7d6542SBram Moolenaarenddef
2788a7d6542SBram Moolenaar
27909f28f49SBram Moolenaarlet g:notNumber = 'string'
28009f28f49SBram Moolenaar
28109f28f49SBram Moolenaardef ReturnGlobal(): number
28209f28f49SBram Moolenaar  return g:notNumber
28309f28f49SBram Moolenaarenddef
28409f28f49SBram Moolenaar
2859be61bbbSBram Moolenaardef Test_return_something()
2868a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
2878a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
28809f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
2898a7d6542SBram Moolenaarenddef
2908a7d6542SBram Moolenaar
2919be61bbbSBram Moolenaarlet s:nothing = 0
2929be61bbbSBram Moolenaardef ReturnNothing()
2939be61bbbSBram Moolenaar  s:nothing = 1
2949be61bbbSBram Moolenaar  if true
2959be61bbbSBram Moolenaar    return
2969be61bbbSBram Moolenaar  endif
2979be61bbbSBram Moolenaar  s:nothing = 2
2989be61bbbSBram Moolenaarenddef
2999be61bbbSBram Moolenaar
3009be61bbbSBram Moolenaardef Test_return_nothing()
3019be61bbbSBram Moolenaar  ReturnNothing()
3029be61bbbSBram Moolenaar  assert_equal(1, s:nothing)
3039be61bbbSBram Moolenaarenddef
3049be61bbbSBram Moolenaar
3058a7d6542SBram Moolenaarfunc Increment()
3068a7d6542SBram Moolenaar  let g:counter += 1
3078a7d6542SBram Moolenaarendfunc
3088a7d6542SBram Moolenaar
3098a7d6542SBram Moolenaardef Test_call_ufunc_count()
3108a7d6542SBram Moolenaar  g:counter = 1
3118a7d6542SBram Moolenaar  Increment()
3128a7d6542SBram Moolenaar  Increment()
3138a7d6542SBram Moolenaar  Increment()
3148a7d6542SBram Moolenaar  " works with and without :call
3158a7d6542SBram Moolenaar  assert_equal(4, g:counter)
316b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
3178a7d6542SBram Moolenaar  unlet g:counter
3188a7d6542SBram Moolenaarenddef
3198a7d6542SBram Moolenaar
3208a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
3218a7d6542SBram Moolenaar  let res = arg
3228a7d6542SBram Moolenaar  for s in rest
3238a7d6542SBram Moolenaar    res ..= ',' .. s
3248a7d6542SBram Moolenaar  endfor
3258a7d6542SBram Moolenaar  return res
3268a7d6542SBram Moolenaarenddef
3278a7d6542SBram Moolenaar
3288a7d6542SBram Moolenaardef Test_call_varargs()
3298a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
3308a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
3318a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
3328a7d6542SBram Moolenaarenddef
3338a7d6542SBram Moolenaar
334170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
335170fcfcfSBram Moolenaar  return name
336170fcfcfSBram Moolenaarenddef
337170fcfcfSBram Moolenaar
338170fcfcfSBram Moolenaardef Test_call_default_args()
339170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
340170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
341170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
342*585fea7bSBram Moolenaar
343*585fea7bSBram Moolenaar  call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:')
344170fcfcfSBram Moolenaarenddef
345170fcfcfSBram Moolenaar
346170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
347170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
348170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
349170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
350170fcfcfSBram Moolenaarendfunc
351170fcfcfSBram Moolenaar
352b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
353b35efa5eSBram Moolenaar  echo a:arg
354b35efa5eSBram Moolenaarendfunc
355b35efa5eSBram Moolenaar
356bd5da371SBram Moolenaardef Test_call_wrong_args()
357b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
358b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
359bd5da371SBram Moolenaar  call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
360b35efa5eSBram Moolenaarenddef
361b35efa5eSBram Moolenaar
362170fcfcfSBram Moolenaar" Default arg and varargs
363170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
364170fcfcfSBram Moolenaar  let res = one .. ',' .. two
365170fcfcfSBram Moolenaar  for s in rest
366170fcfcfSBram Moolenaar    res ..= ',' .. s
367170fcfcfSBram Moolenaar  endfor
368170fcfcfSBram Moolenaar  return res
369170fcfcfSBram Moolenaarenddef
370170fcfcfSBram Moolenaar
371170fcfcfSBram Moolenaardef Test_call_def_varargs()
372170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
373170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
374170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
375170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
376170fcfcfSBram Moolenaarenddef
377170fcfcfSBram Moolenaar
37842a480bfSBram Moolenaardef Test_using_var_as_arg()
37942a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
38042a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
38142a480bfSBram Moolenaar  call delete('Xdef')
38242a480bfSBram Moolenaarenddef
38342a480bfSBram Moolenaar
384b35efa5eSBram Moolenaardef Test_call_func_defined_later()
385b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
386b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
387b35efa5eSBram Moolenaarenddef
388170fcfcfSBram Moolenaar
389b35efa5eSBram Moolenaarfunc DefinedLater(arg)
39026e117e9SBram Moolenaar  return a:arg
39126e117e9SBram Moolenaarendfunc
39226e117e9SBram Moolenaar
3937eeefd4aSBram Moolenaardef FuncWithForwardCall()
3947eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
3957eeefd4aSBram Moolenaarenddef
3967eeefd4aSBram Moolenaar
3977eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
3987eeefd4aSBram Moolenaar  return arg
3997eeefd4aSBram Moolenaarenddef
4007eeefd4aSBram Moolenaar
4017eeefd4aSBram Moolenaardef Test_error_in_nested_function()
4027eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
4037eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
4047eeefd4aSBram Moolenaarenddef
4057eeefd4aSBram Moolenaar
4068a7d6542SBram Moolenaardef Test_return_type_wrong()
407978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
408978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
409978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
410978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
411cf3f8bf4SBram Moolenaar
4129be61bbbSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
4139be61bbbSBram Moolenaar
414cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
415cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
4168a7d6542SBram Moolenaarenddef
4178a7d6542SBram Moolenaar
418bfe12043SBram Moolenaardef Test_arg_type_wrong()
419bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
420bfe12043SBram Moolenaarenddef
421bfe12043SBram Moolenaar
4228a7d6542SBram Moolenaardef Test_try_catch()
4238a7d6542SBram Moolenaar  let l = []
4248a7d6542SBram Moolenaar  try
4258a7d6542SBram Moolenaar    add(l, '1')
4268a7d6542SBram Moolenaar    throw 'wrong'
4278a7d6542SBram Moolenaar    add(l, '2')
4288a7d6542SBram Moolenaar  catch
4298a7d6542SBram Moolenaar    add(l, v:exception)
4308a7d6542SBram Moolenaar  finally
4318a7d6542SBram Moolenaar    add(l, '3')
4328a7d6542SBram Moolenaar  endtry
4338a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4348a7d6542SBram Moolenaarenddef
4358a7d6542SBram Moolenaar
436257cc5eeSBram Moolenaardef ThrowFromDef()
437257cc5eeSBram Moolenaar  throw 'getout'
438257cc5eeSBram Moolenaarenddef
439257cc5eeSBram Moolenaar
440257cc5eeSBram Moolenaarfunc CatchInFunc()
441257cc5eeSBram Moolenaar  try
442257cc5eeSBram Moolenaar    call ThrowFromDef()
443257cc5eeSBram Moolenaar  catch
444257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
445257cc5eeSBram Moolenaar  endtry
446257cc5eeSBram Moolenaarendfunc
447257cc5eeSBram Moolenaar
448257cc5eeSBram Moolenaardef CatchInDef()
449257cc5eeSBram Moolenaar  try
450257cc5eeSBram Moolenaar    ThrowFromDef()
451257cc5eeSBram Moolenaar  catch
452257cc5eeSBram Moolenaar    g:thrown_def = v:exception
453257cc5eeSBram Moolenaar  endtry
454257cc5eeSBram Moolenaarenddef
455257cc5eeSBram Moolenaar
456f575adffSBram Moolenaardef ReturnFinally(): string
457f575adffSBram Moolenaar  try
458f575adffSBram Moolenaar    return 'intry'
459f575adffSBram Moolenaar  finally
460f575adffSBram Moolenaar    g:in_finally = 'finally'
461f575adffSBram Moolenaar  endtry
462f575adffSBram Moolenaar  return 'end'
463f575adffSBram Moolenaarenddef
464f575adffSBram Moolenaar
465257cc5eeSBram Moolenaardef Test_try_catch_nested()
466257cc5eeSBram Moolenaar  CatchInFunc()
467257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
468257cc5eeSBram Moolenaar
469257cc5eeSBram Moolenaar  CatchInDef()
470257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
471f575adffSBram Moolenaar
472f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
473f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
474f575adffSBram Moolenaarenddef
475f575adffSBram Moolenaar
476f575adffSBram Moolenaardef Test_try_catch_match()
477f575adffSBram Moolenaar  let seq = 'a'
478f575adffSBram Moolenaar  try
479f575adffSBram Moolenaar    throw 'something'
480f575adffSBram Moolenaar  catch /nothing/
481f575adffSBram Moolenaar    seq ..= 'x'
482f575adffSBram Moolenaar  catch /some/
483f575adffSBram Moolenaar    seq ..= 'b'
484f575adffSBram Moolenaar  catch /asdf/
485f575adffSBram Moolenaar    seq ..= 'x'
486e8c4abbbSBram Moolenaar  catch ?a\?sdf?
487e8c4abbbSBram Moolenaar    seq ..= 'y'
488f575adffSBram Moolenaar  finally
489f575adffSBram Moolenaar    seq ..= 'c'
490f575adffSBram Moolenaar  endtry
491f575adffSBram Moolenaar  assert_equal('abc', seq)
492257cc5eeSBram Moolenaarenddef
493257cc5eeSBram Moolenaar
494e8c4abbbSBram Moolenaardef Test_try_catch_fails()
495e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
496e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
497e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
498*585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
499*585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
500*585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
501*585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
502*585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
503*585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
504*585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
505*585fea7bSBram Moolenaar
506*585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
507*585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
508e8c4abbbSBram Moolenaarenddef
509e8c4abbbSBram Moolenaar
5108a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
5118a7d6542SBram Moolenaar  vim9script
5128a7d6542SBram Moolenaar  let name: string = 'bob'
5138a7d6542SBram Moolenaar  def Concat(arg: string): string
5148a7d6542SBram Moolenaar    return name .. arg
5158a7d6542SBram Moolenaar  enddef
5168a7d6542SBram Moolenaar  let g:result = Concat('bie')
5178a7d6542SBram Moolenaar  let g:localname = name
5188a7d6542SBram Moolenaar
5198a7d6542SBram Moolenaar  export const CONST = 1234
5208a7d6542SBram Moolenaar  export let exported = 9876
5216e587dcbSBram Moolenaar  export let exp_name = 'John'
5228a7d6542SBram Moolenaar  export def Exported(): string
5238a7d6542SBram Moolenaar    return 'Exported'
5248a7d6542SBram Moolenaar  enddef
5258a7d6542SBram MoolenaarEND
5268a7d6542SBram Moolenaar
5275269bd2aSBram Moolenaardef Test_vim9_import_export()
5288a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5298a7d6542SBram Moolenaar    vim9script
5308a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5318a7d6542SBram Moolenaar    g:imported = exported
5326e587dcbSBram Moolenaar    exported += 3
5336e587dcbSBram Moolenaar    g:imported_added = exported
5348a7d6542SBram Moolenaar    g:imported_func = Exported()
5356e587dcbSBram Moolenaar
5366e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5376e587dcbSBram Moolenaar    g:imported_name = exp_name
5386e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5396e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5405381c7a1SBram Moolenaar    g:imported_later = exported
5418a7d6542SBram Moolenaar  END
5428a7d6542SBram Moolenaar
5438a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5448a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5458a7d6542SBram Moolenaar
5468a7d6542SBram Moolenaar  source Ximport.vim
5478a7d6542SBram Moolenaar
5488a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5498a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5508a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5516e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5525381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5538a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5546e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5556e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5568a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5578a7d6542SBram Moolenaar
5588a7d6542SBram Moolenaar  unlet g:result
5598a7d6542SBram Moolenaar  unlet g:localname
5608a7d6542SBram Moolenaar  unlet g:imported
5616e587dcbSBram Moolenaar  unlet g:imported_added
5625381c7a1SBram Moolenaar  unlet g:imported_later
5638a7d6542SBram Moolenaar  unlet g:imported_func
5646e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5658a7d6542SBram Moolenaar  delete('Ximport.vim')
566f2d5c240SBram Moolenaar
5675381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5685381c7a1SBram Moolenaar    vim9script
5695381c7a1SBram Moolenaar    def ImportInDef()
5705381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5715381c7a1SBram Moolenaar      g:imported = exported
5725381c7a1SBram Moolenaar      exported += 7
5735381c7a1SBram Moolenaar      g:imported_added = exported
5745381c7a1SBram Moolenaar    enddef
5755381c7a1SBram Moolenaar    ImportInDef()
5765381c7a1SBram Moolenaar  END
5775381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5785381c7a1SBram Moolenaar  source Ximport2.vim
5795381c7a1SBram Moolenaar  " TODO: this should be 9879
5805381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5815381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5825381c7a1SBram Moolenaar  unlet g:imported
5835381c7a1SBram Moolenaar  unlet g:imported_added
5845381c7a1SBram Moolenaar  delete('Ximport2.vim')
5855381c7a1SBram Moolenaar
586f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
587f2d5c240SBram Moolenaar    vim9script
588f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
589f2d5c240SBram Moolenaar    def UseExport()
590f2d5c240SBram Moolenaar      g:imported = Export.exported
591f2d5c240SBram Moolenaar    enddef
592f2d5c240SBram Moolenaar    UseExport()
593f2d5c240SBram Moolenaar  END
594f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
595f2d5c240SBram Moolenaar  source Ximport.vim
5965381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
597f2d5c240SBram Moolenaar
598599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
599599c89c8SBram Moolenaar    vim9script
600599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
601599c89c8SBram Moolenaar    def Func()
602599c89c8SBram Moolenaar      let dummy = 1
603599c89c8SBram Moolenaar      let imported = Export + dummy
604599c89c8SBram Moolenaar    enddef
605599c89c8SBram Moolenaar  END
606599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
607599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
608599c89c8SBram Moolenaar
609599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
610599c89c8SBram Moolenaar    vim9script
611599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
612599c89c8SBram Moolenaar    def Func()
613599c89c8SBram Moolenaar      let imported = Export . exported
614599c89c8SBram Moolenaar    enddef
615599c89c8SBram Moolenaar  END
616599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
617599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
618599c89c8SBram Moolenaar
619599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
620599c89c8SBram Moolenaar    vim9script
621599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
622599c89c8SBram Moolenaar    def Func()
623599c89c8SBram Moolenaar      let imported = Export.
624599c89c8SBram Moolenaar    enddef
625599c89c8SBram Moolenaar  END
626599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
627599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
628599c89c8SBram Moolenaar
629f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
630f2d5c240SBram Moolenaar    vim9script
631f2d5c240SBram Moolenaar    import * from './Xexport.vim'
632f2d5c240SBram Moolenaar    g:imported = exported
633f2d5c240SBram Moolenaar  END
634f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
635f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
636f2d5c240SBram Moolenaar
637fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
638fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
639fa29c8abSBram Moolenaar    vim9script
640fa29c8abSBram Moolenaar    import name from './Xexport.vim'
641fa29c8abSBram Moolenaar  END
642fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
643fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
644fa29c8abSBram Moolenaar
6455269bd2aSBram Moolenaar  " try to import something that is already defined
6465269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6475269bd2aSBram Moolenaar    vim9script
6485269bd2aSBram Moolenaar    let exported = 'something'
6495269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6505269bd2aSBram Moolenaar  END
6515269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6525269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6535269bd2aSBram Moolenaar
6545269bd2aSBram Moolenaar  " try to import something that is already defined
6555269bd2aSBram Moolenaar  import_already_defined =<< trim END
6565269bd2aSBram Moolenaar    vim9script
6575269bd2aSBram Moolenaar    let exported = 'something'
6585269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6595269bd2aSBram Moolenaar  END
6605269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6615269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6625269bd2aSBram Moolenaar
6635269bd2aSBram Moolenaar  " try to import something that is already defined
6645269bd2aSBram Moolenaar  import_already_defined =<< trim END
6655269bd2aSBram Moolenaar    vim9script
6665269bd2aSBram Moolenaar    let exported = 'something'
6675269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6685269bd2aSBram Moolenaar  END
6695269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6705269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6715269bd2aSBram Moolenaar
672fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
673fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
674fa29c8abSBram Moolenaar    vim9script
675fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
676fa29c8abSBram Moolenaar  END
677fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
678fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
679fa29c8abSBram Moolenaar
680fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
681fa29c8abSBram Moolenaar    vim9script
682fa29c8abSBram Moolenaar    import name './Xexport.vim'
683fa29c8abSBram Moolenaar  END
684fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
685fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
686fa29c8abSBram Moolenaar
687fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
688fa29c8abSBram Moolenaar    vim9script
689fa29c8abSBram Moolenaar    import name from Xexport.vim
690fa29c8abSBram Moolenaar  END
691fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
692fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
693fa29c8abSBram Moolenaar
694fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
695fa29c8abSBram Moolenaar    vim9script
696fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
697fa29c8abSBram Moolenaar  END
698fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
699fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
700fa29c8abSBram Moolenaar
701fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
702fa29c8abSBram Moolenaar    vim9script
703fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
704fa29c8abSBram Moolenaar  END
7055269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
7065269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
707fa29c8abSBram Moolenaar
708f2d5c240SBram Moolenaar  delete('Ximport.vim')
7095269bd2aSBram Moolenaar  delete('Ximport3.vim')
7108a7d6542SBram Moolenaar  delete('Xexport.vim')
7118a7d6542SBram Moolenaar
712750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
713750802b5SBram Moolenaar  set cpo&vi
714750802b5SBram Moolenaar  let cpo_before = &cpo
715750802b5SBram Moolenaar  let lines =<< trim END
716750802b5SBram Moolenaar    vim9script
717750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
718750802b5SBram Moolenaar  END
719750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
720750802b5SBram Moolenaar  source Xvim9_script
721750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
722750802b5SBram Moolenaar  set cpo&vim
723750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
724750802b5SBram Moolenaar  delete('Xvim9_script')
725750802b5SBram Moolenaarenddef
726750802b5SBram Moolenaar
727750802b5SBram Moolenaardef Test_vim9script_fails()
7288a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7298a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
730750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
731f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
732750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
733750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
734750802b5SBram Moolenaar
735750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
736750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
7378a7d6542SBram Moolenaarenddef
7388a7d6542SBram Moolenaar
7398a7d6542SBram Moolenaardef Test_vim9script_call()
7408a7d6542SBram Moolenaar  let lines =<< trim END
7418a7d6542SBram Moolenaar    vim9script
7428a7d6542SBram Moolenaar    let var = ''
7438a7d6542SBram Moolenaar    def MyFunc(arg: string)
7448a7d6542SBram Moolenaar       var = arg
7458a7d6542SBram Moolenaar    enddef
7468a7d6542SBram Moolenaar    MyFunc('foobar')
7478a7d6542SBram Moolenaar    assert_equal('foobar', var)
7488a7d6542SBram Moolenaar
7498a7d6542SBram Moolenaar    let str = 'barfoo'
7508a7d6542SBram Moolenaar    str->MyFunc()
7518a7d6542SBram Moolenaar    assert_equal('barfoo', var)
7528a7d6542SBram Moolenaar
7538a7d6542SBram Moolenaar    let g:value = 'value'
7548a7d6542SBram Moolenaar    g:value->MyFunc()
7558a7d6542SBram Moolenaar    assert_equal('value', var)
7568a7d6542SBram Moolenaar
7578a7d6542SBram Moolenaar    let listvar = []
7588a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
7598a7d6542SBram Moolenaar       listvar = arg
7608a7d6542SBram Moolenaar    enddef
7618a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
7628a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
7638a7d6542SBram Moolenaar
7648a7d6542SBram Moolenaar    let dictvar = {}
7658a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
7668a7d6542SBram Moolenaar       dictvar = arg
7678a7d6542SBram Moolenaar    enddef
7688a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
7698a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
77033fa29cfSBram Moolenaar    def CompiledDict()
77133fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
77233fa29cfSBram Moolenaar    enddef
77333fa29cfSBram Moolenaar    CompiledDict()
77433fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
77533fa29cfSBram Moolenaar
7768a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
7778a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
7780c6ceaf9SBram Moolenaar
7790c6ceaf9SBram Moolenaar    ('text')->MyFunc()
7800c6ceaf9SBram Moolenaar    assert_equal('text', var)
7810c6ceaf9SBram Moolenaar    ("some")->MyFunc()
7820c6ceaf9SBram Moolenaar    assert_equal('some', var)
7838a7d6542SBram Moolenaar  END
7848a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
7858a7d6542SBram Moolenaar  source Xcall.vim
7868a7d6542SBram Moolenaar  delete('Xcall.vim')
7878a7d6542SBram Moolenaarenddef
7888a7d6542SBram Moolenaar
7898a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
7908a7d6542SBram Moolenaar  let lines =<< trim END
7918a7d6542SBram Moolenaar    vim9script
7928a7d6542SBram Moolenaar    let var = ''
7938a7d6542SBram Moolenaar    def MyFunc(arg: string)
7948a7d6542SBram Moolenaar       let var = 123
7958a7d6542SBram Moolenaar    enddef
7968a7d6542SBram Moolenaar  END
7978a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
7988a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
7998a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
8008a7d6542SBram Moolenaarenddef
8018a7d6542SBram Moolenaar
8028a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
8038a7d6542SBram Moolenaar  let lines =<< trim END
8048a7d6542SBram Moolenaar    vim9script
8058a7d6542SBram Moolenaar    const var = ''
8068a7d6542SBram Moolenaar    def MyFunc(arg: string)
8078a7d6542SBram Moolenaar       var = 'asdf'
8088a7d6542SBram Moolenaar    enddef
8098a7d6542SBram Moolenaar  END
8108a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
8118a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
8128a7d6542SBram Moolenaar  delete('Xcall_const.vim')
8138a7d6542SBram Moolenaarenddef
8148a7d6542SBram Moolenaar
8158a7d6542SBram Moolenaardef Test_vim9script_reload()
8168a7d6542SBram Moolenaar  let lines =<< trim END
8178a7d6542SBram Moolenaar    vim9script
8188a7d6542SBram Moolenaar    const var = ''
8198a7d6542SBram Moolenaar    let valone = 1234
8208a7d6542SBram Moolenaar    def MyFunc(arg: string)
8218a7d6542SBram Moolenaar       valone = 5678
8228a7d6542SBram Moolenaar    enddef
8238a7d6542SBram Moolenaar  END
8248a7d6542SBram Moolenaar  let morelines =<< trim END
8258a7d6542SBram Moolenaar    let valtwo = 222
8268a7d6542SBram Moolenaar    export def GetValtwo(): number
8278a7d6542SBram Moolenaar      return valtwo
8288a7d6542SBram Moolenaar    enddef
8298a7d6542SBram Moolenaar  END
8308a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
8318a7d6542SBram Moolenaar  source Xreload.vim
8328a7d6542SBram Moolenaar  source Xreload.vim
8338a7d6542SBram Moolenaar  source Xreload.vim
8348a7d6542SBram Moolenaar
8358a7d6542SBram Moolenaar  let testlines =<< trim END
8368a7d6542SBram Moolenaar    vim9script
8378a7d6542SBram Moolenaar    def TheFunc()
8388a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8398a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8408a7d6542SBram Moolenaar    enddef
8418a7d6542SBram Moolenaar    TheFunc()
8428a7d6542SBram Moolenaar  END
8438a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8448a7d6542SBram Moolenaar  source Ximport.vim
8458a7d6542SBram Moolenaar
8468a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
8478a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
8488a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8498a7d6542SBram Moolenaar  source Xreload.vim
8508a7d6542SBram Moolenaar  source Ximport.vim
8518a7d6542SBram Moolenaar
8528a7d6542SBram Moolenaar  " cannot declare a var twice
8538a7d6542SBram Moolenaar  lines =<< trim END
8548a7d6542SBram Moolenaar    vim9script
8558a7d6542SBram Moolenaar    let valone = 1234
8568a7d6542SBram Moolenaar    let valone = 5678
8578a7d6542SBram Moolenaar  END
8588a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8598a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8608a7d6542SBram Moolenaar
8618a7d6542SBram Moolenaar  delete('Xreload.vim')
8628a7d6542SBram Moolenaar  delete('Ximport.vim')
8638a7d6542SBram Moolenaarenddef
8648a7d6542SBram Moolenaar
8658a7d6542SBram Moolenaardef Test_import_absolute()
8668a7d6542SBram Moolenaar  let import_lines = [
8678a7d6542SBram Moolenaar        \ 'vim9script',
8688a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
869b283a8a6SBram Moolenaar        \ 'def UseExported()',
8708a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
8714e12a5dfSBram Moolenaar        \ '  exported = 8888',
8724e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
873b283a8a6SBram Moolenaar        \ 'enddef',
874b283a8a6SBram Moolenaar        \ 'UseExported()',
8754e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
8768a7d6542SBram Moolenaar        \ ]
8778a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8788a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8798a7d6542SBram Moolenaar
8808a7d6542SBram Moolenaar  source Ximport_abs.vim
8818a7d6542SBram Moolenaar
8828a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8834e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
884b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
885b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
886b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8874e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
8884e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
8894e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
8904e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
8914e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8924e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
8934e12a5dfSBram Moolenaar        \, g:import_disassembled)
8948a7d6542SBram Moolenaar  unlet g:imported_abs
8954e12a5dfSBram Moolenaar  unlet g:import_disassembled
8968a7d6542SBram Moolenaar
8978a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8988a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8998a7d6542SBram Moolenaarenddef
9008a7d6542SBram Moolenaar
9018a7d6542SBram Moolenaardef Test_import_rtp()
9028a7d6542SBram Moolenaar  let import_lines = [
9038a7d6542SBram Moolenaar        \ 'vim9script',
9048a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
9058a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
9068a7d6542SBram Moolenaar        \ ]
9078a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
9088a7d6542SBram Moolenaar  mkdir('import')
9098a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
9108a7d6542SBram Moolenaar
9118a7d6542SBram Moolenaar  let save_rtp = &rtp
9128a7d6542SBram Moolenaar  &rtp = getcwd()
9138a7d6542SBram Moolenaar  source Ximport_rtp.vim
9148a7d6542SBram Moolenaar  &rtp = save_rtp
9158a7d6542SBram Moolenaar
9168a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
9178a7d6542SBram Moolenaar  unlet g:imported_rtp
9188a7d6542SBram Moolenaar
9198a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
9208a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
9218a7d6542SBram Moolenaar  delete('import', 'd')
9228a7d6542SBram Moolenaarenddef
9238a7d6542SBram Moolenaar
9248a7d6542SBram Moolenaardef Test_fixed_size_list()
9258a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
9268a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
9278a7d6542SBram Moolenaar  l->remove(0)
9288a7d6542SBram Moolenaar  l->add(5)
9298a7d6542SBram Moolenaar  l->insert(99, 1)
9300f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
9318a7d6542SBram Moolenaarenddef
9328a7d6542SBram Moolenaar
933673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
934673660abSBram Moolenaar" recognized.
935673660abSBram Moolenaarfunc Test_function_python()
936673660abSBram Moolenaar  CheckFeature python3
937673660abSBram Moolenaar  let py = 'python3'
938673660abSBram Moolenaar  execute py "<< EOF"
939673660abSBram Moolenaardef do_something():
940673660abSBram Moolenaar  return 1
941673660abSBram MoolenaarEOF
942673660abSBram Moolenaarendfunc
943673660abSBram Moolenaar
944158906cfSBram Moolenaardef IfElse(what: number): string
945158906cfSBram Moolenaar  let res = ''
946158906cfSBram Moolenaar  if what == 1
947158906cfSBram Moolenaar    res = "one"
948158906cfSBram Moolenaar  elseif what == 2
949158906cfSBram Moolenaar    res = "two"
950a259d8d3SBram Moolenaar  else
951158906cfSBram Moolenaar    res = "three"
952a259d8d3SBram Moolenaar  endif
953158906cfSBram Moolenaar  return res
954a259d8d3SBram Moolenaarenddef
955a259d8d3SBram Moolenaar
956158906cfSBram Moolenaardef Test_if_elseif_else()
957158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
958158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
959158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
9600f18b6d1SBram Moolenaarenddef
9610f18b6d1SBram Moolenaar
962e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
963e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
964e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
965e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
966e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
967*585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
968e8c4abbbSBram Moolenaarenddef
969e8c4abbbSBram Moolenaar
9706d69bf60SBram Moolenaarlet g:bool_true = v:true
9716d69bf60SBram Moolenaarlet g:bool_false = v:false
9726d69bf60SBram Moolenaar
9736d69bf60SBram Moolenaardef Test_if_const_expr()
9746d69bf60SBram Moolenaar  let res = false
9756d69bf60SBram Moolenaar  if true ? true : false
9766d69bf60SBram Moolenaar    res = true
9776d69bf60SBram Moolenaar  endif
9786d69bf60SBram Moolenaar  assert_equal(true, res)
9796d69bf60SBram Moolenaar
980*585fea7bSBram Moolenaar  g:glob = 2
981*585fea7bSBram Moolenaar  if false
982*585fea7bSBram Moolenaar    execute('let g:glob = 3')
983*585fea7bSBram Moolenaar  endif
984*585fea7bSBram Moolenaar  assert_equal(2, g:glob)
985*585fea7bSBram Moolenaar  if true
986*585fea7bSBram Moolenaar    execute('let g:glob = 3')
987*585fea7bSBram Moolenaar  endif
988*585fea7bSBram Moolenaar  assert_equal(3, g:glob)
989*585fea7bSBram Moolenaar
9906d69bf60SBram Moolenaar  res = false
9916d69bf60SBram Moolenaar  if g:bool_true ? true : false
9926d69bf60SBram Moolenaar    res = true
9936d69bf60SBram Moolenaar  endif
9946d69bf60SBram Moolenaar  assert_equal(true, res)
9956d69bf60SBram Moolenaar
9966d69bf60SBram Moolenaar  res = false
9976d69bf60SBram Moolenaar  if true ? g:bool_true : false
9986d69bf60SBram Moolenaar    res = true
9996d69bf60SBram Moolenaar  endif
10006d69bf60SBram Moolenaar  assert_equal(true, res)
10016d69bf60SBram Moolenaar
10026d69bf60SBram Moolenaar  res = false
10036d69bf60SBram Moolenaar  if true ? true : g:bool_false
10046d69bf60SBram Moolenaar    res = true
10056d69bf60SBram Moolenaar  endif
10066d69bf60SBram Moolenaar  assert_equal(true, res)
10076d69bf60SBram Moolenaar
10086d69bf60SBram Moolenaar  res = false
10096d69bf60SBram Moolenaar  if true ? false : true
10106d69bf60SBram Moolenaar    res = true
10116d69bf60SBram Moolenaar  endif
10126d69bf60SBram Moolenaar  assert_equal(false, res)
10136d69bf60SBram Moolenaar
10146d69bf60SBram Moolenaar  res = false
10156d69bf60SBram Moolenaar  if false ? false : true
10166d69bf60SBram Moolenaar    res = true
10176d69bf60SBram Moolenaar  endif
10186d69bf60SBram Moolenaar  assert_equal(true, res)
10196d69bf60SBram Moolenaar
10206d69bf60SBram Moolenaar  res = false
10216d69bf60SBram Moolenaar  if false ? true : false
10226d69bf60SBram Moolenaar    res = true
10236d69bf60SBram Moolenaar  endif
10246d69bf60SBram Moolenaar  assert_equal(false, res)
10256d69bf60SBram Moolenaar
10266d69bf60SBram Moolenaar  res = false
1027e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1028e8c4abbbSBram Moolenaar    res = true
1029e8c4abbbSBram Moolenaar  endif
1030e8c4abbbSBram Moolenaar  assert_equal(false, res)
1031e8c4abbbSBram Moolenaar
1032e8c4abbbSBram Moolenaar  res = false
10336d69bf60SBram Moolenaar  if true && true
10346d69bf60SBram Moolenaar    res = true
10356d69bf60SBram Moolenaar  endif
10366d69bf60SBram Moolenaar  assert_equal(true, res)
10376d69bf60SBram Moolenaar
10386d69bf60SBram Moolenaar  res = false
10396d69bf60SBram Moolenaar  if true && false
10406d69bf60SBram Moolenaar    res = true
10416d69bf60SBram Moolenaar  endif
10426d69bf60SBram Moolenaar  assert_equal(false, res)
10436d69bf60SBram Moolenaar
10446d69bf60SBram Moolenaar  res = false
10456d69bf60SBram Moolenaar  if g:bool_true && false
10466d69bf60SBram Moolenaar    res = true
10476d69bf60SBram Moolenaar  endif
10486d69bf60SBram Moolenaar  assert_equal(false, res)
10496d69bf60SBram Moolenaar
10506d69bf60SBram Moolenaar  res = false
10516d69bf60SBram Moolenaar  if true && g:bool_false
10526d69bf60SBram Moolenaar    res = true
10536d69bf60SBram Moolenaar  endif
10546d69bf60SBram Moolenaar  assert_equal(false, res)
10556d69bf60SBram Moolenaar
10566d69bf60SBram Moolenaar  res = false
10576d69bf60SBram Moolenaar  if false && false
10586d69bf60SBram Moolenaar    res = true
10596d69bf60SBram Moolenaar  endif
10606d69bf60SBram Moolenaar  assert_equal(false, res)
10616d69bf60SBram Moolenaar
10626d69bf60SBram Moolenaar  res = false
10636d69bf60SBram Moolenaar  if true || false
10646d69bf60SBram Moolenaar    res = true
10656d69bf60SBram Moolenaar  endif
10666d69bf60SBram Moolenaar  assert_equal(true, res)
10676d69bf60SBram Moolenaar
10686d69bf60SBram Moolenaar  res = false
10696d69bf60SBram Moolenaar  if g:bool_true || false
10706d69bf60SBram Moolenaar    res = true
10716d69bf60SBram Moolenaar  endif
10726d69bf60SBram Moolenaar  assert_equal(true, res)
10736d69bf60SBram Moolenaar
10746d69bf60SBram Moolenaar  res = false
10756d69bf60SBram Moolenaar  if true || g:bool_false
10766d69bf60SBram Moolenaar    res = true
10776d69bf60SBram Moolenaar  endif
10786d69bf60SBram Moolenaar  assert_equal(true, res)
10796d69bf60SBram Moolenaar
10806d69bf60SBram Moolenaar  res = false
10816d69bf60SBram Moolenaar  if false || false
10826d69bf60SBram Moolenaar    res = true
10836d69bf60SBram Moolenaar  endif
10846d69bf60SBram Moolenaar  assert_equal(false, res)
108580c34ca3SBram Moolenaarenddef
10866d69bf60SBram Moolenaar
108780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
108880c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
108980c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1090e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1091e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
10926d69bf60SBram Moolenaarenddef
10936d69bf60SBram Moolenaar
109463ce4849SBram Moolenaardef Test_delfunc()
109563ce4849SBram Moolenaar  let lines =<< trim END
109663ce4849SBram Moolenaar    vim9script
109763ce4849SBram Moolenaar    def GoneSoon()
109863ce4849SBram Moolenaar      echo 'hello'
109963ce4849SBram Moolenaar    enddef
110063ce4849SBram Moolenaar
110163ce4849SBram Moolenaar    def CallGoneSoon()
110263ce4849SBram Moolenaar      GoneSoon()
110363ce4849SBram Moolenaar    enddef
110463ce4849SBram Moolenaar
110563ce4849SBram Moolenaar    delfunc GoneSoon
110663ce4849SBram Moolenaar    CallGoneSoon()
110763ce4849SBram Moolenaar  END
110863ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
110963ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
111063ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
111163ce4849SBram Moolenaar
111263ce4849SBram Moolenaar  delete('XToDelFunc')
111363ce4849SBram Moolenaarenddef
111463ce4849SBram Moolenaar
1115ad39c094SBram Moolenaardef Test_execute_cmd()
1116ad39c094SBram Moolenaar  new
1117ad39c094SBram Moolenaar  setline(1, 'default')
1118ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1119ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1120ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1121ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1122ad39c094SBram Moolenaar  execute cmd1 cmd2
1123ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1124ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1125ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1126ad39c094SBram Moolenaar  let cmd_first = 'call '
1127ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1128ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1129ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1130ad39c094SBram Moolenaar  bwipe!
1131*585fea7bSBram Moolenaar
1132*585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1133ad39c094SBram Moolenaarenddef
1134ad39c094SBram Moolenaar
1135ad39c094SBram Moolenaardef Test_echo_cmd()
1136*585fea7bSBram Moolenaar  echo 'some'
1137*585fea7bSBram Moolenaar  echon 'thing'
1138ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1139ad39c094SBram Moolenaar
1140ad39c094SBram Moolenaar  let str1 = 'some'
1141ad39c094SBram Moolenaar  let str2 = 'more'
1142ad39c094SBram Moolenaar  echo str1 str2
1143ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1144ad39c094SBram Moolenaarenddef
1145ad39c094SBram Moolenaar
114641fe0617SBram Moolenaardef Test_for_outside_of_function()
114741fe0617SBram Moolenaar  let lines =<< trim END
114841fe0617SBram Moolenaar    vim9script
114941fe0617SBram Moolenaar    new
115041fe0617SBram Moolenaar    for var in range(0, 3)
115141fe0617SBram Moolenaar      append(line('$'), var)
115241fe0617SBram Moolenaar    endfor
115341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
115441fe0617SBram Moolenaar    bwipe!
115541fe0617SBram Moolenaar  END
115641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
115741fe0617SBram Moolenaar  source Xvim9for.vim
115841fe0617SBram Moolenaar  delete('Xvim9for.vim')
115941fe0617SBram Moolenaarenddef
11608a7d6542SBram Moolenaar
1161e8c4abbbSBram Moolenaardef Test_for_loop()
1162e8c4abbbSBram Moolenaar  let result = ''
1163e8c4abbbSBram Moolenaar  for cnt in range(7)
1164e8c4abbbSBram Moolenaar    if cnt == 4
1165e8c4abbbSBram Moolenaar      break
1166e8c4abbbSBram Moolenaar    endif
1167e8c4abbbSBram Moolenaar    if cnt == 2
1168e8c4abbbSBram Moolenaar      continue
1169e8c4abbbSBram Moolenaar    endif
1170e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1171e8c4abbbSBram Moolenaar  endfor
1172e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1173e8c4abbbSBram Moolenaarenddef
1174e8c4abbbSBram Moolenaar
1175e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1176e8c4abbbSBram Moolenaar  call CheckDefFailure(['for # in range(5)'], 'E690:')
1177e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i In range(5)'], 'E690:')
1178e8c4abbbSBram Moolenaar  call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1179e8c4abbbSBram Moolenaar  call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1180e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in "text"'], 'E1024:')
1181e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in xxx'], 'E1001:')
1182e8c4abbbSBram Moolenaar  call CheckDefFailure(['endfor'], 'E588:')
1183*585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1184e8c4abbbSBram Moolenaarenddef
1185e8c4abbbSBram Moolenaar
1186d0df1aacSBram Moolenaardef Test_while_loop()
1187d0df1aacSBram Moolenaar  let result = ''
1188d0df1aacSBram Moolenaar  let cnt = 0
1189d0df1aacSBram Moolenaar  while cnt < 555
1190d0df1aacSBram Moolenaar    if cnt == 3
1191d0df1aacSBram Moolenaar      break
1192d0df1aacSBram Moolenaar    endif
1193d0df1aacSBram Moolenaar    cnt += 1
1194d0df1aacSBram Moolenaar    if cnt == 2
1195d0df1aacSBram Moolenaar      continue
1196d0df1aacSBram Moolenaar    endif
1197d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1198d0df1aacSBram Moolenaar  endwhile
1199d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1200d0df1aacSBram Moolenaarenddef
1201d0df1aacSBram Moolenaar
1202e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1203e8c4abbbSBram Moolenaar  call CheckDefFailure(['while xxx'], 'E1001:')
1204e8c4abbbSBram Moolenaar  call CheckDefFailure(['endwhile'], 'E588:')
1205e8c4abbbSBram Moolenaar  call CheckDefFailure(['continue'], 'E586:')
1206e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'continue'], 'E586:')
1207e8c4abbbSBram Moolenaar  call CheckDefFailure(['break'], 'E587:')
1208e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'break'], 'E587:')
1209*585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1210bd5da371SBram Moolenaarenddef
1211bd5da371SBram Moolenaar
12129645e2d9SBram Moolenaardef Test_interrupt_loop()
121397acfc78SBram Moolenaar  let caught = false
12149645e2d9SBram Moolenaar  let x = 0
121597acfc78SBram Moolenaar  try
12169645e2d9SBram Moolenaar    while 1
12179645e2d9SBram Moolenaar      x += 1
12189645e2d9SBram Moolenaar      if x == 100
12199645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
12209645e2d9SBram Moolenaar      endif
12219645e2d9SBram Moolenaar    endwhile
122297acfc78SBram Moolenaar  catch
122397acfc78SBram Moolenaar    caught = true
122497acfc78SBram Moolenaar    assert_equal(100, x)
122597acfc78SBram Moolenaar  endtry
122697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
12279645e2d9SBram Moolenaarenddef
122820431c9dSBram Moolenaar
122920431c9dSBram Moolenaardef Test_redef_failure()
123020431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
123120431c9dSBram Moolenaar  so Xdef
123220431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
123320431c9dSBram Moolenaar  so Xdef
123420431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
123520431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
123620431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
123720431c9dSBram Moolenaar  so Xdef
123820431c9dSBram Moolenaar  call delete('Xdef')
123920431c9dSBram Moolenaar
124020431c9dSBram Moolenaar  call assert_equal(0, Func0())
124120431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
124220431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
124320431c9dSBram Moolenaar
124420431c9dSBram Moolenaar  delfunc! Func0
124520431c9dSBram Moolenaar  delfunc! Func1
124620431c9dSBram Moolenaar  delfunc! Func2
124720431c9dSBram Moolenaarenddef
124820431c9dSBram Moolenaar
12497d941ee0SBram Moolenaar" Test for internal functions returning different types
12507d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
12517d941ee0SBram Moolenaar  let lines =<< trim END
12527d941ee0SBram Moolenaar    def RetFloat(): float
12537d941ee0SBram Moolenaar      return ceil(1.456)
12547d941ee0SBram Moolenaar    enddef
12557d941ee0SBram Moolenaar
12567d941ee0SBram Moolenaar    def RetListAny(): list<any>
12577d941ee0SBram Moolenaar      return items({'k' : 'v'})
12587d941ee0SBram Moolenaar    enddef
12597d941ee0SBram Moolenaar
12607d941ee0SBram Moolenaar    def RetListString(): list<string>
12617d941ee0SBram Moolenaar      return split('a:b:c', ':')
12627d941ee0SBram Moolenaar    enddef
12637d941ee0SBram Moolenaar
12647d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
12657d941ee0SBram Moolenaar      return getbufinfo()
12667d941ee0SBram Moolenaar    enddef
12677d941ee0SBram Moolenaar
12687d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
12697d941ee0SBram Moolenaar      return wordcount()
12707d941ee0SBram Moolenaar    enddef
12717d941ee0SBram Moolenaar
12727d941ee0SBram Moolenaar    def RetDictString(): dict<string>
12737d941ee0SBram Moolenaar      return environ()
12747d941ee0SBram Moolenaar    enddef
12757d941ee0SBram Moolenaar  END
12767d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
12777d941ee0SBram Moolenaar  source Xscript
12787d941ee0SBram Moolenaar
12797d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
12807d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
12817d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
12827d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
12837d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
12847d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
12857d941ee0SBram Moolenaar  call delete('Xscript')
12867d941ee0SBram Moolenaarendfunc
12877d941ee0SBram Moolenaar
12887d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
12897d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
12907d941ee0SBram Moolenaar  let l =<< trim END
12917d941ee0SBram Moolenaar    def! FArgErr(): float
12927d941ee0SBram Moolenaar      return ceil(1.1, 2)
12937d941ee0SBram Moolenaar    enddef
12947d941ee0SBram Moolenaar  END
12957d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12967d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
12977d941ee0SBram Moolenaar  let l =<< trim END
12987d941ee0SBram Moolenaar    def! FArgErr(): float
12997d941ee0SBram Moolenaar      return ceil()
13007d941ee0SBram Moolenaar    enddef
13017d941ee0SBram Moolenaar  END
13027d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
13037d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
13047d941ee0SBram Moolenaar  call delete('Xinvalidarg')
13057d941ee0SBram Moolenaarendfunc
13067d941ee0SBram Moolenaar
1307*585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1308*585fea7bSBram Moolenaardef Test_substitute_cmd()
1309*585fea7bSBram Moolenaar  new
1310*585fea7bSBram Moolenaar  setline(1, 'something')
1311*585fea7bSBram Moolenaar  :substitute(some(other(
1312*585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1313*585fea7bSBram Moolenaar  bwipe!
1314*585fea7bSBram Moolenaar
1315*585fea7bSBram Moolenaar  " also when the context is Vim9 script
1316*585fea7bSBram Moolenaar  let lines =<< trim END
1317*585fea7bSBram Moolenaar    vim9script
1318*585fea7bSBram Moolenaar    new
1319*585fea7bSBram Moolenaar    setline(1, 'something')
1320*585fea7bSBram Moolenaar    :substitute(some(other(
1321*585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1322*585fea7bSBram Moolenaar    bwipe!
1323*585fea7bSBram Moolenaar  END
1324*585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1325*585fea7bSBram Moolenaar  source Xvim9lines
1326*585fea7bSBram Moolenaar
1327*585fea7bSBram Moolenaar  delete('Xvim9lines')
1328*585fea7bSBram Moolenaarenddef
1329*585fea7bSBram Moolenaar
13308a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1331