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
99b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
100b5ed2660SBram Moolenaar
101a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
102a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
103451c2e35SBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1012:')
104a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
105451c2e35SBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1012:')
106a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
107451c2e35SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1012:')
108a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
109cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
110585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11180c34ca3SBram Moolenaar  &ts = 8
112a8c17704SBram Moolenaar
11333afa244SBram Moolenaar  call CheckDefFailure(['let s:var = 123'], 'E1101:')
11433afa244SBram Moolenaar  call CheckDefFailure(['let s:var: number'], 'E1101:')
11533afa244SBram Moolenaar
116f9b2b496SBram Moolenaar  lines =<< trim END
117f9b2b496SBram Moolenaar    vim9script
118f9b2b496SBram Moolenaar    def SomeFunc()
119f9b2b496SBram Moolenaar      s:var = 123
120f9b2b496SBram Moolenaar    enddef
121f9b2b496SBram Moolenaar    defcompile
122f9b2b496SBram Moolenaar  END
123f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
124f9b2b496SBram Moolenaar
125a8c17704SBram Moolenaar  g:inc_counter += 1
126a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
127a8c17704SBram Moolenaar
128a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
129a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
130dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
131451c2e35SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
132a8c17704SBram Moolenaar
133a8c17704SBram Moolenaar  @a = 'areg'
134a8c17704SBram Moolenaar  @a ..= 'add'
135a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
136dd29f1b0SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
137451c2e35SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1012:')
138e69f6d04SBram Moolenaar
139b5ed2660SBram Moolenaar  lines =<< trim END
140b5ed2660SBram Moolenaar    vim9script
141b5ed2660SBram Moolenaar    @c = 'areg'
142b5ed2660SBram Moolenaar    @c ..= 'add'
143b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
144b5ed2660SBram Moolenaar  END
145b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
146b5ed2660SBram Moolenaar
147e69f6d04SBram Moolenaar  v:errmsg = 'none'
148e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
149e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
150dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
151451c2e35SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1012:')
15233afa244SBram Moolenaar
15333afa244SBram Moolenaar  # single letter variables
15433afa244SBram Moolenaar  a = 123
15533afa244SBram Moolenaar  assert_equal(123, a)
15633afa244SBram Moolenaar  let b: number
15733afa244SBram Moolenaar  b = 123
15833afa244SBram Moolenaar  assert_equal(123, b)
15933afa244SBram Moolenaar  let g: number
16033afa244SBram Moolenaar  g = 123
16133afa244SBram Moolenaar  assert_equal(123, g)
16233afa244SBram Moolenaar  let s: number
16333afa244SBram Moolenaar  s = 123
16433afa244SBram Moolenaar  assert_equal(123, s)
16533afa244SBram Moolenaar  let t: number
16633afa244SBram Moolenaar  t = 123
16733afa244SBram Moolenaar  assert_equal(123, t)
16833afa244SBram Moolenaar  let v: number
16933afa244SBram Moolenaar  v = 123
17033afa244SBram Moolenaar  assert_equal(123, v)
17133afa244SBram Moolenaar  let w: number
17233afa244SBram Moolenaar  w = 123
17333afa244SBram Moolenaar  assert_equal(123, w)
1745deeb3f1SBram Moolenaarenddef
1755deeb3f1SBram Moolenaar
1763b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1773b74b6b4SBram Moolenaar  let lines =<< trim END
1783b74b6b4SBram Moolenaar      vim9script
1793b74b6b4SBram Moolenaar
180f5be8cdbSBram Moolenaar      # single character variable declarations work
1813b74b6b4SBram Moolenaar      let a: string
1823b74b6b4SBram Moolenaar      let b: number
1833b74b6b4SBram Moolenaar      let l: list<any>
1843b74b6b4SBram Moolenaar      let s: string
1853b74b6b4SBram Moolenaar      let t: number
1863b74b6b4SBram Moolenaar      let v: number
1873b74b6b4SBram Moolenaar      let w: number
1883b74b6b4SBram Moolenaar
189f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1903b74b6b4SBram Moolenaar      a = 'script-a'
1913b74b6b4SBram Moolenaar      b = 111
1923b74b6b4SBram Moolenaar      l = [1, 2, 3]
1933b74b6b4SBram Moolenaar      s = 'script-s'
1943b74b6b4SBram Moolenaar      t = 222
1953b74b6b4SBram Moolenaar      v = 333
1963b74b6b4SBram Moolenaar      w = 444
1973b74b6b4SBram Moolenaar
1983b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1993b74b6b4SBram Moolenaar      assert_equal(111, b)
2003b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2013b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2023b74b6b4SBram Moolenaar      assert_equal(222, t)
2033b74b6b4SBram Moolenaar      assert_equal(333, v)
2043b74b6b4SBram Moolenaar      assert_equal(444, w)
2053b74b6b4SBram Moolenaar  END
2063b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2073b74b6b4SBram Moolenaar  source Xsinglechar
2083b74b6b4SBram Moolenaar  delete('Xsinglechar')
2093b74b6b4SBram Moolenaarenddef
2103b74b6b4SBram Moolenaar
21184370087SBram Moolenaardef Test_assignment_list()
21284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
21384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
21484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
21584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
21684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
21784370087SBram Moolenaar
21884370087SBram Moolenaar  let listS: list<string> = []
21984370087SBram Moolenaar  let listN: list<number> = []
22084370087SBram Moolenaar
22184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
22284370087SBram Moolenaar  list2[-1] = 99
22384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
22484370087SBram Moolenaar  list2[-2] = 88
22584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
22684370087SBram Moolenaar  list2[-3] = 77
22784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
228dd29f1b0SBram Moolenaar  list2 += [100]
229dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
230dd29f1b0SBram Moolenaar
231dd29f1b0SBram Moolenaar  list3 += ['end']
232dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
233dd29f1b0SBram Moolenaar
234dd29f1b0SBram Moolenaar
23584370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
236c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
23784370087SBram Moolenaar
23884370087SBram Moolenaar  # type becomes list<any>
23984370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
24084370087SBram Moolenaarenddef
24184370087SBram Moolenaar
242b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
243b31be3f9SBram Moolenaar  let lines =<< trim END
244b31be3f9SBram Moolenaar    vim9script
245b31be3f9SBram Moolenaar    let v1: number
246b31be3f9SBram Moolenaar    let v2: number
247b31be3f9SBram Moolenaar    let v3: number
248b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
249b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
250b31be3f9SBram Moolenaar  END
251b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
252b31be3f9SBram Moolenaarenddef
253b31be3f9SBram Moolenaar
25484370087SBram Moolenaardef Test_assignment_dict()
25584370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
25684370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
25784370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
25884370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
25974fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
26084370087SBram Moolenaar
261f5be8cdbSBram Moolenaar  # overwrite
262c785b9a7SBram Moolenaar  dict3['key'] = 'another'
263c785b9a7SBram Moolenaar
26458626872SBram Moolenaar  # empty key can be used
26558626872SBram Moolenaar  let dd = {}
26658626872SBram Moolenaar  dd[""] = 6
26758626872SBram Moolenaar  assert_equal({'': 6}, dd)
26884370087SBram Moolenaar
26984370087SBram Moolenaar  # type becomes dict<any>
27084370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
2718e4c8c85SBram Moolenaar
2728e4c8c85SBram Moolenaar  # assignment to script-local dict
2738e4c8c85SBram Moolenaar  let lines =<< trim END
2748e4c8c85SBram Moolenaar    vim9script
2758e4c8c85SBram Moolenaar    let test: dict<any> = {}
2768e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2778e4c8c85SBram Moolenaar      test['a'] = 43
2788e4c8c85SBram Moolenaar      return test
2798e4c8c85SBram Moolenaar    enddef
2808e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2818e4c8c85SBram Moolenaar  END
2828e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
2838e4c8c85SBram Moolenaar
2848e4c8c85SBram Moolenaar  lines =<< trim END
2858e4c8c85SBram Moolenaar    vim9script
2868e4c8c85SBram Moolenaar    let test: dict<any>
2878e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2888e4c8c85SBram Moolenaar      test['a'] = 43
2898e4c8c85SBram Moolenaar      return test
2908e4c8c85SBram Moolenaar    enddef
2918e4c8c85SBram Moolenaar    FillDict()
2928e4c8c85SBram Moolenaar  END
2938e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
2942caa1594SBram Moolenaar
2952caa1594SBram Moolenaar  # assignment to global dict
2962caa1594SBram Moolenaar  lines =<< trim END
2972caa1594SBram Moolenaar    vim9script
2982caa1594SBram Moolenaar    g:test = {}
2992caa1594SBram Moolenaar    def FillDict(): dict<any>
3002caa1594SBram Moolenaar      g:test['a'] = 43
3012caa1594SBram Moolenaar      return g:test
3022caa1594SBram Moolenaar    enddef
3032caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3042caa1594SBram Moolenaar  END
3052caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3062caa1594SBram Moolenaar
3072caa1594SBram Moolenaar  # assignment to buffer dict
3082caa1594SBram Moolenaar  lines =<< trim END
3092caa1594SBram Moolenaar    vim9script
3102caa1594SBram Moolenaar    b:test = {}
3112caa1594SBram Moolenaar    def FillDict(): dict<any>
3122caa1594SBram Moolenaar      b:test['a'] = 43
3132caa1594SBram Moolenaar      return b:test
3142caa1594SBram Moolenaar    enddef
3152caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3162caa1594SBram Moolenaar  END
3172caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
31884370087SBram Moolenaarenddef
31984370087SBram Moolenaar
320d3aac291SBram Moolenaardef Test_assignment_local()
321f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
322f5be8cdbSBram Moolenaar  # changed.
323d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
324d3aac291SBram Moolenaar    let b:existing = 'yes'
325d3aac291SBram Moolenaar    let w:existing = 'yes'
326d3aac291SBram Moolenaar    let t:existing = 'yes'
327d3aac291SBram Moolenaar
328d3aac291SBram Moolenaar    def Test_assignment_local_internal()
329d3aac291SBram Moolenaar      b:newvar = 'new'
330d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
331d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
332d3aac291SBram Moolenaar      b:existing = 'no'
333d3aac291SBram Moolenaar      assert_equal('no', b:existing)
334396f3138SBram Moolenaar      b:existing ..= 'NO'
335396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
336d3aac291SBram Moolenaar
337d3aac291SBram Moolenaar      w:newvar = 'new'
338d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
339d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
340d3aac291SBram Moolenaar      w:existing = 'no'
341d3aac291SBram Moolenaar      assert_equal('no', w:existing)
342396f3138SBram Moolenaar      w:existing ..= 'NO'
343396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
344d3aac291SBram Moolenaar
345d3aac291SBram Moolenaar      t:newvar = 'new'
346d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
347d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
348d3aac291SBram Moolenaar      t:existing = 'no'
349d3aac291SBram Moolenaar      assert_equal('no', t:existing)
350396f3138SBram Moolenaar      t:existing ..= 'NO'
351396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
352d3aac291SBram Moolenaar    enddef
353d3aac291SBram Moolenaar    call Test_assignment_local_internal()
354d3aac291SBram Moolenaar  END
355d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
356d3aac291SBram Moolenaarenddef
357d3aac291SBram Moolenaar
3585deeb3f1SBram Moolenaardef Test_assignment_default()
359e69f6d04SBram Moolenaar
360cb711abfSBram Moolenaar  # Test default values.
361e69f6d04SBram Moolenaar  let thebool: bool
362e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
363e69f6d04SBram Moolenaar
364e69f6d04SBram Moolenaar  let thenumber: number
365e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
366e69f6d04SBram Moolenaar
367e69f6d04SBram Moolenaar  if has('float')
368e69f6d04SBram Moolenaar    let thefloat: float
369e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
370e69f6d04SBram Moolenaar  endif
371e69f6d04SBram Moolenaar
372e69f6d04SBram Moolenaar  let thestring: string
373e69f6d04SBram Moolenaar  assert_equal('', thestring)
374e69f6d04SBram Moolenaar
375e69f6d04SBram Moolenaar  let theblob: blob
376e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
377e69f6d04SBram Moolenaar
3785deeb3f1SBram Moolenaar  let Thefunc: func
3795deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
380e69f6d04SBram Moolenaar
381e69f6d04SBram Moolenaar  let thelist: list<any>
382e69f6d04SBram Moolenaar  assert_equal([], thelist)
383e69f6d04SBram Moolenaar
384e69f6d04SBram Moolenaar  let thedict: dict<any>
385e69f6d04SBram Moolenaar  assert_equal({}, thedict)
386e69f6d04SBram Moolenaar
3872c869deeSBram Moolenaar  if has('channel')
388e69f6d04SBram Moolenaar    let thejob: job
389e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
390e69f6d04SBram Moolenaar
391e69f6d04SBram Moolenaar    let thechannel: channel
392e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
393c785b9a7SBram Moolenaar
394c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
395f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
396c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
397c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
398c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
399c785b9a7SBram Moolenaar    endif
4002c869deeSBram Moolenaar  endif
401585fea7bSBram Moolenaar
402585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
403585fea7bSBram Moolenaar  assert_equal(5678, nr)
4048a7d6542SBram Moolenaarenddef
4058a7d6542SBram Moolenaar
40647a519a9SBram Moolenaardef Test_assignment_var_list()
40747a519a9SBram Moolenaar  let v1: string
40847a519a9SBram Moolenaar  let v2: string
4099af78769SBram Moolenaar  let vrem: list<string>
4109af78769SBram Moolenaar  [v1] = ['aaa']
4119af78769SBram Moolenaar  assert_equal('aaa', v1)
4129af78769SBram Moolenaar
41347a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
41447a519a9SBram Moolenaar  assert_equal('one', v1)
41547a519a9SBram Moolenaar  assert_equal('two', v2)
4169af78769SBram Moolenaar
4179af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4189af78769SBram Moolenaar  assert_equal('one', v1)
4199af78769SBram Moolenaar  assert_equal('two', v2)
4209af78769SBram Moolenaar  assert_equal([], vrem)
4219af78769SBram Moolenaar
4229af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4239af78769SBram Moolenaar  assert_equal('one', v1)
4249af78769SBram Moolenaar  assert_equal('two', v2)
4259af78769SBram Moolenaar  assert_equal(['three'], vrem)
4261c199f9cSBram Moolenaar
4271c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4281c199f9cSBram Moolenaar  assert_equal(3, &ts)
4291c199f9cSBram Moolenaar  assert_equal(4, &sw)
4301c199f9cSBram Moolenaar  set ts=8 sw=4
43147a519a9SBram Moolenaarenddef
43247a519a9SBram Moolenaar
433c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
434c7e44a7eSBram Moolenaar  let lines =<< trim END
435c7e44a7eSBram Moolenaar    vim9script
436c7e44a7eSBram Moolenaar    def Func(): list<number>
437c7e44a7eSBram Moolenaar      return [1, 2]
438c7e44a7eSBram Moolenaar    enddef
439c7e44a7eSBram Moolenaar    let var1: number
440c7e44a7eSBram Moolenaar    let var2: number
441c7e44a7eSBram Moolenaar    [var1, var2] =
442c7e44a7eSBram Moolenaar          Func()
443c7e44a7eSBram Moolenaar    assert_equal(1, var1)
444c7e44a7eSBram Moolenaar    assert_equal(2, var2)
445c7e44a7eSBram Moolenaar    let ll =
446c7e44a7eSBram Moolenaar          Func()
447c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
44883144546SBram Moolenaar
44983144546SBram Moolenaar    @/ = 'text'
45083144546SBram Moolenaar    assert_equal('text', @/)
45183144546SBram Moolenaar    @0 = 'zero'
45283144546SBram Moolenaar    assert_equal('zero', @0)
45383144546SBram Moolenaar    @1 = 'one'
45483144546SBram Moolenaar    assert_equal('one', @1)
45583144546SBram Moolenaar    @9 = 'nine'
45683144546SBram Moolenaar    assert_equal('nine', @9)
45783144546SBram Moolenaar    @- = 'minus'
45883144546SBram Moolenaar    assert_equal('minus', @-)
45983144546SBram Moolenaar    if has('clipboard_working')
46083144546SBram Moolenaar      @* = 'star'
46183144546SBram Moolenaar      assert_equal('star', @*)
46283144546SBram Moolenaar      @+ = 'plus'
46383144546SBram Moolenaar      assert_equal('plus', @+)
46483144546SBram Moolenaar    endif
46595dd9f25SBram Moolenaar
46695dd9f25SBram Moolenaar    let a: number = 123
46795dd9f25SBram Moolenaar    assert_equal(123, a)
46895dd9f25SBram Moolenaar    let s: string = 'yes'
46995dd9f25SBram Moolenaar    assert_equal('yes', s)
47095dd9f25SBram Moolenaar    let b: number = 42
47195dd9f25SBram Moolenaar    assert_equal(42, b)
47295dd9f25SBram Moolenaar    let w: number = 43
47395dd9f25SBram Moolenaar    assert_equal(43, w)
47495dd9f25SBram Moolenaar    let t: number = 44
47595dd9f25SBram Moolenaar    assert_equal(44, t)
476c7e44a7eSBram Moolenaar  END
477c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
478c7e44a7eSBram Moolenaarenddef
479c7e44a7eSBram Moolenaar
480cab27678SBram Moolenaardef Mess(): string
481cab27678SBram Moolenaar  v:foldstart = 123
482cab27678SBram Moolenaar  return 'xxx'
483cab27678SBram Moolenaarenddef
484cab27678SBram Moolenaar
485d72c1bf0SBram Moolenaardef Test_assignment_failure()
4868a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
4878a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
4888a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
4898a7d6542SBram Moolenaar
49063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
49163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
49263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
49363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
49463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
49563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
49663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
49763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
49863be3d4bSBram Moolenaar
4998a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5008a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5018a7d6542SBram Moolenaar
5029b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5039af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5049af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5059af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5069af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5079af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5089af78769SBram Moolenaar                            'let y: number',
5099af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5109af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5119af78769SBram Moolenaar                            'let y: number',
5129af78769SBram Moolenaar                            'let z: list<number>',
5139af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5149be61bbbSBram Moolenaar
515e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
516c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5179be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
518c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5199be61bbbSBram Moolenaar
520e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
521c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5229be61bbbSBram Moolenaar
523434d72cbSBram Moolenaar  if has('dnd')
52465821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
525434d72cbSBram Moolenaar  else
526434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
527434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
528434d72cbSBram Moolenaar  endif
5299be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
53065821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
531c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5329be61bbbSBram Moolenaar
533e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
534e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
535e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
536e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5379be61bbbSBram Moolenaar
5389be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5399be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5409be61bbbSBram Moolenaar
541451c2e35SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
54233fa29cfSBram Moolenaar
5438a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5448a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5458a7d6542SBram Moolenaar
5468a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5478a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5488a7d6542SBram Moolenaar
5498a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5508a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
55142a480bfSBram Moolenaar
552d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
55342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
554cab27678SBram Moolenaar
555cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
556cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
55743e969d3SBram Moolenaar
55843e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
55943e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
56043e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
56143e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
56243e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
56343e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
56443e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
56543e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
566d72c1bf0SBram Moolenaarenddef
567d72c1bf0SBram Moolenaar
568d72c1bf0SBram Moolenaardef Test_unlet()
569d72c1bf0SBram Moolenaar  g:somevar = 'yes'
570d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
571d72c1bf0SBram Moolenaar  unlet g:somevar
572d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
573d72c1bf0SBram Moolenaar  unlet! g:somevar
574d72c1bf0SBram Moolenaar
575d72c1bf0SBram Moolenaar  call CheckScriptFailure([
576d72c1bf0SBram Moolenaar        'vim9script',
577d72c1bf0SBram Moolenaar        'let svar = 123',
578d72c1bf0SBram Moolenaar        'unlet svar',
579d72c1bf0SBram Moolenaar        ], 'E1081:')
580d72c1bf0SBram Moolenaar  call CheckScriptFailure([
581d72c1bf0SBram Moolenaar        'vim9script',
582d72c1bf0SBram Moolenaar        'let svar = 123',
583d72c1bf0SBram Moolenaar        'unlet s:svar',
584d72c1bf0SBram Moolenaar        ], 'E1081:')
585d72c1bf0SBram Moolenaar  call CheckScriptFailure([
586d72c1bf0SBram Moolenaar        'vim9script',
587d72c1bf0SBram Moolenaar        'let svar = 123',
588d72c1bf0SBram Moolenaar        'def Func()',
589d72c1bf0SBram Moolenaar        '  unlet svar',
590d72c1bf0SBram Moolenaar        'enddef',
591822ba247SBram Moolenaar        'defcompile',
592d72c1bf0SBram Moolenaar        ], 'E1081:')
593d72c1bf0SBram Moolenaar  call CheckScriptFailure([
594d72c1bf0SBram Moolenaar        'vim9script',
595d72c1bf0SBram Moolenaar        'let svar = 123',
596d72c1bf0SBram Moolenaar        'def Func()',
597d72c1bf0SBram Moolenaar        '  unlet s:svar',
598d72c1bf0SBram Moolenaar        'enddef',
599822ba247SBram Moolenaar        'defcompile',
600d72c1bf0SBram Moolenaar        ], 'E1081:')
6017bdaea6eSBram Moolenaar
6027bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6037bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6047bdaea6eSBram Moolenaar  unlet $ENVVAR
6057bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
606d72c1bf0SBram Moolenaarenddef
607599c89c8SBram Moolenaar
6084c17ad94SBram Moolenaardef Test_delfunction()
609f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6104c17ad94SBram Moolenaar  CheckScriptSuccess([
6114c17ad94SBram Moolenaar      'vim9script',
6124c17ad94SBram Moolenaar      'func CheckMe()',
6134c17ad94SBram Moolenaar      '  return 123',
6144c17ad94SBram Moolenaar      'endfunc',
6154c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6164c17ad94SBram Moolenaar      ])
6174c17ad94SBram Moolenaar
618f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6194c17ad94SBram Moolenaar  CheckScriptFailure([
6204c17ad94SBram Moolenaar      'vim9script',
6214c17ad94SBram Moolenaar      'func DeleteMe1()',
6224c17ad94SBram Moolenaar      'endfunc',
6234c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6244c17ad94SBram Moolenaar      ], 'E1084:')
6254c17ad94SBram Moolenaar  CheckScriptFailure([
6264c17ad94SBram Moolenaar      'vim9script',
6274c17ad94SBram Moolenaar      'func DeleteMe2()',
6284c17ad94SBram Moolenaar      'endfunc',
6294c17ad94SBram Moolenaar      'def DoThat()',
6304c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6314c17ad94SBram Moolenaar      'enddef',
6324c17ad94SBram Moolenaar      'DoThat()',
6334c17ad94SBram Moolenaar      ], 'E1084:')
6344c17ad94SBram Moolenaar  CheckScriptFailure([
6354c17ad94SBram Moolenaar      'vim9script',
6364c17ad94SBram Moolenaar      'def DeleteMe3()',
6374c17ad94SBram Moolenaar      'enddef',
6384c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6394c17ad94SBram Moolenaar      ], 'E1084:')
6404c17ad94SBram Moolenaar  CheckScriptFailure([
6414c17ad94SBram Moolenaar      'vim9script',
6424c17ad94SBram Moolenaar      'def DeleteMe4()',
6434c17ad94SBram Moolenaar      'enddef',
6444c17ad94SBram Moolenaar      'def DoThat()',
6454c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6464c17ad94SBram Moolenaar      'enddef',
6474c17ad94SBram Moolenaar      'DoThat()',
6484c17ad94SBram Moolenaar      ], 'E1084:')
649925e9fd6SBram Moolenaar
650925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
651925e9fd6SBram Moolenaar  let lines =<< trim END
652925e9fd6SBram Moolenaar      vim9script
653925e9fd6SBram Moolenaar      def g:Global(): string
654925e9fd6SBram Moolenaar        return "yes"
655925e9fd6SBram Moolenaar      enddef
656925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
657925e9fd6SBram Moolenaar      def! g:Global(): string
658925e9fd6SBram Moolenaar        return "no"
659925e9fd6SBram Moolenaar      enddef
660925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
661925e9fd6SBram Moolenaar      delfunc g:Global
662925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
663925e9fd6SBram Moolenaar  END
664925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
665925e9fd6SBram Moolenaar
666925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
667925e9fd6SBram Moolenaar  lines =<< trim END
668925e9fd6SBram Moolenaar      vim9script
669925e9fd6SBram Moolenaar      func g:Global()
670925e9fd6SBram Moolenaar        return "yes"
671925e9fd6SBram Moolenaar      endfunc
672925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
673925e9fd6SBram Moolenaar      def! g:Global(): string
674925e9fd6SBram Moolenaar        return "no"
675925e9fd6SBram Moolenaar      enddef
676925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
677925e9fd6SBram Moolenaar      delfunc g:Global
678925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
679925e9fd6SBram Moolenaar  END
680925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
681925e9fd6SBram Moolenaar
682925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
683925e9fd6SBram Moolenaar  lines =<< trim END
684925e9fd6SBram Moolenaar      vim9script
685925e9fd6SBram Moolenaar      def g:Global(): string
686925e9fd6SBram Moolenaar        return "yes"
687925e9fd6SBram Moolenaar      enddef
688925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
689925e9fd6SBram Moolenaar      func! g:Global()
690925e9fd6SBram Moolenaar        return "no"
691925e9fd6SBram Moolenaar      endfunc
692925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
693925e9fd6SBram Moolenaar      delfunc g:Global
694925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
695925e9fd6SBram Moolenaar  END
696925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6974c17ad94SBram Moolenaarenddef
6984c17ad94SBram Moolenaar
699599c89c8SBram Moolenaarfunc Test_wrong_type()
700599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
701599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
702599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
703599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
704599c89c8SBram Moolenaar
705599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
706599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
70742a480bfSBram Moolenaar
70842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
70942a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
71042a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
71142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
71242a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
71342a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
71442a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
71542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
71642a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
71742a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
71842a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
719a0a9f43aSBram Moolenaar
720a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
721a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7228a7d6542SBram Moolenaarendfunc
7238a7d6542SBram Moolenaar
7248a7d6542SBram Moolenaarfunc Test_const()
7258a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7268a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7278a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7289be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7298a7d6542SBram Moolenaarendfunc
7308a7d6542SBram Moolenaar
731df069eecSBram Moolenaardef Test_range_no_colon()
732df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
733df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
734df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
735df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
736df069eecSBram Moolenaarenddef
737df069eecSBram Moolenaar
738df069eecSBram Moolenaar
7398a7d6542SBram Moolenaardef Test_block()
7408a7d6542SBram Moolenaar  let outer = 1
7418a7d6542SBram Moolenaar  {
7428a7d6542SBram Moolenaar    let inner = 2
7438a7d6542SBram Moolenaar    assert_equal(1, outer)
7448a7d6542SBram Moolenaar    assert_equal(2, inner)
7458a7d6542SBram Moolenaar  }
7468a7d6542SBram Moolenaar  assert_equal(1, outer)
7478a7d6542SBram Moolenaarenddef
7488a7d6542SBram Moolenaar
7498a7d6542SBram Moolenaarfunc Test_block_failure()
7508a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
751585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
752585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7538a7d6542SBram Moolenaarendfunc
7548a7d6542SBram Moolenaar
755d032f34aSBram Moolenaarfunc g:NoSuchFunc()
756d032f34aSBram Moolenaar  echo 'none'
757d032f34aSBram Moolenaarendfunc
758d032f34aSBram Moolenaar
7598a7d6542SBram Moolenaardef Test_try_catch()
7608a7d6542SBram Moolenaar  let l = []
7617a092245SBram Moolenaar  try # comment
7628a7d6542SBram Moolenaar    add(l, '1')
7638a7d6542SBram Moolenaar    throw 'wrong'
7648a7d6542SBram Moolenaar    add(l, '2')
7657a092245SBram Moolenaar  catch # comment
7668a7d6542SBram Moolenaar    add(l, v:exception)
7677a092245SBram Moolenaar  finally # comment
7688a7d6542SBram Moolenaar    add(l, '3')
7697a092245SBram Moolenaar  endtry # comment
7708a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
77168d130c6SBram Moolenaar
772e859312eSBram Moolenaar  l = []
773e859312eSBram Moolenaar  try
774e859312eSBram Moolenaar    try
775e859312eSBram Moolenaar      add(l, '1')
776e859312eSBram Moolenaar      throw 'wrong'
777e859312eSBram Moolenaar      add(l, '2')
778e859312eSBram Moolenaar    catch /right/
779e859312eSBram Moolenaar      add(l, v:exception)
780e859312eSBram Moolenaar    endtry
781e859312eSBram Moolenaar  catch /wrong/
782e859312eSBram Moolenaar    add(l, 'caught')
783e859312eSBram Moolenaar  finally
784e859312eSBram Moolenaar    add(l, 'finally')
785e859312eSBram Moolenaar  endtry
786e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
787e859312eSBram Moolenaar
78868d130c6SBram Moolenaar  let n: number
78968d130c6SBram Moolenaar  try
79068d130c6SBram Moolenaar    n = l[3]
79168d130c6SBram Moolenaar  catch /E684:/
79268d130c6SBram Moolenaar    n = 99
79368d130c6SBram Moolenaar  endtry
79468d130c6SBram Moolenaar  assert_equal(99, n)
79568d130c6SBram Moolenaar
796*56acb094SBram Moolenaar  # TODO: this will change when index on "any" works
79768d130c6SBram Moolenaar  try
79868d130c6SBram Moolenaar    n = g:astring[3]
799*56acb094SBram Moolenaar  catch /E1029:/
80068d130c6SBram Moolenaar    n = 77
80168d130c6SBram Moolenaar  endtry
80268d130c6SBram Moolenaar  assert_equal(77, n)
80368d130c6SBram Moolenaar
80468d130c6SBram Moolenaar  try
80568d130c6SBram Moolenaar    n = l[g:astring]
806*56acb094SBram Moolenaar  catch /E1029:/
807*56acb094SBram Moolenaar    n = 88
80868d130c6SBram Moolenaar  endtry
809*56acb094SBram Moolenaar  assert_equal(88, n)
81068d130c6SBram Moolenaar
81168d130c6SBram Moolenaar  try
81268d130c6SBram Moolenaar    n = s:does_not_exist
81368d130c6SBram Moolenaar  catch /E121:/
814f0b9f43cSBram Moolenaar    n = 111
815f0b9f43cSBram Moolenaar  endtry
816f0b9f43cSBram Moolenaar  assert_equal(111, n)
817f0b9f43cSBram Moolenaar
818f0b9f43cSBram Moolenaar  try
819f0b9f43cSBram Moolenaar    n = g:does_not_exist
820f0b9f43cSBram Moolenaar  catch /E121:/
82168d130c6SBram Moolenaar    n = 121
82268d130c6SBram Moolenaar  endtry
82368d130c6SBram Moolenaar  assert_equal(121, n)
82468d130c6SBram Moolenaar
82568d130c6SBram Moolenaar  let d = #{one: 1}
82668d130c6SBram Moolenaar  try
82768d130c6SBram Moolenaar    n = d[g:astring]
82868d130c6SBram Moolenaar  catch /E716:/
82968d130c6SBram Moolenaar    n = 222
83068d130c6SBram Moolenaar  endtry
83168d130c6SBram Moolenaar  assert_equal(222, n)
832f0b9f43cSBram Moolenaar
833f0b9f43cSBram Moolenaar  try
834f0b9f43cSBram Moolenaar    n = -g:astring
835f0b9f43cSBram Moolenaar  catch /E39:/
836f0b9f43cSBram Moolenaar    n = 233
837f0b9f43cSBram Moolenaar  endtry
838f0b9f43cSBram Moolenaar  assert_equal(233, n)
839f0b9f43cSBram Moolenaar
840f0b9f43cSBram Moolenaar  try
841f0b9f43cSBram Moolenaar    n = +g:astring
842f0b9f43cSBram Moolenaar  catch /E1030:/
843f0b9f43cSBram Moolenaar    n = 244
844f0b9f43cSBram Moolenaar  endtry
845f0b9f43cSBram Moolenaar  assert_equal(244, n)
846f0b9f43cSBram Moolenaar
847f0b9f43cSBram Moolenaar  try
848f0b9f43cSBram Moolenaar    n = +g:alist
849f0b9f43cSBram Moolenaar  catch /E745:/
850f0b9f43cSBram Moolenaar    n = 255
851f0b9f43cSBram Moolenaar  endtry
852f0b9f43cSBram Moolenaar  assert_equal(255, n)
853f0b9f43cSBram Moolenaar
854f0b9f43cSBram Moolenaar  let nd: dict<any>
855f0b9f43cSBram Moolenaar  try
856f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
857f0b9f43cSBram Moolenaar  catch /E1029:/
858f0b9f43cSBram Moolenaar    n = 266
859f0b9f43cSBram Moolenaar  endtry
860f0b9f43cSBram Moolenaar  assert_equal(266, n)
861f0b9f43cSBram Moolenaar
862f0b9f43cSBram Moolenaar  try
863f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
864f0b9f43cSBram Moolenaar  catch /E1093:/
865f0b9f43cSBram Moolenaar    n = 277
866f0b9f43cSBram Moolenaar  endtry
867f0b9f43cSBram Moolenaar  assert_equal(277, n)
868f0b9f43cSBram Moolenaar
869e859312eSBram Moolenaar  try
870e859312eSBram Moolenaar    &ts = g:astring
871e859312eSBram Moolenaar  catch /E1029:/
872e859312eSBram Moolenaar    n = 288
873e859312eSBram Moolenaar  endtry
874e859312eSBram Moolenaar  assert_equal(288, n)
875e859312eSBram Moolenaar
876e859312eSBram Moolenaar  try
877e859312eSBram Moolenaar    &backspace = 'asdf'
878e859312eSBram Moolenaar  catch /E474:/
879e859312eSBram Moolenaar    n = 299
880e859312eSBram Moolenaar  endtry
881e859312eSBram Moolenaar  assert_equal(299, n)
882e859312eSBram Moolenaar
883e859312eSBram Moolenaar  l = [1]
884e859312eSBram Moolenaar  try
885e859312eSBram Moolenaar    l[3] = 3
886e859312eSBram Moolenaar  catch /E684:/
887e859312eSBram Moolenaar    n = 300
888e859312eSBram Moolenaar  endtry
889e859312eSBram Moolenaar  assert_equal(300, n)
890e859312eSBram Moolenaar
891e859312eSBram Moolenaar  try
892e859312eSBram Moolenaar    unlet g:does_not_exist
893e859312eSBram Moolenaar  catch /E108:/
894e859312eSBram Moolenaar    n = 322
895e859312eSBram Moolenaar  endtry
896e859312eSBram Moolenaar  assert_equal(322, n)
897e859312eSBram Moolenaar
898e859312eSBram Moolenaar  try
899e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
900e859312eSBram Moolenaar  catch /E721:/
901e859312eSBram Moolenaar    n = 333
902e859312eSBram Moolenaar  endtry
903e859312eSBram Moolenaar  assert_equal(333, n)
904e859312eSBram Moolenaar
905e859312eSBram Moolenaar  try
906e859312eSBram Moolenaar    l = DeletedFunc()
907e859312eSBram Moolenaar  catch /E933:/
908e859312eSBram Moolenaar    n = 344
909e859312eSBram Moolenaar  endtry
910e859312eSBram Moolenaar  assert_equal(344, n)
911d032f34aSBram Moolenaar
912d032f34aSBram Moolenaar  try
913d032f34aSBram Moolenaar    echo len(v:true)
914d032f34aSBram Moolenaar  catch /E701:/
915d032f34aSBram Moolenaar    n = 355
916d032f34aSBram Moolenaar  endtry
917d032f34aSBram Moolenaar  assert_equal(355, n)
918d032f34aSBram Moolenaar
919d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
920d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
921d032f34aSBram Moolenaar  try
922d032f34aSBram Moolenaar    echo P()
923d032f34aSBram Moolenaar  catch /E117:/
924d032f34aSBram Moolenaar    n = 366
925d032f34aSBram Moolenaar  endtry
926d032f34aSBram Moolenaar  assert_equal(366, n)
927d032f34aSBram Moolenaar
928d032f34aSBram Moolenaar  try
929d032f34aSBram Moolenaar    echo g:NoSuchFunc()
930d032f34aSBram Moolenaar  catch /E117:/
931d032f34aSBram Moolenaar    n = 377
932d032f34aSBram Moolenaar  endtry
933d032f34aSBram Moolenaar  assert_equal(377, n)
934d032f34aSBram Moolenaar
935d032f34aSBram Moolenaar  try
936d032f34aSBram Moolenaar    echo g:alist + 4
937d032f34aSBram Moolenaar  catch /E745:/
938d032f34aSBram Moolenaar    n = 388
939d032f34aSBram Moolenaar  endtry
940d032f34aSBram Moolenaar  assert_equal(388, n)
941d032f34aSBram Moolenaar
942d032f34aSBram Moolenaar  try
943d032f34aSBram Moolenaar    echo 4 + g:alist
944d032f34aSBram Moolenaar  catch /E745:/
945d032f34aSBram Moolenaar    n = 399
946d032f34aSBram Moolenaar  endtry
947d032f34aSBram Moolenaar  assert_equal(399, n)
948d032f34aSBram Moolenaar
949d032f34aSBram Moolenaar  try
950d032f34aSBram Moolenaar    echo g:alist.member
951d032f34aSBram Moolenaar  catch /E715:/
952d032f34aSBram Moolenaar    n = 400
953d032f34aSBram Moolenaar  endtry
954d032f34aSBram Moolenaar  assert_equal(400, n)
955d032f34aSBram Moolenaar
956d032f34aSBram Moolenaar  try
957d032f34aSBram Moolenaar    echo d.member
958d032f34aSBram Moolenaar  catch /E716:/
959d032f34aSBram Moolenaar    n = 411
960d032f34aSBram Moolenaar  endtry
961d032f34aSBram Moolenaar  assert_equal(411, n)
9628a7d6542SBram Moolenaarenddef
9638a7d6542SBram Moolenaar
964e859312eSBram Moolenaardef DeletedFunc(): list<any>
965e859312eSBram Moolenaar  return ['delete me']
966e859312eSBram Moolenaarenddef
967e859312eSBram Moolenaardefcompile
968e859312eSBram Moolenaardelfunc DeletedFunc
969e859312eSBram Moolenaar
970257cc5eeSBram Moolenaardef ThrowFromDef()
971a72cfb80SBram Moolenaar  throw "getout" # comment
972257cc5eeSBram Moolenaarenddef
973257cc5eeSBram Moolenaar
974257cc5eeSBram Moolenaarfunc CatchInFunc()
975257cc5eeSBram Moolenaar  try
976257cc5eeSBram Moolenaar    call ThrowFromDef()
977257cc5eeSBram Moolenaar  catch
978257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
979257cc5eeSBram Moolenaar  endtry
980257cc5eeSBram Moolenaarendfunc
981257cc5eeSBram Moolenaar
982257cc5eeSBram Moolenaardef CatchInDef()
983257cc5eeSBram Moolenaar  try
984257cc5eeSBram Moolenaar    ThrowFromDef()
985257cc5eeSBram Moolenaar  catch
986257cc5eeSBram Moolenaar    g:thrown_def = v:exception
987257cc5eeSBram Moolenaar  endtry
988257cc5eeSBram Moolenaarenddef
989257cc5eeSBram Moolenaar
990f575adffSBram Moolenaardef ReturnFinally(): string
991f575adffSBram Moolenaar  try
992f575adffSBram Moolenaar    return 'intry'
993f575adffSBram Moolenaar  finally
994f575adffSBram Moolenaar    g:in_finally = 'finally'
995f575adffSBram Moolenaar  endtry
996f575adffSBram Moolenaar  return 'end'
997f575adffSBram Moolenaarenddef
998f575adffSBram Moolenaar
999257cc5eeSBram Moolenaardef Test_try_catch_nested()
1000257cc5eeSBram Moolenaar  CatchInFunc()
1001257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1002257cc5eeSBram Moolenaar
1003257cc5eeSBram Moolenaar  CatchInDef()
1004257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1005f575adffSBram Moolenaar
1006f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1007f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1008f575adffSBram Moolenaarenddef
1009f575adffSBram Moolenaar
1010f575adffSBram Moolenaardef Test_try_catch_match()
1011f575adffSBram Moolenaar  let seq = 'a'
1012f575adffSBram Moolenaar  try
1013f575adffSBram Moolenaar    throw 'something'
1014f575adffSBram Moolenaar  catch /nothing/
1015f575adffSBram Moolenaar    seq ..= 'x'
1016f575adffSBram Moolenaar  catch /some/
1017f575adffSBram Moolenaar    seq ..= 'b'
1018f575adffSBram Moolenaar  catch /asdf/
1019f575adffSBram Moolenaar    seq ..= 'x'
1020e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1021e8c4abbbSBram Moolenaar    seq ..= 'y'
1022f575adffSBram Moolenaar  finally
1023f575adffSBram Moolenaar    seq ..= 'c'
1024f575adffSBram Moolenaar  endtry
1025f575adffSBram Moolenaar  assert_equal('abc', seq)
1026257cc5eeSBram Moolenaarenddef
1027257cc5eeSBram Moolenaar
1028e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1029e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1030e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1031e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1032585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1033585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1034585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1035585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1036585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1037585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1038585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1039585fea7bSBram Moolenaar
1040a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1041585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1042e8c4abbbSBram Moolenaarenddef
1043e8c4abbbSBram Moolenaar
1044006ad48bSBram Moolenaardef Test_throw_vimscript()
1045f5be8cdbSBram Moolenaar  # only checks line continuation
1046006ad48bSBram Moolenaar  let lines =<< trim END
1047006ad48bSBram Moolenaar      vim9script
1048006ad48bSBram Moolenaar      try
1049006ad48bSBram Moolenaar        throw 'one'
1050006ad48bSBram Moolenaar              .. 'two'
1051006ad48bSBram Moolenaar      catch
1052006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1053006ad48bSBram Moolenaar      endtry
1054006ad48bSBram Moolenaar  END
1055006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1056006ad48bSBram Moolenaarenddef
1057006ad48bSBram Moolenaar
1058ed677f55SBram Moolenaardef Test_error_in_nested_function()
1059ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1060ed677f55SBram Moolenaar  let lines =<< trim END
1061ed677f55SBram Moolenaar      vim9script
1062ed677f55SBram Moolenaar      def Func()
1063ed677f55SBram Moolenaar        Error()
1064ed677f55SBram Moolenaar        g:test_var = 1
1065ed677f55SBram Moolenaar      enddef
1066ed677f55SBram Moolenaar      func Error() abort
1067ed677f55SBram Moolenaar        eval [][0]
1068ed677f55SBram Moolenaar      endfunc
1069ed677f55SBram Moolenaar      Func()
1070ed677f55SBram Moolenaar  END
1071ed677f55SBram Moolenaar  g:test_var = 0
1072ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1073ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1074ed677f55SBram Moolenaarenddef
1075ed677f55SBram Moolenaar
107637c83711SBram Moolenaardef Test_cexpr_vimscript()
1077f5be8cdbSBram Moolenaar  # only checks line continuation
107837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
107937c83711SBram Moolenaar  let lines =<< trim END
108037c83711SBram Moolenaar      vim9script
108137c83711SBram Moolenaar      cexpr 'File'
108237c83711SBram Moolenaar                .. ' someFile' ..
108337c83711SBram Moolenaar                   ' line 19'
108437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
108537c83711SBram Moolenaar  END
108637c83711SBram Moolenaar  CheckScriptSuccess(lines)
108737c83711SBram Moolenaar  set errorformat&
108837c83711SBram Moolenaarenddef
108937c83711SBram Moolenaar
1090c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1091c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1092c9edd6b5SBram Moolenaar  let lines =<< trim END
1093c9edd6b5SBram Moolenaar      vim9script
1094c9edd6b5SBram Moolenaar      func g:Status()
1095c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1096c9edd6b5SBram Moolenaar      endfunc
1097c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1098c9edd6b5SBram Moolenaar      redrawstatus
1099c9edd6b5SBram Moolenaar      set laststatus statusline=
1100c9edd6b5SBram Moolenaar  END
1101c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1102c9edd6b5SBram Moolenaarenddef
1103c9edd6b5SBram Moolenaar
1104b209750bSBram Moolenaardef Test_list_vimscript()
1105b209750bSBram Moolenaar  # checks line continuation and comments
1106b209750bSBram Moolenaar  let lines =<< trim END
1107b209750bSBram Moolenaar      vim9script
1108b209750bSBram Moolenaar      let mylist = [
1109b209750bSBram Moolenaar            'one',
1110b209750bSBram Moolenaar            # comment
1111b209750bSBram Moolenaar            'two', # empty line follows
1112b209750bSBram Moolenaar
1113b209750bSBram Moolenaar            'three',
1114b209750bSBram Moolenaar            ]
1115b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1116b209750bSBram Moolenaar  END
1117b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1118b209750bSBram Moolenaarenddef
1119b209750bSBram Moolenaar
11202a1381c3SBram Moolenaarif has('channel')
112140ee466cSBram Moolenaar  let someJob = test_null_job()
112240ee466cSBram Moolenaar
112340ee466cSBram Moolenaar  def FuncWithError()
112440ee466cSBram Moolenaar    echomsg g:someJob
112540ee466cSBram Moolenaar  enddef
112640ee466cSBram Moolenaar
112740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
112840ee466cSBram Moolenaar    try
112940ee466cSBram Moolenaar      call FuncWithError()
113040ee466cSBram Moolenaar    catch
113140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
113240ee466cSBram Moolenaar    endtry
113340ee466cSBram Moolenaar  endfunc
11342a1381c3SBram Moolenaarendif
113540ee466cSBram Moolenaar
11368a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11378a7d6542SBram Moolenaar  vim9script
11388a7d6542SBram Moolenaar  let name: string = 'bob'
11398a7d6542SBram Moolenaar  def Concat(arg: string): string
11408a7d6542SBram Moolenaar    return name .. arg
11418a7d6542SBram Moolenaar  enddef
1142227a69deSBram Moolenaar  g:result = Concat('bie')
1143227a69deSBram Moolenaar  g:localname = name
11448a7d6542SBram Moolenaar
11458a7d6542SBram Moolenaar  export const CONST = 1234
11468a7d6542SBram Moolenaar  export let exported = 9876
11476e587dcbSBram Moolenaar  export let exp_name = 'John'
11488a7d6542SBram Moolenaar  export def Exported(): string
11498a7d6542SBram Moolenaar    return 'Exported'
11508a7d6542SBram Moolenaar  enddef
11518a7d6542SBram MoolenaarEND
11528a7d6542SBram Moolenaar
1153b3ca9824SBram Moolenaardef Undo_export_script_lines()
1154b3ca9824SBram Moolenaar  unlet g:result
1155b3ca9824SBram Moolenaar  unlet g:localname
1156b3ca9824SBram Moolenaarenddef
1157b3ca9824SBram Moolenaar
11585269bd2aSBram Moolenaardef Test_vim9_import_export()
11598a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11608a7d6542SBram Moolenaar    vim9script
11618a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11628a7d6542SBram Moolenaar    g:imported = exported
11636e587dcbSBram Moolenaar    exported += 3
11646e587dcbSBram Moolenaar    g:imported_added = exported
11658a7d6542SBram Moolenaar    g:imported_func = Exported()
11666e587dcbSBram Moolenaar
116740f4f7a4SBram Moolenaar    def GetExported(): string
116840f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
116940f4f7a4SBram Moolenaar      return local_dict.ref()
117040f4f7a4SBram Moolenaar    enddef
117140f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
117240f4f7a4SBram Moolenaar
11736e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11746e587dcbSBram Moolenaar    g:imported_name = exp_name
11756e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11766e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11775381c7a1SBram Moolenaar    g:imported_later = exported
11788a7d6542SBram Moolenaar  END
11798a7d6542SBram Moolenaar
11808a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11818a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11828a7d6542SBram Moolenaar
11838a7d6542SBram Moolenaar  source Ximport.vim
11848a7d6542SBram Moolenaar
11858a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11868a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11878a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11886e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11895381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11908a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
119140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11926e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11936e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11948a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11958a7d6542SBram Moolenaar
1196b3ca9824SBram Moolenaar  Undo_export_script_lines()
11978a7d6542SBram Moolenaar  unlet g:imported
11986e587dcbSBram Moolenaar  unlet g:imported_added
11995381c7a1SBram Moolenaar  unlet g:imported_later
12008a7d6542SBram Moolenaar  unlet g:imported_func
12016e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12028a7d6542SBram Moolenaar  delete('Ximport.vim')
1203f2d5c240SBram Moolenaar
12041c991144SBram Moolenaar  # similar, with line breaks
12051c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12061c991144SBram Moolenaar    vim9script
12071c991144SBram Moolenaar    import {
12081c991144SBram Moolenaar        exported,
12091c991144SBram Moolenaar        Exported,
12101c991144SBram Moolenaar        }
12111c991144SBram Moolenaar        from
12121c991144SBram Moolenaar        './Xexport.vim'
12131c991144SBram Moolenaar    g:imported = exported
12141c991144SBram Moolenaar    exported += 5
12151c991144SBram Moolenaar    g:imported_added = exported
12161c991144SBram Moolenaar    g:imported_func = Exported()
12171c991144SBram Moolenaar  END
12181c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12191c991144SBram Moolenaar  source Ximport_lbr.vim
12201c991144SBram Moolenaar
12211c991144SBram Moolenaar  assert_equal(9876, g:imported)
12221c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12231c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12241c991144SBram Moolenaar
12251c991144SBram Moolenaar  # exported script not sourced again
12261c991144SBram Moolenaar  assert_false(exists('g:result'))
12271c991144SBram Moolenaar  unlet g:imported
12281c991144SBram Moolenaar  unlet g:imported_added
12291c991144SBram Moolenaar  unlet g:imported_func
12301c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12311c991144SBram Moolenaar
12321c991144SBram Moolenaar  # import inside :def function
12335381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
12345381c7a1SBram Moolenaar    vim9script
12355381c7a1SBram Moolenaar    def ImportInDef()
12365381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12375381c7a1SBram Moolenaar      g:imported = exported
12385381c7a1SBram Moolenaar      exported += 7
12395381c7a1SBram Moolenaar      g:imported_added = exported
12405381c7a1SBram Moolenaar    enddef
12415381c7a1SBram Moolenaar    ImportInDef()
12425381c7a1SBram Moolenaar  END
12435381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12445381c7a1SBram Moolenaar  source Ximport2.vim
1245f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12465381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12475381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12485381c7a1SBram Moolenaar  unlet g:imported
12495381c7a1SBram Moolenaar  unlet g:imported_added
12505381c7a1SBram Moolenaar  delete('Ximport2.vim')
12515381c7a1SBram Moolenaar
1252f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1253f2d5c240SBram Moolenaar    vim9script
1254f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1255f2d5c240SBram Moolenaar    def UseExport()
1256f2d5c240SBram Moolenaar      g:imported = Export.exported
1257f2d5c240SBram Moolenaar    enddef
1258f2d5c240SBram Moolenaar    UseExport()
1259f2d5c240SBram Moolenaar  END
1260f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1261f2d5c240SBram Moolenaar  source Ximport.vim
12625381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1263f2d5c240SBram Moolenaar
1264599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1265599c89c8SBram Moolenaar    vim9script
1266599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1267599c89c8SBram Moolenaar    def Func()
1268599c89c8SBram Moolenaar      let dummy = 1
1269599c89c8SBram Moolenaar      let imported = Export + dummy
1270599c89c8SBram Moolenaar    enddef
1271822ba247SBram Moolenaar    defcompile
1272599c89c8SBram Moolenaar  END
1273599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1274599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1275599c89c8SBram Moolenaar
1276599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1277599c89c8SBram Moolenaar    vim9script
1278599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1279599c89c8SBram Moolenaar    def Func()
1280599c89c8SBram Moolenaar      let imported = Export . exported
1281599c89c8SBram Moolenaar    enddef
1282822ba247SBram Moolenaar    defcompile
1283599c89c8SBram Moolenaar  END
1284599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1285599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1286599c89c8SBram Moolenaar
1287599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1288599c89c8SBram Moolenaar    vim9script
1289599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1290599c89c8SBram Moolenaar    def Func()
1291599c89c8SBram Moolenaar      let imported = Export.
1292599c89c8SBram Moolenaar    enddef
1293822ba247SBram Moolenaar    defcompile
1294599c89c8SBram Moolenaar  END
1295599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1296599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1297599c89c8SBram Moolenaar
12981c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12991c991144SBram Moolenaar    vim9script
13001c991144SBram Moolenaar    import *
13011c991144SBram Moolenaar        as Export
13021c991144SBram Moolenaar        from
13031c991144SBram Moolenaar        './Xexport.vim'
13041c991144SBram Moolenaar    def UseExport()
13051c991144SBram Moolenaar      g:imported = Export.exported
13061c991144SBram Moolenaar    enddef
13071c991144SBram Moolenaar    UseExport()
13081c991144SBram Moolenaar  END
13091c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13101c991144SBram Moolenaar  source Ximport.vim
13111c991144SBram Moolenaar  assert_equal(9883, g:imported)
13121c991144SBram Moolenaar
1313f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1314f2d5c240SBram Moolenaar    vim9script
1315f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1316f2d5c240SBram Moolenaar  END
1317f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1318f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1319f2d5c240SBram Moolenaar
1320f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1321fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1322fa29c8abSBram Moolenaar    vim9script
1323fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1324fa29c8abSBram Moolenaar  END
1325fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1326fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1327fa29c8abSBram Moolenaar
1328f5be8cdbSBram Moolenaar  # try to import something that is already defined
13295269bd2aSBram Moolenaar  let import_already_defined =<< trim END
13305269bd2aSBram Moolenaar    vim9script
13315269bd2aSBram Moolenaar    let exported = 'something'
13325269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13335269bd2aSBram Moolenaar  END
13345269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13355269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13365269bd2aSBram Moolenaar
1337f5be8cdbSBram Moolenaar  # try to import something that is already defined
13385269bd2aSBram Moolenaar  import_already_defined =<< trim END
13395269bd2aSBram Moolenaar    vim9script
13405269bd2aSBram Moolenaar    let exported = 'something'
13415269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13425269bd2aSBram Moolenaar  END
13435269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13445269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13455269bd2aSBram Moolenaar
1346f5be8cdbSBram Moolenaar  # try to import something that is already defined
13475269bd2aSBram Moolenaar  import_already_defined =<< trim END
13485269bd2aSBram Moolenaar    vim9script
13495269bd2aSBram Moolenaar    let exported = 'something'
13505269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13515269bd2aSBram Moolenaar  END
13525269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13535269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13545269bd2aSBram Moolenaar
1355f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1356fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1357fa29c8abSBram Moolenaar    vim9script
1358fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1359fa29c8abSBram Moolenaar  END
1360fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1361fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1362fa29c8abSBram Moolenaar
1363fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1364fa29c8abSBram Moolenaar    vim9script
1365fa29c8abSBram Moolenaar    import name './Xexport.vim'
1366fa29c8abSBram Moolenaar  END
1367fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1368fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1369fa29c8abSBram Moolenaar
1370fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1371fa29c8abSBram Moolenaar    vim9script
1372fa29c8abSBram Moolenaar    import name from Xexport.vim
1373fa29c8abSBram Moolenaar  END
1374fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1375fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1376fa29c8abSBram Moolenaar
1377fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1378fa29c8abSBram Moolenaar    vim9script
1379fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1380fa29c8abSBram Moolenaar  END
1381fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1382fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1383fa29c8abSBram Moolenaar
1384fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1385fa29c8abSBram Moolenaar    vim9script
1386fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1387fa29c8abSBram Moolenaar  END
13885269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13895269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1390fa29c8abSBram Moolenaar
1391f2d5c240SBram Moolenaar  delete('Ximport.vim')
13925269bd2aSBram Moolenaar  delete('Ximport3.vim')
13938a7d6542SBram Moolenaar  delete('Xexport.vim')
13948a7d6542SBram Moolenaar
1395f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1396750802b5SBram Moolenaar  set cpo&vi
1397750802b5SBram Moolenaar  let cpo_before = &cpo
1398750802b5SBram Moolenaar  let lines =<< trim END
1399750802b5SBram Moolenaar    vim9script
1400750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1401750802b5SBram Moolenaar  END
1402750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1403750802b5SBram Moolenaar  source Xvim9_script
1404750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1405750802b5SBram Moolenaar  set cpo&vim
1406750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1407750802b5SBram Moolenaar  delete('Xvim9_script')
1408750802b5SBram Moolenaarenddef
1409750802b5SBram Moolenaar
1410803af686SBram Moolenaarfunc g:Trigger()
1411803af686SBram Moolenaar  source Ximport.vim
1412803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1413803af686SBram Moolenaarendfunc
1414803af686SBram Moolenaar
1415803af686SBram Moolenaardef Test_import_export_expr_map()
1416803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1417803af686SBram Moolenaar  let export_lines =<< trim END
1418803af686SBram Moolenaar    vim9script
1419803af686SBram Moolenaar    export def That(): string
1420803af686SBram Moolenaar      return 'yes'
1421803af686SBram Moolenaar    enddef
1422803af686SBram Moolenaar  END
1423803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1424803af686SBram Moolenaar
1425803af686SBram Moolenaar  let import_lines =<< trim END
1426803af686SBram Moolenaar    vim9script
1427803af686SBram Moolenaar    import That from './Xexport_that.vim'
1428803af686SBram Moolenaar    assert_equal('yes', That())
1429803af686SBram Moolenaar  END
1430803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1431803af686SBram Moolenaar
1432803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1433803af686SBram Moolenaar  feedkeys('trigger', "xt")
1434803af686SBram Moolenaar
1435730b2483SBram Moolenaar  delete('Xexport_that.vim')
1436803af686SBram Moolenaar  delete('Ximport.vim')
1437803af686SBram Moolenaar  nunmap trigger
1438803af686SBram Moolenaarenddef
1439803af686SBram Moolenaar
14408e1986e3SBram Moolenaardef Test_import_in_filetype()
14418e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14428e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14438e1986e3SBram Moolenaar  let export_lines =<< trim END
14448e1986e3SBram Moolenaar    vim9script
14458e1986e3SBram Moolenaar    export let That = 'yes'
14468e1986e3SBram Moolenaar  END
1447730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14488e1986e3SBram Moolenaar
14498e1986e3SBram Moolenaar  let import_lines =<< trim END
14508e1986e3SBram Moolenaar    vim9script
1451730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14528e1986e3SBram Moolenaar    assert_equal('yes', That)
14538e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14548e1986e3SBram Moolenaar  END
14558e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14568e1986e3SBram Moolenaar
14578e1986e3SBram Moolenaar  let save_rtp = &rtp
14588e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14598e1986e3SBram Moolenaar
14608e1986e3SBram Moolenaar  filetype plugin on
14618e1986e3SBram Moolenaar  copen
14628e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14638e1986e3SBram Moolenaar
14648e1986e3SBram Moolenaar  quit!
1465730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14668e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14678e1986e3SBram Moolenaar  &rtp = save_rtp
14688e1986e3SBram Moolenaarenddef
14698e1986e3SBram Moolenaar
1470efa94447SBram Moolenaardef Test_use_import_in_mapping()
1471efa94447SBram Moolenaar  let lines =<< trim END
1472efa94447SBram Moolenaar      vim9script
1473efa94447SBram Moolenaar      export def Funcx()
1474efa94447SBram Moolenaar        g:result = 42
1475efa94447SBram Moolenaar      enddef
1476efa94447SBram Moolenaar  END
1477efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1478efa94447SBram Moolenaar  lines =<< trim END
1479efa94447SBram Moolenaar      vim9script
1480efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1481b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1482efa94447SBram Moolenaar  END
1483efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1484efa94447SBram Moolenaar
1485efa94447SBram Moolenaar  source Xmapscript.vim
1486b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1487efa94447SBram Moolenaar  assert_equal(42, g:result)
1488efa94447SBram Moolenaar
1489efa94447SBram Moolenaar  unlet g:result
1490efa94447SBram Moolenaar  delete('XsomeExport.vim')
1491efa94447SBram Moolenaar  delete('Xmapscript.vim')
1492b3ca9824SBram Moolenaar  nunmap <F3>
1493efa94447SBram Moolenaarenddef
1494efa94447SBram Moolenaar
1495750802b5SBram Moolenaardef Test_vim9script_fails()
14968a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14978a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1498750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
14999721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15009b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1501750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1502750802b5SBram Moolenaar
1503451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1504c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1505c785b9a7SBram Moolenaar
1506750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1507a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
15088a7d6542SBram Moolenaarenddef
15098a7d6542SBram Moolenaar
1510f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1511101f4810SBram Moolenaar  CheckRunVimInTerminal
1512101f4810SBram Moolenaar
15139bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1514c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15159bb3eb3eSBram Moolenaarendfunc
15169bb3eb3eSBram Moolenaar
1517c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1518101f4810SBram Moolenaar  let export =<< trim END
1519101f4810SBram Moolenaar    vim9script
1520101f4810SBram Moolenaar    export def Foo(): number
1521101f4810SBram Moolenaar        return 0
1522101f4810SBram Moolenaar    enddef
1523101f4810SBram Moolenaar  END
1524730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1525101f4810SBram Moolenaar
1526730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15279bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15289bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1529101f4810SBram Moolenaar
1530730b2483SBram Moolenaar  delete('XexportCmd.vim')
15319bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15329bb3eb3eSBram Moolenaarenddef
1533101f4810SBram Moolenaar
15344c17ad94SBram Moolenaardef Test_vim9script_reload_import()
15358a7d6542SBram Moolenaar  let lines =<< trim END
15368a7d6542SBram Moolenaar    vim9script
15378a7d6542SBram Moolenaar    const var = ''
15388a7d6542SBram Moolenaar    let valone = 1234
15398a7d6542SBram Moolenaar    def MyFunc(arg: string)
15408a7d6542SBram Moolenaar       valone = 5678
15418a7d6542SBram Moolenaar    enddef
15428a7d6542SBram Moolenaar  END
15438a7d6542SBram Moolenaar  let morelines =<< trim END
15448a7d6542SBram Moolenaar    let valtwo = 222
15458a7d6542SBram Moolenaar    export def GetValtwo(): number
15468a7d6542SBram Moolenaar      return valtwo
15478a7d6542SBram Moolenaar    enddef
15488a7d6542SBram Moolenaar  END
154903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15508a7d6542SBram Moolenaar  source Xreload.vim
15518a7d6542SBram Moolenaar  source Xreload.vim
15528a7d6542SBram Moolenaar  source Xreload.vim
15538a7d6542SBram Moolenaar
15548a7d6542SBram Moolenaar  let testlines =<< trim END
15558a7d6542SBram Moolenaar    vim9script
15568a7d6542SBram Moolenaar    def TheFunc()
15578a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15588a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15598a7d6542SBram Moolenaar    enddef
15608a7d6542SBram Moolenaar    TheFunc()
15618a7d6542SBram Moolenaar  END
15628a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15638a7d6542SBram Moolenaar  source Ximport.vim
15648a7d6542SBram Moolenaar
1565f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1566f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15678a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15688a7d6542SBram Moolenaar  source Ximport.vim
15698a7d6542SBram Moolenaar
1570f5be8cdbSBram Moolenaar  # cannot declare a var twice
15718a7d6542SBram Moolenaar  lines =<< trim END
15728a7d6542SBram Moolenaar    vim9script
15738a7d6542SBram Moolenaar    let valone = 1234
15748a7d6542SBram Moolenaar    let valone = 5678
15758a7d6542SBram Moolenaar  END
15768a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15778a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
15788a7d6542SBram Moolenaar
15798a7d6542SBram Moolenaar  delete('Xreload.vim')
15808a7d6542SBram Moolenaar  delete('Ximport.vim')
15818a7d6542SBram Moolenaarenddef
15828a7d6542SBram Moolenaar
1583fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1584fe465a01SBram Moolenaar" script-local name.
1585fe465a01SBram Moolenaardef Test_vim9script_funcref()
1586fe465a01SBram Moolenaar  let sortlines =<< trim END
1587fe465a01SBram Moolenaar      vim9script
1588fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1589bed36b93SBram Moolenaar        return i2 - i1
1590fe465a01SBram Moolenaar      enddef
1591fe465a01SBram Moolenaar
1592fe465a01SBram Moolenaar      export def FastSort(): list<number>
1593fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1594fe465a01SBram Moolenaar      enddef
1595fe465a01SBram Moolenaar  END
1596fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1597fe465a01SBram Moolenaar
1598fe465a01SBram Moolenaar  let lines =<< trim END
1599fe465a01SBram Moolenaar    vim9script
1600fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1601fe465a01SBram Moolenaar    def Test()
1602fe465a01SBram Moolenaar      g:result = FastSort()
1603fe465a01SBram Moolenaar    enddef
1604fe465a01SBram Moolenaar    Test()
1605fe465a01SBram Moolenaar  END
1606fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1607fe465a01SBram Moolenaar
1608fe465a01SBram Moolenaar  source Xscript.vim
1609fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1610fe465a01SBram Moolenaar
1611fe465a01SBram Moolenaar  unlet g:result
1612fe465a01SBram Moolenaar  delete('Xsort.vim')
1613fe465a01SBram Moolenaar  delete('Xscript.vim')
1614fe465a01SBram Moolenaarenddef
1615fe465a01SBram Moolenaar
1616c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1617c620c055SBram Moolenaar" script where FastFilter() is called from.
1618c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1619c620c055SBram Moolenaar  let filterLines =<< trim END
1620c620c055SBram Moolenaar    vim9script
1621c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1622c620c055SBram Moolenaar      return idx % 2 == 1
1623c620c055SBram Moolenaar    enddef
1624c620c055SBram Moolenaar    export def FastFilter(): list<number>
1625c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1626c620c055SBram Moolenaar    enddef
1627c620c055SBram Moolenaar  END
1628c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1629c620c055SBram Moolenaar
1630c620c055SBram Moolenaar  let lines =<< trim END
1631c620c055SBram Moolenaar    vim9script
1632c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1633c620c055SBram Moolenaar    def Test()
1634c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1635c620c055SBram Moolenaar    enddef
1636c620c055SBram Moolenaar    Test()
1637c620c055SBram Moolenaar  END
1638c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1639c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1640c620c055SBram Moolenaar
1641c620c055SBram Moolenaar  delete('Xfilter.vim')
1642c620c055SBram Moolenaar  delete('Ximport.vim')
1643c620c055SBram Moolenaarenddef
1644c620c055SBram Moolenaar
16454c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
16464c17ad94SBram Moolenaar  let first_lines =<< trim END
16474c17ad94SBram Moolenaar    vim9script
16484c17ad94SBram Moolenaar    def FuncYes(): string
16494c17ad94SBram Moolenaar      return 'yes'
16504c17ad94SBram Moolenaar    enddef
16514c17ad94SBram Moolenaar  END
165203afdcf1SBram Moolenaar  let withno_lines =<< trim END
16534c17ad94SBram Moolenaar    def FuncNo(): string
16544c17ad94SBram Moolenaar      return 'no'
16554c17ad94SBram Moolenaar    enddef
16564c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16574c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16584c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
165903afdcf1SBram Moolenaar    enddef
166003afdcf1SBram Moolenaar  END
166103afdcf1SBram Moolenaar  let nono_lines =<< trim END
166203afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
166303afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
16644c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
16654c17ad94SBram Moolenaar    enddef
16664c17ad94SBram Moolenaar  END
16674c17ad94SBram Moolenaar
16684c17ad94SBram Moolenaar  # FuncNo() is defined
166903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16704c17ad94SBram Moolenaar  source Xreloaded.vim
16714c17ad94SBram Moolenaar  g:DoCheck(true)
16724c17ad94SBram Moolenaar
16734c17ad94SBram Moolenaar  # FuncNo() is not redefined
167403afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16754c17ad94SBram Moolenaar  source Xreloaded.vim
167603afdcf1SBram Moolenaar  g:DoCheck()
16774c17ad94SBram Moolenaar
16784c17ad94SBram Moolenaar  # FuncNo() is back
167903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16804c17ad94SBram Moolenaar  source Xreloaded.vim
168103afdcf1SBram Moolenaar  g:DoCheck()
16824c17ad94SBram Moolenaar
16834c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16844c17ad94SBram Moolenaarenddef
16854c17ad94SBram Moolenaar
168689483d40SBram Moolenaardef Test_vim9script_reload_delvar()
168789483d40SBram Moolenaar  # write the script with a script-local variable
168889483d40SBram Moolenaar  let lines =<< trim END
168989483d40SBram Moolenaar    vim9script
169089483d40SBram Moolenaar    let var = 'string'
169189483d40SBram Moolenaar  END
169289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
169389483d40SBram Moolenaar  source XreloadVar.vim
169489483d40SBram Moolenaar
169589483d40SBram Moolenaar  # now write the script using the same variable locally - works
169689483d40SBram Moolenaar  lines =<< trim END
169789483d40SBram Moolenaar    vim9script
169889483d40SBram Moolenaar    def Func()
169989483d40SBram Moolenaar      let var = 'string'
170089483d40SBram Moolenaar    enddef
170189483d40SBram Moolenaar  END
170289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
170389483d40SBram Moolenaar  source XreloadVar.vim
170489483d40SBram Moolenaar
170589483d40SBram Moolenaar  delete('XreloadVar.vim')
170689483d40SBram Moolenaarenddef
170789483d40SBram Moolenaar
17088a7d6542SBram Moolenaardef Test_import_absolute()
17098a7d6542SBram Moolenaar  let import_lines = [
1710e6085c53SBram Moolenaar        'vim9script',
1711e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1712e6085c53SBram Moolenaar        'def UseExported()',
1713e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1714e6085c53SBram Moolenaar        '  exported = 8888',
1715e6085c53SBram Moolenaar        '  g:imported_after = exported',
1716e6085c53SBram Moolenaar        'enddef',
1717e6085c53SBram Moolenaar        'UseExported()',
1718e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1719e6085c53SBram Moolenaar        ]
17208a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17218a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17228a7d6542SBram Moolenaar
17238a7d6542SBram Moolenaar  source Ximport_abs.vim
17248a7d6542SBram Moolenaar
17258a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17264e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1727675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1728675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1729675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1730675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1731675f716eSBram Moolenaar          'exported = 8888.*' ..
1732675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1733675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1734675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1735675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1736e6085c53SBram Moolenaar        g:import_disassembled)
1737b3ca9824SBram Moolenaar
1738b3ca9824SBram Moolenaar  Undo_export_script_lines()
17398a7d6542SBram Moolenaar  unlet g:imported_abs
17404e12a5dfSBram Moolenaar  unlet g:import_disassembled
17418a7d6542SBram Moolenaar
17428a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17438a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17448a7d6542SBram Moolenaarenddef
17458a7d6542SBram Moolenaar
17468a7d6542SBram Moolenaardef Test_import_rtp()
17478a7d6542SBram Moolenaar  let import_lines = [
1748e6085c53SBram Moolenaar        'vim9script',
1749e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1750e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1751e6085c53SBram Moolenaar        ]
17528a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17538a7d6542SBram Moolenaar  mkdir('import')
17548a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17558a7d6542SBram Moolenaar
17568a7d6542SBram Moolenaar  let save_rtp = &rtp
17578a7d6542SBram Moolenaar  &rtp = getcwd()
17588a7d6542SBram Moolenaar  source Ximport_rtp.vim
17598a7d6542SBram Moolenaar  &rtp = save_rtp
17608a7d6542SBram Moolenaar
17618a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17628a7d6542SBram Moolenaar
1763b3ca9824SBram Moolenaar  Undo_export_script_lines()
1764b3ca9824SBram Moolenaar  unlet g:imported_rtp
17658a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
176689483d40SBram Moolenaar  delete('import', 'rf')
17678a7d6542SBram Moolenaarenddef
17688a7d6542SBram Moolenaar
176925e0f586SBram Moolenaardef Test_import_compile_error()
177025e0f586SBram Moolenaar  let export_lines = [
177125e0f586SBram Moolenaar        'vim9script',
177225e0f586SBram Moolenaar        'export def ExpFunc(): string',
177325e0f586SBram Moolenaar        '  return notDefined',
177425e0f586SBram Moolenaar        'enddef',
177525e0f586SBram Moolenaar        ]
177625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
177725e0f586SBram Moolenaar
177825e0f586SBram Moolenaar  let import_lines = [
177925e0f586SBram Moolenaar        'vim9script',
178025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
178125e0f586SBram Moolenaar        'def ImpFunc()',
178225e0f586SBram Moolenaar        '  echo ExpFunc()',
178325e0f586SBram Moolenaar        'enddef',
178425e0f586SBram Moolenaar        'defcompile',
178525e0f586SBram Moolenaar        ]
178625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
178725e0f586SBram Moolenaar
178825e0f586SBram Moolenaar  try
178925e0f586SBram Moolenaar    source Ximport.vim
179025e0f586SBram Moolenaar  catch /E1001/
1791f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
179225e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
179325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
179425e0f586SBram Moolenaar  endtry
179525e0f586SBram Moolenaar
179625e0f586SBram Moolenaar  delete('Xexported.vim')
179725e0f586SBram Moolenaar  delete('Ximport.vim')
179825e0f586SBram Moolenaarenddef
179925e0f586SBram Moolenaar
1800c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1801c4ce36d4SBram Moolenaar  let lines = [
1802c4ce36d4SBram Moolenaar        'vim9script',
1803c4ce36d4SBram Moolenaar        'def Func()',
1804c4ce36d4SBram Moolenaar        '  eval [][0]',
1805c4ce36d4SBram Moolenaar        'enddef',
1806c4ce36d4SBram Moolenaar        'Func()',
1807c4ce36d4SBram Moolenaar        ]
1808c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1809c4ce36d4SBram Moolenaar
1810c4ce36d4SBram Moolenaar  for count in range(3)
1811c4ce36d4SBram Moolenaar    try
1812c4ce36d4SBram Moolenaar      source Xtestscript.vim
1813c4ce36d4SBram Moolenaar    catch /E684/
1814c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1815c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1816c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1817c4ce36d4SBram Moolenaar    endtry
1818c4ce36d4SBram Moolenaar  endfor
1819c4ce36d4SBram Moolenaar
1820c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1821c4ce36d4SBram Moolenaarenddef
1822c4ce36d4SBram Moolenaar
1823eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1824eef2102eSBram Moolenaar  let export_lines =<< trim END
1825eef2102eSBram Moolenaar      vim9script
1826eef2102eSBram Moolenaar      export def Func()
1827eef2102eSBram Moolenaar        echo 'imported'
1828eef2102eSBram Moolenaar      enddef
1829eef2102eSBram Moolenaar  END
1830eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1831eef2102eSBram Moolenaar
1832eef2102eSBram Moolenaar  let lines =<< trim END
1833eef2102eSBram Moolenaar    vim9script
1834eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1835eef2102eSBram Moolenaar    def Func()
1836eef2102eSBram Moolenaar      echo 'local to function'
1837eef2102eSBram Moolenaar    enddef
1838eef2102eSBram Moolenaar  END
1839eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1840eef2102eSBram Moolenaar
1841eef2102eSBram Moolenaar  lines =<< trim END
1842eef2102eSBram Moolenaar    vim9script
1843eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1844eef2102eSBram Moolenaar    def Outer()
1845eef2102eSBram Moolenaar      def Func()
1846eef2102eSBram Moolenaar        echo 'local to function'
1847eef2102eSBram Moolenaar      enddef
1848eef2102eSBram Moolenaar    enddef
1849eef2102eSBram Moolenaar    defcompile
1850eef2102eSBram Moolenaar  END
1851eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1852eef2102eSBram Moolenaar
1853eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1854eef2102eSBram Moolenaarenddef
1855eef2102eSBram Moolenaar
1856b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1857b9a2cac3SBram Moolenaar  let lines =<< trim END
1858b9a2cac3SBram Moolenaar    vim9script
1859b9a2cac3SBram Moolenaar    def Func()
1860b9a2cac3SBram Moolenaar      echo 'one'
1861b9a2cac3SBram Moolenaar    enddef
1862b9a2cac3SBram Moolenaar    def Func()
1863b9a2cac3SBram Moolenaar      echo 'two'
1864b9a2cac3SBram Moolenaar    enddef
1865b9a2cac3SBram Moolenaar  END
1866b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1867fa211f3cSBram Moolenaar
1868fa211f3cSBram Moolenaar  lines =<< trim END
1869fa211f3cSBram Moolenaar    vim9script
1870fa211f3cSBram Moolenaar    def Foo(): string
1871fa211f3cSBram Moolenaar      return 'foo'
1872fa211f3cSBram Moolenaar      enddef
1873fa211f3cSBram Moolenaar    def Func()
1874fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1875fa211f3cSBram Moolenaar    enddef
1876fa211f3cSBram Moolenaar    defcompile
1877fa211f3cSBram Moolenaar  END
1878fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1879b9a2cac3SBram Moolenaarenddef
1880b9a2cac3SBram Moolenaar
18818a7d6542SBram Moolenaardef Test_fixed_size_list()
1882f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
18838a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
18848a7d6542SBram Moolenaar  l->remove(0)
18858a7d6542SBram Moolenaar  l->add(5)
18868a7d6542SBram Moolenaar  l->insert(99, 1)
18870f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18888a7d6542SBram Moolenaarenddef
18898a7d6542SBram Moolenaar
1890ae616494SBram Moolenaardef Test_no_insert_xit()
1891ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1892ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1893f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1894f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1895f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1896ae616494SBram Moolenaar
1897ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1898ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1899ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1900ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1901f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1902f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1903f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1904f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1905f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1906ae616494SBram Moolenaarenddef
1907ae616494SBram Moolenaar
1908158906cfSBram Moolenaardef IfElse(what: number): string
1909158906cfSBram Moolenaar  let res = ''
1910158906cfSBram Moolenaar  if what == 1
1911158906cfSBram Moolenaar    res = "one"
1912158906cfSBram Moolenaar  elseif what == 2
1913158906cfSBram Moolenaar    res = "two"
1914a259d8d3SBram Moolenaar  else
1915158906cfSBram Moolenaar    res = "three"
1916a259d8d3SBram Moolenaar  endif
1917158906cfSBram Moolenaar  return res
1918a259d8d3SBram Moolenaarenddef
1919a259d8d3SBram Moolenaar
1920158906cfSBram Moolenaardef Test_if_elseif_else()
1921158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1922158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1923158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19240f18b6d1SBram Moolenaarenddef
19250f18b6d1SBram Moolenaar
1926e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1927e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1928e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1929e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1930e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1931585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1932e8c4abbbSBram Moolenaarenddef
1933e8c4abbbSBram Moolenaar
19346d69bf60SBram Moolenaarlet g:bool_true = v:true
19356d69bf60SBram Moolenaarlet g:bool_false = v:false
19366d69bf60SBram Moolenaar
19376d69bf60SBram Moolenaardef Test_if_const_expr()
19386d69bf60SBram Moolenaar  let res = false
19396d69bf60SBram Moolenaar  if true ? true : false
19406d69bf60SBram Moolenaar    res = true
19416d69bf60SBram Moolenaar  endif
19426d69bf60SBram Moolenaar  assert_equal(true, res)
19436d69bf60SBram Moolenaar
1944585fea7bSBram Moolenaar  g:glob = 2
1945585fea7bSBram Moolenaar  if false
19466797966dSBram Moolenaar    execute('g:glob = 3')
1947585fea7bSBram Moolenaar  endif
1948585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1949585fea7bSBram Moolenaar  if true
19506797966dSBram Moolenaar    execute('g:glob = 3')
1951585fea7bSBram Moolenaar  endif
1952585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1953585fea7bSBram Moolenaar
19546d69bf60SBram Moolenaar  res = false
19556d69bf60SBram Moolenaar  if g:bool_true ? true : false
19566d69bf60SBram Moolenaar    res = true
19576d69bf60SBram Moolenaar  endif
19586d69bf60SBram Moolenaar  assert_equal(true, res)
19596d69bf60SBram Moolenaar
19606d69bf60SBram Moolenaar  res = false
19616d69bf60SBram Moolenaar  if true ? g:bool_true : false
19626d69bf60SBram Moolenaar    res = true
19636d69bf60SBram Moolenaar  endif
19646d69bf60SBram Moolenaar  assert_equal(true, res)
19656d69bf60SBram Moolenaar
19666d69bf60SBram Moolenaar  res = false
19676d69bf60SBram Moolenaar  if true ? true : g:bool_false
19686d69bf60SBram Moolenaar    res = true
19696d69bf60SBram Moolenaar  endif
19706d69bf60SBram Moolenaar  assert_equal(true, res)
19716d69bf60SBram Moolenaar
19726d69bf60SBram Moolenaar  res = false
19736d69bf60SBram Moolenaar  if true ? false : true
19746d69bf60SBram Moolenaar    res = true
19756d69bf60SBram Moolenaar  endif
19766d69bf60SBram Moolenaar  assert_equal(false, res)
19776d69bf60SBram Moolenaar
19786d69bf60SBram Moolenaar  res = false
19796d69bf60SBram Moolenaar  if false ? false : true
19806d69bf60SBram Moolenaar    res = true
19816d69bf60SBram Moolenaar  endif
19826d69bf60SBram Moolenaar  assert_equal(true, res)
19836d69bf60SBram Moolenaar
19846d69bf60SBram Moolenaar  res = false
19856d69bf60SBram Moolenaar  if false ? true : false
19866d69bf60SBram Moolenaar    res = true
19876d69bf60SBram Moolenaar  endif
19886d69bf60SBram Moolenaar  assert_equal(false, res)
19896d69bf60SBram Moolenaar
19906d69bf60SBram Moolenaar  res = false
1991e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1992e8c4abbbSBram Moolenaar    res = true
1993e8c4abbbSBram Moolenaar  endif
1994e8c4abbbSBram Moolenaar  assert_equal(false, res)
1995e8c4abbbSBram Moolenaar
1996e8c4abbbSBram Moolenaar  res = false
19976d69bf60SBram Moolenaar  if true && true
19986d69bf60SBram Moolenaar    res = true
19996d69bf60SBram Moolenaar  endif
20006d69bf60SBram Moolenaar  assert_equal(true, res)
20016d69bf60SBram Moolenaar
20026d69bf60SBram Moolenaar  res = false
20036d69bf60SBram Moolenaar  if true && false
20046d69bf60SBram Moolenaar    res = true
20056d69bf60SBram Moolenaar  endif
20066d69bf60SBram Moolenaar  assert_equal(false, res)
20076d69bf60SBram Moolenaar
20086d69bf60SBram Moolenaar  res = false
20096d69bf60SBram Moolenaar  if g:bool_true && false
20106d69bf60SBram Moolenaar    res = true
20116d69bf60SBram Moolenaar  endif
20126d69bf60SBram Moolenaar  assert_equal(false, res)
20136d69bf60SBram Moolenaar
20146d69bf60SBram Moolenaar  res = false
20156d69bf60SBram Moolenaar  if true && g:bool_false
20166d69bf60SBram Moolenaar    res = true
20176d69bf60SBram Moolenaar  endif
20186d69bf60SBram Moolenaar  assert_equal(false, res)
20196d69bf60SBram Moolenaar
20206d69bf60SBram Moolenaar  res = false
20216d69bf60SBram Moolenaar  if false && false
20226d69bf60SBram Moolenaar    res = true
20236d69bf60SBram Moolenaar  endif
20246d69bf60SBram Moolenaar  assert_equal(false, res)
20256d69bf60SBram Moolenaar
20266d69bf60SBram Moolenaar  res = false
20276d69bf60SBram Moolenaar  if true || false
20286d69bf60SBram Moolenaar    res = true
20296d69bf60SBram Moolenaar  endif
20306d69bf60SBram Moolenaar  assert_equal(true, res)
20316d69bf60SBram Moolenaar
20326d69bf60SBram Moolenaar  res = false
20336d69bf60SBram Moolenaar  if g:bool_true || false
20346d69bf60SBram Moolenaar    res = true
20356d69bf60SBram Moolenaar  endif
20366d69bf60SBram Moolenaar  assert_equal(true, res)
20376d69bf60SBram Moolenaar
20386d69bf60SBram Moolenaar  res = false
20396d69bf60SBram Moolenaar  if true || g:bool_false
20406d69bf60SBram Moolenaar    res = true
20416d69bf60SBram Moolenaar  endif
20426d69bf60SBram Moolenaar  assert_equal(true, res)
20436d69bf60SBram Moolenaar
20446d69bf60SBram Moolenaar  res = false
20456d69bf60SBram Moolenaar  if false || false
20466d69bf60SBram Moolenaar    res = true
20476d69bf60SBram Moolenaar  endif
20486d69bf60SBram Moolenaar  assert_equal(false, res)
204980c34ca3SBram Moolenaarenddef
20506d69bf60SBram Moolenaar
205180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
205280c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
205380c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2054e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2055e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20566d69bf60SBram Moolenaarenddef
20576d69bf60SBram Moolenaar
205872abcf42SBram Moolenaardef RunNested(i: number): number
205972abcf42SBram Moolenaar  let x: number = 0
206072abcf42SBram Moolenaar  if i % 2
206172abcf42SBram Moolenaar    if 1
2062f5be8cdbSBram Moolenaar      # comment
206372abcf42SBram Moolenaar    else
2064f5be8cdbSBram Moolenaar      # comment
206572abcf42SBram Moolenaar    endif
206672abcf42SBram Moolenaar    x += 1
206772abcf42SBram Moolenaar  else
206872abcf42SBram Moolenaar    x += 1000
206972abcf42SBram Moolenaar  endif
207072abcf42SBram Moolenaar  return x
207172abcf42SBram Moolenaarenddef
207272abcf42SBram Moolenaar
207372abcf42SBram Moolenaardef Test_nested_if()
207472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
207572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
207672abcf42SBram Moolenaarenddef
207772abcf42SBram Moolenaar
2078ad39c094SBram Moolenaardef Test_execute_cmd()
2079ad39c094SBram Moolenaar  new
2080ad39c094SBram Moolenaar  setline(1, 'default')
2081ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2082ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2083a72cfb80SBram Moolenaar
2084a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2085a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2086a72cfb80SBram Moolenaar
2087ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2088ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2089a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2090ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2091a72cfb80SBram Moolenaar
2092ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2093ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2094a72cfb80SBram Moolenaar
2095ad39c094SBram Moolenaar  let cmd_first = 'call '
2096ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2097ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2098ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2099ad39c094SBram Moolenaar  bwipe!
2100585fea7bSBram Moolenaar
21012d6b20d6SBram Moolenaar  let n = true
21022d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21032d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21042d6b20d6SBram Moolenaar
2105585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2106a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2107ad39c094SBram Moolenaarenddef
2108ad39c094SBram Moolenaar
210947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2110f5be8cdbSBram Moolenaar  # only checks line continuation
211147e880d6SBram Moolenaar  let lines =<< trim END
211247e880d6SBram Moolenaar      vim9script
211347e880d6SBram Moolenaar      execute 'g:someVar'
211447e880d6SBram Moolenaar                .. ' = ' ..
211547e880d6SBram Moolenaar                   '28'
211647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
211747e880d6SBram Moolenaar      unlet g:someVar
211847e880d6SBram Moolenaar  END
211947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
212047e880d6SBram Moolenaarenddef
212147e880d6SBram Moolenaar
2122ad39c094SBram Moolenaardef Test_echo_cmd()
2123a72cfb80SBram Moolenaar  echo 'some' # comment
2124585fea7bSBram Moolenaar  echon 'thing'
2125ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2126ad39c094SBram Moolenaar
2127a72cfb80SBram Moolenaar  echo "some" # comment
2128a72cfb80SBram Moolenaar  echon "thing"
2129a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2130a72cfb80SBram Moolenaar
2131ad39c094SBram Moolenaar  let str1 = 'some'
2132ad39c094SBram Moolenaar  let str2 = 'more'
2133ad39c094SBram Moolenaar  echo str1 str2
2134ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2135a72cfb80SBram Moolenaar
2136a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2137ad39c094SBram Moolenaarenddef
2138ad39c094SBram Moolenaar
2139f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2140f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2141f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2142f93c7feaSBram Moolenaar  echo 'clear'
2143df069eecSBram Moolenaar  :1messages
2144f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2145f93c7feaSBram Moolenaar
2146f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2147f93c7feaSBram Moolenaarenddef
2148f93c7feaSBram Moolenaar
214947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2150f5be8cdbSBram Moolenaar  # only checks line continuation
215147e880d6SBram Moolenaar  let lines =<< trim END
215247e880d6SBram Moolenaar      vim9script
215347e880d6SBram Moolenaar      echomsg 'here'
215447e880d6SBram Moolenaar                .. ' is ' ..
215547e880d6SBram Moolenaar                   'a message'
215647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
215747e880d6SBram Moolenaar  END
215847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
215947e880d6SBram Moolenaarenddef
216047e880d6SBram Moolenaar
2161f93c7feaSBram Moolenaardef Test_echoerr_cmd()
216240ee466cSBram Moolenaar  try
216340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
216440ee466cSBram Moolenaar  catch
216540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
216640ee466cSBram Moolenaar  endtry
2167f93c7feaSBram Moolenaarenddef
2168f93c7feaSBram Moolenaar
216947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2170f5be8cdbSBram Moolenaar  # only checks line continuation
217147e880d6SBram Moolenaar  let lines =<< trim END
217247e880d6SBram Moolenaar      vim9script
217347e880d6SBram Moolenaar      try
217447e880d6SBram Moolenaar        echoerr 'this'
217547e880d6SBram Moolenaar                .. ' is ' ..
217647e880d6SBram Moolenaar                   'wrong'
217747e880d6SBram Moolenaar      catch
217847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
217947e880d6SBram Moolenaar      endtry
218047e880d6SBram Moolenaar  END
218147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
218247e880d6SBram Moolenaarenddef
218347e880d6SBram Moolenaar
218441fe0617SBram Moolenaardef Test_for_outside_of_function()
218541fe0617SBram Moolenaar  let lines =<< trim END
218641fe0617SBram Moolenaar    vim9script
218741fe0617SBram Moolenaar    new
218841fe0617SBram Moolenaar    for var in range(0, 3)
218941fe0617SBram Moolenaar      append(line('$'), var)
219041fe0617SBram Moolenaar    endfor
219141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
219241fe0617SBram Moolenaar    bwipe!
219341fe0617SBram Moolenaar  END
219441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
219541fe0617SBram Moolenaar  source Xvim9for.vim
219641fe0617SBram Moolenaar  delete('Xvim9for.vim')
219741fe0617SBram Moolenaarenddef
21988a7d6542SBram Moolenaar
2199e8c4abbbSBram Moolenaardef Test_for_loop()
2200e8c4abbbSBram Moolenaar  let result = ''
2201e8c4abbbSBram Moolenaar  for cnt in range(7)
2202e8c4abbbSBram Moolenaar    if cnt == 4
2203e8c4abbbSBram Moolenaar      break
2204e8c4abbbSBram Moolenaar    endif
2205e8c4abbbSBram Moolenaar    if cnt == 2
2206e8c4abbbSBram Moolenaar      continue
2207e8c4abbbSBram Moolenaar    endif
2208e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2209e8c4abbbSBram Moolenaar  endfor
2210e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22110ad3e894SBram Moolenaar
22120ad3e894SBram Moolenaar  let concat = ''
22130ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22140ad3e894SBram Moolenaar    concat ..= str
22150ad3e894SBram Moolenaar  endfor
22160ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2217e8c4abbbSBram Moolenaarenddef
2218e8c4abbbSBram Moolenaar
2219e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2220675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2221675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2222451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2223822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2224451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2225675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2226675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2227675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2228e8c4abbbSBram Moolenaarenddef
2229e8c4abbbSBram Moolenaar
2230d0df1aacSBram Moolenaardef Test_while_loop()
2231d0df1aacSBram Moolenaar  let result = ''
2232d0df1aacSBram Moolenaar  let cnt = 0
2233d0df1aacSBram Moolenaar  while cnt < 555
2234d0df1aacSBram Moolenaar    if cnt == 3
2235d0df1aacSBram Moolenaar      break
2236d0df1aacSBram Moolenaar    endif
2237d0df1aacSBram Moolenaar    cnt += 1
2238d0df1aacSBram Moolenaar    if cnt == 2
2239d0df1aacSBram Moolenaar      continue
2240d0df1aacSBram Moolenaar    endif
2241d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2242d0df1aacSBram Moolenaar  endwhile
2243d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2244d0df1aacSBram Moolenaarenddef
2245d0df1aacSBram Moolenaar
2246e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2247675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2248675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2249675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2250675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2251675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2252675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2253675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2254bd5da371SBram Moolenaarenddef
2255bd5da371SBram Moolenaar
22569645e2d9SBram Moolenaardef Test_interrupt_loop()
225797acfc78SBram Moolenaar  let caught = false
22589645e2d9SBram Moolenaar  let x = 0
225997acfc78SBram Moolenaar  try
22609645e2d9SBram Moolenaar    while 1
22619645e2d9SBram Moolenaar      x += 1
22629645e2d9SBram Moolenaar      if x == 100
22639645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22649645e2d9SBram Moolenaar      endif
22659645e2d9SBram Moolenaar    endwhile
226697acfc78SBram Moolenaar  catch
226797acfc78SBram Moolenaar    caught = true
226897acfc78SBram Moolenaar    assert_equal(100, x)
226997acfc78SBram Moolenaar  endtry
227097acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
22719645e2d9SBram Moolenaarenddef
227220431c9dSBram Moolenaar
22734fdae999SBram Moolenaardef Test_automatic_line_continuation()
22744fdae999SBram Moolenaar  let mylist = [
22754fdae999SBram Moolenaar      'one',
22764fdae999SBram Moolenaar      'two',
22774fdae999SBram Moolenaar      'three',
2278f5be8cdbSBram Moolenaar      ] # comment
22794fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
22804fdae999SBram Moolenaar
22814fdae999SBram Moolenaar  let mydict = {
22824fdae999SBram Moolenaar      'one': 1,
22834fdae999SBram Moolenaar      'two': 2,
22844fdae999SBram Moolenaar      'three':
22854fdae999SBram Moolenaar          3,
2286f5be8cdbSBram Moolenaar      } # comment
22874fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
22884fdae999SBram Moolenaar  mydict = #{
22892c330432SBram Moolenaar      one: 1,  # comment
22902c330432SBram Moolenaar      two:     # comment
22912c330432SBram Moolenaar           2,  # comment
22922c330432SBram Moolenaar      three: 3 # comment
22932c330432SBram Moolenaar      }
22942c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
22952c330432SBram Moolenaar  mydict = #{
22962c330432SBram Moolenaar      one: 1,
22974fdae999SBram Moolenaar      two:
22984fdae999SBram Moolenaar           2,
22992c330432SBram Moolenaar      three: 3
23004fdae999SBram Moolenaar      }
23014fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2302e6085c53SBram Moolenaar
2303e6085c53SBram Moolenaar  assert_equal(
2304e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2305e6085c53SBram Moolenaar        split('one two three')
2306e6085c53SBram Moolenaar        )
23074fdae999SBram Moolenaarenddef
23084fdae999SBram Moolenaar
23097a092245SBram Moolenaardef Test_vim9_comment()
23107a092245SBram Moolenaar  CheckScriptSuccess([
23117a092245SBram Moolenaar      'vim9script',
23127a092245SBram Moolenaar      '# something',
23137a092245SBram Moolenaar      ])
23147a092245SBram Moolenaar  CheckScriptFailure([
23157a092245SBram Moolenaar      'vim9script',
23167a092245SBram Moolenaar      ':# something',
23177a092245SBram Moolenaar      ], 'E488:')
23187a092245SBram Moolenaar  CheckScriptFailure([
23197a092245SBram Moolenaar      '# something',
23207a092245SBram Moolenaar      ], 'E488:')
23217a092245SBram Moolenaar  CheckScriptFailure([
23227a092245SBram Moolenaar      ':# something',
23237a092245SBram Moolenaar      ], 'E488:')
23247a092245SBram Moolenaar
23254a8d9f2eSBram Moolenaar  { # block start
23264a8d9f2eSBram Moolenaar  } # block end
23274a8d9f2eSBram Moolenaar  CheckDefFailure([
23284a8d9f2eSBram Moolenaar      '{# comment',
23294a8d9f2eSBram Moolenaar      ], 'E488:')
23304a8d9f2eSBram Moolenaar  CheckDefFailure([
23314a8d9f2eSBram Moolenaar      '{',
23324a8d9f2eSBram Moolenaar      '}# comment',
23334a8d9f2eSBram Moolenaar      ], 'E488:')
23344a8d9f2eSBram Moolenaar
23354a8d9f2eSBram Moolenaar  echo "yes" # comment
23364a8d9f2eSBram Moolenaar  CheckDefFailure([
23374a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23384a8d9f2eSBram Moolenaar      ], 'E488:')
23397a092245SBram Moolenaar  CheckScriptSuccess([
23407a092245SBram Moolenaar      'vim9script',
23417a092245SBram Moolenaar      'echo "yes" # something',
23427a092245SBram Moolenaar      ])
23437a092245SBram Moolenaar  CheckScriptFailure([
23447a092245SBram Moolenaar      'vim9script',
23457a092245SBram Moolenaar      'echo "yes"# something',
23467a092245SBram Moolenaar      ], 'E121:')
23477a092245SBram Moolenaar  CheckScriptFailure([
23487a092245SBram Moolenaar      'vim9script',
23497a092245SBram Moolenaar      'echo# something',
23507a092245SBram Moolenaar      ], 'E121:')
23517a092245SBram Moolenaar  CheckScriptFailure([
23527a092245SBram Moolenaar      'echo "yes" # something',
23537a092245SBram Moolenaar      ], 'E121:')
23547a092245SBram Moolenaar
23554a8d9f2eSBram Moolenaar  exe "echo" # comment
23564a8d9f2eSBram Moolenaar  CheckDefFailure([
23574a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23584a8d9f2eSBram Moolenaar      ], 'E488:')
23594a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23604a8d9f2eSBram Moolenaar      'vim9script',
23614a8d9f2eSBram Moolenaar      'exe "echo" # something',
23624a8d9f2eSBram Moolenaar      ])
23634a8d9f2eSBram Moolenaar  CheckScriptFailure([
23644a8d9f2eSBram Moolenaar      'vim9script',
23654a8d9f2eSBram Moolenaar      'exe "echo"# something',
23664a8d9f2eSBram Moolenaar      ], 'E121:')
23674a8d9f2eSBram Moolenaar  CheckDefFailure([
23684a8d9f2eSBram Moolenaar      'exe # comment',
23694a8d9f2eSBram Moolenaar      ], 'E1015:')
23704a8d9f2eSBram Moolenaar  CheckScriptFailure([
23714a8d9f2eSBram Moolenaar      'vim9script',
23724a8d9f2eSBram Moolenaar      'exe# something',
23734a8d9f2eSBram Moolenaar      ], 'E121:')
23744a8d9f2eSBram Moolenaar  CheckScriptFailure([
23754a8d9f2eSBram Moolenaar      'exe "echo" # something',
23764a8d9f2eSBram Moolenaar      ], 'E121:')
23774a8d9f2eSBram Moolenaar
23787a092245SBram Moolenaar  CheckDefFailure([
23797a092245SBram Moolenaar      'try# comment',
23807a092245SBram Moolenaar      '  echo "yes"',
23817a092245SBram Moolenaar      'catch',
23827a092245SBram Moolenaar      'endtry',
23837a092245SBram Moolenaar      ], 'E488:')
23842c5ed4e3SBram Moolenaar  CheckScriptFailure([
23852c5ed4e3SBram Moolenaar      'vim9script',
23862c5ed4e3SBram Moolenaar      'try# comment',
23872c5ed4e3SBram Moolenaar      'echo "yes"',
23882c5ed4e3SBram Moolenaar      ], 'E488:')
23897a092245SBram Moolenaar  CheckDefFailure([
23907a092245SBram Moolenaar      'try',
2391a72cfb80SBram Moolenaar      '  throw#comment',
2392a72cfb80SBram Moolenaar      'catch',
2393a72cfb80SBram Moolenaar      'endtry',
2394a72cfb80SBram Moolenaar      ], 'E1015:')
2395a72cfb80SBram Moolenaar  CheckDefFailure([
2396a72cfb80SBram Moolenaar      'try',
2397a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2398a72cfb80SBram Moolenaar      'catch',
2399a72cfb80SBram Moolenaar      'endtry',
2400a72cfb80SBram Moolenaar      ], 'E488:')
2401a72cfb80SBram Moolenaar  CheckDefFailure([
2402a72cfb80SBram Moolenaar      'try',
24037a092245SBram Moolenaar      '  echo "yes"',
24047a092245SBram Moolenaar      'catch# comment',
24057a092245SBram Moolenaar      'endtry',
24067a092245SBram Moolenaar      ], 'E488:')
24072c5ed4e3SBram Moolenaar  CheckScriptFailure([
24082c5ed4e3SBram Moolenaar      'vim9script',
24092c5ed4e3SBram Moolenaar      'try',
24102c5ed4e3SBram Moolenaar      '  echo "yes"',
24112c5ed4e3SBram Moolenaar      'catch# comment',
24122c5ed4e3SBram Moolenaar      'endtry',
24132c5ed4e3SBram Moolenaar      ], 'E654:')
24142c5ed4e3SBram Moolenaar  CheckDefFailure([
24152c5ed4e3SBram Moolenaar      'try',
24162c5ed4e3SBram Moolenaar      '  echo "yes"',
24172c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24182c5ed4e3SBram Moolenaar      'endtry',
24192c5ed4e3SBram Moolenaar      ], 'E488:')
24207a092245SBram Moolenaar  CheckDefFailure([
24217a092245SBram Moolenaar      'try',
24227a092245SBram Moolenaar      'echo "yes"',
24237a092245SBram Moolenaar      'catch',
24247a092245SBram Moolenaar      'endtry# comment',
24257a092245SBram Moolenaar      ], 'E488:')
24262c5ed4e3SBram Moolenaar  CheckScriptFailure([
24272c5ed4e3SBram Moolenaar      'vim9script',
24282c5ed4e3SBram Moolenaar      'try',
24292c5ed4e3SBram Moolenaar      '  echo "yes"',
24302c5ed4e3SBram Moolenaar      'catch',
24312c5ed4e3SBram Moolenaar      'endtry# comment',
24329b7bf9e9SBram Moolenaar      ], 'E488:')
24332c5ed4e3SBram Moolenaar
24342c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24352c5ed4e3SBram Moolenaar      'vim9script',
24362c5ed4e3SBram Moolenaar      'hi # comment',
24372c5ed4e3SBram Moolenaar      ])
24382c5ed4e3SBram Moolenaar  CheckScriptFailure([
24392c5ed4e3SBram Moolenaar      'vim9script',
24402c5ed4e3SBram Moolenaar      'hi# comment',
24412c5ed4e3SBram Moolenaar      ], 'E416:')
24421966c248SBram Moolenaar  CheckScriptSuccess([
24431966c248SBram Moolenaar      'vim9script',
24441966c248SBram Moolenaar      'hi Search # comment',
24451966c248SBram Moolenaar      ])
24461966c248SBram Moolenaar  CheckScriptFailure([
24471966c248SBram Moolenaar      'vim9script',
24481966c248SBram Moolenaar      'hi Search# comment',
24491966c248SBram Moolenaar      ], 'E416:')
24501966c248SBram Moolenaar  CheckScriptSuccess([
24511966c248SBram Moolenaar      'vim9script',
24521966c248SBram Moolenaar      'hi link This Search # comment',
24531966c248SBram Moolenaar      ])
24541966c248SBram Moolenaar  CheckScriptFailure([
24551966c248SBram Moolenaar      'vim9script',
24561966c248SBram Moolenaar      'hi link This That# comment',
24571966c248SBram Moolenaar      ], 'E413:')
24581966c248SBram Moolenaar  CheckScriptSuccess([
24591966c248SBram Moolenaar      'vim9script',
24601966c248SBram Moolenaar      'hi clear This # comment',
24611966c248SBram Moolenaar      'hi clear # comment',
24621966c248SBram Moolenaar      ])
2463f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2464f5be8cdbSBram Moolenaar  # hi clear This# comment',
24651966c248SBram Moolenaar  CheckScriptFailure([
24661966c248SBram Moolenaar      'vim9script',
24671966c248SBram Moolenaar      'hi clear# comment',
24681966c248SBram Moolenaar      ], 'E416:')
24691966c248SBram Moolenaar
24701966c248SBram Moolenaar  CheckScriptSuccess([
24711966c248SBram Moolenaar      'vim9script',
24721966c248SBram Moolenaar      'hi Group term=bold',
24731966c248SBram Moolenaar      'match Group /todo/ # comment',
24741966c248SBram Moolenaar      ])
24751966c248SBram Moolenaar  CheckScriptFailure([
24761966c248SBram Moolenaar      'vim9script',
24771966c248SBram Moolenaar      'hi Group term=bold',
24781966c248SBram Moolenaar      'match Group /todo/# comment',
24791966c248SBram Moolenaar      ], 'E488:')
24801966c248SBram Moolenaar  CheckScriptSuccess([
24811966c248SBram Moolenaar      'vim9script',
24821966c248SBram Moolenaar      'match # comment',
24831966c248SBram Moolenaar      ])
24841966c248SBram Moolenaar  CheckScriptFailure([
24851966c248SBram Moolenaar      'vim9script',
24861966c248SBram Moolenaar      'match# comment',
24871966c248SBram Moolenaar      ], 'E475:')
24881966c248SBram Moolenaar  CheckScriptSuccess([
24891966c248SBram Moolenaar      'vim9script',
24901966c248SBram Moolenaar      'match none # comment',
24911966c248SBram Moolenaar      ])
24921966c248SBram Moolenaar  CheckScriptFailure([
24931966c248SBram Moolenaar      'vim9script',
24941966c248SBram Moolenaar      'match none# comment',
24951966c248SBram Moolenaar      ], 'E475:')
24961966c248SBram Moolenaar
24971966c248SBram Moolenaar  CheckScriptSuccess([
24981966c248SBram Moolenaar      'vim9script',
24991966c248SBram Moolenaar      'menutrans clear # comment',
25001966c248SBram Moolenaar      ])
25011966c248SBram Moolenaar  CheckScriptFailure([
25021966c248SBram Moolenaar      'vim9script',
25031966c248SBram Moolenaar      'menutrans clear# comment text',
25041966c248SBram Moolenaar      ], 'E474:')
25051966c248SBram Moolenaar
25061966c248SBram Moolenaar  CheckScriptSuccess([
25071966c248SBram Moolenaar      'vim9script',
25081966c248SBram Moolenaar      'syntax clear # comment',
25091966c248SBram Moolenaar      ])
25101966c248SBram Moolenaar  CheckScriptFailure([
25111966c248SBram Moolenaar      'vim9script',
25121966c248SBram Moolenaar      'syntax clear# comment text',
25131966c248SBram Moolenaar      ], 'E28:')
25141966c248SBram Moolenaar  CheckScriptSuccess([
25151966c248SBram Moolenaar      'vim9script',
25161966c248SBram Moolenaar      'syntax keyword Word some',
25171966c248SBram Moolenaar      'syntax clear Word # comment',
25181966c248SBram Moolenaar      ])
25191966c248SBram Moolenaar  CheckScriptFailure([
25201966c248SBram Moolenaar      'vim9script',
25211966c248SBram Moolenaar      'syntax keyword Word some',
25221966c248SBram Moolenaar      'syntax clear Word# comment text',
25231966c248SBram Moolenaar      ], 'E28:')
25241966c248SBram Moolenaar
25251966c248SBram Moolenaar  CheckScriptSuccess([
25261966c248SBram Moolenaar      'vim9script',
25271966c248SBram Moolenaar      'syntax list # comment',
25281966c248SBram Moolenaar      ])
25291966c248SBram Moolenaar  CheckScriptFailure([
25301966c248SBram Moolenaar      'vim9script',
25311966c248SBram Moolenaar      'syntax list# comment text',
25321966c248SBram Moolenaar      ], 'E28:')
25331966c248SBram Moolenaar
25341966c248SBram Moolenaar  CheckScriptSuccess([
25351966c248SBram Moolenaar      'vim9script',
25361966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
25371966c248SBram Moolenaar      ])
25381966c248SBram Moolenaar  CheckScriptFailure([
25391966c248SBram Moolenaar      'vim9script',
25401966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25411966c248SBram Moolenaar      ], 'E475:')
25421966c248SBram Moolenaar
25431966c248SBram Moolenaar  CheckScriptSuccess([
25441966c248SBram Moolenaar      'vim9script',
25451966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25461966c248SBram Moolenaar      ])
25471966c248SBram Moolenaar  CheckScriptFailure([
25481966c248SBram Moolenaar      'vim9script',
25491966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25501966c248SBram Moolenaar      ], 'E789:')
25511966c248SBram Moolenaar
25521966c248SBram Moolenaar  CheckScriptSuccess([
25531966c248SBram Moolenaar      'vim9script',
25541966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25551966c248SBram Moolenaar      ])
25561966c248SBram Moolenaar  CheckScriptFailure([
25571966c248SBram Moolenaar      'vim9script',
25581966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25591966c248SBram Moolenaar      ], 'E402:')
25601966c248SBram Moolenaar
25611966c248SBram Moolenaar  CheckScriptSuccess([
25621966c248SBram Moolenaar      'vim9script',
25631966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25641966c248SBram Moolenaar      ])
25651966c248SBram Moolenaar  CheckScriptFailure([
25661966c248SBram Moolenaar      'vim9script',
25671966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25681966c248SBram Moolenaar      ], 'E475:')
25691966c248SBram Moolenaar  CheckScriptFailure([
25701966c248SBram Moolenaar      'vim9script',
25711966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
25721966c248SBram Moolenaar      ], 'E406:')
25731966c248SBram Moolenaar  CheckScriptFailure([
25741966c248SBram Moolenaar      'vim9script',
25751966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
25761966c248SBram Moolenaar      ], 'E475:')
25771966c248SBram Moolenaar
25781966c248SBram Moolenaar  CheckScriptSuccess([
25791966c248SBram Moolenaar      'vim9script',
25801966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
25811966c248SBram Moolenaar      ])
25821966c248SBram Moolenaar  CheckScriptFailure([
25831966c248SBram Moolenaar      'vim9script',
25841966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2585d032f34aSBram Moolenaar      ], 'E402:')
25861966c248SBram Moolenaar
25871966c248SBram Moolenaar  CheckScriptSuccess([
25881966c248SBram Moolenaar      'vim9script',
25891966c248SBram Moolenaar      'syntax sync # comment',
25901966c248SBram Moolenaar      ])
25911966c248SBram Moolenaar  CheckScriptFailure([
25921966c248SBram Moolenaar      'vim9script',
25931966c248SBram Moolenaar      'syntax sync# comment',
25941966c248SBram Moolenaar      ], 'E404:')
25951966c248SBram Moolenaar  CheckScriptSuccess([
25961966c248SBram Moolenaar      'vim9script',
25971966c248SBram Moolenaar      'syntax sync ccomment # comment',
25981966c248SBram Moolenaar      ])
25991966c248SBram Moolenaar  CheckScriptFailure([
26001966c248SBram Moolenaar      'vim9script',
26011966c248SBram Moolenaar      'syntax sync ccomment# comment',
26021966c248SBram Moolenaar      ], 'E404:')
26031966c248SBram Moolenaar
26041966c248SBram Moolenaar  CheckScriptSuccess([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26071966c248SBram Moolenaar      ])
26081966c248SBram Moolenaar  CheckScriptFailure([
26091966c248SBram Moolenaar      'vim9script',
26101966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26111966c248SBram Moolenaar      ], 'E475:')
2612a72cfb80SBram Moolenaar
2613a72cfb80SBram Moolenaar  CheckScriptSuccess([
2614a72cfb80SBram Moolenaar      'vim9script',
2615a72cfb80SBram Moolenaar      'command Echo echo # comment',
2616a72cfb80SBram Moolenaar      'command Echo # comment',
2617a72cfb80SBram Moolenaar      ])
2618a72cfb80SBram Moolenaar  CheckScriptFailure([
2619a72cfb80SBram Moolenaar      'vim9script',
2620a72cfb80SBram Moolenaar      'command Echo echo# comment',
2621a72cfb80SBram Moolenaar      'Echo',
2622a72cfb80SBram Moolenaar      ], 'E121:')
2623a72cfb80SBram Moolenaar  CheckScriptFailure([
2624a72cfb80SBram Moolenaar      'vim9script',
2625a72cfb80SBram Moolenaar      'command Echo# comment',
2626a72cfb80SBram Moolenaar      ], 'E182:')
2627a72cfb80SBram Moolenaar  CheckScriptFailure([
2628a72cfb80SBram Moolenaar      'vim9script',
2629a72cfb80SBram Moolenaar      'command Echo echo',
2630a72cfb80SBram Moolenaar      'command Echo# comment',
2631a72cfb80SBram Moolenaar      ], 'E182:')
2632a72cfb80SBram Moolenaar
2633a72cfb80SBram Moolenaar  CheckScriptSuccess([
2634a72cfb80SBram Moolenaar      'vim9script',
2635a72cfb80SBram Moolenaar      'function # comment',
2636a72cfb80SBram Moolenaar      ])
2637a72cfb80SBram Moolenaar  CheckScriptFailure([
2638a72cfb80SBram Moolenaar      'vim9script',
26399898107fSBram Moolenaar      'function " comment',
26409898107fSBram Moolenaar      ], 'E129:')
26419898107fSBram Moolenaar  CheckScriptFailure([
26429898107fSBram Moolenaar      'vim9script',
2643a72cfb80SBram Moolenaar      'function# comment',
2644a72cfb80SBram Moolenaar      ], 'E129:')
2645a72cfb80SBram Moolenaar  CheckScriptSuccess([
2646a72cfb80SBram Moolenaar      'vim9script',
2647a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2648a72cfb80SBram Moolenaar      ])
2649a72cfb80SBram Moolenaar  CheckScriptFailure([
2650a72cfb80SBram Moolenaar      'vim9script',
2651a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2652a72cfb80SBram Moolenaar      ], 'E488:')
2653a72cfb80SBram Moolenaar
2654a72cfb80SBram Moolenaar  CheckScriptSuccess([
2655a72cfb80SBram Moolenaar      'vim9script',
26564c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2657a72cfb80SBram Moolenaar      'endfunc',
26584c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2659a72cfb80SBram Moolenaar      ])
2660a72cfb80SBram Moolenaar  CheckScriptFailure([
2661a72cfb80SBram Moolenaar      'vim9script',
26624c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2663a72cfb80SBram Moolenaar      'endfunc',
26644c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2665a72cfb80SBram Moolenaar      ], 'E488:')
2666a72cfb80SBram Moolenaar
2667a72cfb80SBram Moolenaar  CheckScriptSuccess([
2668a72cfb80SBram Moolenaar      'vim9script',
2669a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2670a72cfb80SBram Moolenaar      ])
2671a72cfb80SBram Moolenaar  CheckScriptFailure([
2672a72cfb80SBram Moolenaar      'vim9script',
2673a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2674a72cfb80SBram Moolenaar      ], 'E488:')
2675e7e4838fSBram Moolenaar
2676e7e4838fSBram Moolenaar  CheckScriptFailure([
2677e7e4838fSBram Moolenaar      'def Test() " comment',
2678e7e4838fSBram Moolenaar      'enddef',
2679e7e4838fSBram Moolenaar      ], 'E488:')
2680e7e4838fSBram Moolenaar  CheckScriptFailure([
2681e7e4838fSBram Moolenaar      'vim9script',
2682e7e4838fSBram Moolenaar      'def Test() " comment',
2683e7e4838fSBram Moolenaar      'enddef',
2684e7e4838fSBram Moolenaar      ], 'E488:')
2685e7e4838fSBram Moolenaar
2686e7e4838fSBram Moolenaar  CheckScriptSuccess([
2687e7e4838fSBram Moolenaar      'func Test() " comment',
2688e7e4838fSBram Moolenaar      'endfunc',
2689e7e4838fSBram Moolenaar      ])
26909898107fSBram Moolenaar  CheckScriptSuccess([
2691e7e4838fSBram Moolenaar      'vim9script',
2692e7e4838fSBram Moolenaar      'func Test() " comment',
2693e7e4838fSBram Moolenaar      'endfunc',
26949898107fSBram Moolenaar      ])
2695e7e4838fSBram Moolenaar
2696e7e4838fSBram Moolenaar  CheckScriptSuccess([
2697e7e4838fSBram Moolenaar      'def Test() # comment',
2698e7e4838fSBram Moolenaar      'enddef',
2699e7e4838fSBram Moolenaar      ])
2700e7e4838fSBram Moolenaar  CheckScriptFailure([
2701e7e4838fSBram Moolenaar      'func Test() # comment',
2702e7e4838fSBram Moolenaar      'endfunc',
2703e7e4838fSBram Moolenaar      ], 'E488:')
27042c5ed4e3SBram Moolenaarenddef
27052c5ed4e3SBram Moolenaar
27062c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27072c5ed4e3SBram Moolenaar  CheckCanRunGui
27082c5ed4e3SBram Moolenaar
27092c5ed4e3SBram Moolenaar  CheckScriptFailure([
27102c5ed4e3SBram Moolenaar      'vim9script',
27112c5ed4e3SBram Moolenaar      'gui#comment'
27122c5ed4e3SBram Moolenaar      ], 'E499:')
27132c5ed4e3SBram Moolenaar  CheckScriptFailure([
27142c5ed4e3SBram Moolenaar      'vim9script',
27152c5ed4e3SBram Moolenaar      'gui -f#comment'
27162c5ed4e3SBram Moolenaar      ], 'E499:')
27177a092245SBram Moolenaarenddef
27187a092245SBram Moolenaar
2719a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27206797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27216797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2722a26b9700SBram Moolenaar
2723a26b9700SBram Moolenaar  edit test.vim
2724a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2725a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2726a26b9700SBram Moolenaar
2727a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2728a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2729a26b9700SBram Moolenaar
2730a26b9700SBram Moolenaar  g:entered = 0
2731a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2732a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2733a26b9700SBram Moolenaar
2734a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2735a26b9700SBram Moolenaar
2736a26b9700SBram Moolenaar  au! TabEnter
2737a26b9700SBram Moolenaar  unlet g:entered
2738d72c1bf0SBram Moolenaar
2739d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2740d72c1bf0SBram Moolenaar      'vim9script',
27416797966dSBram Moolenaar      'g:var = 123',
2742e55b1c09SBram Moolenaar      'b:var = 456',
2743e55b1c09SBram Moolenaar      'w:var = 777',
2744e55b1c09SBram Moolenaar      't:var = 888',
2745d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2746d72c1bf0SBram Moolenaar      ])
2747d72c1bf0SBram Moolenaar
2748d72c1bf0SBram Moolenaar  CheckScriptFailure([
2749d72c1bf0SBram Moolenaar      'vim9script',
2750d72c1bf0SBram Moolenaar      'let g:var = 123',
2751e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2752e55b1c09SBram Moolenaar
2753e55b1c09SBram Moolenaar  CheckScriptFailure([
2754e55b1c09SBram Moolenaar      'vim9script',
2755e55b1c09SBram Moolenaar      'let b:var = 123',
2756e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2757e55b1c09SBram Moolenaar
2758e55b1c09SBram Moolenaar  CheckScriptFailure([
2759e55b1c09SBram Moolenaar      'vim9script',
2760e55b1c09SBram Moolenaar      'let w:var = 123',
2761e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2762e55b1c09SBram Moolenaar
2763e55b1c09SBram Moolenaar  CheckScriptFailure([
2764e55b1c09SBram Moolenaar      'vim9script',
2765e55b1c09SBram Moolenaar      'let t:var = 123',
2766e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2767e55b1c09SBram Moolenaar
2768e55b1c09SBram Moolenaar  CheckScriptFailure([
2769e55b1c09SBram Moolenaar      'vim9script',
2770e55b1c09SBram Moolenaar      'let v:version = 123',
2771e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2772e55b1c09SBram Moolenaar
2773e55b1c09SBram Moolenaar  CheckScriptFailure([
2774e55b1c09SBram Moolenaar      'vim9script',
2775e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2776e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
27776797966dSBram Moolenaar
27786797966dSBram Moolenaar  CheckScriptFailure([
27796797966dSBram Moolenaar      'vim9script',
27806797966dSBram Moolenaar      'g:var = 123',
278132e35117SBram Moolenaar      'unlet g:var# comment1',
2782d72c1bf0SBram Moolenaar      ], 'E108:')
2783d72c1bf0SBram Moolenaar
2784d72c1bf0SBram Moolenaar  CheckScriptFailure([
2785d72c1bf0SBram Moolenaar      'let g:var = 123',
2786d72c1bf0SBram Moolenaar      'unlet g:var # something',
2787d72c1bf0SBram Moolenaar      ], 'E488:')
2788faac4104SBram Moolenaar
2789faac4104SBram Moolenaar  CheckScriptSuccess([
2790faac4104SBram Moolenaar      'vim9script',
279132e35117SBram Moolenaar      'if 1 # comment2',
2792faac4104SBram Moolenaar      '  echo "yes"',
2793faac4104SBram Moolenaar      'elseif 2 #comment',
2794faac4104SBram Moolenaar      '  echo "no"',
2795faac4104SBram Moolenaar      'endif',
2796faac4104SBram Moolenaar      ])
2797faac4104SBram Moolenaar
2798faac4104SBram Moolenaar  CheckScriptFailure([
2799faac4104SBram Moolenaar      'vim9script',
280032e35117SBram Moolenaar      'if 1# comment3',
2801faac4104SBram Moolenaar      '  echo "yes"',
2802faac4104SBram Moolenaar      'endif',
2803faac4104SBram Moolenaar      ], 'E15:')
2804faac4104SBram Moolenaar
2805faac4104SBram Moolenaar  CheckScriptFailure([
2806faac4104SBram Moolenaar      'vim9script',
280732e35117SBram Moolenaar      'if 0 # comment4',
2808faac4104SBram Moolenaar      '  echo "yes"',
2809faac4104SBram Moolenaar      'elseif 2#comment',
2810faac4104SBram Moolenaar      '  echo "no"',
2811faac4104SBram Moolenaar      'endif',
2812faac4104SBram Moolenaar      ], 'E15:')
2813faac4104SBram Moolenaar
2814faac4104SBram Moolenaar  CheckScriptSuccess([
2815faac4104SBram Moolenaar      'vim9script',
281632e35117SBram Moolenaar      'let v = 1 # comment5',
2817faac4104SBram Moolenaar      ])
2818faac4104SBram Moolenaar
2819faac4104SBram Moolenaar  CheckScriptFailure([
2820faac4104SBram Moolenaar      'vim9script',
282132e35117SBram Moolenaar      'let v = 1# comment6',
282232e35117SBram Moolenaar      ], 'E15:')
2823faac4104SBram Moolenaar
2824faac4104SBram Moolenaar  CheckScriptSuccess([
2825faac4104SBram Moolenaar      'vim9script',
2826faac4104SBram Moolenaar      'new'
2827faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2828df069eecSBram Moolenaar      ':$',
2829faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2830faac4104SBram Moolenaar      'bwipe!',
2831faac4104SBram Moolenaar      ])
2832faac4104SBram Moolenaar
2833f5be8cdbSBram Moolenaar  CheckScriptFailure([
2834f5be8cdbSBram Moolenaar      'vim9script',
2835f5be8cdbSBram Moolenaar      'new'
2836f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2837f5be8cdbSBram Moolenaar      ':$',
2838f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2839f5be8cdbSBram Moolenaar      'bwipe!',
2840f5be8cdbSBram Moolenaar      ], 'E488:')
2841f5be8cdbSBram Moolenaar
2842f5be8cdbSBram Moolenaar  CheckScriptFailure([
2843f5be8cdbSBram Moolenaar      'vim9script',
2844f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2845f5be8cdbSBram Moolenaar      ], 'E477:')
2846a26b9700SBram Moolenaarenddef
2847a26b9700SBram Moolenaar
28487e5bd91dSBram Moolenaardef Test_finish()
28497e5bd91dSBram Moolenaar  let lines =<< trim END
28507e5bd91dSBram Moolenaar    vim9script
28516797966dSBram Moolenaar    g:res = 'one'
28527e5bd91dSBram Moolenaar    if v:false | finish | endif
28536797966dSBram Moolenaar    g:res = 'two'
28547e5bd91dSBram Moolenaar    finish
28556797966dSBram Moolenaar    g:res = 'three'
28567e5bd91dSBram Moolenaar  END
28577e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
28587e5bd91dSBram Moolenaar  source Xfinished
28597e5bd91dSBram Moolenaar  assert_equal('two', g:res)
28607e5bd91dSBram Moolenaar
28617e5bd91dSBram Moolenaar  unlet g:res
28627e5bd91dSBram Moolenaar  delete('Xfinished')
28637e5bd91dSBram Moolenaarenddef
28647e5bd91dSBram Moolenaar
286532e35117SBram Moolenaardef Test_let_func_call()
286632e35117SBram Moolenaar  let lines =<< trim END
286732e35117SBram Moolenaar    vim9script
286832e35117SBram Moolenaar    func GetValue()
286932e35117SBram Moolenaar      if exists('g:count')
287032e35117SBram Moolenaar        let g:count += 1
287132e35117SBram Moolenaar      else
287232e35117SBram Moolenaar        let g:count = 1
287332e35117SBram Moolenaar      endif
287432e35117SBram Moolenaar      return 'this'
287532e35117SBram Moolenaar    endfunc
287632e35117SBram Moolenaar    let val: string = GetValue()
2877f5be8cdbSBram Moolenaar    # env var is always a string
2878df671b46SBram Moolenaar    let env = $TERM
287932e35117SBram Moolenaar  END
288032e35117SBram Moolenaar  writefile(lines, 'Xfinished')
288132e35117SBram Moolenaar  source Xfinished
2882f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
288332e35117SBram Moolenaar  assert_equal(1, g:count)
288432e35117SBram Moolenaar
288532e35117SBram Moolenaar  unlet g:count
288632e35117SBram Moolenaar  delete('Xfinished')
288732e35117SBram Moolenaarenddef
288832e35117SBram Moolenaar
288932e35117SBram Moolenaardef Test_let_missing_type()
289032e35117SBram Moolenaar  let lines =<< trim END
289132e35117SBram Moolenaar    vim9script
2892df671b46SBram Moolenaar    let var = g:unknown
2893227a69deSBram Moolenaar  END
2894822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2895227a69deSBram Moolenaar
2896227a69deSBram Moolenaar  lines =<< trim END
2897227a69deSBram Moolenaar    vim9script
2898227a69deSBram Moolenaar    let nr: number = 123
2899227a69deSBram Moolenaar    let var = nr
2900227a69deSBram Moolenaar  END
2901822ba247SBram Moolenaar  CheckScriptSuccess(lines)
290232e35117SBram Moolenaarenddef
290332e35117SBram Moolenaar
2904c82a5b5dSBram Moolenaardef Test_let_declaration()
2905c82a5b5dSBram Moolenaar  let lines =<< trim END
2906c82a5b5dSBram Moolenaar    vim9script
2907c82a5b5dSBram Moolenaar    let var: string
2908c82a5b5dSBram Moolenaar    g:var_uninit = var
2909c82a5b5dSBram Moolenaar    var = 'text'
2910c82a5b5dSBram Moolenaar    g:var_test = var
2911f5be8cdbSBram Moolenaar    # prefixing s: is optional
2912984dddbeSBram Moolenaar    s:var = 'prefixed'
2913984dddbeSBram Moolenaar    g:var_prefixed = s:var
2914984dddbeSBram Moolenaar
2915984dddbeSBram Moolenaar    let s:other: number
2916984dddbeSBram Moolenaar    other = 1234
2917984dddbeSBram Moolenaar    g:other_var = other
291853b29e48SBram Moolenaar
291953b29e48SBram Moolenaar    # type is inferred
292053b29e48SBram Moolenaar    s:dict = {'a': 222}
292153b29e48SBram Moolenaar    def GetDictVal(key: any)
292253b29e48SBram Moolenaar      g:dict_val = s:dict[key]
292353b29e48SBram Moolenaar    enddef
292453b29e48SBram Moolenaar    GetDictVal('a')
2925c82a5b5dSBram Moolenaar  END
2926c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2927c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2928c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2929984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2930984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
293153b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
2932c82a5b5dSBram Moolenaar
2933c82a5b5dSBram Moolenaar  unlet g:var_uninit
2934c82a5b5dSBram Moolenaar  unlet g:var_test
2935984dddbeSBram Moolenaar  unlet g:var_prefixed
2936984dddbeSBram Moolenaar  unlet g:other_var
2937c82a5b5dSBram Moolenaarenddef
2938c82a5b5dSBram Moolenaar
2939c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2940c5b1c20bSBram Moolenaar  let lines =<< trim END
2941c5b1c20bSBram Moolenaar    vim9script
2942c5b1c20bSBram Moolenaar    const var: string
2943c5b1c20bSBram Moolenaar  END
2944c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2945c5b1c20bSBram Moolenaar
2946c5b1c20bSBram Moolenaar  lines =<< trim END
2947c5b1c20bSBram Moolenaar    vim9script
2948c5b1c20bSBram Moolenaar    let 9var: string
2949c5b1c20bSBram Moolenaar  END
2950c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2951c5b1c20bSBram Moolenaarenddef
2952c5b1c20bSBram Moolenaar
295334db91f7SBram Moolenaardef Test_let_type_check()
295434db91f7SBram Moolenaar  let lines =<< trim END
295534db91f7SBram Moolenaar    vim9script
295634db91f7SBram Moolenaar    let var: string
295734db91f7SBram Moolenaar    var = 1234
295834db91f7SBram Moolenaar  END
2959451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
2960984dddbeSBram Moolenaar
2961984dddbeSBram Moolenaar  lines =<< trim END
2962984dddbeSBram Moolenaar    vim9script
2963984dddbeSBram Moolenaar    let var:string
2964984dddbeSBram Moolenaar  END
2965984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2966c5b1c20bSBram Moolenaar
2967c5b1c20bSBram Moolenaar  lines =<< trim END
2968c5b1c20bSBram Moolenaar    vim9script
2969c5b1c20bSBram Moolenaar    let var: asdf
2970c5b1c20bSBram Moolenaar  END
2971c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2972a71e2633SBram Moolenaar
2973a71e2633SBram Moolenaar  lines =<< trim END
2974a71e2633SBram Moolenaar    vim9script
2975a71e2633SBram Moolenaar    let s:l: list<number>
2976a71e2633SBram Moolenaar    s:l = []
2977a71e2633SBram Moolenaar  END
2978a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2979a71e2633SBram Moolenaar
2980a71e2633SBram Moolenaar  lines =<< trim END
2981a71e2633SBram Moolenaar    vim9script
2982a71e2633SBram Moolenaar    let s:d: dict<number>
2983a71e2633SBram Moolenaar    s:d = {}
2984a71e2633SBram Moolenaar  END
2985a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
298634db91f7SBram Moolenaarenddef
298734db91f7SBram Moolenaar
2988a5d0077eSBram Moolenaardef Test_forward_declaration()
2989a5d0077eSBram Moolenaar  let lines =<< trim END
2990a5d0077eSBram Moolenaar    vim9script
2991a5d0077eSBram Moolenaar    def GetValue(): string
2992a5d0077eSBram Moolenaar      return theVal
2993a5d0077eSBram Moolenaar    enddef
2994a5d0077eSBram Moolenaar    let theVal = 'something'
2995822ba247SBram Moolenaar    g:initVal = GetValue()
2996a5d0077eSBram Moolenaar    theVal = 'else'
2997a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2998a5d0077eSBram Moolenaar  END
2999a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3000a5d0077eSBram Moolenaar  source Xforward
3001a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3002a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3003a5d0077eSBram Moolenaar
3004a5d0077eSBram Moolenaar  unlet g:initVal
3005a5d0077eSBram Moolenaar  unlet g:laterVal
3006a5d0077eSBram Moolenaar  delete('Xforward')
3007a5d0077eSBram Moolenaarenddef
3008a5d0077eSBram Moolenaar
30099721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
30109721fb4eSBram Moolenaar  let legacy_lines =<< trim END
30119721fb4eSBram Moolenaar    source Xvim9_script.vim
30129721fb4eSBram Moolenaar
30139721fb4eSBram Moolenaar    call assert_false(exists('local'))
30149721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30159721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30169721fb4eSBram Moolenaar    call assert_equal('global', global)
30179721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30189721fb4eSBram Moolenaar
30199721fb4eSBram Moolenaar    " imported variable becomes script-local
30209721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30219721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30229721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30239721fb4eSBram Moolenaar
30249721fb4eSBram Moolenaar    " imported function becomes script-local
30259721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30269721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30279721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30289721fb4eSBram Moolenaar  END
30299721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30309721fb4eSBram Moolenaar
30319721fb4eSBram Moolenaar  let vim9_lines =<< trim END
30329721fb4eSBram Moolenaar    vim9script
30339721fb4eSBram Moolenaar    let local = 'local'
30349721fb4eSBram Moolenaar    g:global = 'global'
30359721fb4eSBram Moolenaar    export let exported = 'exported'
30369721fb4eSBram Moolenaar    export def GetText(): string
30379721fb4eSBram Moolenaar       return 'text'
30389721fb4eSBram Moolenaar    enddef
30399721fb4eSBram Moolenaar  END
30409721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
30419721fb4eSBram Moolenaar
30429721fb4eSBram Moolenaar  source Xlegacy_script.vim
30439721fb4eSBram Moolenaar
30449721fb4eSBram Moolenaar  assert_equal('global', g:global)
3045f5be8cdbSBram Moolenaar  unlet g:global
30469721fb4eSBram Moolenaar
30479721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30489721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30499721fb4eSBram Moolenaarenddef
3050a5d0077eSBram Moolenaar
30517d699701SBram Moolenaarfunc Test_vim9script_not_global()
30527d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30537d699701SBram Moolenaar  let vim9lines =<< trim END
30547d699701SBram Moolenaar    vim9script
30557d699701SBram Moolenaar    let var = 'local'
30567d699701SBram Moolenaar    func TheFunc()
30577d699701SBram Moolenaar      echo 'local'
30587d699701SBram Moolenaar    endfunc
30597d699701SBram Moolenaar    def DefFunc()
30607d699701SBram Moolenaar      echo 'local'
30617d699701SBram Moolenaar    enddef
30627d699701SBram Moolenaar  END
30637d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30647d699701SBram Moolenaar  source Xvim9script.vim
30657d699701SBram Moolenaar  try
30667d699701SBram Moolenaar    echo g:var
30677d699701SBram Moolenaar    assert_report('did not fail')
30687d699701SBram Moolenaar  catch /E121:/
30697d699701SBram Moolenaar    " caught
30707d699701SBram Moolenaar  endtry
30717d699701SBram Moolenaar  try
30727d699701SBram Moolenaar    call TheFunc()
30737d699701SBram Moolenaar    assert_report('did not fail')
30747d699701SBram Moolenaar  catch /E117:/
30757d699701SBram Moolenaar    " caught
30767d699701SBram Moolenaar  endtry
30777d699701SBram Moolenaar  try
30787d699701SBram Moolenaar    call DefFunc()
30797d699701SBram Moolenaar    assert_report('did not fail')
30807d699701SBram Moolenaar  catch /E117:/
30817d699701SBram Moolenaar    " caught
30827d699701SBram Moolenaar  endtry
30837d699701SBram Moolenaar
30847d699701SBram Moolenaar  call delete('Xvim9script.vium')
30857d699701SBram Moolenaarendfunc
30867d699701SBram Moolenaar
3087eeb27bfeSBram Moolenaardef Test_vim9_copen()
3088eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3089eeb27bfeSBram Moolenaar  copen
3090eeb27bfeSBram Moolenaar  quit
3091eeb27bfeSBram Moolenaarenddef
3092eeb27bfeSBram Moolenaar
30932d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
30942d6b20d6SBram Moolenaardef Test_vim9_autoload()
30952d6b20d6SBram Moolenaar  let lines =<< trim END
30962d6b20d6SBram Moolenaar     vim9script
30972d6b20d6SBram Moolenaar     def foo#test()
30982d6b20d6SBram Moolenaar         echomsg getreg('"')
30992d6b20d6SBram Moolenaar     enddef
31002d6b20d6SBram Moolenaar  END
31012d6b20d6SBram Moolenaar
31022d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31032d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
31042d6b20d6SBram Moolenaar  let save_rtp = &rtp
31052d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31062d6b20d6SBram Moolenaar  augroup test
31072d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31082d6b20d6SBram Moolenaar  augroup END
31092d6b20d6SBram Moolenaar
31102d6b20d6SBram Moolenaar  normal Y
31112d6b20d6SBram Moolenaar
31122d6b20d6SBram Moolenaar  augroup test
31132d6b20d6SBram Moolenaar    autocmd!
31142d6b20d6SBram Moolenaar  augroup END
31152d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31162d6b20d6SBram Moolenaar  &rtp = save_rtp
31172d6b20d6SBram Moolenaarenddef
31182d6b20d6SBram Moolenaar
31193896a105SBram Moolenaardef Test_cmdline_win()
31203896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31213896a105SBram Moolenaar  # the command line window.
31223896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
31233896a105SBram Moolenaar  let export_lines =<< trim END
31243896a105SBram Moolenaar    vim9script
31253896a105SBram Moolenaar    export let That = 'yes'
31263896a105SBram Moolenaar  END
31273896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
31283896a105SBram Moolenaar  let import_lines =<< trim END
31293896a105SBram Moolenaar    vim9script
31303896a105SBram Moolenaar    import That from './Xexport.vim'
31313896a105SBram Moolenaar  END
31323896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
31333896a105SBram Moolenaar  let save_rtp = &rtp
31343896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
31353896a105SBram Moolenaar  syntax on
31363896a105SBram Moolenaar  augroup CmdWin
31373896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
31383896a105SBram Moolenaar  augroup END
31393896a105SBram Moolenaar  # this will open and also close the cmdline window
31403896a105SBram Moolenaar  feedkeys('q:', 'xt')
31413896a105SBram Moolenaar  assert_equal('yes', g:got_there)
31423896a105SBram Moolenaar
31433896a105SBram Moolenaar  augroup CmdWin
31443896a105SBram Moolenaar    au!
31453896a105SBram Moolenaar  augroup END
31463896a105SBram Moolenaar  &rtp = save_rtp
31473896a105SBram Moolenaar  delete('rtp', 'rf')
31483896a105SBram Moolenaarenddef
31493896a105SBram Moolenaar
3150585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3151585fea7bSBram Moolenaardef Test_substitute_cmd()
3152585fea7bSBram Moolenaar  new
3153585fea7bSBram Moolenaar  setline(1, 'something')
3154585fea7bSBram Moolenaar  :substitute(some(other(
3155585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3156585fea7bSBram Moolenaar  bwipe!
3157585fea7bSBram Moolenaar
3158f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3159585fea7bSBram Moolenaar  let lines =<< trim END
3160585fea7bSBram Moolenaar    vim9script
3161585fea7bSBram Moolenaar    new
3162585fea7bSBram Moolenaar    setline(1, 'something')
3163585fea7bSBram Moolenaar    :substitute(some(other(
3164585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3165585fea7bSBram Moolenaar    bwipe!
3166585fea7bSBram Moolenaar  END
3167585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3168585fea7bSBram Moolenaar  source Xvim9lines
3169585fea7bSBram Moolenaar
3170585fea7bSBram Moolenaar  delete('Xvim9lines')
3171585fea7bSBram Moolenaarenddef
3172585fea7bSBram Moolenaar
31738a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3174