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
43436472f5SBram Moolenaar  let listS: list<string> = []
44436472f5SBram Moolenaar  let listN: list<number> = []
458a7d6542SBram Moolenaar
468a7d6542SBram Moolenaar  let dict1: dict<string> = #{key: 'value'}
478a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
48b283a8a6SBram Moolenaar
49401d9ffbSBram Moolenaar  g:newvar = 'new'
50401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
51401d9ffbSBram Moolenaar
52401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
53401d9ffbSBram Moolenaar  g:existing = 'no'
54401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
55401d9ffbSBram Moolenaar
56b283a8a6SBram Moolenaar  v:char = 'abc'
576e587dcbSBram Moolenaar  assert_equal('abc', v:char)
58b283a8a6SBram Moolenaar
59b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
606e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
61b283a8a6SBram Moolenaar  $ENVVAR = ''
626e587dcbSBram Moolenaar
63fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
64fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
65fd1823e0SBram Moolenaar  s:addToMe += 222
66fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
670bbf722aSBram Moolenaar  s:newVar = 'new'
680bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
698a7d6542SBram Moolenaarenddef
708a7d6542SBram Moolenaar
718a7d6542SBram Moolenaarfunc Test_assignment_failure()
728a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
738a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
748a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
758a7d6542SBram Moolenaar
768a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
778a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
788a7d6542SBram Moolenaar
798a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
808a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
818a7d6542SBram Moolenaar
828a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
838a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
848a7d6542SBram Moolenaar
858a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
868a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
878a7d6542SBram Moolenaarendfunc
888a7d6542SBram Moolenaar
898a7d6542SBram Moolenaarfunc Test_const()
908a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
918a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
928a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
938a7d6542SBram Moolenaarendfunc
948a7d6542SBram Moolenaar
958a7d6542SBram Moolenaardef Test_block()
968a7d6542SBram Moolenaar  let outer = 1
978a7d6542SBram Moolenaar  {
988a7d6542SBram Moolenaar    let inner = 2
998a7d6542SBram Moolenaar    assert_equal(1, outer)
1008a7d6542SBram Moolenaar    assert_equal(2, inner)
1018a7d6542SBram Moolenaar  }
1028a7d6542SBram Moolenaar  assert_equal(1, outer)
1038a7d6542SBram Moolenaarenddef
1048a7d6542SBram Moolenaar
1058a7d6542SBram Moolenaarfunc Test_block_failure()
1068a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1078a7d6542SBram Moolenaarendfunc
1088a7d6542SBram Moolenaar
1098a7d6542SBram Moolenaardef ReturnString(): string
1108a7d6542SBram Moolenaar  return 'string'
1118a7d6542SBram Moolenaarenddef
1128a7d6542SBram Moolenaar
1138a7d6542SBram Moolenaardef ReturnNumber(): number
1148a7d6542SBram Moolenaar  return 123
1158a7d6542SBram Moolenaarenddef
1168a7d6542SBram Moolenaar
11709f28f49SBram Moolenaarlet g:notNumber = 'string'
11809f28f49SBram Moolenaar
11909f28f49SBram Moolenaardef ReturnGlobal(): number
12009f28f49SBram Moolenaar  return g:notNumber
12109f28f49SBram Moolenaarenddef
12209f28f49SBram Moolenaar
1238a7d6542SBram Moolenaardef Test_return_string()
1248a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1258a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
12609f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1278a7d6542SBram Moolenaarenddef
1288a7d6542SBram Moolenaar
1298a7d6542SBram Moolenaarfunc Increment()
1308a7d6542SBram Moolenaar  let g:counter += 1
1318a7d6542SBram Moolenaarendfunc
1328a7d6542SBram Moolenaar
1338a7d6542SBram Moolenaardef Test_call_ufunc_count()
1348a7d6542SBram Moolenaar  g:counter = 1
1358a7d6542SBram Moolenaar  Increment()
1368a7d6542SBram Moolenaar  Increment()
1378a7d6542SBram Moolenaar  Increment()
1388a7d6542SBram Moolenaar  " works with and without :call
1398a7d6542SBram Moolenaar  assert_equal(4, g:counter)
140b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1418a7d6542SBram Moolenaar  unlet g:counter
1428a7d6542SBram Moolenaarenddef
1438a7d6542SBram Moolenaar
1448a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1458a7d6542SBram Moolenaar  let res = arg
1468a7d6542SBram Moolenaar  for s in rest
1478a7d6542SBram Moolenaar    res ..= ',' .. s
1488a7d6542SBram Moolenaar  endfor
1498a7d6542SBram Moolenaar  return res
1508a7d6542SBram Moolenaarenddef
1518a7d6542SBram Moolenaar
1528a7d6542SBram Moolenaardef Test_call_varargs()
1538a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1548a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1558a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1568a7d6542SBram Moolenaarenddef
1578a7d6542SBram Moolenaar
158170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
159170fcfcfSBram Moolenaar  return name
160170fcfcfSBram Moolenaarenddef
161170fcfcfSBram Moolenaar
162170fcfcfSBram Moolenaardef Test_call_default_args()
163170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
164170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
165170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
166170fcfcfSBram Moolenaarenddef
167170fcfcfSBram Moolenaar
168170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
169170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
170170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
171170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
172170fcfcfSBram Moolenaarendfunc
173170fcfcfSBram Moolenaar
174170fcfcfSBram Moolenaar" Default arg and varargs
175170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
176170fcfcfSBram Moolenaar  let res = one .. ',' .. two
177170fcfcfSBram Moolenaar  for s in rest
178170fcfcfSBram Moolenaar    res ..= ',' .. s
179170fcfcfSBram Moolenaar  endfor
180170fcfcfSBram Moolenaar  return res
181170fcfcfSBram Moolenaarenddef
182170fcfcfSBram Moolenaar
183170fcfcfSBram Moolenaardef Test_call_def_varargs()
184170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
185170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
186170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
187170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
188170fcfcfSBram Moolenaarenddef
189170fcfcfSBram Moolenaar
190170fcfcfSBram Moolenaar
19126e117e9SBram Moolenaar"def Test_call_func_defined_later()
19226e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
19326e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
19426e117e9SBram Moolenaar"enddef
19526e117e9SBram Moolenaar
19626e117e9SBram Moolenaarfunc DefineLater(arg)
19726e117e9SBram Moolenaar  return a:arg
19826e117e9SBram Moolenaarendfunc
19926e117e9SBram Moolenaar
2008a7d6542SBram Moolenaardef Test_return_type_wrong()
201978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
202978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
203978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
204978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
2058a7d6542SBram Moolenaarenddef
2068a7d6542SBram Moolenaar
207bfe12043SBram Moolenaardef Test_arg_type_wrong()
208bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
209bfe12043SBram Moolenaarenddef
210bfe12043SBram Moolenaar
2118a7d6542SBram Moolenaardef Test_try_catch()
2128a7d6542SBram Moolenaar  let l = []
2138a7d6542SBram Moolenaar  try
2148a7d6542SBram Moolenaar    add(l, '1')
2158a7d6542SBram Moolenaar    throw 'wrong'
2168a7d6542SBram Moolenaar    add(l, '2')
2178a7d6542SBram Moolenaar  catch
2188a7d6542SBram Moolenaar    add(l, v:exception)
2198a7d6542SBram Moolenaar  finally
2208a7d6542SBram Moolenaar    add(l, '3')
2218a7d6542SBram Moolenaar  endtry
2228a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2238a7d6542SBram Moolenaarenddef
2248a7d6542SBram Moolenaar
225257cc5eeSBram Moolenaardef ThrowFromDef()
226257cc5eeSBram Moolenaar  throw 'getout'
227257cc5eeSBram Moolenaarenddef
228257cc5eeSBram Moolenaar
229257cc5eeSBram Moolenaarfunc CatchInFunc()
230257cc5eeSBram Moolenaar  try
231257cc5eeSBram Moolenaar    call ThrowFromDef()
232257cc5eeSBram Moolenaar  catch
233257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
234257cc5eeSBram Moolenaar  endtry
235257cc5eeSBram Moolenaarendfunc
236257cc5eeSBram Moolenaar
237257cc5eeSBram Moolenaardef CatchInDef()
238257cc5eeSBram Moolenaar  try
239257cc5eeSBram Moolenaar    ThrowFromDef()
240257cc5eeSBram Moolenaar  catch
241257cc5eeSBram Moolenaar    g:thrown_def = v:exception
242257cc5eeSBram Moolenaar  endtry
243257cc5eeSBram Moolenaarenddef
244257cc5eeSBram Moolenaar
245f575adffSBram Moolenaardef ReturnFinally(): string
246f575adffSBram Moolenaar  try
247f575adffSBram Moolenaar    return 'intry'
248f575adffSBram Moolenaar  finally
249f575adffSBram Moolenaar    g:in_finally = 'finally'
250f575adffSBram Moolenaar  endtry
251f575adffSBram Moolenaar  return 'end'
252f575adffSBram Moolenaarenddef
253f575adffSBram Moolenaar
254257cc5eeSBram Moolenaardef Test_try_catch_nested()
255257cc5eeSBram Moolenaar  CatchInFunc()
256257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
257257cc5eeSBram Moolenaar
258257cc5eeSBram Moolenaar  CatchInDef()
259257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
260f575adffSBram Moolenaar
261f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
262f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
263f575adffSBram Moolenaarenddef
264f575adffSBram Moolenaar
265f575adffSBram Moolenaardef Test_try_catch_match()
266f575adffSBram Moolenaar  let seq = 'a'
267f575adffSBram Moolenaar  try
268f575adffSBram Moolenaar    throw 'something'
269f575adffSBram Moolenaar  catch /nothing/
270f575adffSBram Moolenaar    seq ..= 'x'
271f575adffSBram Moolenaar  catch /some/
272f575adffSBram Moolenaar    seq ..= 'b'
273f575adffSBram Moolenaar  catch /asdf/
274f575adffSBram Moolenaar    seq ..= 'x'
275f575adffSBram Moolenaar  finally
276f575adffSBram Moolenaar    seq ..= 'c'
277f575adffSBram Moolenaar  endtry
278f575adffSBram Moolenaar  assert_equal('abc', seq)
279257cc5eeSBram Moolenaarenddef
280257cc5eeSBram Moolenaar
2818a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
2828a7d6542SBram Moolenaar  vim9script
2838a7d6542SBram Moolenaar  let name: string = 'bob'
2848a7d6542SBram Moolenaar  def Concat(arg: string): string
2858a7d6542SBram Moolenaar    return name .. arg
2868a7d6542SBram Moolenaar  enddef
2878a7d6542SBram Moolenaar  let g:result = Concat('bie')
2888a7d6542SBram Moolenaar  let g:localname = name
2898a7d6542SBram Moolenaar
2908a7d6542SBram Moolenaar  export const CONST = 1234
2918a7d6542SBram Moolenaar  export let exported = 9876
2926e587dcbSBram Moolenaar  export let exp_name = 'John'
2938a7d6542SBram Moolenaar  export def Exported(): string
2948a7d6542SBram Moolenaar    return 'Exported'
2958a7d6542SBram Moolenaar  enddef
2968a7d6542SBram MoolenaarEND
2978a7d6542SBram Moolenaar
2988a7d6542SBram Moolenaardef Test_vim9script()
2998a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3008a7d6542SBram Moolenaar    vim9script
3018a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3028a7d6542SBram Moolenaar    g:imported = exported
3036e587dcbSBram Moolenaar    exported += 3
3046e587dcbSBram Moolenaar    g:imported_added = exported
3058a7d6542SBram Moolenaar    g:imported_func = Exported()
3066e587dcbSBram Moolenaar
3076e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3086e587dcbSBram Moolenaar    g:imported_name = exp_name
3096e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3106e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3118a7d6542SBram Moolenaar  END
3128a7d6542SBram Moolenaar
3138a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3148a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3158a7d6542SBram Moolenaar
3168a7d6542SBram Moolenaar  source Ximport.vim
3178a7d6542SBram Moolenaar
3188a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3198a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3208a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3216e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3228a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3236e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3246e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3258a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3268a7d6542SBram Moolenaar
3278a7d6542SBram Moolenaar  unlet g:result
3288a7d6542SBram Moolenaar  unlet g:localname
3298a7d6542SBram Moolenaar  unlet g:imported
3306e587dcbSBram Moolenaar  unlet g:imported_added
3318a7d6542SBram Moolenaar  unlet g:imported_func
3326e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
3338a7d6542SBram Moolenaar  delete('Ximport.vim')
334f2d5c240SBram Moolenaar
335f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
336f2d5c240SBram Moolenaar    vim9script
337f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
338f2d5c240SBram Moolenaar    def UseExport()
339f2d5c240SBram Moolenaar      g:imported = Export.exported
340f2d5c240SBram Moolenaar    enddef
341f2d5c240SBram Moolenaar    UseExport()
342f2d5c240SBram Moolenaar  END
343f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
344f2d5c240SBram Moolenaar  source Ximport.vim
345f2d5c240SBram Moolenaar  assert_equal(9876, g:imported)
346f2d5c240SBram Moolenaar
347f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
348f2d5c240SBram Moolenaar    vim9script
349f2d5c240SBram Moolenaar    import * from './Xexport.vim'
350f2d5c240SBram Moolenaar    g:imported = exported
351f2d5c240SBram Moolenaar  END
352f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
353f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
354f2d5c240SBram Moolenaar
355*fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
356*fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
357*fa29c8abSBram Moolenaar    vim9script
358*fa29c8abSBram Moolenaar    import name from './Xexport.vim'
359*fa29c8abSBram Moolenaar  END
360*fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
361*fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
362*fa29c8abSBram Moolenaar
363*fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
364*fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
365*fa29c8abSBram Moolenaar    vim9script
366*fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
367*fa29c8abSBram Moolenaar  END
368*fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
369*fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
370*fa29c8abSBram Moolenaar
371*fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
372*fa29c8abSBram Moolenaar    vim9script
373*fa29c8abSBram Moolenaar    import name './Xexport.vim'
374*fa29c8abSBram Moolenaar  END
375*fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
376*fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
377*fa29c8abSBram Moolenaar
378*fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
379*fa29c8abSBram Moolenaar    vim9script
380*fa29c8abSBram Moolenaar    import name from Xexport.vim
381*fa29c8abSBram Moolenaar  END
382*fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
383*fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
384*fa29c8abSBram Moolenaar
385*fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
386*fa29c8abSBram Moolenaar    vim9script
387*fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
388*fa29c8abSBram Moolenaar  END
389*fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
390*fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
391*fa29c8abSBram Moolenaar
392*fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
393*fa29c8abSBram Moolenaar    vim9script
394*fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
395*fa29c8abSBram Moolenaar  END
396*fa29c8abSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport.vim')
397*fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1046:')
398*fa29c8abSBram Moolenaar
399f2d5c240SBram Moolenaar  delete('Ximport.vim')
4008a7d6542SBram Moolenaar  delete('Xexport.vim')
4018a7d6542SBram Moolenaar
402750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
403750802b5SBram Moolenaar  set cpo&vi
404750802b5SBram Moolenaar  let cpo_before = &cpo
405750802b5SBram Moolenaar  let lines =<< trim END
406750802b5SBram Moolenaar    vim9script
407750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
408750802b5SBram Moolenaar  END
409750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
410750802b5SBram Moolenaar  source Xvim9_script
411750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
412750802b5SBram Moolenaar  set cpo&vim
413750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
414750802b5SBram Moolenaar  delete('Xvim9_script')
415750802b5SBram Moolenaarenddef
416750802b5SBram Moolenaar
417750802b5SBram Moolenaardef Test_vim9script_fails()
4188a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
4198a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
420750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
421f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
422750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
423750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
424750802b5SBram Moolenaar
425750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
426750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
4278a7d6542SBram Moolenaarenddef
4288a7d6542SBram Moolenaar
4298a7d6542SBram Moolenaardef Test_vim9script_call()
4308a7d6542SBram Moolenaar  let lines =<< trim END
4318a7d6542SBram Moolenaar    vim9script
4328a7d6542SBram Moolenaar    let var = ''
4338a7d6542SBram Moolenaar    def MyFunc(arg: string)
4348a7d6542SBram Moolenaar       var = arg
4358a7d6542SBram Moolenaar    enddef
4368a7d6542SBram Moolenaar    MyFunc('foobar')
4378a7d6542SBram Moolenaar    assert_equal('foobar', var)
4388a7d6542SBram Moolenaar
4398a7d6542SBram Moolenaar    let str = 'barfoo'
4408a7d6542SBram Moolenaar    str->MyFunc()
4418a7d6542SBram Moolenaar    assert_equal('barfoo', var)
4428a7d6542SBram Moolenaar
4438a7d6542SBram Moolenaar    let g:value = 'value'
4448a7d6542SBram Moolenaar    g:value->MyFunc()
4458a7d6542SBram Moolenaar    assert_equal('value', var)
4468a7d6542SBram Moolenaar
4478a7d6542SBram Moolenaar    let listvar = []
4488a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
4498a7d6542SBram Moolenaar       listvar = arg
4508a7d6542SBram Moolenaar    enddef
4518a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
4528a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
4538a7d6542SBram Moolenaar
4548a7d6542SBram Moolenaar    let dictvar = {}
4558a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
4568a7d6542SBram Moolenaar       dictvar = arg
4578a7d6542SBram Moolenaar    enddef
4588a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
4598a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
4608a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
4618a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
4620c6ceaf9SBram Moolenaar
4630c6ceaf9SBram Moolenaar    ('text')->MyFunc()
4640c6ceaf9SBram Moolenaar    assert_equal('text', var)
4650c6ceaf9SBram Moolenaar    ("some")->MyFunc()
4660c6ceaf9SBram Moolenaar    assert_equal('some', var)
4678a7d6542SBram Moolenaar  END
4688a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
4698a7d6542SBram Moolenaar  source Xcall.vim
4708a7d6542SBram Moolenaar  delete('Xcall.vim')
4718a7d6542SBram Moolenaarenddef
4728a7d6542SBram Moolenaar
4738a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
4748a7d6542SBram Moolenaar  let lines =<< trim END
4758a7d6542SBram Moolenaar    vim9script
4768a7d6542SBram Moolenaar    let var = ''
4778a7d6542SBram Moolenaar    def MyFunc(arg: string)
4788a7d6542SBram Moolenaar       let var = 123
4798a7d6542SBram Moolenaar    enddef
4808a7d6542SBram Moolenaar  END
4818a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
4828a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
4838a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
4848a7d6542SBram Moolenaarenddef
4858a7d6542SBram Moolenaar
4868a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
4878a7d6542SBram Moolenaar  let lines =<< trim END
4888a7d6542SBram Moolenaar    vim9script
4898a7d6542SBram Moolenaar    const var = ''
4908a7d6542SBram Moolenaar    def MyFunc(arg: string)
4918a7d6542SBram Moolenaar       var = 'asdf'
4928a7d6542SBram Moolenaar    enddef
4938a7d6542SBram Moolenaar  END
4948a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
4958a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
4968a7d6542SBram Moolenaar  delete('Xcall_const.vim')
4978a7d6542SBram Moolenaarenddef
4988a7d6542SBram Moolenaar
4998a7d6542SBram Moolenaardef Test_vim9script_reload()
5008a7d6542SBram Moolenaar  let lines =<< trim END
5018a7d6542SBram Moolenaar    vim9script
5028a7d6542SBram Moolenaar    const var = ''
5038a7d6542SBram Moolenaar    let valone = 1234
5048a7d6542SBram Moolenaar    def MyFunc(arg: string)
5058a7d6542SBram Moolenaar       valone = 5678
5068a7d6542SBram Moolenaar    enddef
5078a7d6542SBram Moolenaar  END
5088a7d6542SBram Moolenaar  let morelines =<< trim END
5098a7d6542SBram Moolenaar    let valtwo = 222
5108a7d6542SBram Moolenaar    export def GetValtwo(): number
5118a7d6542SBram Moolenaar      return valtwo
5128a7d6542SBram Moolenaar    enddef
5138a7d6542SBram Moolenaar  END
5148a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
5158a7d6542SBram Moolenaar  source Xreload.vim
5168a7d6542SBram Moolenaar  source Xreload.vim
5178a7d6542SBram Moolenaar  source Xreload.vim
5188a7d6542SBram Moolenaar
5198a7d6542SBram Moolenaar  let testlines =<< trim END
5208a7d6542SBram Moolenaar    vim9script
5218a7d6542SBram Moolenaar    def TheFunc()
5228a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
5238a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
5248a7d6542SBram Moolenaar    enddef
5258a7d6542SBram Moolenaar    TheFunc()
5268a7d6542SBram Moolenaar  END
5278a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
5288a7d6542SBram Moolenaar  source Ximport.vim
5298a7d6542SBram Moolenaar
5308a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
5318a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
5328a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5338a7d6542SBram Moolenaar  source Xreload.vim
5348a7d6542SBram Moolenaar  source Ximport.vim
5358a7d6542SBram Moolenaar
5368a7d6542SBram Moolenaar  " cannot declare a var twice
5378a7d6542SBram Moolenaar  lines =<< trim END
5388a7d6542SBram Moolenaar    vim9script
5398a7d6542SBram Moolenaar    let valone = 1234
5408a7d6542SBram Moolenaar    let valone = 5678
5418a7d6542SBram Moolenaar  END
5428a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5438a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
5448a7d6542SBram Moolenaar
5458a7d6542SBram Moolenaar  delete('Xreload.vim')
5468a7d6542SBram Moolenaar  delete('Ximport.vim')
5478a7d6542SBram Moolenaarenddef
5488a7d6542SBram Moolenaar
5498a7d6542SBram Moolenaardef Test_import_absolute()
5508a7d6542SBram Moolenaar  let import_lines = [
5518a7d6542SBram Moolenaar        \ 'vim9script',
5528a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
553b283a8a6SBram Moolenaar        \ 'def UseExported()',
5548a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
5554e12a5dfSBram Moolenaar        \ '  exported = 8888',
5564e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
557b283a8a6SBram Moolenaar        \ 'enddef',
558b283a8a6SBram Moolenaar        \ 'UseExported()',
5594e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
5608a7d6542SBram Moolenaar        \ ]
5618a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
5628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
5638a7d6542SBram Moolenaar
5648a7d6542SBram Moolenaar  source Ximport_abs.vim
5658a7d6542SBram Moolenaar
5668a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
5674e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
568b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
569b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
570b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
5714e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
5724e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
5734e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
5744e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
5754e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
5764e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
5774e12a5dfSBram Moolenaar        \, g:import_disassembled)
5788a7d6542SBram Moolenaar  unlet g:imported_abs
5794e12a5dfSBram Moolenaar  unlet g:import_disassembled
5808a7d6542SBram Moolenaar
5818a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
5828a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
5838a7d6542SBram Moolenaarenddef
5848a7d6542SBram Moolenaar
5858a7d6542SBram Moolenaardef Test_import_rtp()
5868a7d6542SBram Moolenaar  let import_lines = [
5878a7d6542SBram Moolenaar        \ 'vim9script',
5888a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
5898a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
5908a7d6542SBram Moolenaar        \ ]
5918a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
5928a7d6542SBram Moolenaar  mkdir('import')
5938a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
5948a7d6542SBram Moolenaar
5958a7d6542SBram Moolenaar  let save_rtp = &rtp
5968a7d6542SBram Moolenaar  &rtp = getcwd()
5978a7d6542SBram Moolenaar  source Ximport_rtp.vim
5988a7d6542SBram Moolenaar  &rtp = save_rtp
5998a7d6542SBram Moolenaar
6008a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6018a7d6542SBram Moolenaar  unlet g:imported_rtp
6028a7d6542SBram Moolenaar
6038a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6048a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6058a7d6542SBram Moolenaar  delete('import', 'd')
6068a7d6542SBram Moolenaarenddef
6078a7d6542SBram Moolenaar
6088a7d6542SBram Moolenaardef Test_fixed_size_list()
6098a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6108a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
6118a7d6542SBram Moolenaar  l->remove(0)
6128a7d6542SBram Moolenaar  l->add(5)
6138a7d6542SBram Moolenaar  l->insert(99, 1)
6140f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
6158a7d6542SBram Moolenaarenddef
6168a7d6542SBram Moolenaar
617673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
618673660abSBram Moolenaar" recognized.
619673660abSBram Moolenaarfunc Test_function_python()
620673660abSBram Moolenaar  CheckFeature python3
621673660abSBram Moolenaar  let py = 'python3'
622673660abSBram Moolenaar  execute py "<< EOF"
623673660abSBram Moolenaardef do_something():
624673660abSBram Moolenaar  return 1
625673660abSBram MoolenaarEOF
626673660abSBram Moolenaarendfunc
627673660abSBram Moolenaar
628158906cfSBram Moolenaardef IfElse(what: number): string
629158906cfSBram Moolenaar  let res = ''
630158906cfSBram Moolenaar  if what == 1
631158906cfSBram Moolenaar    res = "one"
632158906cfSBram Moolenaar  elseif what == 2
633158906cfSBram Moolenaar    res = "two"
634a259d8d3SBram Moolenaar  else
635158906cfSBram Moolenaar    res = "three"
636a259d8d3SBram Moolenaar  endif
637158906cfSBram Moolenaar  return res
638a259d8d3SBram Moolenaarenddef
639a259d8d3SBram Moolenaar
640158906cfSBram Moolenaardef Test_if_elseif_else()
641158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
642158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
643158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
6440f18b6d1SBram Moolenaarenddef
6450f18b6d1SBram Moolenaar
64663ce4849SBram Moolenaardef Test_delfunc()
64763ce4849SBram Moolenaar  let lines =<< trim END
64863ce4849SBram Moolenaar    vim9script
64963ce4849SBram Moolenaar    def GoneSoon()
65063ce4849SBram Moolenaar      echo 'hello'
65163ce4849SBram Moolenaar    enddef
65263ce4849SBram Moolenaar
65363ce4849SBram Moolenaar    def CallGoneSoon()
65463ce4849SBram Moolenaar      GoneSoon()
65563ce4849SBram Moolenaar    enddef
65663ce4849SBram Moolenaar
65763ce4849SBram Moolenaar    delfunc GoneSoon
65863ce4849SBram Moolenaar    CallGoneSoon()
65963ce4849SBram Moolenaar  END
66063ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
66163ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
66263ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
66363ce4849SBram Moolenaar
66463ce4849SBram Moolenaar  delete('XToDelFunc')
66563ce4849SBram Moolenaarenddef
66663ce4849SBram Moolenaar
6675b1c8fe3SBram Moolenaardef Test_substitute_cmd()
6685b1c8fe3SBram Moolenaar  new
6695b1c8fe3SBram Moolenaar  setline(1, 'something')
6705b1c8fe3SBram Moolenaar  :substitute(some(other(
6715b1c8fe3SBram Moolenaar  assert_equal('otherthing', getline(1))
67283f37b91SBram Moolenaar  bwipe!
67383f37b91SBram Moolenaar
67483f37b91SBram Moolenaar  " also when the context is Vim9 script
67583f37b91SBram Moolenaar  let lines =<< trim END
67683f37b91SBram Moolenaar    vim9script
67783f37b91SBram Moolenaar    new
67883f37b91SBram Moolenaar    setline(1, 'something')
67983f37b91SBram Moolenaar    :substitute(some(other(
68083f37b91SBram Moolenaar    assert_equal('otherthing', getline(1))
68183f37b91SBram Moolenaar    bwipe!
68283f37b91SBram Moolenaar  END
68383f37b91SBram Moolenaar  writefile(lines, 'Xvim9lines')
68483f37b91SBram Moolenaar  source Xvim9lines
68583f37b91SBram Moolenaar
68683f37b91SBram Moolenaar  delete('Xvim9lines')
6875b1c8fe3SBram Moolenaarenddef
6885b1c8fe3SBram Moolenaar
6898a7d6542SBram Moolenaar
6908a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
691