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
136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
146e587dcbSBram Moolenaarlet s:addToMe = 111
15401d9ffbSBram Moolenaarlet g:existing = 'yes'
16a8c17704SBram Moolenaarlet g:inc_counter = 1
17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
18a6e67e4fSBram Moolenaarlet g:alist = [7]
19a6e67e4fSBram Moolenaarlet g:astring = 'text'
20f0b9f43cSBram Moolenaarlet g:anumber = 123
216e587dcbSBram Moolenaar
228a7d6542SBram Moolenaardef Test_assignment()
238a7d6542SBram Moolenaar  let bool1: bool = true
248a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
258a7d6542SBram Moolenaar  let bool2: bool = false
268a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
278a7d6542SBram Moolenaar
28f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
29f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
301cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
3198b4f145SBram Moolenaar  call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
32f93c7feaSBram Moolenaar
334cdb13ceSBram Moolenaar  let nr: number = 1234
34451c2e35SBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
354cdb13ceSBram Moolenaar
36b209750bSBram Moolenaar  let a: number = 6 #comment
379be61bbbSBram Moolenaar  assert_equal(6, a)
389be61bbbSBram Moolenaar
3942a480bfSBram Moolenaar  if has('channel')
4042a480bfSBram Moolenaar    let chan1: channel
41fbdd08edSBram Moolenaar    let job1: job
42f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
4342a480bfSBram Moolenaar  endif
44fbdd08edSBram Moolenaar  if has('float')
45fbdd08edSBram Moolenaar    let float1: float = 3.4
46fbdd08edSBram Moolenaar  endif
475deeb3f1SBram Moolenaar  let Funky1: func
485deeb3f1SBram Moolenaar  let Funky2: func = function('len')
494c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
5042a480bfSBram Moolenaar
51b209750bSBram Moolenaar  g:newvar = 'new'  #comment
52401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
53401d9ffbSBram Moolenaar
54401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
55401d9ffbSBram Moolenaar  g:existing = 'no'
56401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
57401d9ffbSBram Moolenaar
58b283a8a6SBram Moolenaar  v:char = 'abc'
596e587dcbSBram Moolenaar  assert_equal('abc', v:char)
60b283a8a6SBram Moolenaar
61b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
626e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
63b283a8a6SBram Moolenaar  $ENVVAR = ''
646e587dcbSBram Moolenaar
65b5ed2660SBram Moolenaar  let lines =<< trim END
66b5ed2660SBram Moolenaar    vim9script
67b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
68b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
69b5ed2660SBram Moolenaar    $ENVVAR = ''
70b5ed2660SBram Moolenaar  END
71b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
72b5ed2660SBram Moolenaar
73fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
74fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
75fd1823e0SBram Moolenaar  s:addToMe += 222
76fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
770bbf722aSBram Moolenaar  s:newVar = 'new'
780bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
79a8c17704SBram Moolenaar
80a8c17704SBram Moolenaar  set ts=7
81a8c17704SBram Moolenaar  &ts += 1
82a8c17704SBram Moolenaar  assert_equal(8, &ts)
8380c34ca3SBram Moolenaar  &ts -= 3
8480c34ca3SBram Moolenaar  assert_equal(5, &ts)
8580c34ca3SBram Moolenaar  &ts *= 2
8680c34ca3SBram Moolenaar  assert_equal(10, &ts)
8780c34ca3SBram Moolenaar  &ts /= 3
8880c34ca3SBram Moolenaar  assert_equal(3, &ts)
8980c34ca3SBram Moolenaar  set ts=10
9080c34ca3SBram Moolenaar  &ts %= 4
9180c34ca3SBram Moolenaar  assert_equal(2, &ts)
92b5ed2660SBram Moolenaar
93*93ad1471SBram Moolenaar  if has('float')
94*93ad1471SBram Moolenaar    let f100: float = 100.0
95*93ad1471SBram Moolenaar    f100 /= 5
96*93ad1471SBram Moolenaar    assert_equal(20.0, f100)
97*93ad1471SBram Moolenaar
98*93ad1471SBram Moolenaar    let f200: float = 200.0
99*93ad1471SBram Moolenaar    f200 /= 5.0
100*93ad1471SBram Moolenaar    assert_equal(40.0, f200)
101*93ad1471SBram Moolenaar
102*93ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
103*93ad1471SBram Moolenaar  endif
104*93ad1471SBram Moolenaar
105b5ed2660SBram Moolenaar  lines =<< trim END
106b5ed2660SBram Moolenaar    vim9script
107b5ed2660SBram Moolenaar    &ts = 6
108b5ed2660SBram Moolenaar    &ts += 3
109b5ed2660SBram Moolenaar    assert_equal(9, &ts)
110b5ed2660SBram Moolenaar  END
1110aae4809SBram Moolenaar  CheckScriptSuccess(lines)
112b5ed2660SBram Moolenaar
1130aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1140aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1150aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1160aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1170aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1180aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1190aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1200aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
121cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1220aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
12380c34ca3SBram Moolenaar  &ts = 8
124a8c17704SBram Moolenaar
1250aae4809SBram Moolenaar  lines =<< trim END
1260aae4809SBram Moolenaar    let save_TI = &t_TI
1270aae4809SBram Moolenaar    &t_TI = ''
1280aae4809SBram Moolenaar    assert_equal('', &t_TI)
1290aae4809SBram Moolenaar    &t_TI = 'xxx'
1300aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1310aae4809SBram Moolenaar    &t_TI = save_TI
1320aae4809SBram Moolenaar  END
1330aae4809SBram Moolenaar  CheckDefSuccess(lines)
1340aae4809SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
1350aae4809SBram Moolenaar
1360aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
1370aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
1380aae4809SBram Moolenaar
1390aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
1400aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
14133afa244SBram Moolenaar
142f9b2b496SBram Moolenaar  lines =<< trim END
143f9b2b496SBram Moolenaar    vim9script
144f9b2b496SBram Moolenaar    def SomeFunc()
145f9b2b496SBram Moolenaar      s:var = 123
146f9b2b496SBram Moolenaar    enddef
147f9b2b496SBram Moolenaar    defcompile
148f9b2b496SBram Moolenaar  END
149f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
150f9b2b496SBram Moolenaar
151a8c17704SBram Moolenaar  g:inc_counter += 1
152a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
153a8c17704SBram Moolenaar
154a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
155a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
156dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
157451c2e35SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
158a8c17704SBram Moolenaar
159a8c17704SBram Moolenaar  @a = 'areg'
160a8c17704SBram Moolenaar  @a ..= 'add'
161a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
162dd29f1b0SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
163451c2e35SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1012:')
164e69f6d04SBram Moolenaar
165b5ed2660SBram Moolenaar  lines =<< trim END
166b5ed2660SBram Moolenaar    vim9script
167b5ed2660SBram Moolenaar    @c = 'areg'
168b5ed2660SBram Moolenaar    @c ..= 'add'
169b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
170b5ed2660SBram Moolenaar  END
171b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
172b5ed2660SBram Moolenaar
173e69f6d04SBram Moolenaar  v:errmsg = 'none'
174e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
175e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
176dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
177451c2e35SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1012:')
17833afa244SBram Moolenaar
17933afa244SBram Moolenaar  # single letter variables
18033afa244SBram Moolenaar  a = 123
18133afa244SBram Moolenaar  assert_equal(123, a)
18233afa244SBram Moolenaar  let b: number
18333afa244SBram Moolenaar  b = 123
18433afa244SBram Moolenaar  assert_equal(123, b)
18533afa244SBram Moolenaar  let g: number
18633afa244SBram Moolenaar  g = 123
18733afa244SBram Moolenaar  assert_equal(123, g)
18833afa244SBram Moolenaar  let s: number
18933afa244SBram Moolenaar  s = 123
19033afa244SBram Moolenaar  assert_equal(123, s)
19133afa244SBram Moolenaar  let t: number
19233afa244SBram Moolenaar  t = 123
19333afa244SBram Moolenaar  assert_equal(123, t)
19433afa244SBram Moolenaar  let v: number
19533afa244SBram Moolenaar  v = 123
19633afa244SBram Moolenaar  assert_equal(123, v)
19733afa244SBram Moolenaar  let w: number
19833afa244SBram Moolenaar  w = 123
19933afa244SBram Moolenaar  assert_equal(123, w)
2005deeb3f1SBram Moolenaarenddef
2015deeb3f1SBram Moolenaar
2023b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2033b74b6b4SBram Moolenaar  let lines =<< trim END
2043b74b6b4SBram Moolenaar      vim9script
2053b74b6b4SBram Moolenaar
206f5be8cdbSBram Moolenaar      # single character variable declarations work
2073b74b6b4SBram Moolenaar      let a: string
2083b74b6b4SBram Moolenaar      let b: number
2093b74b6b4SBram Moolenaar      let l: list<any>
2103b74b6b4SBram Moolenaar      let s: string
2113b74b6b4SBram Moolenaar      let t: number
2123b74b6b4SBram Moolenaar      let v: number
2133b74b6b4SBram Moolenaar      let w: number
2143b74b6b4SBram Moolenaar
215f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2163b74b6b4SBram Moolenaar      a = 'script-a'
2173b74b6b4SBram Moolenaar      b = 111
2183b74b6b4SBram Moolenaar      l = [1, 2, 3]
2193b74b6b4SBram Moolenaar      s = 'script-s'
2203b74b6b4SBram Moolenaar      t = 222
2213b74b6b4SBram Moolenaar      v = 333
2223b74b6b4SBram Moolenaar      w = 444
2233b74b6b4SBram Moolenaar
2243b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2253b74b6b4SBram Moolenaar      assert_equal(111, b)
2263b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2273b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2283b74b6b4SBram Moolenaar      assert_equal(222, t)
2293b74b6b4SBram Moolenaar      assert_equal(333, v)
2303b74b6b4SBram Moolenaar      assert_equal(444, w)
2313b74b6b4SBram Moolenaar  END
2323b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2333b74b6b4SBram Moolenaar  source Xsinglechar
2343b74b6b4SBram Moolenaar  delete('Xsinglechar')
2353b74b6b4SBram Moolenaarenddef
2363b74b6b4SBram Moolenaar
23784370087SBram Moolenaardef Test_assignment_list()
23884370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
23984370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
24084370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
24184370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
24284370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
24384370087SBram Moolenaar
24484370087SBram Moolenaar  let listS: list<string> = []
24584370087SBram Moolenaar  let listN: list<number> = []
24684370087SBram Moolenaar
24784370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
24884370087SBram Moolenaar  list2[-1] = 99
24984370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
25084370087SBram Moolenaar  list2[-2] = 88
25184370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
25284370087SBram Moolenaar  list2[-3] = 77
25384370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
254dd29f1b0SBram Moolenaar  list2 += [100]
255dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
256dd29f1b0SBram Moolenaar
257dd29f1b0SBram Moolenaar  list3 += ['end']
258dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
259dd29f1b0SBram Moolenaar
260dd29f1b0SBram Moolenaar
26184370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
262c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
26384370087SBram Moolenaar
26484370087SBram Moolenaar  # type becomes list<any>
26584370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
26684370087SBram Moolenaarenddef
26784370087SBram Moolenaar
268b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
269b31be3f9SBram Moolenaar  let lines =<< trim END
270b31be3f9SBram Moolenaar    vim9script
271b31be3f9SBram Moolenaar    let v1: number
272b31be3f9SBram Moolenaar    let v2: number
273b31be3f9SBram Moolenaar    let v3: number
274b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
275b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
276b31be3f9SBram Moolenaar  END
277b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
278b31be3f9SBram Moolenaarenddef
279b31be3f9SBram Moolenaar
28084370087SBram Moolenaardef Test_assignment_dict()
28184370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
28284370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
28384370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
28484370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
28574fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
28684370087SBram Moolenaar
287f5be8cdbSBram Moolenaar  # overwrite
288c785b9a7SBram Moolenaar  dict3['key'] = 'another'
289c785b9a7SBram Moolenaar
29058626872SBram Moolenaar  # empty key can be used
29158626872SBram Moolenaar  let dd = {}
29258626872SBram Moolenaar  dd[""] = 6
29358626872SBram Moolenaar  assert_equal({'': 6}, dd)
29484370087SBram Moolenaar
29584370087SBram Moolenaar  # type becomes dict<any>
29684370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
2978e4c8c85SBram Moolenaar
2988e4c8c85SBram Moolenaar  # assignment to script-local dict
2998e4c8c85SBram Moolenaar  let lines =<< trim END
3008e4c8c85SBram Moolenaar    vim9script
3018e4c8c85SBram Moolenaar    let test: dict<any> = {}
3028e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3038e4c8c85SBram Moolenaar      test['a'] = 43
3048e4c8c85SBram Moolenaar      return test
3058e4c8c85SBram Moolenaar    enddef
3068e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3078e4c8c85SBram Moolenaar  END
3088e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3098e4c8c85SBram Moolenaar
3108e4c8c85SBram Moolenaar  lines =<< trim END
3118e4c8c85SBram Moolenaar    vim9script
3128e4c8c85SBram Moolenaar    let test: dict<any>
3138e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3148e4c8c85SBram Moolenaar      test['a'] = 43
3158e4c8c85SBram Moolenaar      return test
3168e4c8c85SBram Moolenaar    enddef
3178e4c8c85SBram Moolenaar    FillDict()
3188e4c8c85SBram Moolenaar  END
3198e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3202caa1594SBram Moolenaar
3212caa1594SBram Moolenaar  # assignment to global dict
3222caa1594SBram Moolenaar  lines =<< trim END
3232caa1594SBram Moolenaar    vim9script
3242caa1594SBram Moolenaar    g:test = {}
3252caa1594SBram Moolenaar    def FillDict(): dict<any>
3262caa1594SBram Moolenaar      g:test['a'] = 43
3272caa1594SBram Moolenaar      return g:test
3282caa1594SBram Moolenaar    enddef
3292caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3302caa1594SBram Moolenaar  END
3312caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3322caa1594SBram Moolenaar
3332caa1594SBram Moolenaar  # assignment to buffer dict
3342caa1594SBram Moolenaar  lines =<< trim END
3352caa1594SBram Moolenaar    vim9script
3362caa1594SBram Moolenaar    b:test = {}
3372caa1594SBram Moolenaar    def FillDict(): dict<any>
3382caa1594SBram Moolenaar      b:test['a'] = 43
3392caa1594SBram Moolenaar      return b:test
3402caa1594SBram Moolenaar    enddef
3412caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3422caa1594SBram Moolenaar  END
3432caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
34484370087SBram Moolenaarenddef
34584370087SBram Moolenaar
346d3aac291SBram Moolenaardef Test_assignment_local()
347f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
348f5be8cdbSBram Moolenaar  # changed.
349d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
350d3aac291SBram Moolenaar    let b:existing = 'yes'
351d3aac291SBram Moolenaar    let w:existing = 'yes'
352d3aac291SBram Moolenaar    let t:existing = 'yes'
353d3aac291SBram Moolenaar
354d3aac291SBram Moolenaar    def Test_assignment_local_internal()
355d3aac291SBram Moolenaar      b:newvar = 'new'
356d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
357d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
358d3aac291SBram Moolenaar      b:existing = 'no'
359d3aac291SBram Moolenaar      assert_equal('no', b:existing)
360396f3138SBram Moolenaar      b:existing ..= 'NO'
361396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
362d3aac291SBram Moolenaar
363d3aac291SBram Moolenaar      w:newvar = 'new'
364d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
365d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
366d3aac291SBram Moolenaar      w:existing = 'no'
367d3aac291SBram Moolenaar      assert_equal('no', w:existing)
368396f3138SBram Moolenaar      w:existing ..= 'NO'
369396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
370d3aac291SBram Moolenaar
371d3aac291SBram Moolenaar      t:newvar = 'new'
372d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
373d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
374d3aac291SBram Moolenaar      t:existing = 'no'
375d3aac291SBram Moolenaar      assert_equal('no', t:existing)
376396f3138SBram Moolenaar      t:existing ..= 'NO'
377396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
378d3aac291SBram Moolenaar    enddef
379d3aac291SBram Moolenaar    call Test_assignment_local_internal()
380d3aac291SBram Moolenaar  END
381d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
382d3aac291SBram Moolenaarenddef
383d3aac291SBram Moolenaar
3845deeb3f1SBram Moolenaardef Test_assignment_default()
385e69f6d04SBram Moolenaar
386cb711abfSBram Moolenaar  # Test default values.
387e69f6d04SBram Moolenaar  let thebool: bool
388e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
389e69f6d04SBram Moolenaar
390e69f6d04SBram Moolenaar  let thenumber: number
391e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
392e69f6d04SBram Moolenaar
393e69f6d04SBram Moolenaar  if has('float')
394e69f6d04SBram Moolenaar    let thefloat: float
395e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
396e69f6d04SBram Moolenaar  endif
397e69f6d04SBram Moolenaar
398e69f6d04SBram Moolenaar  let thestring: string
399e69f6d04SBram Moolenaar  assert_equal('', thestring)
400e69f6d04SBram Moolenaar
401e69f6d04SBram Moolenaar  let theblob: blob
402e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
403e69f6d04SBram Moolenaar
4045deeb3f1SBram Moolenaar  let Thefunc: func
4055deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
406e69f6d04SBram Moolenaar
407e69f6d04SBram Moolenaar  let thelist: list<any>
408e69f6d04SBram Moolenaar  assert_equal([], thelist)
409e69f6d04SBram Moolenaar
410e69f6d04SBram Moolenaar  let thedict: dict<any>
411e69f6d04SBram Moolenaar  assert_equal({}, thedict)
412e69f6d04SBram Moolenaar
4132c869deeSBram Moolenaar  if has('channel')
414e69f6d04SBram Moolenaar    let thejob: job
415e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
416e69f6d04SBram Moolenaar
417e69f6d04SBram Moolenaar    let thechannel: channel
418e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
419c785b9a7SBram Moolenaar
420c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
421f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
422c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
423c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
424c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
425c785b9a7SBram Moolenaar    endif
4262c869deeSBram Moolenaar  endif
427585fea7bSBram Moolenaar
428585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
429585fea7bSBram Moolenaar  assert_equal(5678, nr)
4308a7d6542SBram Moolenaarenddef
4318a7d6542SBram Moolenaar
43247a519a9SBram Moolenaardef Test_assignment_var_list()
43347a519a9SBram Moolenaar  let v1: string
43447a519a9SBram Moolenaar  let v2: string
4359af78769SBram Moolenaar  let vrem: list<string>
4369af78769SBram Moolenaar  [v1] = ['aaa']
4379af78769SBram Moolenaar  assert_equal('aaa', v1)
4389af78769SBram Moolenaar
43947a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
44047a519a9SBram Moolenaar  assert_equal('one', v1)
44147a519a9SBram Moolenaar  assert_equal('two', v2)
4429af78769SBram Moolenaar
4439af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4449af78769SBram Moolenaar  assert_equal('one', v1)
4459af78769SBram Moolenaar  assert_equal('two', v2)
4469af78769SBram Moolenaar  assert_equal([], vrem)
4479af78769SBram Moolenaar
4489af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4499af78769SBram Moolenaar  assert_equal('one', v1)
4509af78769SBram Moolenaar  assert_equal('two', v2)
4519af78769SBram Moolenaar  assert_equal(['three'], vrem)
4521c199f9cSBram Moolenaar
4531c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4541c199f9cSBram Moolenaar  assert_equal(3, &ts)
4551c199f9cSBram Moolenaar  assert_equal(4, &sw)
4561c199f9cSBram Moolenaar  set ts=8 sw=4
45747a519a9SBram Moolenaarenddef
45847a519a9SBram Moolenaar
459c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
460c7e44a7eSBram Moolenaar  let lines =<< trim END
461c7e44a7eSBram Moolenaar    vim9script
462c7e44a7eSBram Moolenaar    def Func(): list<number>
463c7e44a7eSBram Moolenaar      return [1, 2]
464c7e44a7eSBram Moolenaar    enddef
465c7e44a7eSBram Moolenaar    let var1: number
466c7e44a7eSBram Moolenaar    let var2: number
467c7e44a7eSBram Moolenaar    [var1, var2] =
468c7e44a7eSBram Moolenaar          Func()
469c7e44a7eSBram Moolenaar    assert_equal(1, var1)
470c7e44a7eSBram Moolenaar    assert_equal(2, var2)
471c7e44a7eSBram Moolenaar    let ll =
472c7e44a7eSBram Moolenaar          Func()
473c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
47483144546SBram Moolenaar
47583144546SBram Moolenaar    @/ = 'text'
47683144546SBram Moolenaar    assert_equal('text', @/)
47783144546SBram Moolenaar    @0 = 'zero'
47883144546SBram Moolenaar    assert_equal('zero', @0)
47983144546SBram Moolenaar    @1 = 'one'
48083144546SBram Moolenaar    assert_equal('one', @1)
48183144546SBram Moolenaar    @9 = 'nine'
48283144546SBram Moolenaar    assert_equal('nine', @9)
48383144546SBram Moolenaar    @- = 'minus'
48483144546SBram Moolenaar    assert_equal('minus', @-)
48583144546SBram Moolenaar    if has('clipboard_working')
48683144546SBram Moolenaar      @* = 'star'
48783144546SBram Moolenaar      assert_equal('star', @*)
48883144546SBram Moolenaar      @+ = 'plus'
48983144546SBram Moolenaar      assert_equal('plus', @+)
49083144546SBram Moolenaar    endif
49195dd9f25SBram Moolenaar
49295dd9f25SBram Moolenaar    let a: number = 123
49395dd9f25SBram Moolenaar    assert_equal(123, a)
49495dd9f25SBram Moolenaar    let s: string = 'yes'
49595dd9f25SBram Moolenaar    assert_equal('yes', s)
49695dd9f25SBram Moolenaar    let b: number = 42
49795dd9f25SBram Moolenaar    assert_equal(42, b)
49895dd9f25SBram Moolenaar    let w: number = 43
49995dd9f25SBram Moolenaar    assert_equal(43, w)
50095dd9f25SBram Moolenaar    let t: number = 44
50195dd9f25SBram Moolenaar    assert_equal(44, t)
502c7e44a7eSBram Moolenaar  END
503c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
504c7e44a7eSBram Moolenaarenddef
505c7e44a7eSBram Moolenaar
506cab27678SBram Moolenaardef Mess(): string
507cab27678SBram Moolenaar  v:foldstart = 123
508cab27678SBram Moolenaar  return 'xxx'
509cab27678SBram Moolenaarenddef
510cab27678SBram Moolenaar
511d72c1bf0SBram Moolenaardef Test_assignment_failure()
5128a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
5138a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
5148a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
5158a7d6542SBram Moolenaar
51663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
51763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
51863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
51963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
52063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
52163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
52263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
52363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
52463be3d4bSBram Moolenaar
5258a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5268a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5278a7d6542SBram Moolenaar
5289b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5299af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5309af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5319af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5329af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5339af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5349af78769SBram Moolenaar                            'let y: number',
5359af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5369af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5379af78769SBram Moolenaar                            'let y: number',
5389af78769SBram Moolenaar                            'let z: list<number>',
5399af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5409be61bbbSBram Moolenaar
541e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
542c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5439be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
544c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5459be61bbbSBram Moolenaar
546e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
547c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5489be61bbbSBram Moolenaar
549434d72cbSBram Moolenaar  if has('dnd')
55065821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
551434d72cbSBram Moolenaar  else
552434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
553434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
554434d72cbSBram Moolenaar  endif
5559be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
55665821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
557c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5589be61bbbSBram Moolenaar
559e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
560e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
561e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
562e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5639be61bbbSBram Moolenaar
5649be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5659be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5669be61bbbSBram Moolenaar
567451c2e35SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
56833fa29cfSBram Moolenaar
5698a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5708a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5718a7d6542SBram Moolenaar
5728a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5738a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5748a7d6542SBram Moolenaar
5758a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5768a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
57742a480bfSBram Moolenaar
578d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
57942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
580cab27678SBram Moolenaar
581cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
582cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
58343e969d3SBram Moolenaar
58443e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
58543e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
58643e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
58743e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
58843e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
58943e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
59043e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
59143e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
592d72c1bf0SBram Moolenaarenddef
593d72c1bf0SBram Moolenaar
594d72c1bf0SBram Moolenaardef Test_unlet()
595d72c1bf0SBram Moolenaar  g:somevar = 'yes'
596d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
597d72c1bf0SBram Moolenaar  unlet g:somevar
598d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
599d72c1bf0SBram Moolenaar  unlet! g:somevar
600d72c1bf0SBram Moolenaar
601d72c1bf0SBram Moolenaar  call CheckScriptFailure([
602d72c1bf0SBram Moolenaar        'vim9script',
603d72c1bf0SBram Moolenaar        'let svar = 123',
604d72c1bf0SBram Moolenaar        'unlet svar',
605d72c1bf0SBram Moolenaar        ], 'E1081:')
606d72c1bf0SBram Moolenaar  call CheckScriptFailure([
607d72c1bf0SBram Moolenaar        'vim9script',
608d72c1bf0SBram Moolenaar        'let svar = 123',
609d72c1bf0SBram Moolenaar        'unlet s:svar',
610d72c1bf0SBram Moolenaar        ], 'E1081:')
611d72c1bf0SBram Moolenaar  call CheckScriptFailure([
612d72c1bf0SBram Moolenaar        'vim9script',
613d72c1bf0SBram Moolenaar        'let svar = 123',
614d72c1bf0SBram Moolenaar        'def Func()',
615d72c1bf0SBram Moolenaar        '  unlet svar',
616d72c1bf0SBram Moolenaar        'enddef',
617822ba247SBram Moolenaar        'defcompile',
618d72c1bf0SBram Moolenaar        ], 'E1081:')
619d72c1bf0SBram Moolenaar  call CheckScriptFailure([
620d72c1bf0SBram Moolenaar        'vim9script',
621d72c1bf0SBram Moolenaar        'let svar = 123',
622d72c1bf0SBram Moolenaar        'def Func()',
623d72c1bf0SBram Moolenaar        '  unlet s:svar',
624d72c1bf0SBram Moolenaar        'enddef',
625822ba247SBram Moolenaar        'defcompile',
626d72c1bf0SBram Moolenaar        ], 'E1081:')
6277bdaea6eSBram Moolenaar
6287bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6297bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6307bdaea6eSBram Moolenaar  unlet $ENVVAR
6317bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
632d72c1bf0SBram Moolenaarenddef
633599c89c8SBram Moolenaar
6344c17ad94SBram Moolenaardef Test_delfunction()
635f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6364c17ad94SBram Moolenaar  CheckScriptSuccess([
6374c17ad94SBram Moolenaar      'vim9script',
6384c17ad94SBram Moolenaar      'func CheckMe()',
6394c17ad94SBram Moolenaar      '  return 123',
6404c17ad94SBram Moolenaar      'endfunc',
6414c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6424c17ad94SBram Moolenaar      ])
6434c17ad94SBram Moolenaar
644f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6454c17ad94SBram Moolenaar  CheckScriptFailure([
6464c17ad94SBram Moolenaar      'vim9script',
6474c17ad94SBram Moolenaar      'func DeleteMe1()',
6484c17ad94SBram Moolenaar      'endfunc',
6494c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6504c17ad94SBram Moolenaar      ], 'E1084:')
6514c17ad94SBram Moolenaar  CheckScriptFailure([
6524c17ad94SBram Moolenaar      'vim9script',
6534c17ad94SBram Moolenaar      'func DeleteMe2()',
6544c17ad94SBram Moolenaar      'endfunc',
6554c17ad94SBram Moolenaar      'def DoThat()',
6564c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6574c17ad94SBram Moolenaar      'enddef',
6584c17ad94SBram Moolenaar      'DoThat()',
6594c17ad94SBram Moolenaar      ], 'E1084:')
6604c17ad94SBram Moolenaar  CheckScriptFailure([
6614c17ad94SBram Moolenaar      'vim9script',
6624c17ad94SBram Moolenaar      'def DeleteMe3()',
6634c17ad94SBram Moolenaar      'enddef',
6644c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6654c17ad94SBram Moolenaar      ], 'E1084:')
6664c17ad94SBram Moolenaar  CheckScriptFailure([
6674c17ad94SBram Moolenaar      'vim9script',
6684c17ad94SBram Moolenaar      'def DeleteMe4()',
6694c17ad94SBram Moolenaar      'enddef',
6704c17ad94SBram Moolenaar      'def DoThat()',
6714c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6724c17ad94SBram Moolenaar      'enddef',
6734c17ad94SBram Moolenaar      'DoThat()',
6744c17ad94SBram Moolenaar      ], 'E1084:')
675925e9fd6SBram Moolenaar
676925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
677925e9fd6SBram Moolenaar  let lines =<< trim END
678925e9fd6SBram Moolenaar      vim9script
679925e9fd6SBram Moolenaar      def g:Global(): string
680925e9fd6SBram Moolenaar        return "yes"
681925e9fd6SBram Moolenaar      enddef
682925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
683925e9fd6SBram Moolenaar      def! g:Global(): string
684925e9fd6SBram Moolenaar        return "no"
685925e9fd6SBram Moolenaar      enddef
686925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
687925e9fd6SBram Moolenaar      delfunc g:Global
688925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
689925e9fd6SBram Moolenaar  END
690925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
691925e9fd6SBram Moolenaar
692925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
693925e9fd6SBram Moolenaar  lines =<< trim END
694925e9fd6SBram Moolenaar      vim9script
695925e9fd6SBram Moolenaar      func g:Global()
696925e9fd6SBram Moolenaar        return "yes"
697925e9fd6SBram Moolenaar      endfunc
698925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
699925e9fd6SBram Moolenaar      def! g:Global(): string
700925e9fd6SBram Moolenaar        return "no"
701925e9fd6SBram Moolenaar      enddef
702925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
703925e9fd6SBram Moolenaar      delfunc g:Global
704925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
705925e9fd6SBram Moolenaar  END
706925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
707925e9fd6SBram Moolenaar
708925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
709925e9fd6SBram Moolenaar  lines =<< trim END
710925e9fd6SBram Moolenaar      vim9script
711925e9fd6SBram Moolenaar      def g:Global(): string
712925e9fd6SBram Moolenaar        return "yes"
713925e9fd6SBram Moolenaar      enddef
714925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
715925e9fd6SBram Moolenaar      func! g:Global()
716925e9fd6SBram Moolenaar        return "no"
717925e9fd6SBram Moolenaar      endfunc
718925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
719925e9fd6SBram Moolenaar      delfunc g:Global
720925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
721925e9fd6SBram Moolenaar  END
722925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7234c17ad94SBram Moolenaarenddef
7244c17ad94SBram Moolenaar
725599c89c8SBram Moolenaarfunc Test_wrong_type()
726599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
727599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
728599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
729599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
730599c89c8SBram Moolenaar
731599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
732599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
73342a480bfSBram Moolenaar
73442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
73542a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
73642a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
73742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
73842a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
73942a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
74042a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
74142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
74242a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
74342a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
74442a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
745a0a9f43aSBram Moolenaar
746a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
747a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7488a7d6542SBram Moolenaarendfunc
7498a7d6542SBram Moolenaar
7508a7d6542SBram Moolenaarfunc Test_const()
7518a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7528a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7538a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7549be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7558a7d6542SBram Moolenaarendfunc
7568a7d6542SBram Moolenaar
757df069eecSBram Moolenaardef Test_range_no_colon()
758df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
759df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
760df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
761df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
762df069eecSBram Moolenaarenddef
763df069eecSBram Moolenaar
764df069eecSBram Moolenaar
7658a7d6542SBram Moolenaardef Test_block()
7668a7d6542SBram Moolenaar  let outer = 1
7678a7d6542SBram Moolenaar  {
7688a7d6542SBram Moolenaar    let inner = 2
7698a7d6542SBram Moolenaar    assert_equal(1, outer)
7708a7d6542SBram Moolenaar    assert_equal(2, inner)
7718a7d6542SBram Moolenaar  }
7728a7d6542SBram Moolenaar  assert_equal(1, outer)
7738a7d6542SBram Moolenaarenddef
7748a7d6542SBram Moolenaar
7758a7d6542SBram Moolenaarfunc Test_block_failure()
7768a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
777585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
778585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7798a7d6542SBram Moolenaarendfunc
7808a7d6542SBram Moolenaar
781d032f34aSBram Moolenaarfunc g:NoSuchFunc()
782d032f34aSBram Moolenaar  echo 'none'
783d032f34aSBram Moolenaarendfunc
784d032f34aSBram Moolenaar
7858a7d6542SBram Moolenaardef Test_try_catch()
7868a7d6542SBram Moolenaar  let l = []
7877a092245SBram Moolenaar  try # comment
7888a7d6542SBram Moolenaar    add(l, '1')
7898a7d6542SBram Moolenaar    throw 'wrong'
7908a7d6542SBram Moolenaar    add(l, '2')
7917a092245SBram Moolenaar  catch # comment
7928a7d6542SBram Moolenaar    add(l, v:exception)
7937a092245SBram Moolenaar  finally # comment
7948a7d6542SBram Moolenaar    add(l, '3')
7957a092245SBram Moolenaar  endtry # comment
7968a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
79768d130c6SBram Moolenaar
798e859312eSBram Moolenaar  l = []
799e859312eSBram Moolenaar  try
800e859312eSBram Moolenaar    try
801e859312eSBram Moolenaar      add(l, '1')
802e859312eSBram Moolenaar      throw 'wrong'
803e859312eSBram Moolenaar      add(l, '2')
804e859312eSBram Moolenaar    catch /right/
805e859312eSBram Moolenaar      add(l, v:exception)
806e859312eSBram Moolenaar    endtry
807e859312eSBram Moolenaar  catch /wrong/
808e859312eSBram Moolenaar    add(l, 'caught')
809e859312eSBram Moolenaar  finally
810e859312eSBram Moolenaar    add(l, 'finally')
811e859312eSBram Moolenaar  endtry
812e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
813e859312eSBram Moolenaar
81468d130c6SBram Moolenaar  let n: number
81568d130c6SBram Moolenaar  try
81668d130c6SBram Moolenaar    n = l[3]
81768d130c6SBram Moolenaar  catch /E684:/
81868d130c6SBram Moolenaar    n = 99
81968d130c6SBram Moolenaar  endtry
82068d130c6SBram Moolenaar  assert_equal(99, n)
82168d130c6SBram Moolenaar
82268d130c6SBram Moolenaar  try
823cc673e74SBram Moolenaar    # string slice returns a string, not a number
82468d130c6SBram Moolenaar    n = g:astring[3]
82556acb094SBram Moolenaar  catch /E1029:/
82668d130c6SBram Moolenaar    n = 77
82768d130c6SBram Moolenaar  endtry
82868d130c6SBram Moolenaar  assert_equal(77, n)
82968d130c6SBram Moolenaar
83068d130c6SBram Moolenaar  try
83168d130c6SBram Moolenaar    n = l[g:astring]
83256acb094SBram Moolenaar  catch /E1029:/
83356acb094SBram Moolenaar    n = 88
83468d130c6SBram Moolenaar  endtry
83556acb094SBram Moolenaar  assert_equal(88, n)
83668d130c6SBram Moolenaar
83768d130c6SBram Moolenaar  try
83868d130c6SBram Moolenaar    n = s:does_not_exist
83968d130c6SBram Moolenaar  catch /E121:/
840f0b9f43cSBram Moolenaar    n = 111
841f0b9f43cSBram Moolenaar  endtry
842f0b9f43cSBram Moolenaar  assert_equal(111, n)
843f0b9f43cSBram Moolenaar
844f0b9f43cSBram Moolenaar  try
845f0b9f43cSBram Moolenaar    n = g:does_not_exist
846f0b9f43cSBram Moolenaar  catch /E121:/
84768d130c6SBram Moolenaar    n = 121
84868d130c6SBram Moolenaar  endtry
84968d130c6SBram Moolenaar  assert_equal(121, n)
85068d130c6SBram Moolenaar
85168d130c6SBram Moolenaar  let d = #{one: 1}
85268d130c6SBram Moolenaar  try
85368d130c6SBram Moolenaar    n = d[g:astring]
85468d130c6SBram Moolenaar  catch /E716:/
85568d130c6SBram Moolenaar    n = 222
85668d130c6SBram Moolenaar  endtry
85768d130c6SBram Moolenaar  assert_equal(222, n)
858f0b9f43cSBram Moolenaar
859f0b9f43cSBram Moolenaar  try
860f0b9f43cSBram Moolenaar    n = -g:astring
861f0b9f43cSBram Moolenaar  catch /E39:/
862f0b9f43cSBram Moolenaar    n = 233
863f0b9f43cSBram Moolenaar  endtry
864f0b9f43cSBram Moolenaar  assert_equal(233, n)
865f0b9f43cSBram Moolenaar
866f0b9f43cSBram Moolenaar  try
867f0b9f43cSBram Moolenaar    n = +g:astring
868f0b9f43cSBram Moolenaar  catch /E1030:/
869f0b9f43cSBram Moolenaar    n = 244
870f0b9f43cSBram Moolenaar  endtry
871f0b9f43cSBram Moolenaar  assert_equal(244, n)
872f0b9f43cSBram Moolenaar
873f0b9f43cSBram Moolenaar  try
874f0b9f43cSBram Moolenaar    n = +g:alist
875f0b9f43cSBram Moolenaar  catch /E745:/
876f0b9f43cSBram Moolenaar    n = 255
877f0b9f43cSBram Moolenaar  endtry
878f0b9f43cSBram Moolenaar  assert_equal(255, n)
879f0b9f43cSBram Moolenaar
880f0b9f43cSBram Moolenaar  let nd: dict<any>
881f0b9f43cSBram Moolenaar  try
882f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
883f0b9f43cSBram Moolenaar  catch /E1029:/
884f0b9f43cSBram Moolenaar    n = 266
885f0b9f43cSBram Moolenaar  endtry
886f0b9f43cSBram Moolenaar  assert_equal(266, n)
887f0b9f43cSBram Moolenaar
888f0b9f43cSBram Moolenaar  try
889f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
890f0b9f43cSBram Moolenaar  catch /E1093:/
891f0b9f43cSBram Moolenaar    n = 277
892f0b9f43cSBram Moolenaar  endtry
893f0b9f43cSBram Moolenaar  assert_equal(277, n)
894f0b9f43cSBram Moolenaar
895e859312eSBram Moolenaar  try
896e859312eSBram Moolenaar    &ts = g:astring
897e859312eSBram Moolenaar  catch /E1029:/
898e859312eSBram Moolenaar    n = 288
899e859312eSBram Moolenaar  endtry
900e859312eSBram Moolenaar  assert_equal(288, n)
901e859312eSBram Moolenaar
902e859312eSBram Moolenaar  try
903e859312eSBram Moolenaar    &backspace = 'asdf'
904e859312eSBram Moolenaar  catch /E474:/
905e859312eSBram Moolenaar    n = 299
906e859312eSBram Moolenaar  endtry
907e859312eSBram Moolenaar  assert_equal(299, n)
908e859312eSBram Moolenaar
909e859312eSBram Moolenaar  l = [1]
910e859312eSBram Moolenaar  try
911e859312eSBram Moolenaar    l[3] = 3
912e859312eSBram Moolenaar  catch /E684:/
913e859312eSBram Moolenaar    n = 300
914e859312eSBram Moolenaar  endtry
915e859312eSBram Moolenaar  assert_equal(300, n)
916e859312eSBram Moolenaar
917e859312eSBram Moolenaar  try
918e859312eSBram Moolenaar    unlet g:does_not_exist
919e859312eSBram Moolenaar  catch /E108:/
920e859312eSBram Moolenaar    n = 322
921e859312eSBram Moolenaar  endtry
922e859312eSBram Moolenaar  assert_equal(322, n)
923e859312eSBram Moolenaar
924e859312eSBram Moolenaar  try
925e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
926e859312eSBram Moolenaar  catch /E721:/
927e859312eSBram Moolenaar    n = 333
928e859312eSBram Moolenaar  endtry
929e859312eSBram Moolenaar  assert_equal(333, n)
930e859312eSBram Moolenaar
931e859312eSBram Moolenaar  try
932e859312eSBram Moolenaar    l = DeletedFunc()
933e859312eSBram Moolenaar  catch /E933:/
934e859312eSBram Moolenaar    n = 344
935e859312eSBram Moolenaar  endtry
936e859312eSBram Moolenaar  assert_equal(344, n)
937d032f34aSBram Moolenaar
938d032f34aSBram Moolenaar  try
939d032f34aSBram Moolenaar    echo len(v:true)
940d032f34aSBram Moolenaar  catch /E701:/
941d032f34aSBram Moolenaar    n = 355
942d032f34aSBram Moolenaar  endtry
943d032f34aSBram Moolenaar  assert_equal(355, n)
944d032f34aSBram Moolenaar
945d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
946d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
947d032f34aSBram Moolenaar  try
948d032f34aSBram Moolenaar    echo P()
949d032f34aSBram Moolenaar  catch /E117:/
950d032f34aSBram Moolenaar    n = 366
951d032f34aSBram Moolenaar  endtry
952d032f34aSBram Moolenaar  assert_equal(366, n)
953d032f34aSBram Moolenaar
954d032f34aSBram Moolenaar  try
955d032f34aSBram Moolenaar    echo g:NoSuchFunc()
956d032f34aSBram Moolenaar  catch /E117:/
957d032f34aSBram Moolenaar    n = 377
958d032f34aSBram Moolenaar  endtry
959d032f34aSBram Moolenaar  assert_equal(377, n)
960d032f34aSBram Moolenaar
961d032f34aSBram Moolenaar  try
962d032f34aSBram Moolenaar    echo g:alist + 4
963d032f34aSBram Moolenaar  catch /E745:/
964d032f34aSBram Moolenaar    n = 388
965d032f34aSBram Moolenaar  endtry
966d032f34aSBram Moolenaar  assert_equal(388, n)
967d032f34aSBram Moolenaar
968d032f34aSBram Moolenaar  try
969d032f34aSBram Moolenaar    echo 4 + g:alist
970d032f34aSBram Moolenaar  catch /E745:/
971d032f34aSBram Moolenaar    n = 399
972d032f34aSBram Moolenaar  endtry
973d032f34aSBram Moolenaar  assert_equal(399, n)
974d032f34aSBram Moolenaar
975d032f34aSBram Moolenaar  try
976d032f34aSBram Moolenaar    echo g:alist.member
977d032f34aSBram Moolenaar  catch /E715:/
978d032f34aSBram Moolenaar    n = 400
979d032f34aSBram Moolenaar  endtry
980d032f34aSBram Moolenaar  assert_equal(400, n)
981d032f34aSBram Moolenaar
982d032f34aSBram Moolenaar  try
983d032f34aSBram Moolenaar    echo d.member
984d032f34aSBram Moolenaar  catch /E716:/
985d032f34aSBram Moolenaar    n = 411
986d032f34aSBram Moolenaar  endtry
987d032f34aSBram Moolenaar  assert_equal(411, n)
9888a7d6542SBram Moolenaarenddef
9898a7d6542SBram Moolenaar
990e859312eSBram Moolenaardef DeletedFunc(): list<any>
991e859312eSBram Moolenaar  return ['delete me']
992e859312eSBram Moolenaarenddef
993e859312eSBram Moolenaardefcompile
994e859312eSBram Moolenaardelfunc DeletedFunc
995e859312eSBram Moolenaar
996257cc5eeSBram Moolenaardef ThrowFromDef()
997a72cfb80SBram Moolenaar  throw "getout" # comment
998257cc5eeSBram Moolenaarenddef
999257cc5eeSBram Moolenaar
1000257cc5eeSBram Moolenaarfunc CatchInFunc()
1001257cc5eeSBram Moolenaar  try
1002257cc5eeSBram Moolenaar    call ThrowFromDef()
1003257cc5eeSBram Moolenaar  catch
1004257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1005257cc5eeSBram Moolenaar  endtry
1006257cc5eeSBram Moolenaarendfunc
1007257cc5eeSBram Moolenaar
1008257cc5eeSBram Moolenaardef CatchInDef()
1009257cc5eeSBram Moolenaar  try
1010257cc5eeSBram Moolenaar    ThrowFromDef()
1011257cc5eeSBram Moolenaar  catch
1012257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1013257cc5eeSBram Moolenaar  endtry
1014257cc5eeSBram Moolenaarenddef
1015257cc5eeSBram Moolenaar
1016f575adffSBram Moolenaardef ReturnFinally(): string
1017f575adffSBram Moolenaar  try
1018f575adffSBram Moolenaar    return 'intry'
1019f575adffSBram Moolenaar  finally
1020f575adffSBram Moolenaar    g:in_finally = 'finally'
1021f575adffSBram Moolenaar  endtry
1022f575adffSBram Moolenaar  return 'end'
1023f575adffSBram Moolenaarenddef
1024f575adffSBram Moolenaar
1025257cc5eeSBram Moolenaardef Test_try_catch_nested()
1026257cc5eeSBram Moolenaar  CatchInFunc()
1027257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1028257cc5eeSBram Moolenaar
1029257cc5eeSBram Moolenaar  CatchInDef()
1030257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1031f575adffSBram Moolenaar
1032f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1033f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1034f575adffSBram Moolenaarenddef
1035f575adffSBram Moolenaar
1036f575adffSBram Moolenaardef Test_try_catch_match()
1037f575adffSBram Moolenaar  let seq = 'a'
1038f575adffSBram Moolenaar  try
1039f575adffSBram Moolenaar    throw 'something'
1040f575adffSBram Moolenaar  catch /nothing/
1041f575adffSBram Moolenaar    seq ..= 'x'
1042f575adffSBram Moolenaar  catch /some/
1043f575adffSBram Moolenaar    seq ..= 'b'
1044f575adffSBram Moolenaar  catch /asdf/
1045f575adffSBram Moolenaar    seq ..= 'x'
1046e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1047e8c4abbbSBram Moolenaar    seq ..= 'y'
1048f575adffSBram Moolenaar  finally
1049f575adffSBram Moolenaar    seq ..= 'c'
1050f575adffSBram Moolenaar  endtry
1051f575adffSBram Moolenaar  assert_equal('abc', seq)
1052257cc5eeSBram Moolenaarenddef
1053257cc5eeSBram Moolenaar
1054e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1055e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1056e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1057e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1058585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1059585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1060585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1061585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1062585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1063585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1064585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1065585fea7bSBram Moolenaar
1066a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1067585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1068e8c4abbbSBram Moolenaarenddef
1069e8c4abbbSBram Moolenaar
1070006ad48bSBram Moolenaardef Test_throw_vimscript()
1071f5be8cdbSBram Moolenaar  # only checks line continuation
1072006ad48bSBram Moolenaar  let lines =<< trim END
1073006ad48bSBram Moolenaar      vim9script
1074006ad48bSBram Moolenaar      try
1075006ad48bSBram Moolenaar        throw 'one'
1076006ad48bSBram Moolenaar              .. 'two'
1077006ad48bSBram Moolenaar      catch
1078006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1079006ad48bSBram Moolenaar      endtry
1080006ad48bSBram Moolenaar  END
1081006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1082006ad48bSBram Moolenaarenddef
1083006ad48bSBram Moolenaar
1084ed677f55SBram Moolenaardef Test_error_in_nested_function()
1085ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1086ed677f55SBram Moolenaar  let lines =<< trim END
1087ed677f55SBram Moolenaar      vim9script
1088ed677f55SBram Moolenaar      def Func()
1089ed677f55SBram Moolenaar        Error()
1090ed677f55SBram Moolenaar        g:test_var = 1
1091ed677f55SBram Moolenaar      enddef
1092ed677f55SBram Moolenaar      func Error() abort
1093ed677f55SBram Moolenaar        eval [][0]
1094ed677f55SBram Moolenaar      endfunc
1095ed677f55SBram Moolenaar      Func()
1096ed677f55SBram Moolenaar  END
1097ed677f55SBram Moolenaar  g:test_var = 0
1098ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1099ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1100ed677f55SBram Moolenaarenddef
1101ed677f55SBram Moolenaar
110237c83711SBram Moolenaardef Test_cexpr_vimscript()
1103f5be8cdbSBram Moolenaar  # only checks line continuation
110437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
110537c83711SBram Moolenaar  let lines =<< trim END
110637c83711SBram Moolenaar      vim9script
110737c83711SBram Moolenaar      cexpr 'File'
110837c83711SBram Moolenaar                .. ' someFile' ..
110937c83711SBram Moolenaar                   ' line 19'
111037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
111137c83711SBram Moolenaar  END
111237c83711SBram Moolenaar  CheckScriptSuccess(lines)
111337c83711SBram Moolenaar  set errorformat&
111437c83711SBram Moolenaarenddef
111537c83711SBram Moolenaar
1116c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1117c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1118c9edd6b5SBram Moolenaar  let lines =<< trim END
1119c9edd6b5SBram Moolenaar      vim9script
1120c9edd6b5SBram Moolenaar      func g:Status()
1121c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1122c9edd6b5SBram Moolenaar      endfunc
1123c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1124c9edd6b5SBram Moolenaar      redrawstatus
1125c9edd6b5SBram Moolenaar      set laststatus statusline=
1126c9edd6b5SBram Moolenaar  END
1127c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1128c9edd6b5SBram Moolenaarenddef
1129c9edd6b5SBram Moolenaar
1130b209750bSBram Moolenaardef Test_list_vimscript()
1131b209750bSBram Moolenaar  # checks line continuation and comments
1132b209750bSBram Moolenaar  let lines =<< trim END
1133b209750bSBram Moolenaar      vim9script
1134b209750bSBram Moolenaar      let mylist = [
1135b209750bSBram Moolenaar            'one',
1136b209750bSBram Moolenaar            # comment
1137b209750bSBram Moolenaar            'two', # empty line follows
1138b209750bSBram Moolenaar
1139b209750bSBram Moolenaar            'three',
1140b209750bSBram Moolenaar            ]
1141b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1142b209750bSBram Moolenaar  END
1143b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1144b209750bSBram Moolenaarenddef
1145b209750bSBram Moolenaar
11462a1381c3SBram Moolenaarif has('channel')
114740ee466cSBram Moolenaar  let someJob = test_null_job()
114840ee466cSBram Moolenaar
114940ee466cSBram Moolenaar  def FuncWithError()
115040ee466cSBram Moolenaar    echomsg g:someJob
115140ee466cSBram Moolenaar  enddef
115240ee466cSBram Moolenaar
115340ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
115440ee466cSBram Moolenaar    try
115540ee466cSBram Moolenaar      call FuncWithError()
115640ee466cSBram Moolenaar    catch
115740ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
115840ee466cSBram Moolenaar    endtry
115940ee466cSBram Moolenaar  endfunc
11602a1381c3SBram Moolenaarendif
116140ee466cSBram Moolenaar
11628a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11638a7d6542SBram Moolenaar  vim9script
11648a7d6542SBram Moolenaar  let name: string = 'bob'
11658a7d6542SBram Moolenaar  def Concat(arg: string): string
11668a7d6542SBram Moolenaar    return name .. arg
11678a7d6542SBram Moolenaar  enddef
1168227a69deSBram Moolenaar  g:result = Concat('bie')
1169227a69deSBram Moolenaar  g:localname = name
11708a7d6542SBram Moolenaar
11718a7d6542SBram Moolenaar  export const CONST = 1234
11728a7d6542SBram Moolenaar  export let exported = 9876
11736e587dcbSBram Moolenaar  export let exp_name = 'John'
11748a7d6542SBram Moolenaar  export def Exported(): string
11758a7d6542SBram Moolenaar    return 'Exported'
11768a7d6542SBram Moolenaar  enddef
11778a7d6542SBram MoolenaarEND
11788a7d6542SBram Moolenaar
1179b3ca9824SBram Moolenaardef Undo_export_script_lines()
1180b3ca9824SBram Moolenaar  unlet g:result
1181b3ca9824SBram Moolenaar  unlet g:localname
1182b3ca9824SBram Moolenaarenddef
1183b3ca9824SBram Moolenaar
11845269bd2aSBram Moolenaardef Test_vim9_import_export()
11858a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11868a7d6542SBram Moolenaar    vim9script
11878a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11888a7d6542SBram Moolenaar    g:imported = exported
11896e587dcbSBram Moolenaar    exported += 3
11906e587dcbSBram Moolenaar    g:imported_added = exported
11918a7d6542SBram Moolenaar    g:imported_func = Exported()
11926e587dcbSBram Moolenaar
119340f4f7a4SBram Moolenaar    def GetExported(): string
119440f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
119540f4f7a4SBram Moolenaar      return local_dict.ref()
119640f4f7a4SBram Moolenaar    enddef
119740f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
119840f4f7a4SBram Moolenaar
11996e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12006e587dcbSBram Moolenaar    g:imported_name = exp_name
12016e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12026e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12035381c7a1SBram Moolenaar    g:imported_later = exported
12048a7d6542SBram Moolenaar  END
12058a7d6542SBram Moolenaar
12068a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12078a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12088a7d6542SBram Moolenaar
12098a7d6542SBram Moolenaar  source Ximport.vim
12108a7d6542SBram Moolenaar
12118a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12128a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12138a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12146e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12155381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12168a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
121740f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12186e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12196e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12208a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12218a7d6542SBram Moolenaar
1222b3ca9824SBram Moolenaar  Undo_export_script_lines()
12238a7d6542SBram Moolenaar  unlet g:imported
12246e587dcbSBram Moolenaar  unlet g:imported_added
12255381c7a1SBram Moolenaar  unlet g:imported_later
12268a7d6542SBram Moolenaar  unlet g:imported_func
12276e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12288a7d6542SBram Moolenaar  delete('Ximport.vim')
1229f2d5c240SBram Moolenaar
12301c991144SBram Moolenaar  # similar, with line breaks
12311c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12321c991144SBram Moolenaar    vim9script
12331c991144SBram Moolenaar    import {
12341c991144SBram Moolenaar        exported,
12351c991144SBram Moolenaar        Exported,
12361c991144SBram Moolenaar        }
12371c991144SBram Moolenaar        from
12381c991144SBram Moolenaar        './Xexport.vim'
12391c991144SBram Moolenaar    g:imported = exported
12401c991144SBram Moolenaar    exported += 5
12411c991144SBram Moolenaar    g:imported_added = exported
12421c991144SBram Moolenaar    g:imported_func = Exported()
12431c991144SBram Moolenaar  END
12441c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12451c991144SBram Moolenaar  source Ximport_lbr.vim
12461c991144SBram Moolenaar
12471c991144SBram Moolenaar  assert_equal(9876, g:imported)
12481c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12491c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12501c991144SBram Moolenaar
12511c991144SBram Moolenaar  # exported script not sourced again
12521c991144SBram Moolenaar  assert_false(exists('g:result'))
12531c991144SBram Moolenaar  unlet g:imported
12541c991144SBram Moolenaar  unlet g:imported_added
12551c991144SBram Moolenaar  unlet g:imported_func
12561c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12571c991144SBram Moolenaar
12581c991144SBram Moolenaar  # import inside :def function
12595381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
12605381c7a1SBram Moolenaar    vim9script
12615381c7a1SBram Moolenaar    def ImportInDef()
12625381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12635381c7a1SBram Moolenaar      g:imported = exported
12645381c7a1SBram Moolenaar      exported += 7
12655381c7a1SBram Moolenaar      g:imported_added = exported
12665381c7a1SBram Moolenaar    enddef
12675381c7a1SBram Moolenaar    ImportInDef()
12685381c7a1SBram Moolenaar  END
12695381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12705381c7a1SBram Moolenaar  source Ximport2.vim
1271f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12725381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12735381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12745381c7a1SBram Moolenaar  unlet g:imported
12755381c7a1SBram Moolenaar  unlet g:imported_added
12765381c7a1SBram Moolenaar  delete('Ximport2.vim')
12775381c7a1SBram Moolenaar
1278f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1279f2d5c240SBram Moolenaar    vim9script
1280f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1281f2d5c240SBram Moolenaar    def UseExport()
1282f2d5c240SBram Moolenaar      g:imported = Export.exported
1283f2d5c240SBram Moolenaar    enddef
1284f2d5c240SBram Moolenaar    UseExport()
1285f2d5c240SBram Moolenaar  END
1286f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1287f2d5c240SBram Moolenaar  source Ximport.vim
12885381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1289f2d5c240SBram Moolenaar
1290599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1291599c89c8SBram Moolenaar    vim9script
1292599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1293599c89c8SBram Moolenaar    def Func()
1294599c89c8SBram Moolenaar      let dummy = 1
1295599c89c8SBram Moolenaar      let imported = Export + dummy
1296599c89c8SBram Moolenaar    enddef
1297822ba247SBram Moolenaar    defcompile
1298599c89c8SBram Moolenaar  END
1299599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1300599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1301599c89c8SBram Moolenaar
1302599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1303599c89c8SBram Moolenaar    vim9script
1304599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1305599c89c8SBram Moolenaar    def Func()
1306599c89c8SBram Moolenaar      let imported = Export . exported
1307599c89c8SBram Moolenaar    enddef
1308822ba247SBram Moolenaar    defcompile
1309599c89c8SBram Moolenaar  END
1310599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1311599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1312599c89c8SBram Moolenaar
1313599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1314599c89c8SBram Moolenaar    vim9script
1315599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1316599c89c8SBram Moolenaar    def Func()
1317599c89c8SBram Moolenaar      let imported = Export.
1318599c89c8SBram Moolenaar    enddef
1319822ba247SBram Moolenaar    defcompile
1320599c89c8SBram Moolenaar  END
1321599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1322599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1323599c89c8SBram Moolenaar
13241c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13251c991144SBram Moolenaar    vim9script
13261c991144SBram Moolenaar    import *
13271c991144SBram Moolenaar        as Export
13281c991144SBram Moolenaar        from
13291c991144SBram Moolenaar        './Xexport.vim'
13301c991144SBram Moolenaar    def UseExport()
13311c991144SBram Moolenaar      g:imported = Export.exported
13321c991144SBram Moolenaar    enddef
13331c991144SBram Moolenaar    UseExport()
13341c991144SBram Moolenaar  END
13351c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13361c991144SBram Moolenaar  source Ximport.vim
13371c991144SBram Moolenaar  assert_equal(9883, g:imported)
13381c991144SBram Moolenaar
1339f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1340f2d5c240SBram Moolenaar    vim9script
1341f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1342f2d5c240SBram Moolenaar  END
1343f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1344f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1345f2d5c240SBram Moolenaar
1346f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1347fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1348fa29c8abSBram Moolenaar    vim9script
1349fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1350fa29c8abSBram Moolenaar  END
1351fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1352fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1353fa29c8abSBram Moolenaar
1354f5be8cdbSBram Moolenaar  # try to import something that is already defined
13555269bd2aSBram Moolenaar  let import_already_defined =<< trim END
13565269bd2aSBram Moolenaar    vim9script
13575269bd2aSBram Moolenaar    let exported = 'something'
13585269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13595269bd2aSBram Moolenaar  END
13605269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13615269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13625269bd2aSBram Moolenaar
1363f5be8cdbSBram Moolenaar  # try to import something that is already defined
13645269bd2aSBram Moolenaar  import_already_defined =<< trim END
13655269bd2aSBram Moolenaar    vim9script
13665269bd2aSBram Moolenaar    let exported = 'something'
13675269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13685269bd2aSBram Moolenaar  END
13695269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13705269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13715269bd2aSBram Moolenaar
1372f5be8cdbSBram Moolenaar  # try to import something that is already defined
13735269bd2aSBram Moolenaar  import_already_defined =<< trim END
13745269bd2aSBram Moolenaar    vim9script
13755269bd2aSBram Moolenaar    let exported = 'something'
13765269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13775269bd2aSBram Moolenaar  END
13785269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13795269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13805269bd2aSBram Moolenaar
1381f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1382fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1383fa29c8abSBram Moolenaar    vim9script
1384fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1385fa29c8abSBram Moolenaar  END
1386fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1387fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1388fa29c8abSBram Moolenaar
1389fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1390fa29c8abSBram Moolenaar    vim9script
1391fa29c8abSBram Moolenaar    import name './Xexport.vim'
1392fa29c8abSBram Moolenaar  END
1393fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1394fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1395fa29c8abSBram Moolenaar
1396fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1397fa29c8abSBram Moolenaar    vim9script
1398fa29c8abSBram Moolenaar    import name from Xexport.vim
1399fa29c8abSBram Moolenaar  END
1400fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1401fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1402fa29c8abSBram Moolenaar
1403fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1404fa29c8abSBram Moolenaar    vim9script
1405fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1406fa29c8abSBram Moolenaar  END
1407fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1408fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1409fa29c8abSBram Moolenaar
1410fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1411fa29c8abSBram Moolenaar    vim9script
1412fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1413fa29c8abSBram Moolenaar  END
14145269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
14155269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1416fa29c8abSBram Moolenaar
1417f2d5c240SBram Moolenaar  delete('Ximport.vim')
14185269bd2aSBram Moolenaar  delete('Ximport3.vim')
14198a7d6542SBram Moolenaar  delete('Xexport.vim')
14208a7d6542SBram Moolenaar
1421f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1422750802b5SBram Moolenaar  set cpo&vi
1423750802b5SBram Moolenaar  let cpo_before = &cpo
1424750802b5SBram Moolenaar  let lines =<< trim END
1425750802b5SBram Moolenaar    vim9script
1426750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1427750802b5SBram Moolenaar  END
1428750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1429750802b5SBram Moolenaar  source Xvim9_script
1430750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1431750802b5SBram Moolenaar  set cpo&vim
1432750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1433750802b5SBram Moolenaar  delete('Xvim9_script')
1434750802b5SBram Moolenaarenddef
1435750802b5SBram Moolenaar
1436803af686SBram Moolenaarfunc g:Trigger()
1437803af686SBram Moolenaar  source Ximport.vim
1438803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1439803af686SBram Moolenaarendfunc
1440803af686SBram Moolenaar
1441803af686SBram Moolenaardef Test_import_export_expr_map()
1442803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1443803af686SBram Moolenaar  let export_lines =<< trim END
1444803af686SBram Moolenaar    vim9script
1445803af686SBram Moolenaar    export def That(): string
1446803af686SBram Moolenaar      return 'yes'
1447803af686SBram Moolenaar    enddef
1448803af686SBram Moolenaar  END
1449803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1450803af686SBram Moolenaar
1451803af686SBram Moolenaar  let import_lines =<< trim END
1452803af686SBram Moolenaar    vim9script
1453803af686SBram Moolenaar    import That from './Xexport_that.vim'
1454803af686SBram Moolenaar    assert_equal('yes', That())
1455803af686SBram Moolenaar  END
1456803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1457803af686SBram Moolenaar
1458803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1459803af686SBram Moolenaar  feedkeys('trigger', "xt")
1460803af686SBram Moolenaar
1461730b2483SBram Moolenaar  delete('Xexport_that.vim')
1462803af686SBram Moolenaar  delete('Ximport.vim')
1463803af686SBram Moolenaar  nunmap trigger
1464803af686SBram Moolenaarenddef
1465803af686SBram Moolenaar
14668e1986e3SBram Moolenaardef Test_import_in_filetype()
14678e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14688e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14698e1986e3SBram Moolenaar  let export_lines =<< trim END
14708e1986e3SBram Moolenaar    vim9script
14718e1986e3SBram Moolenaar    export let That = 'yes'
14728e1986e3SBram Moolenaar  END
1473730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14748e1986e3SBram Moolenaar
14758e1986e3SBram Moolenaar  let import_lines =<< trim END
14768e1986e3SBram Moolenaar    vim9script
1477730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14788e1986e3SBram Moolenaar    assert_equal('yes', That)
14798e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14808e1986e3SBram Moolenaar  END
14818e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14828e1986e3SBram Moolenaar
14838e1986e3SBram Moolenaar  let save_rtp = &rtp
14848e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14858e1986e3SBram Moolenaar
14868e1986e3SBram Moolenaar  filetype plugin on
14878e1986e3SBram Moolenaar  copen
14888e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14898e1986e3SBram Moolenaar
14908e1986e3SBram Moolenaar  quit!
1491730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14928e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14938e1986e3SBram Moolenaar  &rtp = save_rtp
14948e1986e3SBram Moolenaarenddef
14958e1986e3SBram Moolenaar
1496efa94447SBram Moolenaardef Test_use_import_in_mapping()
1497efa94447SBram Moolenaar  let lines =<< trim END
1498efa94447SBram Moolenaar      vim9script
1499efa94447SBram Moolenaar      export def Funcx()
1500efa94447SBram Moolenaar        g:result = 42
1501efa94447SBram Moolenaar      enddef
1502efa94447SBram Moolenaar  END
1503efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1504efa94447SBram Moolenaar  lines =<< trim END
1505efa94447SBram Moolenaar      vim9script
1506efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1507b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1508efa94447SBram Moolenaar  END
1509efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1510efa94447SBram Moolenaar
1511efa94447SBram Moolenaar  source Xmapscript.vim
1512b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1513efa94447SBram Moolenaar  assert_equal(42, g:result)
1514efa94447SBram Moolenaar
1515efa94447SBram Moolenaar  unlet g:result
1516efa94447SBram Moolenaar  delete('XsomeExport.vim')
1517efa94447SBram Moolenaar  delete('Xmapscript.vim')
1518b3ca9824SBram Moolenaar  nunmap <F3>
1519efa94447SBram Moolenaarenddef
1520efa94447SBram Moolenaar
1521750802b5SBram Moolenaardef Test_vim9script_fails()
15228a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15238a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1524750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15259721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15269b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1527750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1528750802b5SBram Moolenaar
1529451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1530c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1531c785b9a7SBram Moolenaar
1532750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1533a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
15348a7d6542SBram Moolenaarenddef
15358a7d6542SBram Moolenaar
1536f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1537101f4810SBram Moolenaar  CheckRunVimInTerminal
1538101f4810SBram Moolenaar
15399bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1540c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15419bb3eb3eSBram Moolenaarendfunc
15429bb3eb3eSBram Moolenaar
1543c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1544101f4810SBram Moolenaar  let export =<< trim END
1545101f4810SBram Moolenaar    vim9script
1546101f4810SBram Moolenaar    export def Foo(): number
1547101f4810SBram Moolenaar        return 0
1548101f4810SBram Moolenaar    enddef
1549101f4810SBram Moolenaar  END
1550730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1551101f4810SBram Moolenaar
1552730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15539bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15549bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1555101f4810SBram Moolenaar
1556730b2483SBram Moolenaar  delete('XexportCmd.vim')
15579bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15589bb3eb3eSBram Moolenaarenddef
1559101f4810SBram Moolenaar
15604c17ad94SBram Moolenaardef Test_vim9script_reload_import()
15618a7d6542SBram Moolenaar  let lines =<< trim END
15628a7d6542SBram Moolenaar    vim9script
15638a7d6542SBram Moolenaar    const var = ''
15648a7d6542SBram Moolenaar    let valone = 1234
15658a7d6542SBram Moolenaar    def MyFunc(arg: string)
15668a7d6542SBram Moolenaar       valone = 5678
15678a7d6542SBram Moolenaar    enddef
15688a7d6542SBram Moolenaar  END
15698a7d6542SBram Moolenaar  let morelines =<< trim END
15708a7d6542SBram Moolenaar    let valtwo = 222
15718a7d6542SBram Moolenaar    export def GetValtwo(): number
15728a7d6542SBram Moolenaar      return valtwo
15738a7d6542SBram Moolenaar    enddef
15748a7d6542SBram Moolenaar  END
157503afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15768a7d6542SBram Moolenaar  source Xreload.vim
15778a7d6542SBram Moolenaar  source Xreload.vim
15788a7d6542SBram Moolenaar  source Xreload.vim
15798a7d6542SBram Moolenaar
15808a7d6542SBram Moolenaar  let testlines =<< trim END
15818a7d6542SBram Moolenaar    vim9script
15828a7d6542SBram Moolenaar    def TheFunc()
15838a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15848a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15858a7d6542SBram Moolenaar    enddef
15868a7d6542SBram Moolenaar    TheFunc()
15878a7d6542SBram Moolenaar  END
15888a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15898a7d6542SBram Moolenaar  source Ximport.vim
15908a7d6542SBram Moolenaar
1591f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1592f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15938a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15948a7d6542SBram Moolenaar  source Ximport.vim
15958a7d6542SBram Moolenaar
1596f5be8cdbSBram Moolenaar  # cannot declare a var twice
15978a7d6542SBram Moolenaar  lines =<< trim END
15988a7d6542SBram Moolenaar    vim9script
15998a7d6542SBram Moolenaar    let valone = 1234
16008a7d6542SBram Moolenaar    let valone = 5678
16018a7d6542SBram Moolenaar  END
16028a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16038a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
16048a7d6542SBram Moolenaar
16058a7d6542SBram Moolenaar  delete('Xreload.vim')
16068a7d6542SBram Moolenaar  delete('Ximport.vim')
16078a7d6542SBram Moolenaarenddef
16088a7d6542SBram Moolenaar
1609fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1610fe465a01SBram Moolenaar" script-local name.
1611fe465a01SBram Moolenaardef Test_vim9script_funcref()
1612fe465a01SBram Moolenaar  let sortlines =<< trim END
1613fe465a01SBram Moolenaar      vim9script
1614fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1615bed36b93SBram Moolenaar        return i2 - i1
1616fe465a01SBram Moolenaar      enddef
1617fe465a01SBram Moolenaar
1618fe465a01SBram Moolenaar      export def FastSort(): list<number>
1619fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1620fe465a01SBram Moolenaar      enddef
1621fe465a01SBram Moolenaar  END
1622fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1623fe465a01SBram Moolenaar
1624fe465a01SBram Moolenaar  let lines =<< trim END
1625fe465a01SBram Moolenaar    vim9script
1626fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1627fe465a01SBram Moolenaar    def Test()
1628fe465a01SBram Moolenaar      g:result = FastSort()
1629fe465a01SBram Moolenaar    enddef
1630fe465a01SBram Moolenaar    Test()
1631fe465a01SBram Moolenaar  END
1632fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1633fe465a01SBram Moolenaar
1634fe465a01SBram Moolenaar  source Xscript.vim
1635fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1636fe465a01SBram Moolenaar
1637fe465a01SBram Moolenaar  unlet g:result
1638fe465a01SBram Moolenaar  delete('Xsort.vim')
1639fe465a01SBram Moolenaar  delete('Xscript.vim')
1640fe465a01SBram Moolenaarenddef
1641fe465a01SBram Moolenaar
1642c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1643c620c055SBram Moolenaar" script where FastFilter() is called from.
1644c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1645c620c055SBram Moolenaar  let filterLines =<< trim END
1646c620c055SBram Moolenaar    vim9script
1647c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1648c620c055SBram Moolenaar      return idx % 2 == 1
1649c620c055SBram Moolenaar    enddef
1650c620c055SBram Moolenaar    export def FastFilter(): list<number>
1651c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1652c620c055SBram Moolenaar    enddef
1653c620c055SBram Moolenaar  END
1654c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1655c620c055SBram Moolenaar
1656c620c055SBram Moolenaar  let lines =<< trim END
1657c620c055SBram Moolenaar    vim9script
1658c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1659c620c055SBram Moolenaar    def Test()
1660c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1661c620c055SBram Moolenaar    enddef
1662c620c055SBram Moolenaar    Test()
1663c620c055SBram Moolenaar  END
1664c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1665c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1666c620c055SBram Moolenaar
1667c620c055SBram Moolenaar  delete('Xfilter.vim')
1668c620c055SBram Moolenaar  delete('Ximport.vim')
1669c620c055SBram Moolenaarenddef
1670c620c055SBram Moolenaar
16714c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
16724c17ad94SBram Moolenaar  let first_lines =<< trim END
16734c17ad94SBram Moolenaar    vim9script
16744c17ad94SBram Moolenaar    def FuncYes(): string
16754c17ad94SBram Moolenaar      return 'yes'
16764c17ad94SBram Moolenaar    enddef
16774c17ad94SBram Moolenaar  END
167803afdcf1SBram Moolenaar  let withno_lines =<< trim END
16794c17ad94SBram Moolenaar    def FuncNo(): string
16804c17ad94SBram Moolenaar      return 'no'
16814c17ad94SBram Moolenaar    enddef
16824c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16834c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16844c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
168503afdcf1SBram Moolenaar    enddef
168603afdcf1SBram Moolenaar  END
168703afdcf1SBram Moolenaar  let nono_lines =<< trim END
168803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
168903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
16904c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
16914c17ad94SBram Moolenaar    enddef
16924c17ad94SBram Moolenaar  END
16934c17ad94SBram Moolenaar
16944c17ad94SBram Moolenaar  # FuncNo() is defined
169503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16964c17ad94SBram Moolenaar  source Xreloaded.vim
16974c17ad94SBram Moolenaar  g:DoCheck(true)
16984c17ad94SBram Moolenaar
16994c17ad94SBram Moolenaar  # FuncNo() is not redefined
170003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17014c17ad94SBram Moolenaar  source Xreloaded.vim
170203afdcf1SBram Moolenaar  g:DoCheck()
17034c17ad94SBram Moolenaar
17044c17ad94SBram Moolenaar  # FuncNo() is back
170503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17064c17ad94SBram Moolenaar  source Xreloaded.vim
170703afdcf1SBram Moolenaar  g:DoCheck()
17084c17ad94SBram Moolenaar
17094c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17104c17ad94SBram Moolenaarenddef
17114c17ad94SBram Moolenaar
171289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
171389483d40SBram Moolenaar  # write the script with a script-local variable
171489483d40SBram Moolenaar  let lines =<< trim END
171589483d40SBram Moolenaar    vim9script
171689483d40SBram Moolenaar    let var = 'string'
171789483d40SBram Moolenaar  END
171889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
171989483d40SBram Moolenaar  source XreloadVar.vim
172089483d40SBram Moolenaar
172189483d40SBram Moolenaar  # now write the script using the same variable locally - works
172289483d40SBram Moolenaar  lines =<< trim END
172389483d40SBram Moolenaar    vim9script
172489483d40SBram Moolenaar    def Func()
172589483d40SBram Moolenaar      let var = 'string'
172689483d40SBram Moolenaar    enddef
172789483d40SBram Moolenaar  END
172889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
172989483d40SBram Moolenaar  source XreloadVar.vim
173089483d40SBram Moolenaar
173189483d40SBram Moolenaar  delete('XreloadVar.vim')
173289483d40SBram Moolenaarenddef
173389483d40SBram Moolenaar
17348a7d6542SBram Moolenaardef Test_import_absolute()
17358a7d6542SBram Moolenaar  let import_lines = [
1736e6085c53SBram Moolenaar        'vim9script',
1737e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1738e6085c53SBram Moolenaar        'def UseExported()',
1739e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1740e6085c53SBram Moolenaar        '  exported = 8888',
1741e6085c53SBram Moolenaar        '  g:imported_after = exported',
1742e6085c53SBram Moolenaar        'enddef',
1743e6085c53SBram Moolenaar        'UseExported()',
1744e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1745e6085c53SBram Moolenaar        ]
17468a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17478a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17488a7d6542SBram Moolenaar
17498a7d6542SBram Moolenaar  source Ximport_abs.vim
17508a7d6542SBram Moolenaar
17518a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17524e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1753675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1754675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1755675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1756675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1757675f716eSBram Moolenaar          'exported = 8888.*' ..
1758675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1759675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1760675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1761675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1762e6085c53SBram Moolenaar        g:import_disassembled)
1763b3ca9824SBram Moolenaar
1764b3ca9824SBram Moolenaar  Undo_export_script_lines()
17658a7d6542SBram Moolenaar  unlet g:imported_abs
17664e12a5dfSBram Moolenaar  unlet g:import_disassembled
17678a7d6542SBram Moolenaar
17688a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17698a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17708a7d6542SBram Moolenaarenddef
17718a7d6542SBram Moolenaar
17728a7d6542SBram Moolenaardef Test_import_rtp()
17738a7d6542SBram Moolenaar  let import_lines = [
1774e6085c53SBram Moolenaar        'vim9script',
1775e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1776e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1777e6085c53SBram Moolenaar        ]
17788a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17798a7d6542SBram Moolenaar  mkdir('import')
17808a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17818a7d6542SBram Moolenaar
17828a7d6542SBram Moolenaar  let save_rtp = &rtp
17838a7d6542SBram Moolenaar  &rtp = getcwd()
17848a7d6542SBram Moolenaar  source Ximport_rtp.vim
17858a7d6542SBram Moolenaar  &rtp = save_rtp
17868a7d6542SBram Moolenaar
17878a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17888a7d6542SBram Moolenaar
1789b3ca9824SBram Moolenaar  Undo_export_script_lines()
1790b3ca9824SBram Moolenaar  unlet g:imported_rtp
17918a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
179289483d40SBram Moolenaar  delete('import', 'rf')
17938a7d6542SBram Moolenaarenddef
17948a7d6542SBram Moolenaar
179525e0f586SBram Moolenaardef Test_import_compile_error()
179625e0f586SBram Moolenaar  let export_lines = [
179725e0f586SBram Moolenaar        'vim9script',
179825e0f586SBram Moolenaar        'export def ExpFunc(): string',
179925e0f586SBram Moolenaar        '  return notDefined',
180025e0f586SBram Moolenaar        'enddef',
180125e0f586SBram Moolenaar        ]
180225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
180325e0f586SBram Moolenaar
180425e0f586SBram Moolenaar  let import_lines = [
180525e0f586SBram Moolenaar        'vim9script',
180625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
180725e0f586SBram Moolenaar        'def ImpFunc()',
180825e0f586SBram Moolenaar        '  echo ExpFunc()',
180925e0f586SBram Moolenaar        'enddef',
181025e0f586SBram Moolenaar        'defcompile',
181125e0f586SBram Moolenaar        ]
181225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
181325e0f586SBram Moolenaar
181425e0f586SBram Moolenaar  try
181525e0f586SBram Moolenaar    source Ximport.vim
181625e0f586SBram Moolenaar  catch /E1001/
1817f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
181825e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
181925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
182025e0f586SBram Moolenaar  endtry
182125e0f586SBram Moolenaar
182225e0f586SBram Moolenaar  delete('Xexported.vim')
182325e0f586SBram Moolenaar  delete('Ximport.vim')
182425e0f586SBram Moolenaarenddef
182525e0f586SBram Moolenaar
1826c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1827c4ce36d4SBram Moolenaar  let lines = [
1828c4ce36d4SBram Moolenaar        'vim9script',
1829c4ce36d4SBram Moolenaar        'def Func()',
1830c4ce36d4SBram Moolenaar        '  eval [][0]',
1831c4ce36d4SBram Moolenaar        'enddef',
1832c4ce36d4SBram Moolenaar        'Func()',
1833c4ce36d4SBram Moolenaar        ]
1834c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1835c4ce36d4SBram Moolenaar
1836c4ce36d4SBram Moolenaar  for count in range(3)
1837c4ce36d4SBram Moolenaar    try
1838c4ce36d4SBram Moolenaar      source Xtestscript.vim
1839c4ce36d4SBram Moolenaar    catch /E684/
1840c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1841c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1842c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1843c4ce36d4SBram Moolenaar    endtry
1844c4ce36d4SBram Moolenaar  endfor
1845c4ce36d4SBram Moolenaar
1846c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1847c4ce36d4SBram Moolenaarenddef
1848c4ce36d4SBram Moolenaar
1849eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1850eef2102eSBram Moolenaar  let export_lines =<< trim END
1851eef2102eSBram Moolenaar      vim9script
1852eef2102eSBram Moolenaar      export def Func()
1853eef2102eSBram Moolenaar        echo 'imported'
1854eef2102eSBram Moolenaar      enddef
1855eef2102eSBram Moolenaar  END
1856eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1857eef2102eSBram Moolenaar
1858eef2102eSBram Moolenaar  let lines =<< trim END
1859eef2102eSBram Moolenaar    vim9script
1860eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1861eef2102eSBram Moolenaar    def Func()
1862eef2102eSBram Moolenaar      echo 'local to function'
1863eef2102eSBram Moolenaar    enddef
1864eef2102eSBram Moolenaar  END
1865eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1866eef2102eSBram Moolenaar
1867eef2102eSBram Moolenaar  lines =<< trim END
1868eef2102eSBram Moolenaar    vim9script
1869eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1870eef2102eSBram Moolenaar    def Outer()
1871eef2102eSBram Moolenaar      def Func()
1872eef2102eSBram Moolenaar        echo 'local to function'
1873eef2102eSBram Moolenaar      enddef
1874eef2102eSBram Moolenaar    enddef
1875eef2102eSBram Moolenaar    defcompile
1876eef2102eSBram Moolenaar  END
1877eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1878eef2102eSBram Moolenaar
1879eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1880eef2102eSBram Moolenaarenddef
1881eef2102eSBram Moolenaar
1882b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1883b9a2cac3SBram Moolenaar  let lines =<< trim END
1884b9a2cac3SBram Moolenaar    vim9script
1885b9a2cac3SBram Moolenaar    def Func()
1886b9a2cac3SBram Moolenaar      echo 'one'
1887b9a2cac3SBram Moolenaar    enddef
1888b9a2cac3SBram Moolenaar    def Func()
1889b9a2cac3SBram Moolenaar      echo 'two'
1890b9a2cac3SBram Moolenaar    enddef
1891b9a2cac3SBram Moolenaar  END
1892b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1893fa211f3cSBram Moolenaar
1894fa211f3cSBram Moolenaar  lines =<< trim END
1895fa211f3cSBram Moolenaar    vim9script
1896fa211f3cSBram Moolenaar    def Foo(): string
1897fa211f3cSBram Moolenaar      return 'foo'
1898fa211f3cSBram Moolenaar      enddef
1899fa211f3cSBram Moolenaar    def Func()
1900fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1901fa211f3cSBram Moolenaar    enddef
1902fa211f3cSBram Moolenaar    defcompile
1903fa211f3cSBram Moolenaar  END
1904fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1905b9a2cac3SBram Moolenaarenddef
1906b9a2cac3SBram Moolenaar
19078a7d6542SBram Moolenaardef Test_fixed_size_list()
1908f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19098a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19108a7d6542SBram Moolenaar  l->remove(0)
19118a7d6542SBram Moolenaar  l->add(5)
19128a7d6542SBram Moolenaar  l->insert(99, 1)
19130f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19148a7d6542SBram Moolenaarenddef
19158a7d6542SBram Moolenaar
1916ae616494SBram Moolenaardef Test_no_insert_xit()
1917ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1918ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1919f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1920f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1921f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1922ae616494SBram Moolenaar
1923ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1924ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1925ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1926ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1927f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1928f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1929f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1930f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1931f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1932ae616494SBram Moolenaarenddef
1933ae616494SBram Moolenaar
1934158906cfSBram Moolenaardef IfElse(what: number): string
1935158906cfSBram Moolenaar  let res = ''
1936158906cfSBram Moolenaar  if what == 1
1937158906cfSBram Moolenaar    res = "one"
1938158906cfSBram Moolenaar  elseif what == 2
1939158906cfSBram Moolenaar    res = "two"
1940a259d8d3SBram Moolenaar  else
1941158906cfSBram Moolenaar    res = "three"
1942a259d8d3SBram Moolenaar  endif
1943158906cfSBram Moolenaar  return res
1944a259d8d3SBram Moolenaarenddef
1945a259d8d3SBram Moolenaar
1946158906cfSBram Moolenaardef Test_if_elseif_else()
1947158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1948158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1949158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19500f18b6d1SBram Moolenaarenddef
19510f18b6d1SBram Moolenaar
1952e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1953e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1954e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1955e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1956e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1957585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1958e8c4abbbSBram Moolenaarenddef
1959e8c4abbbSBram Moolenaar
19606d69bf60SBram Moolenaarlet g:bool_true = v:true
19616d69bf60SBram Moolenaarlet g:bool_false = v:false
19626d69bf60SBram Moolenaar
19636d69bf60SBram Moolenaardef Test_if_const_expr()
19646d69bf60SBram Moolenaar  let res = false
19656d69bf60SBram Moolenaar  if true ? true : false
19666d69bf60SBram Moolenaar    res = true
19676d69bf60SBram Moolenaar  endif
19686d69bf60SBram Moolenaar  assert_equal(true, res)
19696d69bf60SBram Moolenaar
1970585fea7bSBram Moolenaar  g:glob = 2
1971585fea7bSBram Moolenaar  if false
19726797966dSBram Moolenaar    execute('g:glob = 3')
1973585fea7bSBram Moolenaar  endif
1974585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1975585fea7bSBram Moolenaar  if true
19766797966dSBram Moolenaar    execute('g:glob = 3')
1977585fea7bSBram Moolenaar  endif
1978585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1979585fea7bSBram Moolenaar
19806d69bf60SBram Moolenaar  res = false
19816d69bf60SBram Moolenaar  if g:bool_true ? true : false
19826d69bf60SBram Moolenaar    res = true
19836d69bf60SBram Moolenaar  endif
19846d69bf60SBram Moolenaar  assert_equal(true, res)
19856d69bf60SBram Moolenaar
19866d69bf60SBram Moolenaar  res = false
19876d69bf60SBram Moolenaar  if true ? g:bool_true : false
19886d69bf60SBram Moolenaar    res = true
19896d69bf60SBram Moolenaar  endif
19906d69bf60SBram Moolenaar  assert_equal(true, res)
19916d69bf60SBram Moolenaar
19926d69bf60SBram Moolenaar  res = false
19936d69bf60SBram Moolenaar  if true ? true : g:bool_false
19946d69bf60SBram Moolenaar    res = true
19956d69bf60SBram Moolenaar  endif
19966d69bf60SBram Moolenaar  assert_equal(true, res)
19976d69bf60SBram Moolenaar
19986d69bf60SBram Moolenaar  res = false
19996d69bf60SBram Moolenaar  if true ? false : true
20006d69bf60SBram Moolenaar    res = true
20016d69bf60SBram Moolenaar  endif
20026d69bf60SBram Moolenaar  assert_equal(false, res)
20036d69bf60SBram Moolenaar
20046d69bf60SBram Moolenaar  res = false
20056d69bf60SBram Moolenaar  if false ? false : true
20066d69bf60SBram Moolenaar    res = true
20076d69bf60SBram Moolenaar  endif
20086d69bf60SBram Moolenaar  assert_equal(true, res)
20096d69bf60SBram Moolenaar
20106d69bf60SBram Moolenaar  res = false
20116d69bf60SBram Moolenaar  if false ? true : false
20126d69bf60SBram Moolenaar    res = true
20136d69bf60SBram Moolenaar  endif
20146d69bf60SBram Moolenaar  assert_equal(false, res)
20156d69bf60SBram Moolenaar
20166d69bf60SBram Moolenaar  res = false
2017e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2018e8c4abbbSBram Moolenaar    res = true
2019e8c4abbbSBram Moolenaar  endif
2020e8c4abbbSBram Moolenaar  assert_equal(false, res)
2021e8c4abbbSBram Moolenaar
2022e8c4abbbSBram Moolenaar  res = false
20236d69bf60SBram Moolenaar  if true && true
20246d69bf60SBram Moolenaar    res = true
20256d69bf60SBram Moolenaar  endif
20266d69bf60SBram Moolenaar  assert_equal(true, res)
20276d69bf60SBram Moolenaar
20286d69bf60SBram Moolenaar  res = false
20296d69bf60SBram Moolenaar  if true && false
20306d69bf60SBram Moolenaar    res = true
20316d69bf60SBram Moolenaar  endif
20326d69bf60SBram Moolenaar  assert_equal(false, res)
20336d69bf60SBram Moolenaar
20346d69bf60SBram Moolenaar  res = false
20356d69bf60SBram Moolenaar  if g:bool_true && false
20366d69bf60SBram Moolenaar    res = true
20376d69bf60SBram Moolenaar  endif
20386d69bf60SBram Moolenaar  assert_equal(false, res)
20396d69bf60SBram Moolenaar
20406d69bf60SBram Moolenaar  res = false
20416d69bf60SBram Moolenaar  if true && g:bool_false
20426d69bf60SBram Moolenaar    res = true
20436d69bf60SBram Moolenaar  endif
20446d69bf60SBram Moolenaar  assert_equal(false, res)
20456d69bf60SBram Moolenaar
20466d69bf60SBram Moolenaar  res = false
20476d69bf60SBram Moolenaar  if false && false
20486d69bf60SBram Moolenaar    res = true
20496d69bf60SBram Moolenaar  endif
20506d69bf60SBram Moolenaar  assert_equal(false, res)
20516d69bf60SBram Moolenaar
20526d69bf60SBram Moolenaar  res = false
20536d69bf60SBram Moolenaar  if true || false
20546d69bf60SBram Moolenaar    res = true
20556d69bf60SBram Moolenaar  endif
20566d69bf60SBram Moolenaar  assert_equal(true, res)
20576d69bf60SBram Moolenaar
20586d69bf60SBram Moolenaar  res = false
20596d69bf60SBram Moolenaar  if g:bool_true || false
20606d69bf60SBram Moolenaar    res = true
20616d69bf60SBram Moolenaar  endif
20626d69bf60SBram Moolenaar  assert_equal(true, res)
20636d69bf60SBram Moolenaar
20646d69bf60SBram Moolenaar  res = false
20656d69bf60SBram Moolenaar  if true || g:bool_false
20666d69bf60SBram Moolenaar    res = true
20676d69bf60SBram Moolenaar  endif
20686d69bf60SBram Moolenaar  assert_equal(true, res)
20696d69bf60SBram Moolenaar
20706d69bf60SBram Moolenaar  res = false
20716d69bf60SBram Moolenaar  if false || false
20726d69bf60SBram Moolenaar    res = true
20736d69bf60SBram Moolenaar  endif
20746d69bf60SBram Moolenaar  assert_equal(false, res)
207580c34ca3SBram Moolenaarenddef
20766d69bf60SBram Moolenaar
207780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
207880c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
207980c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2080e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2081e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20826d69bf60SBram Moolenaarenddef
20836d69bf60SBram Moolenaar
208472abcf42SBram Moolenaardef RunNested(i: number): number
208572abcf42SBram Moolenaar  let x: number = 0
208672abcf42SBram Moolenaar  if i % 2
208772abcf42SBram Moolenaar    if 1
2088f5be8cdbSBram Moolenaar      # comment
208972abcf42SBram Moolenaar    else
2090f5be8cdbSBram Moolenaar      # comment
209172abcf42SBram Moolenaar    endif
209272abcf42SBram Moolenaar    x += 1
209372abcf42SBram Moolenaar  else
209472abcf42SBram Moolenaar    x += 1000
209572abcf42SBram Moolenaar  endif
209672abcf42SBram Moolenaar  return x
209772abcf42SBram Moolenaarenddef
209872abcf42SBram Moolenaar
209972abcf42SBram Moolenaardef Test_nested_if()
210072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
210172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
210272abcf42SBram Moolenaarenddef
210372abcf42SBram Moolenaar
2104ad39c094SBram Moolenaardef Test_execute_cmd()
2105ad39c094SBram Moolenaar  new
2106ad39c094SBram Moolenaar  setline(1, 'default')
2107ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2108ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2109a72cfb80SBram Moolenaar
2110a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2111a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2112a72cfb80SBram Moolenaar
2113ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2114ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2115a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2116ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2117a72cfb80SBram Moolenaar
2118ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2119ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2120a72cfb80SBram Moolenaar
2121ad39c094SBram Moolenaar  let cmd_first = 'call '
2122ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2123ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2124ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2125ad39c094SBram Moolenaar  bwipe!
2126585fea7bSBram Moolenaar
21272d6b20d6SBram Moolenaar  let n = true
21282d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21292d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21302d6b20d6SBram Moolenaar
2131e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2132e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2133e5abf7afSBram Moolenaar
2134585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2135a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2136ad39c094SBram Moolenaarenddef
2137ad39c094SBram Moolenaar
213847e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2139f5be8cdbSBram Moolenaar  # only checks line continuation
214047e880d6SBram Moolenaar  let lines =<< trim END
214147e880d6SBram Moolenaar      vim9script
214247e880d6SBram Moolenaar      execute 'g:someVar'
214347e880d6SBram Moolenaar                .. ' = ' ..
214447e880d6SBram Moolenaar                   '28'
214547e880d6SBram Moolenaar      assert_equal(28, g:someVar)
214647e880d6SBram Moolenaar      unlet g:someVar
214747e880d6SBram Moolenaar  END
214847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
214947e880d6SBram Moolenaarenddef
215047e880d6SBram Moolenaar
2151ad39c094SBram Moolenaardef Test_echo_cmd()
2152a72cfb80SBram Moolenaar  echo 'some' # comment
2153585fea7bSBram Moolenaar  echon 'thing'
2154ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2155ad39c094SBram Moolenaar
2156a72cfb80SBram Moolenaar  echo "some" # comment
2157a72cfb80SBram Moolenaar  echon "thing"
2158a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2159a72cfb80SBram Moolenaar
2160ad39c094SBram Moolenaar  let str1 = 'some'
2161ad39c094SBram Moolenaar  let str2 = 'more'
2162ad39c094SBram Moolenaar  echo str1 str2
2163ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2164a72cfb80SBram Moolenaar
2165a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2166ad39c094SBram Moolenaarenddef
2167ad39c094SBram Moolenaar
2168f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2169f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2170f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2171f93c7feaSBram Moolenaar  echo 'clear'
2172df069eecSBram Moolenaar  :1messages
2173f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2174f93c7feaSBram Moolenaar
2175f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2176f93c7feaSBram Moolenaarenddef
2177f93c7feaSBram Moolenaar
217847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2179f5be8cdbSBram Moolenaar  # only checks line continuation
218047e880d6SBram Moolenaar  let lines =<< trim END
218147e880d6SBram Moolenaar      vim9script
218247e880d6SBram Moolenaar      echomsg 'here'
218347e880d6SBram Moolenaar                .. ' is ' ..
218447e880d6SBram Moolenaar                   'a message'
218547e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
218647e880d6SBram Moolenaar  END
218747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
218847e880d6SBram Moolenaarenddef
218947e880d6SBram Moolenaar
2190f93c7feaSBram Moolenaardef Test_echoerr_cmd()
219140ee466cSBram Moolenaar  try
219240ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
219340ee466cSBram Moolenaar  catch
219440ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
219540ee466cSBram Moolenaar  endtry
2196f93c7feaSBram Moolenaarenddef
2197f93c7feaSBram Moolenaar
219847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2199f5be8cdbSBram Moolenaar  # only checks line continuation
220047e880d6SBram Moolenaar  let lines =<< trim END
220147e880d6SBram Moolenaar      vim9script
220247e880d6SBram Moolenaar      try
220347e880d6SBram Moolenaar        echoerr 'this'
220447e880d6SBram Moolenaar                .. ' is ' ..
220547e880d6SBram Moolenaar                   'wrong'
220647e880d6SBram Moolenaar      catch
220747e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
220847e880d6SBram Moolenaar      endtry
220947e880d6SBram Moolenaar  END
221047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
221147e880d6SBram Moolenaarenddef
221247e880d6SBram Moolenaar
221341fe0617SBram Moolenaardef Test_for_outside_of_function()
221441fe0617SBram Moolenaar  let lines =<< trim END
221541fe0617SBram Moolenaar    vim9script
221641fe0617SBram Moolenaar    new
221741fe0617SBram Moolenaar    for var in range(0, 3)
221841fe0617SBram Moolenaar      append(line('$'), var)
221941fe0617SBram Moolenaar    endfor
222041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
222141fe0617SBram Moolenaar    bwipe!
222241fe0617SBram Moolenaar  END
222341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
222441fe0617SBram Moolenaar  source Xvim9for.vim
222541fe0617SBram Moolenaar  delete('Xvim9for.vim')
222641fe0617SBram Moolenaarenddef
22278a7d6542SBram Moolenaar
2228e8c4abbbSBram Moolenaardef Test_for_loop()
2229e8c4abbbSBram Moolenaar  let result = ''
2230e8c4abbbSBram Moolenaar  for cnt in range(7)
2231e8c4abbbSBram Moolenaar    if cnt == 4
2232e8c4abbbSBram Moolenaar      break
2233e8c4abbbSBram Moolenaar    endif
2234e8c4abbbSBram Moolenaar    if cnt == 2
2235e8c4abbbSBram Moolenaar      continue
2236e8c4abbbSBram Moolenaar    endif
2237e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2238e8c4abbbSBram Moolenaar  endfor
2239e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22400ad3e894SBram Moolenaar
22410ad3e894SBram Moolenaar  let concat = ''
22420ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22430ad3e894SBram Moolenaar    concat ..= str
22440ad3e894SBram Moolenaar  endfor
22450ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2246e8c4abbbSBram Moolenaarenddef
2247e8c4abbbSBram Moolenaar
2248e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2249675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2250675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2251451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2252822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2253451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2254675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2255675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2256675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2257e8c4abbbSBram Moolenaarenddef
2258e8c4abbbSBram Moolenaar
2259d0df1aacSBram Moolenaardef Test_while_loop()
2260d0df1aacSBram Moolenaar  let result = ''
2261d0df1aacSBram Moolenaar  let cnt = 0
2262d0df1aacSBram Moolenaar  while cnt < 555
2263d0df1aacSBram Moolenaar    if cnt == 3
2264d0df1aacSBram Moolenaar      break
2265d0df1aacSBram Moolenaar    endif
2266d0df1aacSBram Moolenaar    cnt += 1
2267d0df1aacSBram Moolenaar    if cnt == 2
2268d0df1aacSBram Moolenaar      continue
2269d0df1aacSBram Moolenaar    endif
2270d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2271d0df1aacSBram Moolenaar  endwhile
2272d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2273d0df1aacSBram Moolenaarenddef
2274d0df1aacSBram Moolenaar
2275e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2276675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2277675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2278675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2279675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2280675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2281675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2282675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2283bd5da371SBram Moolenaarenddef
2284bd5da371SBram Moolenaar
22859645e2d9SBram Moolenaardef Test_interrupt_loop()
228697acfc78SBram Moolenaar  let caught = false
22879645e2d9SBram Moolenaar  let x = 0
228897acfc78SBram Moolenaar  try
22899645e2d9SBram Moolenaar    while 1
22909645e2d9SBram Moolenaar      x += 1
22919645e2d9SBram Moolenaar      if x == 100
22929645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22939645e2d9SBram Moolenaar      endif
22949645e2d9SBram Moolenaar    endwhile
229597acfc78SBram Moolenaar  catch
229697acfc78SBram Moolenaar    caught = true
229797acfc78SBram Moolenaar    assert_equal(100, x)
229897acfc78SBram Moolenaar  endtry
229997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
23009645e2d9SBram Moolenaarenddef
230120431c9dSBram Moolenaar
23024fdae999SBram Moolenaardef Test_automatic_line_continuation()
23034fdae999SBram Moolenaar  let mylist = [
23044fdae999SBram Moolenaar      'one',
23054fdae999SBram Moolenaar      'two',
23064fdae999SBram Moolenaar      'three',
2307f5be8cdbSBram Moolenaar      ] # comment
23084fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23094fdae999SBram Moolenaar
23104fdae999SBram Moolenaar  let mydict = {
23114fdae999SBram Moolenaar      'one': 1,
23124fdae999SBram Moolenaar      'two': 2,
23134fdae999SBram Moolenaar      'three':
23144fdae999SBram Moolenaar          3,
2315f5be8cdbSBram Moolenaar      } # comment
23164fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23174fdae999SBram Moolenaar  mydict = #{
23182c330432SBram Moolenaar      one: 1,  # comment
23192c330432SBram Moolenaar      two:     # comment
23202c330432SBram Moolenaar           2,  # comment
23212c330432SBram Moolenaar      three: 3 # comment
23222c330432SBram Moolenaar      }
23232c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23242c330432SBram Moolenaar  mydict = #{
23252c330432SBram Moolenaar      one: 1,
23264fdae999SBram Moolenaar      two:
23274fdae999SBram Moolenaar           2,
23282c330432SBram Moolenaar      three: 3
23294fdae999SBram Moolenaar      }
23304fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2331e6085c53SBram Moolenaar
2332e6085c53SBram Moolenaar  assert_equal(
2333e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2334e6085c53SBram Moolenaar        split('one two three')
2335e6085c53SBram Moolenaar        )
23364fdae999SBram Moolenaarenddef
23374fdae999SBram Moolenaar
23387a092245SBram Moolenaardef Test_vim9_comment()
23397a092245SBram Moolenaar  CheckScriptSuccess([
23407a092245SBram Moolenaar      'vim9script',
23417a092245SBram Moolenaar      '# something',
23427a092245SBram Moolenaar      ])
23437a092245SBram Moolenaar  CheckScriptFailure([
23447a092245SBram Moolenaar      'vim9script',
23457a092245SBram Moolenaar      ':# something',
23467a092245SBram Moolenaar      ], 'E488:')
23477a092245SBram Moolenaar  CheckScriptFailure([
23487a092245SBram Moolenaar      '# something',
23497a092245SBram Moolenaar      ], 'E488:')
23507a092245SBram Moolenaar  CheckScriptFailure([
23517a092245SBram Moolenaar      ':# something',
23527a092245SBram Moolenaar      ], 'E488:')
23537a092245SBram Moolenaar
23544a8d9f2eSBram Moolenaar  { # block start
23554a8d9f2eSBram Moolenaar  } # block end
23564a8d9f2eSBram Moolenaar  CheckDefFailure([
23574a8d9f2eSBram Moolenaar      '{# comment',
23584a8d9f2eSBram Moolenaar      ], 'E488:')
23594a8d9f2eSBram Moolenaar  CheckDefFailure([
23604a8d9f2eSBram Moolenaar      '{',
23614a8d9f2eSBram Moolenaar      '}# comment',
23624a8d9f2eSBram Moolenaar      ], 'E488:')
23634a8d9f2eSBram Moolenaar
23644a8d9f2eSBram Moolenaar  echo "yes" # comment
23654a8d9f2eSBram Moolenaar  CheckDefFailure([
23664a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23674a8d9f2eSBram Moolenaar      ], 'E488:')
23687a092245SBram Moolenaar  CheckScriptSuccess([
23697a092245SBram Moolenaar      'vim9script',
23707a092245SBram Moolenaar      'echo "yes" # something',
23717a092245SBram Moolenaar      ])
23727a092245SBram Moolenaar  CheckScriptFailure([
23737a092245SBram Moolenaar      'vim9script',
23747a092245SBram Moolenaar      'echo "yes"# something',
23757a092245SBram Moolenaar      ], 'E121:')
23767a092245SBram Moolenaar  CheckScriptFailure([
23777a092245SBram Moolenaar      'vim9script',
23787a092245SBram Moolenaar      'echo# something',
23797a092245SBram Moolenaar      ], 'E121:')
23807a092245SBram Moolenaar  CheckScriptFailure([
23817a092245SBram Moolenaar      'echo "yes" # something',
23827a092245SBram Moolenaar      ], 'E121:')
23837a092245SBram Moolenaar
23844a8d9f2eSBram Moolenaar  exe "echo" # comment
23854a8d9f2eSBram Moolenaar  CheckDefFailure([
23864a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23874a8d9f2eSBram Moolenaar      ], 'E488:')
23884a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23894a8d9f2eSBram Moolenaar      'vim9script',
23904a8d9f2eSBram Moolenaar      'exe "echo" # something',
23914a8d9f2eSBram Moolenaar      ])
23924a8d9f2eSBram Moolenaar  CheckScriptFailure([
23934a8d9f2eSBram Moolenaar      'vim9script',
23944a8d9f2eSBram Moolenaar      'exe "echo"# something',
23954a8d9f2eSBram Moolenaar      ], 'E121:')
23964a8d9f2eSBram Moolenaar  CheckDefFailure([
23974a8d9f2eSBram Moolenaar      'exe # comment',
23984a8d9f2eSBram Moolenaar      ], 'E1015:')
23994a8d9f2eSBram Moolenaar  CheckScriptFailure([
24004a8d9f2eSBram Moolenaar      'vim9script',
24014a8d9f2eSBram Moolenaar      'exe# something',
24024a8d9f2eSBram Moolenaar      ], 'E121:')
24034a8d9f2eSBram Moolenaar  CheckScriptFailure([
24044a8d9f2eSBram Moolenaar      'exe "echo" # something',
24054a8d9f2eSBram Moolenaar      ], 'E121:')
24064a8d9f2eSBram Moolenaar
24077a092245SBram Moolenaar  CheckDefFailure([
24087a092245SBram Moolenaar      'try# comment',
24097a092245SBram Moolenaar      '  echo "yes"',
24107a092245SBram Moolenaar      'catch',
24117a092245SBram Moolenaar      'endtry',
24127a092245SBram Moolenaar      ], 'E488:')
24132c5ed4e3SBram Moolenaar  CheckScriptFailure([
24142c5ed4e3SBram Moolenaar      'vim9script',
24152c5ed4e3SBram Moolenaar      'try# comment',
24162c5ed4e3SBram Moolenaar      'echo "yes"',
24172c5ed4e3SBram Moolenaar      ], 'E488:')
24187a092245SBram Moolenaar  CheckDefFailure([
24197a092245SBram Moolenaar      'try',
2420a72cfb80SBram Moolenaar      '  throw#comment',
2421a72cfb80SBram Moolenaar      'catch',
2422a72cfb80SBram Moolenaar      'endtry',
2423a72cfb80SBram Moolenaar      ], 'E1015:')
2424a72cfb80SBram Moolenaar  CheckDefFailure([
2425a72cfb80SBram Moolenaar      'try',
2426a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2427a72cfb80SBram Moolenaar      'catch',
2428a72cfb80SBram Moolenaar      'endtry',
2429a72cfb80SBram Moolenaar      ], 'E488:')
2430a72cfb80SBram Moolenaar  CheckDefFailure([
2431a72cfb80SBram Moolenaar      'try',
24327a092245SBram Moolenaar      '  echo "yes"',
24337a092245SBram Moolenaar      'catch# comment',
24347a092245SBram Moolenaar      'endtry',
24357a092245SBram Moolenaar      ], 'E488:')
24362c5ed4e3SBram Moolenaar  CheckScriptFailure([
24372c5ed4e3SBram Moolenaar      'vim9script',
24382c5ed4e3SBram Moolenaar      'try',
24392c5ed4e3SBram Moolenaar      '  echo "yes"',
24402c5ed4e3SBram Moolenaar      'catch# comment',
24412c5ed4e3SBram Moolenaar      'endtry',
24422c5ed4e3SBram Moolenaar      ], 'E654:')
24432c5ed4e3SBram Moolenaar  CheckDefFailure([
24442c5ed4e3SBram Moolenaar      'try',
24452c5ed4e3SBram Moolenaar      '  echo "yes"',
24462c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24472c5ed4e3SBram Moolenaar      'endtry',
24482c5ed4e3SBram Moolenaar      ], 'E488:')
24497a092245SBram Moolenaar  CheckDefFailure([
24507a092245SBram Moolenaar      'try',
24517a092245SBram Moolenaar      'echo "yes"',
24527a092245SBram Moolenaar      'catch',
24537a092245SBram Moolenaar      'endtry# comment',
24547a092245SBram Moolenaar      ], 'E488:')
24552c5ed4e3SBram Moolenaar  CheckScriptFailure([
24562c5ed4e3SBram Moolenaar      'vim9script',
24572c5ed4e3SBram Moolenaar      'try',
24582c5ed4e3SBram Moolenaar      '  echo "yes"',
24592c5ed4e3SBram Moolenaar      'catch',
24602c5ed4e3SBram Moolenaar      'endtry# comment',
24619b7bf9e9SBram Moolenaar      ], 'E488:')
24622c5ed4e3SBram Moolenaar
24632c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24642c5ed4e3SBram Moolenaar      'vim9script',
24652c5ed4e3SBram Moolenaar      'hi # comment',
24662c5ed4e3SBram Moolenaar      ])
24672c5ed4e3SBram Moolenaar  CheckScriptFailure([
24682c5ed4e3SBram Moolenaar      'vim9script',
24692c5ed4e3SBram Moolenaar      'hi# comment',
24702c5ed4e3SBram Moolenaar      ], 'E416:')
24711966c248SBram Moolenaar  CheckScriptSuccess([
24721966c248SBram Moolenaar      'vim9script',
24731966c248SBram Moolenaar      'hi Search # comment',
24741966c248SBram Moolenaar      ])
24751966c248SBram Moolenaar  CheckScriptFailure([
24761966c248SBram Moolenaar      'vim9script',
24771966c248SBram Moolenaar      'hi Search# comment',
24781966c248SBram Moolenaar      ], 'E416:')
24791966c248SBram Moolenaar  CheckScriptSuccess([
24801966c248SBram Moolenaar      'vim9script',
24811966c248SBram Moolenaar      'hi link This Search # comment',
24821966c248SBram Moolenaar      ])
24831966c248SBram Moolenaar  CheckScriptFailure([
24841966c248SBram Moolenaar      'vim9script',
24851966c248SBram Moolenaar      'hi link This That# comment',
24861966c248SBram Moolenaar      ], 'E413:')
24871966c248SBram Moolenaar  CheckScriptSuccess([
24881966c248SBram Moolenaar      'vim9script',
24891966c248SBram Moolenaar      'hi clear This # comment',
24901966c248SBram Moolenaar      'hi clear # comment',
24911966c248SBram Moolenaar      ])
2492f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2493f5be8cdbSBram Moolenaar  # hi clear This# comment',
24941966c248SBram Moolenaar  CheckScriptFailure([
24951966c248SBram Moolenaar      'vim9script',
24961966c248SBram Moolenaar      'hi clear# comment',
24971966c248SBram Moolenaar      ], 'E416:')
24981966c248SBram Moolenaar
24991966c248SBram Moolenaar  CheckScriptSuccess([
25001966c248SBram Moolenaar      'vim9script',
25011966c248SBram Moolenaar      'hi Group term=bold',
25021966c248SBram Moolenaar      'match Group /todo/ # comment',
25031966c248SBram Moolenaar      ])
25041966c248SBram Moolenaar  CheckScriptFailure([
25051966c248SBram Moolenaar      'vim9script',
25061966c248SBram Moolenaar      'hi Group term=bold',
25071966c248SBram Moolenaar      'match Group /todo/# comment',
25081966c248SBram Moolenaar      ], 'E488:')
25091966c248SBram Moolenaar  CheckScriptSuccess([
25101966c248SBram Moolenaar      'vim9script',
25111966c248SBram Moolenaar      'match # comment',
25121966c248SBram Moolenaar      ])
25131966c248SBram Moolenaar  CheckScriptFailure([
25141966c248SBram Moolenaar      'vim9script',
25151966c248SBram Moolenaar      'match# comment',
25161966c248SBram Moolenaar      ], 'E475:')
25171966c248SBram Moolenaar  CheckScriptSuccess([
25181966c248SBram Moolenaar      'vim9script',
25191966c248SBram Moolenaar      'match none # comment',
25201966c248SBram Moolenaar      ])
25211966c248SBram Moolenaar  CheckScriptFailure([
25221966c248SBram Moolenaar      'vim9script',
25231966c248SBram Moolenaar      'match none# comment',
25241966c248SBram Moolenaar      ], 'E475:')
25251966c248SBram Moolenaar
25261966c248SBram Moolenaar  CheckScriptSuccess([
25271966c248SBram Moolenaar      'vim9script',
25281966c248SBram Moolenaar      'menutrans clear # comment',
25291966c248SBram Moolenaar      ])
25301966c248SBram Moolenaar  CheckScriptFailure([
25311966c248SBram Moolenaar      'vim9script',
25321966c248SBram Moolenaar      'menutrans clear# comment text',
25331966c248SBram Moolenaar      ], 'E474:')
25341966c248SBram Moolenaar
25351966c248SBram Moolenaar  CheckScriptSuccess([
25361966c248SBram Moolenaar      'vim9script',
25371966c248SBram Moolenaar      'syntax clear # comment',
25381966c248SBram Moolenaar      ])
25391966c248SBram Moolenaar  CheckScriptFailure([
25401966c248SBram Moolenaar      'vim9script',
25411966c248SBram Moolenaar      'syntax clear# comment text',
25421966c248SBram Moolenaar      ], 'E28:')
25431966c248SBram Moolenaar  CheckScriptSuccess([
25441966c248SBram Moolenaar      'vim9script',
25451966c248SBram Moolenaar      'syntax keyword Word some',
25461966c248SBram Moolenaar      'syntax clear Word # comment',
25471966c248SBram Moolenaar      ])
25481966c248SBram Moolenaar  CheckScriptFailure([
25491966c248SBram Moolenaar      'vim9script',
25501966c248SBram Moolenaar      'syntax keyword Word some',
25511966c248SBram Moolenaar      'syntax clear Word# comment text',
25521966c248SBram Moolenaar      ], 'E28:')
25531966c248SBram Moolenaar
25541966c248SBram Moolenaar  CheckScriptSuccess([
25551966c248SBram Moolenaar      'vim9script',
25561966c248SBram Moolenaar      'syntax list # comment',
25571966c248SBram Moolenaar      ])
25581966c248SBram Moolenaar  CheckScriptFailure([
25591966c248SBram Moolenaar      'vim9script',
25601966c248SBram Moolenaar      'syntax list# comment text',
25611966c248SBram Moolenaar      ], 'E28:')
25621966c248SBram Moolenaar
25631966c248SBram Moolenaar  CheckScriptSuccess([
25641966c248SBram Moolenaar      'vim9script',
25651966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
25661966c248SBram Moolenaar      ])
25671966c248SBram Moolenaar  CheckScriptFailure([
25681966c248SBram Moolenaar      'vim9script',
25691966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25701966c248SBram Moolenaar      ], 'E475:')
25711966c248SBram Moolenaar
25721966c248SBram Moolenaar  CheckScriptSuccess([
25731966c248SBram Moolenaar      'vim9script',
25741966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25751966c248SBram Moolenaar      ])
25761966c248SBram Moolenaar  CheckScriptFailure([
25771966c248SBram Moolenaar      'vim9script',
25781966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25791966c248SBram Moolenaar      ], 'E789:')
25801966c248SBram Moolenaar
25811966c248SBram Moolenaar  CheckScriptSuccess([
25821966c248SBram Moolenaar      'vim9script',
25831966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25841966c248SBram Moolenaar      ])
25851966c248SBram Moolenaar  CheckScriptFailure([
25861966c248SBram Moolenaar      'vim9script',
25871966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25881966c248SBram Moolenaar      ], 'E402:')
25891966c248SBram Moolenaar
25901966c248SBram Moolenaar  CheckScriptSuccess([
25911966c248SBram Moolenaar      'vim9script',
25921966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25931966c248SBram Moolenaar      ])
25941966c248SBram Moolenaar  CheckScriptFailure([
25951966c248SBram Moolenaar      'vim9script',
25961966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25971966c248SBram Moolenaar      ], 'E475:')
25981966c248SBram Moolenaar  CheckScriptFailure([
25991966c248SBram Moolenaar      'vim9script',
26001966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26011966c248SBram Moolenaar      ], 'E406:')
26021966c248SBram Moolenaar  CheckScriptFailure([
26031966c248SBram Moolenaar      'vim9script',
26041966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26051966c248SBram Moolenaar      ], 'E475:')
26061966c248SBram Moolenaar
26071966c248SBram Moolenaar  CheckScriptSuccess([
26081966c248SBram Moolenaar      'vim9script',
26091966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26101966c248SBram Moolenaar      ])
26111966c248SBram Moolenaar  CheckScriptFailure([
26121966c248SBram Moolenaar      'vim9script',
26131966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2614d032f34aSBram Moolenaar      ], 'E402:')
26151966c248SBram Moolenaar
26161966c248SBram Moolenaar  CheckScriptSuccess([
26171966c248SBram Moolenaar      'vim9script',
26181966c248SBram Moolenaar      'syntax sync # comment',
26191966c248SBram Moolenaar      ])
26201966c248SBram Moolenaar  CheckScriptFailure([
26211966c248SBram Moolenaar      'vim9script',
26221966c248SBram Moolenaar      'syntax sync# comment',
26231966c248SBram Moolenaar      ], 'E404:')
26241966c248SBram Moolenaar  CheckScriptSuccess([
26251966c248SBram Moolenaar      'vim9script',
26261966c248SBram Moolenaar      'syntax sync ccomment # comment',
26271966c248SBram Moolenaar      ])
26281966c248SBram Moolenaar  CheckScriptFailure([
26291966c248SBram Moolenaar      'vim9script',
26301966c248SBram Moolenaar      'syntax sync ccomment# comment',
26311966c248SBram Moolenaar      ], 'E404:')
26321966c248SBram Moolenaar
26331966c248SBram Moolenaar  CheckScriptSuccess([
26341966c248SBram Moolenaar      'vim9script',
26351966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26361966c248SBram Moolenaar      ])
26371966c248SBram Moolenaar  CheckScriptFailure([
26381966c248SBram Moolenaar      'vim9script',
26391966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26401966c248SBram Moolenaar      ], 'E475:')
2641a72cfb80SBram Moolenaar
2642a72cfb80SBram Moolenaar  CheckScriptSuccess([
2643a72cfb80SBram Moolenaar      'vim9script',
2644a72cfb80SBram Moolenaar      'command Echo echo # comment',
2645a72cfb80SBram Moolenaar      'command Echo # comment',
2646a72cfb80SBram Moolenaar      ])
2647a72cfb80SBram Moolenaar  CheckScriptFailure([
2648a72cfb80SBram Moolenaar      'vim9script',
2649a72cfb80SBram Moolenaar      'command Echo echo# comment',
2650a72cfb80SBram Moolenaar      'Echo',
2651a72cfb80SBram Moolenaar      ], 'E121:')
2652a72cfb80SBram Moolenaar  CheckScriptFailure([
2653a72cfb80SBram Moolenaar      'vim9script',
2654a72cfb80SBram Moolenaar      'command Echo# comment',
2655a72cfb80SBram Moolenaar      ], 'E182:')
2656a72cfb80SBram Moolenaar  CheckScriptFailure([
2657a72cfb80SBram Moolenaar      'vim9script',
2658a72cfb80SBram Moolenaar      'command Echo echo',
2659a72cfb80SBram Moolenaar      'command Echo# comment',
2660a72cfb80SBram Moolenaar      ], 'E182:')
2661a72cfb80SBram Moolenaar
2662a72cfb80SBram Moolenaar  CheckScriptSuccess([
2663a72cfb80SBram Moolenaar      'vim9script',
2664a72cfb80SBram Moolenaar      'function # comment',
2665a72cfb80SBram Moolenaar      ])
2666a72cfb80SBram Moolenaar  CheckScriptFailure([
2667a72cfb80SBram Moolenaar      'vim9script',
26689898107fSBram Moolenaar      'function " comment',
26699898107fSBram Moolenaar      ], 'E129:')
26709898107fSBram Moolenaar  CheckScriptFailure([
26719898107fSBram Moolenaar      'vim9script',
2672a72cfb80SBram Moolenaar      'function# comment',
2673a72cfb80SBram Moolenaar      ], 'E129:')
2674a72cfb80SBram Moolenaar  CheckScriptSuccess([
2675a72cfb80SBram Moolenaar      'vim9script',
2676a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2677a72cfb80SBram Moolenaar      ])
2678a72cfb80SBram Moolenaar  CheckScriptFailure([
2679a72cfb80SBram Moolenaar      'vim9script',
2680a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2681a72cfb80SBram Moolenaar      ], 'E488:')
2682a72cfb80SBram Moolenaar
2683a72cfb80SBram Moolenaar  CheckScriptSuccess([
2684a72cfb80SBram Moolenaar      'vim9script',
26854c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2686a72cfb80SBram Moolenaar      'endfunc',
26874c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2688a72cfb80SBram Moolenaar      ])
2689a72cfb80SBram Moolenaar  CheckScriptFailure([
2690a72cfb80SBram Moolenaar      'vim9script',
26914c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2692a72cfb80SBram Moolenaar      'endfunc',
26934c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2694a72cfb80SBram Moolenaar      ], 'E488:')
2695a72cfb80SBram Moolenaar
2696a72cfb80SBram Moolenaar  CheckScriptSuccess([
2697a72cfb80SBram Moolenaar      'vim9script',
2698a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2699a72cfb80SBram Moolenaar      ])
2700a72cfb80SBram Moolenaar  CheckScriptFailure([
2701a72cfb80SBram Moolenaar      'vim9script',
2702a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2703a72cfb80SBram Moolenaar      ], 'E488:')
2704e7e4838fSBram Moolenaar
2705e7e4838fSBram Moolenaar  CheckScriptFailure([
2706e7e4838fSBram Moolenaar      'def Test() " comment',
2707e7e4838fSBram Moolenaar      'enddef',
2708e7e4838fSBram Moolenaar      ], 'E488:')
2709e7e4838fSBram Moolenaar  CheckScriptFailure([
2710e7e4838fSBram Moolenaar      'vim9script',
2711e7e4838fSBram Moolenaar      'def Test() " comment',
2712e7e4838fSBram Moolenaar      'enddef',
2713e7e4838fSBram Moolenaar      ], 'E488:')
2714e7e4838fSBram Moolenaar
2715e7e4838fSBram Moolenaar  CheckScriptSuccess([
2716e7e4838fSBram Moolenaar      'func Test() " comment',
2717e7e4838fSBram Moolenaar      'endfunc',
2718e7e4838fSBram Moolenaar      ])
27199898107fSBram Moolenaar  CheckScriptSuccess([
2720e7e4838fSBram Moolenaar      'vim9script',
2721e7e4838fSBram Moolenaar      'func Test() " comment',
2722e7e4838fSBram Moolenaar      'endfunc',
27239898107fSBram Moolenaar      ])
2724e7e4838fSBram Moolenaar
2725e7e4838fSBram Moolenaar  CheckScriptSuccess([
2726e7e4838fSBram Moolenaar      'def Test() # comment',
2727e7e4838fSBram Moolenaar      'enddef',
2728e7e4838fSBram Moolenaar      ])
2729e7e4838fSBram Moolenaar  CheckScriptFailure([
2730e7e4838fSBram Moolenaar      'func Test() # comment',
2731e7e4838fSBram Moolenaar      'endfunc',
2732e7e4838fSBram Moolenaar      ], 'E488:')
27332c5ed4e3SBram Moolenaarenddef
27342c5ed4e3SBram Moolenaar
27352c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27362c5ed4e3SBram Moolenaar  CheckCanRunGui
27372c5ed4e3SBram Moolenaar
27382c5ed4e3SBram Moolenaar  CheckScriptFailure([
27392c5ed4e3SBram Moolenaar      'vim9script',
27402c5ed4e3SBram Moolenaar      'gui#comment'
27412c5ed4e3SBram Moolenaar      ], 'E499:')
27422c5ed4e3SBram Moolenaar  CheckScriptFailure([
27432c5ed4e3SBram Moolenaar      'vim9script',
27442c5ed4e3SBram Moolenaar      'gui -f#comment'
27452c5ed4e3SBram Moolenaar      ], 'E499:')
27467a092245SBram Moolenaarenddef
27477a092245SBram Moolenaar
2748a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27496797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27506797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2751a26b9700SBram Moolenaar
2752a26b9700SBram Moolenaar  edit test.vim
2753a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2754a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2755a26b9700SBram Moolenaar
2756a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2757a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2758a26b9700SBram Moolenaar
2759a26b9700SBram Moolenaar  g:entered = 0
2760a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2761a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2762a26b9700SBram Moolenaar
2763a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2764a26b9700SBram Moolenaar
2765a26b9700SBram Moolenaar  au! TabEnter
2766a26b9700SBram Moolenaar  unlet g:entered
2767d72c1bf0SBram Moolenaar
2768d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2769d72c1bf0SBram Moolenaar      'vim9script',
27706797966dSBram Moolenaar      'g:var = 123',
2771e55b1c09SBram Moolenaar      'b:var = 456',
2772e55b1c09SBram Moolenaar      'w:var = 777',
2773e55b1c09SBram Moolenaar      't:var = 888',
2774d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2775d72c1bf0SBram Moolenaar      ])
2776d72c1bf0SBram Moolenaar
2777d72c1bf0SBram Moolenaar  CheckScriptFailure([
2778d72c1bf0SBram Moolenaar      'vim9script',
2779d72c1bf0SBram Moolenaar      'let g:var = 123',
2780e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2781e55b1c09SBram Moolenaar
2782e55b1c09SBram Moolenaar  CheckScriptFailure([
2783e55b1c09SBram Moolenaar      'vim9script',
2784e55b1c09SBram Moolenaar      'let b:var = 123',
2785e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2786e55b1c09SBram Moolenaar
2787e55b1c09SBram Moolenaar  CheckScriptFailure([
2788e55b1c09SBram Moolenaar      'vim9script',
2789e55b1c09SBram Moolenaar      'let w:var = 123',
2790e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2791e55b1c09SBram Moolenaar
2792e55b1c09SBram Moolenaar  CheckScriptFailure([
2793e55b1c09SBram Moolenaar      'vim9script',
2794e55b1c09SBram Moolenaar      'let t:var = 123',
2795e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2796e55b1c09SBram Moolenaar
2797e55b1c09SBram Moolenaar  CheckScriptFailure([
2798e55b1c09SBram Moolenaar      'vim9script',
2799e55b1c09SBram Moolenaar      'let v:version = 123',
2800e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2801e55b1c09SBram Moolenaar
2802e55b1c09SBram Moolenaar  CheckScriptFailure([
2803e55b1c09SBram Moolenaar      'vim9script',
2804e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2805e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28066797966dSBram Moolenaar
28076797966dSBram Moolenaar  CheckScriptFailure([
28086797966dSBram Moolenaar      'vim9script',
28096797966dSBram Moolenaar      'g:var = 123',
281032e35117SBram Moolenaar      'unlet g:var# comment1',
2811d72c1bf0SBram Moolenaar      ], 'E108:')
2812d72c1bf0SBram Moolenaar
2813d72c1bf0SBram Moolenaar  CheckScriptFailure([
2814d72c1bf0SBram Moolenaar      'let g:var = 123',
2815d72c1bf0SBram Moolenaar      'unlet g:var # something',
2816d72c1bf0SBram Moolenaar      ], 'E488:')
2817faac4104SBram Moolenaar
2818faac4104SBram Moolenaar  CheckScriptSuccess([
2819faac4104SBram Moolenaar      'vim9script',
282032e35117SBram Moolenaar      'if 1 # comment2',
2821faac4104SBram Moolenaar      '  echo "yes"',
2822faac4104SBram Moolenaar      'elseif 2 #comment',
2823faac4104SBram Moolenaar      '  echo "no"',
2824faac4104SBram Moolenaar      'endif',
2825faac4104SBram Moolenaar      ])
2826faac4104SBram Moolenaar
2827faac4104SBram Moolenaar  CheckScriptFailure([
2828faac4104SBram Moolenaar      'vim9script',
282932e35117SBram Moolenaar      'if 1# comment3',
2830faac4104SBram Moolenaar      '  echo "yes"',
2831faac4104SBram Moolenaar      'endif',
2832faac4104SBram Moolenaar      ], 'E15:')
2833faac4104SBram Moolenaar
2834faac4104SBram Moolenaar  CheckScriptFailure([
2835faac4104SBram Moolenaar      'vim9script',
283632e35117SBram Moolenaar      'if 0 # comment4',
2837faac4104SBram Moolenaar      '  echo "yes"',
2838faac4104SBram Moolenaar      'elseif 2#comment',
2839faac4104SBram Moolenaar      '  echo "no"',
2840faac4104SBram Moolenaar      'endif',
2841faac4104SBram Moolenaar      ], 'E15:')
2842faac4104SBram Moolenaar
2843faac4104SBram Moolenaar  CheckScriptSuccess([
2844faac4104SBram Moolenaar      'vim9script',
284532e35117SBram Moolenaar      'let v = 1 # comment5',
2846faac4104SBram Moolenaar      ])
2847faac4104SBram Moolenaar
2848faac4104SBram Moolenaar  CheckScriptFailure([
2849faac4104SBram Moolenaar      'vim9script',
285032e35117SBram Moolenaar      'let v = 1# comment6',
285132e35117SBram Moolenaar      ], 'E15:')
2852faac4104SBram Moolenaar
2853faac4104SBram Moolenaar  CheckScriptSuccess([
2854faac4104SBram Moolenaar      'vim9script',
2855faac4104SBram Moolenaar      'new'
2856faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2857df069eecSBram Moolenaar      ':$',
2858faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2859faac4104SBram Moolenaar      'bwipe!',
2860faac4104SBram Moolenaar      ])
2861faac4104SBram Moolenaar
2862f5be8cdbSBram Moolenaar  CheckScriptFailure([
2863f5be8cdbSBram Moolenaar      'vim9script',
2864f5be8cdbSBram Moolenaar      'new'
2865f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2866f5be8cdbSBram Moolenaar      ':$',
2867f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2868f5be8cdbSBram Moolenaar      'bwipe!',
2869f5be8cdbSBram Moolenaar      ], 'E488:')
2870f5be8cdbSBram Moolenaar
2871f5be8cdbSBram Moolenaar  CheckScriptFailure([
2872f5be8cdbSBram Moolenaar      'vim9script',
2873f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2874f5be8cdbSBram Moolenaar      ], 'E477:')
2875a26b9700SBram Moolenaarenddef
2876a26b9700SBram Moolenaar
28777e5bd91dSBram Moolenaardef Test_finish()
28787e5bd91dSBram Moolenaar  let lines =<< trim END
28797e5bd91dSBram Moolenaar    vim9script
28806797966dSBram Moolenaar    g:res = 'one'
28817e5bd91dSBram Moolenaar    if v:false | finish | endif
28826797966dSBram Moolenaar    g:res = 'two'
28837e5bd91dSBram Moolenaar    finish
28846797966dSBram Moolenaar    g:res = 'three'
28857e5bd91dSBram Moolenaar  END
28867e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
28877e5bd91dSBram Moolenaar  source Xfinished
28887e5bd91dSBram Moolenaar  assert_equal('two', g:res)
28897e5bd91dSBram Moolenaar
28907e5bd91dSBram Moolenaar  unlet g:res
28917e5bd91dSBram Moolenaar  delete('Xfinished')
28927e5bd91dSBram Moolenaarenddef
28937e5bd91dSBram Moolenaar
289432e35117SBram Moolenaardef Test_let_func_call()
289532e35117SBram Moolenaar  let lines =<< trim END
289632e35117SBram Moolenaar    vim9script
289732e35117SBram Moolenaar    func GetValue()
289832e35117SBram Moolenaar      if exists('g:count')
289932e35117SBram Moolenaar        let g:count += 1
290032e35117SBram Moolenaar      else
290132e35117SBram Moolenaar        let g:count = 1
290232e35117SBram Moolenaar      endif
290332e35117SBram Moolenaar      return 'this'
290432e35117SBram Moolenaar    endfunc
290532e35117SBram Moolenaar    let val: string = GetValue()
2906f5be8cdbSBram Moolenaar    # env var is always a string
2907df671b46SBram Moolenaar    let env = $TERM
290832e35117SBram Moolenaar  END
290932e35117SBram Moolenaar  writefile(lines, 'Xfinished')
291032e35117SBram Moolenaar  source Xfinished
2911f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
291232e35117SBram Moolenaar  assert_equal(1, g:count)
291332e35117SBram Moolenaar
291432e35117SBram Moolenaar  unlet g:count
291532e35117SBram Moolenaar  delete('Xfinished')
291632e35117SBram Moolenaarenddef
291732e35117SBram Moolenaar
291832e35117SBram Moolenaardef Test_let_missing_type()
291932e35117SBram Moolenaar  let lines =<< trim END
292032e35117SBram Moolenaar    vim9script
2921df671b46SBram Moolenaar    let var = g:unknown
2922227a69deSBram Moolenaar  END
2923822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2924227a69deSBram Moolenaar
2925227a69deSBram Moolenaar  lines =<< trim END
2926227a69deSBram Moolenaar    vim9script
2927227a69deSBram Moolenaar    let nr: number = 123
2928227a69deSBram Moolenaar    let var = nr
2929227a69deSBram Moolenaar  END
2930822ba247SBram Moolenaar  CheckScriptSuccess(lines)
293132e35117SBram Moolenaarenddef
293232e35117SBram Moolenaar
2933c82a5b5dSBram Moolenaardef Test_let_declaration()
2934c82a5b5dSBram Moolenaar  let lines =<< trim END
2935c82a5b5dSBram Moolenaar    vim9script
2936c82a5b5dSBram Moolenaar    let var: string
2937c82a5b5dSBram Moolenaar    g:var_uninit = var
2938c82a5b5dSBram Moolenaar    var = 'text'
2939c82a5b5dSBram Moolenaar    g:var_test = var
2940f5be8cdbSBram Moolenaar    # prefixing s: is optional
2941984dddbeSBram Moolenaar    s:var = 'prefixed'
2942984dddbeSBram Moolenaar    g:var_prefixed = s:var
2943984dddbeSBram Moolenaar
2944984dddbeSBram Moolenaar    let s:other: number
2945984dddbeSBram Moolenaar    other = 1234
2946984dddbeSBram Moolenaar    g:other_var = other
294753b29e48SBram Moolenaar
294853b29e48SBram Moolenaar    # type is inferred
294953b29e48SBram Moolenaar    s:dict = {'a': 222}
295053b29e48SBram Moolenaar    def GetDictVal(key: any)
295153b29e48SBram Moolenaar      g:dict_val = s:dict[key]
295253b29e48SBram Moolenaar    enddef
295353b29e48SBram Moolenaar    GetDictVal('a')
2954c82a5b5dSBram Moolenaar  END
2955c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2956c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2957c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2958984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2959984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
296053b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
2961c82a5b5dSBram Moolenaar
2962c82a5b5dSBram Moolenaar  unlet g:var_uninit
2963c82a5b5dSBram Moolenaar  unlet g:var_test
2964984dddbeSBram Moolenaar  unlet g:var_prefixed
2965984dddbeSBram Moolenaar  unlet g:other_var
2966c82a5b5dSBram Moolenaarenddef
2967c82a5b5dSBram Moolenaar
2968c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2969c5b1c20bSBram Moolenaar  let lines =<< trim END
2970c5b1c20bSBram Moolenaar    vim9script
2971c5b1c20bSBram Moolenaar    const var: string
2972c5b1c20bSBram Moolenaar  END
2973c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2974c5b1c20bSBram Moolenaar
2975c5b1c20bSBram Moolenaar  lines =<< trim END
2976c5b1c20bSBram Moolenaar    vim9script
2977c5b1c20bSBram Moolenaar    let 9var: string
2978c5b1c20bSBram Moolenaar  END
2979c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2980c5b1c20bSBram Moolenaarenddef
2981c5b1c20bSBram Moolenaar
298234db91f7SBram Moolenaardef Test_let_type_check()
298334db91f7SBram Moolenaar  let lines =<< trim END
298434db91f7SBram Moolenaar    vim9script
298534db91f7SBram Moolenaar    let var: string
298634db91f7SBram Moolenaar    var = 1234
298734db91f7SBram Moolenaar  END
2988451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
2989984dddbeSBram Moolenaar
2990984dddbeSBram Moolenaar  lines =<< trim END
2991984dddbeSBram Moolenaar    vim9script
2992984dddbeSBram Moolenaar    let var:string
2993984dddbeSBram Moolenaar  END
2994984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2995c5b1c20bSBram Moolenaar
2996c5b1c20bSBram Moolenaar  lines =<< trim END
2997c5b1c20bSBram Moolenaar    vim9script
2998c5b1c20bSBram Moolenaar    let var: asdf
2999c5b1c20bSBram Moolenaar  END
3000c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3001a71e2633SBram Moolenaar
3002a71e2633SBram Moolenaar  lines =<< trim END
3003a71e2633SBram Moolenaar    vim9script
3004a71e2633SBram Moolenaar    let s:l: list<number>
3005a71e2633SBram Moolenaar    s:l = []
3006a71e2633SBram Moolenaar  END
3007a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3008a71e2633SBram Moolenaar
3009a71e2633SBram Moolenaar  lines =<< trim END
3010a71e2633SBram Moolenaar    vim9script
3011a71e2633SBram Moolenaar    let s:d: dict<number>
3012a71e2633SBram Moolenaar    s:d = {}
3013a71e2633SBram Moolenaar  END
3014a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
301534db91f7SBram Moolenaarenddef
301634db91f7SBram Moolenaar
3017a5d0077eSBram Moolenaardef Test_forward_declaration()
3018a5d0077eSBram Moolenaar  let lines =<< trim END
3019a5d0077eSBram Moolenaar    vim9script
3020a5d0077eSBram Moolenaar    def GetValue(): string
3021a5d0077eSBram Moolenaar      return theVal
3022a5d0077eSBram Moolenaar    enddef
3023a5d0077eSBram Moolenaar    let theVal = 'something'
3024822ba247SBram Moolenaar    g:initVal = GetValue()
3025a5d0077eSBram Moolenaar    theVal = 'else'
3026a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3027a5d0077eSBram Moolenaar  END
3028a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3029a5d0077eSBram Moolenaar  source Xforward
3030a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3031a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3032a5d0077eSBram Moolenaar
3033a5d0077eSBram Moolenaar  unlet g:initVal
3034a5d0077eSBram Moolenaar  unlet g:laterVal
3035a5d0077eSBram Moolenaar  delete('Xforward')
3036a5d0077eSBram Moolenaarenddef
3037a5d0077eSBram Moolenaar
30389721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
30399721fb4eSBram Moolenaar  let legacy_lines =<< trim END
30409721fb4eSBram Moolenaar    source Xvim9_script.vim
30419721fb4eSBram Moolenaar
30429721fb4eSBram Moolenaar    call assert_false(exists('local'))
30439721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30449721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30459721fb4eSBram Moolenaar    call assert_equal('global', global)
30469721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30479721fb4eSBram Moolenaar
30489721fb4eSBram Moolenaar    " imported variable becomes script-local
30499721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30509721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30519721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30529721fb4eSBram Moolenaar
30539721fb4eSBram Moolenaar    " imported function becomes script-local
30549721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30559721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30569721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30579721fb4eSBram Moolenaar  END
30589721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30599721fb4eSBram Moolenaar
30609721fb4eSBram Moolenaar  let vim9_lines =<< trim END
30619721fb4eSBram Moolenaar    vim9script
30629721fb4eSBram Moolenaar    let local = 'local'
30639721fb4eSBram Moolenaar    g:global = 'global'
30649721fb4eSBram Moolenaar    export let exported = 'exported'
30659721fb4eSBram Moolenaar    export def GetText(): string
30669721fb4eSBram Moolenaar       return 'text'
30679721fb4eSBram Moolenaar    enddef
30689721fb4eSBram Moolenaar  END
30699721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
30709721fb4eSBram Moolenaar
30719721fb4eSBram Moolenaar  source Xlegacy_script.vim
30729721fb4eSBram Moolenaar
30739721fb4eSBram Moolenaar  assert_equal('global', g:global)
3074f5be8cdbSBram Moolenaar  unlet g:global
30759721fb4eSBram Moolenaar
30769721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30779721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30789721fb4eSBram Moolenaarenddef
3079a5d0077eSBram Moolenaar
30807d699701SBram Moolenaarfunc Test_vim9script_not_global()
30817d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30827d699701SBram Moolenaar  let vim9lines =<< trim END
30837d699701SBram Moolenaar    vim9script
30847d699701SBram Moolenaar    let var = 'local'
30857d699701SBram Moolenaar    func TheFunc()
30867d699701SBram Moolenaar      echo 'local'
30877d699701SBram Moolenaar    endfunc
30887d699701SBram Moolenaar    def DefFunc()
30897d699701SBram Moolenaar      echo 'local'
30907d699701SBram Moolenaar    enddef
30917d699701SBram Moolenaar  END
30927d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30937d699701SBram Moolenaar  source Xvim9script.vim
30947d699701SBram Moolenaar  try
30957d699701SBram Moolenaar    echo g:var
30967d699701SBram Moolenaar    assert_report('did not fail')
30977d699701SBram Moolenaar  catch /E121:/
30987d699701SBram Moolenaar    " caught
30997d699701SBram Moolenaar  endtry
31007d699701SBram Moolenaar  try
31017d699701SBram Moolenaar    call TheFunc()
31027d699701SBram Moolenaar    assert_report('did not fail')
31037d699701SBram Moolenaar  catch /E117:/
31047d699701SBram Moolenaar    " caught
31057d699701SBram Moolenaar  endtry
31067d699701SBram Moolenaar  try
31077d699701SBram Moolenaar    call DefFunc()
31087d699701SBram Moolenaar    assert_report('did not fail')
31097d699701SBram Moolenaar  catch /E117:/
31107d699701SBram Moolenaar    " caught
31117d699701SBram Moolenaar  endtry
31127d699701SBram Moolenaar
31137d699701SBram Moolenaar  call delete('Xvim9script.vium')
31147d699701SBram Moolenaarendfunc
31157d699701SBram Moolenaar
3116eeb27bfeSBram Moolenaardef Test_vim9_copen()
3117eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3118eeb27bfeSBram Moolenaar  copen
3119eeb27bfeSBram Moolenaar  quit
3120eeb27bfeSBram Moolenaarenddef
3121eeb27bfeSBram Moolenaar
31222d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31232d6b20d6SBram Moolenaardef Test_vim9_autoload()
31242d6b20d6SBram Moolenaar  let lines =<< trim END
31252d6b20d6SBram Moolenaar     vim9script
31262d6b20d6SBram Moolenaar     def foo#test()
31272d6b20d6SBram Moolenaar         echomsg getreg('"')
31282d6b20d6SBram Moolenaar     enddef
31292d6b20d6SBram Moolenaar  END
31302d6b20d6SBram Moolenaar
31312d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31322d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
31332d6b20d6SBram Moolenaar  let save_rtp = &rtp
31342d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31352d6b20d6SBram Moolenaar  augroup test
31362d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31372d6b20d6SBram Moolenaar  augroup END
31382d6b20d6SBram Moolenaar
31392d6b20d6SBram Moolenaar  normal Y
31402d6b20d6SBram Moolenaar
31412d6b20d6SBram Moolenaar  augroup test
31422d6b20d6SBram Moolenaar    autocmd!
31432d6b20d6SBram Moolenaar  augroup END
31442d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31452d6b20d6SBram Moolenaar  &rtp = save_rtp
31462d6b20d6SBram Moolenaarenddef
31472d6b20d6SBram Moolenaar
31483896a105SBram Moolenaardef Test_cmdline_win()
31493896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31503896a105SBram Moolenaar  # the command line window.
31513896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
31523896a105SBram Moolenaar  let export_lines =<< trim END
31533896a105SBram Moolenaar    vim9script
31543896a105SBram Moolenaar    export let That = 'yes'
31553896a105SBram Moolenaar  END
31563896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
31573896a105SBram Moolenaar  let import_lines =<< trim END
31583896a105SBram Moolenaar    vim9script
31593896a105SBram Moolenaar    import That from './Xexport.vim'
31603896a105SBram Moolenaar  END
31613896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
31623896a105SBram Moolenaar  let save_rtp = &rtp
31633896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
31643896a105SBram Moolenaar  syntax on
31653896a105SBram Moolenaar  augroup CmdWin
31663896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
31673896a105SBram Moolenaar  augroup END
31683896a105SBram Moolenaar  # this will open and also close the cmdline window
31693896a105SBram Moolenaar  feedkeys('q:', 'xt')
31703896a105SBram Moolenaar  assert_equal('yes', g:got_there)
31713896a105SBram Moolenaar
31723896a105SBram Moolenaar  augroup CmdWin
31733896a105SBram Moolenaar    au!
31743896a105SBram Moolenaar  augroup END
31753896a105SBram Moolenaar  &rtp = save_rtp
31763896a105SBram Moolenaar  delete('rtp', 'rf')
31773896a105SBram Moolenaarenddef
31783896a105SBram Moolenaar
3179585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3180585fea7bSBram Moolenaardef Test_substitute_cmd()
3181585fea7bSBram Moolenaar  new
3182585fea7bSBram Moolenaar  setline(1, 'something')
3183585fea7bSBram Moolenaar  :substitute(some(other(
3184585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3185585fea7bSBram Moolenaar  bwipe!
3186585fea7bSBram Moolenaar
3187f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3188585fea7bSBram Moolenaar  let lines =<< trim END
3189585fea7bSBram Moolenaar    vim9script
3190585fea7bSBram Moolenaar    new
3191585fea7bSBram Moolenaar    setline(1, 'something')
3192585fea7bSBram Moolenaar    :substitute(some(other(
3193585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3194585fea7bSBram Moolenaar    bwipe!
3195585fea7bSBram Moolenaar  END
3196585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3197585fea7bSBram Moolenaar  source Xvim9lines
3198585fea7bSBram Moolenaar
3199585fea7bSBram Moolenaar  delete('Xvim9lines')
3200585fea7bSBram Moolenaarenddef
3201585fea7bSBram Moolenaar
32028a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3203