18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5673660abSBram Moolenaar
68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
8978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
98a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
108a7d6542SBram Moolenaar  call delete('Xdef')
118a7d6542SBram Moolenaarendfunc
128a7d6542SBram Moolenaar
138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
148a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
158a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
168a7d6542SBram Moolenaar  call delete('Xdef')
178a7d6542SBram Moolenaarendfunc
188a7d6542SBram Moolenaar
198a7d6542SBram Moolenaardef Test_syntax()
208a7d6542SBram Moolenaar  let var = 234
218a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
228a7d6542SBram Moolenaarenddef
238a7d6542SBram Moolenaar
248a7d6542SBram Moolenaarfunc Test_def_basic()
258a7d6542SBram Moolenaar  def SomeFunc(): string
268a7d6542SBram Moolenaar    return 'yes'
278a7d6542SBram Moolenaar  enddef
288a7d6542SBram Moolenaar  call assert_equal('yes', SomeFunc())
298a7d6542SBram Moolenaarendfunc
308a7d6542SBram Moolenaar
316e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
326e587dcbSBram Moolenaarlet s:addToMe = 111
33401d9ffbSBram Moolenaarlet g:existing = 'yes'
34a8c17704SBram Moolenaarlet g:inc_counter = 1
35a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
366e587dcbSBram Moolenaar
378a7d6542SBram Moolenaardef Test_assignment()
388a7d6542SBram Moolenaar  let bool1: bool = true
398a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
408a7d6542SBram Moolenaar  let bool2: bool = false
418a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
428a7d6542SBram Moolenaar
430c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
448a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
450c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
460c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
470c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
488a7d6542SBram Moolenaar
49436472f5SBram Moolenaar  let listS: list<string> = []
50436472f5SBram Moolenaar  let listN: list<number> = []
518a7d6542SBram Moolenaar
520c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
538a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
540c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
550c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
560c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
57b283a8a6SBram Moolenaar
589be61bbbSBram Moolenaar  let a: number = 6
599be61bbbSBram Moolenaar  assert_equal(6, a)
609be61bbbSBram Moolenaar
6142a480bfSBram Moolenaar  if has('channel')
6242a480bfSBram Moolenaar    let chan1: channel
63fbdd08edSBram Moolenaar    let job1: job
64f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6542a480bfSBram Moolenaar  endif
66fbdd08edSBram Moolenaar  if has('float')
67fbdd08edSBram Moolenaar    let float1: float = 3.4
68fbdd08edSBram Moolenaar  endif
69087d2e15SBram Moolenaar  let funky1: func
70087d2e15SBram Moolenaar  let funky2: func = function('len')
71087d2e15SBram Moolenaar  let party1: partial
72087d2e15SBram Moolenaar  let party2: partial = funcref('Test_syntax')
7342a480bfSBram Moolenaar
7461a6d4e4SBram Moolenaar  " type becomes list<any>
7561a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
765381c7a1SBram Moolenaar  " type becomes dict<any>
775381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7861a6d4e4SBram Moolenaar
79401d9ffbSBram Moolenaar  g:newvar = 'new'
80401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
81401d9ffbSBram Moolenaar
82401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
83401d9ffbSBram Moolenaar  g:existing = 'no'
84401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
85401d9ffbSBram Moolenaar
86b283a8a6SBram Moolenaar  v:char = 'abc'
876e587dcbSBram Moolenaar  assert_equal('abc', v:char)
88b283a8a6SBram Moolenaar
89b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
906e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
91b283a8a6SBram Moolenaar  $ENVVAR = ''
926e587dcbSBram Moolenaar
93fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
94fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
95fd1823e0SBram Moolenaar  s:addToMe += 222
96fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
970bbf722aSBram Moolenaar  s:newVar = 'new'
980bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
99a8c17704SBram Moolenaar
100a8c17704SBram Moolenaar  set ts=7
101a8c17704SBram Moolenaar  &ts += 1
102a8c17704SBram Moolenaar  assert_equal(8, &ts)
10380c34ca3SBram Moolenaar  &ts -= 3
10480c34ca3SBram Moolenaar  assert_equal(5, &ts)
10580c34ca3SBram Moolenaar  &ts *= 2
10680c34ca3SBram Moolenaar  assert_equal(10, &ts)
10780c34ca3SBram Moolenaar  &ts /= 3
10880c34ca3SBram Moolenaar  assert_equal(3, &ts)
10980c34ca3SBram Moolenaar  set ts=10
11080c34ca3SBram Moolenaar  &ts %= 4
11180c34ca3SBram Moolenaar  assert_equal(2, &ts)
112a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
113a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
114a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
11580c34ca3SBram Moolenaar  &ts = 8
116a8c17704SBram Moolenaar
117a8c17704SBram Moolenaar  g:inc_counter += 1
118a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
119a8c17704SBram Moolenaar
120a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
121a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
122a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
123a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
124a8c17704SBram Moolenaar
125a8c17704SBram Moolenaar  @a = 'areg'
126a8c17704SBram Moolenaar  @a ..= 'add'
127a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
128a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
129a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
130e69f6d04SBram Moolenaar
131e69f6d04SBram Moolenaar  v:errmsg = 'none'
132e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
133e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
134e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
135e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
136e69f6d04SBram Moolenaar
137e69f6d04SBram Moolenaar  " Test default values.
138e69f6d04SBram Moolenaar  let thebool: bool
139e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
140e69f6d04SBram Moolenaar
141e69f6d04SBram Moolenaar  let thenumber: number
142e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
143e69f6d04SBram Moolenaar
144e69f6d04SBram Moolenaar  if has('float')
145e69f6d04SBram Moolenaar    let thefloat: float
146e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
147e69f6d04SBram Moolenaar  endif
148e69f6d04SBram Moolenaar
149e69f6d04SBram Moolenaar  let thestring: string
150e69f6d04SBram Moolenaar  assert_equal('', thestring)
151e69f6d04SBram Moolenaar
152e69f6d04SBram Moolenaar  let theblob: blob
153e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
154e69f6d04SBram Moolenaar
155e69f6d04SBram Moolenaar  let thefunc: func
156e69f6d04SBram Moolenaar  assert_equal(test_null_function(), thefunc)
157e69f6d04SBram Moolenaar
158e69f6d04SBram Moolenaar  let thepartial: partial
159e69f6d04SBram Moolenaar  assert_equal(test_null_partial(), thepartial)
160e69f6d04SBram Moolenaar
161e69f6d04SBram Moolenaar  let thelist: list<any>
162e69f6d04SBram Moolenaar  assert_equal([], thelist)
163e69f6d04SBram Moolenaar
164e69f6d04SBram Moolenaar  let thedict: dict<any>
165e69f6d04SBram Moolenaar  assert_equal({}, thedict)
166e69f6d04SBram Moolenaar
1672c869deeSBram Moolenaar  if has('channel')
168e69f6d04SBram Moolenaar    let thejob: job
169e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
170e69f6d04SBram Moolenaar
171e69f6d04SBram Moolenaar    let thechannel: channel
172e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
1732c869deeSBram Moolenaar  endif
1748a7d6542SBram Moolenaarenddef
1758a7d6542SBram Moolenaar
1768a7d6542SBram Moolenaarfunc Test_assignment_failure()
1778a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1788a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1798a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1808a7d6542SBram Moolenaar
1818a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1828a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1838a7d6542SBram Moolenaar
1849be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1859be61bbbSBram Moolenaar
186e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1879be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1889be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1899be61bbbSBram Moolenaar
1909be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1919be61bbbSBram Moolenaar
1929be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1939be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1949be61bbbSBram Moolenaar
1959be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
1969be61bbbSBram Moolenaar
1979be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
1989be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
1999be61bbbSBram Moolenaar
20033fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
20133fa29cfSBram Moolenaar
2028a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2038a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2048a7d6542SBram Moolenaar
2058a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2068a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2078a7d6542SBram Moolenaar
2088a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2098a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
21042a480bfSBram Moolenaar
21142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
21242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
213599c89c8SBram Moolenaarendfunc
214599c89c8SBram Moolenaar
215599c89c8SBram Moolenaarfunc Test_wrong_type()
216599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
217599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
218599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
219599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
220599c89c8SBram Moolenaar
221599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
222599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
22342a480bfSBram Moolenaar
22442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
22542a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
22642a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
22742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
22842a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
22942a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
23042a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
23142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
23242a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
23342a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
23442a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2358a7d6542SBram Moolenaarendfunc
2368a7d6542SBram Moolenaar
2378a7d6542SBram Moolenaarfunc Test_const()
2388a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2398a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2408a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2419be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2428a7d6542SBram Moolenaarendfunc
2438a7d6542SBram Moolenaar
2448a7d6542SBram Moolenaardef Test_block()
2458a7d6542SBram Moolenaar  let outer = 1
2468a7d6542SBram Moolenaar  {
2478a7d6542SBram Moolenaar    let inner = 2
2488a7d6542SBram Moolenaar    assert_equal(1, outer)
2498a7d6542SBram Moolenaar    assert_equal(2, inner)
2508a7d6542SBram Moolenaar  }
2518a7d6542SBram Moolenaar  assert_equal(1, outer)
2528a7d6542SBram Moolenaarenddef
2538a7d6542SBram Moolenaar
2548a7d6542SBram Moolenaarfunc Test_block_failure()
2558a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
2568a7d6542SBram Moolenaarendfunc
2578a7d6542SBram Moolenaar
2588a7d6542SBram Moolenaardef ReturnString(): string
2598a7d6542SBram Moolenaar  return 'string'
2608a7d6542SBram Moolenaarenddef
2618a7d6542SBram Moolenaar
2628a7d6542SBram Moolenaardef ReturnNumber(): number
2638a7d6542SBram Moolenaar  return 123
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
26609f28f49SBram Moolenaarlet g:notNumber = 'string'
26709f28f49SBram Moolenaar
26809f28f49SBram Moolenaardef ReturnGlobal(): number
26909f28f49SBram Moolenaar  return g:notNumber
27009f28f49SBram Moolenaarenddef
27109f28f49SBram Moolenaar
2729be61bbbSBram Moolenaardef Test_return_something()
2738a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
2748a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
27509f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
2768a7d6542SBram Moolenaarenddef
2778a7d6542SBram Moolenaar
2789be61bbbSBram Moolenaarlet s:nothing = 0
2799be61bbbSBram Moolenaardef ReturnNothing()
2809be61bbbSBram Moolenaar  s:nothing = 1
2819be61bbbSBram Moolenaar  if true
2829be61bbbSBram Moolenaar    return
2839be61bbbSBram Moolenaar  endif
2849be61bbbSBram Moolenaar  s:nothing = 2
2859be61bbbSBram Moolenaarenddef
2869be61bbbSBram Moolenaar
2879be61bbbSBram Moolenaardef Test_return_nothing()
2889be61bbbSBram Moolenaar  ReturnNothing()
2899be61bbbSBram Moolenaar  assert_equal(1, s:nothing)
2909be61bbbSBram Moolenaarenddef
2919be61bbbSBram Moolenaar
2928a7d6542SBram Moolenaarfunc Increment()
2938a7d6542SBram Moolenaar  let g:counter += 1
2948a7d6542SBram Moolenaarendfunc
2958a7d6542SBram Moolenaar
2968a7d6542SBram Moolenaardef Test_call_ufunc_count()
2978a7d6542SBram Moolenaar  g:counter = 1
2988a7d6542SBram Moolenaar  Increment()
2998a7d6542SBram Moolenaar  Increment()
3008a7d6542SBram Moolenaar  Increment()
3018a7d6542SBram Moolenaar  " works with and without :call
3028a7d6542SBram Moolenaar  assert_equal(4, g:counter)
303b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
3048a7d6542SBram Moolenaar  unlet g:counter
3058a7d6542SBram Moolenaarenddef
3068a7d6542SBram Moolenaar
3078a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
3088a7d6542SBram Moolenaar  let res = arg
3098a7d6542SBram Moolenaar  for s in rest
3108a7d6542SBram Moolenaar    res ..= ',' .. s
3118a7d6542SBram Moolenaar  endfor
3128a7d6542SBram Moolenaar  return res
3138a7d6542SBram Moolenaarenddef
3148a7d6542SBram Moolenaar
3158a7d6542SBram Moolenaardef Test_call_varargs()
3168a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
3178a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
3188a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
3198a7d6542SBram Moolenaarenddef
3208a7d6542SBram Moolenaar
321170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
322170fcfcfSBram Moolenaar  return name
323170fcfcfSBram Moolenaarenddef
324170fcfcfSBram Moolenaar
325170fcfcfSBram Moolenaardef Test_call_default_args()
326170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
327170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
328170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
329170fcfcfSBram Moolenaarenddef
330170fcfcfSBram Moolenaar
331170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
332170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
333170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
334170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
335170fcfcfSBram Moolenaarendfunc
336170fcfcfSBram Moolenaar
337b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
338b35efa5eSBram Moolenaar  echo a:arg
339b35efa5eSBram Moolenaarendfunc
340b35efa5eSBram Moolenaar
341bd5da371SBram Moolenaardef Test_call_wrong_args()
342b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
343b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
344bd5da371SBram Moolenaar  call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
345b35efa5eSBram Moolenaarenddef
346b35efa5eSBram Moolenaar
347170fcfcfSBram Moolenaar" Default arg and varargs
348170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
349170fcfcfSBram Moolenaar  let res = one .. ',' .. two
350170fcfcfSBram Moolenaar  for s in rest
351170fcfcfSBram Moolenaar    res ..= ',' .. s
352170fcfcfSBram Moolenaar  endfor
353170fcfcfSBram Moolenaar  return res
354170fcfcfSBram Moolenaarenddef
355170fcfcfSBram Moolenaar
356170fcfcfSBram Moolenaardef Test_call_def_varargs()
357170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
358170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
359170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
360170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
361170fcfcfSBram Moolenaarenddef
362170fcfcfSBram Moolenaar
36342a480bfSBram Moolenaardef Test_using_var_as_arg()
36442a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
36542a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
36642a480bfSBram Moolenaar  call delete('Xdef')
36742a480bfSBram Moolenaarenddef
36842a480bfSBram Moolenaar
369b35efa5eSBram Moolenaardef Test_call_func_defined_later()
370b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
371b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
372b35efa5eSBram Moolenaarenddef
373170fcfcfSBram Moolenaar
374b35efa5eSBram Moolenaarfunc DefinedLater(arg)
37526e117e9SBram Moolenaar  return a:arg
37626e117e9SBram Moolenaarendfunc
37726e117e9SBram Moolenaar
3787eeefd4aSBram Moolenaardef FuncWithForwardCall()
3797eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
3807eeefd4aSBram Moolenaarenddef
3817eeefd4aSBram Moolenaar
3827eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
3837eeefd4aSBram Moolenaar  return arg
3847eeefd4aSBram Moolenaarenddef
3857eeefd4aSBram Moolenaar
3867eeefd4aSBram Moolenaardef Test_error_in_nested_function()
3877eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
3887eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
3897eeefd4aSBram Moolenaarenddef
3907eeefd4aSBram Moolenaar
3918a7d6542SBram Moolenaardef Test_return_type_wrong()
392978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
393978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
394978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
395978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
396cf3f8bf4SBram Moolenaar
3979be61bbbSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
3989be61bbbSBram Moolenaar
399cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
400cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
4018a7d6542SBram Moolenaarenddef
4028a7d6542SBram Moolenaar
403bfe12043SBram Moolenaardef Test_arg_type_wrong()
404bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
405bfe12043SBram Moolenaarenddef
406bfe12043SBram Moolenaar
4078a7d6542SBram Moolenaardef Test_try_catch()
4088a7d6542SBram Moolenaar  let l = []
4098a7d6542SBram Moolenaar  try
4108a7d6542SBram Moolenaar    add(l, '1')
4118a7d6542SBram Moolenaar    throw 'wrong'
4128a7d6542SBram Moolenaar    add(l, '2')
4138a7d6542SBram Moolenaar  catch
4148a7d6542SBram Moolenaar    add(l, v:exception)
4158a7d6542SBram Moolenaar  finally
4168a7d6542SBram Moolenaar    add(l, '3')
4178a7d6542SBram Moolenaar  endtry
4188a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4198a7d6542SBram Moolenaarenddef
4208a7d6542SBram Moolenaar
421257cc5eeSBram Moolenaardef ThrowFromDef()
422257cc5eeSBram Moolenaar  throw 'getout'
423257cc5eeSBram Moolenaarenddef
424257cc5eeSBram Moolenaar
425257cc5eeSBram Moolenaarfunc CatchInFunc()
426257cc5eeSBram Moolenaar  try
427257cc5eeSBram Moolenaar    call ThrowFromDef()
428257cc5eeSBram Moolenaar  catch
429257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
430257cc5eeSBram Moolenaar  endtry
431257cc5eeSBram Moolenaarendfunc
432257cc5eeSBram Moolenaar
433257cc5eeSBram Moolenaardef CatchInDef()
434257cc5eeSBram Moolenaar  try
435257cc5eeSBram Moolenaar    ThrowFromDef()
436257cc5eeSBram Moolenaar  catch
437257cc5eeSBram Moolenaar    g:thrown_def = v:exception
438257cc5eeSBram Moolenaar  endtry
439257cc5eeSBram Moolenaarenddef
440257cc5eeSBram Moolenaar
441f575adffSBram Moolenaardef ReturnFinally(): string
442f575adffSBram Moolenaar  try
443f575adffSBram Moolenaar    return 'intry'
444f575adffSBram Moolenaar  finally
445f575adffSBram Moolenaar    g:in_finally = 'finally'
446f575adffSBram Moolenaar  endtry
447f575adffSBram Moolenaar  return 'end'
448f575adffSBram Moolenaarenddef
449f575adffSBram Moolenaar
450257cc5eeSBram Moolenaardef Test_try_catch_nested()
451257cc5eeSBram Moolenaar  CatchInFunc()
452257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
453257cc5eeSBram Moolenaar
454257cc5eeSBram Moolenaar  CatchInDef()
455257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
456f575adffSBram Moolenaar
457f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
458f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
459f575adffSBram Moolenaarenddef
460f575adffSBram Moolenaar
461f575adffSBram Moolenaardef Test_try_catch_match()
462f575adffSBram Moolenaar  let seq = 'a'
463f575adffSBram Moolenaar  try
464f575adffSBram Moolenaar    throw 'something'
465f575adffSBram Moolenaar  catch /nothing/
466f575adffSBram Moolenaar    seq ..= 'x'
467f575adffSBram Moolenaar  catch /some/
468f575adffSBram Moolenaar    seq ..= 'b'
469f575adffSBram Moolenaar  catch /asdf/
470f575adffSBram Moolenaar    seq ..= 'x'
471*e8c4abbbSBram Moolenaar  catch ?a\?sdf?
472*e8c4abbbSBram Moolenaar    seq ..= 'y'
473f575adffSBram Moolenaar  finally
474f575adffSBram Moolenaar    seq ..= 'c'
475f575adffSBram Moolenaar  endtry
476f575adffSBram Moolenaar  assert_equal('abc', seq)
477257cc5eeSBram Moolenaarenddef
478257cc5eeSBram Moolenaar
479*e8c4abbbSBram Moolenaardef Test_try_catch_fails()
480*e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
481*e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
482*e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
483*e8c4abbbSBram Moolenaarenddef
484*e8c4abbbSBram Moolenaar
4858a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4868a7d6542SBram Moolenaar  vim9script
4878a7d6542SBram Moolenaar  let name: string = 'bob'
4888a7d6542SBram Moolenaar  def Concat(arg: string): string
4898a7d6542SBram Moolenaar    return name .. arg
4908a7d6542SBram Moolenaar  enddef
4918a7d6542SBram Moolenaar  let g:result = Concat('bie')
4928a7d6542SBram Moolenaar  let g:localname = name
4938a7d6542SBram Moolenaar
4948a7d6542SBram Moolenaar  export const CONST = 1234
4958a7d6542SBram Moolenaar  export let exported = 9876
4966e587dcbSBram Moolenaar  export let exp_name = 'John'
4978a7d6542SBram Moolenaar  export def Exported(): string
4988a7d6542SBram Moolenaar    return 'Exported'
4998a7d6542SBram Moolenaar  enddef
5008a7d6542SBram MoolenaarEND
5018a7d6542SBram Moolenaar
5025269bd2aSBram Moolenaardef Test_vim9_import_export()
5038a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5048a7d6542SBram Moolenaar    vim9script
5058a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5068a7d6542SBram Moolenaar    g:imported = exported
5076e587dcbSBram Moolenaar    exported += 3
5086e587dcbSBram Moolenaar    g:imported_added = exported
5098a7d6542SBram Moolenaar    g:imported_func = Exported()
5106e587dcbSBram Moolenaar
5116e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5126e587dcbSBram Moolenaar    g:imported_name = exp_name
5136e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5146e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5155381c7a1SBram Moolenaar    g:imported_later = exported
5168a7d6542SBram Moolenaar  END
5178a7d6542SBram Moolenaar
5188a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5198a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5208a7d6542SBram Moolenaar
5218a7d6542SBram Moolenaar  source Ximport.vim
5228a7d6542SBram Moolenaar
5238a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5248a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5258a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5266e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5275381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5288a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5296e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5306e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5318a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5328a7d6542SBram Moolenaar
5338a7d6542SBram Moolenaar  unlet g:result
5348a7d6542SBram Moolenaar  unlet g:localname
5358a7d6542SBram Moolenaar  unlet g:imported
5366e587dcbSBram Moolenaar  unlet g:imported_added
5375381c7a1SBram Moolenaar  unlet g:imported_later
5388a7d6542SBram Moolenaar  unlet g:imported_func
5396e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5408a7d6542SBram Moolenaar  delete('Ximport.vim')
541f2d5c240SBram Moolenaar
5425381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5435381c7a1SBram Moolenaar    vim9script
5445381c7a1SBram Moolenaar    def ImportInDef()
5455381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5465381c7a1SBram Moolenaar      g:imported = exported
5475381c7a1SBram Moolenaar      exported += 7
5485381c7a1SBram Moolenaar      g:imported_added = exported
5495381c7a1SBram Moolenaar    enddef
5505381c7a1SBram Moolenaar    ImportInDef()
5515381c7a1SBram Moolenaar  END
5525381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5535381c7a1SBram Moolenaar  source Ximport2.vim
5545381c7a1SBram Moolenaar  " TODO: this should be 9879
5555381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5565381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5575381c7a1SBram Moolenaar  unlet g:imported
5585381c7a1SBram Moolenaar  unlet g:imported_added
5595381c7a1SBram Moolenaar  delete('Ximport2.vim')
5605381c7a1SBram Moolenaar
561f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
562f2d5c240SBram Moolenaar    vim9script
563f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
564f2d5c240SBram Moolenaar    def UseExport()
565f2d5c240SBram Moolenaar      g:imported = Export.exported
566f2d5c240SBram Moolenaar    enddef
567f2d5c240SBram Moolenaar    UseExport()
568f2d5c240SBram Moolenaar  END
569f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
570f2d5c240SBram Moolenaar  source Ximport.vim
5715381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
572f2d5c240SBram Moolenaar
573599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
574599c89c8SBram Moolenaar    vim9script
575599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
576599c89c8SBram Moolenaar    def Func()
577599c89c8SBram Moolenaar      let dummy = 1
578599c89c8SBram Moolenaar      let imported = Export + dummy
579599c89c8SBram Moolenaar    enddef
580599c89c8SBram Moolenaar  END
581599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
582599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
583599c89c8SBram Moolenaar
584599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
585599c89c8SBram Moolenaar    vim9script
586599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
587599c89c8SBram Moolenaar    def Func()
588599c89c8SBram Moolenaar      let imported = Export . exported
589599c89c8SBram Moolenaar    enddef
590599c89c8SBram Moolenaar  END
591599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
592599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
593599c89c8SBram Moolenaar
594599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
595599c89c8SBram Moolenaar    vim9script
596599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
597599c89c8SBram Moolenaar    def Func()
598599c89c8SBram Moolenaar      let imported = Export.
599599c89c8SBram Moolenaar    enddef
600599c89c8SBram Moolenaar  END
601599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
602599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
603599c89c8SBram Moolenaar
604f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
605f2d5c240SBram Moolenaar    vim9script
606f2d5c240SBram Moolenaar    import * from './Xexport.vim'
607f2d5c240SBram Moolenaar    g:imported = exported
608f2d5c240SBram Moolenaar  END
609f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
610f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
611f2d5c240SBram Moolenaar
612fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
613fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
614fa29c8abSBram Moolenaar    vim9script
615fa29c8abSBram Moolenaar    import name from './Xexport.vim'
616fa29c8abSBram Moolenaar  END
617fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
618fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
619fa29c8abSBram Moolenaar
6205269bd2aSBram Moolenaar  " try to import something that is already defined
6215269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6225269bd2aSBram Moolenaar    vim9script
6235269bd2aSBram Moolenaar    let exported = 'something'
6245269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6255269bd2aSBram Moolenaar  END
6265269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6275269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6285269bd2aSBram Moolenaar
6295269bd2aSBram Moolenaar  " try to import something that is already defined
6305269bd2aSBram Moolenaar  import_already_defined =<< trim END
6315269bd2aSBram Moolenaar    vim9script
6325269bd2aSBram Moolenaar    let exported = 'something'
6335269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6345269bd2aSBram Moolenaar  END
6355269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6365269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6375269bd2aSBram Moolenaar
6385269bd2aSBram Moolenaar  " try to import something that is already defined
6395269bd2aSBram Moolenaar  import_already_defined =<< trim END
6405269bd2aSBram Moolenaar    vim9script
6415269bd2aSBram Moolenaar    let exported = 'something'
6425269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6435269bd2aSBram Moolenaar  END
6445269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6455269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6465269bd2aSBram Moolenaar
647fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
648fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
649fa29c8abSBram Moolenaar    vim9script
650fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
651fa29c8abSBram Moolenaar  END
652fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
653fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
654fa29c8abSBram Moolenaar
655fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
656fa29c8abSBram Moolenaar    vim9script
657fa29c8abSBram Moolenaar    import name './Xexport.vim'
658fa29c8abSBram Moolenaar  END
659fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
660fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
661fa29c8abSBram Moolenaar
662fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
663fa29c8abSBram Moolenaar    vim9script
664fa29c8abSBram Moolenaar    import name from Xexport.vim
665fa29c8abSBram Moolenaar  END
666fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
667fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
668fa29c8abSBram Moolenaar
669fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
670fa29c8abSBram Moolenaar    vim9script
671fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
672fa29c8abSBram Moolenaar  END
673fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
674fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
675fa29c8abSBram Moolenaar
676fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
677fa29c8abSBram Moolenaar    vim9script
678fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
679fa29c8abSBram Moolenaar  END
6805269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
6815269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
682fa29c8abSBram Moolenaar
683f2d5c240SBram Moolenaar  delete('Ximport.vim')
6845269bd2aSBram Moolenaar  delete('Ximport3.vim')
6858a7d6542SBram Moolenaar  delete('Xexport.vim')
6868a7d6542SBram Moolenaar
687750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
688750802b5SBram Moolenaar  set cpo&vi
689750802b5SBram Moolenaar  let cpo_before = &cpo
690750802b5SBram Moolenaar  let lines =<< trim END
691750802b5SBram Moolenaar    vim9script
692750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
693750802b5SBram Moolenaar  END
694750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
695750802b5SBram Moolenaar  source Xvim9_script
696750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
697750802b5SBram Moolenaar  set cpo&vim
698750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
699750802b5SBram Moolenaar  delete('Xvim9_script')
700750802b5SBram Moolenaarenddef
701750802b5SBram Moolenaar
702750802b5SBram Moolenaardef Test_vim9script_fails()
7038a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7048a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
705750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
706f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
707750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
708750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
709750802b5SBram Moolenaar
710750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
711750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
7128a7d6542SBram Moolenaarenddef
7138a7d6542SBram Moolenaar
7148a7d6542SBram Moolenaardef Test_vim9script_call()
7158a7d6542SBram Moolenaar  let lines =<< trim END
7168a7d6542SBram Moolenaar    vim9script
7178a7d6542SBram Moolenaar    let var = ''
7188a7d6542SBram Moolenaar    def MyFunc(arg: string)
7198a7d6542SBram Moolenaar       var = arg
7208a7d6542SBram Moolenaar    enddef
7218a7d6542SBram Moolenaar    MyFunc('foobar')
7228a7d6542SBram Moolenaar    assert_equal('foobar', var)
7238a7d6542SBram Moolenaar
7248a7d6542SBram Moolenaar    let str = 'barfoo'
7258a7d6542SBram Moolenaar    str->MyFunc()
7268a7d6542SBram Moolenaar    assert_equal('barfoo', var)
7278a7d6542SBram Moolenaar
7288a7d6542SBram Moolenaar    let g:value = 'value'
7298a7d6542SBram Moolenaar    g:value->MyFunc()
7308a7d6542SBram Moolenaar    assert_equal('value', var)
7318a7d6542SBram Moolenaar
7328a7d6542SBram Moolenaar    let listvar = []
7338a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
7348a7d6542SBram Moolenaar       listvar = arg
7358a7d6542SBram Moolenaar    enddef
7368a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
7378a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
7388a7d6542SBram Moolenaar
7398a7d6542SBram Moolenaar    let dictvar = {}
7408a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
7418a7d6542SBram Moolenaar       dictvar = arg
7428a7d6542SBram Moolenaar    enddef
7438a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
7448a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
74533fa29cfSBram Moolenaar    def CompiledDict()
74633fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
74733fa29cfSBram Moolenaar    enddef
74833fa29cfSBram Moolenaar    CompiledDict()
74933fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
75033fa29cfSBram Moolenaar
7518a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
7528a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
7530c6ceaf9SBram Moolenaar
7540c6ceaf9SBram Moolenaar    ('text')->MyFunc()
7550c6ceaf9SBram Moolenaar    assert_equal('text', var)
7560c6ceaf9SBram Moolenaar    ("some")->MyFunc()
7570c6ceaf9SBram Moolenaar    assert_equal('some', var)
7588a7d6542SBram Moolenaar  END
7598a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
7608a7d6542SBram Moolenaar  source Xcall.vim
7618a7d6542SBram Moolenaar  delete('Xcall.vim')
7628a7d6542SBram Moolenaarenddef
7638a7d6542SBram Moolenaar
7648a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
7658a7d6542SBram Moolenaar  let lines =<< trim END
7668a7d6542SBram Moolenaar    vim9script
7678a7d6542SBram Moolenaar    let var = ''
7688a7d6542SBram Moolenaar    def MyFunc(arg: string)
7698a7d6542SBram Moolenaar       let var = 123
7708a7d6542SBram Moolenaar    enddef
7718a7d6542SBram Moolenaar  END
7728a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
7738a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
7748a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
7758a7d6542SBram Moolenaarenddef
7768a7d6542SBram Moolenaar
7778a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
7788a7d6542SBram Moolenaar  let lines =<< trim END
7798a7d6542SBram Moolenaar    vim9script
7808a7d6542SBram Moolenaar    const var = ''
7818a7d6542SBram Moolenaar    def MyFunc(arg: string)
7828a7d6542SBram Moolenaar       var = 'asdf'
7838a7d6542SBram Moolenaar    enddef
7848a7d6542SBram Moolenaar  END
7858a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
7868a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
7878a7d6542SBram Moolenaar  delete('Xcall_const.vim')
7888a7d6542SBram Moolenaarenddef
7898a7d6542SBram Moolenaar
7908a7d6542SBram Moolenaardef Test_vim9script_reload()
7918a7d6542SBram Moolenaar  let lines =<< trim END
7928a7d6542SBram Moolenaar    vim9script
7938a7d6542SBram Moolenaar    const var = ''
7948a7d6542SBram Moolenaar    let valone = 1234
7958a7d6542SBram Moolenaar    def MyFunc(arg: string)
7968a7d6542SBram Moolenaar       valone = 5678
7978a7d6542SBram Moolenaar    enddef
7988a7d6542SBram Moolenaar  END
7998a7d6542SBram Moolenaar  let morelines =<< trim END
8008a7d6542SBram Moolenaar    let valtwo = 222
8018a7d6542SBram Moolenaar    export def GetValtwo(): number
8028a7d6542SBram Moolenaar      return valtwo
8038a7d6542SBram Moolenaar    enddef
8048a7d6542SBram Moolenaar  END
8058a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
8068a7d6542SBram Moolenaar  source Xreload.vim
8078a7d6542SBram Moolenaar  source Xreload.vim
8088a7d6542SBram Moolenaar  source Xreload.vim
8098a7d6542SBram Moolenaar
8108a7d6542SBram Moolenaar  let testlines =<< trim END
8118a7d6542SBram Moolenaar    vim9script
8128a7d6542SBram Moolenaar    def TheFunc()
8138a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
8148a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
8158a7d6542SBram Moolenaar    enddef
8168a7d6542SBram Moolenaar    TheFunc()
8178a7d6542SBram Moolenaar  END
8188a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
8198a7d6542SBram Moolenaar  source Ximport.vim
8208a7d6542SBram Moolenaar
8218a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
8228a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
8238a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8248a7d6542SBram Moolenaar  source Xreload.vim
8258a7d6542SBram Moolenaar  source Ximport.vim
8268a7d6542SBram Moolenaar
8278a7d6542SBram Moolenaar  " cannot declare a var twice
8288a7d6542SBram Moolenaar  lines =<< trim END
8298a7d6542SBram Moolenaar    vim9script
8308a7d6542SBram Moolenaar    let valone = 1234
8318a7d6542SBram Moolenaar    let valone = 5678
8328a7d6542SBram Moolenaar  END
8338a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
8348a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
8358a7d6542SBram Moolenaar
8368a7d6542SBram Moolenaar  delete('Xreload.vim')
8378a7d6542SBram Moolenaar  delete('Ximport.vim')
8388a7d6542SBram Moolenaarenddef
8398a7d6542SBram Moolenaar
8408a7d6542SBram Moolenaardef Test_import_absolute()
8418a7d6542SBram Moolenaar  let import_lines = [
8428a7d6542SBram Moolenaar        \ 'vim9script',
8438a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
844b283a8a6SBram Moolenaar        \ 'def UseExported()',
8458a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
8464e12a5dfSBram Moolenaar        \ '  exported = 8888',
8474e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
848b283a8a6SBram Moolenaar        \ 'enddef',
849b283a8a6SBram Moolenaar        \ 'UseExported()',
8504e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
8518a7d6542SBram Moolenaar        \ ]
8528a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8538a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8548a7d6542SBram Moolenaar
8558a7d6542SBram Moolenaar  source Ximport_abs.vim
8568a7d6542SBram Moolenaar
8578a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8584e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
859b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
860b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
861b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8624e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
8634e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
8644e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
8654e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
8664e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
8674e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
8684e12a5dfSBram Moolenaar        \, g:import_disassembled)
8698a7d6542SBram Moolenaar  unlet g:imported_abs
8704e12a5dfSBram Moolenaar  unlet g:import_disassembled
8718a7d6542SBram Moolenaar
8728a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8738a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8748a7d6542SBram Moolenaarenddef
8758a7d6542SBram Moolenaar
8768a7d6542SBram Moolenaardef Test_import_rtp()
8778a7d6542SBram Moolenaar  let import_lines = [
8788a7d6542SBram Moolenaar        \ 'vim9script',
8798a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
8808a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
8818a7d6542SBram Moolenaar        \ ]
8828a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
8838a7d6542SBram Moolenaar  mkdir('import')
8848a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
8858a7d6542SBram Moolenaar
8868a7d6542SBram Moolenaar  let save_rtp = &rtp
8878a7d6542SBram Moolenaar  &rtp = getcwd()
8888a7d6542SBram Moolenaar  source Ximport_rtp.vim
8898a7d6542SBram Moolenaar  &rtp = save_rtp
8908a7d6542SBram Moolenaar
8918a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
8928a7d6542SBram Moolenaar  unlet g:imported_rtp
8938a7d6542SBram Moolenaar
8948a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
8958a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
8968a7d6542SBram Moolenaar  delete('import', 'd')
8978a7d6542SBram Moolenaarenddef
8988a7d6542SBram Moolenaar
8998a7d6542SBram Moolenaardef Test_fixed_size_list()
9008a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
9018a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
9028a7d6542SBram Moolenaar  l->remove(0)
9038a7d6542SBram Moolenaar  l->add(5)
9048a7d6542SBram Moolenaar  l->insert(99, 1)
9050f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
9068a7d6542SBram Moolenaarenddef
9078a7d6542SBram Moolenaar
908673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
909673660abSBram Moolenaar" recognized.
910673660abSBram Moolenaarfunc Test_function_python()
911673660abSBram Moolenaar  CheckFeature python3
912673660abSBram Moolenaar  let py = 'python3'
913673660abSBram Moolenaar  execute py "<< EOF"
914673660abSBram Moolenaardef do_something():
915673660abSBram Moolenaar  return 1
916673660abSBram MoolenaarEOF
917673660abSBram Moolenaarendfunc
918673660abSBram Moolenaar
919158906cfSBram Moolenaardef IfElse(what: number): string
920158906cfSBram Moolenaar  let res = ''
921158906cfSBram Moolenaar  if what == 1
922158906cfSBram Moolenaar    res = "one"
923158906cfSBram Moolenaar  elseif what == 2
924158906cfSBram Moolenaar    res = "two"
925a259d8d3SBram Moolenaar  else
926158906cfSBram Moolenaar    res = "three"
927a259d8d3SBram Moolenaar  endif
928158906cfSBram Moolenaar  return res
929a259d8d3SBram Moolenaarenddef
930a259d8d3SBram Moolenaar
931158906cfSBram Moolenaardef Test_if_elseif_else()
932158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
933158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
934158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
9350f18b6d1SBram Moolenaarenddef
9360f18b6d1SBram Moolenaar
937*e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
938*e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
939*e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
940*e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
941*e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
942*e8c4abbbSBram Moolenaarenddef
943*e8c4abbbSBram Moolenaar
9446d69bf60SBram Moolenaarlet g:bool_true = v:true
9456d69bf60SBram Moolenaarlet g:bool_false = v:false
9466d69bf60SBram Moolenaar
9476d69bf60SBram Moolenaardef Test_if_const_expr()
9486d69bf60SBram Moolenaar  let res = false
9496d69bf60SBram Moolenaar  if true ? true : false
9506d69bf60SBram Moolenaar    res = true
9516d69bf60SBram Moolenaar  endif
9526d69bf60SBram Moolenaar  assert_equal(true, res)
9536d69bf60SBram Moolenaar
9546d69bf60SBram Moolenaar  res = false
9556d69bf60SBram Moolenaar  if g:bool_true ? true : false
9566d69bf60SBram Moolenaar    res = true
9576d69bf60SBram Moolenaar  endif
9586d69bf60SBram Moolenaar  assert_equal(true, res)
9596d69bf60SBram Moolenaar
9606d69bf60SBram Moolenaar  res = false
9616d69bf60SBram Moolenaar  if true ? g:bool_true : false
9626d69bf60SBram Moolenaar    res = true
9636d69bf60SBram Moolenaar  endif
9646d69bf60SBram Moolenaar  assert_equal(true, res)
9656d69bf60SBram Moolenaar
9666d69bf60SBram Moolenaar  res = false
9676d69bf60SBram Moolenaar  if true ? true : g:bool_false
9686d69bf60SBram Moolenaar    res = true
9696d69bf60SBram Moolenaar  endif
9706d69bf60SBram Moolenaar  assert_equal(true, res)
9716d69bf60SBram Moolenaar
9726d69bf60SBram Moolenaar  res = false
9736d69bf60SBram Moolenaar  if true ? false : true
9746d69bf60SBram Moolenaar    res = true
9756d69bf60SBram Moolenaar  endif
9766d69bf60SBram Moolenaar  assert_equal(false, res)
9776d69bf60SBram Moolenaar
9786d69bf60SBram Moolenaar  res = false
9796d69bf60SBram Moolenaar  if false ? false : true
9806d69bf60SBram Moolenaar    res = true
9816d69bf60SBram Moolenaar  endif
9826d69bf60SBram Moolenaar  assert_equal(true, res)
9836d69bf60SBram Moolenaar
9846d69bf60SBram Moolenaar  res = false
9856d69bf60SBram Moolenaar  if false ? true : false
9866d69bf60SBram Moolenaar    res = true
9876d69bf60SBram Moolenaar  endif
9886d69bf60SBram Moolenaar  assert_equal(false, res)
9896d69bf60SBram Moolenaar
9906d69bf60SBram Moolenaar  res = false
991*e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
992*e8c4abbbSBram Moolenaar    res = true
993*e8c4abbbSBram Moolenaar  endif
994*e8c4abbbSBram Moolenaar  assert_equal(false, res)
995*e8c4abbbSBram Moolenaar
996*e8c4abbbSBram Moolenaar  res = false
9976d69bf60SBram Moolenaar  if true && true
9986d69bf60SBram Moolenaar    res = true
9996d69bf60SBram Moolenaar  endif
10006d69bf60SBram Moolenaar  assert_equal(true, res)
10016d69bf60SBram Moolenaar
10026d69bf60SBram Moolenaar  res = false
10036d69bf60SBram Moolenaar  if true && false
10046d69bf60SBram Moolenaar    res = true
10056d69bf60SBram Moolenaar  endif
10066d69bf60SBram Moolenaar  assert_equal(false, res)
10076d69bf60SBram Moolenaar
10086d69bf60SBram Moolenaar  res = false
10096d69bf60SBram Moolenaar  if g:bool_true && false
10106d69bf60SBram Moolenaar    res = true
10116d69bf60SBram Moolenaar  endif
10126d69bf60SBram Moolenaar  assert_equal(false, res)
10136d69bf60SBram Moolenaar
10146d69bf60SBram Moolenaar  res = false
10156d69bf60SBram Moolenaar  if true && g:bool_false
10166d69bf60SBram Moolenaar    res = true
10176d69bf60SBram Moolenaar  endif
10186d69bf60SBram Moolenaar  assert_equal(false, res)
10196d69bf60SBram Moolenaar
10206d69bf60SBram Moolenaar  res = false
10216d69bf60SBram Moolenaar  if false && false
10226d69bf60SBram Moolenaar    res = true
10236d69bf60SBram Moolenaar  endif
10246d69bf60SBram Moolenaar  assert_equal(false, res)
10256d69bf60SBram Moolenaar
10266d69bf60SBram Moolenaar  res = false
10276d69bf60SBram Moolenaar  if true || false
10286d69bf60SBram Moolenaar    res = true
10296d69bf60SBram Moolenaar  endif
10306d69bf60SBram Moolenaar  assert_equal(true, res)
10316d69bf60SBram Moolenaar
10326d69bf60SBram Moolenaar  res = false
10336d69bf60SBram Moolenaar  if g:bool_true || false
10346d69bf60SBram Moolenaar    res = true
10356d69bf60SBram Moolenaar  endif
10366d69bf60SBram Moolenaar  assert_equal(true, res)
10376d69bf60SBram Moolenaar
10386d69bf60SBram Moolenaar  res = false
10396d69bf60SBram Moolenaar  if true || g:bool_false
10406d69bf60SBram Moolenaar    res = true
10416d69bf60SBram Moolenaar  endif
10426d69bf60SBram Moolenaar  assert_equal(true, res)
10436d69bf60SBram Moolenaar
10446d69bf60SBram Moolenaar  res = false
10456d69bf60SBram Moolenaar  if false || false
10466d69bf60SBram Moolenaar    res = true
10476d69bf60SBram Moolenaar  endif
10486d69bf60SBram Moolenaar  assert_equal(false, res)
104980c34ca3SBram Moolenaarenddef
10506d69bf60SBram Moolenaar
105180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
105280c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
105380c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1054*e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1055*e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
10566d69bf60SBram Moolenaarenddef
10576d69bf60SBram Moolenaar
105863ce4849SBram Moolenaardef Test_delfunc()
105963ce4849SBram Moolenaar  let lines =<< trim END
106063ce4849SBram Moolenaar    vim9script
106163ce4849SBram Moolenaar    def GoneSoon()
106263ce4849SBram Moolenaar      echo 'hello'
106363ce4849SBram Moolenaar    enddef
106463ce4849SBram Moolenaar
106563ce4849SBram Moolenaar    def CallGoneSoon()
106663ce4849SBram Moolenaar      GoneSoon()
106763ce4849SBram Moolenaar    enddef
106863ce4849SBram Moolenaar
106963ce4849SBram Moolenaar    delfunc GoneSoon
107063ce4849SBram Moolenaar    CallGoneSoon()
107163ce4849SBram Moolenaar  END
107263ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
107363ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
107463ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
107563ce4849SBram Moolenaar
107663ce4849SBram Moolenaar  delete('XToDelFunc')
107763ce4849SBram Moolenaarenddef
107863ce4849SBram Moolenaar
1079ad39c094SBram Moolenaardef Test_execute_cmd()
1080ad39c094SBram Moolenaar  new
1081ad39c094SBram Moolenaar  setline(1, 'default')
1082ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1083ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1084ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1085ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1086ad39c094SBram Moolenaar  execute cmd1 cmd2
1087ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1088ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1089ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1090ad39c094SBram Moolenaar  let cmd_first = 'call '
1091ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1092ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1093ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1094ad39c094SBram Moolenaar  bwipe!
1095ad39c094SBram Moolenaarenddef
1096ad39c094SBram Moolenaar
1097ad39c094SBram Moolenaardef Test_echo_cmd()
1098ad39c094SBram Moolenaar  echo 'something'
1099ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1100ad39c094SBram Moolenaar
1101ad39c094SBram Moolenaar  let str1 = 'some'
1102ad39c094SBram Moolenaar  let str2 = 'more'
1103ad39c094SBram Moolenaar  echo str1 str2
1104ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1105ad39c094SBram Moolenaarenddef
1106ad39c094SBram Moolenaar
110741fe0617SBram Moolenaardef Test_for_outside_of_function()
110841fe0617SBram Moolenaar  let lines =<< trim END
110941fe0617SBram Moolenaar    vim9script
111041fe0617SBram Moolenaar    new
111141fe0617SBram Moolenaar    for var in range(0, 3)
111241fe0617SBram Moolenaar      append(line('$'), var)
111341fe0617SBram Moolenaar    endfor
111441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
111541fe0617SBram Moolenaar    bwipe!
111641fe0617SBram Moolenaar  END
111741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
111841fe0617SBram Moolenaar  source Xvim9for.vim
111941fe0617SBram Moolenaar  delete('Xvim9for.vim')
112041fe0617SBram Moolenaarenddef
11218a7d6542SBram Moolenaar
1122*e8c4abbbSBram Moolenaardef Test_for_loop()
1123*e8c4abbbSBram Moolenaar  let result = ''
1124*e8c4abbbSBram Moolenaar  for cnt in range(7)
1125*e8c4abbbSBram Moolenaar    if cnt == 4
1126*e8c4abbbSBram Moolenaar      break
1127*e8c4abbbSBram Moolenaar    endif
1128*e8c4abbbSBram Moolenaar    if cnt == 2
1129*e8c4abbbSBram Moolenaar      continue
1130*e8c4abbbSBram Moolenaar    endif
1131*e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1132*e8c4abbbSBram Moolenaar  endfor
1133*e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1134*e8c4abbbSBram Moolenaarenddef
1135*e8c4abbbSBram Moolenaar
1136*e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1137*e8c4abbbSBram Moolenaar  call CheckDefFailure(['for # in range(5)'], 'E690:')
1138*e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i In range(5)'], 'E690:')
1139*e8c4abbbSBram Moolenaar  call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1140*e8c4abbbSBram Moolenaar  call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1141*e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in "text"'], 'E1024:')
1142*e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in xxx'], 'E1001:')
1143*e8c4abbbSBram Moolenaar  call CheckDefFailure(['endfor'], 'E588:')
1144*e8c4abbbSBram Moolenaarenddef
1145*e8c4abbbSBram Moolenaar
1146d0df1aacSBram Moolenaardef Test_while_loop()
1147d0df1aacSBram Moolenaar  let result = ''
1148d0df1aacSBram Moolenaar  let cnt = 0
1149d0df1aacSBram Moolenaar  while cnt < 555
1150d0df1aacSBram Moolenaar    if cnt == 3
1151d0df1aacSBram Moolenaar      break
1152d0df1aacSBram Moolenaar    endif
1153d0df1aacSBram Moolenaar    cnt += 1
1154d0df1aacSBram Moolenaar    if cnt == 2
1155d0df1aacSBram Moolenaar      continue
1156d0df1aacSBram Moolenaar    endif
1157d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1158d0df1aacSBram Moolenaar  endwhile
1159d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1160d0df1aacSBram Moolenaarenddef
1161d0df1aacSBram Moolenaar
1162*e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1163*e8c4abbbSBram Moolenaar  call CheckDefFailure(['while xxx'], 'E1001:')
1164*e8c4abbbSBram Moolenaar  call CheckDefFailure(['endwhile'], 'E588:')
1165*e8c4abbbSBram Moolenaar  call CheckDefFailure(['continue'], 'E586:')
1166*e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'continue'], 'E586:')
1167*e8c4abbbSBram Moolenaar  call CheckDefFailure(['break'], 'E587:')
1168*e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'break'], 'E587:')
1169bd5da371SBram Moolenaarenddef
1170bd5da371SBram Moolenaar
11719645e2d9SBram Moolenaardef Test_interrupt_loop()
117297acfc78SBram Moolenaar  let caught = false
11739645e2d9SBram Moolenaar  let x = 0
117497acfc78SBram Moolenaar  try
11759645e2d9SBram Moolenaar    while 1
11769645e2d9SBram Moolenaar      x += 1
11779645e2d9SBram Moolenaar      if x == 100
11789645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
11799645e2d9SBram Moolenaar      endif
11809645e2d9SBram Moolenaar    endwhile
118197acfc78SBram Moolenaar  catch
118297acfc78SBram Moolenaar    caught = true
118397acfc78SBram Moolenaar    assert_equal(100, x)
118497acfc78SBram Moolenaar  endtry
118597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
11869645e2d9SBram Moolenaarenddef
118720431c9dSBram Moolenaar
1188d0df1aacSBram Moolenaardef Test_substitute_cmd()
1189d0df1aacSBram Moolenaar  new
1190d0df1aacSBram Moolenaar  setline(1, 'something')
1191d0df1aacSBram Moolenaar  :substitute(some(other(
1192d0df1aacSBram Moolenaar  assert_equal('otherthing', getline(1))
1193d0df1aacSBram Moolenaar  bwipe!
1194d0df1aacSBram Moolenaar
1195d0df1aacSBram Moolenaar  " also when the context is Vim9 script
1196d0df1aacSBram Moolenaar  let lines =<< trim END
1197d0df1aacSBram Moolenaar    vim9script
1198d0df1aacSBram Moolenaar    new
1199d0df1aacSBram Moolenaar    setline(1, 'something')
1200d0df1aacSBram Moolenaar    :substitute(some(other(
1201d0df1aacSBram Moolenaar    assert_equal('otherthing', getline(1))
1202d0df1aacSBram Moolenaar    bwipe!
1203d0df1aacSBram Moolenaar  END
1204d0df1aacSBram Moolenaar  writefile(lines, 'Xvim9lines')
1205d0df1aacSBram Moolenaar  source Xvim9lines
1206d0df1aacSBram Moolenaar
1207d0df1aacSBram Moolenaar  delete('Xvim9lines')
1208d0df1aacSBram Moolenaarenddef
1209d0df1aacSBram Moolenaar
121020431c9dSBram Moolenaardef Test_redef_failure()
121120431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
121220431c9dSBram Moolenaar  so Xdef
121320431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
121420431c9dSBram Moolenaar  so Xdef
121520431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
121620431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
121720431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
121820431c9dSBram Moolenaar  so Xdef
121920431c9dSBram Moolenaar  call delete('Xdef')
122020431c9dSBram Moolenaar
122120431c9dSBram Moolenaar  call assert_equal(0, Func0())
122220431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
122320431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
122420431c9dSBram Moolenaar
122520431c9dSBram Moolenaar  delfunc! Func0
122620431c9dSBram Moolenaar  delfunc! Func1
122720431c9dSBram Moolenaar  delfunc! Func2
122820431c9dSBram Moolenaarenddef
122920431c9dSBram Moolenaar
12307d941ee0SBram Moolenaar" Test for internal functions returning different types
12317d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
12327d941ee0SBram Moolenaar  let lines =<< trim END
12337d941ee0SBram Moolenaar    def RetFloat(): float
12347d941ee0SBram Moolenaar      return ceil(1.456)
12357d941ee0SBram Moolenaar    enddef
12367d941ee0SBram Moolenaar
12377d941ee0SBram Moolenaar    def RetListAny(): list<any>
12387d941ee0SBram Moolenaar      return items({'k' : 'v'})
12397d941ee0SBram Moolenaar    enddef
12407d941ee0SBram Moolenaar
12417d941ee0SBram Moolenaar    def RetListString(): list<string>
12427d941ee0SBram Moolenaar      return split('a:b:c', ':')
12437d941ee0SBram Moolenaar    enddef
12447d941ee0SBram Moolenaar
12457d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
12467d941ee0SBram Moolenaar      return getbufinfo()
12477d941ee0SBram Moolenaar    enddef
12487d941ee0SBram Moolenaar
12497d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
12507d941ee0SBram Moolenaar      return wordcount()
12517d941ee0SBram Moolenaar    enddef
12527d941ee0SBram Moolenaar
12537d941ee0SBram Moolenaar    def RetDictString(): dict<string>
12547d941ee0SBram Moolenaar      return environ()
12557d941ee0SBram Moolenaar    enddef
12567d941ee0SBram Moolenaar  END
12577d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
12587d941ee0SBram Moolenaar  source Xscript
12597d941ee0SBram Moolenaar
12607d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
12617d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
12627d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
12637d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
12647d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
12657d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
12667d941ee0SBram Moolenaar  call delete('Xscript')
12677d941ee0SBram Moolenaarendfunc
12687d941ee0SBram Moolenaar
12697d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
12707d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
12717d941ee0SBram Moolenaar  let l =<< trim END
12727d941ee0SBram Moolenaar    def! FArgErr(): float
12737d941ee0SBram Moolenaar      return ceil(1.1, 2)
12747d941ee0SBram Moolenaar    enddef
12757d941ee0SBram Moolenaar  END
12767d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12777d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
12787d941ee0SBram Moolenaar  let l =<< trim END
12797d941ee0SBram Moolenaar    def! FArgErr(): float
12807d941ee0SBram Moolenaar      return ceil()
12817d941ee0SBram Moolenaar    enddef
12827d941ee0SBram Moolenaar  END
12837d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
12847d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
12857d941ee0SBram Moolenaar  call delete('Xinvalidarg')
12867d941ee0SBram Moolenaarendfunc
12877d941ee0SBram Moolenaar
12888a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1289