18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
78a7d6542SBram Moolenaar
88a7d6542SBram Moolenaardef Test_syntax()
98a7d6542SBram Moolenaar  let var = 234
108a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
118a7d6542SBram Moolenaarenddef
128a7d6542SBram Moolenaar
135d72ce69SBram Moolenaardef Test_range_only()
145d72ce69SBram Moolenaar  new
155d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
165d72ce69SBram Moolenaar  :/Blah/
175d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
185d72ce69SBram Moolenaarenddef
195d72ce69SBram Moolenaar
206e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
216e587dcbSBram Moolenaarlet s:addToMe = 111
22401d9ffbSBram Moolenaarlet g:existing = 'yes'
23a8c17704SBram Moolenaarlet g:inc_counter = 1
24a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
25a6e67e4fSBram Moolenaarlet g:alist = [7]
26a6e67e4fSBram Moolenaarlet g:astring = 'text'
27f0b9f43cSBram Moolenaarlet g:anumber = 123
286e587dcbSBram Moolenaar
298a7d6542SBram Moolenaardef Test_assignment()
308a7d6542SBram Moolenaar  let bool1: bool = true
318a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
328a7d6542SBram Moolenaar  let bool2: bool = false
338a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
348a7d6542SBram Moolenaar
35f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
36f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
371cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
3898b4f145SBram Moolenaar  call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
39f93c7feaSBram Moolenaar
404cdb13ceSBram Moolenaar  let nr: number = 1234
41451c2e35SBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
424cdb13ceSBram Moolenaar
43b209750bSBram Moolenaar  let a: number = 6 #comment
449be61bbbSBram Moolenaar  assert_equal(6, a)
459be61bbbSBram Moolenaar
4642a480bfSBram Moolenaar  if has('channel')
4742a480bfSBram Moolenaar    let chan1: channel
48fbdd08edSBram Moolenaar    let job1: job
49f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
5042a480bfSBram Moolenaar  endif
51fbdd08edSBram Moolenaar  if has('float')
52fbdd08edSBram Moolenaar    let float1: float = 3.4
53fbdd08edSBram Moolenaar  endif
545deeb3f1SBram Moolenaar  let Funky1: func
555deeb3f1SBram Moolenaar  let Funky2: func = function('len')
564c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
5742a480bfSBram Moolenaar
58b209750bSBram Moolenaar  g:newvar = 'new'  #comment
59401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
60401d9ffbSBram Moolenaar
61401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
62401d9ffbSBram Moolenaar  g:existing = 'no'
63401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
64401d9ffbSBram Moolenaar
65b283a8a6SBram Moolenaar  v:char = 'abc'
666e587dcbSBram Moolenaar  assert_equal('abc', v:char)
67b283a8a6SBram Moolenaar
68b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
696e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
70b283a8a6SBram Moolenaar  $ENVVAR = ''
716e587dcbSBram Moolenaar
72b5ed2660SBram Moolenaar  let lines =<< trim END
73b5ed2660SBram Moolenaar    vim9script
74b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
75b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
76b5ed2660SBram Moolenaar    $ENVVAR = ''
77b5ed2660SBram Moolenaar  END
78b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
79b5ed2660SBram Moolenaar
80fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
81fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
82fd1823e0SBram Moolenaar  s:addToMe += 222
83fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
840bbf722aSBram Moolenaar  s:newVar = 'new'
850bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
86a8c17704SBram Moolenaar
87a8c17704SBram Moolenaar  set ts=7
88a8c17704SBram Moolenaar  &ts += 1
89a8c17704SBram Moolenaar  assert_equal(8, &ts)
9080c34ca3SBram Moolenaar  &ts -= 3
9180c34ca3SBram Moolenaar  assert_equal(5, &ts)
9280c34ca3SBram Moolenaar  &ts *= 2
9380c34ca3SBram Moolenaar  assert_equal(10, &ts)
9480c34ca3SBram Moolenaar  &ts /= 3
9580c34ca3SBram Moolenaar  assert_equal(3, &ts)
9680c34ca3SBram Moolenaar  set ts=10
9780c34ca3SBram Moolenaar  &ts %= 4
9880c34ca3SBram Moolenaar  assert_equal(2, &ts)
99b5ed2660SBram Moolenaar
10093ad1471SBram Moolenaar  if has('float')
10193ad1471SBram Moolenaar    let f100: float = 100.0
10293ad1471SBram Moolenaar    f100 /= 5
10393ad1471SBram Moolenaar    assert_equal(20.0, f100)
10493ad1471SBram Moolenaar
10593ad1471SBram Moolenaar    let f200: float = 200.0
10693ad1471SBram Moolenaar    f200 /= 5.0
10793ad1471SBram Moolenaar    assert_equal(40.0, f200)
10893ad1471SBram Moolenaar
10993ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
11093ad1471SBram Moolenaar  endif
11193ad1471SBram Moolenaar
112b5ed2660SBram Moolenaar  lines =<< trim END
113b5ed2660SBram Moolenaar    vim9script
114b5ed2660SBram Moolenaar    &ts = 6
115b5ed2660SBram Moolenaar    &ts += 3
116b5ed2660SBram Moolenaar    assert_equal(9, &ts)
117b5ed2660SBram Moolenaar  END
1180aae4809SBram Moolenaar  CheckScriptSuccess(lines)
119b5ed2660SBram Moolenaar
1200aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1210aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1220aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1230aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1240aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1250aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1260aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1270aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
128cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1290aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
13080c34ca3SBram Moolenaar  &ts = 8
131a8c17704SBram Moolenaar
1320aae4809SBram Moolenaar  lines =<< trim END
1330aae4809SBram Moolenaar    let save_TI = &t_TI
1340aae4809SBram Moolenaar    &t_TI = ''
1350aae4809SBram Moolenaar    assert_equal('', &t_TI)
1360aae4809SBram Moolenaar    &t_TI = 'xxx'
1370aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1380aae4809SBram Moolenaar    &t_TI = save_TI
1390aae4809SBram Moolenaar  END
1400aae4809SBram Moolenaar  CheckDefSuccess(lines)
1410aae4809SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
1420aae4809SBram Moolenaar
1430aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
1440aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
1450aae4809SBram Moolenaar
1460aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
1470aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
14833afa244SBram Moolenaar
149f9b2b496SBram Moolenaar  lines =<< trim END
150f9b2b496SBram Moolenaar    vim9script
151f9b2b496SBram Moolenaar    def SomeFunc()
152f9b2b496SBram Moolenaar      s:var = 123
153f9b2b496SBram Moolenaar    enddef
154f9b2b496SBram Moolenaar    defcompile
155f9b2b496SBram Moolenaar  END
156f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
157f9b2b496SBram Moolenaar
158a8c17704SBram Moolenaar  g:inc_counter += 1
159a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
160a8c17704SBram Moolenaar
161a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
162a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
163dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
164451c2e35SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
165a8c17704SBram Moolenaar
166a8c17704SBram Moolenaar  @a = 'areg'
167a8c17704SBram Moolenaar  @a ..= 'add'
168a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
169dd29f1b0SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
170451c2e35SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1012:')
171e69f6d04SBram Moolenaar
172b5ed2660SBram Moolenaar  lines =<< trim END
173b5ed2660SBram Moolenaar    vim9script
174b5ed2660SBram Moolenaar    @c = 'areg'
175b5ed2660SBram Moolenaar    @c ..= 'add'
176b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
177b5ed2660SBram Moolenaar  END
178b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
179b5ed2660SBram Moolenaar
180e69f6d04SBram Moolenaar  v:errmsg = 'none'
181e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
182e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
183dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
184451c2e35SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1012:')
18533afa244SBram Moolenaar
18633afa244SBram Moolenaar  # single letter variables
18733afa244SBram Moolenaar  a = 123
18833afa244SBram Moolenaar  assert_equal(123, a)
18933afa244SBram Moolenaar  let b: number
19033afa244SBram Moolenaar  b = 123
19133afa244SBram Moolenaar  assert_equal(123, b)
19233afa244SBram Moolenaar  let g: number
19333afa244SBram Moolenaar  g = 123
19433afa244SBram Moolenaar  assert_equal(123, g)
19533afa244SBram Moolenaar  let s: number
19633afa244SBram Moolenaar  s = 123
19733afa244SBram Moolenaar  assert_equal(123, s)
19833afa244SBram Moolenaar  let t: number
19933afa244SBram Moolenaar  t = 123
20033afa244SBram Moolenaar  assert_equal(123, t)
20133afa244SBram Moolenaar  let v: number
20233afa244SBram Moolenaar  v = 123
20333afa244SBram Moolenaar  assert_equal(123, v)
20433afa244SBram Moolenaar  let w: number
20533afa244SBram Moolenaar  w = 123
20633afa244SBram Moolenaar  assert_equal(123, w)
2075deeb3f1SBram Moolenaarenddef
2085deeb3f1SBram Moolenaar
2093b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2103b74b6b4SBram Moolenaar  let lines =<< trim END
2113b74b6b4SBram Moolenaar      vim9script
2123b74b6b4SBram Moolenaar
213f5be8cdbSBram Moolenaar      # single character variable declarations work
2143b74b6b4SBram Moolenaar      let a: string
2153b74b6b4SBram Moolenaar      let b: number
2163b74b6b4SBram Moolenaar      let l: list<any>
2173b74b6b4SBram Moolenaar      let s: string
2183b74b6b4SBram Moolenaar      let t: number
2193b74b6b4SBram Moolenaar      let v: number
2203b74b6b4SBram Moolenaar      let w: number
2213b74b6b4SBram Moolenaar
222f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2233b74b6b4SBram Moolenaar      a = 'script-a'
2243b74b6b4SBram Moolenaar      b = 111
2253b74b6b4SBram Moolenaar      l = [1, 2, 3]
2263b74b6b4SBram Moolenaar      s = 'script-s'
2273b74b6b4SBram Moolenaar      t = 222
2283b74b6b4SBram Moolenaar      v = 333
2293b74b6b4SBram Moolenaar      w = 444
2303b74b6b4SBram Moolenaar
2313b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2323b74b6b4SBram Moolenaar      assert_equal(111, b)
2333b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2343b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2353b74b6b4SBram Moolenaar      assert_equal(222, t)
2363b74b6b4SBram Moolenaar      assert_equal(333, v)
2373b74b6b4SBram Moolenaar      assert_equal(444, w)
2383b74b6b4SBram Moolenaar  END
2393b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2403b74b6b4SBram Moolenaar  source Xsinglechar
2413b74b6b4SBram Moolenaar  delete('Xsinglechar')
2423b74b6b4SBram Moolenaarenddef
2433b74b6b4SBram Moolenaar
24484370087SBram Moolenaardef Test_assignment_list()
24584370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
24684370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
24784370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
24884370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
24984370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
25084370087SBram Moolenaar
25184370087SBram Moolenaar  let listS: list<string> = []
25284370087SBram Moolenaar  let listN: list<number> = []
25384370087SBram Moolenaar
25484370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
25584370087SBram Moolenaar  list2[-1] = 99
25684370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
25784370087SBram Moolenaar  list2[-2] = 88
25884370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
25984370087SBram Moolenaar  list2[-3] = 77
26084370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
261dd29f1b0SBram Moolenaar  list2 += [100]
262dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
263dd29f1b0SBram Moolenaar
264dd29f1b0SBram Moolenaar  list3 += ['end']
265dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
266dd29f1b0SBram Moolenaar
267dd29f1b0SBram Moolenaar
26884370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
269c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
27084370087SBram Moolenaar
27184370087SBram Moolenaar  # type becomes list<any>
27284370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
27384370087SBram Moolenaarenddef
27484370087SBram Moolenaar
275b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
276b31be3f9SBram Moolenaar  let lines =<< trim END
277b31be3f9SBram Moolenaar    vim9script
278b31be3f9SBram Moolenaar    let v1: number
279b31be3f9SBram Moolenaar    let v2: number
280b31be3f9SBram Moolenaar    let v3: number
281b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
282b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
283b31be3f9SBram Moolenaar  END
284b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
285b31be3f9SBram Moolenaarenddef
286b31be3f9SBram Moolenaar
28784370087SBram Moolenaardef Test_assignment_dict()
28884370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
28984370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
29084370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
29184370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
29274fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
29384370087SBram Moolenaar
294f5be8cdbSBram Moolenaar  # overwrite
295c785b9a7SBram Moolenaar  dict3['key'] = 'another'
296c785b9a7SBram Moolenaar
29758626872SBram Moolenaar  # empty key can be used
29858626872SBram Moolenaar  let dd = {}
29958626872SBram Moolenaar  dd[""] = 6
30058626872SBram Moolenaar  assert_equal({'': 6}, dd)
30184370087SBram Moolenaar
30284370087SBram Moolenaar  # type becomes dict<any>
30384370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3048e4c8c85SBram Moolenaar
3058e4c8c85SBram Moolenaar  # assignment to script-local dict
3068e4c8c85SBram Moolenaar  let lines =<< trim END
3078e4c8c85SBram Moolenaar    vim9script
3088e4c8c85SBram Moolenaar    let test: dict<any> = {}
3098e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3108e4c8c85SBram Moolenaar      test['a'] = 43
3118e4c8c85SBram Moolenaar      return test
3128e4c8c85SBram Moolenaar    enddef
3138e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3148e4c8c85SBram Moolenaar  END
3158e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3168e4c8c85SBram Moolenaar
3178e4c8c85SBram Moolenaar  lines =<< trim END
3188e4c8c85SBram Moolenaar    vim9script
3198e4c8c85SBram Moolenaar    let test: dict<any>
3208e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3218e4c8c85SBram Moolenaar      test['a'] = 43
3228e4c8c85SBram Moolenaar      return test
3238e4c8c85SBram Moolenaar    enddef
3248e4c8c85SBram Moolenaar    FillDict()
3258e4c8c85SBram Moolenaar  END
3268e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3272caa1594SBram Moolenaar
3282caa1594SBram Moolenaar  # assignment to global dict
3292caa1594SBram Moolenaar  lines =<< trim END
3302caa1594SBram Moolenaar    vim9script
3312caa1594SBram Moolenaar    g:test = {}
3322caa1594SBram Moolenaar    def FillDict(): dict<any>
3332caa1594SBram Moolenaar      g:test['a'] = 43
3342caa1594SBram Moolenaar      return g:test
3352caa1594SBram Moolenaar    enddef
3362caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3372caa1594SBram Moolenaar  END
3382caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3392caa1594SBram Moolenaar
3402caa1594SBram Moolenaar  # assignment to buffer dict
3412caa1594SBram Moolenaar  lines =<< trim END
3422caa1594SBram Moolenaar    vim9script
3432caa1594SBram Moolenaar    b:test = {}
3442caa1594SBram Moolenaar    def FillDict(): dict<any>
3452caa1594SBram Moolenaar      b:test['a'] = 43
3462caa1594SBram Moolenaar      return b:test
3472caa1594SBram Moolenaar    enddef
3482caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3492caa1594SBram Moolenaar  END
3502caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
35184370087SBram Moolenaarenddef
35284370087SBram Moolenaar
353d3aac291SBram Moolenaardef Test_assignment_local()
354f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
355f5be8cdbSBram Moolenaar  # changed.
356d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
357d3aac291SBram Moolenaar    let b:existing = 'yes'
358d3aac291SBram Moolenaar    let w:existing = 'yes'
359d3aac291SBram Moolenaar    let t:existing = 'yes'
360d3aac291SBram Moolenaar
361d3aac291SBram Moolenaar    def Test_assignment_local_internal()
362d3aac291SBram Moolenaar      b:newvar = 'new'
363d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
364d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
365d3aac291SBram Moolenaar      b:existing = 'no'
366d3aac291SBram Moolenaar      assert_equal('no', b:existing)
367396f3138SBram Moolenaar      b:existing ..= 'NO'
368396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
369d3aac291SBram Moolenaar
370d3aac291SBram Moolenaar      w:newvar = 'new'
371d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
372d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
373d3aac291SBram Moolenaar      w:existing = 'no'
374d3aac291SBram Moolenaar      assert_equal('no', w:existing)
375396f3138SBram Moolenaar      w:existing ..= 'NO'
376396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
377d3aac291SBram Moolenaar
378d3aac291SBram Moolenaar      t:newvar = 'new'
379d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
380d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
381d3aac291SBram Moolenaar      t:existing = 'no'
382d3aac291SBram Moolenaar      assert_equal('no', t:existing)
383396f3138SBram Moolenaar      t:existing ..= 'NO'
384396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
385d3aac291SBram Moolenaar    enddef
386d3aac291SBram Moolenaar    call Test_assignment_local_internal()
387d3aac291SBram Moolenaar  END
388d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
389d3aac291SBram Moolenaarenddef
390d3aac291SBram Moolenaar
3915deeb3f1SBram Moolenaardef Test_assignment_default()
392e69f6d04SBram Moolenaar
393cb711abfSBram Moolenaar  # Test default values.
394e69f6d04SBram Moolenaar  let thebool: bool
395e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
396e69f6d04SBram Moolenaar
397e69f6d04SBram Moolenaar  let thenumber: number
398e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
399e69f6d04SBram Moolenaar
400e69f6d04SBram Moolenaar  if has('float')
401e69f6d04SBram Moolenaar    let thefloat: float
402e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
403e69f6d04SBram Moolenaar  endif
404e69f6d04SBram Moolenaar
405e69f6d04SBram Moolenaar  let thestring: string
406e69f6d04SBram Moolenaar  assert_equal('', thestring)
407e69f6d04SBram Moolenaar
408e69f6d04SBram Moolenaar  let theblob: blob
409e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
410e69f6d04SBram Moolenaar
4115deeb3f1SBram Moolenaar  let Thefunc: func
4125deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
413e69f6d04SBram Moolenaar
414e69f6d04SBram Moolenaar  let thelist: list<any>
415e69f6d04SBram Moolenaar  assert_equal([], thelist)
416e69f6d04SBram Moolenaar
417e69f6d04SBram Moolenaar  let thedict: dict<any>
418e69f6d04SBram Moolenaar  assert_equal({}, thedict)
419e69f6d04SBram Moolenaar
4202c869deeSBram Moolenaar  if has('channel')
421e69f6d04SBram Moolenaar    let thejob: job
422e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
423e69f6d04SBram Moolenaar
424e69f6d04SBram Moolenaar    let thechannel: channel
425e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
426c785b9a7SBram Moolenaar
427c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
428f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
429c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
430c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
431c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
432c785b9a7SBram Moolenaar    endif
4332c869deeSBram Moolenaar  endif
434585fea7bSBram Moolenaar
435585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
436585fea7bSBram Moolenaar  assert_equal(5678, nr)
4378a7d6542SBram Moolenaarenddef
4388a7d6542SBram Moolenaar
43947a519a9SBram Moolenaardef Test_assignment_var_list()
44047a519a9SBram Moolenaar  let v1: string
44147a519a9SBram Moolenaar  let v2: string
4429af78769SBram Moolenaar  let vrem: list<string>
4439af78769SBram Moolenaar  [v1] = ['aaa']
4449af78769SBram Moolenaar  assert_equal('aaa', v1)
4459af78769SBram Moolenaar
44647a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
44747a519a9SBram Moolenaar  assert_equal('one', v1)
44847a519a9SBram Moolenaar  assert_equal('two', v2)
4499af78769SBram Moolenaar
4509af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4519af78769SBram Moolenaar  assert_equal('one', v1)
4529af78769SBram Moolenaar  assert_equal('two', v2)
4539af78769SBram Moolenaar  assert_equal([], vrem)
4549af78769SBram Moolenaar
4559af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4569af78769SBram Moolenaar  assert_equal('one', v1)
4579af78769SBram Moolenaar  assert_equal('two', v2)
4589af78769SBram Moolenaar  assert_equal(['three'], vrem)
4591c199f9cSBram Moolenaar
4601c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4611c199f9cSBram Moolenaar  assert_equal(3, &ts)
4621c199f9cSBram Moolenaar  assert_equal(4, &sw)
4631c199f9cSBram Moolenaar  set ts=8 sw=4
46447a519a9SBram Moolenaarenddef
46547a519a9SBram Moolenaar
466c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
467c7e44a7eSBram Moolenaar  let lines =<< trim END
468c7e44a7eSBram Moolenaar    vim9script
469c7e44a7eSBram Moolenaar    def Func(): list<number>
470c7e44a7eSBram Moolenaar      return [1, 2]
471c7e44a7eSBram Moolenaar    enddef
472c7e44a7eSBram Moolenaar    let var1: number
473c7e44a7eSBram Moolenaar    let var2: number
474c7e44a7eSBram Moolenaar    [var1, var2] =
475c7e44a7eSBram Moolenaar          Func()
476c7e44a7eSBram Moolenaar    assert_equal(1, var1)
477c7e44a7eSBram Moolenaar    assert_equal(2, var2)
478c7e44a7eSBram Moolenaar    let ll =
479c7e44a7eSBram Moolenaar          Func()
480c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
48183144546SBram Moolenaar
48283144546SBram Moolenaar    @/ = 'text'
48383144546SBram Moolenaar    assert_equal('text', @/)
48483144546SBram Moolenaar    @0 = 'zero'
48583144546SBram Moolenaar    assert_equal('zero', @0)
48683144546SBram Moolenaar    @1 = 'one'
48783144546SBram Moolenaar    assert_equal('one', @1)
48883144546SBram Moolenaar    @9 = 'nine'
48983144546SBram Moolenaar    assert_equal('nine', @9)
49083144546SBram Moolenaar    @- = 'minus'
49183144546SBram Moolenaar    assert_equal('minus', @-)
49283144546SBram Moolenaar    if has('clipboard_working')
49383144546SBram Moolenaar      @* = 'star'
49483144546SBram Moolenaar      assert_equal('star', @*)
49583144546SBram Moolenaar      @+ = 'plus'
49683144546SBram Moolenaar      assert_equal('plus', @+)
49783144546SBram Moolenaar    endif
49895dd9f25SBram Moolenaar
49995dd9f25SBram Moolenaar    let a: number = 123
50095dd9f25SBram Moolenaar    assert_equal(123, a)
50195dd9f25SBram Moolenaar    let s: string = 'yes'
50295dd9f25SBram Moolenaar    assert_equal('yes', s)
50395dd9f25SBram Moolenaar    let b: number = 42
50495dd9f25SBram Moolenaar    assert_equal(42, b)
50595dd9f25SBram Moolenaar    let w: number = 43
50695dd9f25SBram Moolenaar    assert_equal(43, w)
50795dd9f25SBram Moolenaar    let t: number = 44
50895dd9f25SBram Moolenaar    assert_equal(44, t)
509c7e44a7eSBram Moolenaar  END
510c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
511c7e44a7eSBram Moolenaarenddef
512c7e44a7eSBram Moolenaar
513cab27678SBram Moolenaardef Mess(): string
514cab27678SBram Moolenaar  v:foldstart = 123
515cab27678SBram Moolenaar  return 'xxx'
516cab27678SBram Moolenaarenddef
517cab27678SBram Moolenaar
518d72c1bf0SBram Moolenaardef Test_assignment_failure()
5198a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
5208a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
5218a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
5228a7d6542SBram Moolenaar
52363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
52463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
52563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
52663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
52763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
52863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
52963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
53063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
53163be3d4bSBram Moolenaar
5328a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5338a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5348a7d6542SBram Moolenaar
5359b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5369af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5379af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5389af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5399af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5409af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5419af78769SBram Moolenaar                            'let y: number',
5429af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5439af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5449af78769SBram Moolenaar                            'let y: number',
5459af78769SBram Moolenaar                            'let z: list<number>',
5469af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5479be61bbbSBram Moolenaar
548e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
549c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5509be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
551c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5529be61bbbSBram Moolenaar
553e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
554c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5559be61bbbSBram Moolenaar
556434d72cbSBram Moolenaar  if has('dnd')
55765821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
558434d72cbSBram Moolenaar  else
559434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
560434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
561434d72cbSBram Moolenaar  endif
5629be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
56365821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
564c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5659be61bbbSBram Moolenaar
566e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
567e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
568e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
569e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5709be61bbbSBram Moolenaar
5719be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
572122616d9SBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
573122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
574122616d9SBram Moolenaar  call CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
575122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
5769be61bbbSBram Moolenaar
577451c2e35SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
57833fa29cfSBram Moolenaar
5798a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5808a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5818a7d6542SBram Moolenaar
5828a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5838a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5848a7d6542SBram Moolenaar
5858a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5868a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
58742a480bfSBram Moolenaar
588d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
58942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
590cab27678SBram Moolenaar
591cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
592cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
59343e969d3SBram Moolenaar
59443e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
59543e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
59643e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
59743e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
59843e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
59943e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
60043e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
60143e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
602d72c1bf0SBram Moolenaarenddef
603d72c1bf0SBram Moolenaar
604d72c1bf0SBram Moolenaardef Test_unlet()
605d72c1bf0SBram Moolenaar  g:somevar = 'yes'
606d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
607d72c1bf0SBram Moolenaar  unlet g:somevar
608d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
609d72c1bf0SBram Moolenaar  unlet! g:somevar
610d72c1bf0SBram Moolenaar
611d72c1bf0SBram Moolenaar  call CheckScriptFailure([
612d72c1bf0SBram Moolenaar        'vim9script',
613d72c1bf0SBram Moolenaar        'let svar = 123',
614d72c1bf0SBram Moolenaar        'unlet svar',
615d72c1bf0SBram Moolenaar        ], 'E1081:')
616d72c1bf0SBram Moolenaar  call CheckScriptFailure([
617d72c1bf0SBram Moolenaar        'vim9script',
618d72c1bf0SBram Moolenaar        'let svar = 123',
619d72c1bf0SBram Moolenaar        'unlet s:svar',
620d72c1bf0SBram Moolenaar        ], 'E1081:')
621d72c1bf0SBram Moolenaar  call CheckScriptFailure([
622d72c1bf0SBram Moolenaar        'vim9script',
623d72c1bf0SBram Moolenaar        'let svar = 123',
624d72c1bf0SBram Moolenaar        'def Func()',
625d72c1bf0SBram Moolenaar        '  unlet svar',
626d72c1bf0SBram Moolenaar        'enddef',
627822ba247SBram Moolenaar        'defcompile',
628d72c1bf0SBram Moolenaar        ], 'E1081:')
629d72c1bf0SBram Moolenaar  call CheckScriptFailure([
630d72c1bf0SBram Moolenaar        'vim9script',
631d72c1bf0SBram Moolenaar        'let svar = 123',
632d72c1bf0SBram Moolenaar        'def Func()',
633d72c1bf0SBram Moolenaar        '  unlet s:svar',
634d72c1bf0SBram Moolenaar        'enddef',
635822ba247SBram Moolenaar        'defcompile',
636d72c1bf0SBram Moolenaar        ], 'E1081:')
6377bdaea6eSBram Moolenaar
6387bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6397bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6407bdaea6eSBram Moolenaar  unlet $ENVVAR
6417bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
642d72c1bf0SBram Moolenaarenddef
643599c89c8SBram Moolenaar
6444c17ad94SBram Moolenaardef Test_delfunction()
645f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6464c17ad94SBram Moolenaar  CheckScriptSuccess([
6474c17ad94SBram Moolenaar      'vim9script',
6484c17ad94SBram Moolenaar      'func CheckMe()',
6494c17ad94SBram Moolenaar      '  return 123',
6504c17ad94SBram Moolenaar      'endfunc',
6514c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6524c17ad94SBram Moolenaar      ])
6534c17ad94SBram Moolenaar
654f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6554c17ad94SBram Moolenaar  CheckScriptFailure([
6564c17ad94SBram Moolenaar      'vim9script',
6574c17ad94SBram Moolenaar      'func DeleteMe1()',
6584c17ad94SBram Moolenaar      'endfunc',
6594c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6604c17ad94SBram Moolenaar      ], 'E1084:')
6614c17ad94SBram Moolenaar  CheckScriptFailure([
6624c17ad94SBram Moolenaar      'vim9script',
6634c17ad94SBram Moolenaar      'func DeleteMe2()',
6644c17ad94SBram Moolenaar      'endfunc',
6654c17ad94SBram Moolenaar      'def DoThat()',
6664c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6674c17ad94SBram Moolenaar      'enddef',
6684c17ad94SBram Moolenaar      'DoThat()',
6694c17ad94SBram Moolenaar      ], 'E1084:')
6704c17ad94SBram Moolenaar  CheckScriptFailure([
6714c17ad94SBram Moolenaar      'vim9script',
6724c17ad94SBram Moolenaar      'def DeleteMe3()',
6734c17ad94SBram Moolenaar      'enddef',
6744c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6754c17ad94SBram Moolenaar      ], 'E1084:')
6764c17ad94SBram Moolenaar  CheckScriptFailure([
6774c17ad94SBram Moolenaar      'vim9script',
6784c17ad94SBram Moolenaar      'def DeleteMe4()',
6794c17ad94SBram Moolenaar      'enddef',
6804c17ad94SBram Moolenaar      'def DoThat()',
6814c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6824c17ad94SBram Moolenaar      'enddef',
6834c17ad94SBram Moolenaar      'DoThat()',
6844c17ad94SBram Moolenaar      ], 'E1084:')
685925e9fd6SBram Moolenaar
686925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
687925e9fd6SBram Moolenaar  let lines =<< trim END
688925e9fd6SBram Moolenaar      vim9script
689925e9fd6SBram Moolenaar      def g:Global(): string
690925e9fd6SBram Moolenaar        return "yes"
691925e9fd6SBram Moolenaar      enddef
692925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
693925e9fd6SBram Moolenaar      def! g:Global(): string
694925e9fd6SBram Moolenaar        return "no"
695925e9fd6SBram Moolenaar      enddef
696925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
697925e9fd6SBram Moolenaar      delfunc g:Global
698925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
699925e9fd6SBram Moolenaar  END
700925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
701925e9fd6SBram Moolenaar
702925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
703925e9fd6SBram Moolenaar  lines =<< trim END
704925e9fd6SBram Moolenaar      vim9script
705925e9fd6SBram Moolenaar      func g:Global()
706925e9fd6SBram Moolenaar        return "yes"
707925e9fd6SBram Moolenaar      endfunc
708925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
709925e9fd6SBram Moolenaar      def! g:Global(): string
710925e9fd6SBram Moolenaar        return "no"
711925e9fd6SBram Moolenaar      enddef
712925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
713925e9fd6SBram Moolenaar      delfunc g:Global
714925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
715925e9fd6SBram Moolenaar  END
716925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
717925e9fd6SBram Moolenaar
718925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
719925e9fd6SBram Moolenaar  lines =<< trim END
720925e9fd6SBram Moolenaar      vim9script
721925e9fd6SBram Moolenaar      def g:Global(): string
722925e9fd6SBram Moolenaar        return "yes"
723925e9fd6SBram Moolenaar      enddef
724925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
725925e9fd6SBram Moolenaar      func! g:Global()
726925e9fd6SBram Moolenaar        return "no"
727925e9fd6SBram Moolenaar      endfunc
728925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
729925e9fd6SBram Moolenaar      delfunc g:Global
730925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
731925e9fd6SBram Moolenaar  END
732925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7334c17ad94SBram Moolenaarenddef
7344c17ad94SBram Moolenaar
735599c89c8SBram Moolenaarfunc Test_wrong_type()
736599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
737599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
738599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
739599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
740599c89c8SBram Moolenaar
741599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
742599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
74342a480bfSBram Moolenaar
74442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
74542a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
74642a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
74742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
74842a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
74942a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
75042a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
75142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
75242a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
75342a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
75442a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
755a0a9f43aSBram Moolenaar
756a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
757a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7588a7d6542SBram Moolenaarendfunc
7598a7d6542SBram Moolenaar
7608a7d6542SBram Moolenaarfunc Test_const()
7618a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7628a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7638a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7649be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7658a7d6542SBram Moolenaarendfunc
7668a7d6542SBram Moolenaar
767df069eecSBram Moolenaardef Test_range_no_colon()
768df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
769df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
770df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
771df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
772df069eecSBram Moolenaarenddef
773df069eecSBram Moolenaar
774df069eecSBram Moolenaar
7758a7d6542SBram Moolenaardef Test_block()
7768a7d6542SBram Moolenaar  let outer = 1
7778a7d6542SBram Moolenaar  {
7788a7d6542SBram Moolenaar    let inner = 2
7798a7d6542SBram Moolenaar    assert_equal(1, outer)
7808a7d6542SBram Moolenaar    assert_equal(2, inner)
7818a7d6542SBram Moolenaar  }
7828a7d6542SBram Moolenaar  assert_equal(1, outer)
7838a7d6542SBram Moolenaarenddef
7848a7d6542SBram Moolenaar
7858a7d6542SBram Moolenaarfunc Test_block_failure()
7868a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
787585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
788585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7898a7d6542SBram Moolenaarendfunc
7908a7d6542SBram Moolenaar
791d032f34aSBram Moolenaarfunc g:NoSuchFunc()
792d032f34aSBram Moolenaar  echo 'none'
793d032f34aSBram Moolenaarendfunc
794d032f34aSBram Moolenaar
7958a7d6542SBram Moolenaardef Test_try_catch()
7968a7d6542SBram Moolenaar  let l = []
7977a092245SBram Moolenaar  try # comment
7988a7d6542SBram Moolenaar    add(l, '1')
7998a7d6542SBram Moolenaar    throw 'wrong'
8008a7d6542SBram Moolenaar    add(l, '2')
8017a092245SBram Moolenaar  catch # comment
8028a7d6542SBram Moolenaar    add(l, v:exception)
8037a092245SBram Moolenaar  finally # comment
8048a7d6542SBram Moolenaar    add(l, '3')
8057a092245SBram Moolenaar  endtry # comment
8068a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
80768d130c6SBram Moolenaar
808e859312eSBram Moolenaar  l = []
809e859312eSBram Moolenaar  try
810e859312eSBram Moolenaar    try
811e859312eSBram Moolenaar      add(l, '1')
812e859312eSBram Moolenaar      throw 'wrong'
813e859312eSBram Moolenaar      add(l, '2')
814e859312eSBram Moolenaar    catch /right/
815e859312eSBram Moolenaar      add(l, v:exception)
816e859312eSBram Moolenaar    endtry
817e859312eSBram Moolenaar  catch /wrong/
818e859312eSBram Moolenaar    add(l, 'caught')
819e859312eSBram Moolenaar  finally
820e859312eSBram Moolenaar    add(l, 'finally')
821e859312eSBram Moolenaar  endtry
822e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
823e859312eSBram Moolenaar
82468d130c6SBram Moolenaar  let n: number
82568d130c6SBram Moolenaar  try
82668d130c6SBram Moolenaar    n = l[3]
82768d130c6SBram Moolenaar  catch /E684:/
82868d130c6SBram Moolenaar    n = 99
82968d130c6SBram Moolenaar  endtry
83068d130c6SBram Moolenaar  assert_equal(99, n)
83168d130c6SBram Moolenaar
83268d130c6SBram Moolenaar  try
833cc673e74SBram Moolenaar    # string slice returns a string, not a number
83468d130c6SBram Moolenaar    n = g:astring[3]
83556acb094SBram Moolenaar  catch /E1029:/
83668d130c6SBram Moolenaar    n = 77
83768d130c6SBram Moolenaar  endtry
83868d130c6SBram Moolenaar  assert_equal(77, n)
83968d130c6SBram Moolenaar
84068d130c6SBram Moolenaar  try
84168d130c6SBram Moolenaar    n = l[g:astring]
84256acb094SBram Moolenaar  catch /E1029:/
84356acb094SBram Moolenaar    n = 88
84468d130c6SBram Moolenaar  endtry
84556acb094SBram Moolenaar  assert_equal(88, n)
84668d130c6SBram Moolenaar
84768d130c6SBram Moolenaar  try
84868d130c6SBram Moolenaar    n = s:does_not_exist
84968d130c6SBram Moolenaar  catch /E121:/
850f0b9f43cSBram Moolenaar    n = 111
851f0b9f43cSBram Moolenaar  endtry
852f0b9f43cSBram Moolenaar  assert_equal(111, n)
853f0b9f43cSBram Moolenaar
854f0b9f43cSBram Moolenaar  try
855f0b9f43cSBram Moolenaar    n = g:does_not_exist
856f0b9f43cSBram Moolenaar  catch /E121:/
85768d130c6SBram Moolenaar    n = 121
85868d130c6SBram Moolenaar  endtry
85968d130c6SBram Moolenaar  assert_equal(121, n)
86068d130c6SBram Moolenaar
86168d130c6SBram Moolenaar  let d = #{one: 1}
86268d130c6SBram Moolenaar  try
86368d130c6SBram Moolenaar    n = d[g:astring]
86468d130c6SBram Moolenaar  catch /E716:/
86568d130c6SBram Moolenaar    n = 222
86668d130c6SBram Moolenaar  endtry
86768d130c6SBram Moolenaar  assert_equal(222, n)
868f0b9f43cSBram Moolenaar
869f0b9f43cSBram Moolenaar  try
870f0b9f43cSBram Moolenaar    n = -g:astring
871f0b9f43cSBram Moolenaar  catch /E39:/
872f0b9f43cSBram Moolenaar    n = 233
873f0b9f43cSBram Moolenaar  endtry
874f0b9f43cSBram Moolenaar  assert_equal(233, n)
875f0b9f43cSBram Moolenaar
876f0b9f43cSBram Moolenaar  try
877f0b9f43cSBram Moolenaar    n = +g:astring
878f0b9f43cSBram Moolenaar  catch /E1030:/
879f0b9f43cSBram Moolenaar    n = 244
880f0b9f43cSBram Moolenaar  endtry
881f0b9f43cSBram Moolenaar  assert_equal(244, n)
882f0b9f43cSBram Moolenaar
883f0b9f43cSBram Moolenaar  try
884f0b9f43cSBram Moolenaar    n = +g:alist
885f0b9f43cSBram Moolenaar  catch /E745:/
886f0b9f43cSBram Moolenaar    n = 255
887f0b9f43cSBram Moolenaar  endtry
888f0b9f43cSBram Moolenaar  assert_equal(255, n)
889f0b9f43cSBram Moolenaar
890f0b9f43cSBram Moolenaar  let nd: dict<any>
891f0b9f43cSBram Moolenaar  try
892f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
893f0b9f43cSBram Moolenaar  catch /E1029:/
894f0b9f43cSBram Moolenaar    n = 266
895f0b9f43cSBram Moolenaar  endtry
896f0b9f43cSBram Moolenaar  assert_equal(266, n)
897f0b9f43cSBram Moolenaar
898f0b9f43cSBram Moolenaar  try
899f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
900f0b9f43cSBram Moolenaar  catch /E1093:/
901f0b9f43cSBram Moolenaar    n = 277
902f0b9f43cSBram Moolenaar  endtry
903f0b9f43cSBram Moolenaar  assert_equal(277, n)
904f0b9f43cSBram Moolenaar
905e859312eSBram Moolenaar  try
906e859312eSBram Moolenaar    &ts = g:astring
907e859312eSBram Moolenaar  catch /E1029:/
908e859312eSBram Moolenaar    n = 288
909e859312eSBram Moolenaar  endtry
910e859312eSBram Moolenaar  assert_equal(288, n)
911e859312eSBram Moolenaar
912e859312eSBram Moolenaar  try
913e859312eSBram Moolenaar    &backspace = 'asdf'
914e859312eSBram Moolenaar  catch /E474:/
915e859312eSBram Moolenaar    n = 299
916e859312eSBram Moolenaar  endtry
917e859312eSBram Moolenaar  assert_equal(299, n)
918e859312eSBram Moolenaar
919e859312eSBram Moolenaar  l = [1]
920e859312eSBram Moolenaar  try
921e859312eSBram Moolenaar    l[3] = 3
922e859312eSBram Moolenaar  catch /E684:/
923e859312eSBram Moolenaar    n = 300
924e859312eSBram Moolenaar  endtry
925e859312eSBram Moolenaar  assert_equal(300, n)
926e859312eSBram Moolenaar
927e859312eSBram Moolenaar  try
928e859312eSBram Moolenaar    unlet g:does_not_exist
929e859312eSBram Moolenaar  catch /E108:/
930e859312eSBram Moolenaar    n = 322
931e859312eSBram Moolenaar  endtry
932e859312eSBram Moolenaar  assert_equal(322, n)
933e859312eSBram Moolenaar
934e859312eSBram Moolenaar  try
935e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
936e859312eSBram Moolenaar  catch /E721:/
937e859312eSBram Moolenaar    n = 333
938e859312eSBram Moolenaar  endtry
939e859312eSBram Moolenaar  assert_equal(333, n)
940e859312eSBram Moolenaar
941e859312eSBram Moolenaar  try
942e859312eSBram Moolenaar    l = DeletedFunc()
943e859312eSBram Moolenaar  catch /E933:/
944e859312eSBram Moolenaar    n = 344
945e859312eSBram Moolenaar  endtry
946e859312eSBram Moolenaar  assert_equal(344, n)
947d032f34aSBram Moolenaar
948d032f34aSBram Moolenaar  try
949d032f34aSBram Moolenaar    echo len(v:true)
950d032f34aSBram Moolenaar  catch /E701:/
951d032f34aSBram Moolenaar    n = 355
952d032f34aSBram Moolenaar  endtry
953d032f34aSBram Moolenaar  assert_equal(355, n)
954d032f34aSBram Moolenaar
955d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
956d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
957d032f34aSBram Moolenaar  try
958d032f34aSBram Moolenaar    echo P()
959d032f34aSBram Moolenaar  catch /E117:/
960d032f34aSBram Moolenaar    n = 366
961d032f34aSBram Moolenaar  endtry
962d032f34aSBram Moolenaar  assert_equal(366, n)
963d032f34aSBram Moolenaar
964d032f34aSBram Moolenaar  try
965d032f34aSBram Moolenaar    echo g:NoSuchFunc()
966d032f34aSBram Moolenaar  catch /E117:/
967d032f34aSBram Moolenaar    n = 377
968d032f34aSBram Moolenaar  endtry
969d032f34aSBram Moolenaar  assert_equal(377, n)
970d032f34aSBram Moolenaar
971d032f34aSBram Moolenaar  try
972d032f34aSBram Moolenaar    echo g:alist + 4
973d032f34aSBram Moolenaar  catch /E745:/
974d032f34aSBram Moolenaar    n = 388
975d032f34aSBram Moolenaar  endtry
976d032f34aSBram Moolenaar  assert_equal(388, n)
977d032f34aSBram Moolenaar
978d032f34aSBram Moolenaar  try
979d032f34aSBram Moolenaar    echo 4 + g:alist
980d032f34aSBram Moolenaar  catch /E745:/
981d032f34aSBram Moolenaar    n = 399
982d032f34aSBram Moolenaar  endtry
983d032f34aSBram Moolenaar  assert_equal(399, n)
984d032f34aSBram Moolenaar
985d032f34aSBram Moolenaar  try
986d032f34aSBram Moolenaar    echo g:alist.member
987d032f34aSBram Moolenaar  catch /E715:/
988d032f34aSBram Moolenaar    n = 400
989d032f34aSBram Moolenaar  endtry
990d032f34aSBram Moolenaar  assert_equal(400, n)
991d032f34aSBram Moolenaar
992d032f34aSBram Moolenaar  try
993d032f34aSBram Moolenaar    echo d.member
994d032f34aSBram Moolenaar  catch /E716:/
995d032f34aSBram Moolenaar    n = 411
996d032f34aSBram Moolenaar  endtry
997d032f34aSBram Moolenaar  assert_equal(411, n)
9988a7d6542SBram Moolenaarenddef
9998a7d6542SBram Moolenaar
1000e859312eSBram Moolenaardef DeletedFunc(): list<any>
1001e859312eSBram Moolenaar  return ['delete me']
1002e859312eSBram Moolenaarenddef
1003e859312eSBram Moolenaardefcompile
1004e859312eSBram Moolenaardelfunc DeletedFunc
1005e859312eSBram Moolenaar
1006257cc5eeSBram Moolenaardef ThrowFromDef()
1007a72cfb80SBram Moolenaar  throw "getout" # comment
1008257cc5eeSBram Moolenaarenddef
1009257cc5eeSBram Moolenaar
1010257cc5eeSBram Moolenaarfunc CatchInFunc()
1011257cc5eeSBram Moolenaar  try
1012257cc5eeSBram Moolenaar    call ThrowFromDef()
1013257cc5eeSBram Moolenaar  catch
1014257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1015257cc5eeSBram Moolenaar  endtry
1016257cc5eeSBram Moolenaarendfunc
1017257cc5eeSBram Moolenaar
1018257cc5eeSBram Moolenaardef CatchInDef()
1019257cc5eeSBram Moolenaar  try
1020257cc5eeSBram Moolenaar    ThrowFromDef()
1021257cc5eeSBram Moolenaar  catch
1022257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1023257cc5eeSBram Moolenaar  endtry
1024257cc5eeSBram Moolenaarenddef
1025257cc5eeSBram Moolenaar
1026f575adffSBram Moolenaardef ReturnFinally(): string
1027f575adffSBram Moolenaar  try
1028f575adffSBram Moolenaar    return 'intry'
1029f575adffSBram Moolenaar  finally
1030f575adffSBram Moolenaar    g:in_finally = 'finally'
1031f575adffSBram Moolenaar  endtry
1032f575adffSBram Moolenaar  return 'end'
1033f575adffSBram Moolenaarenddef
1034f575adffSBram Moolenaar
1035257cc5eeSBram Moolenaardef Test_try_catch_nested()
1036257cc5eeSBram Moolenaar  CatchInFunc()
1037257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1038257cc5eeSBram Moolenaar
1039257cc5eeSBram Moolenaar  CatchInDef()
1040257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1041f575adffSBram Moolenaar
1042f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1043f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1044f575adffSBram Moolenaarenddef
1045f575adffSBram Moolenaar
1046f575adffSBram Moolenaardef Test_try_catch_match()
1047f575adffSBram Moolenaar  let seq = 'a'
1048f575adffSBram Moolenaar  try
1049f575adffSBram Moolenaar    throw 'something'
1050f575adffSBram Moolenaar  catch /nothing/
1051f575adffSBram Moolenaar    seq ..= 'x'
1052f575adffSBram Moolenaar  catch /some/
1053f575adffSBram Moolenaar    seq ..= 'b'
1054f575adffSBram Moolenaar  catch /asdf/
1055f575adffSBram Moolenaar    seq ..= 'x'
1056e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1057e8c4abbbSBram Moolenaar    seq ..= 'y'
1058f575adffSBram Moolenaar  finally
1059f575adffSBram Moolenaar    seq ..= 'c'
1060f575adffSBram Moolenaar  endtry
1061f575adffSBram Moolenaar  assert_equal('abc', seq)
1062257cc5eeSBram Moolenaarenddef
1063257cc5eeSBram Moolenaar
1064e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1065e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1066e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1067e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1068585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1069585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1070585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1071585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1072585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1073585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1074585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1075585fea7bSBram Moolenaar
1076a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1077585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1078e8c4abbbSBram Moolenaarenddef
1079e8c4abbbSBram Moolenaar
1080006ad48bSBram Moolenaardef Test_throw_vimscript()
1081f5be8cdbSBram Moolenaar  # only checks line continuation
1082006ad48bSBram Moolenaar  let lines =<< trim END
1083006ad48bSBram Moolenaar      vim9script
1084006ad48bSBram Moolenaar      try
1085006ad48bSBram Moolenaar        throw 'one'
1086006ad48bSBram Moolenaar              .. 'two'
1087006ad48bSBram Moolenaar      catch
1088006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1089006ad48bSBram Moolenaar      endtry
1090006ad48bSBram Moolenaar  END
1091006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1092006ad48bSBram Moolenaarenddef
1093006ad48bSBram Moolenaar
1094ed677f55SBram Moolenaardef Test_error_in_nested_function()
1095ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1096ed677f55SBram Moolenaar  let lines =<< trim END
1097ed677f55SBram Moolenaar      vim9script
1098ed677f55SBram Moolenaar      def Func()
1099ed677f55SBram Moolenaar        Error()
1100ed677f55SBram Moolenaar        g:test_var = 1
1101ed677f55SBram Moolenaar      enddef
1102ed677f55SBram Moolenaar      func Error() abort
1103ed677f55SBram Moolenaar        eval [][0]
1104ed677f55SBram Moolenaar      endfunc
1105ed677f55SBram Moolenaar      Func()
1106ed677f55SBram Moolenaar  END
1107ed677f55SBram Moolenaar  g:test_var = 0
1108ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1109ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1110ed677f55SBram Moolenaarenddef
1111ed677f55SBram Moolenaar
111237c83711SBram Moolenaardef Test_cexpr_vimscript()
1113f5be8cdbSBram Moolenaar  # only checks line continuation
111437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
111537c83711SBram Moolenaar  let lines =<< trim END
111637c83711SBram Moolenaar      vim9script
111737c83711SBram Moolenaar      cexpr 'File'
111837c83711SBram Moolenaar                .. ' someFile' ..
111937c83711SBram Moolenaar                   ' line 19'
112037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
112137c83711SBram Moolenaar  END
112237c83711SBram Moolenaar  CheckScriptSuccess(lines)
112337c83711SBram Moolenaar  set errorformat&
112437c83711SBram Moolenaarenddef
112537c83711SBram Moolenaar
1126c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1127c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1128c9edd6b5SBram Moolenaar  let lines =<< trim END
1129c9edd6b5SBram Moolenaar      vim9script
1130c9edd6b5SBram Moolenaar      func g:Status()
1131c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1132c9edd6b5SBram Moolenaar      endfunc
1133c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1134c9edd6b5SBram Moolenaar      redrawstatus
1135c9edd6b5SBram Moolenaar      set laststatus statusline=
1136c9edd6b5SBram Moolenaar  END
1137c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1138c9edd6b5SBram Moolenaarenddef
1139c9edd6b5SBram Moolenaar
1140b209750bSBram Moolenaardef Test_list_vimscript()
1141b209750bSBram Moolenaar  # checks line continuation and comments
1142b209750bSBram Moolenaar  let lines =<< trim END
1143b209750bSBram Moolenaar      vim9script
1144b209750bSBram Moolenaar      let mylist = [
1145b209750bSBram Moolenaar            'one',
1146b209750bSBram Moolenaar            # comment
1147b209750bSBram Moolenaar            'two', # empty line follows
1148b209750bSBram Moolenaar
1149b209750bSBram Moolenaar            'three',
1150b209750bSBram Moolenaar            ]
1151b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1152b209750bSBram Moolenaar  END
1153b209750bSBram Moolenaar  CheckScriptSuccess(lines)
115466250c93SBram Moolenaar
115566250c93SBram Moolenaar  # check all lines from heredoc are kept
115666250c93SBram Moolenaar  lines =<< trim END
115766250c93SBram Moolenaar      # comment 1
115866250c93SBram Moolenaar      two
115966250c93SBram Moolenaar      # comment 3
116066250c93SBram Moolenaar
116166250c93SBram Moolenaar      five
116266250c93SBram Moolenaar      # comment 6
116366250c93SBram Moolenaar  END
116466250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1165b209750bSBram Moolenaarenddef
1166b209750bSBram Moolenaar
11672a1381c3SBram Moolenaarif has('channel')
116840ee466cSBram Moolenaar  let someJob = test_null_job()
116940ee466cSBram Moolenaar
117040ee466cSBram Moolenaar  def FuncWithError()
117140ee466cSBram Moolenaar    echomsg g:someJob
117240ee466cSBram Moolenaar  enddef
117340ee466cSBram Moolenaar
117440ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
117540ee466cSBram Moolenaar    try
117640ee466cSBram Moolenaar      call FuncWithError()
117740ee466cSBram Moolenaar    catch
117840ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
117940ee466cSBram Moolenaar    endtry
118040ee466cSBram Moolenaar  endfunc
11812a1381c3SBram Moolenaarendif
118240ee466cSBram Moolenaar
11838a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11848a7d6542SBram Moolenaar  vim9script
11858a7d6542SBram Moolenaar  let name: string = 'bob'
11868a7d6542SBram Moolenaar  def Concat(arg: string): string
11878a7d6542SBram Moolenaar    return name .. arg
11888a7d6542SBram Moolenaar  enddef
1189227a69deSBram Moolenaar  g:result = Concat('bie')
1190227a69deSBram Moolenaar  g:localname = name
11918a7d6542SBram Moolenaar
11928a7d6542SBram Moolenaar  export const CONST = 1234
11938a7d6542SBram Moolenaar  export let exported = 9876
11946e587dcbSBram Moolenaar  export let exp_name = 'John'
11958a7d6542SBram Moolenaar  export def Exported(): string
11968a7d6542SBram Moolenaar    return 'Exported'
11978a7d6542SBram Moolenaar  enddef
11988a7d6542SBram MoolenaarEND
11998a7d6542SBram Moolenaar
1200b3ca9824SBram Moolenaardef Undo_export_script_lines()
1201b3ca9824SBram Moolenaar  unlet g:result
1202b3ca9824SBram Moolenaar  unlet g:localname
1203b3ca9824SBram Moolenaarenddef
1204b3ca9824SBram Moolenaar
12055269bd2aSBram Moolenaardef Test_vim9_import_export()
12068a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12078a7d6542SBram Moolenaar    vim9script
12088a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12098a7d6542SBram Moolenaar    g:imported = exported
12106e587dcbSBram Moolenaar    exported += 3
12116e587dcbSBram Moolenaar    g:imported_added = exported
12128a7d6542SBram Moolenaar    g:imported_func = Exported()
12136e587dcbSBram Moolenaar
121440f4f7a4SBram Moolenaar    def GetExported(): string
121540f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
121640f4f7a4SBram Moolenaar      return local_dict.ref()
121740f4f7a4SBram Moolenaar    enddef
121840f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
121940f4f7a4SBram Moolenaar
12206e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12216e587dcbSBram Moolenaar    g:imported_name = exp_name
12226e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12236e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12245381c7a1SBram Moolenaar    g:imported_later = exported
12258a7d6542SBram Moolenaar  END
12268a7d6542SBram Moolenaar
12278a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12288a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12298a7d6542SBram Moolenaar
12308a7d6542SBram Moolenaar  source Ximport.vim
12318a7d6542SBram Moolenaar
12328a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12338a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12348a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12356e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12365381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12378a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
123840f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12396e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12406e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12418a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12428a7d6542SBram Moolenaar
1243b3ca9824SBram Moolenaar  Undo_export_script_lines()
12448a7d6542SBram Moolenaar  unlet g:imported
12456e587dcbSBram Moolenaar  unlet g:imported_added
12465381c7a1SBram Moolenaar  unlet g:imported_later
12478a7d6542SBram Moolenaar  unlet g:imported_func
12486e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12498a7d6542SBram Moolenaar  delete('Ximport.vim')
1250f2d5c240SBram Moolenaar
12511c991144SBram Moolenaar  # similar, with line breaks
12521c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12531c991144SBram Moolenaar    vim9script
12541c991144SBram Moolenaar    import {
12551c991144SBram Moolenaar        exported,
12561c991144SBram Moolenaar        Exported,
12571c991144SBram Moolenaar        }
12581c991144SBram Moolenaar        from
12591c991144SBram Moolenaar        './Xexport.vim'
12601c991144SBram Moolenaar    g:imported = exported
12611c991144SBram Moolenaar    exported += 5
12621c991144SBram Moolenaar    g:imported_added = exported
12631c991144SBram Moolenaar    g:imported_func = Exported()
12641c991144SBram Moolenaar  END
12651c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12661c991144SBram Moolenaar  source Ximport_lbr.vim
12671c991144SBram Moolenaar
12681c991144SBram Moolenaar  assert_equal(9876, g:imported)
12691c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12701c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12711c991144SBram Moolenaar
12721c991144SBram Moolenaar  # exported script not sourced again
12731c991144SBram Moolenaar  assert_false(exists('g:result'))
12741c991144SBram Moolenaar  unlet g:imported
12751c991144SBram Moolenaar  unlet g:imported_added
12761c991144SBram Moolenaar  unlet g:imported_func
12771c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12781c991144SBram Moolenaar
12791c991144SBram Moolenaar  # import inside :def function
12805381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
12815381c7a1SBram Moolenaar    vim9script
12825381c7a1SBram Moolenaar    def ImportInDef()
12835381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12845381c7a1SBram Moolenaar      g:imported = exported
12855381c7a1SBram Moolenaar      exported += 7
12865381c7a1SBram Moolenaar      g:imported_added = exported
12875381c7a1SBram Moolenaar    enddef
12885381c7a1SBram Moolenaar    ImportInDef()
12895381c7a1SBram Moolenaar  END
12905381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12915381c7a1SBram Moolenaar  source Ximport2.vim
1292f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12935381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12945381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12955381c7a1SBram Moolenaar  unlet g:imported
12965381c7a1SBram Moolenaar  unlet g:imported_added
12975381c7a1SBram Moolenaar  delete('Ximport2.vim')
12985381c7a1SBram Moolenaar
1299f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1300f2d5c240SBram Moolenaar    vim9script
1301f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1302f2d5c240SBram Moolenaar    def UseExport()
1303f2d5c240SBram Moolenaar      g:imported = Export.exported
1304f2d5c240SBram Moolenaar    enddef
1305f2d5c240SBram Moolenaar    UseExport()
1306f2d5c240SBram Moolenaar  END
1307f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1308f2d5c240SBram Moolenaar  source Ximport.vim
13095381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1310f2d5c240SBram Moolenaar
1311599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1312599c89c8SBram Moolenaar    vim9script
1313599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1314599c89c8SBram Moolenaar    def Func()
1315599c89c8SBram Moolenaar      let dummy = 1
1316599c89c8SBram Moolenaar      let imported = Export + dummy
1317599c89c8SBram Moolenaar    enddef
1318822ba247SBram Moolenaar    defcompile
1319599c89c8SBram Moolenaar  END
1320599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1321599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1322599c89c8SBram Moolenaar
1323599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1324599c89c8SBram Moolenaar    vim9script
1325599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1326599c89c8SBram Moolenaar    def Func()
1327599c89c8SBram Moolenaar      let imported = Export . exported
1328599c89c8SBram Moolenaar    enddef
1329822ba247SBram Moolenaar    defcompile
1330599c89c8SBram Moolenaar  END
1331599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1332599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1333599c89c8SBram Moolenaar
1334599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1335599c89c8SBram Moolenaar    vim9script
1336599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1337599c89c8SBram Moolenaar    def Func()
1338599c89c8SBram Moolenaar      let imported = Export.
1339599c89c8SBram Moolenaar    enddef
1340822ba247SBram Moolenaar    defcompile
1341599c89c8SBram Moolenaar  END
1342599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1343599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1344599c89c8SBram Moolenaar
13451c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13461c991144SBram Moolenaar    vim9script
13471c991144SBram Moolenaar    import *
13481c991144SBram Moolenaar        as Export
13491c991144SBram Moolenaar        from
13501c991144SBram Moolenaar        './Xexport.vim'
13511c991144SBram Moolenaar    def UseExport()
13521c991144SBram Moolenaar      g:imported = Export.exported
13531c991144SBram Moolenaar    enddef
13541c991144SBram Moolenaar    UseExport()
13551c991144SBram Moolenaar  END
13561c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13571c991144SBram Moolenaar  source Ximport.vim
13581c991144SBram Moolenaar  assert_equal(9883, g:imported)
13591c991144SBram Moolenaar
1360f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1361f2d5c240SBram Moolenaar    vim9script
1362f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1363f2d5c240SBram Moolenaar  END
1364f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1365f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1366f2d5c240SBram Moolenaar
1367f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1368fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1369fa29c8abSBram Moolenaar    vim9script
1370fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1371fa29c8abSBram Moolenaar  END
1372fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1373fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1374fa29c8abSBram Moolenaar
1375f5be8cdbSBram Moolenaar  # try to import something that is already defined
13765269bd2aSBram Moolenaar  let import_already_defined =<< trim END
13775269bd2aSBram Moolenaar    vim9script
13785269bd2aSBram Moolenaar    let exported = 'something'
13795269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13805269bd2aSBram Moolenaar  END
13815269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13825269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13835269bd2aSBram Moolenaar
1384f5be8cdbSBram Moolenaar  # try to import something that is already defined
13855269bd2aSBram Moolenaar  import_already_defined =<< trim END
13865269bd2aSBram Moolenaar    vim9script
13875269bd2aSBram Moolenaar    let exported = 'something'
13885269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13895269bd2aSBram Moolenaar  END
13905269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13915269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13925269bd2aSBram Moolenaar
1393f5be8cdbSBram Moolenaar  # try to import something that is already defined
13945269bd2aSBram Moolenaar  import_already_defined =<< trim END
13955269bd2aSBram Moolenaar    vim9script
13965269bd2aSBram Moolenaar    let exported = 'something'
13975269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13985269bd2aSBram Moolenaar  END
13995269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14005269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14015269bd2aSBram Moolenaar
1402f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1403fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1404fa29c8abSBram Moolenaar    vim9script
1405fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1406fa29c8abSBram Moolenaar  END
1407fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1408fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1409fa29c8abSBram Moolenaar
1410fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1411fa29c8abSBram Moolenaar    vim9script
1412fa29c8abSBram Moolenaar    import name './Xexport.vim'
1413fa29c8abSBram Moolenaar  END
1414fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1415fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1416fa29c8abSBram Moolenaar
1417fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1418fa29c8abSBram Moolenaar    vim9script
1419fa29c8abSBram Moolenaar    import name from Xexport.vim
1420fa29c8abSBram Moolenaar  END
1421fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1422fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1423fa29c8abSBram Moolenaar
1424fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1425fa29c8abSBram Moolenaar    vim9script
1426fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1427fa29c8abSBram Moolenaar  END
1428fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1429fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1430fa29c8abSBram Moolenaar
1431fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1432fa29c8abSBram Moolenaar    vim9script
1433fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1434fa29c8abSBram Moolenaar  END
14355269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
14365269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1437fa29c8abSBram Moolenaar
1438f2d5c240SBram Moolenaar  delete('Ximport.vim')
14395269bd2aSBram Moolenaar  delete('Ximport3.vim')
14408a7d6542SBram Moolenaar  delete('Xexport.vim')
14418a7d6542SBram Moolenaar
1442f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1443750802b5SBram Moolenaar  set cpo&vi
1444750802b5SBram Moolenaar  let cpo_before = &cpo
1445750802b5SBram Moolenaar  let lines =<< trim END
1446750802b5SBram Moolenaar    vim9script
1447750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1448750802b5SBram Moolenaar  END
1449750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1450750802b5SBram Moolenaar  source Xvim9_script
1451750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1452750802b5SBram Moolenaar  set cpo&vim
1453750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1454750802b5SBram Moolenaar  delete('Xvim9_script')
1455750802b5SBram Moolenaarenddef
1456750802b5SBram Moolenaar
1457803af686SBram Moolenaarfunc g:Trigger()
1458803af686SBram Moolenaar  source Ximport.vim
1459803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1460803af686SBram Moolenaarendfunc
1461803af686SBram Moolenaar
1462803af686SBram Moolenaardef Test_import_export_expr_map()
1463803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1464803af686SBram Moolenaar  let export_lines =<< trim END
1465803af686SBram Moolenaar    vim9script
1466803af686SBram Moolenaar    export def That(): string
1467803af686SBram Moolenaar      return 'yes'
1468803af686SBram Moolenaar    enddef
1469803af686SBram Moolenaar  END
1470803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1471803af686SBram Moolenaar
1472803af686SBram Moolenaar  let import_lines =<< trim END
1473803af686SBram Moolenaar    vim9script
1474803af686SBram Moolenaar    import That from './Xexport_that.vim'
1475803af686SBram Moolenaar    assert_equal('yes', That())
1476803af686SBram Moolenaar  END
1477803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1478803af686SBram Moolenaar
1479803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1480803af686SBram Moolenaar  feedkeys('trigger', "xt")
1481803af686SBram Moolenaar
1482730b2483SBram Moolenaar  delete('Xexport_that.vim')
1483803af686SBram Moolenaar  delete('Ximport.vim')
1484803af686SBram Moolenaar  nunmap trigger
1485803af686SBram Moolenaarenddef
1486803af686SBram Moolenaar
14878e1986e3SBram Moolenaardef Test_import_in_filetype()
14888e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14898e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14908e1986e3SBram Moolenaar  let export_lines =<< trim END
14918e1986e3SBram Moolenaar    vim9script
14928e1986e3SBram Moolenaar    export let That = 'yes'
14938e1986e3SBram Moolenaar  END
1494730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14958e1986e3SBram Moolenaar
14968e1986e3SBram Moolenaar  let import_lines =<< trim END
14978e1986e3SBram Moolenaar    vim9script
1498730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14998e1986e3SBram Moolenaar    assert_equal('yes', That)
15008e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15018e1986e3SBram Moolenaar  END
15028e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15038e1986e3SBram Moolenaar
15048e1986e3SBram Moolenaar  let save_rtp = &rtp
15058e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15068e1986e3SBram Moolenaar
15078e1986e3SBram Moolenaar  filetype plugin on
15088e1986e3SBram Moolenaar  copen
15098e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15108e1986e3SBram Moolenaar
15118e1986e3SBram Moolenaar  quit!
1512730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15138e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15148e1986e3SBram Moolenaar  &rtp = save_rtp
15158e1986e3SBram Moolenaarenddef
15168e1986e3SBram Moolenaar
1517efa94447SBram Moolenaardef Test_use_import_in_mapping()
1518efa94447SBram Moolenaar  let lines =<< trim END
1519efa94447SBram Moolenaar      vim9script
1520efa94447SBram Moolenaar      export def Funcx()
1521efa94447SBram Moolenaar        g:result = 42
1522efa94447SBram Moolenaar      enddef
1523efa94447SBram Moolenaar  END
1524efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1525efa94447SBram Moolenaar  lines =<< trim END
1526efa94447SBram Moolenaar      vim9script
1527efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1528b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1529efa94447SBram Moolenaar  END
1530efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1531efa94447SBram Moolenaar
1532efa94447SBram Moolenaar  source Xmapscript.vim
1533b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1534efa94447SBram Moolenaar  assert_equal(42, g:result)
1535efa94447SBram Moolenaar
1536efa94447SBram Moolenaar  unlet g:result
1537efa94447SBram Moolenaar  delete('XsomeExport.vim')
1538efa94447SBram Moolenaar  delete('Xmapscript.vim')
1539b3ca9824SBram Moolenaar  nunmap <F3>
1540efa94447SBram Moolenaarenddef
1541efa94447SBram Moolenaar
1542750802b5SBram Moolenaardef Test_vim9script_fails()
15438a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15448a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1545750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15469721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15479b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1548750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1549750802b5SBram Moolenaar
1550451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1551c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1552c785b9a7SBram Moolenaar
1553750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1554a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
15558a7d6542SBram Moolenaarenddef
15568a7d6542SBram Moolenaar
1557f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1558101f4810SBram Moolenaar  CheckRunVimInTerminal
1559101f4810SBram Moolenaar
15609bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1561c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15629bb3eb3eSBram Moolenaarendfunc
15639bb3eb3eSBram Moolenaar
1564c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1565101f4810SBram Moolenaar  let export =<< trim END
1566101f4810SBram Moolenaar    vim9script
1567101f4810SBram Moolenaar    export def Foo(): number
1568101f4810SBram Moolenaar        return 0
1569101f4810SBram Moolenaar    enddef
1570101f4810SBram Moolenaar  END
1571730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1572101f4810SBram Moolenaar
1573730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15749bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15759bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1576101f4810SBram Moolenaar
1577730b2483SBram Moolenaar  delete('XexportCmd.vim')
15789bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15799bb3eb3eSBram Moolenaarenddef
1580101f4810SBram Moolenaar
15814c17ad94SBram Moolenaardef Test_vim9script_reload_import()
15828a7d6542SBram Moolenaar  let lines =<< trim END
15838a7d6542SBram Moolenaar    vim9script
15848a7d6542SBram Moolenaar    const var = ''
15858a7d6542SBram Moolenaar    let valone = 1234
15868a7d6542SBram Moolenaar    def MyFunc(arg: string)
15878a7d6542SBram Moolenaar       valone = 5678
15888a7d6542SBram Moolenaar    enddef
15898a7d6542SBram Moolenaar  END
15908a7d6542SBram Moolenaar  let morelines =<< trim END
15918a7d6542SBram Moolenaar    let valtwo = 222
15928a7d6542SBram Moolenaar    export def GetValtwo(): number
15938a7d6542SBram Moolenaar      return valtwo
15948a7d6542SBram Moolenaar    enddef
15958a7d6542SBram Moolenaar  END
159603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15978a7d6542SBram Moolenaar  source Xreload.vim
15988a7d6542SBram Moolenaar  source Xreload.vim
15998a7d6542SBram Moolenaar  source Xreload.vim
16008a7d6542SBram Moolenaar
16018a7d6542SBram Moolenaar  let testlines =<< trim END
16028a7d6542SBram Moolenaar    vim9script
16038a7d6542SBram Moolenaar    def TheFunc()
16048a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16058a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16068a7d6542SBram Moolenaar    enddef
16078a7d6542SBram Moolenaar    TheFunc()
16088a7d6542SBram Moolenaar  END
16098a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16108a7d6542SBram Moolenaar  source Ximport.vim
16118a7d6542SBram Moolenaar
1612f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1613f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16148a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16158a7d6542SBram Moolenaar  source Ximport.vim
16168a7d6542SBram Moolenaar
1617f5be8cdbSBram Moolenaar  # cannot declare a var twice
16188a7d6542SBram Moolenaar  lines =<< trim END
16198a7d6542SBram Moolenaar    vim9script
16208a7d6542SBram Moolenaar    let valone = 1234
16218a7d6542SBram Moolenaar    let valone = 5678
16228a7d6542SBram Moolenaar  END
16238a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16248a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
16258a7d6542SBram Moolenaar
16268a7d6542SBram Moolenaar  delete('Xreload.vim')
16278a7d6542SBram Moolenaar  delete('Ximport.vim')
16288a7d6542SBram Moolenaarenddef
16298a7d6542SBram Moolenaar
1630fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1631fe465a01SBram Moolenaar" script-local name.
1632fe465a01SBram Moolenaardef Test_vim9script_funcref()
1633fe465a01SBram Moolenaar  let sortlines =<< trim END
1634fe465a01SBram Moolenaar      vim9script
1635fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1636bed36b93SBram Moolenaar        return i2 - i1
1637fe465a01SBram Moolenaar      enddef
1638fe465a01SBram Moolenaar
1639fe465a01SBram Moolenaar      export def FastSort(): list<number>
1640fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1641fe465a01SBram Moolenaar      enddef
1642fe465a01SBram Moolenaar  END
1643fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1644fe465a01SBram Moolenaar
1645fe465a01SBram Moolenaar  let lines =<< trim END
1646fe465a01SBram Moolenaar    vim9script
1647fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1648fe465a01SBram Moolenaar    def Test()
1649fe465a01SBram Moolenaar      g:result = FastSort()
1650fe465a01SBram Moolenaar    enddef
1651fe465a01SBram Moolenaar    Test()
1652fe465a01SBram Moolenaar  END
1653fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1654fe465a01SBram Moolenaar
1655fe465a01SBram Moolenaar  source Xscript.vim
1656fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1657fe465a01SBram Moolenaar
1658fe465a01SBram Moolenaar  unlet g:result
1659fe465a01SBram Moolenaar  delete('Xsort.vim')
1660fe465a01SBram Moolenaar  delete('Xscript.vim')
1661fe465a01SBram Moolenaarenddef
1662fe465a01SBram Moolenaar
1663c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1664c620c055SBram Moolenaar" script where FastFilter() is called from.
1665c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1666c620c055SBram Moolenaar  let filterLines =<< trim END
1667c620c055SBram Moolenaar    vim9script
1668c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1669c620c055SBram Moolenaar      return idx % 2 == 1
1670c620c055SBram Moolenaar    enddef
1671c620c055SBram Moolenaar    export def FastFilter(): list<number>
1672c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1673c620c055SBram Moolenaar    enddef
1674c620c055SBram Moolenaar  END
1675c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1676c620c055SBram Moolenaar
1677c620c055SBram Moolenaar  let lines =<< trim END
1678c620c055SBram Moolenaar    vim9script
1679c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1680c620c055SBram Moolenaar    def Test()
1681c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1682c620c055SBram Moolenaar    enddef
1683c620c055SBram Moolenaar    Test()
1684c620c055SBram Moolenaar  END
1685c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1686c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1687c620c055SBram Moolenaar
1688c620c055SBram Moolenaar  delete('Xfilter.vim')
1689c620c055SBram Moolenaar  delete('Ximport.vim')
1690c620c055SBram Moolenaarenddef
1691c620c055SBram Moolenaar
16924c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
16934c17ad94SBram Moolenaar  let first_lines =<< trim END
16944c17ad94SBram Moolenaar    vim9script
16954c17ad94SBram Moolenaar    def FuncYes(): string
16964c17ad94SBram Moolenaar      return 'yes'
16974c17ad94SBram Moolenaar    enddef
16984c17ad94SBram Moolenaar  END
169903afdcf1SBram Moolenaar  let withno_lines =<< trim END
17004c17ad94SBram Moolenaar    def FuncNo(): string
17014c17ad94SBram Moolenaar      return 'no'
17024c17ad94SBram Moolenaar    enddef
17034c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17044c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17054c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
170603afdcf1SBram Moolenaar    enddef
170703afdcf1SBram Moolenaar  END
170803afdcf1SBram Moolenaar  let nono_lines =<< trim END
170903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
171003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
17114c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
17124c17ad94SBram Moolenaar    enddef
17134c17ad94SBram Moolenaar  END
17144c17ad94SBram Moolenaar
17154c17ad94SBram Moolenaar  # FuncNo() is defined
171603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17174c17ad94SBram Moolenaar  source Xreloaded.vim
17184c17ad94SBram Moolenaar  g:DoCheck(true)
17194c17ad94SBram Moolenaar
17204c17ad94SBram Moolenaar  # FuncNo() is not redefined
172103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17224c17ad94SBram Moolenaar  source Xreloaded.vim
172303afdcf1SBram Moolenaar  g:DoCheck()
17244c17ad94SBram Moolenaar
17254c17ad94SBram Moolenaar  # FuncNo() is back
172603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17274c17ad94SBram Moolenaar  source Xreloaded.vim
172803afdcf1SBram Moolenaar  g:DoCheck()
17294c17ad94SBram Moolenaar
17304c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17314c17ad94SBram Moolenaarenddef
17324c17ad94SBram Moolenaar
173389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
173489483d40SBram Moolenaar  # write the script with a script-local variable
173589483d40SBram Moolenaar  let lines =<< trim END
173689483d40SBram Moolenaar    vim9script
173789483d40SBram Moolenaar    let var = 'string'
173889483d40SBram Moolenaar  END
173989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
174089483d40SBram Moolenaar  source XreloadVar.vim
174189483d40SBram Moolenaar
174289483d40SBram Moolenaar  # now write the script using the same variable locally - works
174389483d40SBram Moolenaar  lines =<< trim END
174489483d40SBram Moolenaar    vim9script
174589483d40SBram Moolenaar    def Func()
174689483d40SBram Moolenaar      let var = 'string'
174789483d40SBram Moolenaar    enddef
174889483d40SBram Moolenaar  END
174989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
175089483d40SBram Moolenaar  source XreloadVar.vim
175189483d40SBram Moolenaar
175289483d40SBram Moolenaar  delete('XreloadVar.vim')
175389483d40SBram Moolenaarenddef
175489483d40SBram Moolenaar
17558a7d6542SBram Moolenaardef Test_import_absolute()
17568a7d6542SBram Moolenaar  let import_lines = [
1757e6085c53SBram Moolenaar        'vim9script',
1758e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1759e6085c53SBram Moolenaar        'def UseExported()',
1760e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1761e6085c53SBram Moolenaar        '  exported = 8888',
1762e6085c53SBram Moolenaar        '  g:imported_after = exported',
1763e6085c53SBram Moolenaar        'enddef',
1764e6085c53SBram Moolenaar        'UseExported()',
1765e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1766e6085c53SBram Moolenaar        ]
17678a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17688a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17698a7d6542SBram Moolenaar
17708a7d6542SBram Moolenaar  source Ximport_abs.vim
17718a7d6542SBram Moolenaar
17728a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17734e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1774675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1775675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1776675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1777675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1778675f716eSBram Moolenaar          'exported = 8888.*' ..
1779675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1780675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1781675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1782675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1783e6085c53SBram Moolenaar        g:import_disassembled)
1784b3ca9824SBram Moolenaar
1785b3ca9824SBram Moolenaar  Undo_export_script_lines()
17868a7d6542SBram Moolenaar  unlet g:imported_abs
17874e12a5dfSBram Moolenaar  unlet g:import_disassembled
17888a7d6542SBram Moolenaar
17898a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17908a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17918a7d6542SBram Moolenaarenddef
17928a7d6542SBram Moolenaar
17938a7d6542SBram Moolenaardef Test_import_rtp()
17948a7d6542SBram Moolenaar  let import_lines = [
1795e6085c53SBram Moolenaar        'vim9script',
1796e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1797e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1798e6085c53SBram Moolenaar        ]
17998a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18008a7d6542SBram Moolenaar  mkdir('import')
18018a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18028a7d6542SBram Moolenaar
18038a7d6542SBram Moolenaar  let save_rtp = &rtp
18048a7d6542SBram Moolenaar  &rtp = getcwd()
18058a7d6542SBram Moolenaar  source Ximport_rtp.vim
18068a7d6542SBram Moolenaar  &rtp = save_rtp
18078a7d6542SBram Moolenaar
18088a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18098a7d6542SBram Moolenaar
1810b3ca9824SBram Moolenaar  Undo_export_script_lines()
1811b3ca9824SBram Moolenaar  unlet g:imported_rtp
18128a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
181389483d40SBram Moolenaar  delete('import', 'rf')
18148a7d6542SBram Moolenaarenddef
18158a7d6542SBram Moolenaar
181625e0f586SBram Moolenaardef Test_import_compile_error()
181725e0f586SBram Moolenaar  let export_lines = [
181825e0f586SBram Moolenaar        'vim9script',
181925e0f586SBram Moolenaar        'export def ExpFunc(): string',
182025e0f586SBram Moolenaar        '  return notDefined',
182125e0f586SBram Moolenaar        'enddef',
182225e0f586SBram Moolenaar        ]
182325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
182425e0f586SBram Moolenaar
182525e0f586SBram Moolenaar  let import_lines = [
182625e0f586SBram Moolenaar        'vim9script',
182725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
182825e0f586SBram Moolenaar        'def ImpFunc()',
182925e0f586SBram Moolenaar        '  echo ExpFunc()',
183025e0f586SBram Moolenaar        'enddef',
183125e0f586SBram Moolenaar        'defcompile',
183225e0f586SBram Moolenaar        ]
183325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
183425e0f586SBram Moolenaar
183525e0f586SBram Moolenaar  try
183625e0f586SBram Moolenaar    source Ximport.vim
183725e0f586SBram Moolenaar  catch /E1001/
1838f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
183925e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
184025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
184125e0f586SBram Moolenaar  endtry
184225e0f586SBram Moolenaar
184325e0f586SBram Moolenaar  delete('Xexported.vim')
184425e0f586SBram Moolenaar  delete('Ximport.vim')
184525e0f586SBram Moolenaarenddef
184625e0f586SBram Moolenaar
1847c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1848c4ce36d4SBram Moolenaar  let lines = [
1849c4ce36d4SBram Moolenaar        'vim9script',
1850c4ce36d4SBram Moolenaar        'def Func()',
1851c4ce36d4SBram Moolenaar        '  eval [][0]',
1852c4ce36d4SBram Moolenaar        'enddef',
1853c4ce36d4SBram Moolenaar        'Func()',
1854c4ce36d4SBram Moolenaar        ]
1855c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1856c4ce36d4SBram Moolenaar
1857c4ce36d4SBram Moolenaar  for count in range(3)
1858c4ce36d4SBram Moolenaar    try
1859c4ce36d4SBram Moolenaar      source Xtestscript.vim
1860c4ce36d4SBram Moolenaar    catch /E684/
1861c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1862c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1863c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1864c4ce36d4SBram Moolenaar    endtry
1865c4ce36d4SBram Moolenaar  endfor
1866c4ce36d4SBram Moolenaar
1867c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1868c4ce36d4SBram Moolenaarenddef
1869c4ce36d4SBram Moolenaar
1870eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1871eef2102eSBram Moolenaar  let export_lines =<< trim END
1872eef2102eSBram Moolenaar      vim9script
1873eef2102eSBram Moolenaar      export def Func()
1874eef2102eSBram Moolenaar        echo 'imported'
1875eef2102eSBram Moolenaar      enddef
1876eef2102eSBram Moolenaar  END
1877eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1878eef2102eSBram Moolenaar
1879eef2102eSBram Moolenaar  let lines =<< trim END
1880eef2102eSBram Moolenaar    vim9script
1881eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1882eef2102eSBram Moolenaar    def Func()
1883eef2102eSBram Moolenaar      echo 'local to function'
1884eef2102eSBram Moolenaar    enddef
1885eef2102eSBram Moolenaar  END
1886eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1887eef2102eSBram Moolenaar
1888eef2102eSBram Moolenaar  lines =<< trim END
1889eef2102eSBram Moolenaar    vim9script
1890eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1891eef2102eSBram Moolenaar    def Outer()
1892eef2102eSBram Moolenaar      def Func()
1893eef2102eSBram Moolenaar        echo 'local to function'
1894eef2102eSBram Moolenaar      enddef
1895eef2102eSBram Moolenaar    enddef
1896eef2102eSBram Moolenaar    defcompile
1897eef2102eSBram Moolenaar  END
1898eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1899eef2102eSBram Moolenaar
1900eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1901eef2102eSBram Moolenaarenddef
1902eef2102eSBram Moolenaar
1903b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1904b9a2cac3SBram Moolenaar  let lines =<< trim END
1905b9a2cac3SBram Moolenaar    vim9script
1906b9a2cac3SBram Moolenaar    def Func()
1907b9a2cac3SBram Moolenaar      echo 'one'
1908b9a2cac3SBram Moolenaar    enddef
1909b9a2cac3SBram Moolenaar    def Func()
1910b9a2cac3SBram Moolenaar      echo 'two'
1911b9a2cac3SBram Moolenaar    enddef
1912b9a2cac3SBram Moolenaar  END
1913b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1914fa211f3cSBram Moolenaar
1915fa211f3cSBram Moolenaar  lines =<< trim END
1916fa211f3cSBram Moolenaar    vim9script
1917fa211f3cSBram Moolenaar    def Foo(): string
1918fa211f3cSBram Moolenaar      return 'foo'
1919fa211f3cSBram Moolenaar      enddef
1920fa211f3cSBram Moolenaar    def Func()
1921fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1922fa211f3cSBram Moolenaar    enddef
1923fa211f3cSBram Moolenaar    defcompile
1924fa211f3cSBram Moolenaar  END
1925fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1926b9a2cac3SBram Moolenaarenddef
1927b9a2cac3SBram Moolenaar
19288a7d6542SBram Moolenaardef Test_fixed_size_list()
1929f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19308a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19318a7d6542SBram Moolenaar  l->remove(0)
19328a7d6542SBram Moolenaar  l->add(5)
19338a7d6542SBram Moolenaar  l->insert(99, 1)
19340f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19358a7d6542SBram Moolenaarenddef
19368a7d6542SBram Moolenaar
1937ae616494SBram Moolenaardef Test_no_insert_xit()
1938ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1939ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1940f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1941f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1942f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1943ae616494SBram Moolenaar
1944ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1945ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1946ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1947ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1948f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1949f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1950f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1951f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1952f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1953ae616494SBram Moolenaarenddef
1954ae616494SBram Moolenaar
1955158906cfSBram Moolenaardef IfElse(what: number): string
1956158906cfSBram Moolenaar  let res = ''
1957158906cfSBram Moolenaar  if what == 1
1958158906cfSBram Moolenaar    res = "one"
1959158906cfSBram Moolenaar  elseif what == 2
1960158906cfSBram Moolenaar    res = "two"
1961a259d8d3SBram Moolenaar  else
1962158906cfSBram Moolenaar    res = "three"
1963a259d8d3SBram Moolenaar  endif
1964158906cfSBram Moolenaar  return res
1965a259d8d3SBram Moolenaarenddef
1966a259d8d3SBram Moolenaar
1967158906cfSBram Moolenaardef Test_if_elseif_else()
1968158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1969158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1970158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19710f18b6d1SBram Moolenaarenddef
19720f18b6d1SBram Moolenaar
1973e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1974e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1975e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1976e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1977e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1978585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1979e8c4abbbSBram Moolenaarenddef
1980e8c4abbbSBram Moolenaar
19816d69bf60SBram Moolenaarlet g:bool_true = v:true
19826d69bf60SBram Moolenaarlet g:bool_false = v:false
19836d69bf60SBram Moolenaar
19846d69bf60SBram Moolenaardef Test_if_const_expr()
19856d69bf60SBram Moolenaar  let res = false
19866d69bf60SBram Moolenaar  if true ? true : false
19876d69bf60SBram Moolenaar    res = true
19886d69bf60SBram Moolenaar  endif
19896d69bf60SBram Moolenaar  assert_equal(true, res)
19906d69bf60SBram Moolenaar
1991585fea7bSBram Moolenaar  g:glob = 2
1992585fea7bSBram Moolenaar  if false
19936797966dSBram Moolenaar    execute('g:glob = 3')
1994585fea7bSBram Moolenaar  endif
1995585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1996585fea7bSBram Moolenaar  if true
19976797966dSBram Moolenaar    execute('g:glob = 3')
1998585fea7bSBram Moolenaar  endif
1999585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2000585fea7bSBram Moolenaar
20016d69bf60SBram Moolenaar  res = false
20026d69bf60SBram Moolenaar  if g:bool_true ? true : false
20036d69bf60SBram Moolenaar    res = true
20046d69bf60SBram Moolenaar  endif
20056d69bf60SBram Moolenaar  assert_equal(true, res)
20066d69bf60SBram Moolenaar
20076d69bf60SBram Moolenaar  res = false
20086d69bf60SBram Moolenaar  if true ? g:bool_true : false
20096d69bf60SBram Moolenaar    res = true
20106d69bf60SBram Moolenaar  endif
20116d69bf60SBram Moolenaar  assert_equal(true, res)
20126d69bf60SBram Moolenaar
20136d69bf60SBram Moolenaar  res = false
20146d69bf60SBram Moolenaar  if true ? true : g:bool_false
20156d69bf60SBram Moolenaar    res = true
20166d69bf60SBram Moolenaar  endif
20176d69bf60SBram Moolenaar  assert_equal(true, res)
20186d69bf60SBram Moolenaar
20196d69bf60SBram Moolenaar  res = false
20206d69bf60SBram Moolenaar  if true ? false : true
20216d69bf60SBram Moolenaar    res = true
20226d69bf60SBram Moolenaar  endif
20236d69bf60SBram Moolenaar  assert_equal(false, res)
20246d69bf60SBram Moolenaar
20256d69bf60SBram Moolenaar  res = false
20266d69bf60SBram Moolenaar  if false ? false : true
20276d69bf60SBram Moolenaar    res = true
20286d69bf60SBram Moolenaar  endif
20296d69bf60SBram Moolenaar  assert_equal(true, res)
20306d69bf60SBram Moolenaar
20316d69bf60SBram Moolenaar  res = false
20326d69bf60SBram Moolenaar  if false ? true : false
20336d69bf60SBram Moolenaar    res = true
20346d69bf60SBram Moolenaar  endif
20356d69bf60SBram Moolenaar  assert_equal(false, res)
20366d69bf60SBram Moolenaar
20376d69bf60SBram Moolenaar  res = false
2038e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2039e8c4abbbSBram Moolenaar    res = true
2040e8c4abbbSBram Moolenaar  endif
2041e8c4abbbSBram Moolenaar  assert_equal(false, res)
2042e8c4abbbSBram Moolenaar
2043e8c4abbbSBram Moolenaar  res = false
20446d69bf60SBram Moolenaar  if true && true
20456d69bf60SBram Moolenaar    res = true
20466d69bf60SBram Moolenaar  endif
20476d69bf60SBram Moolenaar  assert_equal(true, res)
20486d69bf60SBram Moolenaar
20496d69bf60SBram Moolenaar  res = false
20506d69bf60SBram Moolenaar  if true && false
20516d69bf60SBram Moolenaar    res = true
20526d69bf60SBram Moolenaar  endif
20536d69bf60SBram Moolenaar  assert_equal(false, res)
20546d69bf60SBram Moolenaar
20556d69bf60SBram Moolenaar  res = false
20566d69bf60SBram Moolenaar  if g:bool_true && false
20576d69bf60SBram Moolenaar    res = true
20586d69bf60SBram Moolenaar  endif
20596d69bf60SBram Moolenaar  assert_equal(false, res)
20606d69bf60SBram Moolenaar
20616d69bf60SBram Moolenaar  res = false
20626d69bf60SBram Moolenaar  if true && g:bool_false
20636d69bf60SBram Moolenaar    res = true
20646d69bf60SBram Moolenaar  endif
20656d69bf60SBram Moolenaar  assert_equal(false, res)
20666d69bf60SBram Moolenaar
20676d69bf60SBram Moolenaar  res = false
20686d69bf60SBram Moolenaar  if false && false
20696d69bf60SBram Moolenaar    res = true
20706d69bf60SBram Moolenaar  endif
20716d69bf60SBram Moolenaar  assert_equal(false, res)
20726d69bf60SBram Moolenaar
20736d69bf60SBram Moolenaar  res = false
20746d69bf60SBram Moolenaar  if true || false
20756d69bf60SBram Moolenaar    res = true
20766d69bf60SBram Moolenaar  endif
20776d69bf60SBram Moolenaar  assert_equal(true, res)
20786d69bf60SBram Moolenaar
20796d69bf60SBram Moolenaar  res = false
20806d69bf60SBram Moolenaar  if g:bool_true || false
20816d69bf60SBram Moolenaar    res = true
20826d69bf60SBram Moolenaar  endif
20836d69bf60SBram Moolenaar  assert_equal(true, res)
20846d69bf60SBram Moolenaar
20856d69bf60SBram Moolenaar  res = false
20866d69bf60SBram Moolenaar  if true || g:bool_false
20876d69bf60SBram Moolenaar    res = true
20886d69bf60SBram Moolenaar  endif
20896d69bf60SBram Moolenaar  assert_equal(true, res)
20906d69bf60SBram Moolenaar
20916d69bf60SBram Moolenaar  res = false
20926d69bf60SBram Moolenaar  if false || false
20936d69bf60SBram Moolenaar    res = true
20946d69bf60SBram Moolenaar  endif
20956d69bf60SBram Moolenaar  assert_equal(false, res)
209680c34ca3SBram Moolenaarenddef
20976d69bf60SBram Moolenaar
209880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
209980c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
210080c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2101e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2102e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21036d69bf60SBram Moolenaarenddef
21046d69bf60SBram Moolenaar
210572abcf42SBram Moolenaardef RunNested(i: number): number
210672abcf42SBram Moolenaar  let x: number = 0
210772abcf42SBram Moolenaar  if i % 2
210872abcf42SBram Moolenaar    if 1
2109f5be8cdbSBram Moolenaar      # comment
211072abcf42SBram Moolenaar    else
2111f5be8cdbSBram Moolenaar      # comment
211272abcf42SBram Moolenaar    endif
211372abcf42SBram Moolenaar    x += 1
211472abcf42SBram Moolenaar  else
211572abcf42SBram Moolenaar    x += 1000
211672abcf42SBram Moolenaar  endif
211772abcf42SBram Moolenaar  return x
211872abcf42SBram Moolenaarenddef
211972abcf42SBram Moolenaar
212072abcf42SBram Moolenaardef Test_nested_if()
212172abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
212272abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
212372abcf42SBram Moolenaarenddef
212472abcf42SBram Moolenaar
2125ad39c094SBram Moolenaardef Test_execute_cmd()
2126ad39c094SBram Moolenaar  new
2127ad39c094SBram Moolenaar  setline(1, 'default')
2128ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2129ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2130a72cfb80SBram Moolenaar
2131a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2132a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2133a72cfb80SBram Moolenaar
2134ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2135ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2136a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2137ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2138a72cfb80SBram Moolenaar
2139ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2140ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2141a72cfb80SBram Moolenaar
2142ad39c094SBram Moolenaar  let cmd_first = 'call '
2143ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2144ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2145ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2146ad39c094SBram Moolenaar  bwipe!
2147585fea7bSBram Moolenaar
21482d6b20d6SBram Moolenaar  let n = true
21492d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21502d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21512d6b20d6SBram Moolenaar
2152e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2153e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2154e5abf7afSBram Moolenaar
2155585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2156a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2157ad39c094SBram Moolenaarenddef
2158ad39c094SBram Moolenaar
215947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2160f5be8cdbSBram Moolenaar  # only checks line continuation
216147e880d6SBram Moolenaar  let lines =<< trim END
216247e880d6SBram Moolenaar      vim9script
216347e880d6SBram Moolenaar      execute 'g:someVar'
216447e880d6SBram Moolenaar                .. ' = ' ..
216547e880d6SBram Moolenaar                   '28'
216647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
216747e880d6SBram Moolenaar      unlet g:someVar
216847e880d6SBram Moolenaar  END
216947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
217047e880d6SBram Moolenaarenddef
217147e880d6SBram Moolenaar
2172ad39c094SBram Moolenaardef Test_echo_cmd()
2173a72cfb80SBram Moolenaar  echo 'some' # comment
2174585fea7bSBram Moolenaar  echon 'thing'
2175ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2176ad39c094SBram Moolenaar
2177a72cfb80SBram Moolenaar  echo "some" # comment
2178a72cfb80SBram Moolenaar  echon "thing"
2179a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2180a72cfb80SBram Moolenaar
2181ad39c094SBram Moolenaar  let str1 = 'some'
2182ad39c094SBram Moolenaar  let str2 = 'more'
2183ad39c094SBram Moolenaar  echo str1 str2
2184ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2185a72cfb80SBram Moolenaar
2186a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2187ad39c094SBram Moolenaarenddef
2188ad39c094SBram Moolenaar
2189f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2190f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2191f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2192f93c7feaSBram Moolenaar  echo 'clear'
2193df069eecSBram Moolenaar  :1messages
2194f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2195f93c7feaSBram Moolenaar
2196f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2197f93c7feaSBram Moolenaarenddef
2198f93c7feaSBram Moolenaar
219947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2200f5be8cdbSBram Moolenaar  # only checks line continuation
220147e880d6SBram Moolenaar  let lines =<< trim END
220247e880d6SBram Moolenaar      vim9script
220347e880d6SBram Moolenaar      echomsg 'here'
220447e880d6SBram Moolenaar                .. ' is ' ..
220547e880d6SBram Moolenaar                   'a message'
220647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
220747e880d6SBram Moolenaar  END
220847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
220947e880d6SBram Moolenaarenddef
221047e880d6SBram Moolenaar
2211f93c7feaSBram Moolenaardef Test_echoerr_cmd()
221240ee466cSBram Moolenaar  try
221340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
221440ee466cSBram Moolenaar  catch
221540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
221640ee466cSBram Moolenaar  endtry
2217f93c7feaSBram Moolenaarenddef
2218f93c7feaSBram Moolenaar
221947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2220f5be8cdbSBram Moolenaar  # only checks line continuation
222147e880d6SBram Moolenaar  let lines =<< trim END
222247e880d6SBram Moolenaar      vim9script
222347e880d6SBram Moolenaar      try
222447e880d6SBram Moolenaar        echoerr 'this'
222547e880d6SBram Moolenaar                .. ' is ' ..
222647e880d6SBram Moolenaar                   'wrong'
222747e880d6SBram Moolenaar      catch
222847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
222947e880d6SBram Moolenaar      endtry
223047e880d6SBram Moolenaar  END
223147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
223247e880d6SBram Moolenaarenddef
223347e880d6SBram Moolenaar
223441fe0617SBram Moolenaardef Test_for_outside_of_function()
223541fe0617SBram Moolenaar  let lines =<< trim END
223641fe0617SBram Moolenaar    vim9script
223741fe0617SBram Moolenaar    new
223841fe0617SBram Moolenaar    for var in range(0, 3)
223941fe0617SBram Moolenaar      append(line('$'), var)
224041fe0617SBram Moolenaar    endfor
224141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
224241fe0617SBram Moolenaar    bwipe!
224341fe0617SBram Moolenaar  END
224441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
224541fe0617SBram Moolenaar  source Xvim9for.vim
224641fe0617SBram Moolenaar  delete('Xvim9for.vim')
224741fe0617SBram Moolenaarenddef
22488a7d6542SBram Moolenaar
2249e8c4abbbSBram Moolenaardef Test_for_loop()
2250e8c4abbbSBram Moolenaar  let result = ''
2251e8c4abbbSBram Moolenaar  for cnt in range(7)
2252e8c4abbbSBram Moolenaar    if cnt == 4
2253e8c4abbbSBram Moolenaar      break
2254e8c4abbbSBram Moolenaar    endif
2255e8c4abbbSBram Moolenaar    if cnt == 2
2256e8c4abbbSBram Moolenaar      continue
2257e8c4abbbSBram Moolenaar    endif
2258e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2259e8c4abbbSBram Moolenaar  endfor
2260e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22610ad3e894SBram Moolenaar
22620ad3e894SBram Moolenaar  let concat = ''
22630ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22640ad3e894SBram Moolenaar    concat ..= str
22650ad3e894SBram Moolenaar  endfor
22660ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2267e8c4abbbSBram Moolenaarenddef
2268e8c4abbbSBram Moolenaar
2269e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2270675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2271675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2272451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2273822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2274451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2275675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2276675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2277675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2278e8c4abbbSBram Moolenaarenddef
2279e8c4abbbSBram Moolenaar
2280d0df1aacSBram Moolenaardef Test_while_loop()
2281d0df1aacSBram Moolenaar  let result = ''
2282d0df1aacSBram Moolenaar  let cnt = 0
2283d0df1aacSBram Moolenaar  while cnt < 555
2284d0df1aacSBram Moolenaar    if cnt == 3
2285d0df1aacSBram Moolenaar      break
2286d0df1aacSBram Moolenaar    endif
2287d0df1aacSBram Moolenaar    cnt += 1
2288d0df1aacSBram Moolenaar    if cnt == 2
2289d0df1aacSBram Moolenaar      continue
2290d0df1aacSBram Moolenaar    endif
2291d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2292d0df1aacSBram Moolenaar  endwhile
2293d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2294d0df1aacSBram Moolenaarenddef
2295d0df1aacSBram Moolenaar
2296e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2297675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2298675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2299675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2300675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2301675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2302675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2303675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2304bd5da371SBram Moolenaarenddef
2305bd5da371SBram Moolenaar
23069645e2d9SBram Moolenaardef Test_interrupt_loop()
230797acfc78SBram Moolenaar  let caught = false
23089645e2d9SBram Moolenaar  let x = 0
230997acfc78SBram Moolenaar  try
23109645e2d9SBram Moolenaar    while 1
23119645e2d9SBram Moolenaar      x += 1
23129645e2d9SBram Moolenaar      if x == 100
23139645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23149645e2d9SBram Moolenaar      endif
23159645e2d9SBram Moolenaar    endwhile
231697acfc78SBram Moolenaar  catch
231797acfc78SBram Moolenaar    caught = true
231897acfc78SBram Moolenaar    assert_equal(100, x)
231997acfc78SBram Moolenaar  endtry
232097acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
23219645e2d9SBram Moolenaarenddef
232220431c9dSBram Moolenaar
23234fdae999SBram Moolenaardef Test_automatic_line_continuation()
23244fdae999SBram Moolenaar  let mylist = [
23254fdae999SBram Moolenaar      'one',
23264fdae999SBram Moolenaar      'two',
23274fdae999SBram Moolenaar      'three',
2328f5be8cdbSBram Moolenaar      ] # comment
23294fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23304fdae999SBram Moolenaar
23314fdae999SBram Moolenaar  let mydict = {
23324fdae999SBram Moolenaar      'one': 1,
23334fdae999SBram Moolenaar      'two': 2,
23344fdae999SBram Moolenaar      'three':
23354fdae999SBram Moolenaar          3,
2336f5be8cdbSBram Moolenaar      } # comment
23374fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23384fdae999SBram Moolenaar  mydict = #{
23392c330432SBram Moolenaar      one: 1,  # comment
23402c330432SBram Moolenaar      two:     # comment
23412c330432SBram Moolenaar           2,  # comment
23422c330432SBram Moolenaar      three: 3 # comment
23432c330432SBram Moolenaar      }
23442c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23452c330432SBram Moolenaar  mydict = #{
23462c330432SBram Moolenaar      one: 1,
23474fdae999SBram Moolenaar      two:
23484fdae999SBram Moolenaar           2,
23492c330432SBram Moolenaar      three: 3
23504fdae999SBram Moolenaar      }
23514fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2352e6085c53SBram Moolenaar
2353e6085c53SBram Moolenaar  assert_equal(
2354e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2355e6085c53SBram Moolenaar        split('one two three')
2356e6085c53SBram Moolenaar        )
23574fdae999SBram Moolenaarenddef
23584fdae999SBram Moolenaar
23597a092245SBram Moolenaardef Test_vim9_comment()
23607a092245SBram Moolenaar  CheckScriptSuccess([
23617a092245SBram Moolenaar      'vim9script',
23627a092245SBram Moolenaar      '# something',
23637a092245SBram Moolenaar      ])
23647a092245SBram Moolenaar  CheckScriptFailure([
23657a092245SBram Moolenaar      'vim9script',
23667a092245SBram Moolenaar      ':# something',
23677a092245SBram Moolenaar      ], 'E488:')
23687a092245SBram Moolenaar  CheckScriptFailure([
23697a092245SBram Moolenaar      '# something',
23707a092245SBram Moolenaar      ], 'E488:')
23717a092245SBram Moolenaar  CheckScriptFailure([
23727a092245SBram Moolenaar      ':# something',
23737a092245SBram Moolenaar      ], 'E488:')
23747a092245SBram Moolenaar
23754a8d9f2eSBram Moolenaar  { # block start
23764a8d9f2eSBram Moolenaar  } # block end
23774a8d9f2eSBram Moolenaar  CheckDefFailure([
23784a8d9f2eSBram Moolenaar      '{# comment',
23794a8d9f2eSBram Moolenaar      ], 'E488:')
23804a8d9f2eSBram Moolenaar  CheckDefFailure([
23814a8d9f2eSBram Moolenaar      '{',
23824a8d9f2eSBram Moolenaar      '}# comment',
23834a8d9f2eSBram Moolenaar      ], 'E488:')
23844a8d9f2eSBram Moolenaar
23854a8d9f2eSBram Moolenaar  echo "yes" # comment
23864a8d9f2eSBram Moolenaar  CheckDefFailure([
23874a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23884a8d9f2eSBram Moolenaar      ], 'E488:')
23897a092245SBram Moolenaar  CheckScriptSuccess([
23907a092245SBram Moolenaar      'vim9script',
23917a092245SBram Moolenaar      'echo "yes" # something',
23927a092245SBram Moolenaar      ])
23937a092245SBram Moolenaar  CheckScriptFailure([
23947a092245SBram Moolenaar      'vim9script',
23957a092245SBram Moolenaar      'echo "yes"# something',
23967a092245SBram Moolenaar      ], 'E121:')
23977a092245SBram Moolenaar  CheckScriptFailure([
23987a092245SBram Moolenaar      'vim9script',
23997a092245SBram Moolenaar      'echo# something',
24007a092245SBram Moolenaar      ], 'E121:')
24017a092245SBram Moolenaar  CheckScriptFailure([
24027a092245SBram Moolenaar      'echo "yes" # something',
24037a092245SBram Moolenaar      ], 'E121:')
24047a092245SBram Moolenaar
24054a8d9f2eSBram Moolenaar  exe "echo" # comment
24064a8d9f2eSBram Moolenaar  CheckDefFailure([
24074a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24084a8d9f2eSBram Moolenaar      ], 'E488:')
24094a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24104a8d9f2eSBram Moolenaar      'vim9script',
24114a8d9f2eSBram Moolenaar      'exe "echo" # something',
24124a8d9f2eSBram Moolenaar      ])
24134a8d9f2eSBram Moolenaar  CheckScriptFailure([
24144a8d9f2eSBram Moolenaar      'vim9script',
24154a8d9f2eSBram Moolenaar      'exe "echo"# something',
24164a8d9f2eSBram Moolenaar      ], 'E121:')
24174a8d9f2eSBram Moolenaar  CheckDefFailure([
24184a8d9f2eSBram Moolenaar      'exe # comment',
24194a8d9f2eSBram Moolenaar      ], 'E1015:')
24204a8d9f2eSBram Moolenaar  CheckScriptFailure([
24214a8d9f2eSBram Moolenaar      'vim9script',
24224a8d9f2eSBram Moolenaar      'exe# something',
24234a8d9f2eSBram Moolenaar      ], 'E121:')
24244a8d9f2eSBram Moolenaar  CheckScriptFailure([
24254a8d9f2eSBram Moolenaar      'exe "echo" # something',
24264a8d9f2eSBram Moolenaar      ], 'E121:')
24274a8d9f2eSBram Moolenaar
24287a092245SBram Moolenaar  CheckDefFailure([
24297a092245SBram Moolenaar      'try# comment',
24307a092245SBram Moolenaar      '  echo "yes"',
24317a092245SBram Moolenaar      'catch',
24327a092245SBram Moolenaar      'endtry',
24337a092245SBram Moolenaar      ], 'E488:')
24342c5ed4e3SBram Moolenaar  CheckScriptFailure([
24352c5ed4e3SBram Moolenaar      'vim9script',
24362c5ed4e3SBram Moolenaar      'try# comment',
24372c5ed4e3SBram Moolenaar      'echo "yes"',
24382c5ed4e3SBram Moolenaar      ], 'E488:')
24397a092245SBram Moolenaar  CheckDefFailure([
24407a092245SBram Moolenaar      'try',
2441a72cfb80SBram Moolenaar      '  throw#comment',
2442a72cfb80SBram Moolenaar      'catch',
2443a72cfb80SBram Moolenaar      'endtry',
2444a72cfb80SBram Moolenaar      ], 'E1015:')
2445a72cfb80SBram Moolenaar  CheckDefFailure([
2446a72cfb80SBram Moolenaar      'try',
2447a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2448a72cfb80SBram Moolenaar      'catch',
2449a72cfb80SBram Moolenaar      'endtry',
2450a72cfb80SBram Moolenaar      ], 'E488:')
2451a72cfb80SBram Moolenaar  CheckDefFailure([
2452a72cfb80SBram Moolenaar      'try',
24537a092245SBram Moolenaar      '  echo "yes"',
24547a092245SBram Moolenaar      'catch# comment',
24557a092245SBram Moolenaar      'endtry',
24567a092245SBram Moolenaar      ], 'E488:')
24572c5ed4e3SBram Moolenaar  CheckScriptFailure([
24582c5ed4e3SBram Moolenaar      'vim9script',
24592c5ed4e3SBram Moolenaar      'try',
24602c5ed4e3SBram Moolenaar      '  echo "yes"',
24612c5ed4e3SBram Moolenaar      'catch# comment',
24622c5ed4e3SBram Moolenaar      'endtry',
24632c5ed4e3SBram Moolenaar      ], 'E654:')
24642c5ed4e3SBram Moolenaar  CheckDefFailure([
24652c5ed4e3SBram Moolenaar      'try',
24662c5ed4e3SBram Moolenaar      '  echo "yes"',
24672c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24682c5ed4e3SBram Moolenaar      'endtry',
24692c5ed4e3SBram Moolenaar      ], 'E488:')
24707a092245SBram Moolenaar  CheckDefFailure([
24717a092245SBram Moolenaar      'try',
24727a092245SBram Moolenaar      'echo "yes"',
24737a092245SBram Moolenaar      'catch',
24747a092245SBram Moolenaar      'endtry# comment',
24757a092245SBram Moolenaar      ], 'E488:')
24762c5ed4e3SBram Moolenaar  CheckScriptFailure([
24772c5ed4e3SBram Moolenaar      'vim9script',
24782c5ed4e3SBram Moolenaar      'try',
24792c5ed4e3SBram Moolenaar      '  echo "yes"',
24802c5ed4e3SBram Moolenaar      'catch',
24812c5ed4e3SBram Moolenaar      'endtry# comment',
24829b7bf9e9SBram Moolenaar      ], 'E488:')
24832c5ed4e3SBram Moolenaar
24842c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24852c5ed4e3SBram Moolenaar      'vim9script',
24862c5ed4e3SBram Moolenaar      'hi # comment',
24872c5ed4e3SBram Moolenaar      ])
24882c5ed4e3SBram Moolenaar  CheckScriptFailure([
24892c5ed4e3SBram Moolenaar      'vim9script',
24902c5ed4e3SBram Moolenaar      'hi# comment',
24912c5ed4e3SBram Moolenaar      ], 'E416:')
24921966c248SBram Moolenaar  CheckScriptSuccess([
24931966c248SBram Moolenaar      'vim9script',
24941966c248SBram Moolenaar      'hi Search # comment',
24951966c248SBram Moolenaar      ])
24961966c248SBram Moolenaar  CheckScriptFailure([
24971966c248SBram Moolenaar      'vim9script',
24981966c248SBram Moolenaar      'hi Search# comment',
24991966c248SBram Moolenaar      ], 'E416:')
25001966c248SBram Moolenaar  CheckScriptSuccess([
25011966c248SBram Moolenaar      'vim9script',
25021966c248SBram Moolenaar      'hi link This Search # comment',
25031966c248SBram Moolenaar      ])
25041966c248SBram Moolenaar  CheckScriptFailure([
25051966c248SBram Moolenaar      'vim9script',
25061966c248SBram Moolenaar      'hi link This That# comment',
25071966c248SBram Moolenaar      ], 'E413:')
25081966c248SBram Moolenaar  CheckScriptSuccess([
25091966c248SBram Moolenaar      'vim9script',
25101966c248SBram Moolenaar      'hi clear This # comment',
25111966c248SBram Moolenaar      'hi clear # comment',
25121966c248SBram Moolenaar      ])
2513f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2514f5be8cdbSBram Moolenaar  # hi clear This# comment',
25151966c248SBram Moolenaar  CheckScriptFailure([
25161966c248SBram Moolenaar      'vim9script',
25171966c248SBram Moolenaar      'hi clear# comment',
25181966c248SBram Moolenaar      ], 'E416:')
25191966c248SBram Moolenaar
25201966c248SBram Moolenaar  CheckScriptSuccess([
25211966c248SBram Moolenaar      'vim9script',
25221966c248SBram Moolenaar      'hi Group term=bold',
25231966c248SBram Moolenaar      'match Group /todo/ # comment',
25241966c248SBram Moolenaar      ])
25251966c248SBram Moolenaar  CheckScriptFailure([
25261966c248SBram Moolenaar      'vim9script',
25271966c248SBram Moolenaar      'hi Group term=bold',
25281966c248SBram Moolenaar      'match Group /todo/# comment',
25291966c248SBram Moolenaar      ], 'E488:')
25301966c248SBram Moolenaar  CheckScriptSuccess([
25311966c248SBram Moolenaar      'vim9script',
25321966c248SBram Moolenaar      'match # comment',
25331966c248SBram Moolenaar      ])
25341966c248SBram Moolenaar  CheckScriptFailure([
25351966c248SBram Moolenaar      'vim9script',
25361966c248SBram Moolenaar      'match# comment',
25371966c248SBram Moolenaar      ], 'E475:')
25381966c248SBram Moolenaar  CheckScriptSuccess([
25391966c248SBram Moolenaar      'vim9script',
25401966c248SBram Moolenaar      'match none # comment',
25411966c248SBram Moolenaar      ])
25421966c248SBram Moolenaar  CheckScriptFailure([
25431966c248SBram Moolenaar      'vim9script',
25441966c248SBram Moolenaar      'match none# comment',
25451966c248SBram Moolenaar      ], 'E475:')
25461966c248SBram Moolenaar
25471966c248SBram Moolenaar  CheckScriptSuccess([
25481966c248SBram Moolenaar      'vim9script',
25491966c248SBram Moolenaar      'menutrans clear # comment',
25501966c248SBram Moolenaar      ])
25511966c248SBram Moolenaar  CheckScriptFailure([
25521966c248SBram Moolenaar      'vim9script',
25531966c248SBram Moolenaar      'menutrans clear# comment text',
25541966c248SBram Moolenaar      ], 'E474:')
25551966c248SBram Moolenaar
25561966c248SBram Moolenaar  CheckScriptSuccess([
25571966c248SBram Moolenaar      'vim9script',
25581966c248SBram Moolenaar      'syntax clear # comment',
25591966c248SBram Moolenaar      ])
25601966c248SBram Moolenaar  CheckScriptFailure([
25611966c248SBram Moolenaar      'vim9script',
25621966c248SBram Moolenaar      'syntax clear# comment text',
25631966c248SBram Moolenaar      ], 'E28:')
25641966c248SBram Moolenaar  CheckScriptSuccess([
25651966c248SBram Moolenaar      'vim9script',
25661966c248SBram Moolenaar      'syntax keyword Word some',
25671966c248SBram Moolenaar      'syntax clear Word # comment',
25681966c248SBram Moolenaar      ])
25691966c248SBram Moolenaar  CheckScriptFailure([
25701966c248SBram Moolenaar      'vim9script',
25711966c248SBram Moolenaar      'syntax keyword Word some',
25721966c248SBram Moolenaar      'syntax clear Word# comment text',
25731966c248SBram Moolenaar      ], 'E28:')
25741966c248SBram Moolenaar
25751966c248SBram Moolenaar  CheckScriptSuccess([
25761966c248SBram Moolenaar      'vim9script',
25771966c248SBram Moolenaar      'syntax list # comment',
25781966c248SBram Moolenaar      ])
25791966c248SBram Moolenaar  CheckScriptFailure([
25801966c248SBram Moolenaar      'vim9script',
25811966c248SBram Moolenaar      'syntax list# comment text',
25821966c248SBram Moolenaar      ], 'E28:')
25831966c248SBram Moolenaar
25841966c248SBram Moolenaar  CheckScriptSuccess([
25851966c248SBram Moolenaar      'vim9script',
25861966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
25871966c248SBram Moolenaar      ])
25881966c248SBram Moolenaar  CheckScriptFailure([
25891966c248SBram Moolenaar      'vim9script',
25901966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25911966c248SBram Moolenaar      ], 'E475:')
25921966c248SBram Moolenaar
25931966c248SBram Moolenaar  CheckScriptSuccess([
25941966c248SBram Moolenaar      'vim9script',
25951966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25961966c248SBram Moolenaar      ])
25971966c248SBram Moolenaar  CheckScriptFailure([
25981966c248SBram Moolenaar      'vim9script',
25991966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26001966c248SBram Moolenaar      ], 'E789:')
26011966c248SBram Moolenaar
26021966c248SBram Moolenaar  CheckScriptSuccess([
26031966c248SBram Moolenaar      'vim9script',
26041966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26051966c248SBram Moolenaar      ])
26061966c248SBram Moolenaar  CheckScriptFailure([
26071966c248SBram Moolenaar      'vim9script',
26081966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26091966c248SBram Moolenaar      ], 'E402:')
26101966c248SBram Moolenaar
26111966c248SBram Moolenaar  CheckScriptSuccess([
26121966c248SBram Moolenaar      'vim9script',
26131966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26141966c248SBram Moolenaar      ])
26151966c248SBram Moolenaar  CheckScriptFailure([
26161966c248SBram Moolenaar      'vim9script',
26171966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26181966c248SBram Moolenaar      ], 'E475:')
26191966c248SBram Moolenaar  CheckScriptFailure([
26201966c248SBram Moolenaar      'vim9script',
26211966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26221966c248SBram Moolenaar      ], 'E406:')
26231966c248SBram Moolenaar  CheckScriptFailure([
26241966c248SBram Moolenaar      'vim9script',
26251966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26261966c248SBram Moolenaar      ], 'E475:')
26271966c248SBram Moolenaar
26281966c248SBram Moolenaar  CheckScriptSuccess([
26291966c248SBram Moolenaar      'vim9script',
26301966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26311966c248SBram Moolenaar      ])
26321966c248SBram Moolenaar  CheckScriptFailure([
26331966c248SBram Moolenaar      'vim9script',
26341966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2635d032f34aSBram Moolenaar      ], 'E402:')
26361966c248SBram Moolenaar
26371966c248SBram Moolenaar  CheckScriptSuccess([
26381966c248SBram Moolenaar      'vim9script',
26391966c248SBram Moolenaar      'syntax sync # comment',
26401966c248SBram Moolenaar      ])
26411966c248SBram Moolenaar  CheckScriptFailure([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'syntax sync# comment',
26441966c248SBram Moolenaar      ], 'E404:')
26451966c248SBram Moolenaar  CheckScriptSuccess([
26461966c248SBram Moolenaar      'vim9script',
26471966c248SBram Moolenaar      'syntax sync ccomment # comment',
26481966c248SBram Moolenaar      ])
26491966c248SBram Moolenaar  CheckScriptFailure([
26501966c248SBram Moolenaar      'vim9script',
26511966c248SBram Moolenaar      'syntax sync ccomment# comment',
26521966c248SBram Moolenaar      ], 'E404:')
26531966c248SBram Moolenaar
26541966c248SBram Moolenaar  CheckScriptSuccess([
26551966c248SBram Moolenaar      'vim9script',
26561966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26571966c248SBram Moolenaar      ])
26581966c248SBram Moolenaar  CheckScriptFailure([
26591966c248SBram Moolenaar      'vim9script',
26601966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26611966c248SBram Moolenaar      ], 'E475:')
2662a72cfb80SBram Moolenaar
2663a72cfb80SBram Moolenaar  CheckScriptSuccess([
2664a72cfb80SBram Moolenaar      'vim9script',
2665a72cfb80SBram Moolenaar      'command Echo echo # comment',
2666a72cfb80SBram Moolenaar      'command Echo # comment',
2667a72cfb80SBram Moolenaar      ])
2668a72cfb80SBram Moolenaar  CheckScriptFailure([
2669a72cfb80SBram Moolenaar      'vim9script',
2670a72cfb80SBram Moolenaar      'command Echo echo# comment',
2671a72cfb80SBram Moolenaar      'Echo',
2672a72cfb80SBram Moolenaar      ], 'E121:')
2673a72cfb80SBram Moolenaar  CheckScriptFailure([
2674a72cfb80SBram Moolenaar      'vim9script',
2675a72cfb80SBram Moolenaar      'command Echo# comment',
2676a72cfb80SBram Moolenaar      ], 'E182:')
2677a72cfb80SBram Moolenaar  CheckScriptFailure([
2678a72cfb80SBram Moolenaar      'vim9script',
2679a72cfb80SBram Moolenaar      'command Echo echo',
2680a72cfb80SBram Moolenaar      'command Echo# comment',
2681a72cfb80SBram Moolenaar      ], 'E182:')
2682a72cfb80SBram Moolenaar
2683a72cfb80SBram Moolenaar  CheckScriptSuccess([
2684a72cfb80SBram Moolenaar      'vim9script',
2685a72cfb80SBram Moolenaar      'function # comment',
2686a72cfb80SBram Moolenaar      ])
2687a72cfb80SBram Moolenaar  CheckScriptFailure([
2688a72cfb80SBram Moolenaar      'vim9script',
26899898107fSBram Moolenaar      'function " comment',
26909898107fSBram Moolenaar      ], 'E129:')
26919898107fSBram Moolenaar  CheckScriptFailure([
26929898107fSBram Moolenaar      'vim9script',
2693a72cfb80SBram Moolenaar      'function# comment',
2694a72cfb80SBram Moolenaar      ], 'E129:')
2695a72cfb80SBram Moolenaar  CheckScriptSuccess([
2696a72cfb80SBram Moolenaar      'vim9script',
2697a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2698a72cfb80SBram Moolenaar      ])
2699a72cfb80SBram Moolenaar  CheckScriptFailure([
2700a72cfb80SBram Moolenaar      'vim9script',
2701a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2702a72cfb80SBram Moolenaar      ], 'E488:')
2703a72cfb80SBram Moolenaar
2704a72cfb80SBram Moolenaar  CheckScriptSuccess([
2705a72cfb80SBram Moolenaar      'vim9script',
27064c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2707a72cfb80SBram Moolenaar      'endfunc',
27084c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2709a72cfb80SBram Moolenaar      ])
2710a72cfb80SBram Moolenaar  CheckScriptFailure([
2711a72cfb80SBram Moolenaar      'vim9script',
27124c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2713a72cfb80SBram Moolenaar      'endfunc',
27144c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2715a72cfb80SBram Moolenaar      ], 'E488:')
2716a72cfb80SBram Moolenaar
2717a72cfb80SBram Moolenaar  CheckScriptSuccess([
2718a72cfb80SBram Moolenaar      'vim9script',
2719a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2720a72cfb80SBram Moolenaar      ])
2721a72cfb80SBram Moolenaar  CheckScriptFailure([
2722a72cfb80SBram Moolenaar      'vim9script',
2723a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2724a72cfb80SBram Moolenaar      ], 'E488:')
2725e7e4838fSBram Moolenaar
2726e7e4838fSBram Moolenaar  CheckScriptFailure([
2727e7e4838fSBram Moolenaar      'def Test() " comment',
2728e7e4838fSBram Moolenaar      'enddef',
2729e7e4838fSBram Moolenaar      ], 'E488:')
2730e7e4838fSBram Moolenaar  CheckScriptFailure([
2731e7e4838fSBram Moolenaar      'vim9script',
2732e7e4838fSBram Moolenaar      'def Test() " comment',
2733e7e4838fSBram Moolenaar      'enddef',
2734e7e4838fSBram Moolenaar      ], 'E488:')
2735e7e4838fSBram Moolenaar
2736e7e4838fSBram Moolenaar  CheckScriptSuccess([
2737e7e4838fSBram Moolenaar      'func Test() " comment',
2738e7e4838fSBram Moolenaar      'endfunc',
2739e7e4838fSBram Moolenaar      ])
27409898107fSBram Moolenaar  CheckScriptSuccess([
2741e7e4838fSBram Moolenaar      'vim9script',
2742e7e4838fSBram Moolenaar      'func Test() " comment',
2743e7e4838fSBram Moolenaar      'endfunc',
27449898107fSBram Moolenaar      ])
2745e7e4838fSBram Moolenaar
2746e7e4838fSBram Moolenaar  CheckScriptSuccess([
2747e7e4838fSBram Moolenaar      'def Test() # comment',
2748e7e4838fSBram Moolenaar      'enddef',
2749e7e4838fSBram Moolenaar      ])
2750e7e4838fSBram Moolenaar  CheckScriptFailure([
2751e7e4838fSBram Moolenaar      'func Test() # comment',
2752e7e4838fSBram Moolenaar      'endfunc',
2753e7e4838fSBram Moolenaar      ], 'E488:')
27542c5ed4e3SBram Moolenaarenddef
27552c5ed4e3SBram Moolenaar
27562c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27572c5ed4e3SBram Moolenaar  CheckCanRunGui
27582c5ed4e3SBram Moolenaar
27592c5ed4e3SBram Moolenaar  CheckScriptFailure([
27602c5ed4e3SBram Moolenaar      'vim9script',
27612c5ed4e3SBram Moolenaar      'gui#comment'
27622c5ed4e3SBram Moolenaar      ], 'E499:')
27632c5ed4e3SBram Moolenaar  CheckScriptFailure([
27642c5ed4e3SBram Moolenaar      'vim9script',
27652c5ed4e3SBram Moolenaar      'gui -f#comment'
27662c5ed4e3SBram Moolenaar      ], 'E499:')
27677a092245SBram Moolenaarenddef
27687a092245SBram Moolenaar
2769a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27706797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27716797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2772a26b9700SBram Moolenaar
2773a26b9700SBram Moolenaar  edit test.vim
2774a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2775a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2776a26b9700SBram Moolenaar
2777a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2778a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2779a26b9700SBram Moolenaar
2780a26b9700SBram Moolenaar  g:entered = 0
2781a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2782a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2783a26b9700SBram Moolenaar
2784a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2785a26b9700SBram Moolenaar
2786a26b9700SBram Moolenaar  au! TabEnter
2787a26b9700SBram Moolenaar  unlet g:entered
2788d72c1bf0SBram Moolenaar
2789d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2790d72c1bf0SBram Moolenaar      'vim9script',
27916797966dSBram Moolenaar      'g:var = 123',
2792e55b1c09SBram Moolenaar      'b:var = 456',
2793e55b1c09SBram Moolenaar      'w:var = 777',
2794e55b1c09SBram Moolenaar      't:var = 888',
2795d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2796d72c1bf0SBram Moolenaar      ])
2797d72c1bf0SBram Moolenaar
2798d72c1bf0SBram Moolenaar  CheckScriptFailure([
2799d72c1bf0SBram Moolenaar      'vim9script',
2800d72c1bf0SBram Moolenaar      'let g:var = 123',
2801e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2802e55b1c09SBram Moolenaar
2803e55b1c09SBram Moolenaar  CheckScriptFailure([
2804e55b1c09SBram Moolenaar      'vim9script',
2805e55b1c09SBram Moolenaar      'let b:var = 123',
2806e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2807e55b1c09SBram Moolenaar
2808e55b1c09SBram Moolenaar  CheckScriptFailure([
2809e55b1c09SBram Moolenaar      'vim9script',
2810e55b1c09SBram Moolenaar      'let w:var = 123',
2811e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2812e55b1c09SBram Moolenaar
2813e55b1c09SBram Moolenaar  CheckScriptFailure([
2814e55b1c09SBram Moolenaar      'vim9script',
2815e55b1c09SBram Moolenaar      'let t:var = 123',
2816e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2817e55b1c09SBram Moolenaar
2818e55b1c09SBram Moolenaar  CheckScriptFailure([
2819e55b1c09SBram Moolenaar      'vim9script',
2820e55b1c09SBram Moolenaar      'let v:version = 123',
2821e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2822e55b1c09SBram Moolenaar
2823e55b1c09SBram Moolenaar  CheckScriptFailure([
2824e55b1c09SBram Moolenaar      'vim9script',
2825e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2826e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28276797966dSBram Moolenaar
28286797966dSBram Moolenaar  CheckScriptFailure([
28296797966dSBram Moolenaar      'vim9script',
28306797966dSBram Moolenaar      'g:var = 123',
283132e35117SBram Moolenaar      'unlet g:var# comment1',
2832d72c1bf0SBram Moolenaar      ], 'E108:')
2833d72c1bf0SBram Moolenaar
2834d72c1bf0SBram Moolenaar  CheckScriptFailure([
2835d72c1bf0SBram Moolenaar      'let g:var = 123',
2836d72c1bf0SBram Moolenaar      'unlet g:var # something',
2837d72c1bf0SBram Moolenaar      ], 'E488:')
2838faac4104SBram Moolenaar
2839faac4104SBram Moolenaar  CheckScriptSuccess([
2840faac4104SBram Moolenaar      'vim9script',
284132e35117SBram Moolenaar      'if 1 # comment2',
2842faac4104SBram Moolenaar      '  echo "yes"',
2843faac4104SBram Moolenaar      'elseif 2 #comment',
2844faac4104SBram Moolenaar      '  echo "no"',
2845faac4104SBram Moolenaar      'endif',
2846faac4104SBram Moolenaar      ])
2847faac4104SBram Moolenaar
2848faac4104SBram Moolenaar  CheckScriptFailure([
2849faac4104SBram Moolenaar      'vim9script',
285032e35117SBram Moolenaar      'if 1# comment3',
2851faac4104SBram Moolenaar      '  echo "yes"',
2852faac4104SBram Moolenaar      'endif',
2853faac4104SBram Moolenaar      ], 'E15:')
2854faac4104SBram Moolenaar
2855faac4104SBram Moolenaar  CheckScriptFailure([
2856faac4104SBram Moolenaar      'vim9script',
285732e35117SBram Moolenaar      'if 0 # comment4',
2858faac4104SBram Moolenaar      '  echo "yes"',
2859faac4104SBram Moolenaar      'elseif 2#comment',
2860faac4104SBram Moolenaar      '  echo "no"',
2861faac4104SBram Moolenaar      'endif',
2862faac4104SBram Moolenaar      ], 'E15:')
2863faac4104SBram Moolenaar
2864faac4104SBram Moolenaar  CheckScriptSuccess([
2865faac4104SBram Moolenaar      'vim9script',
286632e35117SBram Moolenaar      'let v = 1 # comment5',
2867faac4104SBram Moolenaar      ])
2868faac4104SBram Moolenaar
2869faac4104SBram Moolenaar  CheckScriptFailure([
2870faac4104SBram Moolenaar      'vim9script',
287132e35117SBram Moolenaar      'let v = 1# comment6',
287232e35117SBram Moolenaar      ], 'E15:')
2873faac4104SBram Moolenaar
2874faac4104SBram Moolenaar  CheckScriptSuccess([
2875faac4104SBram Moolenaar      'vim9script',
2876faac4104SBram Moolenaar      'new'
2877faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2878df069eecSBram Moolenaar      ':$',
2879faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2880faac4104SBram Moolenaar      'bwipe!',
2881faac4104SBram Moolenaar      ])
2882faac4104SBram Moolenaar
2883f5be8cdbSBram Moolenaar  CheckScriptFailure([
2884f5be8cdbSBram Moolenaar      'vim9script',
2885f5be8cdbSBram Moolenaar      'new'
2886f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2887f5be8cdbSBram Moolenaar      ':$',
2888f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2889f5be8cdbSBram Moolenaar      'bwipe!',
2890f5be8cdbSBram Moolenaar      ], 'E488:')
2891f5be8cdbSBram Moolenaar
2892f5be8cdbSBram Moolenaar  CheckScriptFailure([
2893f5be8cdbSBram Moolenaar      'vim9script',
2894f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2895f5be8cdbSBram Moolenaar      ], 'E477:')
2896a26b9700SBram Moolenaarenddef
2897a26b9700SBram Moolenaar
28987e5bd91dSBram Moolenaardef Test_finish()
28997e5bd91dSBram Moolenaar  let lines =<< trim END
29007e5bd91dSBram Moolenaar    vim9script
29016797966dSBram Moolenaar    g:res = 'one'
29027e5bd91dSBram Moolenaar    if v:false | finish | endif
29036797966dSBram Moolenaar    g:res = 'two'
29047e5bd91dSBram Moolenaar    finish
29056797966dSBram Moolenaar    g:res = 'three'
29067e5bd91dSBram Moolenaar  END
29077e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29087e5bd91dSBram Moolenaar  source Xfinished
29097e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29107e5bd91dSBram Moolenaar
29117e5bd91dSBram Moolenaar  unlet g:res
29127e5bd91dSBram Moolenaar  delete('Xfinished')
29137e5bd91dSBram Moolenaarenddef
29147e5bd91dSBram Moolenaar
291532e35117SBram Moolenaardef Test_let_func_call()
291632e35117SBram Moolenaar  let lines =<< trim END
291732e35117SBram Moolenaar    vim9script
291832e35117SBram Moolenaar    func GetValue()
291932e35117SBram Moolenaar      if exists('g:count')
292032e35117SBram Moolenaar        let g:count += 1
292132e35117SBram Moolenaar      else
292232e35117SBram Moolenaar        let g:count = 1
292332e35117SBram Moolenaar      endif
292432e35117SBram Moolenaar      return 'this'
292532e35117SBram Moolenaar    endfunc
292632e35117SBram Moolenaar    let val: string = GetValue()
2927f5be8cdbSBram Moolenaar    # env var is always a string
2928df671b46SBram Moolenaar    let env = $TERM
292932e35117SBram Moolenaar  END
293032e35117SBram Moolenaar  writefile(lines, 'Xfinished')
293132e35117SBram Moolenaar  source Xfinished
2932f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
293332e35117SBram Moolenaar  assert_equal(1, g:count)
293432e35117SBram Moolenaar
293532e35117SBram Moolenaar  unlet g:count
293632e35117SBram Moolenaar  delete('Xfinished')
293732e35117SBram Moolenaarenddef
293832e35117SBram Moolenaar
293932e35117SBram Moolenaardef Test_let_missing_type()
294032e35117SBram Moolenaar  let lines =<< trim END
294132e35117SBram Moolenaar    vim9script
2942df671b46SBram Moolenaar    let var = g:unknown
2943227a69deSBram Moolenaar  END
2944822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2945227a69deSBram Moolenaar
2946227a69deSBram Moolenaar  lines =<< trim END
2947227a69deSBram Moolenaar    vim9script
2948227a69deSBram Moolenaar    let nr: number = 123
2949227a69deSBram Moolenaar    let var = nr
2950227a69deSBram Moolenaar  END
2951822ba247SBram Moolenaar  CheckScriptSuccess(lines)
295232e35117SBram Moolenaarenddef
295332e35117SBram Moolenaar
2954c82a5b5dSBram Moolenaardef Test_let_declaration()
2955c82a5b5dSBram Moolenaar  let lines =<< trim END
2956c82a5b5dSBram Moolenaar    vim9script
2957c82a5b5dSBram Moolenaar    let var: string
2958c82a5b5dSBram Moolenaar    g:var_uninit = var
2959c82a5b5dSBram Moolenaar    var = 'text'
2960c82a5b5dSBram Moolenaar    g:var_test = var
2961f5be8cdbSBram Moolenaar    # prefixing s: is optional
2962984dddbeSBram Moolenaar    s:var = 'prefixed'
2963984dddbeSBram Moolenaar    g:var_prefixed = s:var
2964984dddbeSBram Moolenaar
2965984dddbeSBram Moolenaar    let s:other: number
2966984dddbeSBram Moolenaar    other = 1234
2967984dddbeSBram Moolenaar    g:other_var = other
296853b29e48SBram Moolenaar
296953b29e48SBram Moolenaar    # type is inferred
297053b29e48SBram Moolenaar    s:dict = {'a': 222}
297153b29e48SBram Moolenaar    def GetDictVal(key: any)
297253b29e48SBram Moolenaar      g:dict_val = s:dict[key]
297353b29e48SBram Moolenaar    enddef
297453b29e48SBram Moolenaar    GetDictVal('a')
2975c82a5b5dSBram Moolenaar  END
2976c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2977c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2978c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2979984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2980984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
298153b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
2982c82a5b5dSBram Moolenaar
2983c82a5b5dSBram Moolenaar  unlet g:var_uninit
2984c82a5b5dSBram Moolenaar  unlet g:var_test
2985984dddbeSBram Moolenaar  unlet g:var_prefixed
2986984dddbeSBram Moolenaar  unlet g:other_var
2987c82a5b5dSBram Moolenaarenddef
2988c82a5b5dSBram Moolenaar
2989c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2990c5b1c20bSBram Moolenaar  let lines =<< trim END
2991c5b1c20bSBram Moolenaar    vim9script
2992c5b1c20bSBram Moolenaar    const var: string
2993c5b1c20bSBram Moolenaar  END
2994c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2995c5b1c20bSBram Moolenaar
2996c5b1c20bSBram Moolenaar  lines =<< trim END
2997c5b1c20bSBram Moolenaar    vim9script
2998c5b1c20bSBram Moolenaar    let 9var: string
2999c5b1c20bSBram Moolenaar  END
3000c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3001c5b1c20bSBram Moolenaarenddef
3002c5b1c20bSBram Moolenaar
300334db91f7SBram Moolenaardef Test_let_type_check()
300434db91f7SBram Moolenaar  let lines =<< trim END
300534db91f7SBram Moolenaar    vim9script
300634db91f7SBram Moolenaar    let var: string
300734db91f7SBram Moolenaar    var = 1234
300834db91f7SBram Moolenaar  END
3009451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3010984dddbeSBram Moolenaar
3011984dddbeSBram Moolenaar  lines =<< trim END
3012984dddbeSBram Moolenaar    vim9script
3013984dddbeSBram Moolenaar    let var:string
3014984dddbeSBram Moolenaar  END
3015984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3016c5b1c20bSBram Moolenaar
3017c5b1c20bSBram Moolenaar  lines =<< trim END
3018c5b1c20bSBram Moolenaar    vim9script
3019c5b1c20bSBram Moolenaar    let var: asdf
3020c5b1c20bSBram Moolenaar  END
3021c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3022a71e2633SBram Moolenaar
3023a71e2633SBram Moolenaar  lines =<< trim END
3024a71e2633SBram Moolenaar    vim9script
3025a71e2633SBram Moolenaar    let s:l: list<number>
3026a71e2633SBram Moolenaar    s:l = []
3027a71e2633SBram Moolenaar  END
3028a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3029a71e2633SBram Moolenaar
3030a71e2633SBram Moolenaar  lines =<< trim END
3031a71e2633SBram Moolenaar    vim9script
3032a71e2633SBram Moolenaar    let s:d: dict<number>
3033a71e2633SBram Moolenaar    s:d = {}
3034a71e2633SBram Moolenaar  END
3035a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
303634db91f7SBram Moolenaarenddef
303734db91f7SBram Moolenaar
3038a5d0077eSBram Moolenaardef Test_forward_declaration()
3039a5d0077eSBram Moolenaar  let lines =<< trim END
3040a5d0077eSBram Moolenaar    vim9script
3041a5d0077eSBram Moolenaar    def GetValue(): string
3042a5d0077eSBram Moolenaar      return theVal
3043a5d0077eSBram Moolenaar    enddef
3044a5d0077eSBram Moolenaar    let theVal = 'something'
3045822ba247SBram Moolenaar    g:initVal = GetValue()
3046a5d0077eSBram Moolenaar    theVal = 'else'
3047a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3048a5d0077eSBram Moolenaar  END
3049a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3050a5d0077eSBram Moolenaar  source Xforward
3051a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3052a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3053a5d0077eSBram Moolenaar
3054a5d0077eSBram Moolenaar  unlet g:initVal
3055a5d0077eSBram Moolenaar  unlet g:laterVal
3056a5d0077eSBram Moolenaar  delete('Xforward')
3057a5d0077eSBram Moolenaarenddef
3058a5d0077eSBram Moolenaar
30599721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
30609721fb4eSBram Moolenaar  let legacy_lines =<< trim END
30619721fb4eSBram Moolenaar    source Xvim9_script.vim
30629721fb4eSBram Moolenaar
30639721fb4eSBram Moolenaar    call assert_false(exists('local'))
30649721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30659721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30669721fb4eSBram Moolenaar    call assert_equal('global', global)
30679721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30689721fb4eSBram Moolenaar
30699721fb4eSBram Moolenaar    " imported variable becomes script-local
30709721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30719721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30729721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30739721fb4eSBram Moolenaar
30749721fb4eSBram Moolenaar    " imported function becomes script-local
30759721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30769721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30779721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30789721fb4eSBram Moolenaar  END
30799721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30809721fb4eSBram Moolenaar
30819721fb4eSBram Moolenaar  let vim9_lines =<< trim END
30829721fb4eSBram Moolenaar    vim9script
30839721fb4eSBram Moolenaar    let local = 'local'
30849721fb4eSBram Moolenaar    g:global = 'global'
30859721fb4eSBram Moolenaar    export let exported = 'exported'
30869721fb4eSBram Moolenaar    export def GetText(): string
30879721fb4eSBram Moolenaar       return 'text'
30889721fb4eSBram Moolenaar    enddef
30899721fb4eSBram Moolenaar  END
30909721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
30919721fb4eSBram Moolenaar
30929721fb4eSBram Moolenaar  source Xlegacy_script.vim
30939721fb4eSBram Moolenaar
30949721fb4eSBram Moolenaar  assert_equal('global', g:global)
3095f5be8cdbSBram Moolenaar  unlet g:global
30969721fb4eSBram Moolenaar
30979721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30989721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30999721fb4eSBram Moolenaarenddef
3100a5d0077eSBram Moolenaar
31017d699701SBram Moolenaarfunc Test_vim9script_not_global()
31027d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31037d699701SBram Moolenaar  let vim9lines =<< trim END
31047d699701SBram Moolenaar    vim9script
31057d699701SBram Moolenaar    let var = 'local'
31067d699701SBram Moolenaar    func TheFunc()
31077d699701SBram Moolenaar      echo 'local'
31087d699701SBram Moolenaar    endfunc
31097d699701SBram Moolenaar    def DefFunc()
31107d699701SBram Moolenaar      echo 'local'
31117d699701SBram Moolenaar    enddef
31127d699701SBram Moolenaar  END
31137d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31147d699701SBram Moolenaar  source Xvim9script.vim
31157d699701SBram Moolenaar  try
31167d699701SBram Moolenaar    echo g:var
31177d699701SBram Moolenaar    assert_report('did not fail')
31187d699701SBram Moolenaar  catch /E121:/
31197d699701SBram Moolenaar    " caught
31207d699701SBram Moolenaar  endtry
31217d699701SBram Moolenaar  try
31227d699701SBram Moolenaar    call TheFunc()
31237d699701SBram Moolenaar    assert_report('did not fail')
31247d699701SBram Moolenaar  catch /E117:/
31257d699701SBram Moolenaar    " caught
31267d699701SBram Moolenaar  endtry
31277d699701SBram Moolenaar  try
31287d699701SBram Moolenaar    call DefFunc()
31297d699701SBram Moolenaar    assert_report('did not fail')
31307d699701SBram Moolenaar  catch /E117:/
31317d699701SBram Moolenaar    " caught
31327d699701SBram Moolenaar  endtry
31337d699701SBram Moolenaar
31347d699701SBram Moolenaar  call delete('Xvim9script.vium')
31357d699701SBram Moolenaarendfunc
31367d699701SBram Moolenaar
3137eeb27bfeSBram Moolenaardef Test_vim9_copen()
3138eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3139eeb27bfeSBram Moolenaar  copen
3140eeb27bfeSBram Moolenaar  quit
3141eeb27bfeSBram Moolenaarenddef
3142eeb27bfeSBram Moolenaar
31432d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31442d6b20d6SBram Moolenaardef Test_vim9_autoload()
31452d6b20d6SBram Moolenaar  let lines =<< trim END
31462d6b20d6SBram Moolenaar     vim9script
31472d6b20d6SBram Moolenaar     def foo#test()
31482d6b20d6SBram Moolenaar         echomsg getreg('"')
31492d6b20d6SBram Moolenaar     enddef
31502d6b20d6SBram Moolenaar  END
31512d6b20d6SBram Moolenaar
31522d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31532d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
31542d6b20d6SBram Moolenaar  let save_rtp = &rtp
31552d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31562d6b20d6SBram Moolenaar  augroup test
31572d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31582d6b20d6SBram Moolenaar  augroup END
31592d6b20d6SBram Moolenaar
31602d6b20d6SBram Moolenaar  normal Y
31612d6b20d6SBram Moolenaar
31622d6b20d6SBram Moolenaar  augroup test
31632d6b20d6SBram Moolenaar    autocmd!
31642d6b20d6SBram Moolenaar  augroup END
31652d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31662d6b20d6SBram Moolenaar  &rtp = save_rtp
31672d6b20d6SBram Moolenaarenddef
31682d6b20d6SBram Moolenaar
3169*81e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
3170*81e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
3171*81e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3172*81e17fbeSBram Moolenaar  let lines =<< trim END
3173*81e17fbeSBram Moolenaar    let s:counter = 1
3174*81e17fbeSBram Moolenaar    def s:Func()
3175*81e17fbeSBram Moolenaar      au! CursorHold
3176*81e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
3177*81e17fbeSBram Moolenaar    enddef
3178*81e17fbeSBram Moolenaar    call s:Func()
3179*81e17fbeSBram Moolenaar    doau CursorHold
3180*81e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
3181*81e17fbeSBram Moolenaar    au! CursorHold
3182*81e17fbeSBram Moolenaar  END
3183*81e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
3184*81e17fbeSBram Moolenaarenddef
3185*81e17fbeSBram Moolenaar
31863896a105SBram Moolenaardef Test_cmdline_win()
31873896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31883896a105SBram Moolenaar  # the command line window.
31893896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
31903896a105SBram Moolenaar  let export_lines =<< trim END
31913896a105SBram Moolenaar    vim9script
31923896a105SBram Moolenaar    export let That = 'yes'
31933896a105SBram Moolenaar  END
31943896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
31953896a105SBram Moolenaar  let import_lines =<< trim END
31963896a105SBram Moolenaar    vim9script
31973896a105SBram Moolenaar    import That from './Xexport.vim'
31983896a105SBram Moolenaar  END
31993896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32003896a105SBram Moolenaar  let save_rtp = &rtp
32013896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32023896a105SBram Moolenaar  syntax on
32033896a105SBram Moolenaar  augroup CmdWin
32043896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32053896a105SBram Moolenaar  augroup END
32063896a105SBram Moolenaar  # this will open and also close the cmdline window
32073896a105SBram Moolenaar  feedkeys('q:', 'xt')
32083896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32093896a105SBram Moolenaar
32103896a105SBram Moolenaar  augroup CmdWin
32113896a105SBram Moolenaar    au!
32123896a105SBram Moolenaar  augroup END
32133896a105SBram Moolenaar  &rtp = save_rtp
32143896a105SBram Moolenaar  delete('rtp', 'rf')
32153896a105SBram Moolenaarenddef
32163896a105SBram Moolenaar
3217585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3218585fea7bSBram Moolenaardef Test_substitute_cmd()
3219585fea7bSBram Moolenaar  new
3220585fea7bSBram Moolenaar  setline(1, 'something')
3221585fea7bSBram Moolenaar  :substitute(some(other(
3222585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3223585fea7bSBram Moolenaar  bwipe!
3224585fea7bSBram Moolenaar
3225f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3226585fea7bSBram Moolenaar  let lines =<< trim END
3227585fea7bSBram Moolenaar    vim9script
3228585fea7bSBram Moolenaar    new
3229585fea7bSBram Moolenaar    setline(1, 'something')
3230585fea7bSBram Moolenaar    :substitute(some(other(
3231585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3232585fea7bSBram Moolenaar    bwipe!
3233585fea7bSBram Moolenaar  END
3234585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3235585fea7bSBram Moolenaar  source Xvim9lines
3236585fea7bSBram Moolenaar
3237585fea7bSBram Moolenaar  delete('Xvim9lines')
3238585fea7bSBram Moolenaarenddef
3239585fea7bSBram Moolenaar
32408a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3241