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')
71*d77a8525SBram Moolenaar  let party2: func = funcref('Test_syntax')
7242a480bfSBram Moolenaar
7361a6d4e4SBram Moolenaar  " type becomes list<any>
7461a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
755381c7a1SBram Moolenaar  " type becomes dict<any>
765381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7761a6d4e4SBram Moolenaar
78401d9ffbSBram Moolenaar  g:newvar = 'new'
79401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
80401d9ffbSBram Moolenaar
81401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
82401d9ffbSBram Moolenaar  g:existing = 'no'
83401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
84401d9ffbSBram Moolenaar
85b283a8a6SBram Moolenaar  v:char = 'abc'
866e587dcbSBram Moolenaar  assert_equal('abc', v:char)
87b283a8a6SBram Moolenaar
88b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
896e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
90b283a8a6SBram Moolenaar  $ENVVAR = ''
916e587dcbSBram Moolenaar
92fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
93fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
94fd1823e0SBram Moolenaar  s:addToMe += 222
95fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
960bbf722aSBram Moolenaar  s:newVar = 'new'
970bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
98a8c17704SBram Moolenaar
99a8c17704SBram Moolenaar  set ts=7
100a8c17704SBram Moolenaar  &ts += 1
101a8c17704SBram Moolenaar  assert_equal(8, &ts)
10280c34ca3SBram Moolenaar  &ts -= 3
10380c34ca3SBram Moolenaar  assert_equal(5, &ts)
10480c34ca3SBram Moolenaar  &ts *= 2
10580c34ca3SBram Moolenaar  assert_equal(10, &ts)
10680c34ca3SBram Moolenaar  &ts /= 3
10780c34ca3SBram Moolenaar  assert_equal(3, &ts)
10880c34ca3SBram Moolenaar  set ts=10
10980c34ca3SBram Moolenaar  &ts %= 4
11080c34ca3SBram Moolenaar  assert_equal(2, &ts)
111a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
112a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
113a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
114585fea7bSBram Moolenaar  " test freeing ISN_STOREOPT
115585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11680c34ca3SBram Moolenaar  &ts = 8
117a8c17704SBram Moolenaar
118a8c17704SBram Moolenaar  g:inc_counter += 1
119a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
120a8c17704SBram Moolenaar
121a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
122a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
123a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
124a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
125a8c17704SBram Moolenaar
126a8c17704SBram Moolenaar  @a = 'areg'
127a8c17704SBram Moolenaar  @a ..= 'add'
128a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
129a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
130a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
131e69f6d04SBram Moolenaar
132e69f6d04SBram Moolenaar  v:errmsg = 'none'
133e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
134e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
135e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
136e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
137e69f6d04SBram Moolenaar
138e69f6d04SBram Moolenaar  " Test default values.
139e69f6d04SBram Moolenaar  let thebool: bool
140e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
141e69f6d04SBram Moolenaar
142e69f6d04SBram Moolenaar  let thenumber: number
143e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
144e69f6d04SBram Moolenaar
145e69f6d04SBram Moolenaar  if has('float')
146e69f6d04SBram Moolenaar    let thefloat: float
147e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
148e69f6d04SBram Moolenaar  endif
149e69f6d04SBram Moolenaar
150e69f6d04SBram Moolenaar  let thestring: string
151e69f6d04SBram Moolenaar  assert_equal('', thestring)
152e69f6d04SBram Moolenaar
153e69f6d04SBram Moolenaar  let theblob: blob
154e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
155e69f6d04SBram Moolenaar
156e69f6d04SBram Moolenaar  let thefunc: func
157e69f6d04SBram Moolenaar  assert_equal(test_null_function(), thefunc)
158e69f6d04SBram Moolenaar
159e69f6d04SBram Moolenaar  let thelist: list<any>
160e69f6d04SBram Moolenaar  assert_equal([], thelist)
161e69f6d04SBram Moolenaar
162e69f6d04SBram Moolenaar  let thedict: dict<any>
163e69f6d04SBram Moolenaar  assert_equal({}, thedict)
164e69f6d04SBram Moolenaar
1652c869deeSBram Moolenaar  if has('channel')
166e69f6d04SBram Moolenaar    let thejob: job
167e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
168e69f6d04SBram Moolenaar
169e69f6d04SBram Moolenaar    let thechannel: channel
170e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
1712c869deeSBram Moolenaar  endif
172585fea7bSBram Moolenaar
173585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
174585fea7bSBram Moolenaar  assert_equal(5678, nr)
1758a7d6542SBram Moolenaarenddef
1768a7d6542SBram Moolenaar
1778a7d6542SBram Moolenaarfunc Test_assignment_failure()
1788a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1798a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1808a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1818a7d6542SBram Moolenaar
1828a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1838a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1848a7d6542SBram Moolenaar
1859be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1869be61bbbSBram Moolenaar
187e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1889be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1899be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1909be61bbbSBram Moolenaar
1919be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1929be61bbbSBram Moolenaar
1939be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1949be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1959be61bbbSBram Moolenaar
1969be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
1979be61bbbSBram Moolenaar
1989be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
1999be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2009be61bbbSBram Moolenaar
20133fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
20233fa29cfSBram Moolenaar
2038a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2048a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2058a7d6542SBram Moolenaar
2068a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2078a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2088a7d6542SBram Moolenaar
2098a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2108a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
21142a480bfSBram Moolenaar
212*d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
21342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
214599c89c8SBram Moolenaarendfunc
215599c89c8SBram Moolenaar
216599c89c8SBram Moolenaarfunc Test_wrong_type()
217599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
218599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
219599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
220599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
221599c89c8SBram Moolenaar
222599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
223599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
22442a480bfSBram Moolenaar
22542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
22642a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
22742a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
22842a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
22942a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
23042a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
23142a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
23242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
23342a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
23442a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
23542a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2368a7d6542SBram Moolenaarendfunc
2378a7d6542SBram Moolenaar
2388a7d6542SBram Moolenaarfunc Test_const()
2398a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2408a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2418a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2429be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2438a7d6542SBram Moolenaarendfunc
2448a7d6542SBram Moolenaar
2458a7d6542SBram Moolenaardef Test_block()
2468a7d6542SBram Moolenaar  let outer = 1
2478a7d6542SBram Moolenaar  {
2488a7d6542SBram Moolenaar    let inner = 2
2498a7d6542SBram Moolenaar    assert_equal(1, outer)
2508a7d6542SBram Moolenaar    assert_equal(2, inner)
2518a7d6542SBram Moolenaar  }
2528a7d6542SBram Moolenaar  assert_equal(1, outer)
2538a7d6542SBram Moolenaarenddef
2548a7d6542SBram Moolenaar
2558a7d6542SBram Moolenaarfunc Test_block_failure()
2568a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
257585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
258585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
2598a7d6542SBram Moolenaarendfunc
2608a7d6542SBram Moolenaar
261585fea7bSBram Moolenaardef Test_cmd_modifier()
262585fea7bSBram Moolenaar  tab echo '0'
263585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
264585fea7bSBram Moolenaarenddef
265585fea7bSBram Moolenaar
266585fea7bSBram Moolenaar
2678a7d6542SBram Moolenaardef ReturnString(): string
2688a7d6542SBram Moolenaar  return 'string'
2698a7d6542SBram Moolenaarenddef
2708a7d6542SBram Moolenaar
2718a7d6542SBram Moolenaardef ReturnNumber(): number
2728a7d6542SBram Moolenaar  return 123
2738a7d6542SBram Moolenaarenddef
2748a7d6542SBram Moolenaar
27509f28f49SBram Moolenaarlet g:notNumber = 'string'
27609f28f49SBram Moolenaar
27709f28f49SBram Moolenaardef ReturnGlobal(): number
27809f28f49SBram Moolenaar  return g:notNumber
27909f28f49SBram Moolenaarenddef
28009f28f49SBram Moolenaar
2819be61bbbSBram Moolenaardef Test_return_something()
2828a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
2838a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
28409f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
2858a7d6542SBram Moolenaarenddef
2868a7d6542SBram Moolenaar
2879be61bbbSBram Moolenaarlet s:nothing = 0
2889be61bbbSBram Moolenaardef ReturnNothing()
2899be61bbbSBram Moolenaar  s:nothing = 1
2909be61bbbSBram Moolenaar  if true
2919be61bbbSBram Moolenaar    return
2929be61bbbSBram Moolenaar  endif
2939be61bbbSBram Moolenaar  s:nothing = 2
2949be61bbbSBram Moolenaarenddef
2959be61bbbSBram Moolenaar
2969be61bbbSBram Moolenaardef Test_return_nothing()
2979be61bbbSBram Moolenaar  ReturnNothing()
2989be61bbbSBram Moolenaar  assert_equal(1, s:nothing)
2999be61bbbSBram Moolenaarenddef
3009be61bbbSBram Moolenaar
3018a7d6542SBram Moolenaarfunc Increment()
3028a7d6542SBram Moolenaar  let g:counter += 1
3038a7d6542SBram Moolenaarendfunc
3048a7d6542SBram Moolenaar
3058a7d6542SBram Moolenaardef Test_call_ufunc_count()
3068a7d6542SBram Moolenaar  g:counter = 1
3078a7d6542SBram Moolenaar  Increment()
3088a7d6542SBram Moolenaar  Increment()
3098a7d6542SBram Moolenaar  Increment()
3108a7d6542SBram Moolenaar  " works with and without :call
3118a7d6542SBram Moolenaar  assert_equal(4, g:counter)
312b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
3138a7d6542SBram Moolenaar  unlet g:counter
3148a7d6542SBram Moolenaarenddef
3158a7d6542SBram Moolenaar
3168a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
3178a7d6542SBram Moolenaar  let res = arg
3188a7d6542SBram Moolenaar  for s in rest
3198a7d6542SBram Moolenaar    res ..= ',' .. s
3208a7d6542SBram Moolenaar  endfor
3218a7d6542SBram Moolenaar  return res
3228a7d6542SBram Moolenaarenddef
3238a7d6542SBram Moolenaar
3248a7d6542SBram Moolenaardef Test_call_varargs()
3258a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
3268a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
3278a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
3288a7d6542SBram Moolenaarenddef
3298a7d6542SBram Moolenaar
330170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
331170fcfcfSBram Moolenaar  return name
332170fcfcfSBram Moolenaarenddef
333170fcfcfSBram Moolenaar
334170fcfcfSBram Moolenaardef Test_call_default_args()
335170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
336170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
337170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
338585fea7bSBram Moolenaar
339585fea7bSBram Moolenaar  call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:')
340170fcfcfSBram Moolenaarenddef
341170fcfcfSBram Moolenaar
342170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
343170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
344170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
345170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
346170fcfcfSBram Moolenaarendfunc
347170fcfcfSBram Moolenaar
348b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
349b35efa5eSBram Moolenaar  echo a:arg
350b35efa5eSBram Moolenaarendfunc
351b35efa5eSBram Moolenaar
352bd5da371SBram Moolenaardef Test_call_wrong_args()
353b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
354b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
355bd5da371SBram Moolenaar  call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
356b35efa5eSBram Moolenaarenddef
357b35efa5eSBram Moolenaar
358170fcfcfSBram Moolenaar" Default arg and varargs
359170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
360170fcfcfSBram Moolenaar  let res = one .. ',' .. two
361170fcfcfSBram Moolenaar  for s in rest
362170fcfcfSBram Moolenaar    res ..= ',' .. s
363170fcfcfSBram Moolenaar  endfor
364170fcfcfSBram Moolenaar  return res
365170fcfcfSBram Moolenaarenddef
366170fcfcfSBram Moolenaar
367170fcfcfSBram Moolenaardef Test_call_def_varargs()
368170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
369170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
370170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
371170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
372170fcfcfSBram Moolenaarenddef
373170fcfcfSBram Moolenaar
37442a480bfSBram Moolenaardef Test_using_var_as_arg()
37542a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
37642a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
37742a480bfSBram Moolenaar  call delete('Xdef')
37842a480bfSBram Moolenaarenddef
37942a480bfSBram Moolenaar
380b35efa5eSBram Moolenaardef Test_call_func_defined_later()
381b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
382b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
383b35efa5eSBram Moolenaarenddef
384170fcfcfSBram Moolenaar
385b35efa5eSBram Moolenaarfunc DefinedLater(arg)
38626e117e9SBram Moolenaar  return a:arg
38726e117e9SBram Moolenaarendfunc
38826e117e9SBram Moolenaar
3897eeefd4aSBram Moolenaardef FuncWithForwardCall()
3907eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
3917eeefd4aSBram Moolenaarenddef
3927eeefd4aSBram Moolenaar
3937eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
3947eeefd4aSBram Moolenaar  return arg
3957eeefd4aSBram Moolenaarenddef
3967eeefd4aSBram Moolenaar
3977eeefd4aSBram Moolenaardef Test_error_in_nested_function()
3987eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
3997eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
4007eeefd4aSBram Moolenaarenddef
4017eeefd4aSBram Moolenaar
4028a7d6542SBram Moolenaardef Test_return_type_wrong()
403978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
404978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
405978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
406978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
407cf3f8bf4SBram Moolenaar
4089be61bbbSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
4099be61bbbSBram Moolenaar
410cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
411cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
4128a7d6542SBram Moolenaarenddef
4138a7d6542SBram Moolenaar
414bfe12043SBram Moolenaardef Test_arg_type_wrong()
415bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
416bfe12043SBram Moolenaarenddef
417bfe12043SBram Moolenaar
4188a7d6542SBram Moolenaardef Test_try_catch()
4198a7d6542SBram Moolenaar  let l = []
4208a7d6542SBram Moolenaar  try
4218a7d6542SBram Moolenaar    add(l, '1')
4228a7d6542SBram Moolenaar    throw 'wrong'
4238a7d6542SBram Moolenaar    add(l, '2')
4248a7d6542SBram Moolenaar  catch
4258a7d6542SBram Moolenaar    add(l, v:exception)
4268a7d6542SBram Moolenaar  finally
4278a7d6542SBram Moolenaar    add(l, '3')
4288a7d6542SBram Moolenaar  endtry
4298a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4308a7d6542SBram Moolenaarenddef
4318a7d6542SBram Moolenaar
432257cc5eeSBram Moolenaardef ThrowFromDef()
433257cc5eeSBram Moolenaar  throw 'getout'
434257cc5eeSBram Moolenaarenddef
435257cc5eeSBram Moolenaar
436257cc5eeSBram Moolenaarfunc CatchInFunc()
437257cc5eeSBram Moolenaar  try
438257cc5eeSBram Moolenaar    call ThrowFromDef()
439257cc5eeSBram Moolenaar  catch
440257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
441257cc5eeSBram Moolenaar  endtry
442257cc5eeSBram Moolenaarendfunc
443257cc5eeSBram Moolenaar
444257cc5eeSBram Moolenaardef CatchInDef()
445257cc5eeSBram Moolenaar  try
446257cc5eeSBram Moolenaar    ThrowFromDef()
447257cc5eeSBram Moolenaar  catch
448257cc5eeSBram Moolenaar    g:thrown_def = v:exception
449257cc5eeSBram Moolenaar  endtry
450257cc5eeSBram Moolenaarenddef
451257cc5eeSBram Moolenaar
452f575adffSBram Moolenaardef ReturnFinally(): string
453f575adffSBram Moolenaar  try
454f575adffSBram Moolenaar    return 'intry'
455f575adffSBram Moolenaar  finally
456f575adffSBram Moolenaar    g:in_finally = 'finally'
457f575adffSBram Moolenaar  endtry
458f575adffSBram Moolenaar  return 'end'
459f575adffSBram Moolenaarenddef
460f575adffSBram Moolenaar
461257cc5eeSBram Moolenaardef Test_try_catch_nested()
462257cc5eeSBram Moolenaar  CatchInFunc()
463257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
464257cc5eeSBram Moolenaar
465257cc5eeSBram Moolenaar  CatchInDef()
466257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
467f575adffSBram Moolenaar
468f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
469f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
470f575adffSBram Moolenaarenddef
471f575adffSBram Moolenaar
472f575adffSBram Moolenaardef Test_try_catch_match()
473f575adffSBram Moolenaar  let seq = 'a'
474f575adffSBram Moolenaar  try
475f575adffSBram Moolenaar    throw 'something'
476f575adffSBram Moolenaar  catch /nothing/
477f575adffSBram Moolenaar    seq ..= 'x'
478f575adffSBram Moolenaar  catch /some/
479f575adffSBram Moolenaar    seq ..= 'b'
480f575adffSBram Moolenaar  catch /asdf/
481f575adffSBram Moolenaar    seq ..= 'x'
482e8c4abbbSBram Moolenaar  catch ?a\?sdf?
483e8c4abbbSBram Moolenaar    seq ..= 'y'
484f575adffSBram Moolenaar  finally
485f575adffSBram Moolenaar    seq ..= 'c'
486f575adffSBram Moolenaar  endtry
487f575adffSBram Moolenaar  assert_equal('abc', seq)
488257cc5eeSBram Moolenaarenddef
489257cc5eeSBram Moolenaar
490e8c4abbbSBram Moolenaardef Test_try_catch_fails()
491e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
492e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
493e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
494585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
495585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
496585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
497585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
498585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
499585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
500585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
501585fea7bSBram Moolenaar
502585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
503585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
504e8c4abbbSBram Moolenaarenddef
505e8c4abbbSBram Moolenaar
5068a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
5078a7d6542SBram Moolenaar  vim9script
5088a7d6542SBram Moolenaar  let name: string = 'bob'
5098a7d6542SBram Moolenaar  def Concat(arg: string): string
5108a7d6542SBram Moolenaar    return name .. arg
5118a7d6542SBram Moolenaar  enddef
5128a7d6542SBram Moolenaar  let g:result = Concat('bie')
5138a7d6542SBram Moolenaar  let g:localname = name
5148a7d6542SBram Moolenaar
5158a7d6542SBram Moolenaar  export const CONST = 1234
5168a7d6542SBram Moolenaar  export let exported = 9876
5176e587dcbSBram Moolenaar  export let exp_name = 'John'
5188a7d6542SBram Moolenaar  export def Exported(): string
5198a7d6542SBram Moolenaar    return 'Exported'
5208a7d6542SBram Moolenaar  enddef
5218a7d6542SBram MoolenaarEND
5228a7d6542SBram Moolenaar
5235269bd2aSBram Moolenaardef Test_vim9_import_export()
5248a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5258a7d6542SBram Moolenaar    vim9script
5268a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5278a7d6542SBram Moolenaar    g:imported = exported
5286e587dcbSBram Moolenaar    exported += 3
5296e587dcbSBram Moolenaar    g:imported_added = exported
5308a7d6542SBram Moolenaar    g:imported_func = Exported()
5316e587dcbSBram Moolenaar
5326e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5336e587dcbSBram Moolenaar    g:imported_name = exp_name
5346e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5356e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5365381c7a1SBram Moolenaar    g:imported_later = exported
5378a7d6542SBram Moolenaar  END
5388a7d6542SBram Moolenaar
5398a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5408a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5418a7d6542SBram Moolenaar
5428a7d6542SBram Moolenaar  source Ximport.vim
5438a7d6542SBram Moolenaar
5448a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5458a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5468a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5476e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5485381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5498a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5506e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5516e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5528a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5538a7d6542SBram Moolenaar
5548a7d6542SBram Moolenaar  unlet g:result
5558a7d6542SBram Moolenaar  unlet g:localname
5568a7d6542SBram Moolenaar  unlet g:imported
5576e587dcbSBram Moolenaar  unlet g:imported_added
5585381c7a1SBram Moolenaar  unlet g:imported_later
5598a7d6542SBram Moolenaar  unlet g:imported_func
5606e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5618a7d6542SBram Moolenaar  delete('Ximport.vim')
562f2d5c240SBram Moolenaar
5635381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5645381c7a1SBram Moolenaar    vim9script
5655381c7a1SBram Moolenaar    def ImportInDef()
5665381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5675381c7a1SBram Moolenaar      g:imported = exported
5685381c7a1SBram Moolenaar      exported += 7
5695381c7a1SBram Moolenaar      g:imported_added = exported
5705381c7a1SBram Moolenaar    enddef
5715381c7a1SBram Moolenaar    ImportInDef()
5725381c7a1SBram Moolenaar  END
5735381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5745381c7a1SBram Moolenaar  source Ximport2.vim
5755381c7a1SBram Moolenaar  " TODO: this should be 9879
5765381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5775381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5785381c7a1SBram Moolenaar  unlet g:imported
5795381c7a1SBram Moolenaar  unlet g:imported_added
5805381c7a1SBram Moolenaar  delete('Ximport2.vim')
5815381c7a1SBram Moolenaar
582f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
583f2d5c240SBram Moolenaar    vim9script
584f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
585f2d5c240SBram Moolenaar    def UseExport()
586f2d5c240SBram Moolenaar      g:imported = Export.exported
587f2d5c240SBram Moolenaar    enddef
588f2d5c240SBram Moolenaar    UseExport()
589f2d5c240SBram Moolenaar  END
590f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
591f2d5c240SBram Moolenaar  source Ximport.vim
5925381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
593f2d5c240SBram Moolenaar
594599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
595599c89c8SBram Moolenaar    vim9script
596599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
597599c89c8SBram Moolenaar    def Func()
598599c89c8SBram Moolenaar      let dummy = 1
599599c89c8SBram Moolenaar      let imported = Export + dummy
600599c89c8SBram Moolenaar    enddef
601599c89c8SBram Moolenaar  END
602599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
603599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
604599c89c8SBram Moolenaar
605599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
606599c89c8SBram Moolenaar    vim9script
607599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
608599c89c8SBram Moolenaar    def Func()
609599c89c8SBram Moolenaar      let imported = Export . exported
610599c89c8SBram Moolenaar    enddef
611599c89c8SBram Moolenaar  END
612599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
613599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
614599c89c8SBram Moolenaar
615599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
616599c89c8SBram Moolenaar    vim9script
617599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
618599c89c8SBram Moolenaar    def Func()
619599c89c8SBram Moolenaar      let imported = Export.
620599c89c8SBram Moolenaar    enddef
621599c89c8SBram Moolenaar  END
622599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
623599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
624599c89c8SBram Moolenaar
625f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
626f2d5c240SBram Moolenaar    vim9script
627f2d5c240SBram Moolenaar    import * from './Xexport.vim'
628f2d5c240SBram Moolenaar    g:imported = exported
629f2d5c240SBram Moolenaar  END
630f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
631f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
632f2d5c240SBram Moolenaar
633fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
634fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
635fa29c8abSBram Moolenaar    vim9script
636fa29c8abSBram Moolenaar    import name from './Xexport.vim'
637fa29c8abSBram Moolenaar  END
638fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
639fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
640fa29c8abSBram Moolenaar
6415269bd2aSBram Moolenaar  " try to import something that is already defined
6425269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6435269bd2aSBram Moolenaar    vim9script
6445269bd2aSBram Moolenaar    let exported = 'something'
6455269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6465269bd2aSBram Moolenaar  END
6475269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6485269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6495269bd2aSBram Moolenaar
6505269bd2aSBram Moolenaar  " try to import something that is already defined
6515269bd2aSBram Moolenaar  import_already_defined =<< trim END
6525269bd2aSBram Moolenaar    vim9script
6535269bd2aSBram Moolenaar    let exported = 'something'
6545269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6555269bd2aSBram Moolenaar  END
6565269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6575269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6585269bd2aSBram Moolenaar
6595269bd2aSBram Moolenaar  " try to import something that is already defined
6605269bd2aSBram Moolenaar  import_already_defined =<< trim END
6615269bd2aSBram Moolenaar    vim9script
6625269bd2aSBram Moolenaar    let exported = 'something'
6635269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6645269bd2aSBram Moolenaar  END
6655269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6665269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6675269bd2aSBram Moolenaar
668fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
669fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
670fa29c8abSBram Moolenaar    vim9script
671fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
672fa29c8abSBram Moolenaar  END
673fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
674fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
675fa29c8abSBram Moolenaar
676fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
677fa29c8abSBram Moolenaar    vim9script
678fa29c8abSBram Moolenaar    import name './Xexport.vim'
679fa29c8abSBram Moolenaar  END
680fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
681fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
682fa29c8abSBram Moolenaar
683fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
684fa29c8abSBram Moolenaar    vim9script
685fa29c8abSBram Moolenaar    import name from Xexport.vim
686fa29c8abSBram Moolenaar  END
687fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
688fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
689fa29c8abSBram Moolenaar
690fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
691fa29c8abSBram Moolenaar    vim9script
692fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
693fa29c8abSBram Moolenaar  END
694fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
695fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
696fa29c8abSBram Moolenaar
697fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
698fa29c8abSBram Moolenaar    vim9script
699fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
700fa29c8abSBram Moolenaar  END
7015269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
7025269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
703fa29c8abSBram Moolenaar
704f2d5c240SBram Moolenaar  delete('Ximport.vim')
7055269bd2aSBram Moolenaar  delete('Ximport3.vim')
7068a7d6542SBram Moolenaar  delete('Xexport.vim')
7078a7d6542SBram Moolenaar
708750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
709750802b5SBram Moolenaar  set cpo&vi
710750802b5SBram Moolenaar  let cpo_before = &cpo
711750802b5SBram Moolenaar  let lines =<< trim END
712750802b5SBram Moolenaar    vim9script
713750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
714750802b5SBram Moolenaar  END
715750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
716750802b5SBram Moolenaar  source Xvim9_script
717750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
718750802b5SBram Moolenaar  set cpo&vim
719750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
720750802b5SBram Moolenaar  delete('Xvim9_script')
721750802b5SBram Moolenaarenddef
722750802b5SBram Moolenaar
723750802b5SBram Moolenaardef Test_vim9script_fails()
7248a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7258a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
726750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
727f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
728750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
729750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
730750802b5SBram Moolenaar
731750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
732750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
7338a7d6542SBram Moolenaarenddef
7348a7d6542SBram Moolenaar
7358a7d6542SBram Moolenaardef Test_vim9script_call()
7368a7d6542SBram Moolenaar  let lines =<< trim END
7378a7d6542SBram Moolenaar    vim9script
7388a7d6542SBram Moolenaar    let var = ''
7398a7d6542SBram Moolenaar    def MyFunc(arg: string)
7408a7d6542SBram Moolenaar       var = arg
7418a7d6542SBram Moolenaar    enddef
7428a7d6542SBram Moolenaar    MyFunc('foobar')
7438a7d6542SBram Moolenaar    assert_equal('foobar', var)
7448a7d6542SBram Moolenaar
7458a7d6542SBram Moolenaar    let str = 'barfoo'
7468a7d6542SBram Moolenaar    str->MyFunc()
7478a7d6542SBram Moolenaar    assert_equal('barfoo', var)
7488a7d6542SBram Moolenaar
7498a7d6542SBram Moolenaar    let g:value = 'value'
7508a7d6542SBram Moolenaar    g:value->MyFunc()
7518a7d6542SBram Moolenaar    assert_equal('value', var)
7528a7d6542SBram Moolenaar
7538a7d6542SBram Moolenaar    let listvar = []
7548a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
7558a7d6542SBram Moolenaar       listvar = arg
7568a7d6542SBram Moolenaar    enddef
7578a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
7588a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
7598a7d6542SBram Moolenaar
7608a7d6542SBram Moolenaar    let dictvar = {}
7618a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
7628a7d6542SBram Moolenaar       dictvar = arg
7638a7d6542SBram Moolenaar    enddef
7648a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
7658a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
76633fa29cfSBram Moolenaar    def CompiledDict()
76733fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
76833fa29cfSBram Moolenaar    enddef
76933fa29cfSBram Moolenaar    CompiledDict()
77033fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
77133fa29cfSBram Moolenaar
7728a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
7738a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
7740c6ceaf9SBram Moolenaar
7750c6ceaf9SBram Moolenaar    ('text')->MyFunc()
7760c6ceaf9SBram Moolenaar    assert_equal('text', var)
7770c6ceaf9SBram Moolenaar    ("some")->MyFunc()
7780c6ceaf9SBram Moolenaar    assert_equal('some', var)
7798a7d6542SBram Moolenaar  END
7808a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
7818a7d6542SBram Moolenaar  source Xcall.vim
7828a7d6542SBram Moolenaar  delete('Xcall.vim')
7838a7d6542SBram Moolenaarenddef
7848a7d6542SBram Moolenaar
7858a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
7868a7d6542SBram Moolenaar  let lines =<< trim END
7878a7d6542SBram Moolenaar    vim9script
7888a7d6542SBram Moolenaar    let var = ''
7898a7d6542SBram Moolenaar    def MyFunc(arg: string)
7908a7d6542SBram Moolenaar       let var = 123
7918a7d6542SBram Moolenaar    enddef
7928a7d6542SBram Moolenaar  END
7938a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
7948a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
7958a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
7968a7d6542SBram Moolenaarenddef
7978a7d6542SBram Moolenaar
7988a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
7998a7d6542SBram Moolenaar  let lines =<< trim END
8008a7d6542SBram Moolenaar    vim9script
8018a7d6542SBram Moolenaar    const var = ''
8028a7d6542SBram Moolenaar    def MyFunc(arg: string)
8038a7d6542SBram Moolenaar       var = 'asdf'
8048a7d6542SBram Moolenaar    enddef
8058a7d6542SBram Moolenaar  END
8068a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
8078a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
8088a7d6542SBram Moolenaar  delete('Xcall_const.vim')
8098a7d6542SBram Moolenaarenddef
8108a7d6542SBram Moolenaar
8118a7d6542SBram Moolenaardef Test_vim9script_reload()
8128a7d6542SBram Moolenaar  let lines =<< trim END
8138a7d6542SBram Moolenaar    vim9script
8148a7d6542SBram Moolenaar    const var = ''
8158a7d6542SBram Moolenaar    let valone = 1234
8168a7d6542SBram Moolenaar    def MyFunc(arg: string)
8178a7d6542SBram Moolenaar       valone = 5678
8188a7d6542SBram Moolenaar    enddef
8198a7d6542SBram Moolenaar  END
8208a7d6542SBram Moolenaar  let morelines =<< trim END
8218a7d6542SBram Moolenaar    let valtwo = 222
8228a7d6542SBram Moolenaar    export def GetValtwo(): number
8238a7d6542SBram Moolenaar      return valtwo
8248a7d6542SBram Moolenaar    enddef
8258a7d6542SBram Moolenaar  END
8268a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
8278a7d6542SBram Moolenaar  source Xreload.vim
8288a7d6542SBram Moolenaar  source Xreload.vim
8298a7d6542SBram Moolenaar  source Xreload.vim
8308a7d6542SBram Moolenaar
8318a7d6542SBram Moolenaar  let testlines =<< trim END
8328a7d6542SBram Moolenaar    vim9script
8338a7d6542SBram Moolenaar    def TheFunc()
8348a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8358a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8368a7d6542SBram Moolenaar    enddef
8378a7d6542SBram Moolenaar    TheFunc()
8388a7d6542SBram Moolenaar  END
8398a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8408a7d6542SBram Moolenaar  source Ximport.vim
8418a7d6542SBram Moolenaar
8428a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
8438a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
8448a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8458a7d6542SBram Moolenaar  source Xreload.vim
8468a7d6542SBram Moolenaar  source Ximport.vim
8478a7d6542SBram Moolenaar
8488a7d6542SBram Moolenaar  " cannot declare a var twice
8498a7d6542SBram Moolenaar  lines =<< trim END
8508a7d6542SBram Moolenaar    vim9script
8518a7d6542SBram Moolenaar    let valone = 1234
8528a7d6542SBram Moolenaar    let valone = 5678
8538a7d6542SBram Moolenaar  END
8548a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8558a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8568a7d6542SBram Moolenaar
8578a7d6542SBram Moolenaar  delete('Xreload.vim')
8588a7d6542SBram Moolenaar  delete('Ximport.vim')
8598a7d6542SBram Moolenaarenddef
8608a7d6542SBram Moolenaar
8618a7d6542SBram Moolenaardef Test_import_absolute()
8628a7d6542SBram Moolenaar  let import_lines = [
8638a7d6542SBram Moolenaar        \ 'vim9script',
8648a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
865b283a8a6SBram Moolenaar        \ 'def UseExported()',
8668a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
8674e12a5dfSBram Moolenaar        \ '  exported = 8888',
8684e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
869b283a8a6SBram Moolenaar        \ 'enddef',
870b283a8a6SBram Moolenaar        \ 'UseExported()',
8714e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
8728a7d6542SBram Moolenaar        \ ]
8738a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8748a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8758a7d6542SBram Moolenaar
8768a7d6542SBram Moolenaar  source Ximport_abs.vim
8778a7d6542SBram Moolenaar
8788a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8794e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
880b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
881b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
882b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8834e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
8844e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
8854e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
8864e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
8874e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8884e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
8894e12a5dfSBram Moolenaar        \, g:import_disassembled)
8908a7d6542SBram Moolenaar  unlet g:imported_abs
8914e12a5dfSBram Moolenaar  unlet g:import_disassembled
8928a7d6542SBram Moolenaar
8938a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8948a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8958a7d6542SBram Moolenaarenddef
8968a7d6542SBram Moolenaar
8978a7d6542SBram Moolenaardef Test_import_rtp()
8988a7d6542SBram Moolenaar  let import_lines = [
8998a7d6542SBram Moolenaar        \ 'vim9script',
9008a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
9018a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
9028a7d6542SBram Moolenaar        \ ]
9038a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
9048a7d6542SBram Moolenaar  mkdir('import')
9058a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
9068a7d6542SBram Moolenaar
9078a7d6542SBram Moolenaar  let save_rtp = &rtp
9088a7d6542SBram Moolenaar  &rtp = getcwd()
9098a7d6542SBram Moolenaar  source Ximport_rtp.vim
9108a7d6542SBram Moolenaar  &rtp = save_rtp
9118a7d6542SBram Moolenaar
9128a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
9138a7d6542SBram Moolenaar  unlet g:imported_rtp
9148a7d6542SBram Moolenaar
9158a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
9168a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
9178a7d6542SBram Moolenaar  delete('import', 'd')
9188a7d6542SBram Moolenaarenddef
9198a7d6542SBram Moolenaar
9208a7d6542SBram Moolenaardef Test_fixed_size_list()
9218a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
9228a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
9238a7d6542SBram Moolenaar  l->remove(0)
9248a7d6542SBram Moolenaar  l->add(5)
9258a7d6542SBram Moolenaar  l->insert(99, 1)
9260f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
9278a7d6542SBram Moolenaarenddef
9288a7d6542SBram Moolenaar
929673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
930673660abSBram Moolenaar" recognized.
931673660abSBram Moolenaarfunc Test_function_python()
932673660abSBram Moolenaar  CheckFeature python3
933673660abSBram Moolenaar  let py = 'python3'
934673660abSBram Moolenaar  execute py "<< EOF"
935673660abSBram Moolenaardef do_something():
936673660abSBram Moolenaar  return 1
937673660abSBram MoolenaarEOF
938673660abSBram Moolenaarendfunc
939673660abSBram Moolenaar
940158906cfSBram Moolenaardef IfElse(what: number): string
941158906cfSBram Moolenaar  let res = ''
942158906cfSBram Moolenaar  if what == 1
943158906cfSBram Moolenaar    res = "one"
944158906cfSBram Moolenaar  elseif what == 2
945158906cfSBram Moolenaar    res = "two"
946a259d8d3SBram Moolenaar  else
947158906cfSBram Moolenaar    res = "three"
948a259d8d3SBram Moolenaar  endif
949158906cfSBram Moolenaar  return res
950a259d8d3SBram Moolenaarenddef
951a259d8d3SBram Moolenaar
952158906cfSBram Moolenaardef Test_if_elseif_else()
953158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
954158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
955158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
9560f18b6d1SBram Moolenaarenddef
9570f18b6d1SBram Moolenaar
958e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
959e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
960e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
961e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
962e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
963585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
964e8c4abbbSBram Moolenaarenddef
965e8c4abbbSBram Moolenaar
9666d69bf60SBram Moolenaarlet g:bool_true = v:true
9676d69bf60SBram Moolenaarlet g:bool_false = v:false
9686d69bf60SBram Moolenaar
9696d69bf60SBram Moolenaardef Test_if_const_expr()
9706d69bf60SBram Moolenaar  let res = false
9716d69bf60SBram Moolenaar  if true ? true : false
9726d69bf60SBram Moolenaar    res = true
9736d69bf60SBram Moolenaar  endif
9746d69bf60SBram Moolenaar  assert_equal(true, res)
9756d69bf60SBram Moolenaar
976585fea7bSBram Moolenaar  g:glob = 2
977585fea7bSBram Moolenaar  if false
978585fea7bSBram Moolenaar    execute('let g:glob = 3')
979585fea7bSBram Moolenaar  endif
980585fea7bSBram Moolenaar  assert_equal(2, g:glob)
981585fea7bSBram Moolenaar  if true
982585fea7bSBram Moolenaar    execute('let g:glob = 3')
983585fea7bSBram Moolenaar  endif
984585fea7bSBram Moolenaar  assert_equal(3, g:glob)
985585fea7bSBram Moolenaar
9866d69bf60SBram Moolenaar  res = false
9876d69bf60SBram Moolenaar  if g:bool_true ? true : false
9886d69bf60SBram Moolenaar    res = true
9896d69bf60SBram Moolenaar  endif
9906d69bf60SBram Moolenaar  assert_equal(true, res)
9916d69bf60SBram Moolenaar
9926d69bf60SBram Moolenaar  res = false
9936d69bf60SBram Moolenaar  if true ? g:bool_true : false
9946d69bf60SBram Moolenaar    res = true
9956d69bf60SBram Moolenaar  endif
9966d69bf60SBram Moolenaar  assert_equal(true, res)
9976d69bf60SBram Moolenaar
9986d69bf60SBram Moolenaar  res = false
9996d69bf60SBram Moolenaar  if true ? true : g:bool_false
10006d69bf60SBram Moolenaar    res = true
10016d69bf60SBram Moolenaar  endif
10026d69bf60SBram Moolenaar  assert_equal(true, res)
10036d69bf60SBram Moolenaar
10046d69bf60SBram Moolenaar  res = false
10056d69bf60SBram Moolenaar  if true ? false : true
10066d69bf60SBram Moolenaar    res = true
10076d69bf60SBram Moolenaar  endif
10086d69bf60SBram Moolenaar  assert_equal(false, res)
10096d69bf60SBram Moolenaar
10106d69bf60SBram Moolenaar  res = false
10116d69bf60SBram Moolenaar  if false ? false : true
10126d69bf60SBram Moolenaar    res = true
10136d69bf60SBram Moolenaar  endif
10146d69bf60SBram Moolenaar  assert_equal(true, res)
10156d69bf60SBram Moolenaar
10166d69bf60SBram Moolenaar  res = false
10176d69bf60SBram Moolenaar  if false ? true : false
10186d69bf60SBram Moolenaar    res = true
10196d69bf60SBram Moolenaar  endif
10206d69bf60SBram Moolenaar  assert_equal(false, res)
10216d69bf60SBram Moolenaar
10226d69bf60SBram Moolenaar  res = false
1023e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1024e8c4abbbSBram Moolenaar    res = true
1025e8c4abbbSBram Moolenaar  endif
1026e8c4abbbSBram Moolenaar  assert_equal(false, res)
1027e8c4abbbSBram Moolenaar
1028e8c4abbbSBram Moolenaar  res = false
10296d69bf60SBram Moolenaar  if true && true
10306d69bf60SBram Moolenaar    res = true
10316d69bf60SBram Moolenaar  endif
10326d69bf60SBram Moolenaar  assert_equal(true, res)
10336d69bf60SBram Moolenaar
10346d69bf60SBram Moolenaar  res = false
10356d69bf60SBram Moolenaar  if true && false
10366d69bf60SBram Moolenaar    res = true
10376d69bf60SBram Moolenaar  endif
10386d69bf60SBram Moolenaar  assert_equal(false, res)
10396d69bf60SBram Moolenaar
10406d69bf60SBram Moolenaar  res = false
10416d69bf60SBram Moolenaar  if g:bool_true && false
10426d69bf60SBram Moolenaar    res = true
10436d69bf60SBram Moolenaar  endif
10446d69bf60SBram Moolenaar  assert_equal(false, res)
10456d69bf60SBram Moolenaar
10466d69bf60SBram Moolenaar  res = false
10476d69bf60SBram Moolenaar  if true && g:bool_false
10486d69bf60SBram Moolenaar    res = true
10496d69bf60SBram Moolenaar  endif
10506d69bf60SBram Moolenaar  assert_equal(false, res)
10516d69bf60SBram Moolenaar
10526d69bf60SBram Moolenaar  res = false
10536d69bf60SBram Moolenaar  if false && false
10546d69bf60SBram Moolenaar    res = true
10556d69bf60SBram Moolenaar  endif
10566d69bf60SBram Moolenaar  assert_equal(false, res)
10576d69bf60SBram Moolenaar
10586d69bf60SBram Moolenaar  res = false
10596d69bf60SBram Moolenaar  if true || false
10606d69bf60SBram Moolenaar    res = true
10616d69bf60SBram Moolenaar  endif
10626d69bf60SBram Moolenaar  assert_equal(true, res)
10636d69bf60SBram Moolenaar
10646d69bf60SBram Moolenaar  res = false
10656d69bf60SBram Moolenaar  if g:bool_true || false
10666d69bf60SBram Moolenaar    res = true
10676d69bf60SBram Moolenaar  endif
10686d69bf60SBram Moolenaar  assert_equal(true, res)
10696d69bf60SBram Moolenaar
10706d69bf60SBram Moolenaar  res = false
10716d69bf60SBram Moolenaar  if true || g:bool_false
10726d69bf60SBram Moolenaar    res = true
10736d69bf60SBram Moolenaar  endif
10746d69bf60SBram Moolenaar  assert_equal(true, res)
10756d69bf60SBram Moolenaar
10766d69bf60SBram Moolenaar  res = false
10776d69bf60SBram Moolenaar  if false || false
10786d69bf60SBram Moolenaar    res = true
10796d69bf60SBram Moolenaar  endif
10806d69bf60SBram Moolenaar  assert_equal(false, res)
108180c34ca3SBram Moolenaarenddef
10826d69bf60SBram Moolenaar
108380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
108480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
108580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1086e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1087e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
10886d69bf60SBram Moolenaarenddef
10896d69bf60SBram Moolenaar
109063ce4849SBram Moolenaardef Test_delfunc()
109163ce4849SBram Moolenaar  let lines =<< trim END
109263ce4849SBram Moolenaar    vim9script
109363ce4849SBram Moolenaar    def GoneSoon()
109463ce4849SBram Moolenaar      echo 'hello'
109563ce4849SBram Moolenaar    enddef
109663ce4849SBram Moolenaar
109763ce4849SBram Moolenaar    def CallGoneSoon()
109863ce4849SBram Moolenaar      GoneSoon()
109963ce4849SBram Moolenaar    enddef
110063ce4849SBram Moolenaar
110163ce4849SBram Moolenaar    delfunc GoneSoon
110263ce4849SBram Moolenaar    CallGoneSoon()
110363ce4849SBram Moolenaar  END
110463ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
110563ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
110663ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
110763ce4849SBram Moolenaar
110863ce4849SBram Moolenaar  delete('XToDelFunc')
110963ce4849SBram Moolenaarenddef
111063ce4849SBram Moolenaar
1111ad39c094SBram Moolenaardef Test_execute_cmd()
1112ad39c094SBram Moolenaar  new
1113ad39c094SBram Moolenaar  setline(1, 'default')
1114ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1115ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1116ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1117ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1118ad39c094SBram Moolenaar  execute cmd1 cmd2
1119ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1120ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1121ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1122ad39c094SBram Moolenaar  let cmd_first = 'call '
1123ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1124ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1125ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1126ad39c094SBram Moolenaar  bwipe!
1127585fea7bSBram Moolenaar
1128585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1129ad39c094SBram Moolenaarenddef
1130ad39c094SBram Moolenaar
1131ad39c094SBram Moolenaardef Test_echo_cmd()
1132585fea7bSBram Moolenaar  echo 'some'
1133585fea7bSBram Moolenaar  echon 'thing'
1134ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1135ad39c094SBram Moolenaar
1136ad39c094SBram Moolenaar  let str1 = 'some'
1137ad39c094SBram Moolenaar  let str2 = 'more'
1138ad39c094SBram Moolenaar  echo str1 str2
1139ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1140ad39c094SBram Moolenaarenddef
1141ad39c094SBram Moolenaar
114241fe0617SBram Moolenaardef Test_for_outside_of_function()
114341fe0617SBram Moolenaar  let lines =<< trim END
114441fe0617SBram Moolenaar    vim9script
114541fe0617SBram Moolenaar    new
114641fe0617SBram Moolenaar    for var in range(0, 3)
114741fe0617SBram Moolenaar      append(line('$'), var)
114841fe0617SBram Moolenaar    endfor
114941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
115041fe0617SBram Moolenaar    bwipe!
115141fe0617SBram Moolenaar  END
115241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
115341fe0617SBram Moolenaar  source Xvim9for.vim
115441fe0617SBram Moolenaar  delete('Xvim9for.vim')
115541fe0617SBram Moolenaarenddef
11568a7d6542SBram Moolenaar
1157e8c4abbbSBram Moolenaardef Test_for_loop()
1158e8c4abbbSBram Moolenaar  let result = ''
1159e8c4abbbSBram Moolenaar  for cnt in range(7)
1160e8c4abbbSBram Moolenaar    if cnt == 4
1161e8c4abbbSBram Moolenaar      break
1162e8c4abbbSBram Moolenaar    endif
1163e8c4abbbSBram Moolenaar    if cnt == 2
1164e8c4abbbSBram Moolenaar      continue
1165e8c4abbbSBram Moolenaar    endif
1166e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1167e8c4abbbSBram Moolenaar  endfor
1168e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1169e8c4abbbSBram Moolenaarenddef
1170e8c4abbbSBram Moolenaar
1171e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1172e8c4abbbSBram Moolenaar  call CheckDefFailure(['for # in range(5)'], 'E690:')
1173e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i In range(5)'], 'E690:')
1174e8c4abbbSBram Moolenaar  call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1175e8c4abbbSBram Moolenaar  call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1176e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in "text"'], 'E1024:')
1177e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in xxx'], 'E1001:')
1178e8c4abbbSBram Moolenaar  call CheckDefFailure(['endfor'], 'E588:')
1179585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1180e8c4abbbSBram Moolenaarenddef
1181e8c4abbbSBram Moolenaar
1182d0df1aacSBram Moolenaardef Test_while_loop()
1183d0df1aacSBram Moolenaar  let result = ''
1184d0df1aacSBram Moolenaar  let cnt = 0
1185d0df1aacSBram Moolenaar  while cnt < 555
1186d0df1aacSBram Moolenaar    if cnt == 3
1187d0df1aacSBram Moolenaar      break
1188d0df1aacSBram Moolenaar    endif
1189d0df1aacSBram Moolenaar    cnt += 1
1190d0df1aacSBram Moolenaar    if cnt == 2
1191d0df1aacSBram Moolenaar      continue
1192d0df1aacSBram Moolenaar    endif
1193d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1194d0df1aacSBram Moolenaar  endwhile
1195d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1196d0df1aacSBram Moolenaarenddef
1197d0df1aacSBram Moolenaar
1198e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1199e8c4abbbSBram Moolenaar  call CheckDefFailure(['while xxx'], 'E1001:')
1200e8c4abbbSBram Moolenaar  call CheckDefFailure(['endwhile'], 'E588:')
1201e8c4abbbSBram Moolenaar  call CheckDefFailure(['continue'], 'E586:')
1202e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'continue'], 'E586:')
1203e8c4abbbSBram Moolenaar  call CheckDefFailure(['break'], 'E587:')
1204e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'break'], 'E587:')
1205585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1206bd5da371SBram Moolenaarenddef
1207bd5da371SBram Moolenaar
12089645e2d9SBram Moolenaardef Test_interrupt_loop()
120997acfc78SBram Moolenaar  let caught = false
12109645e2d9SBram Moolenaar  let x = 0
121197acfc78SBram Moolenaar  try
12129645e2d9SBram Moolenaar    while 1
12139645e2d9SBram Moolenaar      x += 1
12149645e2d9SBram Moolenaar      if x == 100
12159645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
12169645e2d9SBram Moolenaar      endif
12179645e2d9SBram Moolenaar    endwhile
121897acfc78SBram Moolenaar  catch
121997acfc78SBram Moolenaar    caught = true
122097acfc78SBram Moolenaar    assert_equal(100, x)
122197acfc78SBram Moolenaar  endtry
122297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
12239645e2d9SBram Moolenaarenddef
122420431c9dSBram Moolenaar
122520431c9dSBram Moolenaardef Test_redef_failure()
122620431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
122720431c9dSBram Moolenaar  so Xdef
122820431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
122920431c9dSBram Moolenaar  so Xdef
123020431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
123120431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
123220431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
123320431c9dSBram Moolenaar  so Xdef
123420431c9dSBram Moolenaar  call delete('Xdef')
123520431c9dSBram Moolenaar
123620431c9dSBram Moolenaar  call assert_equal(0, Func0())
123720431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
123820431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
123920431c9dSBram Moolenaar
124020431c9dSBram Moolenaar  delfunc! Func0
124120431c9dSBram Moolenaar  delfunc! Func1
124220431c9dSBram Moolenaar  delfunc! Func2
124320431c9dSBram Moolenaarenddef
124420431c9dSBram Moolenaar
12457d941ee0SBram Moolenaar" Test for internal functions returning different types
12467d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
12477d941ee0SBram Moolenaar  let lines =<< trim END
12487d941ee0SBram Moolenaar    def RetFloat(): float
12497d941ee0SBram Moolenaar      return ceil(1.456)
12507d941ee0SBram Moolenaar    enddef
12517d941ee0SBram Moolenaar
12527d941ee0SBram Moolenaar    def RetListAny(): list<any>
12537d941ee0SBram Moolenaar      return items({'k' : 'v'})
12547d941ee0SBram Moolenaar    enddef
12557d941ee0SBram Moolenaar
12567d941ee0SBram Moolenaar    def RetListString(): list<string>
12577d941ee0SBram Moolenaar      return split('a:b:c', ':')
12587d941ee0SBram Moolenaar    enddef
12597d941ee0SBram Moolenaar
12607d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
12617d941ee0SBram Moolenaar      return getbufinfo()
12627d941ee0SBram Moolenaar    enddef
12637d941ee0SBram Moolenaar
12647d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
12657d941ee0SBram Moolenaar      return wordcount()
12667d941ee0SBram Moolenaar    enddef
12677d941ee0SBram Moolenaar
12687d941ee0SBram Moolenaar    def RetDictString(): dict<string>
12697d941ee0SBram Moolenaar      return environ()
12707d941ee0SBram Moolenaar    enddef
12717d941ee0SBram Moolenaar  END
12727d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
12737d941ee0SBram Moolenaar  source Xscript
12747d941ee0SBram Moolenaar
12757d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
12767d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
12777d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
12787d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
12797d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
12807d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
12817d941ee0SBram Moolenaar  call delete('Xscript')
12827d941ee0SBram Moolenaarendfunc
12837d941ee0SBram Moolenaar
12847d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
12857d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
12867d941ee0SBram Moolenaar  let l =<< trim END
12877d941ee0SBram Moolenaar    def! FArgErr(): float
12887d941ee0SBram Moolenaar      return ceil(1.1, 2)
12897d941ee0SBram Moolenaar    enddef
12907d941ee0SBram Moolenaar  END
12917d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12927d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
12937d941ee0SBram Moolenaar  let l =<< trim END
12947d941ee0SBram Moolenaar    def! FArgErr(): float
12957d941ee0SBram Moolenaar      return ceil()
12967d941ee0SBram Moolenaar    enddef
12977d941ee0SBram Moolenaar  END
12987d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12997d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
13007d941ee0SBram Moolenaar  call delete('Xinvalidarg')
13017d941ee0SBram Moolenaarendfunc
13027d941ee0SBram Moolenaar
1303585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1304585fea7bSBram Moolenaardef Test_substitute_cmd()
1305585fea7bSBram Moolenaar  new
1306585fea7bSBram Moolenaar  setline(1, 'something')
1307585fea7bSBram Moolenaar  :substitute(some(other(
1308585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1309585fea7bSBram Moolenaar  bwipe!
1310585fea7bSBram Moolenaar
1311585fea7bSBram Moolenaar  " also when the context is Vim9 script
1312585fea7bSBram Moolenaar  let lines =<< trim END
1313585fea7bSBram Moolenaar    vim9script
1314585fea7bSBram Moolenaar    new
1315585fea7bSBram Moolenaar    setline(1, 'something')
1316585fea7bSBram Moolenaar    :substitute(some(other(
1317585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1318585fea7bSBram Moolenaar    bwipe!
1319585fea7bSBram Moolenaar  END
1320585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1321585fea7bSBram Moolenaar  source Xvim9lines
1322585fea7bSBram Moolenaar
1323585fea7bSBram Moolenaar  delete('Xvim9lines')
1324585fea7bSBram Moolenaarenddef
1325585fea7bSBram Moolenaar
13268a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1327