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    &ts = 6
114b5ed2660SBram Moolenaar    &ts += 3
115b5ed2660SBram Moolenaar    assert_equal(9, &ts)
116*2e800955SBram Moolenaar
117*2e800955SBram Moolenaar    &l:ts = 6
118*2e800955SBram Moolenaar    assert_equal(6, &ts)
119*2e800955SBram Moolenaar    &l:ts += 2
120*2e800955SBram Moolenaar    assert_equal(8, &ts)
121*2e800955SBram Moolenaar
122*2e800955SBram Moolenaar    &g:ts = 6
123*2e800955SBram Moolenaar    assert_equal(6, &g:ts)
124*2e800955SBram Moolenaar    &g:ts += 2
125*2e800955SBram Moolenaar    assert_equal(8, &g:ts)
126b5ed2660SBram Moolenaar  END
127*2e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
128b5ed2660SBram Moolenaar
1290aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1300aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1310aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1320aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1330aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1340aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1350aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1360aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
137cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1380aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
13980c34ca3SBram Moolenaar  &ts = 8
140a8c17704SBram Moolenaar
1410aae4809SBram Moolenaar  lines =<< trim END
1420aae4809SBram Moolenaar    let save_TI = &t_TI
1430aae4809SBram Moolenaar    &t_TI = ''
1440aae4809SBram Moolenaar    assert_equal('', &t_TI)
1450aae4809SBram Moolenaar    &t_TI = 'xxx'
1460aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1470aae4809SBram Moolenaar    &t_TI = save_TI
1480aae4809SBram Moolenaar  END
1490aae4809SBram Moolenaar  CheckDefSuccess(lines)
1500aae4809SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
1510aae4809SBram Moolenaar
1520aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
1530aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
1540aae4809SBram Moolenaar
1550aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
1560aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
15733afa244SBram Moolenaar
158f9b2b496SBram Moolenaar  lines =<< trim END
159f9b2b496SBram Moolenaar    vim9script
160f9b2b496SBram Moolenaar    def SomeFunc()
161f9b2b496SBram Moolenaar      s:var = 123
162f9b2b496SBram Moolenaar    enddef
163f9b2b496SBram Moolenaar    defcompile
164f9b2b496SBram Moolenaar  END
165f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
166f9b2b496SBram Moolenaar
167a8c17704SBram Moolenaar  g:inc_counter += 1
168a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
169a8c17704SBram Moolenaar
170a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
171a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
172dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
173451c2e35SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
174a8c17704SBram Moolenaar
175b5ed2660SBram Moolenaar  lines =<< trim END
176b5ed2660SBram Moolenaar    @c = 'areg'
177b5ed2660SBram Moolenaar    @c ..= 'add'
178b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
179b5ed2660SBram Moolenaar  END
180*2e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
181*2e800955SBram Moolenaar
182*2e800955SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
183*2e800955SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1012:')
184b5ed2660SBram Moolenaar
185e69f6d04SBram Moolenaar  v:errmsg = 'none'
186e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
187e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
188dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
189451c2e35SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1012:')
19033afa244SBram Moolenaar
19133afa244SBram Moolenaar  # single letter variables
19233afa244SBram Moolenaar  a = 123
19333afa244SBram Moolenaar  assert_equal(123, a)
19433afa244SBram Moolenaar  let b: number
19533afa244SBram Moolenaar  b = 123
19633afa244SBram Moolenaar  assert_equal(123, b)
19733afa244SBram Moolenaar  let g: number
19833afa244SBram Moolenaar  g = 123
19933afa244SBram Moolenaar  assert_equal(123, g)
20033afa244SBram Moolenaar  let s: number
20133afa244SBram Moolenaar  s = 123
20233afa244SBram Moolenaar  assert_equal(123, s)
20333afa244SBram Moolenaar  let t: number
20433afa244SBram Moolenaar  t = 123
20533afa244SBram Moolenaar  assert_equal(123, t)
20633afa244SBram Moolenaar  let v: number
20733afa244SBram Moolenaar  v = 123
20833afa244SBram Moolenaar  assert_equal(123, v)
20933afa244SBram Moolenaar  let w: number
21033afa244SBram Moolenaar  w = 123
21133afa244SBram Moolenaar  assert_equal(123, w)
2125deeb3f1SBram Moolenaarenddef
2135deeb3f1SBram Moolenaar
2143b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2153b74b6b4SBram Moolenaar  let lines =<< trim END
2163b74b6b4SBram Moolenaar      vim9script
2173b74b6b4SBram Moolenaar
218f5be8cdbSBram Moolenaar      # single character variable declarations work
2193b74b6b4SBram Moolenaar      let a: string
2203b74b6b4SBram Moolenaar      let b: number
2213b74b6b4SBram Moolenaar      let l: list<any>
2223b74b6b4SBram Moolenaar      let s: string
2233b74b6b4SBram Moolenaar      let t: number
2243b74b6b4SBram Moolenaar      let v: number
2253b74b6b4SBram Moolenaar      let w: number
2263b74b6b4SBram Moolenaar
227f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2283b74b6b4SBram Moolenaar      a = 'script-a'
2293b74b6b4SBram Moolenaar      b = 111
2303b74b6b4SBram Moolenaar      l = [1, 2, 3]
2313b74b6b4SBram Moolenaar      s = 'script-s'
2323b74b6b4SBram Moolenaar      t = 222
2333b74b6b4SBram Moolenaar      v = 333
2343b74b6b4SBram Moolenaar      w = 444
2353b74b6b4SBram Moolenaar
2363b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2373b74b6b4SBram Moolenaar      assert_equal(111, b)
2383b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2393b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2403b74b6b4SBram Moolenaar      assert_equal(222, t)
2413b74b6b4SBram Moolenaar      assert_equal(333, v)
2423b74b6b4SBram Moolenaar      assert_equal(444, w)
2433b74b6b4SBram Moolenaar  END
2443b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2453b74b6b4SBram Moolenaar  source Xsinglechar
2463b74b6b4SBram Moolenaar  delete('Xsinglechar')
2473b74b6b4SBram Moolenaarenddef
2483b74b6b4SBram Moolenaar
24984370087SBram Moolenaardef Test_assignment_list()
25084370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
25184370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
25284370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
25384370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
25484370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
25584370087SBram Moolenaar
25684370087SBram Moolenaar  let listS: list<string> = []
25784370087SBram Moolenaar  let listN: list<number> = []
25884370087SBram Moolenaar
25984370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
26084370087SBram Moolenaar  list2[-1] = 99
26184370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
26284370087SBram Moolenaar  list2[-2] = 88
26384370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
26484370087SBram Moolenaar  list2[-3] = 77
26584370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
266dd29f1b0SBram Moolenaar  list2 += [100]
267dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
268dd29f1b0SBram Moolenaar
269dd29f1b0SBram Moolenaar  list3 += ['end']
270dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
271dd29f1b0SBram Moolenaar
272dd29f1b0SBram Moolenaar
27384370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
274c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
27584370087SBram Moolenaar
27684370087SBram Moolenaar  # type becomes list<any>
27784370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
27884370087SBram Moolenaarenddef
27984370087SBram Moolenaar
280b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
281b31be3f9SBram Moolenaar  let lines =<< trim END
282b31be3f9SBram Moolenaar    vim9script
283b31be3f9SBram Moolenaar    let v1: number
284b31be3f9SBram Moolenaar    let v2: number
285b31be3f9SBram Moolenaar    let v3: number
286b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
287b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
288b31be3f9SBram Moolenaar  END
289b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
290b31be3f9SBram Moolenaarenddef
291b31be3f9SBram Moolenaar
29284370087SBram Moolenaardef Test_assignment_dict()
29384370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
29484370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
29584370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
29684370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
29774fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
29884370087SBram Moolenaar
299f5be8cdbSBram Moolenaar  # overwrite
300c785b9a7SBram Moolenaar  dict3['key'] = 'another'
301c785b9a7SBram Moolenaar
30258626872SBram Moolenaar  # empty key can be used
30358626872SBram Moolenaar  let dd = {}
30458626872SBram Moolenaar  dd[""] = 6
30558626872SBram Moolenaar  assert_equal({'': 6}, dd)
30684370087SBram Moolenaar
30784370087SBram Moolenaar  # type becomes dict<any>
30884370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3098e4c8c85SBram Moolenaar
3108e4c8c85SBram Moolenaar  # assignment to script-local dict
3118e4c8c85SBram Moolenaar  let lines =<< trim END
3128e4c8c85SBram Moolenaar    vim9script
3138e4c8c85SBram Moolenaar    let test: dict<any> = {}
3148e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3158e4c8c85SBram Moolenaar      test['a'] = 43
3168e4c8c85SBram Moolenaar      return test
3178e4c8c85SBram Moolenaar    enddef
3188e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3198e4c8c85SBram Moolenaar  END
3208e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3218e4c8c85SBram Moolenaar
3228e4c8c85SBram Moolenaar  lines =<< trim END
3238e4c8c85SBram Moolenaar    vim9script
3248e4c8c85SBram Moolenaar    let test: dict<any>
3258e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3268e4c8c85SBram Moolenaar      test['a'] = 43
3278e4c8c85SBram Moolenaar      return test
3288e4c8c85SBram Moolenaar    enddef
3298e4c8c85SBram Moolenaar    FillDict()
3308e4c8c85SBram Moolenaar  END
3318e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3322caa1594SBram Moolenaar
3332caa1594SBram Moolenaar  # assignment to global dict
3342caa1594SBram Moolenaar  lines =<< trim END
3352caa1594SBram Moolenaar    vim9script
3362caa1594SBram Moolenaar    g:test = {}
3372caa1594SBram Moolenaar    def FillDict(): dict<any>
3382caa1594SBram Moolenaar      g:test['a'] = 43
3392caa1594SBram Moolenaar      return g:test
3402caa1594SBram Moolenaar    enddef
3412caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3422caa1594SBram Moolenaar  END
3432caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3442caa1594SBram Moolenaar
3452caa1594SBram Moolenaar  # assignment to buffer dict
3462caa1594SBram Moolenaar  lines =<< trim END
3472caa1594SBram Moolenaar    vim9script
3482caa1594SBram Moolenaar    b:test = {}
3492caa1594SBram Moolenaar    def FillDict(): dict<any>
3502caa1594SBram Moolenaar      b:test['a'] = 43
3512caa1594SBram Moolenaar      return b:test
3522caa1594SBram Moolenaar    enddef
3532caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3542caa1594SBram Moolenaar  END
3552caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
35684370087SBram Moolenaarenddef
35784370087SBram Moolenaar
358d3aac291SBram Moolenaardef Test_assignment_local()
359f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
360f5be8cdbSBram Moolenaar  # changed.
361d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
362d3aac291SBram Moolenaar    let b:existing = 'yes'
363d3aac291SBram Moolenaar    let w:existing = 'yes'
364d3aac291SBram Moolenaar    let t:existing = 'yes'
365d3aac291SBram Moolenaar
366d3aac291SBram Moolenaar    def Test_assignment_local_internal()
367d3aac291SBram Moolenaar      b:newvar = 'new'
368d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
369d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
370d3aac291SBram Moolenaar      b:existing = 'no'
371d3aac291SBram Moolenaar      assert_equal('no', b:existing)
372396f3138SBram Moolenaar      b:existing ..= 'NO'
373396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
374d3aac291SBram Moolenaar
375d3aac291SBram Moolenaar      w:newvar = 'new'
376d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
377d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
378d3aac291SBram Moolenaar      w:existing = 'no'
379d3aac291SBram Moolenaar      assert_equal('no', w:existing)
380396f3138SBram Moolenaar      w:existing ..= 'NO'
381396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
382d3aac291SBram Moolenaar
383d3aac291SBram Moolenaar      t:newvar = 'new'
384d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
385d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
386d3aac291SBram Moolenaar      t:existing = 'no'
387d3aac291SBram Moolenaar      assert_equal('no', t:existing)
388396f3138SBram Moolenaar      t:existing ..= 'NO'
389396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
390d3aac291SBram Moolenaar    enddef
391d3aac291SBram Moolenaar    call Test_assignment_local_internal()
392d3aac291SBram Moolenaar  END
393d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
394d3aac291SBram Moolenaarenddef
395d3aac291SBram Moolenaar
3965deeb3f1SBram Moolenaardef Test_assignment_default()
397e69f6d04SBram Moolenaar
398cb711abfSBram Moolenaar  # Test default values.
399e69f6d04SBram Moolenaar  let thebool: bool
400e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
401e69f6d04SBram Moolenaar
402e69f6d04SBram Moolenaar  let thenumber: number
403e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
404e69f6d04SBram Moolenaar
405e69f6d04SBram Moolenaar  if has('float')
406e69f6d04SBram Moolenaar    let thefloat: float
407e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
408e69f6d04SBram Moolenaar  endif
409e69f6d04SBram Moolenaar
410e69f6d04SBram Moolenaar  let thestring: string
411e69f6d04SBram Moolenaar  assert_equal('', thestring)
412e69f6d04SBram Moolenaar
413e69f6d04SBram Moolenaar  let theblob: blob
414e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
415e69f6d04SBram Moolenaar
4165deeb3f1SBram Moolenaar  let Thefunc: func
4175deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
418e69f6d04SBram Moolenaar
419e69f6d04SBram Moolenaar  let thelist: list<any>
420e69f6d04SBram Moolenaar  assert_equal([], thelist)
421e69f6d04SBram Moolenaar
422e69f6d04SBram Moolenaar  let thedict: dict<any>
423e69f6d04SBram Moolenaar  assert_equal({}, thedict)
424e69f6d04SBram Moolenaar
4252c869deeSBram Moolenaar  if has('channel')
426e69f6d04SBram Moolenaar    let thejob: job
427e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
428e69f6d04SBram Moolenaar
429e69f6d04SBram Moolenaar    let thechannel: channel
430e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
431c785b9a7SBram Moolenaar
432c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
433f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
434c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
435c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
436c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
437c785b9a7SBram Moolenaar    endif
4382c869deeSBram Moolenaar  endif
439585fea7bSBram Moolenaar
440585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
441585fea7bSBram Moolenaar  assert_equal(5678, nr)
4428a7d6542SBram Moolenaarenddef
4438a7d6542SBram Moolenaar
44447a519a9SBram Moolenaardef Test_assignment_var_list()
44547a519a9SBram Moolenaar  let v1: string
44647a519a9SBram Moolenaar  let v2: string
4479af78769SBram Moolenaar  let vrem: list<string>
4489af78769SBram Moolenaar  [v1] = ['aaa']
4499af78769SBram Moolenaar  assert_equal('aaa', v1)
4509af78769SBram Moolenaar
45147a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
45247a519a9SBram Moolenaar  assert_equal('one', v1)
45347a519a9SBram Moolenaar  assert_equal('two', v2)
4549af78769SBram Moolenaar
4559af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4569af78769SBram Moolenaar  assert_equal('one', v1)
4579af78769SBram Moolenaar  assert_equal('two', v2)
4589af78769SBram Moolenaar  assert_equal([], vrem)
4599af78769SBram Moolenaar
4609af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4619af78769SBram Moolenaar  assert_equal('one', v1)
4629af78769SBram Moolenaar  assert_equal('two', v2)
4639af78769SBram Moolenaar  assert_equal(['three'], vrem)
4641c199f9cSBram Moolenaar
4651c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4661c199f9cSBram Moolenaar  assert_equal(3, &ts)
4671c199f9cSBram Moolenaar  assert_equal(4, &sw)
4681c199f9cSBram Moolenaar  set ts=8 sw=4
46947a519a9SBram Moolenaarenddef
47047a519a9SBram Moolenaar
471c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
472c7e44a7eSBram Moolenaar  let lines =<< trim END
473c7e44a7eSBram Moolenaar    vim9script
474c7e44a7eSBram Moolenaar    def Func(): list<number>
475c7e44a7eSBram Moolenaar      return [1, 2]
476c7e44a7eSBram Moolenaar    enddef
477c7e44a7eSBram Moolenaar    let var1: number
478c7e44a7eSBram Moolenaar    let var2: number
479c7e44a7eSBram Moolenaar    [var1, var2] =
480c7e44a7eSBram Moolenaar          Func()
481c7e44a7eSBram Moolenaar    assert_equal(1, var1)
482c7e44a7eSBram Moolenaar    assert_equal(2, var2)
483c7e44a7eSBram Moolenaar    let ll =
484c7e44a7eSBram Moolenaar          Func()
485c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
48683144546SBram Moolenaar
48783144546SBram Moolenaar    @/ = 'text'
48883144546SBram Moolenaar    assert_equal('text', @/)
48983144546SBram Moolenaar    @0 = 'zero'
49083144546SBram Moolenaar    assert_equal('zero', @0)
49183144546SBram Moolenaar    @1 = 'one'
49283144546SBram Moolenaar    assert_equal('one', @1)
49383144546SBram Moolenaar    @9 = 'nine'
49483144546SBram Moolenaar    assert_equal('nine', @9)
49583144546SBram Moolenaar    @- = 'minus'
49683144546SBram Moolenaar    assert_equal('minus', @-)
49783144546SBram Moolenaar    if has('clipboard_working')
49883144546SBram Moolenaar      @* = 'star'
49983144546SBram Moolenaar      assert_equal('star', @*)
50083144546SBram Moolenaar      @+ = 'plus'
50183144546SBram Moolenaar      assert_equal('plus', @+)
50283144546SBram Moolenaar    endif
50395dd9f25SBram Moolenaar
50495dd9f25SBram Moolenaar    let a: number = 123
50595dd9f25SBram Moolenaar    assert_equal(123, a)
50695dd9f25SBram Moolenaar    let s: string = 'yes'
50795dd9f25SBram Moolenaar    assert_equal('yes', s)
50895dd9f25SBram Moolenaar    let b: number = 42
50995dd9f25SBram Moolenaar    assert_equal(42, b)
51095dd9f25SBram Moolenaar    let w: number = 43
51195dd9f25SBram Moolenaar    assert_equal(43, w)
51295dd9f25SBram Moolenaar    let t: number = 44
51395dd9f25SBram Moolenaar    assert_equal(44, t)
514c7e44a7eSBram Moolenaar  END
515c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
516c7e44a7eSBram Moolenaarenddef
517c7e44a7eSBram Moolenaar
518cab27678SBram Moolenaardef Mess(): string
519cab27678SBram Moolenaar  v:foldstart = 123
520cab27678SBram Moolenaar  return 'xxx'
521cab27678SBram Moolenaarenddef
522cab27678SBram Moolenaar
523d72c1bf0SBram Moolenaardef Test_assignment_failure()
5248a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
5258a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
5268a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
5278a7d6542SBram Moolenaar
52863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
52963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
53063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
53163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
53263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
53363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
53463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
53563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
53663be3d4bSBram Moolenaar
5378a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5388a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5398a7d6542SBram Moolenaar
5409b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5419af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5429af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5439af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5449af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5459af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5469af78769SBram Moolenaar                            'let y: number',
5479af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5489af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5499af78769SBram Moolenaar                            'let y: number',
5509af78769SBram Moolenaar                            'let z: list<number>',
5519af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5529be61bbbSBram Moolenaar
553e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
554c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5559be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
556c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5579be61bbbSBram Moolenaar
558e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
559c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5609be61bbbSBram Moolenaar
561434d72cbSBram Moolenaar  if has('dnd')
56265821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
563434d72cbSBram Moolenaar  else
564434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
565434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
566434d72cbSBram Moolenaar  endif
5679be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
56865821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
569c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5709be61bbbSBram Moolenaar
571e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
572e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
573e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
574e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5759be61bbbSBram Moolenaar
5769be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
577122616d9SBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
578122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
579122616d9SBram Moolenaar  call CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
580122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
5819be61bbbSBram Moolenaar
582451c2e35SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
58333fa29cfSBram Moolenaar
5848a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5858a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5868a7d6542SBram Moolenaar
5878a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5888a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5898a7d6542SBram Moolenaar
5908a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5918a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
59242a480bfSBram Moolenaar
593d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
59442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
595cab27678SBram Moolenaar
596cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
597cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
59843e969d3SBram Moolenaar
59943e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
60043e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
60143e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
60243e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
60343e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
60443e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
60543e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
60643e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
607d72c1bf0SBram Moolenaarenddef
608d72c1bf0SBram Moolenaar
609d72c1bf0SBram Moolenaardef Test_unlet()
610d72c1bf0SBram Moolenaar  g:somevar = 'yes'
611d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
612d72c1bf0SBram Moolenaar  unlet g:somevar
613d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
614d72c1bf0SBram Moolenaar  unlet! g:somevar
615d72c1bf0SBram Moolenaar
6168436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
6178436773fSBram Moolenaar  s:somevar = 'legacy'
6188436773fSBram Moolenaar  assert_true(exists('s:somevar'))
6198436773fSBram Moolenaar  unlet s:somevar
6208436773fSBram Moolenaar  assert_false(exists('s:somevar'))
6218436773fSBram Moolenaar  unlet! s:somevar
6228436773fSBram Moolenaar
623d72c1bf0SBram Moolenaar  call CheckScriptFailure([
624d72c1bf0SBram Moolenaar        'vim9script',
625d72c1bf0SBram Moolenaar        'let svar = 123',
626d72c1bf0SBram Moolenaar        'unlet svar',
627d72c1bf0SBram Moolenaar        ], 'E1081:')
628d72c1bf0SBram Moolenaar  call CheckScriptFailure([
629d72c1bf0SBram Moolenaar        'vim9script',
630d72c1bf0SBram Moolenaar        'let svar = 123',
631d72c1bf0SBram Moolenaar        'unlet s:svar',
632d72c1bf0SBram Moolenaar        ], 'E1081:')
633d72c1bf0SBram Moolenaar  call CheckScriptFailure([
634d72c1bf0SBram Moolenaar        'vim9script',
635d72c1bf0SBram Moolenaar        'let svar = 123',
636d72c1bf0SBram Moolenaar        'def Func()',
637d72c1bf0SBram Moolenaar        '  unlet svar',
638d72c1bf0SBram Moolenaar        'enddef',
639822ba247SBram Moolenaar        'defcompile',
640d72c1bf0SBram Moolenaar        ], 'E1081:')
641d72c1bf0SBram Moolenaar  call CheckScriptFailure([
642d72c1bf0SBram Moolenaar        'vim9script',
643d72c1bf0SBram Moolenaar        'let svar = 123',
644d72c1bf0SBram Moolenaar        'def Func()',
645d72c1bf0SBram Moolenaar        '  unlet s:svar',
646d72c1bf0SBram Moolenaar        'enddef',
647822ba247SBram Moolenaar        'defcompile',
648d72c1bf0SBram Moolenaar        ], 'E1081:')
6497bdaea6eSBram Moolenaar
6507bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6517bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6527bdaea6eSBram Moolenaar  unlet $ENVVAR
6537bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
654d72c1bf0SBram Moolenaarenddef
655599c89c8SBram Moolenaar
6564c17ad94SBram Moolenaardef Test_delfunction()
657f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6584c17ad94SBram Moolenaar  CheckScriptSuccess([
6594c17ad94SBram Moolenaar      'vim9script',
6604c17ad94SBram Moolenaar      'func CheckMe()',
6614c17ad94SBram Moolenaar      '  return 123',
6624c17ad94SBram Moolenaar      'endfunc',
6634c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6644c17ad94SBram Moolenaar      ])
6654c17ad94SBram Moolenaar
666f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6674c17ad94SBram Moolenaar  CheckScriptFailure([
6684c17ad94SBram Moolenaar      'vim9script',
6694c17ad94SBram Moolenaar      'func DeleteMe1()',
6704c17ad94SBram Moolenaar      'endfunc',
6714c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6724c17ad94SBram Moolenaar      ], 'E1084:')
6734c17ad94SBram Moolenaar  CheckScriptFailure([
6744c17ad94SBram Moolenaar      'vim9script',
6754c17ad94SBram Moolenaar      'func DeleteMe2()',
6764c17ad94SBram Moolenaar      'endfunc',
6774c17ad94SBram Moolenaar      'def DoThat()',
6784c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6794c17ad94SBram Moolenaar      'enddef',
6804c17ad94SBram Moolenaar      'DoThat()',
6814c17ad94SBram Moolenaar      ], 'E1084:')
6824c17ad94SBram Moolenaar  CheckScriptFailure([
6834c17ad94SBram Moolenaar      'vim9script',
6844c17ad94SBram Moolenaar      'def DeleteMe3()',
6854c17ad94SBram Moolenaar      'enddef',
6864c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6874c17ad94SBram Moolenaar      ], 'E1084:')
6884c17ad94SBram Moolenaar  CheckScriptFailure([
6894c17ad94SBram Moolenaar      'vim9script',
6904c17ad94SBram Moolenaar      'def DeleteMe4()',
6914c17ad94SBram Moolenaar      'enddef',
6924c17ad94SBram Moolenaar      'def DoThat()',
6934c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6944c17ad94SBram Moolenaar      'enddef',
6954c17ad94SBram Moolenaar      'DoThat()',
6964c17ad94SBram Moolenaar      ], 'E1084:')
697925e9fd6SBram Moolenaar
698925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
699925e9fd6SBram Moolenaar  let lines =<< trim END
700925e9fd6SBram Moolenaar      vim9script
701925e9fd6SBram Moolenaar      def g:Global(): string
702925e9fd6SBram Moolenaar        return "yes"
703925e9fd6SBram Moolenaar      enddef
704925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
705925e9fd6SBram Moolenaar      def! g:Global(): string
706925e9fd6SBram Moolenaar        return "no"
707925e9fd6SBram Moolenaar      enddef
708925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
709925e9fd6SBram Moolenaar      delfunc g:Global
710925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
711925e9fd6SBram Moolenaar  END
712925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
713925e9fd6SBram Moolenaar
714925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
715925e9fd6SBram Moolenaar  lines =<< trim END
716925e9fd6SBram Moolenaar      vim9script
717925e9fd6SBram Moolenaar      func g:Global()
718925e9fd6SBram Moolenaar        return "yes"
719925e9fd6SBram Moolenaar      endfunc
720925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
721925e9fd6SBram Moolenaar      def! g:Global(): string
722925e9fd6SBram Moolenaar        return "no"
723925e9fd6SBram Moolenaar      enddef
724925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
725925e9fd6SBram Moolenaar      delfunc g:Global
726925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
727925e9fd6SBram Moolenaar  END
728925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
729925e9fd6SBram Moolenaar
730925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
731925e9fd6SBram Moolenaar  lines =<< trim END
732925e9fd6SBram Moolenaar      vim9script
733925e9fd6SBram Moolenaar      def g:Global(): string
734925e9fd6SBram Moolenaar        return "yes"
735925e9fd6SBram Moolenaar      enddef
736925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
737925e9fd6SBram Moolenaar      func! g:Global()
738925e9fd6SBram Moolenaar        return "no"
739925e9fd6SBram Moolenaar      endfunc
740925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
741925e9fd6SBram Moolenaar      delfunc g:Global
742925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
743925e9fd6SBram Moolenaar  END
744925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7454c17ad94SBram Moolenaarenddef
7464c17ad94SBram Moolenaar
747599c89c8SBram Moolenaarfunc Test_wrong_type()
748599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
749599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
750599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
751599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
752599c89c8SBram Moolenaar
753599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
754599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
75542a480bfSBram Moolenaar
75642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
75742a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
75842a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
75942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
76042a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
76142a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
76242a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
76342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
76442a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
76542a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
76642a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
767a0a9f43aSBram Moolenaar
768a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
769a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7708a7d6542SBram Moolenaarendfunc
7718a7d6542SBram Moolenaar
7728a7d6542SBram Moolenaarfunc Test_const()
7738a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7748a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7758a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7769be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7778a7d6542SBram Moolenaarendfunc
7788a7d6542SBram Moolenaar
779df069eecSBram Moolenaardef Test_range_no_colon()
780df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
781df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
782df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
783df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
784df069eecSBram Moolenaarenddef
785df069eecSBram Moolenaar
786df069eecSBram Moolenaar
7878a7d6542SBram Moolenaardef Test_block()
7888a7d6542SBram Moolenaar  let outer = 1
7898a7d6542SBram Moolenaar  {
7908a7d6542SBram Moolenaar    let inner = 2
7918a7d6542SBram Moolenaar    assert_equal(1, outer)
7928a7d6542SBram Moolenaar    assert_equal(2, inner)
7938a7d6542SBram Moolenaar  }
7948a7d6542SBram Moolenaar  assert_equal(1, outer)
7958a7d6542SBram Moolenaarenddef
7968a7d6542SBram Moolenaar
7978a7d6542SBram Moolenaarfunc Test_block_failure()
7988a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
799585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
800585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
8018a7d6542SBram Moolenaarendfunc
8028a7d6542SBram Moolenaar
803d032f34aSBram Moolenaarfunc g:NoSuchFunc()
804d032f34aSBram Moolenaar  echo 'none'
805d032f34aSBram Moolenaarendfunc
806d032f34aSBram Moolenaar
8078a7d6542SBram Moolenaardef Test_try_catch()
8088a7d6542SBram Moolenaar  let l = []
8097a092245SBram Moolenaar  try # comment
8108a7d6542SBram Moolenaar    add(l, '1')
8118a7d6542SBram Moolenaar    throw 'wrong'
8128a7d6542SBram Moolenaar    add(l, '2')
8137a092245SBram Moolenaar  catch # comment
8148a7d6542SBram Moolenaar    add(l, v:exception)
8157a092245SBram Moolenaar  finally # comment
8168a7d6542SBram Moolenaar    add(l, '3')
8177a092245SBram Moolenaar  endtry # comment
8188a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
81968d130c6SBram Moolenaar
820e859312eSBram Moolenaar  l = []
821e859312eSBram Moolenaar  try
822e859312eSBram Moolenaar    try
823e859312eSBram Moolenaar      add(l, '1')
824e859312eSBram Moolenaar      throw 'wrong'
825e859312eSBram Moolenaar      add(l, '2')
826e859312eSBram Moolenaar    catch /right/
827e859312eSBram Moolenaar      add(l, v:exception)
828e859312eSBram Moolenaar    endtry
829e859312eSBram Moolenaar  catch /wrong/
830e859312eSBram Moolenaar    add(l, 'caught')
831e859312eSBram Moolenaar  finally
832e859312eSBram Moolenaar    add(l, 'finally')
833e859312eSBram Moolenaar  endtry
834e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
835e859312eSBram Moolenaar
83668d130c6SBram Moolenaar  let n: number
83768d130c6SBram Moolenaar  try
83868d130c6SBram Moolenaar    n = l[3]
83968d130c6SBram Moolenaar  catch /E684:/
84068d130c6SBram Moolenaar    n = 99
84168d130c6SBram Moolenaar  endtry
84268d130c6SBram Moolenaar  assert_equal(99, n)
84368d130c6SBram Moolenaar
84468d130c6SBram Moolenaar  try
845cc673e74SBram Moolenaar    # string slice returns a string, not a number
84668d130c6SBram Moolenaar    n = g:astring[3]
84756acb094SBram Moolenaar  catch /E1029:/
84868d130c6SBram Moolenaar    n = 77
84968d130c6SBram Moolenaar  endtry
85068d130c6SBram Moolenaar  assert_equal(77, n)
85168d130c6SBram Moolenaar
85268d130c6SBram Moolenaar  try
85368d130c6SBram Moolenaar    n = l[g:astring]
85456acb094SBram Moolenaar  catch /E1029:/
85556acb094SBram Moolenaar    n = 88
85668d130c6SBram Moolenaar  endtry
85756acb094SBram Moolenaar  assert_equal(88, n)
85868d130c6SBram Moolenaar
85968d130c6SBram Moolenaar  try
86068d130c6SBram Moolenaar    n = s:does_not_exist
86168d130c6SBram Moolenaar  catch /E121:/
862f0b9f43cSBram Moolenaar    n = 111
863f0b9f43cSBram Moolenaar  endtry
864f0b9f43cSBram Moolenaar  assert_equal(111, n)
865f0b9f43cSBram Moolenaar
866f0b9f43cSBram Moolenaar  try
867f0b9f43cSBram Moolenaar    n = g:does_not_exist
868f0b9f43cSBram Moolenaar  catch /E121:/
86968d130c6SBram Moolenaar    n = 121
87068d130c6SBram Moolenaar  endtry
87168d130c6SBram Moolenaar  assert_equal(121, n)
87268d130c6SBram Moolenaar
87368d130c6SBram Moolenaar  let d = #{one: 1}
87468d130c6SBram Moolenaar  try
87568d130c6SBram Moolenaar    n = d[g:astring]
87668d130c6SBram Moolenaar  catch /E716:/
87768d130c6SBram Moolenaar    n = 222
87868d130c6SBram Moolenaar  endtry
87968d130c6SBram Moolenaar  assert_equal(222, n)
880f0b9f43cSBram Moolenaar
881f0b9f43cSBram Moolenaar  try
882f0b9f43cSBram Moolenaar    n = -g:astring
883f0b9f43cSBram Moolenaar  catch /E39:/
884f0b9f43cSBram Moolenaar    n = 233
885f0b9f43cSBram Moolenaar  endtry
886f0b9f43cSBram Moolenaar  assert_equal(233, n)
887f0b9f43cSBram Moolenaar
888f0b9f43cSBram Moolenaar  try
889f0b9f43cSBram Moolenaar    n = +g:astring
890f0b9f43cSBram Moolenaar  catch /E1030:/
891f0b9f43cSBram Moolenaar    n = 244
892f0b9f43cSBram Moolenaar  endtry
893f0b9f43cSBram Moolenaar  assert_equal(244, n)
894f0b9f43cSBram Moolenaar
895f0b9f43cSBram Moolenaar  try
896f0b9f43cSBram Moolenaar    n = +g:alist
897f0b9f43cSBram Moolenaar  catch /E745:/
898f0b9f43cSBram Moolenaar    n = 255
899f0b9f43cSBram Moolenaar  endtry
900f0b9f43cSBram Moolenaar  assert_equal(255, n)
901f0b9f43cSBram Moolenaar
902f0b9f43cSBram Moolenaar  let nd: dict<any>
903f0b9f43cSBram Moolenaar  try
904f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
905f0b9f43cSBram Moolenaar  catch /E1029:/
906f0b9f43cSBram Moolenaar    n = 266
907f0b9f43cSBram Moolenaar  endtry
908f0b9f43cSBram Moolenaar  assert_equal(266, n)
909f0b9f43cSBram Moolenaar
910f0b9f43cSBram Moolenaar  try
911f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
912f0b9f43cSBram Moolenaar  catch /E1093:/
913f0b9f43cSBram Moolenaar    n = 277
914f0b9f43cSBram Moolenaar  endtry
915f0b9f43cSBram Moolenaar  assert_equal(277, n)
916f0b9f43cSBram Moolenaar
917e859312eSBram Moolenaar  try
918e859312eSBram Moolenaar    &ts = g:astring
919e859312eSBram Moolenaar  catch /E1029:/
920e859312eSBram Moolenaar    n = 288
921e859312eSBram Moolenaar  endtry
922e859312eSBram Moolenaar  assert_equal(288, n)
923e859312eSBram Moolenaar
924e859312eSBram Moolenaar  try
925e859312eSBram Moolenaar    &backspace = 'asdf'
926e859312eSBram Moolenaar  catch /E474:/
927e859312eSBram Moolenaar    n = 299
928e859312eSBram Moolenaar  endtry
929e859312eSBram Moolenaar  assert_equal(299, n)
930e859312eSBram Moolenaar
931e859312eSBram Moolenaar  l = [1]
932e859312eSBram Moolenaar  try
933e859312eSBram Moolenaar    l[3] = 3
934e859312eSBram Moolenaar  catch /E684:/
935e859312eSBram Moolenaar    n = 300
936e859312eSBram Moolenaar  endtry
937e859312eSBram Moolenaar  assert_equal(300, n)
938e859312eSBram Moolenaar
939e859312eSBram Moolenaar  try
940e859312eSBram Moolenaar    unlet g:does_not_exist
941e859312eSBram Moolenaar  catch /E108:/
942e859312eSBram Moolenaar    n = 322
943e859312eSBram Moolenaar  endtry
944e859312eSBram Moolenaar  assert_equal(322, n)
945e859312eSBram Moolenaar
946e859312eSBram Moolenaar  try
947e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
948e859312eSBram Moolenaar  catch /E721:/
949e859312eSBram Moolenaar    n = 333
950e859312eSBram Moolenaar  endtry
951e859312eSBram Moolenaar  assert_equal(333, n)
952e859312eSBram Moolenaar
953e859312eSBram Moolenaar  try
954e859312eSBram Moolenaar    l = DeletedFunc()
955e859312eSBram Moolenaar  catch /E933:/
956e859312eSBram Moolenaar    n = 344
957e859312eSBram Moolenaar  endtry
958e859312eSBram Moolenaar  assert_equal(344, n)
959d032f34aSBram Moolenaar
960d032f34aSBram Moolenaar  try
961d032f34aSBram Moolenaar    echo len(v:true)
962d032f34aSBram Moolenaar  catch /E701:/
963d032f34aSBram Moolenaar    n = 355
964d032f34aSBram Moolenaar  endtry
965d032f34aSBram Moolenaar  assert_equal(355, n)
966d032f34aSBram Moolenaar
967d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
968d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
969d032f34aSBram Moolenaar  try
970d032f34aSBram Moolenaar    echo P()
971d032f34aSBram Moolenaar  catch /E117:/
972d032f34aSBram Moolenaar    n = 366
973d032f34aSBram Moolenaar  endtry
974d032f34aSBram Moolenaar  assert_equal(366, n)
975d032f34aSBram Moolenaar
976d032f34aSBram Moolenaar  try
977d032f34aSBram Moolenaar    echo g:NoSuchFunc()
978d032f34aSBram Moolenaar  catch /E117:/
979d032f34aSBram Moolenaar    n = 377
980d032f34aSBram Moolenaar  endtry
981d032f34aSBram Moolenaar  assert_equal(377, n)
982d032f34aSBram Moolenaar
983d032f34aSBram Moolenaar  try
984d032f34aSBram Moolenaar    echo g:alist + 4
985d032f34aSBram Moolenaar  catch /E745:/
986d032f34aSBram Moolenaar    n = 388
987d032f34aSBram Moolenaar  endtry
988d032f34aSBram Moolenaar  assert_equal(388, n)
989d032f34aSBram Moolenaar
990d032f34aSBram Moolenaar  try
991d032f34aSBram Moolenaar    echo 4 + g:alist
992d032f34aSBram Moolenaar  catch /E745:/
993d032f34aSBram Moolenaar    n = 399
994d032f34aSBram Moolenaar  endtry
995d032f34aSBram Moolenaar  assert_equal(399, n)
996d032f34aSBram Moolenaar
997d032f34aSBram Moolenaar  try
998d032f34aSBram Moolenaar    echo g:alist.member
999d032f34aSBram Moolenaar  catch /E715:/
1000d032f34aSBram Moolenaar    n = 400
1001d032f34aSBram Moolenaar  endtry
1002d032f34aSBram Moolenaar  assert_equal(400, n)
1003d032f34aSBram Moolenaar
1004d032f34aSBram Moolenaar  try
1005d032f34aSBram Moolenaar    echo d.member
1006d032f34aSBram Moolenaar  catch /E716:/
1007d032f34aSBram Moolenaar    n = 411
1008d032f34aSBram Moolenaar  endtry
1009d032f34aSBram Moolenaar  assert_equal(411, n)
10108a7d6542SBram Moolenaarenddef
10118a7d6542SBram Moolenaar
1012e859312eSBram Moolenaardef DeletedFunc(): list<any>
1013e859312eSBram Moolenaar  return ['delete me']
1014e859312eSBram Moolenaarenddef
1015e859312eSBram Moolenaardefcompile
1016e859312eSBram Moolenaardelfunc DeletedFunc
1017e859312eSBram Moolenaar
1018257cc5eeSBram Moolenaardef ThrowFromDef()
1019a72cfb80SBram Moolenaar  throw "getout" # comment
1020257cc5eeSBram Moolenaarenddef
1021257cc5eeSBram Moolenaar
1022257cc5eeSBram Moolenaarfunc CatchInFunc()
1023257cc5eeSBram Moolenaar  try
1024257cc5eeSBram Moolenaar    call ThrowFromDef()
1025257cc5eeSBram Moolenaar  catch
1026257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1027257cc5eeSBram Moolenaar  endtry
1028257cc5eeSBram Moolenaarendfunc
1029257cc5eeSBram Moolenaar
1030257cc5eeSBram Moolenaardef CatchInDef()
1031257cc5eeSBram Moolenaar  try
1032257cc5eeSBram Moolenaar    ThrowFromDef()
1033257cc5eeSBram Moolenaar  catch
1034257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1035257cc5eeSBram Moolenaar  endtry
1036257cc5eeSBram Moolenaarenddef
1037257cc5eeSBram Moolenaar
1038f575adffSBram Moolenaardef ReturnFinally(): string
1039f575adffSBram Moolenaar  try
1040f575adffSBram Moolenaar    return 'intry'
1041f575adffSBram Moolenaar  finally
1042f575adffSBram Moolenaar    g:in_finally = 'finally'
1043f575adffSBram Moolenaar  endtry
1044f575adffSBram Moolenaar  return 'end'
1045f575adffSBram Moolenaarenddef
1046f575adffSBram Moolenaar
1047257cc5eeSBram Moolenaardef Test_try_catch_nested()
1048257cc5eeSBram Moolenaar  CatchInFunc()
1049257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1050257cc5eeSBram Moolenaar
1051257cc5eeSBram Moolenaar  CatchInDef()
1052257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1053f575adffSBram Moolenaar
1054f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1055f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1056f575adffSBram Moolenaarenddef
1057f575adffSBram Moolenaar
1058f575adffSBram Moolenaardef Test_try_catch_match()
1059f575adffSBram Moolenaar  let seq = 'a'
1060f575adffSBram Moolenaar  try
1061f575adffSBram Moolenaar    throw 'something'
1062f575adffSBram Moolenaar  catch /nothing/
1063f575adffSBram Moolenaar    seq ..= 'x'
1064f575adffSBram Moolenaar  catch /some/
1065f575adffSBram Moolenaar    seq ..= 'b'
1066f575adffSBram Moolenaar  catch /asdf/
1067f575adffSBram Moolenaar    seq ..= 'x'
1068e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1069e8c4abbbSBram Moolenaar    seq ..= 'y'
1070f575adffSBram Moolenaar  finally
1071f575adffSBram Moolenaar    seq ..= 'c'
1072f575adffSBram Moolenaar  endtry
1073f575adffSBram Moolenaar  assert_equal('abc', seq)
1074257cc5eeSBram Moolenaarenddef
1075257cc5eeSBram Moolenaar
1076e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1077e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1078e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1079e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1080585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1081585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1082585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1083585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1084585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1085585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1086585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1087585fea7bSBram Moolenaar
1088a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1089585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1090e8c4abbbSBram Moolenaarenddef
1091e8c4abbbSBram Moolenaar
1092006ad48bSBram Moolenaardef Test_throw_vimscript()
1093f5be8cdbSBram Moolenaar  # only checks line continuation
1094006ad48bSBram Moolenaar  let lines =<< trim END
1095006ad48bSBram Moolenaar      vim9script
1096006ad48bSBram Moolenaar      try
1097006ad48bSBram Moolenaar        throw 'one'
1098006ad48bSBram Moolenaar              .. 'two'
1099006ad48bSBram Moolenaar      catch
1100006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1101006ad48bSBram Moolenaar      endtry
1102006ad48bSBram Moolenaar  END
1103006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1104006ad48bSBram Moolenaarenddef
1105006ad48bSBram Moolenaar
1106ed677f55SBram Moolenaardef Test_error_in_nested_function()
1107ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1108ed677f55SBram Moolenaar  let lines =<< trim END
1109ed677f55SBram Moolenaar      vim9script
1110ed677f55SBram Moolenaar      def Func()
1111ed677f55SBram Moolenaar        Error()
1112ed677f55SBram Moolenaar        g:test_var = 1
1113ed677f55SBram Moolenaar      enddef
1114ed677f55SBram Moolenaar      func Error() abort
1115ed677f55SBram Moolenaar        eval [][0]
1116ed677f55SBram Moolenaar      endfunc
1117ed677f55SBram Moolenaar      Func()
1118ed677f55SBram Moolenaar  END
1119ed677f55SBram Moolenaar  g:test_var = 0
1120ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1121ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1122ed677f55SBram Moolenaarenddef
1123ed677f55SBram Moolenaar
112437c83711SBram Moolenaardef Test_cexpr_vimscript()
1125f5be8cdbSBram Moolenaar  # only checks line continuation
112637c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
112737c83711SBram Moolenaar  let lines =<< trim END
112837c83711SBram Moolenaar      vim9script
112937c83711SBram Moolenaar      cexpr 'File'
113037c83711SBram Moolenaar                .. ' someFile' ..
113137c83711SBram Moolenaar                   ' line 19'
113237c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
113337c83711SBram Moolenaar  END
113437c83711SBram Moolenaar  CheckScriptSuccess(lines)
113537c83711SBram Moolenaar  set errorformat&
113637c83711SBram Moolenaarenddef
113737c83711SBram Moolenaar
1138c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1139c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1140c9edd6b5SBram Moolenaar  let lines =<< trim END
1141c9edd6b5SBram Moolenaar      vim9script
1142c9edd6b5SBram Moolenaar      func g:Status()
1143c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1144c9edd6b5SBram Moolenaar      endfunc
1145c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1146c9edd6b5SBram Moolenaar      redrawstatus
1147c9edd6b5SBram Moolenaar      set laststatus statusline=
1148c9edd6b5SBram Moolenaar  END
1149c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1150c9edd6b5SBram Moolenaarenddef
1151c9edd6b5SBram Moolenaar
1152b209750bSBram Moolenaardef Test_list_vimscript()
1153b209750bSBram Moolenaar  # checks line continuation and comments
1154b209750bSBram Moolenaar  let lines =<< trim END
1155b209750bSBram Moolenaar      vim9script
1156b209750bSBram Moolenaar      let mylist = [
1157b209750bSBram Moolenaar            'one',
1158b209750bSBram Moolenaar            # comment
1159b209750bSBram Moolenaar            'two', # empty line follows
1160b209750bSBram Moolenaar
1161b209750bSBram Moolenaar            'three',
1162b209750bSBram Moolenaar            ]
1163b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1164b209750bSBram Moolenaar  END
1165b209750bSBram Moolenaar  CheckScriptSuccess(lines)
116666250c93SBram Moolenaar
116766250c93SBram Moolenaar  # check all lines from heredoc are kept
116866250c93SBram Moolenaar  lines =<< trim END
116966250c93SBram Moolenaar      # comment 1
117066250c93SBram Moolenaar      two
117166250c93SBram Moolenaar      # comment 3
117266250c93SBram Moolenaar
117366250c93SBram Moolenaar      five
117466250c93SBram Moolenaar      # comment 6
117566250c93SBram Moolenaar  END
117666250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1177b209750bSBram Moolenaarenddef
1178b209750bSBram Moolenaar
11792a1381c3SBram Moolenaarif has('channel')
118040ee466cSBram Moolenaar  let someJob = test_null_job()
118140ee466cSBram Moolenaar
118240ee466cSBram Moolenaar  def FuncWithError()
118340ee466cSBram Moolenaar    echomsg g:someJob
118440ee466cSBram Moolenaar  enddef
118540ee466cSBram Moolenaar
118640ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
118740ee466cSBram Moolenaar    try
118840ee466cSBram Moolenaar      call FuncWithError()
118940ee466cSBram Moolenaar    catch
119040ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
119140ee466cSBram Moolenaar    endtry
119240ee466cSBram Moolenaar  endfunc
11932a1381c3SBram Moolenaarendif
119440ee466cSBram Moolenaar
11958a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11968a7d6542SBram Moolenaar  vim9script
11978a7d6542SBram Moolenaar  let name: string = 'bob'
11988a7d6542SBram Moolenaar  def Concat(arg: string): string
11998a7d6542SBram Moolenaar    return name .. arg
12008a7d6542SBram Moolenaar  enddef
1201227a69deSBram Moolenaar  g:result = Concat('bie')
1202227a69deSBram Moolenaar  g:localname = name
12038a7d6542SBram Moolenaar
12048a7d6542SBram Moolenaar  export const CONST = 1234
12058a7d6542SBram Moolenaar  export let exported = 9876
12066e587dcbSBram Moolenaar  export let exp_name = 'John'
12078a7d6542SBram Moolenaar  export def Exported(): string
12088a7d6542SBram Moolenaar    return 'Exported'
12098a7d6542SBram Moolenaar  enddef
12108a7d6542SBram MoolenaarEND
12118a7d6542SBram Moolenaar
1212b3ca9824SBram Moolenaardef Undo_export_script_lines()
1213b3ca9824SBram Moolenaar  unlet g:result
1214b3ca9824SBram Moolenaar  unlet g:localname
1215b3ca9824SBram Moolenaarenddef
1216b3ca9824SBram Moolenaar
12175269bd2aSBram Moolenaardef Test_vim9_import_export()
12188a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12198a7d6542SBram Moolenaar    vim9script
12208a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12218a7d6542SBram Moolenaar    g:imported = exported
12226e587dcbSBram Moolenaar    exported += 3
12236e587dcbSBram Moolenaar    g:imported_added = exported
12248a7d6542SBram Moolenaar    g:imported_func = Exported()
12256e587dcbSBram Moolenaar
122640f4f7a4SBram Moolenaar    def GetExported(): string
122740f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
122840f4f7a4SBram Moolenaar      return local_dict.ref()
122940f4f7a4SBram Moolenaar    enddef
123040f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
123140f4f7a4SBram Moolenaar
12326e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12336e587dcbSBram Moolenaar    g:imported_name = exp_name
12346e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12356e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12365381c7a1SBram Moolenaar    g:imported_later = exported
12378a7d6542SBram Moolenaar  END
12388a7d6542SBram Moolenaar
12398a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12408a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12418a7d6542SBram Moolenaar
12428a7d6542SBram Moolenaar  source Ximport.vim
12438a7d6542SBram Moolenaar
12448a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12458a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12468a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12476e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12485381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12498a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
125040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12516e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12526e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12538a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12548a7d6542SBram Moolenaar
1255b3ca9824SBram Moolenaar  Undo_export_script_lines()
12568a7d6542SBram Moolenaar  unlet g:imported
12576e587dcbSBram Moolenaar  unlet g:imported_added
12585381c7a1SBram Moolenaar  unlet g:imported_later
12598a7d6542SBram Moolenaar  unlet g:imported_func
12606e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12618a7d6542SBram Moolenaar  delete('Ximport.vim')
1262f2d5c240SBram Moolenaar
12631c991144SBram Moolenaar  # similar, with line breaks
12641c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12651c991144SBram Moolenaar    vim9script
12661c991144SBram Moolenaar    import {
12671c991144SBram Moolenaar        exported,
12681c991144SBram Moolenaar        Exported,
12691c991144SBram Moolenaar        }
12701c991144SBram Moolenaar        from
12711c991144SBram Moolenaar        './Xexport.vim'
12721c991144SBram Moolenaar    g:imported = exported
12731c991144SBram Moolenaar    exported += 5
12741c991144SBram Moolenaar    g:imported_added = exported
12751c991144SBram Moolenaar    g:imported_func = Exported()
12761c991144SBram Moolenaar  END
12771c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12781c991144SBram Moolenaar  source Ximport_lbr.vim
12791c991144SBram Moolenaar
12801c991144SBram Moolenaar  assert_equal(9876, g:imported)
12811c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12821c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12831c991144SBram Moolenaar
12841c991144SBram Moolenaar  # exported script not sourced again
12851c991144SBram Moolenaar  assert_false(exists('g:result'))
12861c991144SBram Moolenaar  unlet g:imported
12871c991144SBram Moolenaar  unlet g:imported_added
12881c991144SBram Moolenaar  unlet g:imported_func
12891c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12901c991144SBram Moolenaar
12911c991144SBram Moolenaar  # import inside :def function
12925381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
12935381c7a1SBram Moolenaar    vim9script
12945381c7a1SBram Moolenaar    def ImportInDef()
12955381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12965381c7a1SBram Moolenaar      g:imported = exported
12975381c7a1SBram Moolenaar      exported += 7
12985381c7a1SBram Moolenaar      g:imported_added = exported
12995381c7a1SBram Moolenaar    enddef
13005381c7a1SBram Moolenaar    ImportInDef()
13015381c7a1SBram Moolenaar  END
13025381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
13035381c7a1SBram Moolenaar  source Ximport2.vim
1304f5be8cdbSBram Moolenaar  # TODO: this should be 9879
13055381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
13065381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
13075381c7a1SBram Moolenaar  unlet g:imported
13085381c7a1SBram Moolenaar  unlet g:imported_added
13095381c7a1SBram Moolenaar  delete('Ximport2.vim')
13105381c7a1SBram Moolenaar
1311f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1312f2d5c240SBram Moolenaar    vim9script
1313f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1314f2d5c240SBram Moolenaar    def UseExport()
1315f2d5c240SBram Moolenaar      g:imported = Export.exported
1316f2d5c240SBram Moolenaar    enddef
1317f2d5c240SBram Moolenaar    UseExport()
1318f2d5c240SBram Moolenaar  END
1319f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1320f2d5c240SBram Moolenaar  source Ximport.vim
13215381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1322f2d5c240SBram Moolenaar
1323599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1324599c89c8SBram Moolenaar    vim9script
1325599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1326599c89c8SBram Moolenaar    def Func()
1327599c89c8SBram Moolenaar      let dummy = 1
1328599c89c8SBram Moolenaar      let imported = Export + dummy
1329599c89c8SBram Moolenaar    enddef
1330822ba247SBram Moolenaar    defcompile
1331599c89c8SBram Moolenaar  END
1332599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1333599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1334599c89c8SBram Moolenaar
1335599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1336599c89c8SBram Moolenaar    vim9script
1337599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1338599c89c8SBram Moolenaar    def Func()
1339599c89c8SBram Moolenaar      let imported = Export . exported
1340599c89c8SBram Moolenaar    enddef
1341822ba247SBram Moolenaar    defcompile
1342599c89c8SBram Moolenaar  END
1343599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1344599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1345599c89c8SBram Moolenaar
1346599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1347599c89c8SBram Moolenaar    vim9script
1348599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1349599c89c8SBram Moolenaar    def Func()
1350599c89c8SBram Moolenaar      let imported = Export.
1351599c89c8SBram Moolenaar    enddef
1352822ba247SBram Moolenaar    defcompile
1353599c89c8SBram Moolenaar  END
1354599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1355599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1356599c89c8SBram Moolenaar
13571c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13581c991144SBram Moolenaar    vim9script
13591c991144SBram Moolenaar    import *
13601c991144SBram Moolenaar        as Export
13611c991144SBram Moolenaar        from
13621c991144SBram Moolenaar        './Xexport.vim'
13631c991144SBram Moolenaar    def UseExport()
13641c991144SBram Moolenaar      g:imported = Export.exported
13651c991144SBram Moolenaar    enddef
13661c991144SBram Moolenaar    UseExport()
13671c991144SBram Moolenaar  END
13681c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13691c991144SBram Moolenaar  source Ximport.vim
13701c991144SBram Moolenaar  assert_equal(9883, g:imported)
13711c991144SBram Moolenaar
1372f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1373f2d5c240SBram Moolenaar    vim9script
1374f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1375f2d5c240SBram Moolenaar  END
1376f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1377f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1378f2d5c240SBram Moolenaar
1379f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1380fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1381fa29c8abSBram Moolenaar    vim9script
1382fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1383fa29c8abSBram Moolenaar  END
1384fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1385fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1386fa29c8abSBram Moolenaar
1387f5be8cdbSBram Moolenaar  # try to import something that is already defined
13885269bd2aSBram Moolenaar  let import_already_defined =<< trim END
13895269bd2aSBram Moolenaar    vim9script
13905269bd2aSBram Moolenaar    let exported = 'something'
13915269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13925269bd2aSBram Moolenaar  END
13935269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13945269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13955269bd2aSBram Moolenaar
1396f5be8cdbSBram Moolenaar  # try to import something that is already defined
13975269bd2aSBram Moolenaar  import_already_defined =<< trim END
13985269bd2aSBram Moolenaar    vim9script
13995269bd2aSBram Moolenaar    let exported = 'something'
14005269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
14015269bd2aSBram Moolenaar  END
14025269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14035269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14045269bd2aSBram Moolenaar
1405f5be8cdbSBram Moolenaar  # try to import something that is already defined
14065269bd2aSBram Moolenaar  import_already_defined =<< trim END
14075269bd2aSBram Moolenaar    vim9script
14085269bd2aSBram Moolenaar    let exported = 'something'
14095269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
14105269bd2aSBram Moolenaar  END
14115269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14125269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14135269bd2aSBram Moolenaar
1414f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1415fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1416fa29c8abSBram Moolenaar    vim9script
1417fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1418fa29c8abSBram Moolenaar  END
1419fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1420fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1421fa29c8abSBram Moolenaar
1422fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1423fa29c8abSBram Moolenaar    vim9script
1424fa29c8abSBram Moolenaar    import name './Xexport.vim'
1425fa29c8abSBram Moolenaar  END
1426fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1427fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1428fa29c8abSBram Moolenaar
1429fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1430fa29c8abSBram Moolenaar    vim9script
1431fa29c8abSBram Moolenaar    import name from Xexport.vim
1432fa29c8abSBram Moolenaar  END
1433fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1434fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1435fa29c8abSBram Moolenaar
1436fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1437fa29c8abSBram Moolenaar    vim9script
1438fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1439fa29c8abSBram Moolenaar  END
1440fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1441fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1442fa29c8abSBram Moolenaar
1443fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1444fa29c8abSBram Moolenaar    vim9script
1445fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1446fa29c8abSBram Moolenaar  END
14475269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
14485269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1449fa29c8abSBram Moolenaar
1450f2d5c240SBram Moolenaar  delete('Ximport.vim')
14515269bd2aSBram Moolenaar  delete('Ximport3.vim')
14528a7d6542SBram Moolenaar  delete('Xexport.vim')
14538a7d6542SBram Moolenaar
1454f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1455750802b5SBram Moolenaar  set cpo&vi
1456750802b5SBram Moolenaar  let cpo_before = &cpo
1457750802b5SBram Moolenaar  let lines =<< trim END
1458750802b5SBram Moolenaar    vim9script
1459750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1460750802b5SBram Moolenaar  END
1461750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1462750802b5SBram Moolenaar  source Xvim9_script
1463750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1464750802b5SBram Moolenaar  set cpo&vim
1465750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1466750802b5SBram Moolenaar  delete('Xvim9_script')
1467750802b5SBram Moolenaarenddef
1468750802b5SBram Moolenaar
1469803af686SBram Moolenaarfunc g:Trigger()
1470803af686SBram Moolenaar  source Ximport.vim
1471803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1472803af686SBram Moolenaarendfunc
1473803af686SBram Moolenaar
1474803af686SBram Moolenaardef Test_import_export_expr_map()
1475803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1476803af686SBram Moolenaar  let export_lines =<< trim END
1477803af686SBram Moolenaar    vim9script
1478803af686SBram Moolenaar    export def That(): string
1479803af686SBram Moolenaar      return 'yes'
1480803af686SBram Moolenaar    enddef
1481803af686SBram Moolenaar  END
1482803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1483803af686SBram Moolenaar
1484803af686SBram Moolenaar  let import_lines =<< trim END
1485803af686SBram Moolenaar    vim9script
1486803af686SBram Moolenaar    import That from './Xexport_that.vim'
1487803af686SBram Moolenaar    assert_equal('yes', That())
1488803af686SBram Moolenaar  END
1489803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1490803af686SBram Moolenaar
1491803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1492803af686SBram Moolenaar  feedkeys('trigger', "xt")
1493803af686SBram Moolenaar
1494730b2483SBram Moolenaar  delete('Xexport_that.vim')
1495803af686SBram Moolenaar  delete('Ximport.vim')
1496803af686SBram Moolenaar  nunmap trigger
1497803af686SBram Moolenaarenddef
1498803af686SBram Moolenaar
14998e1986e3SBram Moolenaardef Test_import_in_filetype()
15008e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15018e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
15028e1986e3SBram Moolenaar  let export_lines =<< trim END
15038e1986e3SBram Moolenaar    vim9script
15048e1986e3SBram Moolenaar    export let That = 'yes'
15058e1986e3SBram Moolenaar  END
1506730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15078e1986e3SBram Moolenaar
15088e1986e3SBram Moolenaar  let import_lines =<< trim END
15098e1986e3SBram Moolenaar    vim9script
1510730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15118e1986e3SBram Moolenaar    assert_equal('yes', That)
15128e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15138e1986e3SBram Moolenaar  END
15148e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15158e1986e3SBram Moolenaar
15168e1986e3SBram Moolenaar  let save_rtp = &rtp
15178e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15188e1986e3SBram Moolenaar
15198e1986e3SBram Moolenaar  filetype plugin on
15208e1986e3SBram Moolenaar  copen
15218e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15228e1986e3SBram Moolenaar
15238e1986e3SBram Moolenaar  quit!
1524730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15258e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15268e1986e3SBram Moolenaar  &rtp = save_rtp
15278e1986e3SBram Moolenaarenddef
15288e1986e3SBram Moolenaar
1529efa94447SBram Moolenaardef Test_use_import_in_mapping()
1530efa94447SBram Moolenaar  let lines =<< trim END
1531efa94447SBram Moolenaar      vim9script
1532efa94447SBram Moolenaar      export def Funcx()
1533efa94447SBram Moolenaar        g:result = 42
1534efa94447SBram Moolenaar      enddef
1535efa94447SBram Moolenaar  END
1536efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1537efa94447SBram Moolenaar  lines =<< trim END
1538efa94447SBram Moolenaar      vim9script
1539efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1540b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1541efa94447SBram Moolenaar  END
1542efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1543efa94447SBram Moolenaar
1544efa94447SBram Moolenaar  source Xmapscript.vim
1545b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1546efa94447SBram Moolenaar  assert_equal(42, g:result)
1547efa94447SBram Moolenaar
1548efa94447SBram Moolenaar  unlet g:result
1549efa94447SBram Moolenaar  delete('XsomeExport.vim')
1550efa94447SBram Moolenaar  delete('Xmapscript.vim')
1551b3ca9824SBram Moolenaar  nunmap <F3>
1552efa94447SBram Moolenaarenddef
1553efa94447SBram Moolenaar
1554750802b5SBram Moolenaardef Test_vim9script_fails()
15558a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15568a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1557750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15589721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15599b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1560750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1561750802b5SBram Moolenaar
1562451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1563c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1564c785b9a7SBram Moolenaar
1565750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1566a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
15678a7d6542SBram Moolenaarenddef
15688a7d6542SBram Moolenaar
1569f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1570101f4810SBram Moolenaar  CheckRunVimInTerminal
1571101f4810SBram Moolenaar
15729bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1573c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15749bb3eb3eSBram Moolenaarendfunc
15759bb3eb3eSBram Moolenaar
1576c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1577101f4810SBram Moolenaar  let export =<< trim END
1578101f4810SBram Moolenaar    vim9script
1579101f4810SBram Moolenaar    export def Foo(): number
1580101f4810SBram Moolenaar        return 0
1581101f4810SBram Moolenaar    enddef
1582101f4810SBram Moolenaar  END
1583730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1584101f4810SBram Moolenaar
1585730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15869bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15879bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1588101f4810SBram Moolenaar
1589730b2483SBram Moolenaar  delete('XexportCmd.vim')
15909bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15919bb3eb3eSBram Moolenaarenddef
1592101f4810SBram Moolenaar
15934c17ad94SBram Moolenaardef Test_vim9script_reload_import()
15948a7d6542SBram Moolenaar  let lines =<< trim END
15958a7d6542SBram Moolenaar    vim9script
15968a7d6542SBram Moolenaar    const var = ''
15978a7d6542SBram Moolenaar    let valone = 1234
15988a7d6542SBram Moolenaar    def MyFunc(arg: string)
15998a7d6542SBram Moolenaar       valone = 5678
16008a7d6542SBram Moolenaar    enddef
16018a7d6542SBram Moolenaar  END
16028a7d6542SBram Moolenaar  let morelines =<< trim END
16038a7d6542SBram Moolenaar    let valtwo = 222
16048a7d6542SBram Moolenaar    export def GetValtwo(): number
16058a7d6542SBram Moolenaar      return valtwo
16068a7d6542SBram Moolenaar    enddef
16078a7d6542SBram Moolenaar  END
160803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16098a7d6542SBram Moolenaar  source Xreload.vim
16108a7d6542SBram Moolenaar  source Xreload.vim
16118a7d6542SBram Moolenaar  source Xreload.vim
16128a7d6542SBram Moolenaar
16138a7d6542SBram Moolenaar  let testlines =<< trim END
16148a7d6542SBram Moolenaar    vim9script
16158a7d6542SBram Moolenaar    def TheFunc()
16168a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16178a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16188a7d6542SBram Moolenaar    enddef
16198a7d6542SBram Moolenaar    TheFunc()
16208a7d6542SBram Moolenaar  END
16218a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16228a7d6542SBram Moolenaar  source Ximport.vim
16238a7d6542SBram Moolenaar
1624f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1625f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16268a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16278a7d6542SBram Moolenaar  source Ximport.vim
16288a7d6542SBram Moolenaar
1629f5be8cdbSBram Moolenaar  # cannot declare a var twice
16308a7d6542SBram Moolenaar  lines =<< trim END
16318a7d6542SBram Moolenaar    vim9script
16328a7d6542SBram Moolenaar    let valone = 1234
16338a7d6542SBram Moolenaar    let valone = 5678
16348a7d6542SBram Moolenaar  END
16358a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16368a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
16378a7d6542SBram Moolenaar
16388a7d6542SBram Moolenaar  delete('Xreload.vim')
16398a7d6542SBram Moolenaar  delete('Ximport.vim')
16408a7d6542SBram Moolenaarenddef
16418a7d6542SBram Moolenaar
1642fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1643fe465a01SBram Moolenaar" script-local name.
1644fe465a01SBram Moolenaardef Test_vim9script_funcref()
1645fe465a01SBram Moolenaar  let sortlines =<< trim END
1646fe465a01SBram Moolenaar      vim9script
1647fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1648bed36b93SBram Moolenaar        return i2 - i1
1649fe465a01SBram Moolenaar      enddef
1650fe465a01SBram Moolenaar
1651fe465a01SBram Moolenaar      export def FastSort(): list<number>
1652fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1653fe465a01SBram Moolenaar      enddef
1654fe465a01SBram Moolenaar  END
1655fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1656fe465a01SBram Moolenaar
1657fe465a01SBram Moolenaar  let lines =<< trim END
1658fe465a01SBram Moolenaar    vim9script
1659fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1660fe465a01SBram Moolenaar    def Test()
1661fe465a01SBram Moolenaar      g:result = FastSort()
1662fe465a01SBram Moolenaar    enddef
1663fe465a01SBram Moolenaar    Test()
1664fe465a01SBram Moolenaar  END
1665fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1666fe465a01SBram Moolenaar
1667fe465a01SBram Moolenaar  source Xscript.vim
1668fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1669fe465a01SBram Moolenaar
1670fe465a01SBram Moolenaar  unlet g:result
1671fe465a01SBram Moolenaar  delete('Xsort.vim')
1672fe465a01SBram Moolenaar  delete('Xscript.vim')
1673fe465a01SBram Moolenaarenddef
1674fe465a01SBram Moolenaar
1675c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1676c620c055SBram Moolenaar" script where FastFilter() is called from.
1677c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1678c620c055SBram Moolenaar  let filterLines =<< trim END
1679c620c055SBram Moolenaar    vim9script
1680c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1681c620c055SBram Moolenaar      return idx % 2 == 1
1682c620c055SBram Moolenaar    enddef
1683c620c055SBram Moolenaar    export def FastFilter(): list<number>
1684c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1685c620c055SBram Moolenaar    enddef
1686c620c055SBram Moolenaar  END
1687c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1688c620c055SBram Moolenaar
1689c620c055SBram Moolenaar  let lines =<< trim END
1690c620c055SBram Moolenaar    vim9script
1691c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1692c620c055SBram Moolenaar    def Test()
1693c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1694c620c055SBram Moolenaar    enddef
1695c620c055SBram Moolenaar    Test()
1696c620c055SBram Moolenaar  END
1697c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1698c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1699c620c055SBram Moolenaar
1700c620c055SBram Moolenaar  delete('Xfilter.vim')
1701c620c055SBram Moolenaar  delete('Ximport.vim')
1702c620c055SBram Moolenaarenddef
1703c620c055SBram Moolenaar
17044c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17054c17ad94SBram Moolenaar  let first_lines =<< trim END
17064c17ad94SBram Moolenaar    vim9script
17074c17ad94SBram Moolenaar    def FuncYes(): string
17084c17ad94SBram Moolenaar      return 'yes'
17094c17ad94SBram Moolenaar    enddef
17104c17ad94SBram Moolenaar  END
171103afdcf1SBram Moolenaar  let withno_lines =<< trim END
17124c17ad94SBram Moolenaar    def FuncNo(): string
17134c17ad94SBram Moolenaar      return 'no'
17144c17ad94SBram Moolenaar    enddef
17154c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17164c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17174c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
171803afdcf1SBram Moolenaar    enddef
171903afdcf1SBram Moolenaar  END
172003afdcf1SBram Moolenaar  let nono_lines =<< trim END
172103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
172203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
17234c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
17244c17ad94SBram Moolenaar    enddef
17254c17ad94SBram Moolenaar  END
17264c17ad94SBram Moolenaar
17274c17ad94SBram Moolenaar  # FuncNo() is defined
172803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17294c17ad94SBram Moolenaar  source Xreloaded.vim
17304c17ad94SBram Moolenaar  g:DoCheck(true)
17314c17ad94SBram Moolenaar
17324c17ad94SBram Moolenaar  # FuncNo() is not redefined
173303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17344c17ad94SBram Moolenaar  source Xreloaded.vim
173503afdcf1SBram Moolenaar  g:DoCheck()
17364c17ad94SBram Moolenaar
17374c17ad94SBram Moolenaar  # FuncNo() is back
173803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17394c17ad94SBram Moolenaar  source Xreloaded.vim
174003afdcf1SBram Moolenaar  g:DoCheck()
17414c17ad94SBram Moolenaar
17424c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17434c17ad94SBram Moolenaarenddef
17444c17ad94SBram Moolenaar
174589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
174689483d40SBram Moolenaar  # write the script with a script-local variable
174789483d40SBram Moolenaar  let lines =<< trim END
174889483d40SBram Moolenaar    vim9script
174989483d40SBram Moolenaar    let var = 'string'
175089483d40SBram Moolenaar  END
175189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
175289483d40SBram Moolenaar  source XreloadVar.vim
175389483d40SBram Moolenaar
175489483d40SBram Moolenaar  # now write the script using the same variable locally - works
175589483d40SBram Moolenaar  lines =<< trim END
175689483d40SBram Moolenaar    vim9script
175789483d40SBram Moolenaar    def Func()
175889483d40SBram Moolenaar      let var = 'string'
175989483d40SBram Moolenaar    enddef
176089483d40SBram Moolenaar  END
176189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
176289483d40SBram Moolenaar  source XreloadVar.vim
176389483d40SBram Moolenaar
176489483d40SBram Moolenaar  delete('XreloadVar.vim')
176589483d40SBram Moolenaarenddef
176689483d40SBram Moolenaar
17678a7d6542SBram Moolenaardef Test_import_absolute()
17688a7d6542SBram Moolenaar  let import_lines = [
1769e6085c53SBram Moolenaar        'vim9script',
1770e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1771e6085c53SBram Moolenaar        'def UseExported()',
1772e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1773e6085c53SBram Moolenaar        '  exported = 8888',
1774e6085c53SBram Moolenaar        '  g:imported_after = exported',
1775e6085c53SBram Moolenaar        'enddef',
1776e6085c53SBram Moolenaar        'UseExported()',
1777e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1778e6085c53SBram Moolenaar        ]
17798a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17808a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17818a7d6542SBram Moolenaar
17828a7d6542SBram Moolenaar  source Ximport_abs.vim
17838a7d6542SBram Moolenaar
17848a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17854e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1786675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1787675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1788675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1789675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1790675f716eSBram Moolenaar          'exported = 8888.*' ..
1791675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1792675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1793675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1794675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1795e6085c53SBram Moolenaar        g:import_disassembled)
1796b3ca9824SBram Moolenaar
1797b3ca9824SBram Moolenaar  Undo_export_script_lines()
17988a7d6542SBram Moolenaar  unlet g:imported_abs
17994e12a5dfSBram Moolenaar  unlet g:import_disassembled
18008a7d6542SBram Moolenaar
18018a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18028a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18038a7d6542SBram Moolenaarenddef
18048a7d6542SBram Moolenaar
18058a7d6542SBram Moolenaardef Test_import_rtp()
18068a7d6542SBram Moolenaar  let import_lines = [
1807e6085c53SBram Moolenaar        'vim9script',
1808e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1809e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1810e6085c53SBram Moolenaar        ]
18118a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18128a7d6542SBram Moolenaar  mkdir('import')
18138a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18148a7d6542SBram Moolenaar
18158a7d6542SBram Moolenaar  let save_rtp = &rtp
18168a7d6542SBram Moolenaar  &rtp = getcwd()
18178a7d6542SBram Moolenaar  source Ximport_rtp.vim
18188a7d6542SBram Moolenaar  &rtp = save_rtp
18198a7d6542SBram Moolenaar
18208a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18218a7d6542SBram Moolenaar
1822b3ca9824SBram Moolenaar  Undo_export_script_lines()
1823b3ca9824SBram Moolenaar  unlet g:imported_rtp
18248a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
182589483d40SBram Moolenaar  delete('import', 'rf')
18268a7d6542SBram Moolenaarenddef
18278a7d6542SBram Moolenaar
182825e0f586SBram Moolenaardef Test_import_compile_error()
182925e0f586SBram Moolenaar  let export_lines = [
183025e0f586SBram Moolenaar        'vim9script',
183125e0f586SBram Moolenaar        'export def ExpFunc(): string',
183225e0f586SBram Moolenaar        '  return notDefined',
183325e0f586SBram Moolenaar        'enddef',
183425e0f586SBram Moolenaar        ]
183525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
183625e0f586SBram Moolenaar
183725e0f586SBram Moolenaar  let import_lines = [
183825e0f586SBram Moolenaar        'vim9script',
183925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
184025e0f586SBram Moolenaar        'def ImpFunc()',
184125e0f586SBram Moolenaar        '  echo ExpFunc()',
184225e0f586SBram Moolenaar        'enddef',
184325e0f586SBram Moolenaar        'defcompile',
184425e0f586SBram Moolenaar        ]
184525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
184625e0f586SBram Moolenaar
184725e0f586SBram Moolenaar  try
184825e0f586SBram Moolenaar    source Ximport.vim
184925e0f586SBram Moolenaar  catch /E1001/
1850f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
185125e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
185225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
185325e0f586SBram Moolenaar  endtry
185425e0f586SBram Moolenaar
185525e0f586SBram Moolenaar  delete('Xexported.vim')
185625e0f586SBram Moolenaar  delete('Ximport.vim')
185725e0f586SBram Moolenaarenddef
185825e0f586SBram Moolenaar
1859c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1860c4ce36d4SBram Moolenaar  let lines = [
1861c4ce36d4SBram Moolenaar        'vim9script',
1862c4ce36d4SBram Moolenaar        'def Func()',
1863c4ce36d4SBram Moolenaar        '  eval [][0]',
1864c4ce36d4SBram Moolenaar        'enddef',
1865c4ce36d4SBram Moolenaar        'Func()',
1866c4ce36d4SBram Moolenaar        ]
1867c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1868c4ce36d4SBram Moolenaar
1869c4ce36d4SBram Moolenaar  for count in range(3)
1870c4ce36d4SBram Moolenaar    try
1871c4ce36d4SBram Moolenaar      source Xtestscript.vim
1872c4ce36d4SBram Moolenaar    catch /E684/
1873c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1874c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1875c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1876c4ce36d4SBram Moolenaar    endtry
1877c4ce36d4SBram Moolenaar  endfor
1878c4ce36d4SBram Moolenaar
1879c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1880c4ce36d4SBram Moolenaarenddef
1881c4ce36d4SBram Moolenaar
1882eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1883eef2102eSBram Moolenaar  let export_lines =<< trim END
1884eef2102eSBram Moolenaar      vim9script
1885eef2102eSBram Moolenaar      export def Func()
1886eef2102eSBram Moolenaar        echo 'imported'
1887eef2102eSBram Moolenaar      enddef
1888eef2102eSBram Moolenaar  END
1889eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1890eef2102eSBram Moolenaar
1891eef2102eSBram Moolenaar  let lines =<< trim END
1892eef2102eSBram Moolenaar    vim9script
1893eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1894eef2102eSBram Moolenaar    def Func()
1895eef2102eSBram Moolenaar      echo 'local to function'
1896eef2102eSBram Moolenaar    enddef
1897eef2102eSBram Moolenaar  END
1898eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1899eef2102eSBram Moolenaar
1900eef2102eSBram Moolenaar  lines =<< trim END
1901eef2102eSBram Moolenaar    vim9script
1902eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1903eef2102eSBram Moolenaar    def Outer()
1904eef2102eSBram Moolenaar      def Func()
1905eef2102eSBram Moolenaar        echo 'local to function'
1906eef2102eSBram Moolenaar      enddef
1907eef2102eSBram Moolenaar    enddef
1908eef2102eSBram Moolenaar    defcompile
1909eef2102eSBram Moolenaar  END
1910eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1911eef2102eSBram Moolenaar
1912eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1913eef2102eSBram Moolenaarenddef
1914eef2102eSBram Moolenaar
1915b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1916b9a2cac3SBram Moolenaar  let lines =<< trim END
1917b9a2cac3SBram Moolenaar    vim9script
1918b9a2cac3SBram Moolenaar    def Func()
1919b9a2cac3SBram Moolenaar      echo 'one'
1920b9a2cac3SBram Moolenaar    enddef
1921b9a2cac3SBram Moolenaar    def Func()
1922b9a2cac3SBram Moolenaar      echo 'two'
1923b9a2cac3SBram Moolenaar    enddef
1924b9a2cac3SBram Moolenaar  END
1925b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1926fa211f3cSBram Moolenaar
1927fa211f3cSBram Moolenaar  lines =<< trim END
1928fa211f3cSBram Moolenaar    vim9script
1929fa211f3cSBram Moolenaar    def Foo(): string
1930fa211f3cSBram Moolenaar      return 'foo'
1931fa211f3cSBram Moolenaar      enddef
1932fa211f3cSBram Moolenaar    def Func()
1933fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1934fa211f3cSBram Moolenaar    enddef
1935fa211f3cSBram Moolenaar    defcompile
1936fa211f3cSBram Moolenaar  END
1937fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1938b9a2cac3SBram Moolenaarenddef
1939b9a2cac3SBram Moolenaar
19408a7d6542SBram Moolenaardef Test_fixed_size_list()
1941f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19428a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19438a7d6542SBram Moolenaar  l->remove(0)
19448a7d6542SBram Moolenaar  l->add(5)
19458a7d6542SBram Moolenaar  l->insert(99, 1)
19460f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19478a7d6542SBram Moolenaarenddef
19488a7d6542SBram Moolenaar
1949ae616494SBram Moolenaardef Test_no_insert_xit()
1950ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1951ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1952f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1953f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1954f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1955ae616494SBram Moolenaar
1956ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1957ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1958ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1959ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1960f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1961f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1962f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1963f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1964f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1965ae616494SBram Moolenaarenddef
1966ae616494SBram Moolenaar
1967158906cfSBram Moolenaardef IfElse(what: number): string
1968158906cfSBram Moolenaar  let res = ''
1969158906cfSBram Moolenaar  if what == 1
1970158906cfSBram Moolenaar    res = "one"
1971158906cfSBram Moolenaar  elseif what == 2
1972158906cfSBram Moolenaar    res = "two"
1973a259d8d3SBram Moolenaar  else
1974158906cfSBram Moolenaar    res = "three"
1975a259d8d3SBram Moolenaar  endif
1976158906cfSBram Moolenaar  return res
1977a259d8d3SBram Moolenaarenddef
1978a259d8d3SBram Moolenaar
1979158906cfSBram Moolenaardef Test_if_elseif_else()
1980158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1981158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1982158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19830f18b6d1SBram Moolenaarenddef
19840f18b6d1SBram Moolenaar
1985e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1986e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1987e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1988e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1989e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1990585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1991e8c4abbbSBram Moolenaarenddef
1992e8c4abbbSBram Moolenaar
19936d69bf60SBram Moolenaarlet g:bool_true = v:true
19946d69bf60SBram Moolenaarlet g:bool_false = v:false
19956d69bf60SBram Moolenaar
19966d69bf60SBram Moolenaardef Test_if_const_expr()
19976d69bf60SBram Moolenaar  let res = false
19986d69bf60SBram Moolenaar  if true ? true : false
19996d69bf60SBram Moolenaar    res = true
20006d69bf60SBram Moolenaar  endif
20016d69bf60SBram Moolenaar  assert_equal(true, res)
20026d69bf60SBram Moolenaar
2003585fea7bSBram Moolenaar  g:glob = 2
2004585fea7bSBram Moolenaar  if false
20056797966dSBram Moolenaar    execute('g:glob = 3')
2006585fea7bSBram Moolenaar  endif
2007585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2008585fea7bSBram Moolenaar  if true
20096797966dSBram Moolenaar    execute('g:glob = 3')
2010585fea7bSBram Moolenaar  endif
2011585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2012585fea7bSBram Moolenaar
20136d69bf60SBram Moolenaar  res = false
20146d69bf60SBram Moolenaar  if g:bool_true ? true : false
20156d69bf60SBram Moolenaar    res = true
20166d69bf60SBram Moolenaar  endif
20176d69bf60SBram Moolenaar  assert_equal(true, res)
20186d69bf60SBram Moolenaar
20196d69bf60SBram Moolenaar  res = false
20206d69bf60SBram Moolenaar  if true ? g:bool_true : false
20216d69bf60SBram Moolenaar    res = true
20226d69bf60SBram Moolenaar  endif
20236d69bf60SBram Moolenaar  assert_equal(true, res)
20246d69bf60SBram Moolenaar
20256d69bf60SBram Moolenaar  res = false
20266d69bf60SBram Moolenaar  if true ? true : g:bool_false
20276d69bf60SBram Moolenaar    res = true
20286d69bf60SBram Moolenaar  endif
20296d69bf60SBram Moolenaar  assert_equal(true, res)
20306d69bf60SBram Moolenaar
20316d69bf60SBram Moolenaar  res = false
20326d69bf60SBram Moolenaar  if true ? false : true
20336d69bf60SBram Moolenaar    res = true
20346d69bf60SBram Moolenaar  endif
20356d69bf60SBram Moolenaar  assert_equal(false, res)
20366d69bf60SBram Moolenaar
20376d69bf60SBram Moolenaar  res = false
20386d69bf60SBram Moolenaar  if false ? false : true
20396d69bf60SBram Moolenaar    res = true
20406d69bf60SBram Moolenaar  endif
20416d69bf60SBram Moolenaar  assert_equal(true, res)
20426d69bf60SBram Moolenaar
20436d69bf60SBram Moolenaar  res = false
20446d69bf60SBram Moolenaar  if false ? true : false
20456d69bf60SBram Moolenaar    res = true
20466d69bf60SBram Moolenaar  endif
20476d69bf60SBram Moolenaar  assert_equal(false, res)
20486d69bf60SBram Moolenaar
20496d69bf60SBram Moolenaar  res = false
2050e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2051e8c4abbbSBram Moolenaar    res = true
2052e8c4abbbSBram Moolenaar  endif
2053e8c4abbbSBram Moolenaar  assert_equal(false, res)
2054e8c4abbbSBram Moolenaar
2055e8c4abbbSBram Moolenaar  res = false
20566d69bf60SBram Moolenaar  if true && true
20576d69bf60SBram Moolenaar    res = true
20586d69bf60SBram Moolenaar  endif
20596d69bf60SBram Moolenaar  assert_equal(true, res)
20606d69bf60SBram Moolenaar
20616d69bf60SBram Moolenaar  res = false
20626d69bf60SBram Moolenaar  if true && false
20636d69bf60SBram Moolenaar    res = true
20646d69bf60SBram Moolenaar  endif
20656d69bf60SBram Moolenaar  assert_equal(false, res)
20666d69bf60SBram Moolenaar
20676d69bf60SBram Moolenaar  res = false
20686d69bf60SBram Moolenaar  if g:bool_true && false
20696d69bf60SBram Moolenaar    res = true
20706d69bf60SBram Moolenaar  endif
20716d69bf60SBram Moolenaar  assert_equal(false, res)
20726d69bf60SBram Moolenaar
20736d69bf60SBram Moolenaar  res = false
20746d69bf60SBram Moolenaar  if true && g:bool_false
20756d69bf60SBram Moolenaar    res = true
20766d69bf60SBram Moolenaar  endif
20776d69bf60SBram Moolenaar  assert_equal(false, res)
20786d69bf60SBram Moolenaar
20796d69bf60SBram Moolenaar  res = false
20806d69bf60SBram Moolenaar  if false && false
20816d69bf60SBram Moolenaar    res = true
20826d69bf60SBram Moolenaar  endif
20836d69bf60SBram Moolenaar  assert_equal(false, res)
20846d69bf60SBram Moolenaar
20856d69bf60SBram Moolenaar  res = false
20866d69bf60SBram Moolenaar  if true || false
20876d69bf60SBram Moolenaar    res = true
20886d69bf60SBram Moolenaar  endif
20896d69bf60SBram Moolenaar  assert_equal(true, res)
20906d69bf60SBram Moolenaar
20916d69bf60SBram Moolenaar  res = false
20926d69bf60SBram Moolenaar  if g:bool_true || false
20936d69bf60SBram Moolenaar    res = true
20946d69bf60SBram Moolenaar  endif
20956d69bf60SBram Moolenaar  assert_equal(true, res)
20966d69bf60SBram Moolenaar
20976d69bf60SBram Moolenaar  res = false
20986d69bf60SBram Moolenaar  if true || g:bool_false
20996d69bf60SBram Moolenaar    res = true
21006d69bf60SBram Moolenaar  endif
21016d69bf60SBram Moolenaar  assert_equal(true, res)
21026d69bf60SBram Moolenaar
21036d69bf60SBram Moolenaar  res = false
21046d69bf60SBram Moolenaar  if false || false
21056d69bf60SBram Moolenaar    res = true
21066d69bf60SBram Moolenaar  endif
21076d69bf60SBram Moolenaar  assert_equal(false, res)
210880c34ca3SBram Moolenaarenddef
21096d69bf60SBram Moolenaar
211080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
211180c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
211280c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2113e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2114e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21156d69bf60SBram Moolenaarenddef
21166d69bf60SBram Moolenaar
211772abcf42SBram Moolenaardef RunNested(i: number): number
211872abcf42SBram Moolenaar  let x: number = 0
211972abcf42SBram Moolenaar  if i % 2
212072abcf42SBram Moolenaar    if 1
2121f5be8cdbSBram Moolenaar      # comment
212272abcf42SBram Moolenaar    else
2123f5be8cdbSBram Moolenaar      # comment
212472abcf42SBram Moolenaar    endif
212572abcf42SBram Moolenaar    x += 1
212672abcf42SBram Moolenaar  else
212772abcf42SBram Moolenaar    x += 1000
212872abcf42SBram Moolenaar  endif
212972abcf42SBram Moolenaar  return x
213072abcf42SBram Moolenaarenddef
213172abcf42SBram Moolenaar
213272abcf42SBram Moolenaardef Test_nested_if()
213372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
213472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
213572abcf42SBram Moolenaarenddef
213672abcf42SBram Moolenaar
2137ad39c094SBram Moolenaardef Test_execute_cmd()
2138ad39c094SBram Moolenaar  new
2139ad39c094SBram Moolenaar  setline(1, 'default')
2140ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2141ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2142a72cfb80SBram Moolenaar
2143a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2144a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2145a72cfb80SBram Moolenaar
2146ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2147ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2148a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2149ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2150a72cfb80SBram Moolenaar
2151ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2152ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2153a72cfb80SBram Moolenaar
2154ad39c094SBram Moolenaar  let cmd_first = 'call '
2155ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2156ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2157ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2158ad39c094SBram Moolenaar  bwipe!
2159585fea7bSBram Moolenaar
21602d6b20d6SBram Moolenaar  let n = true
21612d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21622d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21632d6b20d6SBram Moolenaar
2164e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2165e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2166e5abf7afSBram Moolenaar
2167430deb19SBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:', 1)
2168430deb19SBram Moolenaar  call CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2169430deb19SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2170ad39c094SBram Moolenaarenddef
2171ad39c094SBram Moolenaar
217247e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2173f5be8cdbSBram Moolenaar  # only checks line continuation
217447e880d6SBram Moolenaar  let lines =<< trim END
217547e880d6SBram Moolenaar      vim9script
217647e880d6SBram Moolenaar      execute 'g:someVar'
217747e880d6SBram Moolenaar                .. ' = ' ..
217847e880d6SBram Moolenaar                   '28'
217947e880d6SBram Moolenaar      assert_equal(28, g:someVar)
218047e880d6SBram Moolenaar      unlet g:someVar
218147e880d6SBram Moolenaar  END
218247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
218347e880d6SBram Moolenaarenddef
218447e880d6SBram Moolenaar
2185ad39c094SBram Moolenaardef Test_echo_cmd()
2186a72cfb80SBram Moolenaar  echo 'some' # comment
2187585fea7bSBram Moolenaar  echon 'thing'
2188ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2189ad39c094SBram Moolenaar
2190a72cfb80SBram Moolenaar  echo "some" # comment
2191a72cfb80SBram Moolenaar  echon "thing"
2192a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2193a72cfb80SBram Moolenaar
2194ad39c094SBram Moolenaar  let str1 = 'some'
2195ad39c094SBram Moolenaar  let str2 = 'more'
2196ad39c094SBram Moolenaar  echo str1 str2
2197ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2198a72cfb80SBram Moolenaar
2199a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2200ad39c094SBram Moolenaarenddef
2201ad39c094SBram Moolenaar
2202f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2203f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2204f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2205f93c7feaSBram Moolenaar  echo 'clear'
2206df069eecSBram Moolenaar  :1messages
2207f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2208f93c7feaSBram Moolenaar
2209f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2210f93c7feaSBram Moolenaarenddef
2211f93c7feaSBram Moolenaar
221247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2213f5be8cdbSBram Moolenaar  # only checks line continuation
221447e880d6SBram Moolenaar  let lines =<< trim END
221547e880d6SBram Moolenaar      vim9script
221647e880d6SBram Moolenaar      echomsg 'here'
221747e880d6SBram Moolenaar                .. ' is ' ..
221847e880d6SBram Moolenaar                   'a message'
221947e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
222047e880d6SBram Moolenaar  END
222147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
222247e880d6SBram Moolenaarenddef
222347e880d6SBram Moolenaar
2224f93c7feaSBram Moolenaardef Test_echoerr_cmd()
222540ee466cSBram Moolenaar  try
222640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
222740ee466cSBram Moolenaar  catch
222840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
222940ee466cSBram Moolenaar  endtry
2230f93c7feaSBram Moolenaarenddef
2231f93c7feaSBram Moolenaar
223247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2233f5be8cdbSBram Moolenaar  # only checks line continuation
223447e880d6SBram Moolenaar  let lines =<< trim END
223547e880d6SBram Moolenaar      vim9script
223647e880d6SBram Moolenaar      try
223747e880d6SBram Moolenaar        echoerr 'this'
223847e880d6SBram Moolenaar                .. ' is ' ..
223947e880d6SBram Moolenaar                   'wrong'
224047e880d6SBram Moolenaar      catch
224147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
224247e880d6SBram Moolenaar      endtry
224347e880d6SBram Moolenaar  END
224447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
224547e880d6SBram Moolenaarenddef
224647e880d6SBram Moolenaar
224741fe0617SBram Moolenaardef Test_for_outside_of_function()
224841fe0617SBram Moolenaar  let lines =<< trim END
224941fe0617SBram Moolenaar    vim9script
225041fe0617SBram Moolenaar    new
225141fe0617SBram Moolenaar    for var in range(0, 3)
225241fe0617SBram Moolenaar      append(line('$'), var)
225341fe0617SBram Moolenaar    endfor
225441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
225541fe0617SBram Moolenaar    bwipe!
225641fe0617SBram Moolenaar  END
225741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
225841fe0617SBram Moolenaar  source Xvim9for.vim
225941fe0617SBram Moolenaar  delete('Xvim9for.vim')
226041fe0617SBram Moolenaarenddef
22618a7d6542SBram Moolenaar
2262e8c4abbbSBram Moolenaardef Test_for_loop()
2263e8c4abbbSBram Moolenaar  let result = ''
2264e8c4abbbSBram Moolenaar  for cnt in range(7)
2265e8c4abbbSBram Moolenaar    if cnt == 4
2266e8c4abbbSBram Moolenaar      break
2267e8c4abbbSBram Moolenaar    endif
2268e8c4abbbSBram Moolenaar    if cnt == 2
2269e8c4abbbSBram Moolenaar      continue
2270e8c4abbbSBram Moolenaar    endif
2271e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2272e8c4abbbSBram Moolenaar  endfor
2273e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22740ad3e894SBram Moolenaar
22750ad3e894SBram Moolenaar  let concat = ''
22760ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22770ad3e894SBram Moolenaar    concat ..= str
22780ad3e894SBram Moolenaar  endfor
22790ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2280e8c4abbbSBram Moolenaarenddef
2281e8c4abbbSBram Moolenaar
2282e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2283675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2284675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2285451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2286822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2287451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2288675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2289675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2290675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2291e8c4abbbSBram Moolenaarenddef
2292e8c4abbbSBram Moolenaar
2293d0df1aacSBram Moolenaardef Test_while_loop()
2294d0df1aacSBram Moolenaar  let result = ''
2295d0df1aacSBram Moolenaar  let cnt = 0
2296d0df1aacSBram Moolenaar  while cnt < 555
2297d0df1aacSBram Moolenaar    if cnt == 3
2298d0df1aacSBram Moolenaar      break
2299d0df1aacSBram Moolenaar    endif
2300d0df1aacSBram Moolenaar    cnt += 1
2301d0df1aacSBram Moolenaar    if cnt == 2
2302d0df1aacSBram Moolenaar      continue
2303d0df1aacSBram Moolenaar    endif
2304d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2305d0df1aacSBram Moolenaar  endwhile
2306d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2307d0df1aacSBram Moolenaarenddef
2308d0df1aacSBram Moolenaar
2309e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2310675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2311675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2312675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2313675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2314675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2315675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2316675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2317bd5da371SBram Moolenaarenddef
2318bd5da371SBram Moolenaar
23199645e2d9SBram Moolenaardef Test_interrupt_loop()
232097acfc78SBram Moolenaar  let caught = false
23219645e2d9SBram Moolenaar  let x = 0
232297acfc78SBram Moolenaar  try
23239645e2d9SBram Moolenaar    while 1
23249645e2d9SBram Moolenaar      x += 1
23259645e2d9SBram Moolenaar      if x == 100
23269645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23279645e2d9SBram Moolenaar      endif
23289645e2d9SBram Moolenaar    endwhile
232997acfc78SBram Moolenaar  catch
233097acfc78SBram Moolenaar    caught = true
233197acfc78SBram Moolenaar    assert_equal(100, x)
233297acfc78SBram Moolenaar  endtry
233397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
23349645e2d9SBram Moolenaarenddef
233520431c9dSBram Moolenaar
23364fdae999SBram Moolenaardef Test_automatic_line_continuation()
23374fdae999SBram Moolenaar  let mylist = [
23384fdae999SBram Moolenaar      'one',
23394fdae999SBram Moolenaar      'two',
23404fdae999SBram Moolenaar      'three',
2341f5be8cdbSBram Moolenaar      ] # comment
23424fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23434fdae999SBram Moolenaar
23444fdae999SBram Moolenaar  let mydict = {
23454fdae999SBram Moolenaar      'one': 1,
23464fdae999SBram Moolenaar      'two': 2,
23474fdae999SBram Moolenaar      'three':
23484fdae999SBram Moolenaar          3,
2349f5be8cdbSBram Moolenaar      } # comment
23504fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23514fdae999SBram Moolenaar  mydict = #{
23522c330432SBram Moolenaar      one: 1,  # comment
23532c330432SBram Moolenaar      two:     # comment
23542c330432SBram Moolenaar           2,  # comment
23552c330432SBram Moolenaar      three: 3 # comment
23562c330432SBram Moolenaar      }
23572c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23582c330432SBram Moolenaar  mydict = #{
23592c330432SBram Moolenaar      one: 1,
23604fdae999SBram Moolenaar      two:
23614fdae999SBram Moolenaar           2,
23622c330432SBram Moolenaar      three: 3
23634fdae999SBram Moolenaar      }
23644fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2365e6085c53SBram Moolenaar
2366e6085c53SBram Moolenaar  assert_equal(
2367e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2368e6085c53SBram Moolenaar        split('one two three')
2369e6085c53SBram Moolenaar        )
23704fdae999SBram Moolenaarenddef
23714fdae999SBram Moolenaar
23727a092245SBram Moolenaardef Test_vim9_comment()
23737a092245SBram Moolenaar  CheckScriptSuccess([
23747a092245SBram Moolenaar      'vim9script',
23757a092245SBram Moolenaar      '# something',
23767a092245SBram Moolenaar      ])
23777a092245SBram Moolenaar  CheckScriptFailure([
23787a092245SBram Moolenaar      'vim9script',
23797a092245SBram Moolenaar      ':# something',
23807a092245SBram Moolenaar      ], 'E488:')
23817a092245SBram Moolenaar  CheckScriptFailure([
23827a092245SBram Moolenaar      '# something',
23837a092245SBram Moolenaar      ], 'E488:')
23847a092245SBram Moolenaar  CheckScriptFailure([
23857a092245SBram Moolenaar      ':# something',
23867a092245SBram Moolenaar      ], 'E488:')
23877a092245SBram Moolenaar
23884a8d9f2eSBram Moolenaar  { # block start
23894a8d9f2eSBram Moolenaar  } # block end
23904a8d9f2eSBram Moolenaar  CheckDefFailure([
23914a8d9f2eSBram Moolenaar      '{# comment',
23924a8d9f2eSBram Moolenaar      ], 'E488:')
23934a8d9f2eSBram Moolenaar  CheckDefFailure([
23944a8d9f2eSBram Moolenaar      '{',
23954a8d9f2eSBram Moolenaar      '}# comment',
23964a8d9f2eSBram Moolenaar      ], 'E488:')
23974a8d9f2eSBram Moolenaar
23984a8d9f2eSBram Moolenaar  echo "yes" # comment
23994a8d9f2eSBram Moolenaar  CheckDefFailure([
24004a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24014a8d9f2eSBram Moolenaar      ], 'E488:')
24027a092245SBram Moolenaar  CheckScriptSuccess([
24037a092245SBram Moolenaar      'vim9script',
24047a092245SBram Moolenaar      'echo "yes" # something',
24057a092245SBram Moolenaar      ])
24067a092245SBram Moolenaar  CheckScriptFailure([
24077a092245SBram Moolenaar      'vim9script',
24087a092245SBram Moolenaar      'echo "yes"# something',
24097a092245SBram Moolenaar      ], 'E121:')
24107a092245SBram Moolenaar  CheckScriptFailure([
24117a092245SBram Moolenaar      'vim9script',
24127a092245SBram Moolenaar      'echo# something',
24137a092245SBram Moolenaar      ], 'E121:')
24147a092245SBram Moolenaar  CheckScriptFailure([
24157a092245SBram Moolenaar      'echo "yes" # something',
24167a092245SBram Moolenaar      ], 'E121:')
24177a092245SBram Moolenaar
24184a8d9f2eSBram Moolenaar  exe "echo" # comment
24194a8d9f2eSBram Moolenaar  CheckDefFailure([
24204a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24214a8d9f2eSBram Moolenaar      ], 'E488:')
24224a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24234a8d9f2eSBram Moolenaar      'vim9script',
24244a8d9f2eSBram Moolenaar      'exe "echo" # something',
24254a8d9f2eSBram Moolenaar      ])
24264a8d9f2eSBram Moolenaar  CheckScriptFailure([
24274a8d9f2eSBram Moolenaar      'vim9script',
24284a8d9f2eSBram Moolenaar      'exe "echo"# something',
24294a8d9f2eSBram Moolenaar      ], 'E121:')
24304a8d9f2eSBram Moolenaar  CheckDefFailure([
24314a8d9f2eSBram Moolenaar      'exe # comment',
24324a8d9f2eSBram Moolenaar      ], 'E1015:')
24334a8d9f2eSBram Moolenaar  CheckScriptFailure([
24344a8d9f2eSBram Moolenaar      'vim9script',
24354a8d9f2eSBram Moolenaar      'exe# something',
24364a8d9f2eSBram Moolenaar      ], 'E121:')
24374a8d9f2eSBram Moolenaar  CheckScriptFailure([
24384a8d9f2eSBram Moolenaar      'exe "echo" # something',
24394a8d9f2eSBram Moolenaar      ], 'E121:')
24404a8d9f2eSBram Moolenaar
24417a092245SBram Moolenaar  CheckDefFailure([
24427a092245SBram Moolenaar      'try# comment',
24437a092245SBram Moolenaar      '  echo "yes"',
24447a092245SBram Moolenaar      'catch',
24457a092245SBram Moolenaar      'endtry',
24467a092245SBram Moolenaar      ], 'E488:')
24472c5ed4e3SBram Moolenaar  CheckScriptFailure([
24482c5ed4e3SBram Moolenaar      'vim9script',
24492c5ed4e3SBram Moolenaar      'try# comment',
24502c5ed4e3SBram Moolenaar      'echo "yes"',
24512c5ed4e3SBram Moolenaar      ], 'E488:')
24527a092245SBram Moolenaar  CheckDefFailure([
24537a092245SBram Moolenaar      'try',
2454a72cfb80SBram Moolenaar      '  throw#comment',
2455a72cfb80SBram Moolenaar      'catch',
2456a72cfb80SBram Moolenaar      'endtry',
2457a72cfb80SBram Moolenaar      ], 'E1015:')
2458a72cfb80SBram Moolenaar  CheckDefFailure([
2459a72cfb80SBram Moolenaar      'try',
2460a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2461a72cfb80SBram Moolenaar      'catch',
2462a72cfb80SBram Moolenaar      'endtry',
2463a72cfb80SBram Moolenaar      ], 'E488:')
2464a72cfb80SBram Moolenaar  CheckDefFailure([
2465a72cfb80SBram Moolenaar      'try',
24667a092245SBram Moolenaar      '  echo "yes"',
24677a092245SBram Moolenaar      'catch# comment',
24687a092245SBram Moolenaar      'endtry',
24697a092245SBram Moolenaar      ], 'E488:')
24702c5ed4e3SBram Moolenaar  CheckScriptFailure([
24712c5ed4e3SBram Moolenaar      'vim9script',
24722c5ed4e3SBram Moolenaar      'try',
24732c5ed4e3SBram Moolenaar      '  echo "yes"',
24742c5ed4e3SBram Moolenaar      'catch# comment',
24752c5ed4e3SBram Moolenaar      'endtry',
24762c5ed4e3SBram Moolenaar      ], 'E654:')
24772c5ed4e3SBram Moolenaar  CheckDefFailure([
24782c5ed4e3SBram Moolenaar      'try',
24792c5ed4e3SBram Moolenaar      '  echo "yes"',
24802c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24812c5ed4e3SBram Moolenaar      'endtry',
24822c5ed4e3SBram Moolenaar      ], 'E488:')
24837a092245SBram Moolenaar  CheckDefFailure([
24847a092245SBram Moolenaar      'try',
24857a092245SBram Moolenaar      'echo "yes"',
24867a092245SBram Moolenaar      'catch',
24877a092245SBram Moolenaar      'endtry# comment',
24887a092245SBram Moolenaar      ], 'E488:')
24892c5ed4e3SBram Moolenaar  CheckScriptFailure([
24902c5ed4e3SBram Moolenaar      'vim9script',
24912c5ed4e3SBram Moolenaar      'try',
24922c5ed4e3SBram Moolenaar      '  echo "yes"',
24932c5ed4e3SBram Moolenaar      'catch',
24942c5ed4e3SBram Moolenaar      'endtry# comment',
24959b7bf9e9SBram Moolenaar      ], 'E488:')
24962c5ed4e3SBram Moolenaar
24972c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24982c5ed4e3SBram Moolenaar      'vim9script',
24992c5ed4e3SBram Moolenaar      'hi # comment',
25002c5ed4e3SBram Moolenaar      ])
25012c5ed4e3SBram Moolenaar  CheckScriptFailure([
25022c5ed4e3SBram Moolenaar      'vim9script',
25032c5ed4e3SBram Moolenaar      'hi# comment',
25042c5ed4e3SBram Moolenaar      ], 'E416:')
25051966c248SBram Moolenaar  CheckScriptSuccess([
25061966c248SBram Moolenaar      'vim9script',
25071966c248SBram Moolenaar      'hi Search # comment',
25081966c248SBram Moolenaar      ])
25091966c248SBram Moolenaar  CheckScriptFailure([
25101966c248SBram Moolenaar      'vim9script',
25111966c248SBram Moolenaar      'hi Search# comment',
25121966c248SBram Moolenaar      ], 'E416:')
25131966c248SBram Moolenaar  CheckScriptSuccess([
25141966c248SBram Moolenaar      'vim9script',
25151966c248SBram Moolenaar      'hi link This Search # comment',
25161966c248SBram Moolenaar      ])
25171966c248SBram Moolenaar  CheckScriptFailure([
25181966c248SBram Moolenaar      'vim9script',
25191966c248SBram Moolenaar      'hi link This That# comment',
25201966c248SBram Moolenaar      ], 'E413:')
25211966c248SBram Moolenaar  CheckScriptSuccess([
25221966c248SBram Moolenaar      'vim9script',
25231966c248SBram Moolenaar      'hi clear This # comment',
25241966c248SBram Moolenaar      'hi clear # comment',
25251966c248SBram Moolenaar      ])
2526f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2527f5be8cdbSBram Moolenaar  # hi clear This# comment',
25281966c248SBram Moolenaar  CheckScriptFailure([
25291966c248SBram Moolenaar      'vim9script',
25301966c248SBram Moolenaar      'hi clear# comment',
25311966c248SBram Moolenaar      ], 'E416:')
25321966c248SBram Moolenaar
25331966c248SBram Moolenaar  CheckScriptSuccess([
25341966c248SBram Moolenaar      'vim9script',
25351966c248SBram Moolenaar      'hi Group term=bold',
25361966c248SBram Moolenaar      'match Group /todo/ # comment',
25371966c248SBram Moolenaar      ])
25381966c248SBram Moolenaar  CheckScriptFailure([
25391966c248SBram Moolenaar      'vim9script',
25401966c248SBram Moolenaar      'hi Group term=bold',
25411966c248SBram Moolenaar      'match Group /todo/# comment',
25421966c248SBram Moolenaar      ], 'E488:')
25431966c248SBram Moolenaar  CheckScriptSuccess([
25441966c248SBram Moolenaar      'vim9script',
25451966c248SBram Moolenaar      'match # comment',
25461966c248SBram Moolenaar      ])
25471966c248SBram Moolenaar  CheckScriptFailure([
25481966c248SBram Moolenaar      'vim9script',
25491966c248SBram Moolenaar      'match# comment',
25501966c248SBram Moolenaar      ], 'E475:')
25511966c248SBram Moolenaar  CheckScriptSuccess([
25521966c248SBram Moolenaar      'vim9script',
25531966c248SBram Moolenaar      'match none # comment',
25541966c248SBram Moolenaar      ])
25551966c248SBram Moolenaar  CheckScriptFailure([
25561966c248SBram Moolenaar      'vim9script',
25571966c248SBram Moolenaar      'match none# comment',
25581966c248SBram Moolenaar      ], 'E475:')
25591966c248SBram Moolenaar
25601966c248SBram Moolenaar  CheckScriptSuccess([
25611966c248SBram Moolenaar      'vim9script',
25621966c248SBram Moolenaar      'menutrans clear # comment',
25631966c248SBram Moolenaar      ])
25641966c248SBram Moolenaar  CheckScriptFailure([
25651966c248SBram Moolenaar      'vim9script',
25661966c248SBram Moolenaar      'menutrans clear# comment text',
25671966c248SBram Moolenaar      ], 'E474:')
25681966c248SBram Moolenaar
25691966c248SBram Moolenaar  CheckScriptSuccess([
25701966c248SBram Moolenaar      'vim9script',
25711966c248SBram Moolenaar      'syntax clear # comment',
25721966c248SBram Moolenaar      ])
25731966c248SBram Moolenaar  CheckScriptFailure([
25741966c248SBram Moolenaar      'vim9script',
25751966c248SBram Moolenaar      'syntax clear# comment text',
25761966c248SBram Moolenaar      ], 'E28:')
25771966c248SBram Moolenaar  CheckScriptSuccess([
25781966c248SBram Moolenaar      'vim9script',
25791966c248SBram Moolenaar      'syntax keyword Word some',
25801966c248SBram Moolenaar      'syntax clear Word # comment',
25811966c248SBram Moolenaar      ])
25821966c248SBram Moolenaar  CheckScriptFailure([
25831966c248SBram Moolenaar      'vim9script',
25841966c248SBram Moolenaar      'syntax keyword Word some',
25851966c248SBram Moolenaar      'syntax clear Word# comment text',
25861966c248SBram Moolenaar      ], 'E28:')
25871966c248SBram Moolenaar
25881966c248SBram Moolenaar  CheckScriptSuccess([
25891966c248SBram Moolenaar      'vim9script',
25901966c248SBram Moolenaar      'syntax list # comment',
25911966c248SBram Moolenaar      ])
25921966c248SBram Moolenaar  CheckScriptFailure([
25931966c248SBram Moolenaar      'vim9script',
25941966c248SBram Moolenaar      'syntax list# comment text',
25951966c248SBram Moolenaar      ], 'E28:')
25961966c248SBram Moolenaar
25971966c248SBram Moolenaar  CheckScriptSuccess([
25981966c248SBram Moolenaar      'vim9script',
25991966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26001966c248SBram Moolenaar      ])
26011966c248SBram Moolenaar  CheckScriptFailure([
26021966c248SBram Moolenaar      'vim9script',
26031966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26041966c248SBram Moolenaar      ], 'E475:')
26051966c248SBram Moolenaar
26061966c248SBram Moolenaar  CheckScriptSuccess([
26071966c248SBram Moolenaar      'vim9script',
26081966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26091966c248SBram Moolenaar      ])
26101966c248SBram Moolenaar  CheckScriptFailure([
26111966c248SBram Moolenaar      'vim9script',
26121966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26131966c248SBram Moolenaar      ], 'E789:')
26141966c248SBram Moolenaar
26151966c248SBram Moolenaar  CheckScriptSuccess([
26161966c248SBram Moolenaar      'vim9script',
26171966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26181966c248SBram Moolenaar      ])
26191966c248SBram Moolenaar  CheckScriptFailure([
26201966c248SBram Moolenaar      'vim9script',
26211966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26221966c248SBram Moolenaar      ], 'E402:')
26231966c248SBram Moolenaar
26241966c248SBram Moolenaar  CheckScriptSuccess([
26251966c248SBram Moolenaar      'vim9script',
26261966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26271966c248SBram Moolenaar      ])
26281966c248SBram Moolenaar  CheckScriptFailure([
26291966c248SBram Moolenaar      'vim9script',
26301966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26311966c248SBram Moolenaar      ], 'E475:')
26321966c248SBram Moolenaar  CheckScriptFailure([
26331966c248SBram Moolenaar      'vim9script',
26341966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26351966c248SBram Moolenaar      ], 'E406:')
26361966c248SBram Moolenaar  CheckScriptFailure([
26371966c248SBram Moolenaar      'vim9script',
26381966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26391966c248SBram Moolenaar      ], 'E475:')
26401966c248SBram Moolenaar
26411966c248SBram Moolenaar  CheckScriptSuccess([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26441966c248SBram Moolenaar      ])
26451966c248SBram Moolenaar  CheckScriptFailure([
26461966c248SBram Moolenaar      'vim9script',
26471966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2648d032f34aSBram Moolenaar      ], 'E402:')
26491966c248SBram Moolenaar
26501966c248SBram Moolenaar  CheckScriptSuccess([
26511966c248SBram Moolenaar      'vim9script',
26521966c248SBram Moolenaar      'syntax sync # comment',
26531966c248SBram Moolenaar      ])
26541966c248SBram Moolenaar  CheckScriptFailure([
26551966c248SBram Moolenaar      'vim9script',
26561966c248SBram Moolenaar      'syntax sync# comment',
26571966c248SBram Moolenaar      ], 'E404:')
26581966c248SBram Moolenaar  CheckScriptSuccess([
26591966c248SBram Moolenaar      'vim9script',
26601966c248SBram Moolenaar      'syntax sync ccomment # comment',
26611966c248SBram Moolenaar      ])
26621966c248SBram Moolenaar  CheckScriptFailure([
26631966c248SBram Moolenaar      'vim9script',
26641966c248SBram Moolenaar      'syntax sync ccomment# comment',
26651966c248SBram Moolenaar      ], 'E404:')
26661966c248SBram Moolenaar
26671966c248SBram Moolenaar  CheckScriptSuccess([
26681966c248SBram Moolenaar      'vim9script',
26691966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26701966c248SBram Moolenaar      ])
26711966c248SBram Moolenaar  CheckScriptFailure([
26721966c248SBram Moolenaar      'vim9script',
26731966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26741966c248SBram Moolenaar      ], 'E475:')
2675a72cfb80SBram Moolenaar
2676a72cfb80SBram Moolenaar  CheckScriptSuccess([
2677a72cfb80SBram Moolenaar      'vim9script',
2678a72cfb80SBram Moolenaar      'command Echo echo # comment',
2679a72cfb80SBram Moolenaar      'command Echo # comment',
2680a72cfb80SBram Moolenaar      ])
2681a72cfb80SBram Moolenaar  CheckScriptFailure([
2682a72cfb80SBram Moolenaar      'vim9script',
2683a72cfb80SBram Moolenaar      'command Echo echo# comment',
2684a72cfb80SBram Moolenaar      'Echo',
2685a72cfb80SBram Moolenaar      ], 'E121:')
2686a72cfb80SBram Moolenaar  CheckScriptFailure([
2687a72cfb80SBram Moolenaar      'vim9script',
2688a72cfb80SBram Moolenaar      'command Echo# comment',
2689a72cfb80SBram Moolenaar      ], 'E182:')
2690a72cfb80SBram Moolenaar  CheckScriptFailure([
2691a72cfb80SBram Moolenaar      'vim9script',
2692a72cfb80SBram Moolenaar      'command Echo echo',
2693a72cfb80SBram Moolenaar      'command Echo# comment',
2694a72cfb80SBram Moolenaar      ], 'E182:')
2695a72cfb80SBram Moolenaar
2696a72cfb80SBram Moolenaar  CheckScriptSuccess([
2697a72cfb80SBram Moolenaar      'vim9script',
2698a72cfb80SBram Moolenaar      'function # comment',
2699a72cfb80SBram Moolenaar      ])
2700a72cfb80SBram Moolenaar  CheckScriptFailure([
2701a72cfb80SBram Moolenaar      'vim9script',
27029898107fSBram Moolenaar      'function " comment',
27039898107fSBram Moolenaar      ], 'E129:')
27049898107fSBram Moolenaar  CheckScriptFailure([
27059898107fSBram Moolenaar      'vim9script',
2706a72cfb80SBram Moolenaar      'function# comment',
2707a72cfb80SBram Moolenaar      ], 'E129:')
2708a72cfb80SBram Moolenaar  CheckScriptSuccess([
2709a72cfb80SBram Moolenaar      'vim9script',
2710a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2711a72cfb80SBram Moolenaar      ])
2712a72cfb80SBram Moolenaar  CheckScriptFailure([
2713a72cfb80SBram Moolenaar      'vim9script',
2714a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2715a72cfb80SBram Moolenaar      ], 'E488:')
2716a72cfb80SBram Moolenaar
2717a72cfb80SBram Moolenaar  CheckScriptSuccess([
2718a72cfb80SBram Moolenaar      'vim9script',
27194c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2720a72cfb80SBram Moolenaar      'endfunc',
27214c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2722a72cfb80SBram Moolenaar      ])
2723a72cfb80SBram Moolenaar  CheckScriptFailure([
2724a72cfb80SBram Moolenaar      'vim9script',
27254c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2726a72cfb80SBram Moolenaar      'endfunc',
27274c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2728a72cfb80SBram Moolenaar      ], 'E488:')
2729a72cfb80SBram Moolenaar
2730a72cfb80SBram Moolenaar  CheckScriptSuccess([
2731a72cfb80SBram Moolenaar      'vim9script',
2732a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2733a72cfb80SBram Moolenaar      ])
2734a72cfb80SBram Moolenaar  CheckScriptFailure([
2735a72cfb80SBram Moolenaar      'vim9script',
2736a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2737a72cfb80SBram Moolenaar      ], 'E488:')
2738e7e4838fSBram Moolenaar
2739e7e4838fSBram Moolenaar  CheckScriptFailure([
2740e7e4838fSBram Moolenaar      'def Test() " comment',
2741e7e4838fSBram Moolenaar      'enddef',
2742e7e4838fSBram Moolenaar      ], 'E488:')
2743e7e4838fSBram Moolenaar  CheckScriptFailure([
2744e7e4838fSBram Moolenaar      'vim9script',
2745e7e4838fSBram Moolenaar      'def Test() " comment',
2746e7e4838fSBram Moolenaar      'enddef',
2747e7e4838fSBram Moolenaar      ], 'E488:')
2748e7e4838fSBram Moolenaar
2749e7e4838fSBram Moolenaar  CheckScriptSuccess([
2750e7e4838fSBram Moolenaar      'func Test() " comment',
2751e7e4838fSBram Moolenaar      'endfunc',
2752e7e4838fSBram Moolenaar      ])
27539898107fSBram Moolenaar  CheckScriptSuccess([
2754e7e4838fSBram Moolenaar      'vim9script',
2755e7e4838fSBram Moolenaar      'func Test() " comment',
2756e7e4838fSBram Moolenaar      'endfunc',
27579898107fSBram Moolenaar      ])
2758e7e4838fSBram Moolenaar
2759e7e4838fSBram Moolenaar  CheckScriptSuccess([
2760e7e4838fSBram Moolenaar      'def Test() # comment',
2761e7e4838fSBram Moolenaar      'enddef',
2762e7e4838fSBram Moolenaar      ])
2763e7e4838fSBram Moolenaar  CheckScriptFailure([
2764e7e4838fSBram Moolenaar      'func Test() # comment',
2765e7e4838fSBram Moolenaar      'endfunc',
2766e7e4838fSBram Moolenaar      ], 'E488:')
27672c5ed4e3SBram Moolenaarenddef
27682c5ed4e3SBram Moolenaar
27692c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27702c5ed4e3SBram Moolenaar  CheckCanRunGui
27712c5ed4e3SBram Moolenaar
27722c5ed4e3SBram Moolenaar  CheckScriptFailure([
27732c5ed4e3SBram Moolenaar      'vim9script',
27742c5ed4e3SBram Moolenaar      'gui#comment'
27752c5ed4e3SBram Moolenaar      ], 'E499:')
27762c5ed4e3SBram Moolenaar  CheckScriptFailure([
27772c5ed4e3SBram Moolenaar      'vim9script',
27782c5ed4e3SBram Moolenaar      'gui -f#comment'
27792c5ed4e3SBram Moolenaar      ], 'E499:')
27807a092245SBram Moolenaarenddef
27817a092245SBram Moolenaar
2782a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27836797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27846797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2785a26b9700SBram Moolenaar
2786a26b9700SBram Moolenaar  edit test.vim
2787a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2788a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2789a26b9700SBram Moolenaar
2790a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2791a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2792a26b9700SBram Moolenaar
2793a26b9700SBram Moolenaar  g:entered = 0
2794a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2795a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2796a26b9700SBram Moolenaar
2797a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2798a26b9700SBram Moolenaar
2799a26b9700SBram Moolenaar  au! TabEnter
2800a26b9700SBram Moolenaar  unlet g:entered
2801d72c1bf0SBram Moolenaar
2802d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2803d72c1bf0SBram Moolenaar      'vim9script',
28046797966dSBram Moolenaar      'g:var = 123',
2805e55b1c09SBram Moolenaar      'b:var = 456',
2806e55b1c09SBram Moolenaar      'w:var = 777',
2807e55b1c09SBram Moolenaar      't:var = 888',
2808d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2809d72c1bf0SBram Moolenaar      ])
2810d72c1bf0SBram Moolenaar
2811d72c1bf0SBram Moolenaar  CheckScriptFailure([
2812d72c1bf0SBram Moolenaar      'vim9script',
2813d72c1bf0SBram Moolenaar      'let g:var = 123',
2814e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2815e55b1c09SBram Moolenaar
2816e55b1c09SBram Moolenaar  CheckScriptFailure([
2817e55b1c09SBram Moolenaar      'vim9script',
2818e55b1c09SBram Moolenaar      'let b:var = 123',
2819e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2820e55b1c09SBram Moolenaar
2821e55b1c09SBram Moolenaar  CheckScriptFailure([
2822e55b1c09SBram Moolenaar      'vim9script',
2823e55b1c09SBram Moolenaar      'let w:var = 123',
2824e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2825e55b1c09SBram Moolenaar
2826e55b1c09SBram Moolenaar  CheckScriptFailure([
2827e55b1c09SBram Moolenaar      'vim9script',
2828e55b1c09SBram Moolenaar      'let t:var = 123',
2829e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2830e55b1c09SBram Moolenaar
2831e55b1c09SBram Moolenaar  CheckScriptFailure([
2832e55b1c09SBram Moolenaar      'vim9script',
2833e55b1c09SBram Moolenaar      'let v:version = 123',
2834e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2835e55b1c09SBram Moolenaar
2836e55b1c09SBram Moolenaar  CheckScriptFailure([
2837e55b1c09SBram Moolenaar      'vim9script',
2838e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2839e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28406797966dSBram Moolenaar
28416797966dSBram Moolenaar  CheckScriptFailure([
28426797966dSBram Moolenaar      'vim9script',
28436797966dSBram Moolenaar      'g:var = 123',
284432e35117SBram Moolenaar      'unlet g:var# comment1',
2845d72c1bf0SBram Moolenaar      ], 'E108:')
2846d72c1bf0SBram Moolenaar
2847d72c1bf0SBram Moolenaar  CheckScriptFailure([
2848d72c1bf0SBram Moolenaar      'let g:var = 123',
2849d72c1bf0SBram Moolenaar      'unlet g:var # something',
2850d72c1bf0SBram Moolenaar      ], 'E488:')
2851faac4104SBram Moolenaar
2852faac4104SBram Moolenaar  CheckScriptSuccess([
2853faac4104SBram Moolenaar      'vim9script',
285432e35117SBram Moolenaar      'if 1 # comment2',
2855faac4104SBram Moolenaar      '  echo "yes"',
2856faac4104SBram Moolenaar      'elseif 2 #comment',
2857faac4104SBram Moolenaar      '  echo "no"',
2858faac4104SBram Moolenaar      'endif',
2859faac4104SBram Moolenaar      ])
2860faac4104SBram Moolenaar
2861faac4104SBram Moolenaar  CheckScriptFailure([
2862faac4104SBram Moolenaar      'vim9script',
286332e35117SBram Moolenaar      'if 1# comment3',
2864faac4104SBram Moolenaar      '  echo "yes"',
2865faac4104SBram Moolenaar      'endif',
2866faac4104SBram Moolenaar      ], 'E15:')
2867faac4104SBram Moolenaar
2868faac4104SBram Moolenaar  CheckScriptFailure([
2869faac4104SBram Moolenaar      'vim9script',
287032e35117SBram Moolenaar      'if 0 # comment4',
2871faac4104SBram Moolenaar      '  echo "yes"',
2872faac4104SBram Moolenaar      'elseif 2#comment',
2873faac4104SBram Moolenaar      '  echo "no"',
2874faac4104SBram Moolenaar      'endif',
2875faac4104SBram Moolenaar      ], 'E15:')
2876faac4104SBram Moolenaar
2877faac4104SBram Moolenaar  CheckScriptSuccess([
2878faac4104SBram Moolenaar      'vim9script',
287932e35117SBram Moolenaar      'let v = 1 # comment5',
2880faac4104SBram Moolenaar      ])
2881faac4104SBram Moolenaar
2882faac4104SBram Moolenaar  CheckScriptFailure([
2883faac4104SBram Moolenaar      'vim9script',
288432e35117SBram Moolenaar      'let v = 1# comment6',
288532e35117SBram Moolenaar      ], 'E15:')
2886faac4104SBram Moolenaar
2887faac4104SBram Moolenaar  CheckScriptSuccess([
2888faac4104SBram Moolenaar      'vim9script',
2889faac4104SBram Moolenaar      'new'
2890faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2891df069eecSBram Moolenaar      ':$',
2892faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2893faac4104SBram Moolenaar      'bwipe!',
2894faac4104SBram Moolenaar      ])
2895faac4104SBram Moolenaar
2896f5be8cdbSBram Moolenaar  CheckScriptFailure([
2897f5be8cdbSBram Moolenaar      'vim9script',
2898f5be8cdbSBram Moolenaar      'new'
2899f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2900f5be8cdbSBram Moolenaar      ':$',
2901f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2902f5be8cdbSBram Moolenaar      'bwipe!',
2903f5be8cdbSBram Moolenaar      ], 'E488:')
2904f5be8cdbSBram Moolenaar
2905f5be8cdbSBram Moolenaar  CheckScriptFailure([
2906f5be8cdbSBram Moolenaar      'vim9script',
2907f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2908f5be8cdbSBram Moolenaar      ], 'E477:')
2909a26b9700SBram Moolenaarenddef
2910a26b9700SBram Moolenaar
29117e5bd91dSBram Moolenaardef Test_finish()
29127e5bd91dSBram Moolenaar  let lines =<< trim END
29137e5bd91dSBram Moolenaar    vim9script
29146797966dSBram Moolenaar    g:res = 'one'
29157e5bd91dSBram Moolenaar    if v:false | finish | endif
29166797966dSBram Moolenaar    g:res = 'two'
29177e5bd91dSBram Moolenaar    finish
29186797966dSBram Moolenaar    g:res = 'three'
29197e5bd91dSBram Moolenaar  END
29207e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29217e5bd91dSBram Moolenaar  source Xfinished
29227e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29237e5bd91dSBram Moolenaar
29247e5bd91dSBram Moolenaar  unlet g:res
29257e5bd91dSBram Moolenaar  delete('Xfinished')
29267e5bd91dSBram Moolenaarenddef
29277e5bd91dSBram Moolenaar
292832e35117SBram Moolenaardef Test_let_func_call()
292932e35117SBram Moolenaar  let lines =<< trim END
293032e35117SBram Moolenaar    vim9script
293132e35117SBram Moolenaar    func GetValue()
293232e35117SBram Moolenaar      if exists('g:count')
293332e35117SBram Moolenaar        let g:count += 1
293432e35117SBram Moolenaar      else
293532e35117SBram Moolenaar        let g:count = 1
293632e35117SBram Moolenaar      endif
293732e35117SBram Moolenaar      return 'this'
293832e35117SBram Moolenaar    endfunc
293932e35117SBram Moolenaar    let val: string = GetValue()
2940f5be8cdbSBram Moolenaar    # env var is always a string
2941df671b46SBram Moolenaar    let env = $TERM
294232e35117SBram Moolenaar  END
294332e35117SBram Moolenaar  writefile(lines, 'Xfinished')
294432e35117SBram Moolenaar  source Xfinished
2945f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
294632e35117SBram Moolenaar  assert_equal(1, g:count)
294732e35117SBram Moolenaar
294832e35117SBram Moolenaar  unlet g:count
294932e35117SBram Moolenaar  delete('Xfinished')
295032e35117SBram Moolenaarenddef
295132e35117SBram Moolenaar
295232e35117SBram Moolenaardef Test_let_missing_type()
295332e35117SBram Moolenaar  let lines =<< trim END
295432e35117SBram Moolenaar    vim9script
2955df671b46SBram Moolenaar    let var = g:unknown
2956227a69deSBram Moolenaar  END
2957822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2958227a69deSBram Moolenaar
2959227a69deSBram Moolenaar  lines =<< trim END
2960227a69deSBram Moolenaar    vim9script
2961227a69deSBram Moolenaar    let nr: number = 123
2962227a69deSBram Moolenaar    let var = nr
2963227a69deSBram Moolenaar  END
2964822ba247SBram Moolenaar  CheckScriptSuccess(lines)
296532e35117SBram Moolenaarenddef
296632e35117SBram Moolenaar
2967c82a5b5dSBram Moolenaardef Test_let_declaration()
2968c82a5b5dSBram Moolenaar  let lines =<< trim END
2969c82a5b5dSBram Moolenaar    vim9script
2970c82a5b5dSBram Moolenaar    let var: string
2971c82a5b5dSBram Moolenaar    g:var_uninit = var
2972c82a5b5dSBram Moolenaar    var = 'text'
2973c82a5b5dSBram Moolenaar    g:var_test = var
2974f5be8cdbSBram Moolenaar    # prefixing s: is optional
2975984dddbeSBram Moolenaar    s:var = 'prefixed'
2976984dddbeSBram Moolenaar    g:var_prefixed = s:var
2977984dddbeSBram Moolenaar
2978984dddbeSBram Moolenaar    let s:other: number
2979984dddbeSBram Moolenaar    other = 1234
2980984dddbeSBram Moolenaar    g:other_var = other
298153b29e48SBram Moolenaar
298253b29e48SBram Moolenaar    # type is inferred
298353b29e48SBram Moolenaar    s:dict = {'a': 222}
298453b29e48SBram Moolenaar    def GetDictVal(key: any)
298553b29e48SBram Moolenaar      g:dict_val = s:dict[key]
298653b29e48SBram Moolenaar    enddef
298753b29e48SBram Moolenaar    GetDictVal('a')
2988c82a5b5dSBram Moolenaar  END
2989c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2990c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2991c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2992984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2993984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
299453b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
2995c82a5b5dSBram Moolenaar
2996c82a5b5dSBram Moolenaar  unlet g:var_uninit
2997c82a5b5dSBram Moolenaar  unlet g:var_test
2998984dddbeSBram Moolenaar  unlet g:var_prefixed
2999984dddbeSBram Moolenaar  unlet g:other_var
3000c82a5b5dSBram Moolenaarenddef
3001c82a5b5dSBram Moolenaar
3002c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3003c5b1c20bSBram Moolenaar  let lines =<< trim END
3004c5b1c20bSBram Moolenaar    vim9script
3005c5b1c20bSBram Moolenaar    const var: string
3006c5b1c20bSBram Moolenaar  END
3007c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3008c5b1c20bSBram Moolenaar
3009c5b1c20bSBram Moolenaar  lines =<< trim END
3010c5b1c20bSBram Moolenaar    vim9script
3011c5b1c20bSBram Moolenaar    let 9var: string
3012c5b1c20bSBram Moolenaar  END
3013c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3014c5b1c20bSBram Moolenaarenddef
3015c5b1c20bSBram Moolenaar
301634db91f7SBram Moolenaardef Test_let_type_check()
301734db91f7SBram Moolenaar  let lines =<< trim END
301834db91f7SBram Moolenaar    vim9script
301934db91f7SBram Moolenaar    let var: string
302034db91f7SBram Moolenaar    var = 1234
302134db91f7SBram Moolenaar  END
3022451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3023984dddbeSBram Moolenaar
3024984dddbeSBram Moolenaar  lines =<< trim END
3025984dddbeSBram Moolenaar    vim9script
3026984dddbeSBram Moolenaar    let var:string
3027984dddbeSBram Moolenaar  END
3028984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3029c5b1c20bSBram Moolenaar
3030c5b1c20bSBram Moolenaar  lines =<< trim END
3031c5b1c20bSBram Moolenaar    vim9script
3032c5b1c20bSBram Moolenaar    let var: asdf
3033c5b1c20bSBram Moolenaar  END
3034c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3035a71e2633SBram Moolenaar
3036a71e2633SBram Moolenaar  lines =<< trim END
3037a71e2633SBram Moolenaar    vim9script
3038a71e2633SBram Moolenaar    let s:l: list<number>
3039a71e2633SBram Moolenaar    s:l = []
3040a71e2633SBram Moolenaar  END
3041a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3042a71e2633SBram Moolenaar
3043a71e2633SBram Moolenaar  lines =<< trim END
3044a71e2633SBram Moolenaar    vim9script
3045a71e2633SBram Moolenaar    let s:d: dict<number>
3046a71e2633SBram Moolenaar    s:d = {}
3047a71e2633SBram Moolenaar  END
3048a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
304934db91f7SBram Moolenaarenddef
305034db91f7SBram Moolenaar
3051a5d0077eSBram Moolenaardef Test_forward_declaration()
3052a5d0077eSBram Moolenaar  let lines =<< trim END
3053a5d0077eSBram Moolenaar    vim9script
3054a5d0077eSBram Moolenaar    def GetValue(): string
3055a5d0077eSBram Moolenaar      return theVal
3056a5d0077eSBram Moolenaar    enddef
3057a5d0077eSBram Moolenaar    let theVal = 'something'
3058822ba247SBram Moolenaar    g:initVal = GetValue()
3059a5d0077eSBram Moolenaar    theVal = 'else'
3060a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3061a5d0077eSBram Moolenaar  END
3062a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3063a5d0077eSBram Moolenaar  source Xforward
3064a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3065a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3066a5d0077eSBram Moolenaar
3067a5d0077eSBram Moolenaar  unlet g:initVal
3068a5d0077eSBram Moolenaar  unlet g:laterVal
3069a5d0077eSBram Moolenaar  delete('Xforward')
3070a5d0077eSBram Moolenaarenddef
3071a5d0077eSBram Moolenaar
30729721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
30739721fb4eSBram Moolenaar  let legacy_lines =<< trim END
30749721fb4eSBram Moolenaar    source Xvim9_script.vim
30759721fb4eSBram Moolenaar
30769721fb4eSBram Moolenaar    call assert_false(exists('local'))
30779721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30789721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30799721fb4eSBram Moolenaar    call assert_equal('global', global)
30809721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30819721fb4eSBram Moolenaar
30829721fb4eSBram Moolenaar    " imported variable becomes script-local
30839721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30849721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30859721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30869721fb4eSBram Moolenaar
30879721fb4eSBram Moolenaar    " imported function becomes script-local
30889721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30899721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30909721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30919721fb4eSBram Moolenaar  END
30929721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30939721fb4eSBram Moolenaar
30949721fb4eSBram Moolenaar  let vim9_lines =<< trim END
30959721fb4eSBram Moolenaar    vim9script
30969721fb4eSBram Moolenaar    let local = 'local'
30979721fb4eSBram Moolenaar    g:global = 'global'
30989721fb4eSBram Moolenaar    export let exported = 'exported'
30999721fb4eSBram Moolenaar    export def GetText(): string
31009721fb4eSBram Moolenaar       return 'text'
31019721fb4eSBram Moolenaar    enddef
31029721fb4eSBram Moolenaar  END
31039721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31049721fb4eSBram Moolenaar
31059721fb4eSBram Moolenaar  source Xlegacy_script.vim
31069721fb4eSBram Moolenaar
31079721fb4eSBram Moolenaar  assert_equal('global', g:global)
3108f5be8cdbSBram Moolenaar  unlet g:global
31099721fb4eSBram Moolenaar
31109721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31119721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31129721fb4eSBram Moolenaarenddef
3113a5d0077eSBram Moolenaar
31147d699701SBram Moolenaarfunc Test_vim9script_not_global()
31157d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31167d699701SBram Moolenaar  let vim9lines =<< trim END
31177d699701SBram Moolenaar    vim9script
31187d699701SBram Moolenaar    let var = 'local'
31197d699701SBram Moolenaar    func TheFunc()
31207d699701SBram Moolenaar      echo 'local'
31217d699701SBram Moolenaar    endfunc
31227d699701SBram Moolenaar    def DefFunc()
31237d699701SBram Moolenaar      echo 'local'
31247d699701SBram Moolenaar    enddef
31257d699701SBram Moolenaar  END
31267d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31277d699701SBram Moolenaar  source Xvim9script.vim
31287d699701SBram Moolenaar  try
31297d699701SBram Moolenaar    echo g:var
31307d699701SBram Moolenaar    assert_report('did not fail')
31317d699701SBram Moolenaar  catch /E121:/
31327d699701SBram Moolenaar    " caught
31337d699701SBram Moolenaar  endtry
31347d699701SBram Moolenaar  try
31357d699701SBram Moolenaar    call TheFunc()
31367d699701SBram Moolenaar    assert_report('did not fail')
31377d699701SBram Moolenaar  catch /E117:/
31387d699701SBram Moolenaar    " caught
31397d699701SBram Moolenaar  endtry
31407d699701SBram Moolenaar  try
31417d699701SBram Moolenaar    call DefFunc()
31427d699701SBram Moolenaar    assert_report('did not fail')
31437d699701SBram Moolenaar  catch /E117:/
31447d699701SBram Moolenaar    " caught
31457d699701SBram Moolenaar  endtry
31467d699701SBram Moolenaar
31477d699701SBram Moolenaar  call delete('Xvim9script.vium')
31487d699701SBram Moolenaarendfunc
31497d699701SBram Moolenaar
3150eeb27bfeSBram Moolenaardef Test_vim9_copen()
3151eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3152eeb27bfeSBram Moolenaar  copen
3153eeb27bfeSBram Moolenaar  quit
3154eeb27bfeSBram Moolenaarenddef
3155eeb27bfeSBram Moolenaar
31562d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31572d6b20d6SBram Moolenaardef Test_vim9_autoload()
31582d6b20d6SBram Moolenaar  let lines =<< trim END
31592d6b20d6SBram Moolenaar     vim9script
31602d6b20d6SBram Moolenaar     def foo#test()
31612d6b20d6SBram Moolenaar         echomsg getreg('"')
31622d6b20d6SBram Moolenaar     enddef
31632d6b20d6SBram Moolenaar  END
31642d6b20d6SBram Moolenaar
31652d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31662d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
31672d6b20d6SBram Moolenaar  let save_rtp = &rtp
31682d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31692d6b20d6SBram Moolenaar  augroup test
31702d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31712d6b20d6SBram Moolenaar  augroup END
31722d6b20d6SBram Moolenaar
31732d6b20d6SBram Moolenaar  normal Y
31742d6b20d6SBram Moolenaar
31752d6b20d6SBram Moolenaar  augroup test
31762d6b20d6SBram Moolenaar    autocmd!
31772d6b20d6SBram Moolenaar  augroup END
31782d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31792d6b20d6SBram Moolenaar  &rtp = save_rtp
31802d6b20d6SBram Moolenaarenddef
31812d6b20d6SBram Moolenaar
318281e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
318381e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
318481e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
318581e17fbeSBram Moolenaar  let lines =<< trim END
318681e17fbeSBram Moolenaar    let s:counter = 1
318781e17fbeSBram Moolenaar    def s:Func()
318881e17fbeSBram Moolenaar      au! CursorHold
318981e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
319081e17fbeSBram Moolenaar    enddef
319181e17fbeSBram Moolenaar    call s:Func()
319281e17fbeSBram Moolenaar    doau CursorHold
319381e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
319481e17fbeSBram Moolenaar    au! CursorHold
319581e17fbeSBram Moolenaar  END
319681e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
319781e17fbeSBram Moolenaarenddef
319881e17fbeSBram Moolenaar
31993896a105SBram Moolenaardef Test_cmdline_win()
32003896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32013896a105SBram Moolenaar  # the command line window.
32023896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32033896a105SBram Moolenaar  let export_lines =<< trim END
32043896a105SBram Moolenaar    vim9script
32053896a105SBram Moolenaar    export let That = 'yes'
32063896a105SBram Moolenaar  END
32073896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32083896a105SBram Moolenaar  let import_lines =<< trim END
32093896a105SBram Moolenaar    vim9script
32103896a105SBram Moolenaar    import That from './Xexport.vim'
32113896a105SBram Moolenaar  END
32123896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32133896a105SBram Moolenaar  let save_rtp = &rtp
32143896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32153896a105SBram Moolenaar  syntax on
32163896a105SBram Moolenaar  augroup CmdWin
32173896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32183896a105SBram Moolenaar  augroup END
32193896a105SBram Moolenaar  # this will open and also close the cmdline window
32203896a105SBram Moolenaar  feedkeys('q:', 'xt')
32213896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32223896a105SBram Moolenaar
32233896a105SBram Moolenaar  augroup CmdWin
32243896a105SBram Moolenaar    au!
32253896a105SBram Moolenaar  augroup END
32263896a105SBram Moolenaar  &rtp = save_rtp
32273896a105SBram Moolenaar  delete('rtp', 'rf')
32283896a105SBram Moolenaarenddef
32293896a105SBram Moolenaar
3230585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3231585fea7bSBram Moolenaardef Test_substitute_cmd()
3232585fea7bSBram Moolenaar  new
3233585fea7bSBram Moolenaar  setline(1, 'something')
3234585fea7bSBram Moolenaar  :substitute(some(other(
3235585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3236585fea7bSBram Moolenaar  bwipe!
3237585fea7bSBram Moolenaar
3238f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3239585fea7bSBram Moolenaar  let lines =<< trim END
3240585fea7bSBram Moolenaar    vim9script
3241585fea7bSBram Moolenaar    new
3242585fea7bSBram Moolenaar    setline(1, 'something')
3243585fea7bSBram Moolenaar    :substitute(some(other(
3244585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3245585fea7bSBram Moolenaar    bwipe!
3246585fea7bSBram Moolenaar  END
3247585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3248585fea7bSBram Moolenaar  source Xvim9lines
3249585fea7bSBram Moolenaar
3250585fea7bSBram Moolenaar  delete('Xvim9lines')
3251585fea7bSBram Moolenaarenddef
3252585fea7bSBram Moolenaar
32538a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3254