18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4673660abSBram Moolenaar
58a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
68a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
7978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
88a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
98a7d6542SBram Moolenaar  call delete('Xdef')
108a7d6542SBram Moolenaarendfunc
118a7d6542SBram Moolenaar
128a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
138a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
148a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
158a7d6542SBram Moolenaar  call delete('Xdef')
168a7d6542SBram Moolenaarendfunc
178a7d6542SBram Moolenaar
188a7d6542SBram Moolenaardef Test_syntax()
198a7d6542SBram Moolenaar  let var = 234
208a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
218a7d6542SBram Moolenaarenddef
228a7d6542SBram Moolenaar
238a7d6542SBram Moolenaarfunc Test_def_basic()
248a7d6542SBram Moolenaar  def SomeFunc(): string
258a7d6542SBram Moolenaar    return 'yes'
268a7d6542SBram Moolenaar  enddef
278a7d6542SBram Moolenaar  call assert_equal('yes', SomeFunc())
288a7d6542SBram Moolenaarendfunc
298a7d6542SBram Moolenaar
306e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
316e587dcbSBram Moolenaarlet s:addToMe = 111
32401d9ffbSBram Moolenaarlet g:existing = 'yes'
336e587dcbSBram Moolenaar
348a7d6542SBram Moolenaardef Test_assignment()
358a7d6542SBram Moolenaar  let bool1: bool = true
368a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
378a7d6542SBram Moolenaar  let bool2: bool = false
388a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
398a7d6542SBram Moolenaar
40*0c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
418a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
42*0c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
43*0c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
44*0c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
458a7d6542SBram Moolenaar
46436472f5SBram Moolenaar  let listS: list<string> = []
47436472f5SBram Moolenaar  let listN: list<number> = []
488a7d6542SBram Moolenaar
49*0c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
508a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
51*0c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
52*0c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
53*0c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
54b283a8a6SBram Moolenaar
55401d9ffbSBram Moolenaar  g:newvar = 'new'
56401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
57401d9ffbSBram Moolenaar
58401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
59401d9ffbSBram Moolenaar  g:existing = 'no'
60401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
61401d9ffbSBram Moolenaar
62b283a8a6SBram Moolenaar  v:char = 'abc'
636e587dcbSBram Moolenaar  assert_equal('abc', v:char)
64b283a8a6SBram Moolenaar
65b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
666e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
67b283a8a6SBram Moolenaar  $ENVVAR = ''
686e587dcbSBram Moolenaar
69fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
70fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
71fd1823e0SBram Moolenaar  s:addToMe += 222
72fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
730bbf722aSBram Moolenaar  s:newVar = 'new'
740bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
758a7d6542SBram Moolenaarenddef
768a7d6542SBram Moolenaar
778a7d6542SBram Moolenaarfunc Test_assignment_failure()
788a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
798a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
808a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
818a7d6542SBram Moolenaar
828a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
838a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
848a7d6542SBram Moolenaar
858a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
868a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
878a7d6542SBram Moolenaar
888a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
898a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
908a7d6542SBram Moolenaar
918a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
928a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
938a7d6542SBram Moolenaarendfunc
948a7d6542SBram Moolenaar
958a7d6542SBram Moolenaarfunc Test_const()
968a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
978a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
988a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
998a7d6542SBram Moolenaarendfunc
1008a7d6542SBram Moolenaar
1018a7d6542SBram Moolenaardef Test_block()
1028a7d6542SBram Moolenaar  let outer = 1
1038a7d6542SBram Moolenaar  {
1048a7d6542SBram Moolenaar    let inner = 2
1058a7d6542SBram Moolenaar    assert_equal(1, outer)
1068a7d6542SBram Moolenaar    assert_equal(2, inner)
1078a7d6542SBram Moolenaar  }
1088a7d6542SBram Moolenaar  assert_equal(1, outer)
1098a7d6542SBram Moolenaarenddef
1108a7d6542SBram Moolenaar
1118a7d6542SBram Moolenaarfunc Test_block_failure()
1128a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1138a7d6542SBram Moolenaarendfunc
1148a7d6542SBram Moolenaar
1158a7d6542SBram Moolenaardef ReturnString(): string
1168a7d6542SBram Moolenaar  return 'string'
1178a7d6542SBram Moolenaarenddef
1188a7d6542SBram Moolenaar
1198a7d6542SBram Moolenaardef ReturnNumber(): number
1208a7d6542SBram Moolenaar  return 123
1218a7d6542SBram Moolenaarenddef
1228a7d6542SBram Moolenaar
12309f28f49SBram Moolenaarlet g:notNumber = 'string'
12409f28f49SBram Moolenaar
12509f28f49SBram Moolenaardef ReturnGlobal(): number
12609f28f49SBram Moolenaar  return g:notNumber
12709f28f49SBram Moolenaarenddef
12809f28f49SBram Moolenaar
1298a7d6542SBram Moolenaardef Test_return_string()
1308a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1318a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
13209f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1338a7d6542SBram Moolenaarenddef
1348a7d6542SBram Moolenaar
1358a7d6542SBram Moolenaarfunc Increment()
1368a7d6542SBram Moolenaar  let g:counter += 1
1378a7d6542SBram Moolenaarendfunc
1388a7d6542SBram Moolenaar
1398a7d6542SBram Moolenaardef Test_call_ufunc_count()
1408a7d6542SBram Moolenaar  g:counter = 1
1418a7d6542SBram Moolenaar  Increment()
1428a7d6542SBram Moolenaar  Increment()
1438a7d6542SBram Moolenaar  Increment()
1448a7d6542SBram Moolenaar  " works with and without :call
1458a7d6542SBram Moolenaar  assert_equal(4, g:counter)
146b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1478a7d6542SBram Moolenaar  unlet g:counter
1488a7d6542SBram Moolenaarenddef
1498a7d6542SBram Moolenaar
1508a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1518a7d6542SBram Moolenaar  let res = arg
1528a7d6542SBram Moolenaar  for s in rest
1538a7d6542SBram Moolenaar    res ..= ',' .. s
1548a7d6542SBram Moolenaar  endfor
1558a7d6542SBram Moolenaar  return res
1568a7d6542SBram Moolenaarenddef
1578a7d6542SBram Moolenaar
1588a7d6542SBram Moolenaardef Test_call_varargs()
1598a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1608a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1618a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1628a7d6542SBram Moolenaarenddef
1638a7d6542SBram Moolenaar
164170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
165170fcfcfSBram Moolenaar  return name
166170fcfcfSBram Moolenaarenddef
167170fcfcfSBram Moolenaar
168170fcfcfSBram Moolenaardef Test_call_default_args()
169170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
170170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
171170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
172170fcfcfSBram Moolenaarenddef
173170fcfcfSBram Moolenaar
174170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
175170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
176170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
177170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
178170fcfcfSBram Moolenaarendfunc
179170fcfcfSBram Moolenaar
180170fcfcfSBram Moolenaar" Default arg and varargs
181170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
182170fcfcfSBram Moolenaar  let res = one .. ',' .. two
183170fcfcfSBram Moolenaar  for s in rest
184170fcfcfSBram Moolenaar    res ..= ',' .. s
185170fcfcfSBram Moolenaar  endfor
186170fcfcfSBram Moolenaar  return res
187170fcfcfSBram Moolenaarenddef
188170fcfcfSBram Moolenaar
189170fcfcfSBram Moolenaardef Test_call_def_varargs()
190170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
191170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
192170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
193170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
194170fcfcfSBram Moolenaarenddef
195170fcfcfSBram Moolenaar
196170fcfcfSBram Moolenaar
19726e117e9SBram Moolenaar"def Test_call_func_defined_later()
19826e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
19926e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
20026e117e9SBram Moolenaar"enddef
20126e117e9SBram Moolenaar
20226e117e9SBram Moolenaarfunc DefineLater(arg)
20326e117e9SBram Moolenaar  return a:arg
20426e117e9SBram Moolenaarendfunc
20526e117e9SBram Moolenaar
2068a7d6542SBram Moolenaardef Test_return_type_wrong()
207978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
208978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
209978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
210978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
2118a7d6542SBram Moolenaarenddef
2128a7d6542SBram Moolenaar
213bfe12043SBram Moolenaardef Test_arg_type_wrong()
214bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
215bfe12043SBram Moolenaarenddef
216bfe12043SBram Moolenaar
2178a7d6542SBram Moolenaardef Test_try_catch()
2188a7d6542SBram Moolenaar  let l = []
2198a7d6542SBram Moolenaar  try
2208a7d6542SBram Moolenaar    add(l, '1')
2218a7d6542SBram Moolenaar    throw 'wrong'
2228a7d6542SBram Moolenaar    add(l, '2')
2238a7d6542SBram Moolenaar  catch
2248a7d6542SBram Moolenaar    add(l, v:exception)
2258a7d6542SBram Moolenaar  finally
2268a7d6542SBram Moolenaar    add(l, '3')
2278a7d6542SBram Moolenaar  endtry
2288a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2298a7d6542SBram Moolenaarenddef
2308a7d6542SBram Moolenaar
231257cc5eeSBram Moolenaardef ThrowFromDef()
232257cc5eeSBram Moolenaar  throw 'getout'
233257cc5eeSBram Moolenaarenddef
234257cc5eeSBram Moolenaar
235257cc5eeSBram Moolenaarfunc CatchInFunc()
236257cc5eeSBram Moolenaar  try
237257cc5eeSBram Moolenaar    call ThrowFromDef()
238257cc5eeSBram Moolenaar  catch
239257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
240257cc5eeSBram Moolenaar  endtry
241257cc5eeSBram Moolenaarendfunc
242257cc5eeSBram Moolenaar
243257cc5eeSBram Moolenaardef CatchInDef()
244257cc5eeSBram Moolenaar  try
245257cc5eeSBram Moolenaar    ThrowFromDef()
246257cc5eeSBram Moolenaar  catch
247257cc5eeSBram Moolenaar    g:thrown_def = v:exception
248257cc5eeSBram Moolenaar  endtry
249257cc5eeSBram Moolenaarenddef
250257cc5eeSBram Moolenaar
251f575adffSBram Moolenaardef ReturnFinally(): string
252f575adffSBram Moolenaar  try
253f575adffSBram Moolenaar    return 'intry'
254f575adffSBram Moolenaar  finally
255f575adffSBram Moolenaar    g:in_finally = 'finally'
256f575adffSBram Moolenaar  endtry
257f575adffSBram Moolenaar  return 'end'
258f575adffSBram Moolenaarenddef
259f575adffSBram Moolenaar
260257cc5eeSBram Moolenaardef Test_try_catch_nested()
261257cc5eeSBram Moolenaar  CatchInFunc()
262257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
263257cc5eeSBram Moolenaar
264257cc5eeSBram Moolenaar  CatchInDef()
265257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
266f575adffSBram Moolenaar
267f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
268f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
269f575adffSBram Moolenaarenddef
270f575adffSBram Moolenaar
271f575adffSBram Moolenaardef Test_try_catch_match()
272f575adffSBram Moolenaar  let seq = 'a'
273f575adffSBram Moolenaar  try
274f575adffSBram Moolenaar    throw 'something'
275f575adffSBram Moolenaar  catch /nothing/
276f575adffSBram Moolenaar    seq ..= 'x'
277f575adffSBram Moolenaar  catch /some/
278f575adffSBram Moolenaar    seq ..= 'b'
279f575adffSBram Moolenaar  catch /asdf/
280f575adffSBram Moolenaar    seq ..= 'x'
281f575adffSBram Moolenaar  finally
282f575adffSBram Moolenaar    seq ..= 'c'
283f575adffSBram Moolenaar  endtry
284f575adffSBram Moolenaar  assert_equal('abc', seq)
285257cc5eeSBram Moolenaarenddef
286257cc5eeSBram Moolenaar
2878a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
2888a7d6542SBram Moolenaar  vim9script
2898a7d6542SBram Moolenaar  let name: string = 'bob'
2908a7d6542SBram Moolenaar  def Concat(arg: string): string
2918a7d6542SBram Moolenaar    return name .. arg
2928a7d6542SBram Moolenaar  enddef
2938a7d6542SBram Moolenaar  let g:result = Concat('bie')
2948a7d6542SBram Moolenaar  let g:localname = name
2958a7d6542SBram Moolenaar
2968a7d6542SBram Moolenaar  export const CONST = 1234
2978a7d6542SBram Moolenaar  export let exported = 9876
2986e587dcbSBram Moolenaar  export let exp_name = 'John'
2998a7d6542SBram Moolenaar  export def Exported(): string
3008a7d6542SBram Moolenaar    return 'Exported'
3018a7d6542SBram Moolenaar  enddef
3028a7d6542SBram MoolenaarEND
3038a7d6542SBram Moolenaar
3048a7d6542SBram Moolenaardef Test_vim9script()
3058a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3068a7d6542SBram Moolenaar    vim9script
3078a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3088a7d6542SBram Moolenaar    g:imported = exported
3096e587dcbSBram Moolenaar    exported += 3
3106e587dcbSBram Moolenaar    g:imported_added = exported
3118a7d6542SBram Moolenaar    g:imported_func = Exported()
3126e587dcbSBram Moolenaar
3136e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3146e587dcbSBram Moolenaar    g:imported_name = exp_name
3156e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3166e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3178a7d6542SBram Moolenaar  END
3188a7d6542SBram Moolenaar
3198a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3208a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3218a7d6542SBram Moolenaar
3228a7d6542SBram Moolenaar  source Ximport.vim
3238a7d6542SBram Moolenaar
3248a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3258a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3268a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3276e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3288a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3296e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3306e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3318a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3328a7d6542SBram Moolenaar
3338a7d6542SBram Moolenaar  unlet g:result
3348a7d6542SBram Moolenaar  unlet g:localname
3358a7d6542SBram Moolenaar  unlet g:imported
3366e587dcbSBram Moolenaar  unlet g:imported_added
3378a7d6542SBram Moolenaar  unlet g:imported_func
3386e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
3398a7d6542SBram Moolenaar  delete('Ximport.vim')
340f2d5c240SBram Moolenaar
341f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
342f2d5c240SBram Moolenaar    vim9script
343f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
344f2d5c240SBram Moolenaar    def UseExport()
345f2d5c240SBram Moolenaar      g:imported = Export.exported
346f2d5c240SBram Moolenaar    enddef
347f2d5c240SBram Moolenaar    UseExport()
348f2d5c240SBram Moolenaar  END
349f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
350f2d5c240SBram Moolenaar  source Ximport.vim
351f2d5c240SBram Moolenaar  assert_equal(9876, g:imported)
352f2d5c240SBram Moolenaar
353f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
354f2d5c240SBram Moolenaar    vim9script
355f2d5c240SBram Moolenaar    import * from './Xexport.vim'
356f2d5c240SBram Moolenaar    g:imported = exported
357f2d5c240SBram Moolenaar  END
358f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
359f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
360f2d5c240SBram Moolenaar
361fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
362fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
363fa29c8abSBram Moolenaar    vim9script
364fa29c8abSBram Moolenaar    import name from './Xexport.vim'
365fa29c8abSBram Moolenaar  END
366fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
367fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
368fa29c8abSBram Moolenaar
369fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
370fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
371fa29c8abSBram Moolenaar    vim9script
372fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
373fa29c8abSBram Moolenaar  END
374fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
375fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
376fa29c8abSBram Moolenaar
377fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
378fa29c8abSBram Moolenaar    vim9script
379fa29c8abSBram Moolenaar    import name './Xexport.vim'
380fa29c8abSBram Moolenaar  END
381fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
382fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
383fa29c8abSBram Moolenaar
384fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
385fa29c8abSBram Moolenaar    vim9script
386fa29c8abSBram Moolenaar    import name from Xexport.vim
387fa29c8abSBram Moolenaar  END
388fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
389fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
390fa29c8abSBram Moolenaar
391fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
392fa29c8abSBram Moolenaar    vim9script
393fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
394fa29c8abSBram Moolenaar  END
395fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
396fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
397fa29c8abSBram Moolenaar
398fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
399fa29c8abSBram Moolenaar    vim9script
400fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
401fa29c8abSBram Moolenaar  END
402fa29c8abSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport.vim')
403fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1046:')
404fa29c8abSBram Moolenaar
405f2d5c240SBram Moolenaar  delete('Ximport.vim')
4068a7d6542SBram Moolenaar  delete('Xexport.vim')
4078a7d6542SBram Moolenaar
408750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
409750802b5SBram Moolenaar  set cpo&vi
410750802b5SBram Moolenaar  let cpo_before = &cpo
411750802b5SBram Moolenaar  let lines =<< trim END
412750802b5SBram Moolenaar    vim9script
413750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
414750802b5SBram Moolenaar  END
415750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
416750802b5SBram Moolenaar  source Xvim9_script
417750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
418750802b5SBram Moolenaar  set cpo&vim
419750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
420750802b5SBram Moolenaar  delete('Xvim9_script')
421750802b5SBram Moolenaarenddef
422750802b5SBram Moolenaar
423750802b5SBram Moolenaardef Test_vim9script_fails()
4248a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
4258a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
426750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
427f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
428750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
429750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
430750802b5SBram Moolenaar
431750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
432750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
4338a7d6542SBram Moolenaarenddef
4348a7d6542SBram Moolenaar
4358a7d6542SBram Moolenaardef Test_vim9script_call()
4368a7d6542SBram Moolenaar  let lines =<< trim END
4378a7d6542SBram Moolenaar    vim9script
4388a7d6542SBram Moolenaar    let var = ''
4398a7d6542SBram Moolenaar    def MyFunc(arg: string)
4408a7d6542SBram Moolenaar       var = arg
4418a7d6542SBram Moolenaar    enddef
4428a7d6542SBram Moolenaar    MyFunc('foobar')
4438a7d6542SBram Moolenaar    assert_equal('foobar', var)
4448a7d6542SBram Moolenaar
4458a7d6542SBram Moolenaar    let str = 'barfoo'
4468a7d6542SBram Moolenaar    str->MyFunc()
4478a7d6542SBram Moolenaar    assert_equal('barfoo', var)
4488a7d6542SBram Moolenaar
4498a7d6542SBram Moolenaar    let g:value = 'value'
4508a7d6542SBram Moolenaar    g:value->MyFunc()
4518a7d6542SBram Moolenaar    assert_equal('value', var)
4528a7d6542SBram Moolenaar
4538a7d6542SBram Moolenaar    let listvar = []
4548a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
4558a7d6542SBram Moolenaar       listvar = arg
4568a7d6542SBram Moolenaar    enddef
4578a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
4588a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
4598a7d6542SBram Moolenaar
4608a7d6542SBram Moolenaar    let dictvar = {}
4618a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
4628a7d6542SBram Moolenaar       dictvar = arg
4638a7d6542SBram Moolenaar    enddef
4648a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
4658a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
4668a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
4678a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
4680c6ceaf9SBram Moolenaar
4690c6ceaf9SBram Moolenaar    ('text')->MyFunc()
4700c6ceaf9SBram Moolenaar    assert_equal('text', var)
4710c6ceaf9SBram Moolenaar    ("some")->MyFunc()
4720c6ceaf9SBram Moolenaar    assert_equal('some', var)
4738a7d6542SBram Moolenaar  END
4748a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
4758a7d6542SBram Moolenaar  source Xcall.vim
4768a7d6542SBram Moolenaar  delete('Xcall.vim')
4778a7d6542SBram Moolenaarenddef
4788a7d6542SBram Moolenaar
4798a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
4808a7d6542SBram Moolenaar  let lines =<< trim END
4818a7d6542SBram Moolenaar    vim9script
4828a7d6542SBram Moolenaar    let var = ''
4838a7d6542SBram Moolenaar    def MyFunc(arg: string)
4848a7d6542SBram Moolenaar       let var = 123
4858a7d6542SBram Moolenaar    enddef
4868a7d6542SBram Moolenaar  END
4878a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
4888a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
4898a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
4908a7d6542SBram Moolenaarenddef
4918a7d6542SBram Moolenaar
4928a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
4938a7d6542SBram Moolenaar  let lines =<< trim END
4948a7d6542SBram Moolenaar    vim9script
4958a7d6542SBram Moolenaar    const var = ''
4968a7d6542SBram Moolenaar    def MyFunc(arg: string)
4978a7d6542SBram Moolenaar       var = 'asdf'
4988a7d6542SBram Moolenaar    enddef
4998a7d6542SBram Moolenaar  END
5008a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
5018a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
5028a7d6542SBram Moolenaar  delete('Xcall_const.vim')
5038a7d6542SBram Moolenaarenddef
5048a7d6542SBram Moolenaar
5058a7d6542SBram Moolenaardef Test_vim9script_reload()
5068a7d6542SBram Moolenaar  let lines =<< trim END
5078a7d6542SBram Moolenaar    vim9script
5088a7d6542SBram Moolenaar    const var = ''
5098a7d6542SBram Moolenaar    let valone = 1234
5108a7d6542SBram Moolenaar    def MyFunc(arg: string)
5118a7d6542SBram Moolenaar       valone = 5678
5128a7d6542SBram Moolenaar    enddef
5138a7d6542SBram Moolenaar  END
5148a7d6542SBram Moolenaar  let morelines =<< trim END
5158a7d6542SBram Moolenaar    let valtwo = 222
5168a7d6542SBram Moolenaar    export def GetValtwo(): number
5178a7d6542SBram Moolenaar      return valtwo
5188a7d6542SBram Moolenaar    enddef
5198a7d6542SBram Moolenaar  END
5208a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
5218a7d6542SBram Moolenaar  source Xreload.vim
5228a7d6542SBram Moolenaar  source Xreload.vim
5238a7d6542SBram Moolenaar  source Xreload.vim
5248a7d6542SBram Moolenaar
5258a7d6542SBram Moolenaar  let testlines =<< trim END
5268a7d6542SBram Moolenaar    vim9script
5278a7d6542SBram Moolenaar    def TheFunc()
5288a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
5298a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
5308a7d6542SBram Moolenaar    enddef
5318a7d6542SBram Moolenaar    TheFunc()
5328a7d6542SBram Moolenaar  END
5338a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
5348a7d6542SBram Moolenaar  source Ximport.vim
5358a7d6542SBram Moolenaar
5368a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
5378a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
5388a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5398a7d6542SBram Moolenaar  source Xreload.vim
5408a7d6542SBram Moolenaar  source Ximport.vim
5418a7d6542SBram Moolenaar
5428a7d6542SBram Moolenaar  " cannot declare a var twice
5438a7d6542SBram Moolenaar  lines =<< trim END
5448a7d6542SBram Moolenaar    vim9script
5458a7d6542SBram Moolenaar    let valone = 1234
5468a7d6542SBram Moolenaar    let valone = 5678
5478a7d6542SBram Moolenaar  END
5488a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5498a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
5508a7d6542SBram Moolenaar
5518a7d6542SBram Moolenaar  delete('Xreload.vim')
5528a7d6542SBram Moolenaar  delete('Ximport.vim')
5538a7d6542SBram Moolenaarenddef
5548a7d6542SBram Moolenaar
5558a7d6542SBram Moolenaardef Test_import_absolute()
5568a7d6542SBram Moolenaar  let import_lines = [
5578a7d6542SBram Moolenaar        \ 'vim9script',
5588a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
559b283a8a6SBram Moolenaar        \ 'def UseExported()',
5608a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
5614e12a5dfSBram Moolenaar        \ '  exported = 8888',
5624e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
563b283a8a6SBram Moolenaar        \ 'enddef',
564b283a8a6SBram Moolenaar        \ 'UseExported()',
5654e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
5668a7d6542SBram Moolenaar        \ ]
5678a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
5688a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
5698a7d6542SBram Moolenaar
5708a7d6542SBram Moolenaar  source Ximport_abs.vim
5718a7d6542SBram Moolenaar
5728a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
5734e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
574b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
575b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
576b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
5774e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
5784e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
5794e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
5804e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
5814e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
5824e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
5834e12a5dfSBram Moolenaar        \, g:import_disassembled)
5848a7d6542SBram Moolenaar  unlet g:imported_abs
5854e12a5dfSBram Moolenaar  unlet g:import_disassembled
5868a7d6542SBram Moolenaar
5878a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
5888a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
5898a7d6542SBram Moolenaarenddef
5908a7d6542SBram Moolenaar
5918a7d6542SBram Moolenaardef Test_import_rtp()
5928a7d6542SBram Moolenaar  let import_lines = [
5938a7d6542SBram Moolenaar        \ 'vim9script',
5948a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
5958a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
5968a7d6542SBram Moolenaar        \ ]
5978a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
5988a7d6542SBram Moolenaar  mkdir('import')
5998a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6008a7d6542SBram Moolenaar
6018a7d6542SBram Moolenaar  let save_rtp = &rtp
6028a7d6542SBram Moolenaar  &rtp = getcwd()
6038a7d6542SBram Moolenaar  source Ximport_rtp.vim
6048a7d6542SBram Moolenaar  &rtp = save_rtp
6058a7d6542SBram Moolenaar
6068a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6078a7d6542SBram Moolenaar  unlet g:imported_rtp
6088a7d6542SBram Moolenaar
6098a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6108a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6118a7d6542SBram Moolenaar  delete('import', 'd')
6128a7d6542SBram Moolenaarenddef
6138a7d6542SBram Moolenaar
6148a7d6542SBram Moolenaardef Test_fixed_size_list()
6158a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6168a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
6178a7d6542SBram Moolenaar  l->remove(0)
6188a7d6542SBram Moolenaar  l->add(5)
6198a7d6542SBram Moolenaar  l->insert(99, 1)
6200f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
6218a7d6542SBram Moolenaarenddef
6228a7d6542SBram Moolenaar
623673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
624673660abSBram Moolenaar" recognized.
625673660abSBram Moolenaarfunc Test_function_python()
626673660abSBram Moolenaar  CheckFeature python3
627673660abSBram Moolenaar  let py = 'python3'
628673660abSBram Moolenaar  execute py "<< EOF"
629673660abSBram Moolenaardef do_something():
630673660abSBram Moolenaar  return 1
631673660abSBram MoolenaarEOF
632673660abSBram Moolenaarendfunc
633673660abSBram Moolenaar
634158906cfSBram Moolenaardef IfElse(what: number): string
635158906cfSBram Moolenaar  let res = ''
636158906cfSBram Moolenaar  if what == 1
637158906cfSBram Moolenaar    res = "one"
638158906cfSBram Moolenaar  elseif what == 2
639158906cfSBram Moolenaar    res = "two"
640a259d8d3SBram Moolenaar  else
641158906cfSBram Moolenaar    res = "three"
642a259d8d3SBram Moolenaar  endif
643158906cfSBram Moolenaar  return res
644a259d8d3SBram Moolenaarenddef
645a259d8d3SBram Moolenaar
646158906cfSBram Moolenaardef Test_if_elseif_else()
647158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
648158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
649158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
6500f18b6d1SBram Moolenaarenddef
6510f18b6d1SBram Moolenaar
65263ce4849SBram Moolenaardef Test_delfunc()
65363ce4849SBram Moolenaar  let lines =<< trim END
65463ce4849SBram Moolenaar    vim9script
65563ce4849SBram Moolenaar    def GoneSoon()
65663ce4849SBram Moolenaar      echo 'hello'
65763ce4849SBram Moolenaar    enddef
65863ce4849SBram Moolenaar
65963ce4849SBram Moolenaar    def CallGoneSoon()
66063ce4849SBram Moolenaar      GoneSoon()
66163ce4849SBram Moolenaar    enddef
66263ce4849SBram Moolenaar
66363ce4849SBram Moolenaar    delfunc GoneSoon
66463ce4849SBram Moolenaar    CallGoneSoon()
66563ce4849SBram Moolenaar  END
66663ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
66763ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
66863ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
66963ce4849SBram Moolenaar
67063ce4849SBram Moolenaar  delete('XToDelFunc')
67163ce4849SBram Moolenaarenddef
67263ce4849SBram Moolenaar
6735b1c8fe3SBram Moolenaardef Test_substitute_cmd()
6745b1c8fe3SBram Moolenaar  new
6755b1c8fe3SBram Moolenaar  setline(1, 'something')
6765b1c8fe3SBram Moolenaar  :substitute(some(other(
6775b1c8fe3SBram Moolenaar  assert_equal('otherthing', getline(1))
67883f37b91SBram Moolenaar  bwipe!
67983f37b91SBram Moolenaar
68083f37b91SBram Moolenaar  " also when the context is Vim9 script
68183f37b91SBram Moolenaar  let lines =<< trim END
68283f37b91SBram Moolenaar    vim9script
68383f37b91SBram Moolenaar    new
68483f37b91SBram Moolenaar    setline(1, 'something')
68583f37b91SBram Moolenaar    :substitute(some(other(
68683f37b91SBram Moolenaar    assert_equal('otherthing', getline(1))
68783f37b91SBram Moolenaar    bwipe!
68883f37b91SBram Moolenaar  END
68983f37b91SBram Moolenaar  writefile(lines, 'Xvim9lines')
69083f37b91SBram Moolenaar  source Xvim9lines
69183f37b91SBram Moolenaar
69283f37b91SBram Moolenaar  delete('Xvim9lines')
6935b1c8fe3SBram Moolenaarenddef
6945b1c8fe3SBram Moolenaar
6958a7d6542SBram Moolenaar
6968a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
697