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
93b5ed2660SBram Moolenaar  lines =<< trim END
94b5ed2660SBram Moolenaar    vim9script
95b5ed2660SBram Moolenaar    &ts = 6
96b5ed2660SBram Moolenaar    &ts += 3
97b5ed2660SBram Moolenaar    assert_equal(9, &ts)
98b5ed2660SBram Moolenaar  END
99*0aae4809SBram Moolenaar  CheckScriptSuccess(lines)
100b5ed2660SBram Moolenaar
101*0aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
102*0aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
103*0aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
104*0aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
105*0aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
106*0aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
107*0aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
108*0aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
109cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
110*0aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11180c34ca3SBram Moolenaar  &ts = 8
112a8c17704SBram Moolenaar
113*0aae4809SBram Moolenaar  lines =<< trim END
114*0aae4809SBram Moolenaar    let save_TI = &t_TI
115*0aae4809SBram Moolenaar    &t_TI = ''
116*0aae4809SBram Moolenaar    assert_equal('', &t_TI)
117*0aae4809SBram Moolenaar    &t_TI = 'xxx'
118*0aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
119*0aae4809SBram Moolenaar    &t_TI = save_TI
120*0aae4809SBram Moolenaar  END
121*0aae4809SBram Moolenaar  CheckDefSuccess(lines)
122*0aae4809SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
123*0aae4809SBram Moolenaar
124*0aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
125*0aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
126*0aae4809SBram Moolenaar
127*0aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
128*0aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
12933afa244SBram Moolenaar
130f9b2b496SBram Moolenaar  lines =<< trim END
131f9b2b496SBram Moolenaar    vim9script
132f9b2b496SBram Moolenaar    def SomeFunc()
133f9b2b496SBram Moolenaar      s:var = 123
134f9b2b496SBram Moolenaar    enddef
135f9b2b496SBram Moolenaar    defcompile
136f9b2b496SBram Moolenaar  END
137f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
138f9b2b496SBram Moolenaar
139a8c17704SBram Moolenaar  g:inc_counter += 1
140a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
141a8c17704SBram Moolenaar
142a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
143a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
144dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
145451c2e35SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
146a8c17704SBram Moolenaar
147a8c17704SBram Moolenaar  @a = 'areg'
148a8c17704SBram Moolenaar  @a ..= 'add'
149a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
150dd29f1b0SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
151451c2e35SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1012:')
152e69f6d04SBram Moolenaar
153b5ed2660SBram Moolenaar  lines =<< trim END
154b5ed2660SBram Moolenaar    vim9script
155b5ed2660SBram Moolenaar    @c = 'areg'
156b5ed2660SBram Moolenaar    @c ..= 'add'
157b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
158b5ed2660SBram Moolenaar  END
159b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
160b5ed2660SBram Moolenaar
161e69f6d04SBram Moolenaar  v:errmsg = 'none'
162e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
163e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
164dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
165451c2e35SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1012:')
16633afa244SBram Moolenaar
16733afa244SBram Moolenaar  # single letter variables
16833afa244SBram Moolenaar  a = 123
16933afa244SBram Moolenaar  assert_equal(123, a)
17033afa244SBram Moolenaar  let b: number
17133afa244SBram Moolenaar  b = 123
17233afa244SBram Moolenaar  assert_equal(123, b)
17333afa244SBram Moolenaar  let g: number
17433afa244SBram Moolenaar  g = 123
17533afa244SBram Moolenaar  assert_equal(123, g)
17633afa244SBram Moolenaar  let s: number
17733afa244SBram Moolenaar  s = 123
17833afa244SBram Moolenaar  assert_equal(123, s)
17933afa244SBram Moolenaar  let t: number
18033afa244SBram Moolenaar  t = 123
18133afa244SBram Moolenaar  assert_equal(123, t)
18233afa244SBram Moolenaar  let v: number
18333afa244SBram Moolenaar  v = 123
18433afa244SBram Moolenaar  assert_equal(123, v)
18533afa244SBram Moolenaar  let w: number
18633afa244SBram Moolenaar  w = 123
18733afa244SBram Moolenaar  assert_equal(123, w)
1885deeb3f1SBram Moolenaarenddef
1895deeb3f1SBram Moolenaar
1903b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1913b74b6b4SBram Moolenaar  let lines =<< trim END
1923b74b6b4SBram Moolenaar      vim9script
1933b74b6b4SBram Moolenaar
194f5be8cdbSBram Moolenaar      # single character variable declarations work
1953b74b6b4SBram Moolenaar      let a: string
1963b74b6b4SBram Moolenaar      let b: number
1973b74b6b4SBram Moolenaar      let l: list<any>
1983b74b6b4SBram Moolenaar      let s: string
1993b74b6b4SBram Moolenaar      let t: number
2003b74b6b4SBram Moolenaar      let v: number
2013b74b6b4SBram Moolenaar      let w: number
2023b74b6b4SBram Moolenaar
203f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2043b74b6b4SBram Moolenaar      a = 'script-a'
2053b74b6b4SBram Moolenaar      b = 111
2063b74b6b4SBram Moolenaar      l = [1, 2, 3]
2073b74b6b4SBram Moolenaar      s = 'script-s'
2083b74b6b4SBram Moolenaar      t = 222
2093b74b6b4SBram Moolenaar      v = 333
2103b74b6b4SBram Moolenaar      w = 444
2113b74b6b4SBram Moolenaar
2123b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2133b74b6b4SBram Moolenaar      assert_equal(111, b)
2143b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2153b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2163b74b6b4SBram Moolenaar      assert_equal(222, t)
2173b74b6b4SBram Moolenaar      assert_equal(333, v)
2183b74b6b4SBram Moolenaar      assert_equal(444, w)
2193b74b6b4SBram Moolenaar  END
2203b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2213b74b6b4SBram Moolenaar  source Xsinglechar
2223b74b6b4SBram Moolenaar  delete('Xsinglechar')
2233b74b6b4SBram Moolenaarenddef
2243b74b6b4SBram Moolenaar
22584370087SBram Moolenaardef Test_assignment_list()
22684370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
22784370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
22884370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
22984370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
23084370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
23184370087SBram Moolenaar
23284370087SBram Moolenaar  let listS: list<string> = []
23384370087SBram Moolenaar  let listN: list<number> = []
23484370087SBram Moolenaar
23584370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
23684370087SBram Moolenaar  list2[-1] = 99
23784370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
23884370087SBram Moolenaar  list2[-2] = 88
23984370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
24084370087SBram Moolenaar  list2[-3] = 77
24184370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
242dd29f1b0SBram Moolenaar  list2 += [100]
243dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
244dd29f1b0SBram Moolenaar
245dd29f1b0SBram Moolenaar  list3 += ['end']
246dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
247dd29f1b0SBram Moolenaar
248dd29f1b0SBram Moolenaar
24984370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
250c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
25184370087SBram Moolenaar
25284370087SBram Moolenaar  # type becomes list<any>
25384370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
25484370087SBram Moolenaarenddef
25584370087SBram Moolenaar
256b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
257b31be3f9SBram Moolenaar  let lines =<< trim END
258b31be3f9SBram Moolenaar    vim9script
259b31be3f9SBram Moolenaar    let v1: number
260b31be3f9SBram Moolenaar    let v2: number
261b31be3f9SBram Moolenaar    let v3: number
262b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
263b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
264b31be3f9SBram Moolenaar  END
265b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
266b31be3f9SBram Moolenaarenddef
267b31be3f9SBram Moolenaar
26884370087SBram Moolenaardef Test_assignment_dict()
26984370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
27084370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
27184370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
27284370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
27374fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
27484370087SBram Moolenaar
275f5be8cdbSBram Moolenaar  # overwrite
276c785b9a7SBram Moolenaar  dict3['key'] = 'another'
277c785b9a7SBram Moolenaar
27858626872SBram Moolenaar  # empty key can be used
27958626872SBram Moolenaar  let dd = {}
28058626872SBram Moolenaar  dd[""] = 6
28158626872SBram Moolenaar  assert_equal({'': 6}, dd)
28284370087SBram Moolenaar
28384370087SBram Moolenaar  # type becomes dict<any>
28484370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
2858e4c8c85SBram Moolenaar
2868e4c8c85SBram Moolenaar  # assignment to script-local dict
2878e4c8c85SBram Moolenaar  let lines =<< trim END
2888e4c8c85SBram Moolenaar    vim9script
2898e4c8c85SBram Moolenaar    let test: dict<any> = {}
2908e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2918e4c8c85SBram Moolenaar      test['a'] = 43
2928e4c8c85SBram Moolenaar      return test
2938e4c8c85SBram Moolenaar    enddef
2948e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2958e4c8c85SBram Moolenaar  END
2968e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
2978e4c8c85SBram Moolenaar
2988e4c8c85SBram Moolenaar  lines =<< trim END
2998e4c8c85SBram Moolenaar    vim9script
3008e4c8c85SBram Moolenaar    let test: dict<any>
3018e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3028e4c8c85SBram Moolenaar      test['a'] = 43
3038e4c8c85SBram Moolenaar      return test
3048e4c8c85SBram Moolenaar    enddef
3058e4c8c85SBram Moolenaar    FillDict()
3068e4c8c85SBram Moolenaar  END
3078e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3082caa1594SBram Moolenaar
3092caa1594SBram Moolenaar  # assignment to global dict
3102caa1594SBram Moolenaar  lines =<< trim END
3112caa1594SBram Moolenaar    vim9script
3122caa1594SBram Moolenaar    g:test = {}
3132caa1594SBram Moolenaar    def FillDict(): dict<any>
3142caa1594SBram Moolenaar      g:test['a'] = 43
3152caa1594SBram Moolenaar      return g:test
3162caa1594SBram Moolenaar    enddef
3172caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3182caa1594SBram Moolenaar  END
3192caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3202caa1594SBram Moolenaar
3212caa1594SBram Moolenaar  # assignment to buffer dict
3222caa1594SBram Moolenaar  lines =<< trim END
3232caa1594SBram Moolenaar    vim9script
3242caa1594SBram Moolenaar    b:test = {}
3252caa1594SBram Moolenaar    def FillDict(): dict<any>
3262caa1594SBram Moolenaar      b:test['a'] = 43
3272caa1594SBram Moolenaar      return b:test
3282caa1594SBram Moolenaar    enddef
3292caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3302caa1594SBram Moolenaar  END
3312caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
33284370087SBram Moolenaarenddef
33384370087SBram Moolenaar
334d3aac291SBram Moolenaardef Test_assignment_local()
335f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
336f5be8cdbSBram Moolenaar  # changed.
337d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
338d3aac291SBram Moolenaar    let b:existing = 'yes'
339d3aac291SBram Moolenaar    let w:existing = 'yes'
340d3aac291SBram Moolenaar    let t:existing = 'yes'
341d3aac291SBram Moolenaar
342d3aac291SBram Moolenaar    def Test_assignment_local_internal()
343d3aac291SBram Moolenaar      b:newvar = 'new'
344d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
345d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
346d3aac291SBram Moolenaar      b:existing = 'no'
347d3aac291SBram Moolenaar      assert_equal('no', b:existing)
348396f3138SBram Moolenaar      b:existing ..= 'NO'
349396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
350d3aac291SBram Moolenaar
351d3aac291SBram Moolenaar      w:newvar = 'new'
352d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
353d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
354d3aac291SBram Moolenaar      w:existing = 'no'
355d3aac291SBram Moolenaar      assert_equal('no', w:existing)
356396f3138SBram Moolenaar      w:existing ..= 'NO'
357396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
358d3aac291SBram Moolenaar
359d3aac291SBram Moolenaar      t:newvar = 'new'
360d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
361d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
362d3aac291SBram Moolenaar      t:existing = 'no'
363d3aac291SBram Moolenaar      assert_equal('no', t:existing)
364396f3138SBram Moolenaar      t:existing ..= 'NO'
365396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
366d3aac291SBram Moolenaar    enddef
367d3aac291SBram Moolenaar    call Test_assignment_local_internal()
368d3aac291SBram Moolenaar  END
369d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
370d3aac291SBram Moolenaarenddef
371d3aac291SBram Moolenaar
3725deeb3f1SBram Moolenaardef Test_assignment_default()
373e69f6d04SBram Moolenaar
374cb711abfSBram Moolenaar  # Test default values.
375e69f6d04SBram Moolenaar  let thebool: bool
376e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
377e69f6d04SBram Moolenaar
378e69f6d04SBram Moolenaar  let thenumber: number
379e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
380e69f6d04SBram Moolenaar
381e69f6d04SBram Moolenaar  if has('float')
382e69f6d04SBram Moolenaar    let thefloat: float
383e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
384e69f6d04SBram Moolenaar  endif
385e69f6d04SBram Moolenaar
386e69f6d04SBram Moolenaar  let thestring: string
387e69f6d04SBram Moolenaar  assert_equal('', thestring)
388e69f6d04SBram Moolenaar
389e69f6d04SBram Moolenaar  let theblob: blob
390e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
391e69f6d04SBram Moolenaar
3925deeb3f1SBram Moolenaar  let Thefunc: func
3935deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
394e69f6d04SBram Moolenaar
395e69f6d04SBram Moolenaar  let thelist: list<any>
396e69f6d04SBram Moolenaar  assert_equal([], thelist)
397e69f6d04SBram Moolenaar
398e69f6d04SBram Moolenaar  let thedict: dict<any>
399e69f6d04SBram Moolenaar  assert_equal({}, thedict)
400e69f6d04SBram Moolenaar
4012c869deeSBram Moolenaar  if has('channel')
402e69f6d04SBram Moolenaar    let thejob: job
403e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
404e69f6d04SBram Moolenaar
405e69f6d04SBram Moolenaar    let thechannel: channel
406e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
407c785b9a7SBram Moolenaar
408c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
409f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
410c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
411c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
412c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
413c785b9a7SBram Moolenaar    endif
4142c869deeSBram Moolenaar  endif
415585fea7bSBram Moolenaar
416585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
417585fea7bSBram Moolenaar  assert_equal(5678, nr)
4188a7d6542SBram Moolenaarenddef
4198a7d6542SBram Moolenaar
42047a519a9SBram Moolenaardef Test_assignment_var_list()
42147a519a9SBram Moolenaar  let v1: string
42247a519a9SBram Moolenaar  let v2: string
4239af78769SBram Moolenaar  let vrem: list<string>
4249af78769SBram Moolenaar  [v1] = ['aaa']
4259af78769SBram Moolenaar  assert_equal('aaa', v1)
4269af78769SBram Moolenaar
42747a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
42847a519a9SBram Moolenaar  assert_equal('one', v1)
42947a519a9SBram Moolenaar  assert_equal('two', v2)
4309af78769SBram Moolenaar
4319af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4329af78769SBram Moolenaar  assert_equal('one', v1)
4339af78769SBram Moolenaar  assert_equal('two', v2)
4349af78769SBram Moolenaar  assert_equal([], vrem)
4359af78769SBram Moolenaar
4369af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4379af78769SBram Moolenaar  assert_equal('one', v1)
4389af78769SBram Moolenaar  assert_equal('two', v2)
4399af78769SBram Moolenaar  assert_equal(['three'], vrem)
4401c199f9cSBram Moolenaar
4411c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4421c199f9cSBram Moolenaar  assert_equal(3, &ts)
4431c199f9cSBram Moolenaar  assert_equal(4, &sw)
4441c199f9cSBram Moolenaar  set ts=8 sw=4
44547a519a9SBram Moolenaarenddef
44647a519a9SBram Moolenaar
447c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
448c7e44a7eSBram Moolenaar  let lines =<< trim END
449c7e44a7eSBram Moolenaar    vim9script
450c7e44a7eSBram Moolenaar    def Func(): list<number>
451c7e44a7eSBram Moolenaar      return [1, 2]
452c7e44a7eSBram Moolenaar    enddef
453c7e44a7eSBram Moolenaar    let var1: number
454c7e44a7eSBram Moolenaar    let var2: number
455c7e44a7eSBram Moolenaar    [var1, var2] =
456c7e44a7eSBram Moolenaar          Func()
457c7e44a7eSBram Moolenaar    assert_equal(1, var1)
458c7e44a7eSBram Moolenaar    assert_equal(2, var2)
459c7e44a7eSBram Moolenaar    let ll =
460c7e44a7eSBram Moolenaar          Func()
461c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
46283144546SBram Moolenaar
46383144546SBram Moolenaar    @/ = 'text'
46483144546SBram Moolenaar    assert_equal('text', @/)
46583144546SBram Moolenaar    @0 = 'zero'
46683144546SBram Moolenaar    assert_equal('zero', @0)
46783144546SBram Moolenaar    @1 = 'one'
46883144546SBram Moolenaar    assert_equal('one', @1)
46983144546SBram Moolenaar    @9 = 'nine'
47083144546SBram Moolenaar    assert_equal('nine', @9)
47183144546SBram Moolenaar    @- = 'minus'
47283144546SBram Moolenaar    assert_equal('minus', @-)
47383144546SBram Moolenaar    if has('clipboard_working')
47483144546SBram Moolenaar      @* = 'star'
47583144546SBram Moolenaar      assert_equal('star', @*)
47683144546SBram Moolenaar      @+ = 'plus'
47783144546SBram Moolenaar      assert_equal('plus', @+)
47883144546SBram Moolenaar    endif
47995dd9f25SBram Moolenaar
48095dd9f25SBram Moolenaar    let a: number = 123
48195dd9f25SBram Moolenaar    assert_equal(123, a)
48295dd9f25SBram Moolenaar    let s: string = 'yes'
48395dd9f25SBram Moolenaar    assert_equal('yes', s)
48495dd9f25SBram Moolenaar    let b: number = 42
48595dd9f25SBram Moolenaar    assert_equal(42, b)
48695dd9f25SBram Moolenaar    let w: number = 43
48795dd9f25SBram Moolenaar    assert_equal(43, w)
48895dd9f25SBram Moolenaar    let t: number = 44
48995dd9f25SBram Moolenaar    assert_equal(44, t)
490c7e44a7eSBram Moolenaar  END
491c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
492c7e44a7eSBram Moolenaarenddef
493c7e44a7eSBram Moolenaar
494cab27678SBram Moolenaardef Mess(): string
495cab27678SBram Moolenaar  v:foldstart = 123
496cab27678SBram Moolenaar  return 'xxx'
497cab27678SBram Moolenaarenddef
498cab27678SBram Moolenaar
499d72c1bf0SBram Moolenaardef Test_assignment_failure()
5008a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
5018a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
5028a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
5038a7d6542SBram Moolenaar
50463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
50563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
50663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
50763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
50863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
50963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
51063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
51163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
51263be3d4bSBram Moolenaar
5138a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5148a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5158a7d6542SBram Moolenaar
5169b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5179af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5189af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5199af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5209af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5219af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5229af78769SBram Moolenaar                            'let y: number',
5239af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5249af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5259af78769SBram Moolenaar                            'let y: number',
5269af78769SBram Moolenaar                            'let z: list<number>',
5279af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5289be61bbbSBram Moolenaar
529e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
530c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5319be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
532c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5339be61bbbSBram Moolenaar
534e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
535c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5369be61bbbSBram Moolenaar
537434d72cbSBram Moolenaar  if has('dnd')
53865821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
539434d72cbSBram Moolenaar  else
540434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
541434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
542434d72cbSBram Moolenaar  endif
5439be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
54465821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
545c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5469be61bbbSBram Moolenaar
547e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
548e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
549e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
550e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5519be61bbbSBram Moolenaar
5529be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5539be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5549be61bbbSBram Moolenaar
555451c2e35SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
55633fa29cfSBram Moolenaar
5578a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5588a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5598a7d6542SBram Moolenaar
5608a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5618a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5628a7d6542SBram Moolenaar
5638a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5648a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
56542a480bfSBram Moolenaar
566d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
56742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
568cab27678SBram Moolenaar
569cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
570cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
57143e969d3SBram Moolenaar
57243e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
57343e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
57443e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
57543e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
57643e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
57743e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
57843e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
57943e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
580d72c1bf0SBram Moolenaarenddef
581d72c1bf0SBram Moolenaar
582d72c1bf0SBram Moolenaardef Test_unlet()
583d72c1bf0SBram Moolenaar  g:somevar = 'yes'
584d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
585d72c1bf0SBram Moolenaar  unlet g:somevar
586d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
587d72c1bf0SBram Moolenaar  unlet! g:somevar
588d72c1bf0SBram Moolenaar
589d72c1bf0SBram Moolenaar  call CheckScriptFailure([
590d72c1bf0SBram Moolenaar        'vim9script',
591d72c1bf0SBram Moolenaar        'let svar = 123',
592d72c1bf0SBram Moolenaar        'unlet svar',
593d72c1bf0SBram Moolenaar        ], 'E1081:')
594d72c1bf0SBram Moolenaar  call CheckScriptFailure([
595d72c1bf0SBram Moolenaar        'vim9script',
596d72c1bf0SBram Moolenaar        'let svar = 123',
597d72c1bf0SBram Moolenaar        'unlet s:svar',
598d72c1bf0SBram Moolenaar        ], 'E1081:')
599d72c1bf0SBram Moolenaar  call CheckScriptFailure([
600d72c1bf0SBram Moolenaar        'vim9script',
601d72c1bf0SBram Moolenaar        'let svar = 123',
602d72c1bf0SBram Moolenaar        'def Func()',
603d72c1bf0SBram Moolenaar        '  unlet svar',
604d72c1bf0SBram Moolenaar        'enddef',
605822ba247SBram Moolenaar        'defcompile',
606d72c1bf0SBram Moolenaar        ], 'E1081:')
607d72c1bf0SBram Moolenaar  call CheckScriptFailure([
608d72c1bf0SBram Moolenaar        'vim9script',
609d72c1bf0SBram Moolenaar        'let svar = 123',
610d72c1bf0SBram Moolenaar        'def Func()',
611d72c1bf0SBram Moolenaar        '  unlet s:svar',
612d72c1bf0SBram Moolenaar        'enddef',
613822ba247SBram Moolenaar        'defcompile',
614d72c1bf0SBram Moolenaar        ], 'E1081:')
6157bdaea6eSBram Moolenaar
6167bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6177bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6187bdaea6eSBram Moolenaar  unlet $ENVVAR
6197bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
620d72c1bf0SBram Moolenaarenddef
621599c89c8SBram Moolenaar
6224c17ad94SBram Moolenaardef Test_delfunction()
623f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6244c17ad94SBram Moolenaar  CheckScriptSuccess([
6254c17ad94SBram Moolenaar      'vim9script',
6264c17ad94SBram Moolenaar      'func CheckMe()',
6274c17ad94SBram Moolenaar      '  return 123',
6284c17ad94SBram Moolenaar      'endfunc',
6294c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6304c17ad94SBram Moolenaar      ])
6314c17ad94SBram Moolenaar
632f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6334c17ad94SBram Moolenaar  CheckScriptFailure([
6344c17ad94SBram Moolenaar      'vim9script',
6354c17ad94SBram Moolenaar      'func DeleteMe1()',
6364c17ad94SBram Moolenaar      'endfunc',
6374c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6384c17ad94SBram Moolenaar      ], 'E1084:')
6394c17ad94SBram Moolenaar  CheckScriptFailure([
6404c17ad94SBram Moolenaar      'vim9script',
6414c17ad94SBram Moolenaar      'func DeleteMe2()',
6424c17ad94SBram Moolenaar      'endfunc',
6434c17ad94SBram Moolenaar      'def DoThat()',
6444c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6454c17ad94SBram Moolenaar      'enddef',
6464c17ad94SBram Moolenaar      'DoThat()',
6474c17ad94SBram Moolenaar      ], 'E1084:')
6484c17ad94SBram Moolenaar  CheckScriptFailure([
6494c17ad94SBram Moolenaar      'vim9script',
6504c17ad94SBram Moolenaar      'def DeleteMe3()',
6514c17ad94SBram Moolenaar      'enddef',
6524c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6534c17ad94SBram Moolenaar      ], 'E1084:')
6544c17ad94SBram Moolenaar  CheckScriptFailure([
6554c17ad94SBram Moolenaar      'vim9script',
6564c17ad94SBram Moolenaar      'def DeleteMe4()',
6574c17ad94SBram Moolenaar      'enddef',
6584c17ad94SBram Moolenaar      'def DoThat()',
6594c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6604c17ad94SBram Moolenaar      'enddef',
6614c17ad94SBram Moolenaar      'DoThat()',
6624c17ad94SBram Moolenaar      ], 'E1084:')
663925e9fd6SBram Moolenaar
664925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
665925e9fd6SBram Moolenaar  let lines =<< trim END
666925e9fd6SBram Moolenaar      vim9script
667925e9fd6SBram Moolenaar      def g:Global(): string
668925e9fd6SBram Moolenaar        return "yes"
669925e9fd6SBram Moolenaar      enddef
670925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
671925e9fd6SBram Moolenaar      def! g:Global(): string
672925e9fd6SBram Moolenaar        return "no"
673925e9fd6SBram Moolenaar      enddef
674925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
675925e9fd6SBram Moolenaar      delfunc g:Global
676925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
677925e9fd6SBram Moolenaar  END
678925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
679925e9fd6SBram Moolenaar
680925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
681925e9fd6SBram Moolenaar  lines =<< trim END
682925e9fd6SBram Moolenaar      vim9script
683925e9fd6SBram Moolenaar      func g:Global()
684925e9fd6SBram Moolenaar        return "yes"
685925e9fd6SBram Moolenaar      endfunc
686925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
687925e9fd6SBram Moolenaar      def! g:Global(): string
688925e9fd6SBram Moolenaar        return "no"
689925e9fd6SBram Moolenaar      enddef
690925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
691925e9fd6SBram Moolenaar      delfunc g:Global
692925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
693925e9fd6SBram Moolenaar  END
694925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
695925e9fd6SBram Moolenaar
696925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
697925e9fd6SBram Moolenaar  lines =<< trim END
698925e9fd6SBram Moolenaar      vim9script
699925e9fd6SBram Moolenaar      def g:Global(): string
700925e9fd6SBram Moolenaar        return "yes"
701925e9fd6SBram Moolenaar      enddef
702925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
703925e9fd6SBram Moolenaar      func! g:Global()
704925e9fd6SBram Moolenaar        return "no"
705925e9fd6SBram Moolenaar      endfunc
706925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
707925e9fd6SBram Moolenaar      delfunc g:Global
708925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
709925e9fd6SBram Moolenaar  END
710925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7114c17ad94SBram Moolenaarenddef
7124c17ad94SBram Moolenaar
713599c89c8SBram Moolenaarfunc Test_wrong_type()
714599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
715599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
716599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
717599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
718599c89c8SBram Moolenaar
719599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
720599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
72142a480bfSBram Moolenaar
72242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
72342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
72442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
72542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
72642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
72742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
72842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
72942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
73042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
73142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
73242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
733a0a9f43aSBram Moolenaar
734a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
735a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7368a7d6542SBram Moolenaarendfunc
7378a7d6542SBram Moolenaar
7388a7d6542SBram Moolenaarfunc Test_const()
7398a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7408a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7418a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7429be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7438a7d6542SBram Moolenaarendfunc
7448a7d6542SBram Moolenaar
745df069eecSBram Moolenaardef Test_range_no_colon()
746df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
747df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
748df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
749df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
750df069eecSBram Moolenaarenddef
751df069eecSBram Moolenaar
752df069eecSBram Moolenaar
7538a7d6542SBram Moolenaardef Test_block()
7548a7d6542SBram Moolenaar  let outer = 1
7558a7d6542SBram Moolenaar  {
7568a7d6542SBram Moolenaar    let inner = 2
7578a7d6542SBram Moolenaar    assert_equal(1, outer)
7588a7d6542SBram Moolenaar    assert_equal(2, inner)
7598a7d6542SBram Moolenaar  }
7608a7d6542SBram Moolenaar  assert_equal(1, outer)
7618a7d6542SBram Moolenaarenddef
7628a7d6542SBram Moolenaar
7638a7d6542SBram Moolenaarfunc Test_block_failure()
7648a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
765585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
766585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7678a7d6542SBram Moolenaarendfunc
7688a7d6542SBram Moolenaar
769d032f34aSBram Moolenaarfunc g:NoSuchFunc()
770d032f34aSBram Moolenaar  echo 'none'
771d032f34aSBram Moolenaarendfunc
772d032f34aSBram Moolenaar
7738a7d6542SBram Moolenaardef Test_try_catch()
7748a7d6542SBram Moolenaar  let l = []
7757a092245SBram Moolenaar  try # comment
7768a7d6542SBram Moolenaar    add(l, '1')
7778a7d6542SBram Moolenaar    throw 'wrong'
7788a7d6542SBram Moolenaar    add(l, '2')
7797a092245SBram Moolenaar  catch # comment
7808a7d6542SBram Moolenaar    add(l, v:exception)
7817a092245SBram Moolenaar  finally # comment
7828a7d6542SBram Moolenaar    add(l, '3')
7837a092245SBram Moolenaar  endtry # comment
7848a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
78568d130c6SBram Moolenaar
786e859312eSBram Moolenaar  l = []
787e859312eSBram Moolenaar  try
788e859312eSBram Moolenaar    try
789e859312eSBram Moolenaar      add(l, '1')
790e859312eSBram Moolenaar      throw 'wrong'
791e859312eSBram Moolenaar      add(l, '2')
792e859312eSBram Moolenaar    catch /right/
793e859312eSBram Moolenaar      add(l, v:exception)
794e859312eSBram Moolenaar    endtry
795e859312eSBram Moolenaar  catch /wrong/
796e859312eSBram Moolenaar    add(l, 'caught')
797e859312eSBram Moolenaar  finally
798e859312eSBram Moolenaar    add(l, 'finally')
799e859312eSBram Moolenaar  endtry
800e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
801e859312eSBram Moolenaar
80268d130c6SBram Moolenaar  let n: number
80368d130c6SBram Moolenaar  try
80468d130c6SBram Moolenaar    n = l[3]
80568d130c6SBram Moolenaar  catch /E684:/
80668d130c6SBram Moolenaar    n = 99
80768d130c6SBram Moolenaar  endtry
80868d130c6SBram Moolenaar  assert_equal(99, n)
80968d130c6SBram Moolenaar
81068d130c6SBram Moolenaar  try
811cc673e74SBram Moolenaar    # string slice returns a string, not a number
81268d130c6SBram Moolenaar    n = g:astring[3]
81356acb094SBram Moolenaar  catch /E1029:/
81468d130c6SBram Moolenaar    n = 77
81568d130c6SBram Moolenaar  endtry
81668d130c6SBram Moolenaar  assert_equal(77, n)
81768d130c6SBram Moolenaar
81868d130c6SBram Moolenaar  try
81968d130c6SBram Moolenaar    n = l[g:astring]
82056acb094SBram Moolenaar  catch /E1029:/
82156acb094SBram Moolenaar    n = 88
82268d130c6SBram Moolenaar  endtry
82356acb094SBram Moolenaar  assert_equal(88, n)
82468d130c6SBram Moolenaar
82568d130c6SBram Moolenaar  try
82668d130c6SBram Moolenaar    n = s:does_not_exist
82768d130c6SBram Moolenaar  catch /E121:/
828f0b9f43cSBram Moolenaar    n = 111
829f0b9f43cSBram Moolenaar  endtry
830f0b9f43cSBram Moolenaar  assert_equal(111, n)
831f0b9f43cSBram Moolenaar
832f0b9f43cSBram Moolenaar  try
833f0b9f43cSBram Moolenaar    n = g:does_not_exist
834f0b9f43cSBram Moolenaar  catch /E121:/
83568d130c6SBram Moolenaar    n = 121
83668d130c6SBram Moolenaar  endtry
83768d130c6SBram Moolenaar  assert_equal(121, n)
83868d130c6SBram Moolenaar
83968d130c6SBram Moolenaar  let d = #{one: 1}
84068d130c6SBram Moolenaar  try
84168d130c6SBram Moolenaar    n = d[g:astring]
84268d130c6SBram Moolenaar  catch /E716:/
84368d130c6SBram Moolenaar    n = 222
84468d130c6SBram Moolenaar  endtry
84568d130c6SBram Moolenaar  assert_equal(222, n)
846f0b9f43cSBram Moolenaar
847f0b9f43cSBram Moolenaar  try
848f0b9f43cSBram Moolenaar    n = -g:astring
849f0b9f43cSBram Moolenaar  catch /E39:/
850f0b9f43cSBram Moolenaar    n = 233
851f0b9f43cSBram Moolenaar  endtry
852f0b9f43cSBram Moolenaar  assert_equal(233, n)
853f0b9f43cSBram Moolenaar
854f0b9f43cSBram Moolenaar  try
855f0b9f43cSBram Moolenaar    n = +g:astring
856f0b9f43cSBram Moolenaar  catch /E1030:/
857f0b9f43cSBram Moolenaar    n = 244
858f0b9f43cSBram Moolenaar  endtry
859f0b9f43cSBram Moolenaar  assert_equal(244, n)
860f0b9f43cSBram Moolenaar
861f0b9f43cSBram Moolenaar  try
862f0b9f43cSBram Moolenaar    n = +g:alist
863f0b9f43cSBram Moolenaar  catch /E745:/
864f0b9f43cSBram Moolenaar    n = 255
865f0b9f43cSBram Moolenaar  endtry
866f0b9f43cSBram Moolenaar  assert_equal(255, n)
867f0b9f43cSBram Moolenaar
868f0b9f43cSBram Moolenaar  let nd: dict<any>
869f0b9f43cSBram Moolenaar  try
870f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
871f0b9f43cSBram Moolenaar  catch /E1029:/
872f0b9f43cSBram Moolenaar    n = 266
873f0b9f43cSBram Moolenaar  endtry
874f0b9f43cSBram Moolenaar  assert_equal(266, n)
875f0b9f43cSBram Moolenaar
876f0b9f43cSBram Moolenaar  try
877f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
878f0b9f43cSBram Moolenaar  catch /E1093:/
879f0b9f43cSBram Moolenaar    n = 277
880f0b9f43cSBram Moolenaar  endtry
881f0b9f43cSBram Moolenaar  assert_equal(277, n)
882f0b9f43cSBram Moolenaar
883e859312eSBram Moolenaar  try
884e859312eSBram Moolenaar    &ts = g:astring
885e859312eSBram Moolenaar  catch /E1029:/
886e859312eSBram Moolenaar    n = 288
887e859312eSBram Moolenaar  endtry
888e859312eSBram Moolenaar  assert_equal(288, n)
889e859312eSBram Moolenaar
890e859312eSBram Moolenaar  try
891e859312eSBram Moolenaar    &backspace = 'asdf'
892e859312eSBram Moolenaar  catch /E474:/
893e859312eSBram Moolenaar    n = 299
894e859312eSBram Moolenaar  endtry
895e859312eSBram Moolenaar  assert_equal(299, n)
896e859312eSBram Moolenaar
897e859312eSBram Moolenaar  l = [1]
898e859312eSBram Moolenaar  try
899e859312eSBram Moolenaar    l[3] = 3
900e859312eSBram Moolenaar  catch /E684:/
901e859312eSBram Moolenaar    n = 300
902e859312eSBram Moolenaar  endtry
903e859312eSBram Moolenaar  assert_equal(300, n)
904e859312eSBram Moolenaar
905e859312eSBram Moolenaar  try
906e859312eSBram Moolenaar    unlet g:does_not_exist
907e859312eSBram Moolenaar  catch /E108:/
908e859312eSBram Moolenaar    n = 322
909e859312eSBram Moolenaar  endtry
910e859312eSBram Moolenaar  assert_equal(322, n)
911e859312eSBram Moolenaar
912e859312eSBram Moolenaar  try
913e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
914e859312eSBram Moolenaar  catch /E721:/
915e859312eSBram Moolenaar    n = 333
916e859312eSBram Moolenaar  endtry
917e859312eSBram Moolenaar  assert_equal(333, n)
918e859312eSBram Moolenaar
919e859312eSBram Moolenaar  try
920e859312eSBram Moolenaar    l = DeletedFunc()
921e859312eSBram Moolenaar  catch /E933:/
922e859312eSBram Moolenaar    n = 344
923e859312eSBram Moolenaar  endtry
924e859312eSBram Moolenaar  assert_equal(344, n)
925d032f34aSBram Moolenaar
926d032f34aSBram Moolenaar  try
927d032f34aSBram Moolenaar    echo len(v:true)
928d032f34aSBram Moolenaar  catch /E701:/
929d032f34aSBram Moolenaar    n = 355
930d032f34aSBram Moolenaar  endtry
931d032f34aSBram Moolenaar  assert_equal(355, n)
932d032f34aSBram Moolenaar
933d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
934d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
935d032f34aSBram Moolenaar  try
936d032f34aSBram Moolenaar    echo P()
937d032f34aSBram Moolenaar  catch /E117:/
938d032f34aSBram Moolenaar    n = 366
939d032f34aSBram Moolenaar  endtry
940d032f34aSBram Moolenaar  assert_equal(366, n)
941d032f34aSBram Moolenaar
942d032f34aSBram Moolenaar  try
943d032f34aSBram Moolenaar    echo g:NoSuchFunc()
944d032f34aSBram Moolenaar  catch /E117:/
945d032f34aSBram Moolenaar    n = 377
946d032f34aSBram Moolenaar  endtry
947d032f34aSBram Moolenaar  assert_equal(377, n)
948d032f34aSBram Moolenaar
949d032f34aSBram Moolenaar  try
950d032f34aSBram Moolenaar    echo g:alist + 4
951d032f34aSBram Moolenaar  catch /E745:/
952d032f34aSBram Moolenaar    n = 388
953d032f34aSBram Moolenaar  endtry
954d032f34aSBram Moolenaar  assert_equal(388, n)
955d032f34aSBram Moolenaar
956d032f34aSBram Moolenaar  try
957d032f34aSBram Moolenaar    echo 4 + g:alist
958d032f34aSBram Moolenaar  catch /E745:/
959d032f34aSBram Moolenaar    n = 399
960d032f34aSBram Moolenaar  endtry
961d032f34aSBram Moolenaar  assert_equal(399, n)
962d032f34aSBram Moolenaar
963d032f34aSBram Moolenaar  try
964d032f34aSBram Moolenaar    echo g:alist.member
965d032f34aSBram Moolenaar  catch /E715:/
966d032f34aSBram Moolenaar    n = 400
967d032f34aSBram Moolenaar  endtry
968d032f34aSBram Moolenaar  assert_equal(400, n)
969d032f34aSBram Moolenaar
970d032f34aSBram Moolenaar  try
971d032f34aSBram Moolenaar    echo d.member
972d032f34aSBram Moolenaar  catch /E716:/
973d032f34aSBram Moolenaar    n = 411
974d032f34aSBram Moolenaar  endtry
975d032f34aSBram Moolenaar  assert_equal(411, n)
9768a7d6542SBram Moolenaarenddef
9778a7d6542SBram Moolenaar
978e859312eSBram Moolenaardef DeletedFunc(): list<any>
979e859312eSBram Moolenaar  return ['delete me']
980e859312eSBram Moolenaarenddef
981e859312eSBram Moolenaardefcompile
982e859312eSBram Moolenaardelfunc DeletedFunc
983e859312eSBram Moolenaar
984257cc5eeSBram Moolenaardef ThrowFromDef()
985a72cfb80SBram Moolenaar  throw "getout" # comment
986257cc5eeSBram Moolenaarenddef
987257cc5eeSBram Moolenaar
988257cc5eeSBram Moolenaarfunc CatchInFunc()
989257cc5eeSBram Moolenaar  try
990257cc5eeSBram Moolenaar    call ThrowFromDef()
991257cc5eeSBram Moolenaar  catch
992257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
993257cc5eeSBram Moolenaar  endtry
994257cc5eeSBram Moolenaarendfunc
995257cc5eeSBram Moolenaar
996257cc5eeSBram Moolenaardef CatchInDef()
997257cc5eeSBram Moolenaar  try
998257cc5eeSBram Moolenaar    ThrowFromDef()
999257cc5eeSBram Moolenaar  catch
1000257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1001257cc5eeSBram Moolenaar  endtry
1002257cc5eeSBram Moolenaarenddef
1003257cc5eeSBram Moolenaar
1004f575adffSBram Moolenaardef ReturnFinally(): string
1005f575adffSBram Moolenaar  try
1006f575adffSBram Moolenaar    return 'intry'
1007f575adffSBram Moolenaar  finally
1008f575adffSBram Moolenaar    g:in_finally = 'finally'
1009f575adffSBram Moolenaar  endtry
1010f575adffSBram Moolenaar  return 'end'
1011f575adffSBram Moolenaarenddef
1012f575adffSBram Moolenaar
1013257cc5eeSBram Moolenaardef Test_try_catch_nested()
1014257cc5eeSBram Moolenaar  CatchInFunc()
1015257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1016257cc5eeSBram Moolenaar
1017257cc5eeSBram Moolenaar  CatchInDef()
1018257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1019f575adffSBram Moolenaar
1020f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1021f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1022f575adffSBram Moolenaarenddef
1023f575adffSBram Moolenaar
1024f575adffSBram Moolenaardef Test_try_catch_match()
1025f575adffSBram Moolenaar  let seq = 'a'
1026f575adffSBram Moolenaar  try
1027f575adffSBram Moolenaar    throw 'something'
1028f575adffSBram Moolenaar  catch /nothing/
1029f575adffSBram Moolenaar    seq ..= 'x'
1030f575adffSBram Moolenaar  catch /some/
1031f575adffSBram Moolenaar    seq ..= 'b'
1032f575adffSBram Moolenaar  catch /asdf/
1033f575adffSBram Moolenaar    seq ..= 'x'
1034e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1035e8c4abbbSBram Moolenaar    seq ..= 'y'
1036f575adffSBram Moolenaar  finally
1037f575adffSBram Moolenaar    seq ..= 'c'
1038f575adffSBram Moolenaar  endtry
1039f575adffSBram Moolenaar  assert_equal('abc', seq)
1040257cc5eeSBram Moolenaarenddef
1041257cc5eeSBram Moolenaar
1042e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1043e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1044e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1045e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1046585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1047585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1048585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1049585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1050585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1051585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1052585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1053585fea7bSBram Moolenaar
1054a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1055585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1056e8c4abbbSBram Moolenaarenddef
1057e8c4abbbSBram Moolenaar
1058006ad48bSBram Moolenaardef Test_throw_vimscript()
1059f5be8cdbSBram Moolenaar  # only checks line continuation
1060006ad48bSBram Moolenaar  let lines =<< trim END
1061006ad48bSBram Moolenaar      vim9script
1062006ad48bSBram Moolenaar      try
1063006ad48bSBram Moolenaar        throw 'one'
1064006ad48bSBram Moolenaar              .. 'two'
1065006ad48bSBram Moolenaar      catch
1066006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1067006ad48bSBram Moolenaar      endtry
1068006ad48bSBram Moolenaar  END
1069006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1070006ad48bSBram Moolenaarenddef
1071006ad48bSBram Moolenaar
1072ed677f55SBram Moolenaardef Test_error_in_nested_function()
1073ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1074ed677f55SBram Moolenaar  let lines =<< trim END
1075ed677f55SBram Moolenaar      vim9script
1076ed677f55SBram Moolenaar      def Func()
1077ed677f55SBram Moolenaar        Error()
1078ed677f55SBram Moolenaar        g:test_var = 1
1079ed677f55SBram Moolenaar      enddef
1080ed677f55SBram Moolenaar      func Error() abort
1081ed677f55SBram Moolenaar        eval [][0]
1082ed677f55SBram Moolenaar      endfunc
1083ed677f55SBram Moolenaar      Func()
1084ed677f55SBram Moolenaar  END
1085ed677f55SBram Moolenaar  g:test_var = 0
1086ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1087ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1088ed677f55SBram Moolenaarenddef
1089ed677f55SBram Moolenaar
109037c83711SBram Moolenaardef Test_cexpr_vimscript()
1091f5be8cdbSBram Moolenaar  # only checks line continuation
109237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
109337c83711SBram Moolenaar  let lines =<< trim END
109437c83711SBram Moolenaar      vim9script
109537c83711SBram Moolenaar      cexpr 'File'
109637c83711SBram Moolenaar                .. ' someFile' ..
109737c83711SBram Moolenaar                   ' line 19'
109837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
109937c83711SBram Moolenaar  END
110037c83711SBram Moolenaar  CheckScriptSuccess(lines)
110137c83711SBram Moolenaar  set errorformat&
110237c83711SBram Moolenaarenddef
110337c83711SBram Moolenaar
1104c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1105c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1106c9edd6b5SBram Moolenaar  let lines =<< trim END
1107c9edd6b5SBram Moolenaar      vim9script
1108c9edd6b5SBram Moolenaar      func g:Status()
1109c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1110c9edd6b5SBram Moolenaar      endfunc
1111c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1112c9edd6b5SBram Moolenaar      redrawstatus
1113c9edd6b5SBram Moolenaar      set laststatus statusline=
1114c9edd6b5SBram Moolenaar  END
1115c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1116c9edd6b5SBram Moolenaarenddef
1117c9edd6b5SBram Moolenaar
1118b209750bSBram Moolenaardef Test_list_vimscript()
1119b209750bSBram Moolenaar  # checks line continuation and comments
1120b209750bSBram Moolenaar  let lines =<< trim END
1121b209750bSBram Moolenaar      vim9script
1122b209750bSBram Moolenaar      let mylist = [
1123b209750bSBram Moolenaar            'one',
1124b209750bSBram Moolenaar            # comment
1125b209750bSBram Moolenaar            'two', # empty line follows
1126b209750bSBram Moolenaar
1127b209750bSBram Moolenaar            'three',
1128b209750bSBram Moolenaar            ]
1129b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1130b209750bSBram Moolenaar  END
1131b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1132b209750bSBram Moolenaarenddef
1133b209750bSBram Moolenaar
11342a1381c3SBram Moolenaarif has('channel')
113540ee466cSBram Moolenaar  let someJob = test_null_job()
113640ee466cSBram Moolenaar
113740ee466cSBram Moolenaar  def FuncWithError()
113840ee466cSBram Moolenaar    echomsg g:someJob
113940ee466cSBram Moolenaar  enddef
114040ee466cSBram Moolenaar
114140ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
114240ee466cSBram Moolenaar    try
114340ee466cSBram Moolenaar      call FuncWithError()
114440ee466cSBram Moolenaar    catch
114540ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
114640ee466cSBram Moolenaar    endtry
114740ee466cSBram Moolenaar  endfunc
11482a1381c3SBram Moolenaarendif
114940ee466cSBram Moolenaar
11508a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11518a7d6542SBram Moolenaar  vim9script
11528a7d6542SBram Moolenaar  let name: string = 'bob'
11538a7d6542SBram Moolenaar  def Concat(arg: string): string
11548a7d6542SBram Moolenaar    return name .. arg
11558a7d6542SBram Moolenaar  enddef
1156227a69deSBram Moolenaar  g:result = Concat('bie')
1157227a69deSBram Moolenaar  g:localname = name
11588a7d6542SBram Moolenaar
11598a7d6542SBram Moolenaar  export const CONST = 1234
11608a7d6542SBram Moolenaar  export let exported = 9876
11616e587dcbSBram Moolenaar  export let exp_name = 'John'
11628a7d6542SBram Moolenaar  export def Exported(): string
11638a7d6542SBram Moolenaar    return 'Exported'
11648a7d6542SBram Moolenaar  enddef
11658a7d6542SBram MoolenaarEND
11668a7d6542SBram Moolenaar
1167b3ca9824SBram Moolenaardef Undo_export_script_lines()
1168b3ca9824SBram Moolenaar  unlet g:result
1169b3ca9824SBram Moolenaar  unlet g:localname
1170b3ca9824SBram Moolenaarenddef
1171b3ca9824SBram Moolenaar
11725269bd2aSBram Moolenaardef Test_vim9_import_export()
11738a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11748a7d6542SBram Moolenaar    vim9script
11758a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11768a7d6542SBram Moolenaar    g:imported = exported
11776e587dcbSBram Moolenaar    exported += 3
11786e587dcbSBram Moolenaar    g:imported_added = exported
11798a7d6542SBram Moolenaar    g:imported_func = Exported()
11806e587dcbSBram Moolenaar
118140f4f7a4SBram Moolenaar    def GetExported(): string
118240f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
118340f4f7a4SBram Moolenaar      return local_dict.ref()
118440f4f7a4SBram Moolenaar    enddef
118540f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
118640f4f7a4SBram Moolenaar
11876e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11886e587dcbSBram Moolenaar    g:imported_name = exp_name
11896e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11906e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11915381c7a1SBram Moolenaar    g:imported_later = exported
11928a7d6542SBram Moolenaar  END
11938a7d6542SBram Moolenaar
11948a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11958a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11968a7d6542SBram Moolenaar
11978a7d6542SBram Moolenaar  source Ximport.vim
11988a7d6542SBram Moolenaar
11998a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12008a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12018a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12026e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12035381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12048a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
120540f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12066e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12076e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12088a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12098a7d6542SBram Moolenaar
1210b3ca9824SBram Moolenaar  Undo_export_script_lines()
12118a7d6542SBram Moolenaar  unlet g:imported
12126e587dcbSBram Moolenaar  unlet g:imported_added
12135381c7a1SBram Moolenaar  unlet g:imported_later
12148a7d6542SBram Moolenaar  unlet g:imported_func
12156e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12168a7d6542SBram Moolenaar  delete('Ximport.vim')
1217f2d5c240SBram Moolenaar
12181c991144SBram Moolenaar  # similar, with line breaks
12191c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12201c991144SBram Moolenaar    vim9script
12211c991144SBram Moolenaar    import {
12221c991144SBram Moolenaar        exported,
12231c991144SBram Moolenaar        Exported,
12241c991144SBram Moolenaar        }
12251c991144SBram Moolenaar        from
12261c991144SBram Moolenaar        './Xexport.vim'
12271c991144SBram Moolenaar    g:imported = exported
12281c991144SBram Moolenaar    exported += 5
12291c991144SBram Moolenaar    g:imported_added = exported
12301c991144SBram Moolenaar    g:imported_func = Exported()
12311c991144SBram Moolenaar  END
12321c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12331c991144SBram Moolenaar  source Ximport_lbr.vim
12341c991144SBram Moolenaar
12351c991144SBram Moolenaar  assert_equal(9876, g:imported)
12361c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12371c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12381c991144SBram Moolenaar
12391c991144SBram Moolenaar  # exported script not sourced again
12401c991144SBram Moolenaar  assert_false(exists('g:result'))
12411c991144SBram Moolenaar  unlet g:imported
12421c991144SBram Moolenaar  unlet g:imported_added
12431c991144SBram Moolenaar  unlet g:imported_func
12441c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12451c991144SBram Moolenaar
12461c991144SBram Moolenaar  # import inside :def function
12475381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
12485381c7a1SBram Moolenaar    vim9script
12495381c7a1SBram Moolenaar    def ImportInDef()
12505381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12515381c7a1SBram Moolenaar      g:imported = exported
12525381c7a1SBram Moolenaar      exported += 7
12535381c7a1SBram Moolenaar      g:imported_added = exported
12545381c7a1SBram Moolenaar    enddef
12555381c7a1SBram Moolenaar    ImportInDef()
12565381c7a1SBram Moolenaar  END
12575381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12585381c7a1SBram Moolenaar  source Ximport2.vim
1259f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12605381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12615381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12625381c7a1SBram Moolenaar  unlet g:imported
12635381c7a1SBram Moolenaar  unlet g:imported_added
12645381c7a1SBram Moolenaar  delete('Ximport2.vim')
12655381c7a1SBram Moolenaar
1266f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1267f2d5c240SBram Moolenaar    vim9script
1268f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1269f2d5c240SBram Moolenaar    def UseExport()
1270f2d5c240SBram Moolenaar      g:imported = Export.exported
1271f2d5c240SBram Moolenaar    enddef
1272f2d5c240SBram Moolenaar    UseExport()
1273f2d5c240SBram Moolenaar  END
1274f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1275f2d5c240SBram Moolenaar  source Ximport.vim
12765381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1277f2d5c240SBram Moolenaar
1278599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1279599c89c8SBram Moolenaar    vim9script
1280599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1281599c89c8SBram Moolenaar    def Func()
1282599c89c8SBram Moolenaar      let dummy = 1
1283599c89c8SBram Moolenaar      let imported = Export + dummy
1284599c89c8SBram Moolenaar    enddef
1285822ba247SBram Moolenaar    defcompile
1286599c89c8SBram Moolenaar  END
1287599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1288599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1289599c89c8SBram Moolenaar
1290599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1291599c89c8SBram Moolenaar    vim9script
1292599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1293599c89c8SBram Moolenaar    def Func()
1294599c89c8SBram Moolenaar      let imported = Export . exported
1295599c89c8SBram Moolenaar    enddef
1296822ba247SBram Moolenaar    defcompile
1297599c89c8SBram Moolenaar  END
1298599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1299599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1300599c89c8SBram Moolenaar
1301599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1302599c89c8SBram Moolenaar    vim9script
1303599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1304599c89c8SBram Moolenaar    def Func()
1305599c89c8SBram Moolenaar      let imported = Export.
1306599c89c8SBram Moolenaar    enddef
1307822ba247SBram Moolenaar    defcompile
1308599c89c8SBram Moolenaar  END
1309599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1310599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1311599c89c8SBram Moolenaar
13121c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13131c991144SBram Moolenaar    vim9script
13141c991144SBram Moolenaar    import *
13151c991144SBram Moolenaar        as Export
13161c991144SBram Moolenaar        from
13171c991144SBram Moolenaar        './Xexport.vim'
13181c991144SBram Moolenaar    def UseExport()
13191c991144SBram Moolenaar      g:imported = Export.exported
13201c991144SBram Moolenaar    enddef
13211c991144SBram Moolenaar    UseExport()
13221c991144SBram Moolenaar  END
13231c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13241c991144SBram Moolenaar  source Ximport.vim
13251c991144SBram Moolenaar  assert_equal(9883, g:imported)
13261c991144SBram Moolenaar
1327f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1328f2d5c240SBram Moolenaar    vim9script
1329f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1330f2d5c240SBram Moolenaar  END
1331f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1332f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1333f2d5c240SBram Moolenaar
1334f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1335fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1336fa29c8abSBram Moolenaar    vim9script
1337fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1338fa29c8abSBram Moolenaar  END
1339fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1340fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1341fa29c8abSBram Moolenaar
1342f5be8cdbSBram Moolenaar  # try to import something that is already defined
13435269bd2aSBram Moolenaar  let import_already_defined =<< trim END
13445269bd2aSBram Moolenaar    vim9script
13455269bd2aSBram Moolenaar    let exported = 'something'
13465269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13475269bd2aSBram Moolenaar  END
13485269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13495269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13505269bd2aSBram Moolenaar
1351f5be8cdbSBram Moolenaar  # try to import something that is already defined
13525269bd2aSBram Moolenaar  import_already_defined =<< trim END
13535269bd2aSBram Moolenaar    vim9script
13545269bd2aSBram Moolenaar    let exported = 'something'
13555269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13565269bd2aSBram Moolenaar  END
13575269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13585269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13595269bd2aSBram Moolenaar
1360f5be8cdbSBram Moolenaar  # try to import something that is already defined
13615269bd2aSBram Moolenaar  import_already_defined =<< trim END
13625269bd2aSBram Moolenaar    vim9script
13635269bd2aSBram Moolenaar    let exported = 'something'
13645269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13655269bd2aSBram Moolenaar  END
13665269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13675269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13685269bd2aSBram Moolenaar
1369f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1370fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1371fa29c8abSBram Moolenaar    vim9script
1372fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1373fa29c8abSBram Moolenaar  END
1374fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1375fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1376fa29c8abSBram Moolenaar
1377fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1378fa29c8abSBram Moolenaar    vim9script
1379fa29c8abSBram Moolenaar    import name './Xexport.vim'
1380fa29c8abSBram Moolenaar  END
1381fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1382fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1383fa29c8abSBram Moolenaar
1384fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1385fa29c8abSBram Moolenaar    vim9script
1386fa29c8abSBram Moolenaar    import name from Xexport.vim
1387fa29c8abSBram Moolenaar  END
1388fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1389fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1390fa29c8abSBram Moolenaar
1391fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1392fa29c8abSBram Moolenaar    vim9script
1393fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1394fa29c8abSBram Moolenaar  END
1395fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1396fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1397fa29c8abSBram Moolenaar
1398fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1399fa29c8abSBram Moolenaar    vim9script
1400fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1401fa29c8abSBram Moolenaar  END
14025269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
14035269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1404fa29c8abSBram Moolenaar
1405f2d5c240SBram Moolenaar  delete('Ximport.vim')
14065269bd2aSBram Moolenaar  delete('Ximport3.vim')
14078a7d6542SBram Moolenaar  delete('Xexport.vim')
14088a7d6542SBram Moolenaar
1409f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1410750802b5SBram Moolenaar  set cpo&vi
1411750802b5SBram Moolenaar  let cpo_before = &cpo
1412750802b5SBram Moolenaar  let lines =<< trim END
1413750802b5SBram Moolenaar    vim9script
1414750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1415750802b5SBram Moolenaar  END
1416750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1417750802b5SBram Moolenaar  source Xvim9_script
1418750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1419750802b5SBram Moolenaar  set cpo&vim
1420750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1421750802b5SBram Moolenaar  delete('Xvim9_script')
1422750802b5SBram Moolenaarenddef
1423750802b5SBram Moolenaar
1424803af686SBram Moolenaarfunc g:Trigger()
1425803af686SBram Moolenaar  source Ximport.vim
1426803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1427803af686SBram Moolenaarendfunc
1428803af686SBram Moolenaar
1429803af686SBram Moolenaardef Test_import_export_expr_map()
1430803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1431803af686SBram Moolenaar  let export_lines =<< trim END
1432803af686SBram Moolenaar    vim9script
1433803af686SBram Moolenaar    export def That(): string
1434803af686SBram Moolenaar      return 'yes'
1435803af686SBram Moolenaar    enddef
1436803af686SBram Moolenaar  END
1437803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1438803af686SBram Moolenaar
1439803af686SBram Moolenaar  let import_lines =<< trim END
1440803af686SBram Moolenaar    vim9script
1441803af686SBram Moolenaar    import That from './Xexport_that.vim'
1442803af686SBram Moolenaar    assert_equal('yes', That())
1443803af686SBram Moolenaar  END
1444803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1445803af686SBram Moolenaar
1446803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1447803af686SBram Moolenaar  feedkeys('trigger', "xt")
1448803af686SBram Moolenaar
1449730b2483SBram Moolenaar  delete('Xexport_that.vim')
1450803af686SBram Moolenaar  delete('Ximport.vim')
1451803af686SBram Moolenaar  nunmap trigger
1452803af686SBram Moolenaarenddef
1453803af686SBram Moolenaar
14548e1986e3SBram Moolenaardef Test_import_in_filetype()
14558e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14568e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14578e1986e3SBram Moolenaar  let export_lines =<< trim END
14588e1986e3SBram Moolenaar    vim9script
14598e1986e3SBram Moolenaar    export let That = 'yes'
14608e1986e3SBram Moolenaar  END
1461730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14628e1986e3SBram Moolenaar
14638e1986e3SBram Moolenaar  let import_lines =<< trim END
14648e1986e3SBram Moolenaar    vim9script
1465730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14668e1986e3SBram Moolenaar    assert_equal('yes', That)
14678e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14688e1986e3SBram Moolenaar  END
14698e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14708e1986e3SBram Moolenaar
14718e1986e3SBram Moolenaar  let save_rtp = &rtp
14728e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14738e1986e3SBram Moolenaar
14748e1986e3SBram Moolenaar  filetype plugin on
14758e1986e3SBram Moolenaar  copen
14768e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14778e1986e3SBram Moolenaar
14788e1986e3SBram Moolenaar  quit!
1479730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14808e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14818e1986e3SBram Moolenaar  &rtp = save_rtp
14828e1986e3SBram Moolenaarenddef
14838e1986e3SBram Moolenaar
1484efa94447SBram Moolenaardef Test_use_import_in_mapping()
1485efa94447SBram Moolenaar  let lines =<< trim END
1486efa94447SBram Moolenaar      vim9script
1487efa94447SBram Moolenaar      export def Funcx()
1488efa94447SBram Moolenaar        g:result = 42
1489efa94447SBram Moolenaar      enddef
1490efa94447SBram Moolenaar  END
1491efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1492efa94447SBram Moolenaar  lines =<< trim END
1493efa94447SBram Moolenaar      vim9script
1494efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1495b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1496efa94447SBram Moolenaar  END
1497efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1498efa94447SBram Moolenaar
1499efa94447SBram Moolenaar  source Xmapscript.vim
1500b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1501efa94447SBram Moolenaar  assert_equal(42, g:result)
1502efa94447SBram Moolenaar
1503efa94447SBram Moolenaar  unlet g:result
1504efa94447SBram Moolenaar  delete('XsomeExport.vim')
1505efa94447SBram Moolenaar  delete('Xmapscript.vim')
1506b3ca9824SBram Moolenaar  nunmap <F3>
1507efa94447SBram Moolenaarenddef
1508efa94447SBram Moolenaar
1509750802b5SBram Moolenaardef Test_vim9script_fails()
15108a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15118a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1512750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15139721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15149b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1515750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1516750802b5SBram Moolenaar
1517451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1518c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1519c785b9a7SBram Moolenaar
1520750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1521a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
15228a7d6542SBram Moolenaarenddef
15238a7d6542SBram Moolenaar
1524f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1525101f4810SBram Moolenaar  CheckRunVimInTerminal
1526101f4810SBram Moolenaar
15279bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1528c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15299bb3eb3eSBram Moolenaarendfunc
15309bb3eb3eSBram Moolenaar
1531c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1532101f4810SBram Moolenaar  let export =<< trim END
1533101f4810SBram Moolenaar    vim9script
1534101f4810SBram Moolenaar    export def Foo(): number
1535101f4810SBram Moolenaar        return 0
1536101f4810SBram Moolenaar    enddef
1537101f4810SBram Moolenaar  END
1538730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1539101f4810SBram Moolenaar
1540730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15419bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15429bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1543101f4810SBram Moolenaar
1544730b2483SBram Moolenaar  delete('XexportCmd.vim')
15459bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15469bb3eb3eSBram Moolenaarenddef
1547101f4810SBram Moolenaar
15484c17ad94SBram Moolenaardef Test_vim9script_reload_import()
15498a7d6542SBram Moolenaar  let lines =<< trim END
15508a7d6542SBram Moolenaar    vim9script
15518a7d6542SBram Moolenaar    const var = ''
15528a7d6542SBram Moolenaar    let valone = 1234
15538a7d6542SBram Moolenaar    def MyFunc(arg: string)
15548a7d6542SBram Moolenaar       valone = 5678
15558a7d6542SBram Moolenaar    enddef
15568a7d6542SBram Moolenaar  END
15578a7d6542SBram Moolenaar  let morelines =<< trim END
15588a7d6542SBram Moolenaar    let valtwo = 222
15598a7d6542SBram Moolenaar    export def GetValtwo(): number
15608a7d6542SBram Moolenaar      return valtwo
15618a7d6542SBram Moolenaar    enddef
15628a7d6542SBram Moolenaar  END
156303afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15648a7d6542SBram Moolenaar  source Xreload.vim
15658a7d6542SBram Moolenaar  source Xreload.vim
15668a7d6542SBram Moolenaar  source Xreload.vim
15678a7d6542SBram Moolenaar
15688a7d6542SBram Moolenaar  let testlines =<< trim END
15698a7d6542SBram Moolenaar    vim9script
15708a7d6542SBram Moolenaar    def TheFunc()
15718a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15728a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15738a7d6542SBram Moolenaar    enddef
15748a7d6542SBram Moolenaar    TheFunc()
15758a7d6542SBram Moolenaar  END
15768a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15778a7d6542SBram Moolenaar  source Ximport.vim
15788a7d6542SBram Moolenaar
1579f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1580f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15818a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15828a7d6542SBram Moolenaar  source Ximport.vim
15838a7d6542SBram Moolenaar
1584f5be8cdbSBram Moolenaar  # cannot declare a var twice
15858a7d6542SBram Moolenaar  lines =<< trim END
15868a7d6542SBram Moolenaar    vim9script
15878a7d6542SBram Moolenaar    let valone = 1234
15888a7d6542SBram Moolenaar    let valone = 5678
15898a7d6542SBram Moolenaar  END
15908a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15918a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
15928a7d6542SBram Moolenaar
15938a7d6542SBram Moolenaar  delete('Xreload.vim')
15948a7d6542SBram Moolenaar  delete('Ximport.vim')
15958a7d6542SBram Moolenaarenddef
15968a7d6542SBram Moolenaar
1597fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1598fe465a01SBram Moolenaar" script-local name.
1599fe465a01SBram Moolenaardef Test_vim9script_funcref()
1600fe465a01SBram Moolenaar  let sortlines =<< trim END
1601fe465a01SBram Moolenaar      vim9script
1602fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1603bed36b93SBram Moolenaar        return i2 - i1
1604fe465a01SBram Moolenaar      enddef
1605fe465a01SBram Moolenaar
1606fe465a01SBram Moolenaar      export def FastSort(): list<number>
1607fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1608fe465a01SBram Moolenaar      enddef
1609fe465a01SBram Moolenaar  END
1610fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1611fe465a01SBram Moolenaar
1612fe465a01SBram Moolenaar  let lines =<< trim END
1613fe465a01SBram Moolenaar    vim9script
1614fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1615fe465a01SBram Moolenaar    def Test()
1616fe465a01SBram Moolenaar      g:result = FastSort()
1617fe465a01SBram Moolenaar    enddef
1618fe465a01SBram Moolenaar    Test()
1619fe465a01SBram Moolenaar  END
1620fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1621fe465a01SBram Moolenaar
1622fe465a01SBram Moolenaar  source Xscript.vim
1623fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1624fe465a01SBram Moolenaar
1625fe465a01SBram Moolenaar  unlet g:result
1626fe465a01SBram Moolenaar  delete('Xsort.vim')
1627fe465a01SBram Moolenaar  delete('Xscript.vim')
1628fe465a01SBram Moolenaarenddef
1629fe465a01SBram Moolenaar
1630c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1631c620c055SBram Moolenaar" script where FastFilter() is called from.
1632c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1633c620c055SBram Moolenaar  let filterLines =<< trim END
1634c620c055SBram Moolenaar    vim9script
1635c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1636c620c055SBram Moolenaar      return idx % 2 == 1
1637c620c055SBram Moolenaar    enddef
1638c620c055SBram Moolenaar    export def FastFilter(): list<number>
1639c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1640c620c055SBram Moolenaar    enddef
1641c620c055SBram Moolenaar  END
1642c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1643c620c055SBram Moolenaar
1644c620c055SBram Moolenaar  let lines =<< trim END
1645c620c055SBram Moolenaar    vim9script
1646c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1647c620c055SBram Moolenaar    def Test()
1648c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1649c620c055SBram Moolenaar    enddef
1650c620c055SBram Moolenaar    Test()
1651c620c055SBram Moolenaar  END
1652c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1653c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1654c620c055SBram Moolenaar
1655c620c055SBram Moolenaar  delete('Xfilter.vim')
1656c620c055SBram Moolenaar  delete('Ximport.vim')
1657c620c055SBram Moolenaarenddef
1658c620c055SBram Moolenaar
16594c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
16604c17ad94SBram Moolenaar  let first_lines =<< trim END
16614c17ad94SBram Moolenaar    vim9script
16624c17ad94SBram Moolenaar    def FuncYes(): string
16634c17ad94SBram Moolenaar      return 'yes'
16644c17ad94SBram Moolenaar    enddef
16654c17ad94SBram Moolenaar  END
166603afdcf1SBram Moolenaar  let withno_lines =<< trim END
16674c17ad94SBram Moolenaar    def FuncNo(): string
16684c17ad94SBram Moolenaar      return 'no'
16694c17ad94SBram Moolenaar    enddef
16704c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16714c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16724c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
167303afdcf1SBram Moolenaar    enddef
167403afdcf1SBram Moolenaar  END
167503afdcf1SBram Moolenaar  let nono_lines =<< trim END
167603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
167703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
16784c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
16794c17ad94SBram Moolenaar    enddef
16804c17ad94SBram Moolenaar  END
16814c17ad94SBram Moolenaar
16824c17ad94SBram Moolenaar  # FuncNo() is defined
168303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16844c17ad94SBram Moolenaar  source Xreloaded.vim
16854c17ad94SBram Moolenaar  g:DoCheck(true)
16864c17ad94SBram Moolenaar
16874c17ad94SBram Moolenaar  # FuncNo() is not redefined
168803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16894c17ad94SBram Moolenaar  source Xreloaded.vim
169003afdcf1SBram Moolenaar  g:DoCheck()
16914c17ad94SBram Moolenaar
16924c17ad94SBram Moolenaar  # FuncNo() is back
169303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16944c17ad94SBram Moolenaar  source Xreloaded.vim
169503afdcf1SBram Moolenaar  g:DoCheck()
16964c17ad94SBram Moolenaar
16974c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16984c17ad94SBram Moolenaarenddef
16994c17ad94SBram Moolenaar
170089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
170189483d40SBram Moolenaar  # write the script with a script-local variable
170289483d40SBram Moolenaar  let lines =<< trim END
170389483d40SBram Moolenaar    vim9script
170489483d40SBram Moolenaar    let var = 'string'
170589483d40SBram Moolenaar  END
170689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
170789483d40SBram Moolenaar  source XreloadVar.vim
170889483d40SBram Moolenaar
170989483d40SBram Moolenaar  # now write the script using the same variable locally - works
171089483d40SBram Moolenaar  lines =<< trim END
171189483d40SBram Moolenaar    vim9script
171289483d40SBram Moolenaar    def Func()
171389483d40SBram Moolenaar      let var = 'string'
171489483d40SBram Moolenaar    enddef
171589483d40SBram Moolenaar  END
171689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
171789483d40SBram Moolenaar  source XreloadVar.vim
171889483d40SBram Moolenaar
171989483d40SBram Moolenaar  delete('XreloadVar.vim')
172089483d40SBram Moolenaarenddef
172189483d40SBram Moolenaar
17228a7d6542SBram Moolenaardef Test_import_absolute()
17238a7d6542SBram Moolenaar  let import_lines = [
1724e6085c53SBram Moolenaar        'vim9script',
1725e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1726e6085c53SBram Moolenaar        'def UseExported()',
1727e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1728e6085c53SBram Moolenaar        '  exported = 8888',
1729e6085c53SBram Moolenaar        '  g:imported_after = exported',
1730e6085c53SBram Moolenaar        'enddef',
1731e6085c53SBram Moolenaar        'UseExported()',
1732e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1733e6085c53SBram Moolenaar        ]
17348a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17358a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17368a7d6542SBram Moolenaar
17378a7d6542SBram Moolenaar  source Ximport_abs.vim
17388a7d6542SBram Moolenaar
17398a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17404e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1741675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1742675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1743675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1744675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1745675f716eSBram Moolenaar          'exported = 8888.*' ..
1746675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1747675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1748675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1749675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1750e6085c53SBram Moolenaar        g:import_disassembled)
1751b3ca9824SBram Moolenaar
1752b3ca9824SBram Moolenaar  Undo_export_script_lines()
17538a7d6542SBram Moolenaar  unlet g:imported_abs
17544e12a5dfSBram Moolenaar  unlet g:import_disassembled
17558a7d6542SBram Moolenaar
17568a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17578a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17588a7d6542SBram Moolenaarenddef
17598a7d6542SBram Moolenaar
17608a7d6542SBram Moolenaardef Test_import_rtp()
17618a7d6542SBram Moolenaar  let import_lines = [
1762e6085c53SBram Moolenaar        'vim9script',
1763e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1764e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1765e6085c53SBram Moolenaar        ]
17668a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17678a7d6542SBram Moolenaar  mkdir('import')
17688a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17698a7d6542SBram Moolenaar
17708a7d6542SBram Moolenaar  let save_rtp = &rtp
17718a7d6542SBram Moolenaar  &rtp = getcwd()
17728a7d6542SBram Moolenaar  source Ximport_rtp.vim
17738a7d6542SBram Moolenaar  &rtp = save_rtp
17748a7d6542SBram Moolenaar
17758a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17768a7d6542SBram Moolenaar
1777b3ca9824SBram Moolenaar  Undo_export_script_lines()
1778b3ca9824SBram Moolenaar  unlet g:imported_rtp
17798a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
178089483d40SBram Moolenaar  delete('import', 'rf')
17818a7d6542SBram Moolenaarenddef
17828a7d6542SBram Moolenaar
178325e0f586SBram Moolenaardef Test_import_compile_error()
178425e0f586SBram Moolenaar  let export_lines = [
178525e0f586SBram Moolenaar        'vim9script',
178625e0f586SBram Moolenaar        'export def ExpFunc(): string',
178725e0f586SBram Moolenaar        '  return notDefined',
178825e0f586SBram Moolenaar        'enddef',
178925e0f586SBram Moolenaar        ]
179025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
179125e0f586SBram Moolenaar
179225e0f586SBram Moolenaar  let import_lines = [
179325e0f586SBram Moolenaar        'vim9script',
179425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
179525e0f586SBram Moolenaar        'def ImpFunc()',
179625e0f586SBram Moolenaar        '  echo ExpFunc()',
179725e0f586SBram Moolenaar        'enddef',
179825e0f586SBram Moolenaar        'defcompile',
179925e0f586SBram Moolenaar        ]
180025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
180125e0f586SBram Moolenaar
180225e0f586SBram Moolenaar  try
180325e0f586SBram Moolenaar    source Ximport.vim
180425e0f586SBram Moolenaar  catch /E1001/
1805f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
180625e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
180725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
180825e0f586SBram Moolenaar  endtry
180925e0f586SBram Moolenaar
181025e0f586SBram Moolenaar  delete('Xexported.vim')
181125e0f586SBram Moolenaar  delete('Ximport.vim')
181225e0f586SBram Moolenaarenddef
181325e0f586SBram Moolenaar
1814c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1815c4ce36d4SBram Moolenaar  let lines = [
1816c4ce36d4SBram Moolenaar        'vim9script',
1817c4ce36d4SBram Moolenaar        'def Func()',
1818c4ce36d4SBram Moolenaar        '  eval [][0]',
1819c4ce36d4SBram Moolenaar        'enddef',
1820c4ce36d4SBram Moolenaar        'Func()',
1821c4ce36d4SBram Moolenaar        ]
1822c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1823c4ce36d4SBram Moolenaar
1824c4ce36d4SBram Moolenaar  for count in range(3)
1825c4ce36d4SBram Moolenaar    try
1826c4ce36d4SBram Moolenaar      source Xtestscript.vim
1827c4ce36d4SBram Moolenaar    catch /E684/
1828c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1829c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1830c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1831c4ce36d4SBram Moolenaar    endtry
1832c4ce36d4SBram Moolenaar  endfor
1833c4ce36d4SBram Moolenaar
1834c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1835c4ce36d4SBram Moolenaarenddef
1836c4ce36d4SBram Moolenaar
1837eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1838eef2102eSBram Moolenaar  let export_lines =<< trim END
1839eef2102eSBram Moolenaar      vim9script
1840eef2102eSBram Moolenaar      export def Func()
1841eef2102eSBram Moolenaar        echo 'imported'
1842eef2102eSBram Moolenaar      enddef
1843eef2102eSBram Moolenaar  END
1844eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1845eef2102eSBram Moolenaar
1846eef2102eSBram Moolenaar  let lines =<< trim END
1847eef2102eSBram Moolenaar    vim9script
1848eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1849eef2102eSBram Moolenaar    def Func()
1850eef2102eSBram Moolenaar      echo 'local to function'
1851eef2102eSBram Moolenaar    enddef
1852eef2102eSBram Moolenaar  END
1853eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1854eef2102eSBram Moolenaar
1855eef2102eSBram Moolenaar  lines =<< trim END
1856eef2102eSBram Moolenaar    vim9script
1857eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1858eef2102eSBram Moolenaar    def Outer()
1859eef2102eSBram Moolenaar      def Func()
1860eef2102eSBram Moolenaar        echo 'local to function'
1861eef2102eSBram Moolenaar      enddef
1862eef2102eSBram Moolenaar    enddef
1863eef2102eSBram Moolenaar    defcompile
1864eef2102eSBram Moolenaar  END
1865eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1866eef2102eSBram Moolenaar
1867eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1868eef2102eSBram Moolenaarenddef
1869eef2102eSBram Moolenaar
1870b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1871b9a2cac3SBram Moolenaar  let lines =<< trim END
1872b9a2cac3SBram Moolenaar    vim9script
1873b9a2cac3SBram Moolenaar    def Func()
1874b9a2cac3SBram Moolenaar      echo 'one'
1875b9a2cac3SBram Moolenaar    enddef
1876b9a2cac3SBram Moolenaar    def Func()
1877b9a2cac3SBram Moolenaar      echo 'two'
1878b9a2cac3SBram Moolenaar    enddef
1879b9a2cac3SBram Moolenaar  END
1880b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1881fa211f3cSBram Moolenaar
1882fa211f3cSBram Moolenaar  lines =<< trim END
1883fa211f3cSBram Moolenaar    vim9script
1884fa211f3cSBram Moolenaar    def Foo(): string
1885fa211f3cSBram Moolenaar      return 'foo'
1886fa211f3cSBram Moolenaar      enddef
1887fa211f3cSBram Moolenaar    def Func()
1888fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1889fa211f3cSBram Moolenaar    enddef
1890fa211f3cSBram Moolenaar    defcompile
1891fa211f3cSBram Moolenaar  END
1892fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1893b9a2cac3SBram Moolenaarenddef
1894b9a2cac3SBram Moolenaar
18958a7d6542SBram Moolenaardef Test_fixed_size_list()
1896f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
18978a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
18988a7d6542SBram Moolenaar  l->remove(0)
18998a7d6542SBram Moolenaar  l->add(5)
19008a7d6542SBram Moolenaar  l->insert(99, 1)
19010f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19028a7d6542SBram Moolenaarenddef
19038a7d6542SBram Moolenaar
1904ae616494SBram Moolenaardef Test_no_insert_xit()
1905ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1906ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1907f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1908f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1909f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1910ae616494SBram Moolenaar
1911ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1912ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1913ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1914ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1915f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1916f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1917f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1918f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1919f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1920ae616494SBram Moolenaarenddef
1921ae616494SBram Moolenaar
1922158906cfSBram Moolenaardef IfElse(what: number): string
1923158906cfSBram Moolenaar  let res = ''
1924158906cfSBram Moolenaar  if what == 1
1925158906cfSBram Moolenaar    res = "one"
1926158906cfSBram Moolenaar  elseif what == 2
1927158906cfSBram Moolenaar    res = "two"
1928a259d8d3SBram Moolenaar  else
1929158906cfSBram Moolenaar    res = "three"
1930a259d8d3SBram Moolenaar  endif
1931158906cfSBram Moolenaar  return res
1932a259d8d3SBram Moolenaarenddef
1933a259d8d3SBram Moolenaar
1934158906cfSBram Moolenaardef Test_if_elseif_else()
1935158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1936158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1937158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19380f18b6d1SBram Moolenaarenddef
19390f18b6d1SBram Moolenaar
1940e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1941e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1942e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1943e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1944e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1945585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1946e8c4abbbSBram Moolenaarenddef
1947e8c4abbbSBram Moolenaar
19486d69bf60SBram Moolenaarlet g:bool_true = v:true
19496d69bf60SBram Moolenaarlet g:bool_false = v:false
19506d69bf60SBram Moolenaar
19516d69bf60SBram Moolenaardef Test_if_const_expr()
19526d69bf60SBram Moolenaar  let res = false
19536d69bf60SBram Moolenaar  if true ? true : false
19546d69bf60SBram Moolenaar    res = true
19556d69bf60SBram Moolenaar  endif
19566d69bf60SBram Moolenaar  assert_equal(true, res)
19576d69bf60SBram Moolenaar
1958585fea7bSBram Moolenaar  g:glob = 2
1959585fea7bSBram Moolenaar  if false
19606797966dSBram Moolenaar    execute('g:glob = 3')
1961585fea7bSBram Moolenaar  endif
1962585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1963585fea7bSBram Moolenaar  if true
19646797966dSBram Moolenaar    execute('g:glob = 3')
1965585fea7bSBram Moolenaar  endif
1966585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1967585fea7bSBram Moolenaar
19686d69bf60SBram Moolenaar  res = false
19696d69bf60SBram Moolenaar  if g:bool_true ? true : false
19706d69bf60SBram Moolenaar    res = true
19716d69bf60SBram Moolenaar  endif
19726d69bf60SBram Moolenaar  assert_equal(true, res)
19736d69bf60SBram Moolenaar
19746d69bf60SBram Moolenaar  res = false
19756d69bf60SBram Moolenaar  if true ? g:bool_true : false
19766d69bf60SBram Moolenaar    res = true
19776d69bf60SBram Moolenaar  endif
19786d69bf60SBram Moolenaar  assert_equal(true, res)
19796d69bf60SBram Moolenaar
19806d69bf60SBram Moolenaar  res = false
19816d69bf60SBram Moolenaar  if true ? true : g:bool_false
19826d69bf60SBram Moolenaar    res = true
19836d69bf60SBram Moolenaar  endif
19846d69bf60SBram Moolenaar  assert_equal(true, res)
19856d69bf60SBram Moolenaar
19866d69bf60SBram Moolenaar  res = false
19876d69bf60SBram Moolenaar  if true ? false : true
19886d69bf60SBram Moolenaar    res = true
19896d69bf60SBram Moolenaar  endif
19906d69bf60SBram Moolenaar  assert_equal(false, res)
19916d69bf60SBram Moolenaar
19926d69bf60SBram Moolenaar  res = false
19936d69bf60SBram Moolenaar  if false ? false : true
19946d69bf60SBram Moolenaar    res = true
19956d69bf60SBram Moolenaar  endif
19966d69bf60SBram Moolenaar  assert_equal(true, res)
19976d69bf60SBram Moolenaar
19986d69bf60SBram Moolenaar  res = false
19996d69bf60SBram Moolenaar  if false ? true : false
20006d69bf60SBram Moolenaar    res = true
20016d69bf60SBram Moolenaar  endif
20026d69bf60SBram Moolenaar  assert_equal(false, res)
20036d69bf60SBram Moolenaar
20046d69bf60SBram Moolenaar  res = false
2005e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2006e8c4abbbSBram Moolenaar    res = true
2007e8c4abbbSBram Moolenaar  endif
2008e8c4abbbSBram Moolenaar  assert_equal(false, res)
2009e8c4abbbSBram Moolenaar
2010e8c4abbbSBram Moolenaar  res = false
20116d69bf60SBram Moolenaar  if true && true
20126d69bf60SBram Moolenaar    res = true
20136d69bf60SBram Moolenaar  endif
20146d69bf60SBram Moolenaar  assert_equal(true, res)
20156d69bf60SBram Moolenaar
20166d69bf60SBram Moolenaar  res = false
20176d69bf60SBram Moolenaar  if true && false
20186d69bf60SBram Moolenaar    res = true
20196d69bf60SBram Moolenaar  endif
20206d69bf60SBram Moolenaar  assert_equal(false, res)
20216d69bf60SBram Moolenaar
20226d69bf60SBram Moolenaar  res = false
20236d69bf60SBram Moolenaar  if g:bool_true && false
20246d69bf60SBram Moolenaar    res = true
20256d69bf60SBram Moolenaar  endif
20266d69bf60SBram Moolenaar  assert_equal(false, res)
20276d69bf60SBram Moolenaar
20286d69bf60SBram Moolenaar  res = false
20296d69bf60SBram Moolenaar  if true && g:bool_false
20306d69bf60SBram Moolenaar    res = true
20316d69bf60SBram Moolenaar  endif
20326d69bf60SBram Moolenaar  assert_equal(false, res)
20336d69bf60SBram Moolenaar
20346d69bf60SBram Moolenaar  res = false
20356d69bf60SBram Moolenaar  if false && false
20366d69bf60SBram Moolenaar    res = true
20376d69bf60SBram Moolenaar  endif
20386d69bf60SBram Moolenaar  assert_equal(false, res)
20396d69bf60SBram Moolenaar
20406d69bf60SBram Moolenaar  res = false
20416d69bf60SBram Moolenaar  if true || false
20426d69bf60SBram Moolenaar    res = true
20436d69bf60SBram Moolenaar  endif
20446d69bf60SBram Moolenaar  assert_equal(true, res)
20456d69bf60SBram Moolenaar
20466d69bf60SBram Moolenaar  res = false
20476d69bf60SBram Moolenaar  if g:bool_true || false
20486d69bf60SBram Moolenaar    res = true
20496d69bf60SBram Moolenaar  endif
20506d69bf60SBram Moolenaar  assert_equal(true, res)
20516d69bf60SBram Moolenaar
20526d69bf60SBram Moolenaar  res = false
20536d69bf60SBram Moolenaar  if true || g:bool_false
20546d69bf60SBram Moolenaar    res = true
20556d69bf60SBram Moolenaar  endif
20566d69bf60SBram Moolenaar  assert_equal(true, res)
20576d69bf60SBram Moolenaar
20586d69bf60SBram Moolenaar  res = false
20596d69bf60SBram Moolenaar  if false || false
20606d69bf60SBram Moolenaar    res = true
20616d69bf60SBram Moolenaar  endif
20626d69bf60SBram Moolenaar  assert_equal(false, res)
206380c34ca3SBram Moolenaarenddef
20646d69bf60SBram Moolenaar
206580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
206680c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
206780c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2068e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2069e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20706d69bf60SBram Moolenaarenddef
20716d69bf60SBram Moolenaar
207272abcf42SBram Moolenaardef RunNested(i: number): number
207372abcf42SBram Moolenaar  let x: number = 0
207472abcf42SBram Moolenaar  if i % 2
207572abcf42SBram Moolenaar    if 1
2076f5be8cdbSBram Moolenaar      # comment
207772abcf42SBram Moolenaar    else
2078f5be8cdbSBram Moolenaar      # comment
207972abcf42SBram Moolenaar    endif
208072abcf42SBram Moolenaar    x += 1
208172abcf42SBram Moolenaar  else
208272abcf42SBram Moolenaar    x += 1000
208372abcf42SBram Moolenaar  endif
208472abcf42SBram Moolenaar  return x
208572abcf42SBram Moolenaarenddef
208672abcf42SBram Moolenaar
208772abcf42SBram Moolenaardef Test_nested_if()
208872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
208972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
209072abcf42SBram Moolenaarenddef
209172abcf42SBram Moolenaar
2092ad39c094SBram Moolenaardef Test_execute_cmd()
2093ad39c094SBram Moolenaar  new
2094ad39c094SBram Moolenaar  setline(1, 'default')
2095ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2096ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2097a72cfb80SBram Moolenaar
2098a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2099a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2100a72cfb80SBram Moolenaar
2101ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2102ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2103a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2104ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2105a72cfb80SBram Moolenaar
2106ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2107ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2108a72cfb80SBram Moolenaar
2109ad39c094SBram Moolenaar  let cmd_first = 'call '
2110ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2111ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2112ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2113ad39c094SBram Moolenaar  bwipe!
2114585fea7bSBram Moolenaar
21152d6b20d6SBram Moolenaar  let n = true
21162d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21172d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21182d6b20d6SBram Moolenaar
2119e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2120e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2121e5abf7afSBram Moolenaar
2122585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2123a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2124ad39c094SBram Moolenaarenddef
2125ad39c094SBram Moolenaar
212647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2127f5be8cdbSBram Moolenaar  # only checks line continuation
212847e880d6SBram Moolenaar  let lines =<< trim END
212947e880d6SBram Moolenaar      vim9script
213047e880d6SBram Moolenaar      execute 'g:someVar'
213147e880d6SBram Moolenaar                .. ' = ' ..
213247e880d6SBram Moolenaar                   '28'
213347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
213447e880d6SBram Moolenaar      unlet g:someVar
213547e880d6SBram Moolenaar  END
213647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
213747e880d6SBram Moolenaarenddef
213847e880d6SBram Moolenaar
2139ad39c094SBram Moolenaardef Test_echo_cmd()
2140a72cfb80SBram Moolenaar  echo 'some' # comment
2141585fea7bSBram Moolenaar  echon 'thing'
2142ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2143ad39c094SBram Moolenaar
2144a72cfb80SBram Moolenaar  echo "some" # comment
2145a72cfb80SBram Moolenaar  echon "thing"
2146a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2147a72cfb80SBram Moolenaar
2148ad39c094SBram Moolenaar  let str1 = 'some'
2149ad39c094SBram Moolenaar  let str2 = 'more'
2150ad39c094SBram Moolenaar  echo str1 str2
2151ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2152a72cfb80SBram Moolenaar
2153a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2154ad39c094SBram Moolenaarenddef
2155ad39c094SBram Moolenaar
2156f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2157f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2158f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2159f93c7feaSBram Moolenaar  echo 'clear'
2160df069eecSBram Moolenaar  :1messages
2161f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2162f93c7feaSBram Moolenaar
2163f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2164f93c7feaSBram Moolenaarenddef
2165f93c7feaSBram Moolenaar
216647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2167f5be8cdbSBram Moolenaar  # only checks line continuation
216847e880d6SBram Moolenaar  let lines =<< trim END
216947e880d6SBram Moolenaar      vim9script
217047e880d6SBram Moolenaar      echomsg 'here'
217147e880d6SBram Moolenaar                .. ' is ' ..
217247e880d6SBram Moolenaar                   'a message'
217347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
217447e880d6SBram Moolenaar  END
217547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
217647e880d6SBram Moolenaarenddef
217747e880d6SBram Moolenaar
2178f93c7feaSBram Moolenaardef Test_echoerr_cmd()
217940ee466cSBram Moolenaar  try
218040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
218140ee466cSBram Moolenaar  catch
218240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
218340ee466cSBram Moolenaar  endtry
2184f93c7feaSBram Moolenaarenddef
2185f93c7feaSBram Moolenaar
218647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2187f5be8cdbSBram Moolenaar  # only checks line continuation
218847e880d6SBram Moolenaar  let lines =<< trim END
218947e880d6SBram Moolenaar      vim9script
219047e880d6SBram Moolenaar      try
219147e880d6SBram Moolenaar        echoerr 'this'
219247e880d6SBram Moolenaar                .. ' is ' ..
219347e880d6SBram Moolenaar                   'wrong'
219447e880d6SBram Moolenaar      catch
219547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
219647e880d6SBram Moolenaar      endtry
219747e880d6SBram Moolenaar  END
219847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
219947e880d6SBram Moolenaarenddef
220047e880d6SBram Moolenaar
220141fe0617SBram Moolenaardef Test_for_outside_of_function()
220241fe0617SBram Moolenaar  let lines =<< trim END
220341fe0617SBram Moolenaar    vim9script
220441fe0617SBram Moolenaar    new
220541fe0617SBram Moolenaar    for var in range(0, 3)
220641fe0617SBram Moolenaar      append(line('$'), var)
220741fe0617SBram Moolenaar    endfor
220841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
220941fe0617SBram Moolenaar    bwipe!
221041fe0617SBram Moolenaar  END
221141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
221241fe0617SBram Moolenaar  source Xvim9for.vim
221341fe0617SBram Moolenaar  delete('Xvim9for.vim')
221441fe0617SBram Moolenaarenddef
22158a7d6542SBram Moolenaar
2216e8c4abbbSBram Moolenaardef Test_for_loop()
2217e8c4abbbSBram Moolenaar  let result = ''
2218e8c4abbbSBram Moolenaar  for cnt in range(7)
2219e8c4abbbSBram Moolenaar    if cnt == 4
2220e8c4abbbSBram Moolenaar      break
2221e8c4abbbSBram Moolenaar    endif
2222e8c4abbbSBram Moolenaar    if cnt == 2
2223e8c4abbbSBram Moolenaar      continue
2224e8c4abbbSBram Moolenaar    endif
2225e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2226e8c4abbbSBram Moolenaar  endfor
2227e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22280ad3e894SBram Moolenaar
22290ad3e894SBram Moolenaar  let concat = ''
22300ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22310ad3e894SBram Moolenaar    concat ..= str
22320ad3e894SBram Moolenaar  endfor
22330ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2234e8c4abbbSBram Moolenaarenddef
2235e8c4abbbSBram Moolenaar
2236e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2237675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2238675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2239451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2240822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2241451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2242675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2243675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2244675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2245e8c4abbbSBram Moolenaarenddef
2246e8c4abbbSBram Moolenaar
2247d0df1aacSBram Moolenaardef Test_while_loop()
2248d0df1aacSBram Moolenaar  let result = ''
2249d0df1aacSBram Moolenaar  let cnt = 0
2250d0df1aacSBram Moolenaar  while cnt < 555
2251d0df1aacSBram Moolenaar    if cnt == 3
2252d0df1aacSBram Moolenaar      break
2253d0df1aacSBram Moolenaar    endif
2254d0df1aacSBram Moolenaar    cnt += 1
2255d0df1aacSBram Moolenaar    if cnt == 2
2256d0df1aacSBram Moolenaar      continue
2257d0df1aacSBram Moolenaar    endif
2258d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2259d0df1aacSBram Moolenaar  endwhile
2260d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2261d0df1aacSBram Moolenaarenddef
2262d0df1aacSBram Moolenaar
2263e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2264675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2265675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2266675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2267675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2268675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2269675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2270675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2271bd5da371SBram Moolenaarenddef
2272bd5da371SBram Moolenaar
22739645e2d9SBram Moolenaardef Test_interrupt_loop()
227497acfc78SBram Moolenaar  let caught = false
22759645e2d9SBram Moolenaar  let x = 0
227697acfc78SBram Moolenaar  try
22779645e2d9SBram Moolenaar    while 1
22789645e2d9SBram Moolenaar      x += 1
22799645e2d9SBram Moolenaar      if x == 100
22809645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22819645e2d9SBram Moolenaar      endif
22829645e2d9SBram Moolenaar    endwhile
228397acfc78SBram Moolenaar  catch
228497acfc78SBram Moolenaar    caught = true
228597acfc78SBram Moolenaar    assert_equal(100, x)
228697acfc78SBram Moolenaar  endtry
228797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
22889645e2d9SBram Moolenaarenddef
228920431c9dSBram Moolenaar
22904fdae999SBram Moolenaardef Test_automatic_line_continuation()
22914fdae999SBram Moolenaar  let mylist = [
22924fdae999SBram Moolenaar      'one',
22934fdae999SBram Moolenaar      'two',
22944fdae999SBram Moolenaar      'three',
2295f5be8cdbSBram Moolenaar      ] # comment
22964fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
22974fdae999SBram Moolenaar
22984fdae999SBram Moolenaar  let mydict = {
22994fdae999SBram Moolenaar      'one': 1,
23004fdae999SBram Moolenaar      'two': 2,
23014fdae999SBram Moolenaar      'three':
23024fdae999SBram Moolenaar          3,
2303f5be8cdbSBram Moolenaar      } # comment
23044fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23054fdae999SBram Moolenaar  mydict = #{
23062c330432SBram Moolenaar      one: 1,  # comment
23072c330432SBram Moolenaar      two:     # comment
23082c330432SBram Moolenaar           2,  # comment
23092c330432SBram Moolenaar      three: 3 # comment
23102c330432SBram Moolenaar      }
23112c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23122c330432SBram Moolenaar  mydict = #{
23132c330432SBram Moolenaar      one: 1,
23144fdae999SBram Moolenaar      two:
23154fdae999SBram Moolenaar           2,
23162c330432SBram Moolenaar      three: 3
23174fdae999SBram Moolenaar      }
23184fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2319e6085c53SBram Moolenaar
2320e6085c53SBram Moolenaar  assert_equal(
2321e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2322e6085c53SBram Moolenaar        split('one two three')
2323e6085c53SBram Moolenaar        )
23244fdae999SBram Moolenaarenddef
23254fdae999SBram Moolenaar
23267a092245SBram Moolenaardef Test_vim9_comment()
23277a092245SBram Moolenaar  CheckScriptSuccess([
23287a092245SBram Moolenaar      'vim9script',
23297a092245SBram Moolenaar      '# something',
23307a092245SBram Moolenaar      ])
23317a092245SBram Moolenaar  CheckScriptFailure([
23327a092245SBram Moolenaar      'vim9script',
23337a092245SBram Moolenaar      ':# something',
23347a092245SBram Moolenaar      ], 'E488:')
23357a092245SBram Moolenaar  CheckScriptFailure([
23367a092245SBram Moolenaar      '# something',
23377a092245SBram Moolenaar      ], 'E488:')
23387a092245SBram Moolenaar  CheckScriptFailure([
23397a092245SBram Moolenaar      ':# something',
23407a092245SBram Moolenaar      ], 'E488:')
23417a092245SBram Moolenaar
23424a8d9f2eSBram Moolenaar  { # block start
23434a8d9f2eSBram Moolenaar  } # block end
23444a8d9f2eSBram Moolenaar  CheckDefFailure([
23454a8d9f2eSBram Moolenaar      '{# comment',
23464a8d9f2eSBram Moolenaar      ], 'E488:')
23474a8d9f2eSBram Moolenaar  CheckDefFailure([
23484a8d9f2eSBram Moolenaar      '{',
23494a8d9f2eSBram Moolenaar      '}# comment',
23504a8d9f2eSBram Moolenaar      ], 'E488:')
23514a8d9f2eSBram Moolenaar
23524a8d9f2eSBram Moolenaar  echo "yes" # comment
23534a8d9f2eSBram Moolenaar  CheckDefFailure([
23544a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23554a8d9f2eSBram Moolenaar      ], 'E488:')
23567a092245SBram Moolenaar  CheckScriptSuccess([
23577a092245SBram Moolenaar      'vim9script',
23587a092245SBram Moolenaar      'echo "yes" # something',
23597a092245SBram Moolenaar      ])
23607a092245SBram Moolenaar  CheckScriptFailure([
23617a092245SBram Moolenaar      'vim9script',
23627a092245SBram Moolenaar      'echo "yes"# something',
23637a092245SBram Moolenaar      ], 'E121:')
23647a092245SBram Moolenaar  CheckScriptFailure([
23657a092245SBram Moolenaar      'vim9script',
23667a092245SBram Moolenaar      'echo# something',
23677a092245SBram Moolenaar      ], 'E121:')
23687a092245SBram Moolenaar  CheckScriptFailure([
23697a092245SBram Moolenaar      'echo "yes" # something',
23707a092245SBram Moolenaar      ], 'E121:')
23717a092245SBram Moolenaar
23724a8d9f2eSBram Moolenaar  exe "echo" # comment
23734a8d9f2eSBram Moolenaar  CheckDefFailure([
23744a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23754a8d9f2eSBram Moolenaar      ], 'E488:')
23764a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23774a8d9f2eSBram Moolenaar      'vim9script',
23784a8d9f2eSBram Moolenaar      'exe "echo" # something',
23794a8d9f2eSBram Moolenaar      ])
23804a8d9f2eSBram Moolenaar  CheckScriptFailure([
23814a8d9f2eSBram Moolenaar      'vim9script',
23824a8d9f2eSBram Moolenaar      'exe "echo"# something',
23834a8d9f2eSBram Moolenaar      ], 'E121:')
23844a8d9f2eSBram Moolenaar  CheckDefFailure([
23854a8d9f2eSBram Moolenaar      'exe # comment',
23864a8d9f2eSBram Moolenaar      ], 'E1015:')
23874a8d9f2eSBram Moolenaar  CheckScriptFailure([
23884a8d9f2eSBram Moolenaar      'vim9script',
23894a8d9f2eSBram Moolenaar      'exe# something',
23904a8d9f2eSBram Moolenaar      ], 'E121:')
23914a8d9f2eSBram Moolenaar  CheckScriptFailure([
23924a8d9f2eSBram Moolenaar      'exe "echo" # something',
23934a8d9f2eSBram Moolenaar      ], 'E121:')
23944a8d9f2eSBram Moolenaar
23957a092245SBram Moolenaar  CheckDefFailure([
23967a092245SBram Moolenaar      'try# comment',
23977a092245SBram Moolenaar      '  echo "yes"',
23987a092245SBram Moolenaar      'catch',
23997a092245SBram Moolenaar      'endtry',
24007a092245SBram Moolenaar      ], 'E488:')
24012c5ed4e3SBram Moolenaar  CheckScriptFailure([
24022c5ed4e3SBram Moolenaar      'vim9script',
24032c5ed4e3SBram Moolenaar      'try# comment',
24042c5ed4e3SBram Moolenaar      'echo "yes"',
24052c5ed4e3SBram Moolenaar      ], 'E488:')
24067a092245SBram Moolenaar  CheckDefFailure([
24077a092245SBram Moolenaar      'try',
2408a72cfb80SBram Moolenaar      '  throw#comment',
2409a72cfb80SBram Moolenaar      'catch',
2410a72cfb80SBram Moolenaar      'endtry',
2411a72cfb80SBram Moolenaar      ], 'E1015:')
2412a72cfb80SBram Moolenaar  CheckDefFailure([
2413a72cfb80SBram Moolenaar      'try',
2414a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2415a72cfb80SBram Moolenaar      'catch',
2416a72cfb80SBram Moolenaar      'endtry',
2417a72cfb80SBram Moolenaar      ], 'E488:')
2418a72cfb80SBram Moolenaar  CheckDefFailure([
2419a72cfb80SBram Moolenaar      'try',
24207a092245SBram Moolenaar      '  echo "yes"',
24217a092245SBram Moolenaar      'catch# comment',
24227a092245SBram Moolenaar      'endtry',
24237a092245SBram Moolenaar      ], 'E488:')
24242c5ed4e3SBram Moolenaar  CheckScriptFailure([
24252c5ed4e3SBram Moolenaar      'vim9script',
24262c5ed4e3SBram Moolenaar      'try',
24272c5ed4e3SBram Moolenaar      '  echo "yes"',
24282c5ed4e3SBram Moolenaar      'catch# comment',
24292c5ed4e3SBram Moolenaar      'endtry',
24302c5ed4e3SBram Moolenaar      ], 'E654:')
24312c5ed4e3SBram Moolenaar  CheckDefFailure([
24322c5ed4e3SBram Moolenaar      'try',
24332c5ed4e3SBram Moolenaar      '  echo "yes"',
24342c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24352c5ed4e3SBram Moolenaar      'endtry',
24362c5ed4e3SBram Moolenaar      ], 'E488:')
24377a092245SBram Moolenaar  CheckDefFailure([
24387a092245SBram Moolenaar      'try',
24397a092245SBram Moolenaar      'echo "yes"',
24407a092245SBram Moolenaar      'catch',
24417a092245SBram Moolenaar      'endtry# comment',
24427a092245SBram Moolenaar      ], 'E488:')
24432c5ed4e3SBram Moolenaar  CheckScriptFailure([
24442c5ed4e3SBram Moolenaar      'vim9script',
24452c5ed4e3SBram Moolenaar      'try',
24462c5ed4e3SBram Moolenaar      '  echo "yes"',
24472c5ed4e3SBram Moolenaar      'catch',
24482c5ed4e3SBram Moolenaar      'endtry# comment',
24499b7bf9e9SBram Moolenaar      ], 'E488:')
24502c5ed4e3SBram Moolenaar
24512c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24522c5ed4e3SBram Moolenaar      'vim9script',
24532c5ed4e3SBram Moolenaar      'hi # comment',
24542c5ed4e3SBram Moolenaar      ])
24552c5ed4e3SBram Moolenaar  CheckScriptFailure([
24562c5ed4e3SBram Moolenaar      'vim9script',
24572c5ed4e3SBram Moolenaar      'hi# comment',
24582c5ed4e3SBram Moolenaar      ], 'E416:')
24591966c248SBram Moolenaar  CheckScriptSuccess([
24601966c248SBram Moolenaar      'vim9script',
24611966c248SBram Moolenaar      'hi Search # comment',
24621966c248SBram Moolenaar      ])
24631966c248SBram Moolenaar  CheckScriptFailure([
24641966c248SBram Moolenaar      'vim9script',
24651966c248SBram Moolenaar      'hi Search# comment',
24661966c248SBram Moolenaar      ], 'E416:')
24671966c248SBram Moolenaar  CheckScriptSuccess([
24681966c248SBram Moolenaar      'vim9script',
24691966c248SBram Moolenaar      'hi link This Search # comment',
24701966c248SBram Moolenaar      ])
24711966c248SBram Moolenaar  CheckScriptFailure([
24721966c248SBram Moolenaar      'vim9script',
24731966c248SBram Moolenaar      'hi link This That# comment',
24741966c248SBram Moolenaar      ], 'E413:')
24751966c248SBram Moolenaar  CheckScriptSuccess([
24761966c248SBram Moolenaar      'vim9script',
24771966c248SBram Moolenaar      'hi clear This # comment',
24781966c248SBram Moolenaar      'hi clear # comment',
24791966c248SBram Moolenaar      ])
2480f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2481f5be8cdbSBram Moolenaar  # hi clear This# comment',
24821966c248SBram Moolenaar  CheckScriptFailure([
24831966c248SBram Moolenaar      'vim9script',
24841966c248SBram Moolenaar      'hi clear# comment',
24851966c248SBram Moolenaar      ], 'E416:')
24861966c248SBram Moolenaar
24871966c248SBram Moolenaar  CheckScriptSuccess([
24881966c248SBram Moolenaar      'vim9script',
24891966c248SBram Moolenaar      'hi Group term=bold',
24901966c248SBram Moolenaar      'match Group /todo/ # comment',
24911966c248SBram Moolenaar      ])
24921966c248SBram Moolenaar  CheckScriptFailure([
24931966c248SBram Moolenaar      'vim9script',
24941966c248SBram Moolenaar      'hi Group term=bold',
24951966c248SBram Moolenaar      'match Group /todo/# comment',
24961966c248SBram Moolenaar      ], 'E488:')
24971966c248SBram Moolenaar  CheckScriptSuccess([
24981966c248SBram Moolenaar      'vim9script',
24991966c248SBram Moolenaar      'match # comment',
25001966c248SBram Moolenaar      ])
25011966c248SBram Moolenaar  CheckScriptFailure([
25021966c248SBram Moolenaar      'vim9script',
25031966c248SBram Moolenaar      'match# comment',
25041966c248SBram Moolenaar      ], 'E475:')
25051966c248SBram Moolenaar  CheckScriptSuccess([
25061966c248SBram Moolenaar      'vim9script',
25071966c248SBram Moolenaar      'match none # comment',
25081966c248SBram Moolenaar      ])
25091966c248SBram Moolenaar  CheckScriptFailure([
25101966c248SBram Moolenaar      'vim9script',
25111966c248SBram Moolenaar      'match none# comment',
25121966c248SBram Moolenaar      ], 'E475:')
25131966c248SBram Moolenaar
25141966c248SBram Moolenaar  CheckScriptSuccess([
25151966c248SBram Moolenaar      'vim9script',
25161966c248SBram Moolenaar      'menutrans clear # comment',
25171966c248SBram Moolenaar      ])
25181966c248SBram Moolenaar  CheckScriptFailure([
25191966c248SBram Moolenaar      'vim9script',
25201966c248SBram Moolenaar      'menutrans clear# comment text',
25211966c248SBram Moolenaar      ], 'E474:')
25221966c248SBram Moolenaar
25231966c248SBram Moolenaar  CheckScriptSuccess([
25241966c248SBram Moolenaar      'vim9script',
25251966c248SBram Moolenaar      'syntax clear # comment',
25261966c248SBram Moolenaar      ])
25271966c248SBram Moolenaar  CheckScriptFailure([
25281966c248SBram Moolenaar      'vim9script',
25291966c248SBram Moolenaar      'syntax clear# comment text',
25301966c248SBram Moolenaar      ], 'E28:')
25311966c248SBram Moolenaar  CheckScriptSuccess([
25321966c248SBram Moolenaar      'vim9script',
25331966c248SBram Moolenaar      'syntax keyword Word some',
25341966c248SBram Moolenaar      'syntax clear Word # comment',
25351966c248SBram Moolenaar      ])
25361966c248SBram Moolenaar  CheckScriptFailure([
25371966c248SBram Moolenaar      'vim9script',
25381966c248SBram Moolenaar      'syntax keyword Word some',
25391966c248SBram Moolenaar      'syntax clear Word# comment text',
25401966c248SBram Moolenaar      ], 'E28:')
25411966c248SBram Moolenaar
25421966c248SBram Moolenaar  CheckScriptSuccess([
25431966c248SBram Moolenaar      'vim9script',
25441966c248SBram Moolenaar      'syntax list # comment',
25451966c248SBram Moolenaar      ])
25461966c248SBram Moolenaar  CheckScriptFailure([
25471966c248SBram Moolenaar      'vim9script',
25481966c248SBram Moolenaar      'syntax list# comment text',
25491966c248SBram Moolenaar      ], 'E28:')
25501966c248SBram Moolenaar
25511966c248SBram Moolenaar  CheckScriptSuccess([
25521966c248SBram Moolenaar      'vim9script',
25531966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
25541966c248SBram Moolenaar      ])
25551966c248SBram Moolenaar  CheckScriptFailure([
25561966c248SBram Moolenaar      'vim9script',
25571966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25581966c248SBram Moolenaar      ], 'E475:')
25591966c248SBram Moolenaar
25601966c248SBram Moolenaar  CheckScriptSuccess([
25611966c248SBram Moolenaar      'vim9script',
25621966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25631966c248SBram Moolenaar      ])
25641966c248SBram Moolenaar  CheckScriptFailure([
25651966c248SBram Moolenaar      'vim9script',
25661966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25671966c248SBram Moolenaar      ], 'E789:')
25681966c248SBram Moolenaar
25691966c248SBram Moolenaar  CheckScriptSuccess([
25701966c248SBram Moolenaar      'vim9script',
25711966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25721966c248SBram Moolenaar      ])
25731966c248SBram Moolenaar  CheckScriptFailure([
25741966c248SBram Moolenaar      'vim9script',
25751966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25761966c248SBram Moolenaar      ], 'E402:')
25771966c248SBram Moolenaar
25781966c248SBram Moolenaar  CheckScriptSuccess([
25791966c248SBram Moolenaar      'vim9script',
25801966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25811966c248SBram Moolenaar      ])
25821966c248SBram Moolenaar  CheckScriptFailure([
25831966c248SBram Moolenaar      'vim9script',
25841966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25851966c248SBram Moolenaar      ], 'E475:')
25861966c248SBram Moolenaar  CheckScriptFailure([
25871966c248SBram Moolenaar      'vim9script',
25881966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
25891966c248SBram Moolenaar      ], 'E406:')
25901966c248SBram Moolenaar  CheckScriptFailure([
25911966c248SBram Moolenaar      'vim9script',
25921966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
25931966c248SBram Moolenaar      ], 'E475:')
25941966c248SBram Moolenaar
25951966c248SBram Moolenaar  CheckScriptSuccess([
25961966c248SBram Moolenaar      'vim9script',
25971966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
25981966c248SBram Moolenaar      ])
25991966c248SBram Moolenaar  CheckScriptFailure([
26001966c248SBram Moolenaar      'vim9script',
26011966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2602d032f34aSBram Moolenaar      ], 'E402:')
26031966c248SBram Moolenaar
26041966c248SBram Moolenaar  CheckScriptSuccess([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'syntax sync # comment',
26071966c248SBram Moolenaar      ])
26081966c248SBram Moolenaar  CheckScriptFailure([
26091966c248SBram Moolenaar      'vim9script',
26101966c248SBram Moolenaar      'syntax sync# comment',
26111966c248SBram Moolenaar      ], 'E404:')
26121966c248SBram Moolenaar  CheckScriptSuccess([
26131966c248SBram Moolenaar      'vim9script',
26141966c248SBram Moolenaar      'syntax sync ccomment # comment',
26151966c248SBram Moolenaar      ])
26161966c248SBram Moolenaar  CheckScriptFailure([
26171966c248SBram Moolenaar      'vim9script',
26181966c248SBram Moolenaar      'syntax sync ccomment# comment',
26191966c248SBram Moolenaar      ], 'E404:')
26201966c248SBram Moolenaar
26211966c248SBram Moolenaar  CheckScriptSuccess([
26221966c248SBram Moolenaar      'vim9script',
26231966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26241966c248SBram Moolenaar      ])
26251966c248SBram Moolenaar  CheckScriptFailure([
26261966c248SBram Moolenaar      'vim9script',
26271966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26281966c248SBram Moolenaar      ], 'E475:')
2629a72cfb80SBram Moolenaar
2630a72cfb80SBram Moolenaar  CheckScriptSuccess([
2631a72cfb80SBram Moolenaar      'vim9script',
2632a72cfb80SBram Moolenaar      'command Echo echo # comment',
2633a72cfb80SBram Moolenaar      'command Echo # comment',
2634a72cfb80SBram Moolenaar      ])
2635a72cfb80SBram Moolenaar  CheckScriptFailure([
2636a72cfb80SBram Moolenaar      'vim9script',
2637a72cfb80SBram Moolenaar      'command Echo echo# comment',
2638a72cfb80SBram Moolenaar      'Echo',
2639a72cfb80SBram Moolenaar      ], 'E121:')
2640a72cfb80SBram Moolenaar  CheckScriptFailure([
2641a72cfb80SBram Moolenaar      'vim9script',
2642a72cfb80SBram Moolenaar      'command Echo# comment',
2643a72cfb80SBram Moolenaar      ], 'E182:')
2644a72cfb80SBram Moolenaar  CheckScriptFailure([
2645a72cfb80SBram Moolenaar      'vim9script',
2646a72cfb80SBram Moolenaar      'command Echo echo',
2647a72cfb80SBram Moolenaar      'command Echo# comment',
2648a72cfb80SBram Moolenaar      ], 'E182:')
2649a72cfb80SBram Moolenaar
2650a72cfb80SBram Moolenaar  CheckScriptSuccess([
2651a72cfb80SBram Moolenaar      'vim9script',
2652a72cfb80SBram Moolenaar      'function # comment',
2653a72cfb80SBram Moolenaar      ])
2654a72cfb80SBram Moolenaar  CheckScriptFailure([
2655a72cfb80SBram Moolenaar      'vim9script',
26569898107fSBram Moolenaar      'function " comment',
26579898107fSBram Moolenaar      ], 'E129:')
26589898107fSBram Moolenaar  CheckScriptFailure([
26599898107fSBram Moolenaar      'vim9script',
2660a72cfb80SBram Moolenaar      'function# comment',
2661a72cfb80SBram Moolenaar      ], 'E129:')
2662a72cfb80SBram Moolenaar  CheckScriptSuccess([
2663a72cfb80SBram Moolenaar      'vim9script',
2664a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2665a72cfb80SBram Moolenaar      ])
2666a72cfb80SBram Moolenaar  CheckScriptFailure([
2667a72cfb80SBram Moolenaar      'vim9script',
2668a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2669a72cfb80SBram Moolenaar      ], 'E488:')
2670a72cfb80SBram Moolenaar
2671a72cfb80SBram Moolenaar  CheckScriptSuccess([
2672a72cfb80SBram Moolenaar      'vim9script',
26734c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2674a72cfb80SBram Moolenaar      'endfunc',
26754c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2676a72cfb80SBram Moolenaar      ])
2677a72cfb80SBram Moolenaar  CheckScriptFailure([
2678a72cfb80SBram Moolenaar      'vim9script',
26794c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2680a72cfb80SBram Moolenaar      'endfunc',
26814c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2682a72cfb80SBram Moolenaar      ], 'E488:')
2683a72cfb80SBram Moolenaar
2684a72cfb80SBram Moolenaar  CheckScriptSuccess([
2685a72cfb80SBram Moolenaar      'vim9script',
2686a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2687a72cfb80SBram Moolenaar      ])
2688a72cfb80SBram Moolenaar  CheckScriptFailure([
2689a72cfb80SBram Moolenaar      'vim9script',
2690a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2691a72cfb80SBram Moolenaar      ], 'E488:')
2692e7e4838fSBram Moolenaar
2693e7e4838fSBram Moolenaar  CheckScriptFailure([
2694e7e4838fSBram Moolenaar      'def Test() " comment',
2695e7e4838fSBram Moolenaar      'enddef',
2696e7e4838fSBram Moolenaar      ], 'E488:')
2697e7e4838fSBram Moolenaar  CheckScriptFailure([
2698e7e4838fSBram Moolenaar      'vim9script',
2699e7e4838fSBram Moolenaar      'def Test() " comment',
2700e7e4838fSBram Moolenaar      'enddef',
2701e7e4838fSBram Moolenaar      ], 'E488:')
2702e7e4838fSBram Moolenaar
2703e7e4838fSBram Moolenaar  CheckScriptSuccess([
2704e7e4838fSBram Moolenaar      'func Test() " comment',
2705e7e4838fSBram Moolenaar      'endfunc',
2706e7e4838fSBram Moolenaar      ])
27079898107fSBram Moolenaar  CheckScriptSuccess([
2708e7e4838fSBram Moolenaar      'vim9script',
2709e7e4838fSBram Moolenaar      'func Test() " comment',
2710e7e4838fSBram Moolenaar      'endfunc',
27119898107fSBram Moolenaar      ])
2712e7e4838fSBram Moolenaar
2713e7e4838fSBram Moolenaar  CheckScriptSuccess([
2714e7e4838fSBram Moolenaar      'def Test() # comment',
2715e7e4838fSBram Moolenaar      'enddef',
2716e7e4838fSBram Moolenaar      ])
2717e7e4838fSBram Moolenaar  CheckScriptFailure([
2718e7e4838fSBram Moolenaar      'func Test() # comment',
2719e7e4838fSBram Moolenaar      'endfunc',
2720e7e4838fSBram Moolenaar      ], 'E488:')
27212c5ed4e3SBram Moolenaarenddef
27222c5ed4e3SBram Moolenaar
27232c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27242c5ed4e3SBram Moolenaar  CheckCanRunGui
27252c5ed4e3SBram Moolenaar
27262c5ed4e3SBram Moolenaar  CheckScriptFailure([
27272c5ed4e3SBram Moolenaar      'vim9script',
27282c5ed4e3SBram Moolenaar      'gui#comment'
27292c5ed4e3SBram Moolenaar      ], 'E499:')
27302c5ed4e3SBram Moolenaar  CheckScriptFailure([
27312c5ed4e3SBram Moolenaar      'vim9script',
27322c5ed4e3SBram Moolenaar      'gui -f#comment'
27332c5ed4e3SBram Moolenaar      ], 'E499:')
27347a092245SBram Moolenaarenddef
27357a092245SBram Moolenaar
2736a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27376797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27386797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2739a26b9700SBram Moolenaar
2740a26b9700SBram Moolenaar  edit test.vim
2741a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2742a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2743a26b9700SBram Moolenaar
2744a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2745a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2746a26b9700SBram Moolenaar
2747a26b9700SBram Moolenaar  g:entered = 0
2748a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2749a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2750a26b9700SBram Moolenaar
2751a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2752a26b9700SBram Moolenaar
2753a26b9700SBram Moolenaar  au! TabEnter
2754a26b9700SBram Moolenaar  unlet g:entered
2755d72c1bf0SBram Moolenaar
2756d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2757d72c1bf0SBram Moolenaar      'vim9script',
27586797966dSBram Moolenaar      'g:var = 123',
2759e55b1c09SBram Moolenaar      'b:var = 456',
2760e55b1c09SBram Moolenaar      'w:var = 777',
2761e55b1c09SBram Moolenaar      't:var = 888',
2762d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2763d72c1bf0SBram Moolenaar      ])
2764d72c1bf0SBram Moolenaar
2765d72c1bf0SBram Moolenaar  CheckScriptFailure([
2766d72c1bf0SBram Moolenaar      'vim9script',
2767d72c1bf0SBram Moolenaar      'let g:var = 123',
2768e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2769e55b1c09SBram Moolenaar
2770e55b1c09SBram Moolenaar  CheckScriptFailure([
2771e55b1c09SBram Moolenaar      'vim9script',
2772e55b1c09SBram Moolenaar      'let b:var = 123',
2773e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2774e55b1c09SBram Moolenaar
2775e55b1c09SBram Moolenaar  CheckScriptFailure([
2776e55b1c09SBram Moolenaar      'vim9script',
2777e55b1c09SBram Moolenaar      'let w:var = 123',
2778e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2779e55b1c09SBram Moolenaar
2780e55b1c09SBram Moolenaar  CheckScriptFailure([
2781e55b1c09SBram Moolenaar      'vim9script',
2782e55b1c09SBram Moolenaar      'let t:var = 123',
2783e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2784e55b1c09SBram Moolenaar
2785e55b1c09SBram Moolenaar  CheckScriptFailure([
2786e55b1c09SBram Moolenaar      'vim9script',
2787e55b1c09SBram Moolenaar      'let v:version = 123',
2788e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2789e55b1c09SBram Moolenaar
2790e55b1c09SBram Moolenaar  CheckScriptFailure([
2791e55b1c09SBram Moolenaar      'vim9script',
2792e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2793e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
27946797966dSBram Moolenaar
27956797966dSBram Moolenaar  CheckScriptFailure([
27966797966dSBram Moolenaar      'vim9script',
27976797966dSBram Moolenaar      'g:var = 123',
279832e35117SBram Moolenaar      'unlet g:var# comment1',
2799d72c1bf0SBram Moolenaar      ], 'E108:')
2800d72c1bf0SBram Moolenaar
2801d72c1bf0SBram Moolenaar  CheckScriptFailure([
2802d72c1bf0SBram Moolenaar      'let g:var = 123',
2803d72c1bf0SBram Moolenaar      'unlet g:var # something',
2804d72c1bf0SBram Moolenaar      ], 'E488:')
2805faac4104SBram Moolenaar
2806faac4104SBram Moolenaar  CheckScriptSuccess([
2807faac4104SBram Moolenaar      'vim9script',
280832e35117SBram Moolenaar      'if 1 # comment2',
2809faac4104SBram Moolenaar      '  echo "yes"',
2810faac4104SBram Moolenaar      'elseif 2 #comment',
2811faac4104SBram Moolenaar      '  echo "no"',
2812faac4104SBram Moolenaar      'endif',
2813faac4104SBram Moolenaar      ])
2814faac4104SBram Moolenaar
2815faac4104SBram Moolenaar  CheckScriptFailure([
2816faac4104SBram Moolenaar      'vim9script',
281732e35117SBram Moolenaar      'if 1# comment3',
2818faac4104SBram Moolenaar      '  echo "yes"',
2819faac4104SBram Moolenaar      'endif',
2820faac4104SBram Moolenaar      ], 'E15:')
2821faac4104SBram Moolenaar
2822faac4104SBram Moolenaar  CheckScriptFailure([
2823faac4104SBram Moolenaar      'vim9script',
282432e35117SBram Moolenaar      'if 0 # comment4',
2825faac4104SBram Moolenaar      '  echo "yes"',
2826faac4104SBram Moolenaar      'elseif 2#comment',
2827faac4104SBram Moolenaar      '  echo "no"',
2828faac4104SBram Moolenaar      'endif',
2829faac4104SBram Moolenaar      ], 'E15:')
2830faac4104SBram Moolenaar
2831faac4104SBram Moolenaar  CheckScriptSuccess([
2832faac4104SBram Moolenaar      'vim9script',
283332e35117SBram Moolenaar      'let v = 1 # comment5',
2834faac4104SBram Moolenaar      ])
2835faac4104SBram Moolenaar
2836faac4104SBram Moolenaar  CheckScriptFailure([
2837faac4104SBram Moolenaar      'vim9script',
283832e35117SBram Moolenaar      'let v = 1# comment6',
283932e35117SBram Moolenaar      ], 'E15:')
2840faac4104SBram Moolenaar
2841faac4104SBram Moolenaar  CheckScriptSuccess([
2842faac4104SBram Moolenaar      'vim9script',
2843faac4104SBram Moolenaar      'new'
2844faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2845df069eecSBram Moolenaar      ':$',
2846faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2847faac4104SBram Moolenaar      'bwipe!',
2848faac4104SBram Moolenaar      ])
2849faac4104SBram Moolenaar
2850f5be8cdbSBram Moolenaar  CheckScriptFailure([
2851f5be8cdbSBram Moolenaar      'vim9script',
2852f5be8cdbSBram Moolenaar      'new'
2853f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2854f5be8cdbSBram Moolenaar      ':$',
2855f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2856f5be8cdbSBram Moolenaar      'bwipe!',
2857f5be8cdbSBram Moolenaar      ], 'E488:')
2858f5be8cdbSBram Moolenaar
2859f5be8cdbSBram Moolenaar  CheckScriptFailure([
2860f5be8cdbSBram Moolenaar      'vim9script',
2861f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2862f5be8cdbSBram Moolenaar      ], 'E477:')
2863a26b9700SBram Moolenaarenddef
2864a26b9700SBram Moolenaar
28657e5bd91dSBram Moolenaardef Test_finish()
28667e5bd91dSBram Moolenaar  let lines =<< trim END
28677e5bd91dSBram Moolenaar    vim9script
28686797966dSBram Moolenaar    g:res = 'one'
28697e5bd91dSBram Moolenaar    if v:false | finish | endif
28706797966dSBram Moolenaar    g:res = 'two'
28717e5bd91dSBram Moolenaar    finish
28726797966dSBram Moolenaar    g:res = 'three'
28737e5bd91dSBram Moolenaar  END
28747e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
28757e5bd91dSBram Moolenaar  source Xfinished
28767e5bd91dSBram Moolenaar  assert_equal('two', g:res)
28777e5bd91dSBram Moolenaar
28787e5bd91dSBram Moolenaar  unlet g:res
28797e5bd91dSBram Moolenaar  delete('Xfinished')
28807e5bd91dSBram Moolenaarenddef
28817e5bd91dSBram Moolenaar
288232e35117SBram Moolenaardef Test_let_func_call()
288332e35117SBram Moolenaar  let lines =<< trim END
288432e35117SBram Moolenaar    vim9script
288532e35117SBram Moolenaar    func GetValue()
288632e35117SBram Moolenaar      if exists('g:count')
288732e35117SBram Moolenaar        let g:count += 1
288832e35117SBram Moolenaar      else
288932e35117SBram Moolenaar        let g:count = 1
289032e35117SBram Moolenaar      endif
289132e35117SBram Moolenaar      return 'this'
289232e35117SBram Moolenaar    endfunc
289332e35117SBram Moolenaar    let val: string = GetValue()
2894f5be8cdbSBram Moolenaar    # env var is always a string
2895df671b46SBram Moolenaar    let env = $TERM
289632e35117SBram Moolenaar  END
289732e35117SBram Moolenaar  writefile(lines, 'Xfinished')
289832e35117SBram Moolenaar  source Xfinished
2899f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
290032e35117SBram Moolenaar  assert_equal(1, g:count)
290132e35117SBram Moolenaar
290232e35117SBram Moolenaar  unlet g:count
290332e35117SBram Moolenaar  delete('Xfinished')
290432e35117SBram Moolenaarenddef
290532e35117SBram Moolenaar
290632e35117SBram Moolenaardef Test_let_missing_type()
290732e35117SBram Moolenaar  let lines =<< trim END
290832e35117SBram Moolenaar    vim9script
2909df671b46SBram Moolenaar    let var = g:unknown
2910227a69deSBram Moolenaar  END
2911822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2912227a69deSBram Moolenaar
2913227a69deSBram Moolenaar  lines =<< trim END
2914227a69deSBram Moolenaar    vim9script
2915227a69deSBram Moolenaar    let nr: number = 123
2916227a69deSBram Moolenaar    let var = nr
2917227a69deSBram Moolenaar  END
2918822ba247SBram Moolenaar  CheckScriptSuccess(lines)
291932e35117SBram Moolenaarenddef
292032e35117SBram Moolenaar
2921c82a5b5dSBram Moolenaardef Test_let_declaration()
2922c82a5b5dSBram Moolenaar  let lines =<< trim END
2923c82a5b5dSBram Moolenaar    vim9script
2924c82a5b5dSBram Moolenaar    let var: string
2925c82a5b5dSBram Moolenaar    g:var_uninit = var
2926c82a5b5dSBram Moolenaar    var = 'text'
2927c82a5b5dSBram Moolenaar    g:var_test = var
2928f5be8cdbSBram Moolenaar    # prefixing s: is optional
2929984dddbeSBram Moolenaar    s:var = 'prefixed'
2930984dddbeSBram Moolenaar    g:var_prefixed = s:var
2931984dddbeSBram Moolenaar
2932984dddbeSBram Moolenaar    let s:other: number
2933984dddbeSBram Moolenaar    other = 1234
2934984dddbeSBram Moolenaar    g:other_var = other
293553b29e48SBram Moolenaar
293653b29e48SBram Moolenaar    # type is inferred
293753b29e48SBram Moolenaar    s:dict = {'a': 222}
293853b29e48SBram Moolenaar    def GetDictVal(key: any)
293953b29e48SBram Moolenaar      g:dict_val = s:dict[key]
294053b29e48SBram Moolenaar    enddef
294153b29e48SBram Moolenaar    GetDictVal('a')
2942c82a5b5dSBram Moolenaar  END
2943c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2944c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2945c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2946984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2947984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
294853b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
2949c82a5b5dSBram Moolenaar
2950c82a5b5dSBram Moolenaar  unlet g:var_uninit
2951c82a5b5dSBram Moolenaar  unlet g:var_test
2952984dddbeSBram Moolenaar  unlet g:var_prefixed
2953984dddbeSBram Moolenaar  unlet g:other_var
2954c82a5b5dSBram Moolenaarenddef
2955c82a5b5dSBram Moolenaar
2956c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2957c5b1c20bSBram Moolenaar  let lines =<< trim END
2958c5b1c20bSBram Moolenaar    vim9script
2959c5b1c20bSBram Moolenaar    const var: string
2960c5b1c20bSBram Moolenaar  END
2961c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2962c5b1c20bSBram Moolenaar
2963c5b1c20bSBram Moolenaar  lines =<< trim END
2964c5b1c20bSBram Moolenaar    vim9script
2965c5b1c20bSBram Moolenaar    let 9var: string
2966c5b1c20bSBram Moolenaar  END
2967c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2968c5b1c20bSBram Moolenaarenddef
2969c5b1c20bSBram Moolenaar
297034db91f7SBram Moolenaardef Test_let_type_check()
297134db91f7SBram Moolenaar  let lines =<< trim END
297234db91f7SBram Moolenaar    vim9script
297334db91f7SBram Moolenaar    let var: string
297434db91f7SBram Moolenaar    var = 1234
297534db91f7SBram Moolenaar  END
2976451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
2977984dddbeSBram Moolenaar
2978984dddbeSBram Moolenaar  lines =<< trim END
2979984dddbeSBram Moolenaar    vim9script
2980984dddbeSBram Moolenaar    let var:string
2981984dddbeSBram Moolenaar  END
2982984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2983c5b1c20bSBram Moolenaar
2984c5b1c20bSBram Moolenaar  lines =<< trim END
2985c5b1c20bSBram Moolenaar    vim9script
2986c5b1c20bSBram Moolenaar    let var: asdf
2987c5b1c20bSBram Moolenaar  END
2988c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2989a71e2633SBram Moolenaar
2990a71e2633SBram Moolenaar  lines =<< trim END
2991a71e2633SBram Moolenaar    vim9script
2992a71e2633SBram Moolenaar    let s:l: list<number>
2993a71e2633SBram Moolenaar    s:l = []
2994a71e2633SBram Moolenaar  END
2995a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2996a71e2633SBram Moolenaar
2997a71e2633SBram Moolenaar  lines =<< trim END
2998a71e2633SBram Moolenaar    vim9script
2999a71e2633SBram Moolenaar    let s:d: dict<number>
3000a71e2633SBram Moolenaar    s:d = {}
3001a71e2633SBram Moolenaar  END
3002a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
300334db91f7SBram Moolenaarenddef
300434db91f7SBram Moolenaar
3005a5d0077eSBram Moolenaardef Test_forward_declaration()
3006a5d0077eSBram Moolenaar  let lines =<< trim END
3007a5d0077eSBram Moolenaar    vim9script
3008a5d0077eSBram Moolenaar    def GetValue(): string
3009a5d0077eSBram Moolenaar      return theVal
3010a5d0077eSBram Moolenaar    enddef
3011a5d0077eSBram Moolenaar    let theVal = 'something'
3012822ba247SBram Moolenaar    g:initVal = GetValue()
3013a5d0077eSBram Moolenaar    theVal = 'else'
3014a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3015a5d0077eSBram Moolenaar  END
3016a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3017a5d0077eSBram Moolenaar  source Xforward
3018a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3019a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3020a5d0077eSBram Moolenaar
3021a5d0077eSBram Moolenaar  unlet g:initVal
3022a5d0077eSBram Moolenaar  unlet g:laterVal
3023a5d0077eSBram Moolenaar  delete('Xforward')
3024a5d0077eSBram Moolenaarenddef
3025a5d0077eSBram Moolenaar
30269721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
30279721fb4eSBram Moolenaar  let legacy_lines =<< trim END
30289721fb4eSBram Moolenaar    source Xvim9_script.vim
30299721fb4eSBram Moolenaar
30309721fb4eSBram Moolenaar    call assert_false(exists('local'))
30319721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30329721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30339721fb4eSBram Moolenaar    call assert_equal('global', global)
30349721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30359721fb4eSBram Moolenaar
30369721fb4eSBram Moolenaar    " imported variable becomes script-local
30379721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30389721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30399721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30409721fb4eSBram Moolenaar
30419721fb4eSBram Moolenaar    " imported function becomes script-local
30429721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30439721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30449721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30459721fb4eSBram Moolenaar  END
30469721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30479721fb4eSBram Moolenaar
30489721fb4eSBram Moolenaar  let vim9_lines =<< trim END
30499721fb4eSBram Moolenaar    vim9script
30509721fb4eSBram Moolenaar    let local = 'local'
30519721fb4eSBram Moolenaar    g:global = 'global'
30529721fb4eSBram Moolenaar    export let exported = 'exported'
30539721fb4eSBram Moolenaar    export def GetText(): string
30549721fb4eSBram Moolenaar       return 'text'
30559721fb4eSBram Moolenaar    enddef
30569721fb4eSBram Moolenaar  END
30579721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
30589721fb4eSBram Moolenaar
30599721fb4eSBram Moolenaar  source Xlegacy_script.vim
30609721fb4eSBram Moolenaar
30619721fb4eSBram Moolenaar  assert_equal('global', g:global)
3062f5be8cdbSBram Moolenaar  unlet g:global
30639721fb4eSBram Moolenaar
30649721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30659721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30669721fb4eSBram Moolenaarenddef
3067a5d0077eSBram Moolenaar
30687d699701SBram Moolenaarfunc Test_vim9script_not_global()
30697d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30707d699701SBram Moolenaar  let vim9lines =<< trim END
30717d699701SBram Moolenaar    vim9script
30727d699701SBram Moolenaar    let var = 'local'
30737d699701SBram Moolenaar    func TheFunc()
30747d699701SBram Moolenaar      echo 'local'
30757d699701SBram Moolenaar    endfunc
30767d699701SBram Moolenaar    def DefFunc()
30777d699701SBram Moolenaar      echo 'local'
30787d699701SBram Moolenaar    enddef
30797d699701SBram Moolenaar  END
30807d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30817d699701SBram Moolenaar  source Xvim9script.vim
30827d699701SBram Moolenaar  try
30837d699701SBram Moolenaar    echo g:var
30847d699701SBram Moolenaar    assert_report('did not fail')
30857d699701SBram Moolenaar  catch /E121:/
30867d699701SBram Moolenaar    " caught
30877d699701SBram Moolenaar  endtry
30887d699701SBram Moolenaar  try
30897d699701SBram Moolenaar    call TheFunc()
30907d699701SBram Moolenaar    assert_report('did not fail')
30917d699701SBram Moolenaar  catch /E117:/
30927d699701SBram Moolenaar    " caught
30937d699701SBram Moolenaar  endtry
30947d699701SBram Moolenaar  try
30957d699701SBram Moolenaar    call DefFunc()
30967d699701SBram Moolenaar    assert_report('did not fail')
30977d699701SBram Moolenaar  catch /E117:/
30987d699701SBram Moolenaar    " caught
30997d699701SBram Moolenaar  endtry
31007d699701SBram Moolenaar
31017d699701SBram Moolenaar  call delete('Xvim9script.vium')
31027d699701SBram Moolenaarendfunc
31037d699701SBram Moolenaar
3104eeb27bfeSBram Moolenaardef Test_vim9_copen()
3105eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3106eeb27bfeSBram Moolenaar  copen
3107eeb27bfeSBram Moolenaar  quit
3108eeb27bfeSBram Moolenaarenddef
3109eeb27bfeSBram Moolenaar
31102d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31112d6b20d6SBram Moolenaardef Test_vim9_autoload()
31122d6b20d6SBram Moolenaar  let lines =<< trim END
31132d6b20d6SBram Moolenaar     vim9script
31142d6b20d6SBram Moolenaar     def foo#test()
31152d6b20d6SBram Moolenaar         echomsg getreg('"')
31162d6b20d6SBram Moolenaar     enddef
31172d6b20d6SBram Moolenaar  END
31182d6b20d6SBram Moolenaar
31192d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31202d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
31212d6b20d6SBram Moolenaar  let save_rtp = &rtp
31222d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31232d6b20d6SBram Moolenaar  augroup test
31242d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31252d6b20d6SBram Moolenaar  augroup END
31262d6b20d6SBram Moolenaar
31272d6b20d6SBram Moolenaar  normal Y
31282d6b20d6SBram Moolenaar
31292d6b20d6SBram Moolenaar  augroup test
31302d6b20d6SBram Moolenaar    autocmd!
31312d6b20d6SBram Moolenaar  augroup END
31322d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31332d6b20d6SBram Moolenaar  &rtp = save_rtp
31342d6b20d6SBram Moolenaarenddef
31352d6b20d6SBram Moolenaar
31363896a105SBram Moolenaardef Test_cmdline_win()
31373896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31383896a105SBram Moolenaar  # the command line window.
31393896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
31403896a105SBram Moolenaar  let export_lines =<< trim END
31413896a105SBram Moolenaar    vim9script
31423896a105SBram Moolenaar    export let That = 'yes'
31433896a105SBram Moolenaar  END
31443896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
31453896a105SBram Moolenaar  let import_lines =<< trim END
31463896a105SBram Moolenaar    vim9script
31473896a105SBram Moolenaar    import That from './Xexport.vim'
31483896a105SBram Moolenaar  END
31493896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
31503896a105SBram Moolenaar  let save_rtp = &rtp
31513896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
31523896a105SBram Moolenaar  syntax on
31533896a105SBram Moolenaar  augroup CmdWin
31543896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
31553896a105SBram Moolenaar  augroup END
31563896a105SBram Moolenaar  # this will open and also close the cmdline window
31573896a105SBram Moolenaar  feedkeys('q:', 'xt')
31583896a105SBram Moolenaar  assert_equal('yes', g:got_there)
31593896a105SBram Moolenaar
31603896a105SBram Moolenaar  augroup CmdWin
31613896a105SBram Moolenaar    au!
31623896a105SBram Moolenaar  augroup END
31633896a105SBram Moolenaar  &rtp = save_rtp
31643896a105SBram Moolenaar  delete('rtp', 'rf')
31653896a105SBram Moolenaarenddef
31663896a105SBram Moolenaar
3167585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3168585fea7bSBram Moolenaardef Test_substitute_cmd()
3169585fea7bSBram Moolenaar  new
3170585fea7bSBram Moolenaar  setline(1, 'something')
3171585fea7bSBram Moolenaar  :substitute(some(other(
3172585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3173585fea7bSBram Moolenaar  bwipe!
3174585fea7bSBram Moolenaar
3175f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3176585fea7bSBram Moolenaar  let lines =<< trim END
3177585fea7bSBram Moolenaar    vim9script
3178585fea7bSBram Moolenaar    new
3179585fea7bSBram Moolenaar    setline(1, 'something')
3180585fea7bSBram Moolenaar    :substitute(some(other(
3181585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3182585fea7bSBram Moolenaar    bwipe!
3183585fea7bSBram Moolenaar  END
3184585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3185585fea7bSBram Moolenaar  source Xvim9lines
3186585fea7bSBram Moolenaar
3187585fea7bSBram Moolenaar  delete('Xvim9lines')
3188585fea7bSBram Moolenaarenddef
3189585fea7bSBram Moolenaar
31908a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3191