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
408a7d6542SBram Moolenaar  let list1: list<string> = ['sdf', 'asdf']
418a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
428a7d6542SBram Moolenaar
438a7d6542SBram Moolenaar  " TODO: does not work yet
448a7d6542SBram Moolenaar  " let listS: list<string> = []
458a7d6542SBram Moolenaar  " let listN: list<number> = []
468a7d6542SBram Moolenaar
478a7d6542SBram Moolenaar  let dict1: dict<string> = #{key: 'value'}
488a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
49b283a8a6SBram Moolenaar
50401d9ffbSBram Moolenaar  g:newvar = 'new'
51401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
52401d9ffbSBram Moolenaar
53401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
54401d9ffbSBram Moolenaar  g:existing = 'no'
55401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
56401d9ffbSBram Moolenaar
57b283a8a6SBram Moolenaar  v:char = 'abc'
586e587dcbSBram Moolenaar  assert_equal('abc', v:char)
59b283a8a6SBram Moolenaar
60b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
616e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
62b283a8a6SBram Moolenaar  $ENVVAR = ''
636e587dcbSBram Moolenaar
64*fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
65*fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
66*fd1823e0SBram Moolenaar  s:addToMe += 222
67*fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
688a7d6542SBram Moolenaarenddef
698a7d6542SBram Moolenaar
708a7d6542SBram Moolenaarfunc Test_assignment_failure()
718a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
728a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
738a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
748a7d6542SBram Moolenaar
758a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
768a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
778a7d6542SBram Moolenaar
788a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
798a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
808a7d6542SBram Moolenaar
818a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
828a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
838a7d6542SBram Moolenaar
848a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
858a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
868a7d6542SBram Moolenaarendfunc
878a7d6542SBram Moolenaar
888a7d6542SBram Moolenaarfunc Test_const()
898a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
908a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
918a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
928a7d6542SBram Moolenaarendfunc
938a7d6542SBram Moolenaar
948a7d6542SBram Moolenaardef Test_block()
958a7d6542SBram Moolenaar  let outer = 1
968a7d6542SBram Moolenaar  {
978a7d6542SBram Moolenaar    let inner = 2
988a7d6542SBram Moolenaar    assert_equal(1, outer)
998a7d6542SBram Moolenaar    assert_equal(2, inner)
1008a7d6542SBram Moolenaar  }
1018a7d6542SBram Moolenaar  assert_equal(1, outer)
1028a7d6542SBram Moolenaarenddef
1038a7d6542SBram Moolenaar
1048a7d6542SBram Moolenaarfunc Test_block_failure()
1058a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1068a7d6542SBram Moolenaarendfunc
1078a7d6542SBram Moolenaar
1088a7d6542SBram Moolenaardef ReturnString(): string
1098a7d6542SBram Moolenaar  return 'string'
1108a7d6542SBram Moolenaarenddef
1118a7d6542SBram Moolenaar
1128a7d6542SBram Moolenaardef ReturnNumber(): number
1138a7d6542SBram Moolenaar  return 123
1148a7d6542SBram Moolenaarenddef
1158a7d6542SBram Moolenaar
1168a7d6542SBram Moolenaardef Test_return_string()
1178a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1188a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
1198a7d6542SBram Moolenaarenddef
1208a7d6542SBram Moolenaar
1218a7d6542SBram Moolenaarfunc Increment()
1228a7d6542SBram Moolenaar  let g:counter += 1
1238a7d6542SBram Moolenaarendfunc
1248a7d6542SBram Moolenaar
1258a7d6542SBram Moolenaardef Test_call_ufunc_count()
1268a7d6542SBram Moolenaar  g:counter = 1
1278a7d6542SBram Moolenaar  Increment()
1288a7d6542SBram Moolenaar  Increment()
1298a7d6542SBram Moolenaar  Increment()
1308a7d6542SBram Moolenaar  " works with and without :call
1318a7d6542SBram Moolenaar  assert_equal(4, g:counter)
132b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1338a7d6542SBram Moolenaar  unlet g:counter
1348a7d6542SBram Moolenaarenddef
1358a7d6542SBram Moolenaar
1368a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1378a7d6542SBram Moolenaar  let res = arg
1388a7d6542SBram Moolenaar  for s in rest
1398a7d6542SBram Moolenaar    res ..= ',' .. s
1408a7d6542SBram Moolenaar  endfor
1418a7d6542SBram Moolenaar  return res
1428a7d6542SBram Moolenaarenddef
1438a7d6542SBram Moolenaar
1448a7d6542SBram Moolenaardef Test_call_varargs()
1458a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1468a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1478a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1488a7d6542SBram Moolenaarenddef
1498a7d6542SBram Moolenaar
150170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
151170fcfcfSBram Moolenaar  return name
152170fcfcfSBram Moolenaarenddef
153170fcfcfSBram Moolenaar
154170fcfcfSBram Moolenaardef Test_call_default_args()
155170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
156170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
157170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
158170fcfcfSBram Moolenaarenddef
159170fcfcfSBram Moolenaar
160170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
161170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
162170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
163170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
164170fcfcfSBram Moolenaarendfunc
165170fcfcfSBram Moolenaar
166170fcfcfSBram Moolenaar" Default arg and varargs
167170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
168170fcfcfSBram Moolenaar  let res = one .. ',' .. two
169170fcfcfSBram Moolenaar  for s in rest
170170fcfcfSBram Moolenaar    res ..= ',' .. s
171170fcfcfSBram Moolenaar  endfor
172170fcfcfSBram Moolenaar  return res
173170fcfcfSBram Moolenaarenddef
174170fcfcfSBram Moolenaar
175170fcfcfSBram Moolenaardef Test_call_def_varargs()
176170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
177170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
178170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
179170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
180170fcfcfSBram Moolenaarenddef
181170fcfcfSBram Moolenaar
182170fcfcfSBram Moolenaar
18326e117e9SBram Moolenaar"def Test_call_func_defined_later()
18426e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
18526e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
18626e117e9SBram Moolenaar"enddef
18726e117e9SBram Moolenaar
18826e117e9SBram Moolenaarfunc DefineLater(arg)
18926e117e9SBram Moolenaar  return a:arg
19026e117e9SBram Moolenaarendfunc
19126e117e9SBram Moolenaar
1928a7d6542SBram Moolenaardef Test_return_type_wrong()
193978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
194978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
195978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
196978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1978a7d6542SBram Moolenaarenddef
1988a7d6542SBram Moolenaar
199bfe12043SBram Moolenaardef Test_arg_type_wrong()
200bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
201bfe12043SBram Moolenaarenddef
202bfe12043SBram Moolenaar
2038a7d6542SBram Moolenaardef Test_try_catch()
2048a7d6542SBram Moolenaar  let l = []
2058a7d6542SBram Moolenaar  try
2068a7d6542SBram Moolenaar    add(l, '1')
2078a7d6542SBram Moolenaar    throw 'wrong'
2088a7d6542SBram Moolenaar    add(l, '2')
2098a7d6542SBram Moolenaar  catch
2108a7d6542SBram Moolenaar    add(l, v:exception)
2118a7d6542SBram Moolenaar  finally
2128a7d6542SBram Moolenaar    add(l, '3')
2138a7d6542SBram Moolenaar  endtry
2148a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2158a7d6542SBram Moolenaarenddef
2168a7d6542SBram Moolenaar
217257cc5eeSBram Moolenaardef ThrowFromDef()
218257cc5eeSBram Moolenaar  throw 'getout'
219257cc5eeSBram Moolenaarenddef
220257cc5eeSBram Moolenaar
221257cc5eeSBram Moolenaarfunc CatchInFunc()
222257cc5eeSBram Moolenaar  try
223257cc5eeSBram Moolenaar    call ThrowFromDef()
224257cc5eeSBram Moolenaar  catch
225257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
226257cc5eeSBram Moolenaar  endtry
227257cc5eeSBram Moolenaarendfunc
228257cc5eeSBram Moolenaar
229257cc5eeSBram Moolenaardef CatchInDef()
230257cc5eeSBram Moolenaar  try
231257cc5eeSBram Moolenaar    ThrowFromDef()
232257cc5eeSBram Moolenaar  catch
233257cc5eeSBram Moolenaar    g:thrown_def = v:exception
234257cc5eeSBram Moolenaar  endtry
235257cc5eeSBram Moolenaarenddef
236257cc5eeSBram Moolenaar
237257cc5eeSBram Moolenaardef Test_try_catch_nested()
238257cc5eeSBram Moolenaar  CatchInFunc()
239257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
240257cc5eeSBram Moolenaar
241257cc5eeSBram Moolenaar  CatchInDef()
242257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
243257cc5eeSBram Moolenaarenddef
244257cc5eeSBram Moolenaar
2458a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
2468a7d6542SBram Moolenaar  vim9script
2478a7d6542SBram Moolenaar  let name: string = 'bob'
2488a7d6542SBram Moolenaar  def Concat(arg: string): string
2498a7d6542SBram Moolenaar    return name .. arg
2508a7d6542SBram Moolenaar  enddef
2518a7d6542SBram Moolenaar  let g:result = Concat('bie')
2528a7d6542SBram Moolenaar  let g:localname = name
2538a7d6542SBram Moolenaar
2548a7d6542SBram Moolenaar  export const CONST = 1234
2558a7d6542SBram Moolenaar  export let exported = 9876
2566e587dcbSBram Moolenaar  export let exp_name = 'John'
2578a7d6542SBram Moolenaar  export def Exported(): string
2588a7d6542SBram Moolenaar    return 'Exported'
2598a7d6542SBram Moolenaar  enddef
2608a7d6542SBram MoolenaarEND
2618a7d6542SBram Moolenaar
2628a7d6542SBram Moolenaardef Test_vim9script()
2638a7d6542SBram Moolenaar  let import_script_lines =<< trim END
2648a7d6542SBram Moolenaar    vim9script
2658a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
2668a7d6542SBram Moolenaar    g:imported = exported
2676e587dcbSBram Moolenaar    exported += 3
2686e587dcbSBram Moolenaar    g:imported_added = exported
2698a7d6542SBram Moolenaar    g:imported_func = Exported()
2706e587dcbSBram Moolenaar
2716e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
2726e587dcbSBram Moolenaar    g:imported_name = exp_name
2736e587dcbSBram Moolenaar    exp_name ..= ' Doe'
2746e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
2758a7d6542SBram Moolenaar  END
2768a7d6542SBram Moolenaar
2778a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
2788a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
2798a7d6542SBram Moolenaar
2808a7d6542SBram Moolenaar  source Ximport.vim
2818a7d6542SBram Moolenaar
2828a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
2838a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
2848a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
2856e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
2868a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
2876e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
2886e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
2898a7d6542SBram Moolenaar  assert_false(exists('g:name'))
2908a7d6542SBram Moolenaar
2918a7d6542SBram Moolenaar  unlet g:result
2928a7d6542SBram Moolenaar  unlet g:localname
2938a7d6542SBram Moolenaar  unlet g:imported
2946e587dcbSBram Moolenaar  unlet g:imported_added
2958a7d6542SBram Moolenaar  unlet g:imported_func
2966e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
2978a7d6542SBram Moolenaar  delete('Ximport.vim')
2988a7d6542SBram Moolenaar  delete('Xexport.vim')
2998a7d6542SBram Moolenaar
3008a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
3018a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
3028a7d6542SBram Moolenaarenddef
3038a7d6542SBram Moolenaar
3048a7d6542SBram Moolenaardef Test_vim9script_call()
3058a7d6542SBram Moolenaar  let lines =<< trim END
3068a7d6542SBram Moolenaar    vim9script
3078a7d6542SBram Moolenaar    let var = ''
3088a7d6542SBram Moolenaar    def MyFunc(arg: string)
3098a7d6542SBram Moolenaar       var = arg
3108a7d6542SBram Moolenaar    enddef
3118a7d6542SBram Moolenaar    MyFunc('foobar')
3128a7d6542SBram Moolenaar    assert_equal('foobar', var)
3138a7d6542SBram Moolenaar
3148a7d6542SBram Moolenaar    let str = 'barfoo'
3158a7d6542SBram Moolenaar    str->MyFunc()
3168a7d6542SBram Moolenaar    assert_equal('barfoo', var)
3178a7d6542SBram Moolenaar
3188a7d6542SBram Moolenaar    let g:value = 'value'
3198a7d6542SBram Moolenaar    g:value->MyFunc()
3208a7d6542SBram Moolenaar    assert_equal('value', var)
3218a7d6542SBram Moolenaar
3228a7d6542SBram Moolenaar    let listvar = []
3238a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
3248a7d6542SBram Moolenaar       listvar = arg
3258a7d6542SBram Moolenaar    enddef
3268a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
3278a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
3288a7d6542SBram Moolenaar
3298a7d6542SBram Moolenaar    let dictvar = {}
3308a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
3318a7d6542SBram Moolenaar       dictvar = arg
3328a7d6542SBram Moolenaar    enddef
3338a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
3348a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
3358a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
3368a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
3378a7d6542SBram Moolenaar  END
3388a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
3398a7d6542SBram Moolenaar  source Xcall.vim
3408a7d6542SBram Moolenaar  delete('Xcall.vim')
3418a7d6542SBram Moolenaarenddef
3428a7d6542SBram Moolenaar
3438a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
3448a7d6542SBram Moolenaar  let lines =<< trim END
3458a7d6542SBram Moolenaar    vim9script
3468a7d6542SBram Moolenaar    let var = ''
3478a7d6542SBram Moolenaar    def MyFunc(arg: string)
3488a7d6542SBram Moolenaar       let var = 123
3498a7d6542SBram Moolenaar    enddef
3508a7d6542SBram Moolenaar  END
3518a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
3528a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
3538a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
3548a7d6542SBram Moolenaarenddef
3558a7d6542SBram Moolenaar
3568a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
3578a7d6542SBram Moolenaar  let lines =<< trim END
3588a7d6542SBram Moolenaar    vim9script
3598a7d6542SBram Moolenaar    const var = ''
3608a7d6542SBram Moolenaar    def MyFunc(arg: string)
3618a7d6542SBram Moolenaar       var = 'asdf'
3628a7d6542SBram Moolenaar    enddef
3638a7d6542SBram Moolenaar  END
3648a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
3658a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
3668a7d6542SBram Moolenaar  delete('Xcall_const.vim')
3678a7d6542SBram Moolenaarenddef
3688a7d6542SBram Moolenaar
3698a7d6542SBram Moolenaardef Test_vim9script_reload()
3708a7d6542SBram Moolenaar  let lines =<< trim END
3718a7d6542SBram Moolenaar    vim9script
3728a7d6542SBram Moolenaar    const var = ''
3738a7d6542SBram Moolenaar    let valone = 1234
3748a7d6542SBram Moolenaar    def MyFunc(arg: string)
3758a7d6542SBram Moolenaar       valone = 5678
3768a7d6542SBram Moolenaar    enddef
3778a7d6542SBram Moolenaar  END
3788a7d6542SBram Moolenaar  let morelines =<< trim END
3798a7d6542SBram Moolenaar    let valtwo = 222
3808a7d6542SBram Moolenaar    export def GetValtwo(): number
3818a7d6542SBram Moolenaar      return valtwo
3828a7d6542SBram Moolenaar    enddef
3838a7d6542SBram Moolenaar  END
3848a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
3858a7d6542SBram Moolenaar  source Xreload.vim
3868a7d6542SBram Moolenaar  source Xreload.vim
3878a7d6542SBram Moolenaar  source Xreload.vim
3888a7d6542SBram Moolenaar
3898a7d6542SBram Moolenaar  let testlines =<< trim END
3908a7d6542SBram Moolenaar    vim9script
3918a7d6542SBram Moolenaar    def TheFunc()
3928a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
3938a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
3948a7d6542SBram Moolenaar    enddef
3958a7d6542SBram Moolenaar    TheFunc()
3968a7d6542SBram Moolenaar  END
3978a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
3988a7d6542SBram Moolenaar  source Ximport.vim
3998a7d6542SBram Moolenaar
4008a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
4018a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
4028a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
4038a7d6542SBram Moolenaar  source Xreload.vim
4048a7d6542SBram Moolenaar  source Ximport.vim
4058a7d6542SBram Moolenaar
4068a7d6542SBram Moolenaar  " cannot declare a var twice
4078a7d6542SBram Moolenaar  lines =<< trim END
4088a7d6542SBram Moolenaar    vim9script
4098a7d6542SBram Moolenaar    let valone = 1234
4108a7d6542SBram Moolenaar    let valone = 5678
4118a7d6542SBram Moolenaar  END
4128a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
4138a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
4148a7d6542SBram Moolenaar
4158a7d6542SBram Moolenaar  delete('Xreload.vim')
4168a7d6542SBram Moolenaar  delete('Ximport.vim')
4178a7d6542SBram Moolenaarenddef
4188a7d6542SBram Moolenaar
4198a7d6542SBram Moolenaardef Test_import_absolute()
4208a7d6542SBram Moolenaar  let import_lines = [
4218a7d6542SBram Moolenaar        \ 'vim9script',
4228a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
423b283a8a6SBram Moolenaar        \ 'def UseExported()',
4248a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
4254e12a5dfSBram Moolenaar        \ '  exported = 8888',
4264e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
427b283a8a6SBram Moolenaar        \ 'enddef',
428b283a8a6SBram Moolenaar        \ 'UseExported()',
4294e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
4308a7d6542SBram Moolenaar        \ ]
4318a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
4328a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
4338a7d6542SBram Moolenaar
4348a7d6542SBram Moolenaar  source Ximport_abs.vim
4358a7d6542SBram Moolenaar
4368a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
4374e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
438b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
439b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
440b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4414e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
4424e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
4434e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
4444e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
4454e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4464e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
4474e12a5dfSBram Moolenaar        \, g:import_disassembled)
4488a7d6542SBram Moolenaar  unlet g:imported_abs
4494e12a5dfSBram Moolenaar  unlet g:import_disassembled
4508a7d6542SBram Moolenaar
4518a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
4528a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
4538a7d6542SBram Moolenaarenddef
4548a7d6542SBram Moolenaar
4558a7d6542SBram Moolenaardef Test_import_rtp()
4568a7d6542SBram Moolenaar  let import_lines = [
4578a7d6542SBram Moolenaar        \ 'vim9script',
4588a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
4598a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
4608a7d6542SBram Moolenaar        \ ]
4618a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
4628a7d6542SBram Moolenaar  mkdir('import')
4638a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
4648a7d6542SBram Moolenaar
4658a7d6542SBram Moolenaar  let save_rtp = &rtp
4668a7d6542SBram Moolenaar  &rtp = getcwd()
4678a7d6542SBram Moolenaar  source Ximport_rtp.vim
4688a7d6542SBram Moolenaar  &rtp = save_rtp
4698a7d6542SBram Moolenaar
4708a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
4718a7d6542SBram Moolenaar  unlet g:imported_rtp
4728a7d6542SBram Moolenaar
4738a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
4748a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
4758a7d6542SBram Moolenaar  delete('import', 'd')
4768a7d6542SBram Moolenaarenddef
4778a7d6542SBram Moolenaar
4788a7d6542SBram Moolenaardef Test_fixed_size_list()
4798a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
4808a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
4818a7d6542SBram Moolenaar  l->remove(0)
4828a7d6542SBram Moolenaar  l->add(5)
4838a7d6542SBram Moolenaar  l->insert(99, 1)
4840f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
4858a7d6542SBram Moolenaarenddef
4868a7d6542SBram Moolenaar
487673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
488673660abSBram Moolenaar" recognized.
489673660abSBram Moolenaarfunc Test_function_python()
490673660abSBram Moolenaar  CheckFeature python3
491673660abSBram Moolenaar  let py = 'python3'
492673660abSBram Moolenaar  execute py "<< EOF"
493673660abSBram Moolenaardef do_something():
494673660abSBram Moolenaar  return 1
495673660abSBram MoolenaarEOF
496673660abSBram Moolenaarendfunc
497673660abSBram Moolenaar
498158906cfSBram Moolenaardef IfElse(what: number): string
499158906cfSBram Moolenaar  let res = ''
500158906cfSBram Moolenaar  if what == 1
501158906cfSBram Moolenaar    res = "one"
502158906cfSBram Moolenaar  elseif what == 2
503158906cfSBram Moolenaar    res = "two"
504a259d8d3SBram Moolenaar  else
505158906cfSBram Moolenaar    res = "three"
506a259d8d3SBram Moolenaar  endif
507158906cfSBram Moolenaar  return res
508a259d8d3SBram Moolenaarenddef
509a259d8d3SBram Moolenaar
510158906cfSBram Moolenaardef Test_if_elseif_else()
511158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
512158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
513158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
5140f18b6d1SBram Moolenaarenddef
5150f18b6d1SBram Moolenaar
51663ce4849SBram Moolenaardef Test_delfunc()
51763ce4849SBram Moolenaar  let lines =<< trim END
51863ce4849SBram Moolenaar    vim9script
51963ce4849SBram Moolenaar    def GoneSoon()
52063ce4849SBram Moolenaar      echo 'hello'
52163ce4849SBram Moolenaar    enddef
52263ce4849SBram Moolenaar
52363ce4849SBram Moolenaar    def CallGoneSoon()
52463ce4849SBram Moolenaar      GoneSoon()
52563ce4849SBram Moolenaar    enddef
52663ce4849SBram Moolenaar
52763ce4849SBram Moolenaar    delfunc GoneSoon
52863ce4849SBram Moolenaar    CallGoneSoon()
52963ce4849SBram Moolenaar  END
53063ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
53163ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
53263ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
53363ce4849SBram Moolenaar
53463ce4849SBram Moolenaar  delete('XToDelFunc')
53563ce4849SBram Moolenaarenddef
53663ce4849SBram Moolenaar
5378a7d6542SBram Moolenaar
5388a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
539