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)
103a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
104a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
105a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
106a8c17704SBram Moolenaar
107a8c17704SBram Moolenaar  g:inc_counter += 1
108a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
109a8c17704SBram Moolenaar
110a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
111a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
112a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
113a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
114a8c17704SBram Moolenaar
115a8c17704SBram Moolenaar  @a = 'areg'
116a8c17704SBram Moolenaar  @a ..= 'add'
117a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
118a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
119a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
120*e69f6d04SBram Moolenaar
121*e69f6d04SBram Moolenaar  v:errmsg = 'none'
122*e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
123*e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
124*e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
125*e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
126*e69f6d04SBram Moolenaar
127*e69f6d04SBram Moolenaar  " Test default values.
128*e69f6d04SBram Moolenaar  let thebool: bool
129*e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
130*e69f6d04SBram Moolenaar
131*e69f6d04SBram Moolenaar  let thenumber: number
132*e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
133*e69f6d04SBram Moolenaar
134*e69f6d04SBram Moolenaar  if has('float')
135*e69f6d04SBram Moolenaar    let thefloat: float
136*e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
137*e69f6d04SBram Moolenaar  endif
138*e69f6d04SBram Moolenaar
139*e69f6d04SBram Moolenaar  let thestring: string
140*e69f6d04SBram Moolenaar  assert_equal('', thestring)
141*e69f6d04SBram Moolenaar
142*e69f6d04SBram Moolenaar  let theblob: blob
143*e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
144*e69f6d04SBram Moolenaar
145*e69f6d04SBram Moolenaar  let thefunc: func
146*e69f6d04SBram Moolenaar  assert_equal(test_null_function(), thefunc)
147*e69f6d04SBram Moolenaar
148*e69f6d04SBram Moolenaar  let thepartial: partial
149*e69f6d04SBram Moolenaar  assert_equal(test_null_partial(), thepartial)
150*e69f6d04SBram Moolenaar
151*e69f6d04SBram Moolenaar  let thelist: list<any>
152*e69f6d04SBram Moolenaar  assert_equal([], thelist)
153*e69f6d04SBram Moolenaar
154*e69f6d04SBram Moolenaar  let thedict: dict<any>
155*e69f6d04SBram Moolenaar  assert_equal({}, thedict)
156*e69f6d04SBram Moolenaar
157*e69f6d04SBram Moolenaar  let thejob: job
158*e69f6d04SBram Moolenaar  assert_equal(test_null_job(), thejob)
159*e69f6d04SBram Moolenaar
160*e69f6d04SBram Moolenaar  let thechannel: channel
161*e69f6d04SBram Moolenaar  assert_equal(test_null_channel(), thechannel)
1628a7d6542SBram Moolenaarenddef
1638a7d6542SBram Moolenaar
1648a7d6542SBram Moolenaarfunc Test_assignment_failure()
1658a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1668a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1678a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1688a7d6542SBram Moolenaar
1698a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1708a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1718a7d6542SBram Moolenaar
1729be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1739be61bbbSBram Moolenaar
174*e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1759be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1769be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1779be61bbbSBram Moolenaar
1789be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1799be61bbbSBram Moolenaar
1809be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1819be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1829be61bbbSBram Moolenaar
1839be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
1849be61bbbSBram Moolenaar
1859be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
1869be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
1879be61bbbSBram Moolenaar
18833fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
18933fa29cfSBram Moolenaar
1908a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
1918a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1928a7d6542SBram Moolenaar
1938a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
1948a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1958a7d6542SBram Moolenaar
1968a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1978a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
19842a480bfSBram Moolenaar
19942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
20042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
201599c89c8SBram Moolenaarendfunc
202599c89c8SBram Moolenaar
203599c89c8SBram Moolenaarfunc Test_wrong_type()
204599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
205599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
206599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
207599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
208599c89c8SBram Moolenaar
209599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
210599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
21142a480bfSBram Moolenaar
21242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
21342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
21442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
21542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
21642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
21742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
21842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
21942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
22042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
22142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
22242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2238a7d6542SBram Moolenaarendfunc
2248a7d6542SBram Moolenaar
2258a7d6542SBram Moolenaarfunc Test_const()
2268a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2278a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2288a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2299be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2308a7d6542SBram Moolenaarendfunc
2318a7d6542SBram Moolenaar
2328a7d6542SBram Moolenaardef Test_block()
2338a7d6542SBram Moolenaar  let outer = 1
2348a7d6542SBram Moolenaar  {
2358a7d6542SBram Moolenaar    let inner = 2
2368a7d6542SBram Moolenaar    assert_equal(1, outer)
2378a7d6542SBram Moolenaar    assert_equal(2, inner)
2388a7d6542SBram Moolenaar  }
2398a7d6542SBram Moolenaar  assert_equal(1, outer)
2408a7d6542SBram Moolenaarenddef
2418a7d6542SBram Moolenaar
2428a7d6542SBram Moolenaarfunc Test_block_failure()
2438a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
2448a7d6542SBram Moolenaarendfunc
2458a7d6542SBram Moolenaar
2468a7d6542SBram Moolenaardef ReturnString(): string
2478a7d6542SBram Moolenaar  return 'string'
2488a7d6542SBram Moolenaarenddef
2498a7d6542SBram Moolenaar
2508a7d6542SBram Moolenaardef ReturnNumber(): number
2518a7d6542SBram Moolenaar  return 123
2528a7d6542SBram Moolenaarenddef
2538a7d6542SBram Moolenaar
25409f28f49SBram Moolenaarlet g:notNumber = 'string'
25509f28f49SBram Moolenaar
25609f28f49SBram Moolenaardef ReturnGlobal(): number
25709f28f49SBram Moolenaar  return g:notNumber
25809f28f49SBram Moolenaarenddef
25909f28f49SBram Moolenaar
2609be61bbbSBram Moolenaardef Test_return_something()
2618a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
2628a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
26309f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
2669be61bbbSBram Moolenaarlet s:nothing = 0
2679be61bbbSBram Moolenaardef ReturnNothing()
2689be61bbbSBram Moolenaar  s:nothing = 1
2699be61bbbSBram Moolenaar  if true
2709be61bbbSBram Moolenaar    return
2719be61bbbSBram Moolenaar  endif
2729be61bbbSBram Moolenaar  s:nothing = 2
2739be61bbbSBram Moolenaarenddef
2749be61bbbSBram Moolenaar
2759be61bbbSBram Moolenaardef Test_return_nothing()
2769be61bbbSBram Moolenaar  ReturnNothing()
2779be61bbbSBram Moolenaar  assert_equal(1, s:nothing)
2789be61bbbSBram Moolenaarenddef
2799be61bbbSBram Moolenaar
2808a7d6542SBram Moolenaarfunc Increment()
2818a7d6542SBram Moolenaar  let g:counter += 1
2828a7d6542SBram Moolenaarendfunc
2838a7d6542SBram Moolenaar
2848a7d6542SBram Moolenaardef Test_call_ufunc_count()
2858a7d6542SBram Moolenaar  g:counter = 1
2868a7d6542SBram Moolenaar  Increment()
2878a7d6542SBram Moolenaar  Increment()
2888a7d6542SBram Moolenaar  Increment()
2898a7d6542SBram Moolenaar  " works with and without :call
2908a7d6542SBram Moolenaar  assert_equal(4, g:counter)
291b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
2928a7d6542SBram Moolenaar  unlet g:counter
2938a7d6542SBram Moolenaarenddef
2948a7d6542SBram Moolenaar
2958a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
2968a7d6542SBram Moolenaar  let res = arg
2978a7d6542SBram Moolenaar  for s in rest
2988a7d6542SBram Moolenaar    res ..= ',' .. s
2998a7d6542SBram Moolenaar  endfor
3008a7d6542SBram Moolenaar  return res
3018a7d6542SBram Moolenaarenddef
3028a7d6542SBram Moolenaar
3038a7d6542SBram Moolenaardef Test_call_varargs()
3048a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
3058a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
3068a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
3078a7d6542SBram Moolenaarenddef
3088a7d6542SBram Moolenaar
309170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
310170fcfcfSBram Moolenaar  return name
311170fcfcfSBram Moolenaarenddef
312170fcfcfSBram Moolenaar
313170fcfcfSBram Moolenaardef Test_call_default_args()
314170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
315170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
316170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
317170fcfcfSBram Moolenaarenddef
318170fcfcfSBram Moolenaar
319170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
320170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
321170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
322170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
323170fcfcfSBram Moolenaarendfunc
324170fcfcfSBram Moolenaar
325b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
326b35efa5eSBram Moolenaar  echo a:arg
327b35efa5eSBram Moolenaarendfunc
328b35efa5eSBram Moolenaar
329bd5da371SBram Moolenaardef Test_call_wrong_args()
330b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
331b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
332bd5da371SBram Moolenaar  call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
333b35efa5eSBram Moolenaarenddef
334b35efa5eSBram Moolenaar
335170fcfcfSBram Moolenaar" Default arg and varargs
336170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
337170fcfcfSBram Moolenaar  let res = one .. ',' .. two
338170fcfcfSBram Moolenaar  for s in rest
339170fcfcfSBram Moolenaar    res ..= ',' .. s
340170fcfcfSBram Moolenaar  endfor
341170fcfcfSBram Moolenaar  return res
342170fcfcfSBram Moolenaarenddef
343170fcfcfSBram Moolenaar
344170fcfcfSBram Moolenaardef Test_call_def_varargs()
345170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
346170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
347170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
348170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
349170fcfcfSBram Moolenaarenddef
350170fcfcfSBram Moolenaar
35142a480bfSBram Moolenaardef Test_using_var_as_arg()
35242a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
35342a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
35442a480bfSBram Moolenaar  call delete('Xdef')
35542a480bfSBram Moolenaarenddef
35642a480bfSBram Moolenaar
357b35efa5eSBram Moolenaardef Test_call_func_defined_later()
358b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
359b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
360b35efa5eSBram Moolenaarenddef
361170fcfcfSBram Moolenaar
362b35efa5eSBram Moolenaarfunc DefinedLater(arg)
36326e117e9SBram Moolenaar  return a:arg
36426e117e9SBram Moolenaarendfunc
36526e117e9SBram Moolenaar
3667eeefd4aSBram Moolenaardef FuncWithForwardCall()
3677eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
3687eeefd4aSBram Moolenaarenddef
3697eeefd4aSBram Moolenaar
3707eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
3717eeefd4aSBram Moolenaar  return arg
3727eeefd4aSBram Moolenaarenddef
3737eeefd4aSBram Moolenaar
3747eeefd4aSBram Moolenaardef Test_error_in_nested_function()
3757eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
3767eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
3777eeefd4aSBram Moolenaarenddef
3787eeefd4aSBram Moolenaar
3798a7d6542SBram Moolenaardef Test_return_type_wrong()
380978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
381978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
382978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
383978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
384cf3f8bf4SBram Moolenaar
3859be61bbbSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
3869be61bbbSBram Moolenaar
387cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
388cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
3898a7d6542SBram Moolenaarenddef
3908a7d6542SBram Moolenaar
391bfe12043SBram Moolenaardef Test_arg_type_wrong()
392bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
393bfe12043SBram Moolenaarenddef
394bfe12043SBram Moolenaar
3958a7d6542SBram Moolenaardef Test_try_catch()
3968a7d6542SBram Moolenaar  let l = []
3978a7d6542SBram Moolenaar  try
3988a7d6542SBram Moolenaar    add(l, '1')
3998a7d6542SBram Moolenaar    throw 'wrong'
4008a7d6542SBram Moolenaar    add(l, '2')
4018a7d6542SBram Moolenaar  catch
4028a7d6542SBram Moolenaar    add(l, v:exception)
4038a7d6542SBram Moolenaar  finally
4048a7d6542SBram Moolenaar    add(l, '3')
4058a7d6542SBram Moolenaar  endtry
4068a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4078a7d6542SBram Moolenaarenddef
4088a7d6542SBram Moolenaar
409257cc5eeSBram Moolenaardef ThrowFromDef()
410257cc5eeSBram Moolenaar  throw 'getout'
411257cc5eeSBram Moolenaarenddef
412257cc5eeSBram Moolenaar
413257cc5eeSBram Moolenaarfunc CatchInFunc()
414257cc5eeSBram Moolenaar  try
415257cc5eeSBram Moolenaar    call ThrowFromDef()
416257cc5eeSBram Moolenaar  catch
417257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
418257cc5eeSBram Moolenaar  endtry
419257cc5eeSBram Moolenaarendfunc
420257cc5eeSBram Moolenaar
421257cc5eeSBram Moolenaardef CatchInDef()
422257cc5eeSBram Moolenaar  try
423257cc5eeSBram Moolenaar    ThrowFromDef()
424257cc5eeSBram Moolenaar  catch
425257cc5eeSBram Moolenaar    g:thrown_def = v:exception
426257cc5eeSBram Moolenaar  endtry
427257cc5eeSBram Moolenaarenddef
428257cc5eeSBram Moolenaar
429f575adffSBram Moolenaardef ReturnFinally(): string
430f575adffSBram Moolenaar  try
431f575adffSBram Moolenaar    return 'intry'
432f575adffSBram Moolenaar  finally
433f575adffSBram Moolenaar    g:in_finally = 'finally'
434f575adffSBram Moolenaar  endtry
435f575adffSBram Moolenaar  return 'end'
436f575adffSBram Moolenaarenddef
437f575adffSBram Moolenaar
438257cc5eeSBram Moolenaardef Test_try_catch_nested()
439257cc5eeSBram Moolenaar  CatchInFunc()
440257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
441257cc5eeSBram Moolenaar
442257cc5eeSBram Moolenaar  CatchInDef()
443257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
444f575adffSBram Moolenaar
445f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
446f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
447f575adffSBram Moolenaarenddef
448f575adffSBram Moolenaar
449f575adffSBram Moolenaardef Test_try_catch_match()
450f575adffSBram Moolenaar  let seq = 'a'
451f575adffSBram Moolenaar  try
452f575adffSBram Moolenaar    throw 'something'
453f575adffSBram Moolenaar  catch /nothing/
454f575adffSBram Moolenaar    seq ..= 'x'
455f575adffSBram Moolenaar  catch /some/
456f575adffSBram Moolenaar    seq ..= 'b'
457f575adffSBram Moolenaar  catch /asdf/
458f575adffSBram Moolenaar    seq ..= 'x'
459f575adffSBram Moolenaar  finally
460f575adffSBram Moolenaar    seq ..= 'c'
461f575adffSBram Moolenaar  endtry
462f575adffSBram Moolenaar  assert_equal('abc', seq)
463257cc5eeSBram Moolenaarenddef
464257cc5eeSBram Moolenaar
4658a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4668a7d6542SBram Moolenaar  vim9script
4678a7d6542SBram Moolenaar  let name: string = 'bob'
4688a7d6542SBram Moolenaar  def Concat(arg: string): string
4698a7d6542SBram Moolenaar    return name .. arg
4708a7d6542SBram Moolenaar  enddef
4718a7d6542SBram Moolenaar  let g:result = Concat('bie')
4728a7d6542SBram Moolenaar  let g:localname = name
4738a7d6542SBram Moolenaar
4748a7d6542SBram Moolenaar  export const CONST = 1234
4758a7d6542SBram Moolenaar  export let exported = 9876
4766e587dcbSBram Moolenaar  export let exp_name = 'John'
4778a7d6542SBram Moolenaar  export def Exported(): string
4788a7d6542SBram Moolenaar    return 'Exported'
4798a7d6542SBram Moolenaar  enddef
4808a7d6542SBram MoolenaarEND
4818a7d6542SBram Moolenaar
4825269bd2aSBram Moolenaardef Test_vim9_import_export()
4838a7d6542SBram Moolenaar  let import_script_lines =<< trim END
4848a7d6542SBram Moolenaar    vim9script
4858a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
4868a7d6542SBram Moolenaar    g:imported = exported
4876e587dcbSBram Moolenaar    exported += 3
4886e587dcbSBram Moolenaar    g:imported_added = exported
4898a7d6542SBram Moolenaar    g:imported_func = Exported()
4906e587dcbSBram Moolenaar
4916e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
4926e587dcbSBram Moolenaar    g:imported_name = exp_name
4936e587dcbSBram Moolenaar    exp_name ..= ' Doe'
4946e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
4955381c7a1SBram Moolenaar    g:imported_later = exported
4968a7d6542SBram Moolenaar  END
4978a7d6542SBram Moolenaar
4988a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
4998a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5008a7d6542SBram Moolenaar
5018a7d6542SBram Moolenaar  source Ximport.vim
5028a7d6542SBram Moolenaar
5038a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5048a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5058a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5066e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5075381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5088a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5096e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5106e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5118a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5128a7d6542SBram Moolenaar
5138a7d6542SBram Moolenaar  unlet g:result
5148a7d6542SBram Moolenaar  unlet g:localname
5158a7d6542SBram Moolenaar  unlet g:imported
5166e587dcbSBram Moolenaar  unlet g:imported_added
5175381c7a1SBram Moolenaar  unlet g:imported_later
5188a7d6542SBram Moolenaar  unlet g:imported_func
5196e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5208a7d6542SBram Moolenaar  delete('Ximport.vim')
521f2d5c240SBram Moolenaar
5225381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5235381c7a1SBram Moolenaar    vim9script
5245381c7a1SBram Moolenaar    def ImportInDef()
5255381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5265381c7a1SBram Moolenaar      g:imported = exported
5275381c7a1SBram Moolenaar      exported += 7
5285381c7a1SBram Moolenaar      g:imported_added = exported
5295381c7a1SBram Moolenaar    enddef
5305381c7a1SBram Moolenaar    ImportInDef()
5315381c7a1SBram Moolenaar  END
5325381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5335381c7a1SBram Moolenaar  source Ximport2.vim
5345381c7a1SBram Moolenaar  " TODO: this should be 9879
5355381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5365381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5375381c7a1SBram Moolenaar  unlet g:imported
5385381c7a1SBram Moolenaar  unlet g:imported_added
5395381c7a1SBram Moolenaar  delete('Ximport2.vim')
5405381c7a1SBram Moolenaar
541f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
542f2d5c240SBram Moolenaar    vim9script
543f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
544f2d5c240SBram Moolenaar    def UseExport()
545f2d5c240SBram Moolenaar      g:imported = Export.exported
546f2d5c240SBram Moolenaar    enddef
547f2d5c240SBram Moolenaar    UseExport()
548f2d5c240SBram Moolenaar  END
549f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
550f2d5c240SBram Moolenaar  source Ximport.vim
5515381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
552f2d5c240SBram Moolenaar
553599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
554599c89c8SBram Moolenaar    vim9script
555599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
556599c89c8SBram Moolenaar    def Func()
557599c89c8SBram Moolenaar      let dummy = 1
558599c89c8SBram Moolenaar      let imported = Export + dummy
559599c89c8SBram Moolenaar    enddef
560599c89c8SBram Moolenaar  END
561599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
562599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
563599c89c8SBram Moolenaar
564599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
565599c89c8SBram Moolenaar    vim9script
566599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
567599c89c8SBram Moolenaar    def Func()
568599c89c8SBram Moolenaar      let imported = Export . exported
569599c89c8SBram Moolenaar    enddef
570599c89c8SBram Moolenaar  END
571599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
572599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
573599c89c8SBram Moolenaar
574599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
575599c89c8SBram Moolenaar    vim9script
576599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
577599c89c8SBram Moolenaar    def Func()
578599c89c8SBram Moolenaar      let imported = Export.
579599c89c8SBram Moolenaar    enddef
580599c89c8SBram Moolenaar  END
581599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
582599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
583599c89c8SBram Moolenaar
584f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
585f2d5c240SBram Moolenaar    vim9script
586f2d5c240SBram Moolenaar    import * from './Xexport.vim'
587f2d5c240SBram Moolenaar    g:imported = exported
588f2d5c240SBram Moolenaar  END
589f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
590f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
591f2d5c240SBram Moolenaar
592fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
593fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
594fa29c8abSBram Moolenaar    vim9script
595fa29c8abSBram Moolenaar    import name from './Xexport.vim'
596fa29c8abSBram Moolenaar  END
597fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
598fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
599fa29c8abSBram Moolenaar
6005269bd2aSBram Moolenaar  " try to import something that is already defined
6015269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6025269bd2aSBram Moolenaar    vim9script
6035269bd2aSBram Moolenaar    let exported = 'something'
6045269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6055269bd2aSBram Moolenaar  END
6065269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6075269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6085269bd2aSBram Moolenaar
6095269bd2aSBram Moolenaar  " try to import something that is already defined
6105269bd2aSBram Moolenaar  import_already_defined =<< trim END
6115269bd2aSBram Moolenaar    vim9script
6125269bd2aSBram Moolenaar    let exported = 'something'
6135269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6145269bd2aSBram Moolenaar  END
6155269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6165269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6175269bd2aSBram Moolenaar
6185269bd2aSBram Moolenaar  " try to import something that is already defined
6195269bd2aSBram Moolenaar  import_already_defined =<< trim END
6205269bd2aSBram Moolenaar    vim9script
6215269bd2aSBram Moolenaar    let exported = 'something'
6225269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6235269bd2aSBram Moolenaar  END
6245269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6255269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6265269bd2aSBram Moolenaar
627fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
628fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
629fa29c8abSBram Moolenaar    vim9script
630fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
631fa29c8abSBram Moolenaar  END
632fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
633fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
634fa29c8abSBram Moolenaar
635fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
636fa29c8abSBram Moolenaar    vim9script
637fa29c8abSBram Moolenaar    import name './Xexport.vim'
638fa29c8abSBram Moolenaar  END
639fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
640fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
641fa29c8abSBram Moolenaar
642fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
643fa29c8abSBram Moolenaar    vim9script
644fa29c8abSBram Moolenaar    import name from Xexport.vim
645fa29c8abSBram Moolenaar  END
646fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
647fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
648fa29c8abSBram Moolenaar
649fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
650fa29c8abSBram Moolenaar    vim9script
651fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
652fa29c8abSBram Moolenaar  END
653fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
654fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
655fa29c8abSBram Moolenaar
656fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
657fa29c8abSBram Moolenaar    vim9script
658fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
659fa29c8abSBram Moolenaar  END
6605269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
6615269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
662fa29c8abSBram Moolenaar
663f2d5c240SBram Moolenaar  delete('Ximport.vim')
6645269bd2aSBram Moolenaar  delete('Ximport3.vim')
6658a7d6542SBram Moolenaar  delete('Xexport.vim')
6668a7d6542SBram Moolenaar
667750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
668750802b5SBram Moolenaar  set cpo&vi
669750802b5SBram Moolenaar  let cpo_before = &cpo
670750802b5SBram Moolenaar  let lines =<< trim END
671750802b5SBram Moolenaar    vim9script
672750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
673750802b5SBram Moolenaar  END
674750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
675750802b5SBram Moolenaar  source Xvim9_script
676750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
677750802b5SBram Moolenaar  set cpo&vim
678750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
679750802b5SBram Moolenaar  delete('Xvim9_script')
680750802b5SBram Moolenaarenddef
681750802b5SBram Moolenaar
682750802b5SBram Moolenaardef Test_vim9script_fails()
6838a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
6848a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
685750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
686f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
687750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
688750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
689750802b5SBram Moolenaar
690750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
691750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
6928a7d6542SBram Moolenaarenddef
6938a7d6542SBram Moolenaar
6948a7d6542SBram Moolenaardef Test_vim9script_call()
6958a7d6542SBram Moolenaar  let lines =<< trim END
6968a7d6542SBram Moolenaar    vim9script
6978a7d6542SBram Moolenaar    let var = ''
6988a7d6542SBram Moolenaar    def MyFunc(arg: string)
6998a7d6542SBram Moolenaar       var = arg
7008a7d6542SBram Moolenaar    enddef
7018a7d6542SBram Moolenaar    MyFunc('foobar')
7028a7d6542SBram Moolenaar    assert_equal('foobar', var)
7038a7d6542SBram Moolenaar
7048a7d6542SBram Moolenaar    let str = 'barfoo'
7058a7d6542SBram Moolenaar    str->MyFunc()
7068a7d6542SBram Moolenaar    assert_equal('barfoo', var)
7078a7d6542SBram Moolenaar
7088a7d6542SBram Moolenaar    let g:value = 'value'
7098a7d6542SBram Moolenaar    g:value->MyFunc()
7108a7d6542SBram Moolenaar    assert_equal('value', var)
7118a7d6542SBram Moolenaar
7128a7d6542SBram Moolenaar    let listvar = []
7138a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
7148a7d6542SBram Moolenaar       listvar = arg
7158a7d6542SBram Moolenaar    enddef
7168a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
7178a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
7188a7d6542SBram Moolenaar
7198a7d6542SBram Moolenaar    let dictvar = {}
7208a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
7218a7d6542SBram Moolenaar       dictvar = arg
7228a7d6542SBram Moolenaar    enddef
7238a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
7248a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
72533fa29cfSBram Moolenaar    def CompiledDict()
72633fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
72733fa29cfSBram Moolenaar    enddef
72833fa29cfSBram Moolenaar    CompiledDict()
72933fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
73033fa29cfSBram Moolenaar
7318a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
7328a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
7330c6ceaf9SBram Moolenaar
7340c6ceaf9SBram Moolenaar    ('text')->MyFunc()
7350c6ceaf9SBram Moolenaar    assert_equal('text', var)
7360c6ceaf9SBram Moolenaar    ("some")->MyFunc()
7370c6ceaf9SBram Moolenaar    assert_equal('some', var)
7388a7d6542SBram Moolenaar  END
7398a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
7408a7d6542SBram Moolenaar  source Xcall.vim
7418a7d6542SBram Moolenaar  delete('Xcall.vim')
7428a7d6542SBram Moolenaarenddef
7438a7d6542SBram Moolenaar
7448a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
7458a7d6542SBram Moolenaar  let lines =<< trim END
7468a7d6542SBram Moolenaar    vim9script
7478a7d6542SBram Moolenaar    let var = ''
7488a7d6542SBram Moolenaar    def MyFunc(arg: string)
7498a7d6542SBram Moolenaar       let var = 123
7508a7d6542SBram Moolenaar    enddef
7518a7d6542SBram Moolenaar  END
7528a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
7538a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
7548a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
7558a7d6542SBram Moolenaarenddef
7568a7d6542SBram Moolenaar
7578a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
7588a7d6542SBram Moolenaar  let lines =<< trim END
7598a7d6542SBram Moolenaar    vim9script
7608a7d6542SBram Moolenaar    const var = ''
7618a7d6542SBram Moolenaar    def MyFunc(arg: string)
7628a7d6542SBram Moolenaar       var = 'asdf'
7638a7d6542SBram Moolenaar    enddef
7648a7d6542SBram Moolenaar  END
7658a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
7668a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
7678a7d6542SBram Moolenaar  delete('Xcall_const.vim')
7688a7d6542SBram Moolenaarenddef
7698a7d6542SBram Moolenaar
7708a7d6542SBram Moolenaardef Test_vim9script_reload()
7718a7d6542SBram Moolenaar  let lines =<< trim END
7728a7d6542SBram Moolenaar    vim9script
7738a7d6542SBram Moolenaar    const var = ''
7748a7d6542SBram Moolenaar    let valone = 1234
7758a7d6542SBram Moolenaar    def MyFunc(arg: string)
7768a7d6542SBram Moolenaar       valone = 5678
7778a7d6542SBram Moolenaar    enddef
7788a7d6542SBram Moolenaar  END
7798a7d6542SBram Moolenaar  let morelines =<< trim END
7808a7d6542SBram Moolenaar    let valtwo = 222
7818a7d6542SBram Moolenaar    export def GetValtwo(): number
7828a7d6542SBram Moolenaar      return valtwo
7838a7d6542SBram Moolenaar    enddef
7848a7d6542SBram Moolenaar  END
7858a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7868a7d6542SBram Moolenaar  source Xreload.vim
7878a7d6542SBram Moolenaar  source Xreload.vim
7888a7d6542SBram Moolenaar  source Xreload.vim
7898a7d6542SBram Moolenaar
7908a7d6542SBram Moolenaar  let testlines =<< trim END
7918a7d6542SBram Moolenaar    vim9script
7928a7d6542SBram Moolenaar    def TheFunc()
7938a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
7948a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
7958a7d6542SBram Moolenaar    enddef
7968a7d6542SBram Moolenaar    TheFunc()
7978a7d6542SBram Moolenaar  END
7988a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
7998a7d6542SBram Moolenaar  source Ximport.vim
8008a7d6542SBram Moolenaar
8018a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
8028a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
8038a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8048a7d6542SBram Moolenaar  source Xreload.vim
8058a7d6542SBram Moolenaar  source Ximport.vim
8068a7d6542SBram Moolenaar
8078a7d6542SBram Moolenaar  " cannot declare a var twice
8088a7d6542SBram Moolenaar  lines =<< trim END
8098a7d6542SBram Moolenaar    vim9script
8108a7d6542SBram Moolenaar    let valone = 1234
8118a7d6542SBram Moolenaar    let valone = 5678
8128a7d6542SBram Moolenaar  END
8138a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8148a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8158a7d6542SBram Moolenaar
8168a7d6542SBram Moolenaar  delete('Xreload.vim')
8178a7d6542SBram Moolenaar  delete('Ximport.vim')
8188a7d6542SBram Moolenaarenddef
8198a7d6542SBram Moolenaar
8208a7d6542SBram Moolenaardef Test_import_absolute()
8218a7d6542SBram Moolenaar  let import_lines = [
8228a7d6542SBram Moolenaar        \ 'vim9script',
8238a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
824b283a8a6SBram Moolenaar        \ 'def UseExported()',
8258a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
8264e12a5dfSBram Moolenaar        \ '  exported = 8888',
8274e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
828b283a8a6SBram Moolenaar        \ 'enddef',
829b283a8a6SBram Moolenaar        \ 'UseExported()',
8304e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
8318a7d6542SBram Moolenaar        \ ]
8328a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8338a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8348a7d6542SBram Moolenaar
8358a7d6542SBram Moolenaar  source Ximport_abs.vim
8368a7d6542SBram Moolenaar
8378a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8384e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
839b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
840b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
841b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8424e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
8434e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
8444e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
8454e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
8464e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8474e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
8484e12a5dfSBram Moolenaar        \, g:import_disassembled)
8498a7d6542SBram Moolenaar  unlet g:imported_abs
8504e12a5dfSBram Moolenaar  unlet g:import_disassembled
8518a7d6542SBram Moolenaar
8528a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8538a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8548a7d6542SBram Moolenaarenddef
8558a7d6542SBram Moolenaar
8568a7d6542SBram Moolenaardef Test_import_rtp()
8578a7d6542SBram Moolenaar  let import_lines = [
8588a7d6542SBram Moolenaar        \ 'vim9script',
8598a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
8608a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
8618a7d6542SBram Moolenaar        \ ]
8628a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
8638a7d6542SBram Moolenaar  mkdir('import')
8648a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
8658a7d6542SBram Moolenaar
8668a7d6542SBram Moolenaar  let save_rtp = &rtp
8678a7d6542SBram Moolenaar  &rtp = getcwd()
8688a7d6542SBram Moolenaar  source Ximport_rtp.vim
8698a7d6542SBram Moolenaar  &rtp = save_rtp
8708a7d6542SBram Moolenaar
8718a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
8728a7d6542SBram Moolenaar  unlet g:imported_rtp
8738a7d6542SBram Moolenaar
8748a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
8758a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
8768a7d6542SBram Moolenaar  delete('import', 'd')
8778a7d6542SBram Moolenaarenddef
8788a7d6542SBram Moolenaar
8798a7d6542SBram Moolenaardef Test_fixed_size_list()
8808a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
8818a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
8828a7d6542SBram Moolenaar  l->remove(0)
8838a7d6542SBram Moolenaar  l->add(5)
8848a7d6542SBram Moolenaar  l->insert(99, 1)
8850f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
8868a7d6542SBram Moolenaarenddef
8878a7d6542SBram Moolenaar
888673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
889673660abSBram Moolenaar" recognized.
890673660abSBram Moolenaarfunc Test_function_python()
891673660abSBram Moolenaar  CheckFeature python3
892673660abSBram Moolenaar  let py = 'python3'
893673660abSBram Moolenaar  execute py "<< EOF"
894673660abSBram Moolenaardef do_something():
895673660abSBram Moolenaar  return 1
896673660abSBram MoolenaarEOF
897673660abSBram Moolenaarendfunc
898673660abSBram Moolenaar
899158906cfSBram Moolenaardef IfElse(what: number): string
900158906cfSBram Moolenaar  let res = ''
901158906cfSBram Moolenaar  if what == 1
902158906cfSBram Moolenaar    res = "one"
903158906cfSBram Moolenaar  elseif what == 2
904158906cfSBram Moolenaar    res = "two"
905a259d8d3SBram Moolenaar  else
906158906cfSBram Moolenaar    res = "three"
907a259d8d3SBram Moolenaar  endif
908158906cfSBram Moolenaar  return res
909a259d8d3SBram Moolenaarenddef
910a259d8d3SBram Moolenaar
911158906cfSBram Moolenaardef Test_if_elseif_else()
912158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
913158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
914158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
9150f18b6d1SBram Moolenaarenddef
9160f18b6d1SBram Moolenaar
9176d69bf60SBram Moolenaarlet g:bool_true = v:true
9186d69bf60SBram Moolenaarlet g:bool_false = v:false
9196d69bf60SBram Moolenaar
9206d69bf60SBram Moolenaardef Test_if_const_expr()
9216d69bf60SBram Moolenaar  let res = false
9226d69bf60SBram Moolenaar  if true ? true : false
9236d69bf60SBram Moolenaar    res = true
9246d69bf60SBram Moolenaar  endif
9256d69bf60SBram Moolenaar  assert_equal(true, res)
9266d69bf60SBram Moolenaar
9276d69bf60SBram Moolenaar  res = false
9286d69bf60SBram Moolenaar  if g:bool_true ? true : false
9296d69bf60SBram Moolenaar    res = true
9306d69bf60SBram Moolenaar  endif
9316d69bf60SBram Moolenaar  assert_equal(true, res)
9326d69bf60SBram Moolenaar
9336d69bf60SBram Moolenaar  res = false
9346d69bf60SBram Moolenaar  if true ? g:bool_true : false
9356d69bf60SBram Moolenaar    res = true
9366d69bf60SBram Moolenaar  endif
9376d69bf60SBram Moolenaar  assert_equal(true, res)
9386d69bf60SBram Moolenaar
9396d69bf60SBram Moolenaar  res = false
9406d69bf60SBram Moolenaar  if true ? true : g:bool_false
9416d69bf60SBram Moolenaar    res = true
9426d69bf60SBram Moolenaar  endif
9436d69bf60SBram Moolenaar  assert_equal(true, res)
9446d69bf60SBram Moolenaar
9456d69bf60SBram Moolenaar  res = false
9466d69bf60SBram Moolenaar  if true ? false : true
9476d69bf60SBram Moolenaar    res = true
9486d69bf60SBram Moolenaar  endif
9496d69bf60SBram Moolenaar  assert_equal(false, res)
9506d69bf60SBram Moolenaar
9516d69bf60SBram Moolenaar  res = false
9526d69bf60SBram Moolenaar  if false ? false : true
9536d69bf60SBram Moolenaar    res = true
9546d69bf60SBram Moolenaar  endif
9556d69bf60SBram Moolenaar  assert_equal(true, res)
9566d69bf60SBram Moolenaar
9576d69bf60SBram Moolenaar  res = false
9586d69bf60SBram Moolenaar  if false ? true : false
9596d69bf60SBram Moolenaar    res = true
9606d69bf60SBram Moolenaar  endif
9616d69bf60SBram Moolenaar  assert_equal(false, res)
9626d69bf60SBram Moolenaar
9636d69bf60SBram Moolenaar  res = false
9646d69bf60SBram Moolenaar  if true && true
9656d69bf60SBram Moolenaar    res = true
9666d69bf60SBram Moolenaar  endif
9676d69bf60SBram Moolenaar  assert_equal(true, res)
9686d69bf60SBram Moolenaar
9696d69bf60SBram Moolenaar  res = false
9706d69bf60SBram Moolenaar  if true && false
9716d69bf60SBram Moolenaar    res = true
9726d69bf60SBram Moolenaar  endif
9736d69bf60SBram Moolenaar  assert_equal(false, res)
9746d69bf60SBram Moolenaar
9756d69bf60SBram Moolenaar  res = false
9766d69bf60SBram Moolenaar  if g:bool_true && false
9776d69bf60SBram Moolenaar    res = true
9786d69bf60SBram Moolenaar  endif
9796d69bf60SBram Moolenaar  assert_equal(false, res)
9806d69bf60SBram Moolenaar
9816d69bf60SBram Moolenaar  res = false
9826d69bf60SBram Moolenaar  if true && g:bool_false
9836d69bf60SBram Moolenaar    res = true
9846d69bf60SBram Moolenaar  endif
9856d69bf60SBram Moolenaar  assert_equal(false, res)
9866d69bf60SBram Moolenaar
9876d69bf60SBram Moolenaar  res = false
9886d69bf60SBram Moolenaar  if false && false
9896d69bf60SBram Moolenaar    res = true
9906d69bf60SBram Moolenaar  endif
9916d69bf60SBram Moolenaar  assert_equal(false, res)
9926d69bf60SBram Moolenaar
9936d69bf60SBram Moolenaar  res = false
9946d69bf60SBram Moolenaar  if true || false
9956d69bf60SBram Moolenaar    res = true
9966d69bf60SBram Moolenaar  endif
9976d69bf60SBram Moolenaar  assert_equal(true, res)
9986d69bf60SBram Moolenaar
9996d69bf60SBram Moolenaar  res = false
10006d69bf60SBram Moolenaar  if g:bool_true || false
10016d69bf60SBram Moolenaar    res = true
10026d69bf60SBram Moolenaar  endif
10036d69bf60SBram Moolenaar  assert_equal(true, res)
10046d69bf60SBram Moolenaar
10056d69bf60SBram Moolenaar  res = false
10066d69bf60SBram Moolenaar  if true || g:bool_false
10076d69bf60SBram Moolenaar    res = true
10086d69bf60SBram Moolenaar  endif
10096d69bf60SBram Moolenaar  assert_equal(true, res)
10106d69bf60SBram Moolenaar
10116d69bf60SBram Moolenaar  res = false
10126d69bf60SBram Moolenaar  if false || false
10136d69bf60SBram Moolenaar    res = true
10146d69bf60SBram Moolenaar  endif
10156d69bf60SBram Moolenaar  assert_equal(false, res)
10166d69bf60SBram Moolenaar
10176d69bf60SBram Moolenaarenddef
10186d69bf60SBram Moolenaar
101963ce4849SBram Moolenaardef Test_delfunc()
102063ce4849SBram Moolenaar  let lines =<< trim END
102163ce4849SBram Moolenaar    vim9script
102263ce4849SBram Moolenaar    def GoneSoon()
102363ce4849SBram Moolenaar      echo 'hello'
102463ce4849SBram Moolenaar    enddef
102563ce4849SBram Moolenaar
102663ce4849SBram Moolenaar    def CallGoneSoon()
102763ce4849SBram Moolenaar      GoneSoon()
102863ce4849SBram Moolenaar    enddef
102963ce4849SBram Moolenaar
103063ce4849SBram Moolenaar    delfunc GoneSoon
103163ce4849SBram Moolenaar    CallGoneSoon()
103263ce4849SBram Moolenaar  END
103363ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
103463ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
103563ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
103663ce4849SBram Moolenaar
103763ce4849SBram Moolenaar  delete('XToDelFunc')
103863ce4849SBram Moolenaarenddef
103963ce4849SBram Moolenaar
1040ad39c094SBram Moolenaardef Test_execute_cmd()
1041ad39c094SBram Moolenaar  new
1042ad39c094SBram Moolenaar  setline(1, 'default')
1043ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1044ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1045ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1046ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1047ad39c094SBram Moolenaar  execute cmd1 cmd2
1048ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1049ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1050ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1051ad39c094SBram Moolenaar  let cmd_first = 'call '
1052ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1053ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1054ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1055ad39c094SBram Moolenaar  bwipe!
1056ad39c094SBram Moolenaarenddef
1057ad39c094SBram Moolenaar
1058ad39c094SBram Moolenaardef Test_echo_cmd()
1059ad39c094SBram Moolenaar  echo 'something'
1060ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1061ad39c094SBram Moolenaar
1062ad39c094SBram Moolenaar  let str1 = 'some'
1063ad39c094SBram Moolenaar  let str2 = 'more'
1064ad39c094SBram Moolenaar  echo str1 str2
1065ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1066ad39c094SBram Moolenaarenddef
1067ad39c094SBram Moolenaar
106841fe0617SBram Moolenaardef Test_for_outside_of_function()
106941fe0617SBram Moolenaar  let lines =<< trim END
107041fe0617SBram Moolenaar    vim9script
107141fe0617SBram Moolenaar    new
107241fe0617SBram Moolenaar    for var in range(0, 3)
107341fe0617SBram Moolenaar      append(line('$'), var)
107441fe0617SBram Moolenaar    endfor
107541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
107641fe0617SBram Moolenaar    bwipe!
107741fe0617SBram Moolenaar  END
107841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
107941fe0617SBram Moolenaar  source Xvim9for.vim
108041fe0617SBram Moolenaar  delete('Xvim9for.vim')
108141fe0617SBram Moolenaarenddef
10828a7d6542SBram Moolenaar
1083d0df1aacSBram Moolenaardef Test_while_loop()
1084d0df1aacSBram Moolenaar  let result = ''
1085d0df1aacSBram Moolenaar  let cnt = 0
1086d0df1aacSBram Moolenaar  while cnt < 555
1087d0df1aacSBram Moolenaar    if cnt == 3
1088d0df1aacSBram Moolenaar      break
1089d0df1aacSBram Moolenaar    endif
1090d0df1aacSBram Moolenaar    cnt += 1
1091d0df1aacSBram Moolenaar    if cnt == 2
1092d0df1aacSBram Moolenaar      continue
1093d0df1aacSBram Moolenaar    endif
1094d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1095d0df1aacSBram Moolenaar  endwhile
1096d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1097d0df1aacSBram Moolenaarenddef
1098d0df1aacSBram Moolenaar
1099bd5da371SBram Moolenaardef Test_for_loop_fails()
1100bd5da371SBram Moolenaar  call CheckDefFailure(['for # in range(5)'], 'E690:')
1101bd5da371SBram Moolenaar  call CheckDefFailure(['for i In range(5)'], 'E690:')
1102bd5da371SBram Moolenaar  call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1103bd5da371SBram Moolenaar  call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1104bd5da371SBram Moolenaar  call CheckDefFailure(['for i in "text"'], 'E1024:')
1105bd5da371SBram Moolenaarenddef
1106bd5da371SBram Moolenaar
11079645e2d9SBram Moolenaardef Test_interrupt_loop()
110897acfc78SBram Moolenaar  let caught = false
11099645e2d9SBram Moolenaar  let x = 0
111097acfc78SBram Moolenaar  try
11119645e2d9SBram Moolenaar    while 1
11129645e2d9SBram Moolenaar      x += 1
11139645e2d9SBram Moolenaar      if x == 100
11149645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
11159645e2d9SBram Moolenaar      endif
11169645e2d9SBram Moolenaar    endwhile
111797acfc78SBram Moolenaar  catch
111897acfc78SBram Moolenaar    caught = true
111997acfc78SBram Moolenaar    assert_equal(100, x)
112097acfc78SBram Moolenaar  endtry
112197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
11229645e2d9SBram Moolenaarenddef
112320431c9dSBram Moolenaar
1124d0df1aacSBram Moolenaardef Test_substitute_cmd()
1125d0df1aacSBram Moolenaar  new
1126d0df1aacSBram Moolenaar  setline(1, 'something')
1127d0df1aacSBram Moolenaar  :substitute(some(other(
1128d0df1aacSBram Moolenaar  assert_equal('otherthing', getline(1))
1129d0df1aacSBram Moolenaar  bwipe!
1130d0df1aacSBram Moolenaar
1131d0df1aacSBram Moolenaar  " also when the context is Vim9 script
1132d0df1aacSBram Moolenaar  let lines =<< trim END
1133d0df1aacSBram Moolenaar    vim9script
1134d0df1aacSBram Moolenaar    new
1135d0df1aacSBram Moolenaar    setline(1, 'something')
1136d0df1aacSBram Moolenaar    :substitute(some(other(
1137d0df1aacSBram Moolenaar    assert_equal('otherthing', getline(1))
1138d0df1aacSBram Moolenaar    bwipe!
1139d0df1aacSBram Moolenaar  END
1140d0df1aacSBram Moolenaar  writefile(lines, 'Xvim9lines')
1141d0df1aacSBram Moolenaar  source Xvim9lines
1142d0df1aacSBram Moolenaar
1143d0df1aacSBram Moolenaar  delete('Xvim9lines')
1144d0df1aacSBram Moolenaarenddef
1145d0df1aacSBram Moolenaar
114620431c9dSBram Moolenaardef Test_redef_failure()
114720431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
114820431c9dSBram Moolenaar  so Xdef
114920431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
115020431c9dSBram Moolenaar  so Xdef
115120431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
115220431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
115320431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
115420431c9dSBram Moolenaar  so Xdef
115520431c9dSBram Moolenaar  call delete('Xdef')
115620431c9dSBram Moolenaar
115720431c9dSBram Moolenaar  call assert_equal(0, Func0())
115820431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
115920431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
116020431c9dSBram Moolenaar
116120431c9dSBram Moolenaar  delfunc! Func0
116220431c9dSBram Moolenaar  delfunc! Func1
116320431c9dSBram Moolenaar  delfunc! Func2
116420431c9dSBram Moolenaarenddef
116520431c9dSBram Moolenaar
11667d941ee0SBram Moolenaar" Test for internal functions returning different types
11677d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
11687d941ee0SBram Moolenaar  let lines =<< trim END
11697d941ee0SBram Moolenaar    def RetFloat(): float
11707d941ee0SBram Moolenaar      return ceil(1.456)
11717d941ee0SBram Moolenaar    enddef
11727d941ee0SBram Moolenaar
11737d941ee0SBram Moolenaar    def RetListAny(): list<any>
11747d941ee0SBram Moolenaar      return items({'k' : 'v'})
11757d941ee0SBram Moolenaar    enddef
11767d941ee0SBram Moolenaar
11777d941ee0SBram Moolenaar    def RetListString(): list<string>
11787d941ee0SBram Moolenaar      return split('a:b:c', ':')
11797d941ee0SBram Moolenaar    enddef
11807d941ee0SBram Moolenaar
11817d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
11827d941ee0SBram Moolenaar      return getbufinfo()
11837d941ee0SBram Moolenaar    enddef
11847d941ee0SBram Moolenaar
11857d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
11867d941ee0SBram Moolenaar      return wordcount()
11877d941ee0SBram Moolenaar    enddef
11887d941ee0SBram Moolenaar
11897d941ee0SBram Moolenaar    def RetDictString(): dict<string>
11907d941ee0SBram Moolenaar      return environ()
11917d941ee0SBram Moolenaar    enddef
11927d941ee0SBram Moolenaar  END
11937d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
11947d941ee0SBram Moolenaar  source Xscript
11957d941ee0SBram Moolenaar
11967d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
11977d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
11987d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
11997d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
12007d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
12017d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
12027d941ee0SBram Moolenaar  call delete('Xscript')
12037d941ee0SBram Moolenaarendfunc
12047d941ee0SBram Moolenaar
12057d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
12067d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
12077d941ee0SBram Moolenaar  let l =<< trim END
12087d941ee0SBram Moolenaar    def! FArgErr(): float
12097d941ee0SBram Moolenaar      return ceil(1.1, 2)
12107d941ee0SBram Moolenaar    enddef
12117d941ee0SBram Moolenaar  END
12127d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12137d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
12147d941ee0SBram Moolenaar  let l =<< trim END
12157d941ee0SBram Moolenaar    def! FArgErr(): float
12167d941ee0SBram Moolenaar      return ceil()
12177d941ee0SBram Moolenaar    enddef
12187d941ee0SBram Moolenaar  END
12197d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12207d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
12217d941ee0SBram Moolenaar  call delete('Xinvalidarg')
12227d941ee0SBram Moolenaarendfunc
12237d941ee0SBram Moolenaar
12248a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1225