18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5673660abSBram Moolenaar
68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
8978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
98a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
108a7d6542SBram Moolenaar  call delete('Xdef')
118a7d6542SBram Moolenaarendfunc
128a7d6542SBram Moolenaar
138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
148a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
158a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
168a7d6542SBram Moolenaar  call delete('Xdef')
178a7d6542SBram Moolenaarendfunc
188a7d6542SBram Moolenaar
198a7d6542SBram Moolenaardef Test_syntax()
208a7d6542SBram Moolenaar  let var = 234
218a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
228a7d6542SBram Moolenaarenddef
238a7d6542SBram Moolenaar
248a7d6542SBram Moolenaarfunc Test_def_basic()
258a7d6542SBram Moolenaar  def SomeFunc(): string
268a7d6542SBram Moolenaar    return 'yes'
278a7d6542SBram Moolenaar  enddef
288a7d6542SBram Moolenaar  call assert_equal('yes', SomeFunc())
298a7d6542SBram Moolenaarendfunc
308a7d6542SBram Moolenaar
316e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
326e587dcbSBram Moolenaarlet s:addToMe = 111
33401d9ffbSBram Moolenaarlet g:existing = 'yes'
346e587dcbSBram Moolenaar
358a7d6542SBram Moolenaardef Test_assignment()
368a7d6542SBram Moolenaar  let bool1: bool = true
378a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
388a7d6542SBram Moolenaar  let bool2: bool = false
398a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
408a7d6542SBram Moolenaar
410c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
428a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
430c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
440c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
450c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
468a7d6542SBram Moolenaar
47436472f5SBram Moolenaar  let listS: list<string> = []
48436472f5SBram Moolenaar  let listN: list<number> = []
498a7d6542SBram Moolenaar
500c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
518a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
520c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
530c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
540c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
55b283a8a6SBram Moolenaar
56401d9ffbSBram Moolenaar  g:newvar = 'new'
57401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
58401d9ffbSBram Moolenaar
59401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
60401d9ffbSBram Moolenaar  g:existing = 'no'
61401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
62401d9ffbSBram Moolenaar
63b283a8a6SBram Moolenaar  v:char = 'abc'
646e587dcbSBram Moolenaar  assert_equal('abc', v:char)
65b283a8a6SBram Moolenaar
66b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
676e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
68b283a8a6SBram Moolenaar  $ENVVAR = ''
696e587dcbSBram Moolenaar
70fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
71fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
72fd1823e0SBram Moolenaar  s:addToMe += 222
73fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
740bbf722aSBram Moolenaar  s:newVar = 'new'
750bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
768a7d6542SBram Moolenaarenddef
778a7d6542SBram Moolenaar
788a7d6542SBram Moolenaarfunc Test_assignment_failure()
798a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
808a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
818a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
828a7d6542SBram Moolenaar
838a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
848a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
858a7d6542SBram Moolenaar
868a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
878a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
888a7d6542SBram Moolenaar
898a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
908a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
918a7d6542SBram Moolenaar
928a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
938a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
948a7d6542SBram Moolenaarendfunc
958a7d6542SBram Moolenaar
968a7d6542SBram Moolenaarfunc Test_const()
978a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
988a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
998a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
1008a7d6542SBram Moolenaarendfunc
1018a7d6542SBram Moolenaar
1028a7d6542SBram Moolenaardef Test_block()
1038a7d6542SBram Moolenaar  let outer = 1
1048a7d6542SBram Moolenaar  {
1058a7d6542SBram Moolenaar    let inner = 2
1068a7d6542SBram Moolenaar    assert_equal(1, outer)
1078a7d6542SBram Moolenaar    assert_equal(2, inner)
1088a7d6542SBram Moolenaar  }
1098a7d6542SBram Moolenaar  assert_equal(1, outer)
1108a7d6542SBram Moolenaarenddef
1118a7d6542SBram Moolenaar
1128a7d6542SBram Moolenaarfunc Test_block_failure()
1138a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1148a7d6542SBram Moolenaarendfunc
1158a7d6542SBram Moolenaar
1168a7d6542SBram Moolenaardef ReturnString(): string
1178a7d6542SBram Moolenaar  return 'string'
1188a7d6542SBram Moolenaarenddef
1198a7d6542SBram Moolenaar
1208a7d6542SBram Moolenaardef ReturnNumber(): number
1218a7d6542SBram Moolenaar  return 123
1228a7d6542SBram Moolenaarenddef
1238a7d6542SBram Moolenaar
12409f28f49SBram Moolenaarlet g:notNumber = 'string'
12509f28f49SBram Moolenaar
12609f28f49SBram Moolenaardef ReturnGlobal(): number
12709f28f49SBram Moolenaar  return g:notNumber
12809f28f49SBram Moolenaarenddef
12909f28f49SBram Moolenaar
1308a7d6542SBram Moolenaardef Test_return_string()
1318a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1328a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
13309f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1348a7d6542SBram Moolenaarenddef
1358a7d6542SBram Moolenaar
1368a7d6542SBram Moolenaarfunc Increment()
1378a7d6542SBram Moolenaar  let g:counter += 1
1388a7d6542SBram Moolenaarendfunc
1398a7d6542SBram Moolenaar
1408a7d6542SBram Moolenaardef Test_call_ufunc_count()
1418a7d6542SBram Moolenaar  g:counter = 1
1428a7d6542SBram Moolenaar  Increment()
1438a7d6542SBram Moolenaar  Increment()
1448a7d6542SBram Moolenaar  Increment()
1458a7d6542SBram Moolenaar  " works with and without :call
1468a7d6542SBram Moolenaar  assert_equal(4, g:counter)
147b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1488a7d6542SBram Moolenaar  unlet g:counter
1498a7d6542SBram Moolenaarenddef
1508a7d6542SBram Moolenaar
1518a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1528a7d6542SBram Moolenaar  let res = arg
1538a7d6542SBram Moolenaar  for s in rest
1548a7d6542SBram Moolenaar    res ..= ',' .. s
1558a7d6542SBram Moolenaar  endfor
1568a7d6542SBram Moolenaar  return res
1578a7d6542SBram Moolenaarenddef
1588a7d6542SBram Moolenaar
1598a7d6542SBram Moolenaardef Test_call_varargs()
1608a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1618a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1628a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1638a7d6542SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
165170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
166170fcfcfSBram Moolenaar  return name
167170fcfcfSBram Moolenaarenddef
168170fcfcfSBram Moolenaar
169170fcfcfSBram Moolenaardef Test_call_default_args()
170170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
171170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
172170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
173170fcfcfSBram Moolenaarenddef
174170fcfcfSBram Moolenaar
175170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
176170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
177170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
178170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
179170fcfcfSBram Moolenaarendfunc
180170fcfcfSBram Moolenaar
181*b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
182*b35efa5eSBram Moolenaar  echo a:arg
183*b35efa5eSBram Moolenaarendfunc
184*b35efa5eSBram Moolenaar
185*b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
186*b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
187*b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
188*b35efa5eSBram Moolenaarenddef
189*b35efa5eSBram Moolenaar
190170fcfcfSBram Moolenaar" Default arg and varargs
191170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
192170fcfcfSBram Moolenaar  let res = one .. ',' .. two
193170fcfcfSBram Moolenaar  for s in rest
194170fcfcfSBram Moolenaar    res ..= ',' .. s
195170fcfcfSBram Moolenaar  endfor
196170fcfcfSBram Moolenaar  return res
197170fcfcfSBram Moolenaarenddef
198170fcfcfSBram Moolenaar
199170fcfcfSBram Moolenaardef Test_call_def_varargs()
200170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
201170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
202170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
203170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
204170fcfcfSBram Moolenaarenddef
205170fcfcfSBram Moolenaar
206*b35efa5eSBram Moolenaardef Test_call_func_defined_later()
207*b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
208*b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
209*b35efa5eSBram Moolenaarenddef
210170fcfcfSBram Moolenaar
211*b35efa5eSBram Moolenaarfunc DefinedLater(arg)
21226e117e9SBram Moolenaar  return a:arg
21326e117e9SBram Moolenaarendfunc
21426e117e9SBram Moolenaar
2158a7d6542SBram Moolenaardef Test_return_type_wrong()
216978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
217978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
218978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
219978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
2208a7d6542SBram Moolenaarenddef
2218a7d6542SBram Moolenaar
222bfe12043SBram Moolenaardef Test_arg_type_wrong()
223bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
224bfe12043SBram Moolenaarenddef
225bfe12043SBram Moolenaar
2268a7d6542SBram Moolenaardef Test_try_catch()
2278a7d6542SBram Moolenaar  let l = []
2288a7d6542SBram Moolenaar  try
2298a7d6542SBram Moolenaar    add(l, '1')
2308a7d6542SBram Moolenaar    throw 'wrong'
2318a7d6542SBram Moolenaar    add(l, '2')
2328a7d6542SBram Moolenaar  catch
2338a7d6542SBram Moolenaar    add(l, v:exception)
2348a7d6542SBram Moolenaar  finally
2358a7d6542SBram Moolenaar    add(l, '3')
2368a7d6542SBram Moolenaar  endtry
2378a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2388a7d6542SBram Moolenaarenddef
2398a7d6542SBram Moolenaar
240257cc5eeSBram Moolenaardef ThrowFromDef()
241257cc5eeSBram Moolenaar  throw 'getout'
242257cc5eeSBram Moolenaarenddef
243257cc5eeSBram Moolenaar
244257cc5eeSBram Moolenaarfunc CatchInFunc()
245257cc5eeSBram Moolenaar  try
246257cc5eeSBram Moolenaar    call ThrowFromDef()
247257cc5eeSBram Moolenaar  catch
248257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
249257cc5eeSBram Moolenaar  endtry
250257cc5eeSBram Moolenaarendfunc
251257cc5eeSBram Moolenaar
252257cc5eeSBram Moolenaardef CatchInDef()
253257cc5eeSBram Moolenaar  try
254257cc5eeSBram Moolenaar    ThrowFromDef()
255257cc5eeSBram Moolenaar  catch
256257cc5eeSBram Moolenaar    g:thrown_def = v:exception
257257cc5eeSBram Moolenaar  endtry
258257cc5eeSBram Moolenaarenddef
259257cc5eeSBram Moolenaar
260f575adffSBram Moolenaardef ReturnFinally(): string
261f575adffSBram Moolenaar  try
262f575adffSBram Moolenaar    return 'intry'
263f575adffSBram Moolenaar  finally
264f575adffSBram Moolenaar    g:in_finally = 'finally'
265f575adffSBram Moolenaar  endtry
266f575adffSBram Moolenaar  return 'end'
267f575adffSBram Moolenaarenddef
268f575adffSBram Moolenaar
269257cc5eeSBram Moolenaardef Test_try_catch_nested()
270257cc5eeSBram Moolenaar  CatchInFunc()
271257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
272257cc5eeSBram Moolenaar
273257cc5eeSBram Moolenaar  CatchInDef()
274257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
275f575adffSBram Moolenaar
276f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
277f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
278f575adffSBram Moolenaarenddef
279f575adffSBram Moolenaar
280f575adffSBram Moolenaardef Test_try_catch_match()
281f575adffSBram Moolenaar  let seq = 'a'
282f575adffSBram Moolenaar  try
283f575adffSBram Moolenaar    throw 'something'
284f575adffSBram Moolenaar  catch /nothing/
285f575adffSBram Moolenaar    seq ..= 'x'
286f575adffSBram Moolenaar  catch /some/
287f575adffSBram Moolenaar    seq ..= 'b'
288f575adffSBram Moolenaar  catch /asdf/
289f575adffSBram Moolenaar    seq ..= 'x'
290f575adffSBram Moolenaar  finally
291f575adffSBram Moolenaar    seq ..= 'c'
292f575adffSBram Moolenaar  endtry
293f575adffSBram Moolenaar  assert_equal('abc', seq)
294257cc5eeSBram Moolenaarenddef
295257cc5eeSBram Moolenaar
2968a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
2978a7d6542SBram Moolenaar  vim9script
2988a7d6542SBram Moolenaar  let name: string = 'bob'
2998a7d6542SBram Moolenaar  def Concat(arg: string): string
3008a7d6542SBram Moolenaar    return name .. arg
3018a7d6542SBram Moolenaar  enddef
3028a7d6542SBram Moolenaar  let g:result = Concat('bie')
3038a7d6542SBram Moolenaar  let g:localname = name
3048a7d6542SBram Moolenaar
3058a7d6542SBram Moolenaar  export const CONST = 1234
3068a7d6542SBram Moolenaar  export let exported = 9876
3076e587dcbSBram Moolenaar  export let exp_name = 'John'
3088a7d6542SBram Moolenaar  export def Exported(): string
3098a7d6542SBram Moolenaar    return 'Exported'
3108a7d6542SBram Moolenaar  enddef
3118a7d6542SBram MoolenaarEND
3128a7d6542SBram Moolenaar
3138a7d6542SBram Moolenaardef Test_vim9script()
3148a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3158a7d6542SBram Moolenaar    vim9script
3168a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3178a7d6542SBram Moolenaar    g:imported = exported
3186e587dcbSBram Moolenaar    exported += 3
3196e587dcbSBram Moolenaar    g:imported_added = exported
3208a7d6542SBram Moolenaar    g:imported_func = Exported()
3216e587dcbSBram Moolenaar
3226e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3236e587dcbSBram Moolenaar    g:imported_name = exp_name
3246e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3256e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3268a7d6542SBram Moolenaar  END
3278a7d6542SBram Moolenaar
3288a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3298a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3308a7d6542SBram Moolenaar
3318a7d6542SBram Moolenaar  source Ximport.vim
3328a7d6542SBram Moolenaar
3338a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3348a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3358a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3366e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3378a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3386e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3396e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3408a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3418a7d6542SBram Moolenaar
3428a7d6542SBram Moolenaar  unlet g:result
3438a7d6542SBram Moolenaar  unlet g:localname
3448a7d6542SBram Moolenaar  unlet g:imported
3456e587dcbSBram Moolenaar  unlet g:imported_added
3468a7d6542SBram Moolenaar  unlet g:imported_func
3476e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
3488a7d6542SBram Moolenaar  delete('Ximport.vim')
349f2d5c240SBram Moolenaar
350f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
351f2d5c240SBram Moolenaar    vim9script
352f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
353f2d5c240SBram Moolenaar    def UseExport()
354f2d5c240SBram Moolenaar      g:imported = Export.exported
355f2d5c240SBram Moolenaar    enddef
356f2d5c240SBram Moolenaar    UseExport()
357f2d5c240SBram Moolenaar  END
358f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
359f2d5c240SBram Moolenaar  source Ximport.vim
360f2d5c240SBram Moolenaar  assert_equal(9876, g:imported)
361f2d5c240SBram Moolenaar
362f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
363f2d5c240SBram Moolenaar    vim9script
364f2d5c240SBram Moolenaar    import * from './Xexport.vim'
365f2d5c240SBram Moolenaar    g:imported = exported
366f2d5c240SBram Moolenaar  END
367f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
368f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
369f2d5c240SBram Moolenaar
370fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
371fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
372fa29c8abSBram Moolenaar    vim9script
373fa29c8abSBram Moolenaar    import name from './Xexport.vim'
374fa29c8abSBram Moolenaar  END
375fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
376fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
377fa29c8abSBram Moolenaar
378fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
379fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
380fa29c8abSBram Moolenaar    vim9script
381fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
382fa29c8abSBram Moolenaar  END
383fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
384fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
385fa29c8abSBram Moolenaar
386fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
387fa29c8abSBram Moolenaar    vim9script
388fa29c8abSBram Moolenaar    import name './Xexport.vim'
389fa29c8abSBram Moolenaar  END
390fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
391fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
392fa29c8abSBram Moolenaar
393fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
394fa29c8abSBram Moolenaar    vim9script
395fa29c8abSBram Moolenaar    import name from Xexport.vim
396fa29c8abSBram Moolenaar  END
397fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
398fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
399fa29c8abSBram Moolenaar
400fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
401fa29c8abSBram Moolenaar    vim9script
402fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
403fa29c8abSBram Moolenaar  END
404fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
405fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
406fa29c8abSBram Moolenaar
407fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
408fa29c8abSBram Moolenaar    vim9script
409fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
410fa29c8abSBram Moolenaar  END
411fa29c8abSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport.vim')
412fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1046:')
413fa29c8abSBram Moolenaar
414f2d5c240SBram Moolenaar  delete('Ximport.vim')
4158a7d6542SBram Moolenaar  delete('Xexport.vim')
4168a7d6542SBram Moolenaar
417750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
418750802b5SBram Moolenaar  set cpo&vi
419750802b5SBram Moolenaar  let cpo_before = &cpo
420750802b5SBram Moolenaar  let lines =<< trim END
421750802b5SBram Moolenaar    vim9script
422750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
423750802b5SBram Moolenaar  END
424750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
425750802b5SBram Moolenaar  source Xvim9_script
426750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
427750802b5SBram Moolenaar  set cpo&vim
428750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
429750802b5SBram Moolenaar  delete('Xvim9_script')
430750802b5SBram Moolenaarenddef
431750802b5SBram Moolenaar
432750802b5SBram Moolenaardef Test_vim9script_fails()
4338a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
4348a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
435750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
436f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
437750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
438750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
439750802b5SBram Moolenaar
440750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
441750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
4428a7d6542SBram Moolenaarenddef
4438a7d6542SBram Moolenaar
4448a7d6542SBram Moolenaardef Test_vim9script_call()
4458a7d6542SBram Moolenaar  let lines =<< trim END
4468a7d6542SBram Moolenaar    vim9script
4478a7d6542SBram Moolenaar    let var = ''
4488a7d6542SBram Moolenaar    def MyFunc(arg: string)
4498a7d6542SBram Moolenaar       var = arg
4508a7d6542SBram Moolenaar    enddef
4518a7d6542SBram Moolenaar    MyFunc('foobar')
4528a7d6542SBram Moolenaar    assert_equal('foobar', var)
4538a7d6542SBram Moolenaar
4548a7d6542SBram Moolenaar    let str = 'barfoo'
4558a7d6542SBram Moolenaar    str->MyFunc()
4568a7d6542SBram Moolenaar    assert_equal('barfoo', var)
4578a7d6542SBram Moolenaar
4588a7d6542SBram Moolenaar    let g:value = 'value'
4598a7d6542SBram Moolenaar    g:value->MyFunc()
4608a7d6542SBram Moolenaar    assert_equal('value', var)
4618a7d6542SBram Moolenaar
4628a7d6542SBram Moolenaar    let listvar = []
4638a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
4648a7d6542SBram Moolenaar       listvar = arg
4658a7d6542SBram Moolenaar    enddef
4668a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
4678a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
4688a7d6542SBram Moolenaar
4698a7d6542SBram Moolenaar    let dictvar = {}
4708a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
4718a7d6542SBram Moolenaar       dictvar = arg
4728a7d6542SBram Moolenaar    enddef
4738a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
4748a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
4758a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
4768a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
4770c6ceaf9SBram Moolenaar
4780c6ceaf9SBram Moolenaar    ('text')->MyFunc()
4790c6ceaf9SBram Moolenaar    assert_equal('text', var)
4800c6ceaf9SBram Moolenaar    ("some")->MyFunc()
4810c6ceaf9SBram Moolenaar    assert_equal('some', var)
4828a7d6542SBram Moolenaar  END
4838a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
4848a7d6542SBram Moolenaar  source Xcall.vim
4858a7d6542SBram Moolenaar  delete('Xcall.vim')
4868a7d6542SBram Moolenaarenddef
4878a7d6542SBram Moolenaar
4888a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
4898a7d6542SBram Moolenaar  let lines =<< trim END
4908a7d6542SBram Moolenaar    vim9script
4918a7d6542SBram Moolenaar    let var = ''
4928a7d6542SBram Moolenaar    def MyFunc(arg: string)
4938a7d6542SBram Moolenaar       let var = 123
4948a7d6542SBram Moolenaar    enddef
4958a7d6542SBram Moolenaar  END
4968a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
4978a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
4988a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
4998a7d6542SBram Moolenaarenddef
5008a7d6542SBram Moolenaar
5018a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
5028a7d6542SBram Moolenaar  let lines =<< trim END
5038a7d6542SBram Moolenaar    vim9script
5048a7d6542SBram Moolenaar    const var = ''
5058a7d6542SBram Moolenaar    def MyFunc(arg: string)
5068a7d6542SBram Moolenaar       var = 'asdf'
5078a7d6542SBram Moolenaar    enddef
5088a7d6542SBram Moolenaar  END
5098a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
5108a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
5118a7d6542SBram Moolenaar  delete('Xcall_const.vim')
5128a7d6542SBram Moolenaarenddef
5138a7d6542SBram Moolenaar
5148a7d6542SBram Moolenaardef Test_vim9script_reload()
5158a7d6542SBram Moolenaar  let lines =<< trim END
5168a7d6542SBram Moolenaar    vim9script
5178a7d6542SBram Moolenaar    const var = ''
5188a7d6542SBram Moolenaar    let valone = 1234
5198a7d6542SBram Moolenaar    def MyFunc(arg: string)
5208a7d6542SBram Moolenaar       valone = 5678
5218a7d6542SBram Moolenaar    enddef
5228a7d6542SBram Moolenaar  END
5238a7d6542SBram Moolenaar  let morelines =<< trim END
5248a7d6542SBram Moolenaar    let valtwo = 222
5258a7d6542SBram Moolenaar    export def GetValtwo(): number
5268a7d6542SBram Moolenaar      return valtwo
5278a7d6542SBram Moolenaar    enddef
5288a7d6542SBram Moolenaar  END
5298a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
5308a7d6542SBram Moolenaar  source Xreload.vim
5318a7d6542SBram Moolenaar  source Xreload.vim
5328a7d6542SBram Moolenaar  source Xreload.vim
5338a7d6542SBram Moolenaar
5348a7d6542SBram Moolenaar  let testlines =<< trim END
5358a7d6542SBram Moolenaar    vim9script
5368a7d6542SBram Moolenaar    def TheFunc()
5378a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
5388a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
5398a7d6542SBram Moolenaar    enddef
5408a7d6542SBram Moolenaar    TheFunc()
5418a7d6542SBram Moolenaar  END
5428a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
5438a7d6542SBram Moolenaar  source Ximport.vim
5448a7d6542SBram Moolenaar
5458a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
5468a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
5478a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5488a7d6542SBram Moolenaar  source Xreload.vim
5498a7d6542SBram Moolenaar  source Ximport.vim
5508a7d6542SBram Moolenaar
5518a7d6542SBram Moolenaar  " cannot declare a var twice
5528a7d6542SBram Moolenaar  lines =<< trim END
5538a7d6542SBram Moolenaar    vim9script
5548a7d6542SBram Moolenaar    let valone = 1234
5558a7d6542SBram Moolenaar    let valone = 5678
5568a7d6542SBram Moolenaar  END
5578a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5588a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
5598a7d6542SBram Moolenaar
5608a7d6542SBram Moolenaar  delete('Xreload.vim')
5618a7d6542SBram Moolenaar  delete('Ximport.vim')
5628a7d6542SBram Moolenaarenddef
5638a7d6542SBram Moolenaar
5648a7d6542SBram Moolenaardef Test_import_absolute()
5658a7d6542SBram Moolenaar  let import_lines = [
5668a7d6542SBram Moolenaar        \ 'vim9script',
5678a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
568b283a8a6SBram Moolenaar        \ 'def UseExported()',
5698a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
5704e12a5dfSBram Moolenaar        \ '  exported = 8888',
5714e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
572b283a8a6SBram Moolenaar        \ 'enddef',
573b283a8a6SBram Moolenaar        \ 'UseExported()',
5744e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
5758a7d6542SBram Moolenaar        \ ]
5768a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
5778a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
5788a7d6542SBram Moolenaar
5798a7d6542SBram Moolenaar  source Ximport_abs.vim
5808a7d6542SBram Moolenaar
5818a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
5824e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
583b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
584b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
585b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
5864e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
5874e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
5884e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
5894e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
5904e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
5914e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
5924e12a5dfSBram Moolenaar        \, g:import_disassembled)
5938a7d6542SBram Moolenaar  unlet g:imported_abs
5944e12a5dfSBram Moolenaar  unlet g:import_disassembled
5958a7d6542SBram Moolenaar
5968a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
5978a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
5988a7d6542SBram Moolenaarenddef
5998a7d6542SBram Moolenaar
6008a7d6542SBram Moolenaardef Test_import_rtp()
6018a7d6542SBram Moolenaar  let import_lines = [
6028a7d6542SBram Moolenaar        \ 'vim9script',
6038a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
6048a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
6058a7d6542SBram Moolenaar        \ ]
6068a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6078a7d6542SBram Moolenaar  mkdir('import')
6088a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6098a7d6542SBram Moolenaar
6108a7d6542SBram Moolenaar  let save_rtp = &rtp
6118a7d6542SBram Moolenaar  &rtp = getcwd()
6128a7d6542SBram Moolenaar  source Ximport_rtp.vim
6138a7d6542SBram Moolenaar  &rtp = save_rtp
6148a7d6542SBram Moolenaar
6158a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6168a7d6542SBram Moolenaar  unlet g:imported_rtp
6178a7d6542SBram Moolenaar
6188a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6198a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6208a7d6542SBram Moolenaar  delete('import', 'd')
6218a7d6542SBram Moolenaarenddef
6228a7d6542SBram Moolenaar
6238a7d6542SBram Moolenaardef Test_fixed_size_list()
6248a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6258a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
6268a7d6542SBram Moolenaar  l->remove(0)
6278a7d6542SBram Moolenaar  l->add(5)
6288a7d6542SBram Moolenaar  l->insert(99, 1)
6290f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
6308a7d6542SBram Moolenaarenddef
6318a7d6542SBram Moolenaar
632673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
633673660abSBram Moolenaar" recognized.
634673660abSBram Moolenaarfunc Test_function_python()
635673660abSBram Moolenaar  CheckFeature python3
636673660abSBram Moolenaar  let py = 'python3'
637673660abSBram Moolenaar  execute py "<< EOF"
638673660abSBram Moolenaardef do_something():
639673660abSBram Moolenaar  return 1
640673660abSBram MoolenaarEOF
641673660abSBram Moolenaarendfunc
642673660abSBram Moolenaar
643158906cfSBram Moolenaardef IfElse(what: number): string
644158906cfSBram Moolenaar  let res = ''
645158906cfSBram Moolenaar  if what == 1
646158906cfSBram Moolenaar    res = "one"
647158906cfSBram Moolenaar  elseif what == 2
648158906cfSBram Moolenaar    res = "two"
649a259d8d3SBram Moolenaar  else
650158906cfSBram Moolenaar    res = "three"
651a259d8d3SBram Moolenaar  endif
652158906cfSBram Moolenaar  return res
653a259d8d3SBram Moolenaarenddef
654a259d8d3SBram Moolenaar
655158906cfSBram Moolenaardef Test_if_elseif_else()
656158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
657158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
658158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
6590f18b6d1SBram Moolenaarenddef
6600f18b6d1SBram Moolenaar
66163ce4849SBram Moolenaardef Test_delfunc()
66263ce4849SBram Moolenaar  let lines =<< trim END
66363ce4849SBram Moolenaar    vim9script
66463ce4849SBram Moolenaar    def GoneSoon()
66563ce4849SBram Moolenaar      echo 'hello'
66663ce4849SBram Moolenaar    enddef
66763ce4849SBram Moolenaar
66863ce4849SBram Moolenaar    def CallGoneSoon()
66963ce4849SBram Moolenaar      GoneSoon()
67063ce4849SBram Moolenaar    enddef
67163ce4849SBram Moolenaar
67263ce4849SBram Moolenaar    delfunc GoneSoon
67363ce4849SBram Moolenaar    CallGoneSoon()
67463ce4849SBram Moolenaar  END
67563ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
67663ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
67763ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
67863ce4849SBram Moolenaar
67963ce4849SBram Moolenaar  delete('XToDelFunc')
68063ce4849SBram Moolenaarenddef
68163ce4849SBram Moolenaar
6825b1c8fe3SBram Moolenaardef Test_substitute_cmd()
6835b1c8fe3SBram Moolenaar  new
6845b1c8fe3SBram Moolenaar  setline(1, 'something')
6855b1c8fe3SBram Moolenaar  :substitute(some(other(
6865b1c8fe3SBram Moolenaar  assert_equal('otherthing', getline(1))
68783f37b91SBram Moolenaar  bwipe!
68883f37b91SBram Moolenaar
68983f37b91SBram Moolenaar  " also when the context is Vim9 script
69083f37b91SBram Moolenaar  let lines =<< trim END
69183f37b91SBram Moolenaar    vim9script
69283f37b91SBram Moolenaar    new
69383f37b91SBram Moolenaar    setline(1, 'something')
69483f37b91SBram Moolenaar    :substitute(some(other(
69583f37b91SBram Moolenaar    assert_equal('otherthing', getline(1))
69683f37b91SBram Moolenaar    bwipe!
69783f37b91SBram Moolenaar  END
69883f37b91SBram Moolenaar  writefile(lines, 'Xvim9lines')
69983f37b91SBram Moolenaar  source Xvim9lines
70083f37b91SBram Moolenaar
70183f37b91SBram Moolenaar  delete('Xvim9lines')
7025b1c8fe3SBram Moolenaarenddef
7035b1c8fe3SBram Moolenaar
704ad39c094SBram Moolenaardef Test_execute_cmd()
705ad39c094SBram Moolenaar  new
706ad39c094SBram Moolenaar  setline(1, 'default')
707ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
708ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
709ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
710ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
711ad39c094SBram Moolenaar  execute cmd1 cmd2
712ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
713ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
714ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
715ad39c094SBram Moolenaar  let cmd_first = 'call '
716ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
717ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
718ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
719ad39c094SBram Moolenaar  bwipe!
720ad39c094SBram Moolenaarenddef
721ad39c094SBram Moolenaar
722ad39c094SBram Moolenaardef Test_echo_cmd()
723ad39c094SBram Moolenaar  echo 'something'
724ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
725ad39c094SBram Moolenaar
726ad39c094SBram Moolenaar  let str1 = 'some'
727ad39c094SBram Moolenaar  let str2 = 'more'
728ad39c094SBram Moolenaar  echo str1 str2
729ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
730ad39c094SBram Moolenaarenddef
731ad39c094SBram Moolenaar
7328a7d6542SBram Moolenaar
7338a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
734