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
344cdb13ceSBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
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:')
103a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
104a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
105a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
106a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
107a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
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:')
131a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
132a8c17704SBram Moolenaar
133a8c17704SBram Moolenaar  @a = 'areg'
134a8c17704SBram Moolenaar  @a ..= 'add'
135a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
136dd29f1b0SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
137a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
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:')
151e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
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
541822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
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
79668d130c6SBram Moolenaar  try
79768d130c6SBram Moolenaar    n = g:astring[3]
79868d130c6SBram Moolenaar  catch /E714:/
79968d130c6SBram Moolenaar    n = 77
80068d130c6SBram Moolenaar  endtry
80168d130c6SBram Moolenaar  assert_equal(77, n)
80268d130c6SBram Moolenaar
80368d130c6SBram Moolenaar  try
80468d130c6SBram Moolenaar    n = l[g:astring]
80568d130c6SBram Moolenaar  catch /E39:/
80668d130c6SBram Moolenaar    n = 77
80768d130c6SBram Moolenaar  endtry
80868d130c6SBram Moolenaar  assert_equal(77, n)
80968d130c6SBram Moolenaar
81068d130c6SBram Moolenaar  try
81168d130c6SBram Moolenaar    n = s:does_not_exist
81268d130c6SBram Moolenaar  catch /E121:/
813f0b9f43cSBram Moolenaar    n = 111
814f0b9f43cSBram Moolenaar  endtry
815f0b9f43cSBram Moolenaar  assert_equal(111, n)
816f0b9f43cSBram Moolenaar
817f0b9f43cSBram Moolenaar  try
818f0b9f43cSBram Moolenaar    n = g:does_not_exist
819f0b9f43cSBram Moolenaar  catch /E121:/
82068d130c6SBram Moolenaar    n = 121
82168d130c6SBram Moolenaar  endtry
82268d130c6SBram Moolenaar  assert_equal(121, n)
82368d130c6SBram Moolenaar
82468d130c6SBram Moolenaar  let d = #{one: 1}
82568d130c6SBram Moolenaar  try
82668d130c6SBram Moolenaar    n = d[g:astring]
82768d130c6SBram Moolenaar  catch /E716:/
82868d130c6SBram Moolenaar    n = 222
82968d130c6SBram Moolenaar  endtry
83068d130c6SBram Moolenaar  assert_equal(222, n)
831f0b9f43cSBram Moolenaar
832f0b9f43cSBram Moolenaar  try
833f0b9f43cSBram Moolenaar    n = -g:astring
834f0b9f43cSBram Moolenaar  catch /E39:/
835f0b9f43cSBram Moolenaar    n = 233
836f0b9f43cSBram Moolenaar  endtry
837f0b9f43cSBram Moolenaar  assert_equal(233, n)
838f0b9f43cSBram Moolenaar
839f0b9f43cSBram Moolenaar  try
840f0b9f43cSBram Moolenaar    n = +g:astring
841f0b9f43cSBram Moolenaar  catch /E1030:/
842f0b9f43cSBram Moolenaar    n = 244
843f0b9f43cSBram Moolenaar  endtry
844f0b9f43cSBram Moolenaar  assert_equal(244, n)
845f0b9f43cSBram Moolenaar
846f0b9f43cSBram Moolenaar  try
847f0b9f43cSBram Moolenaar    n = +g:alist
848f0b9f43cSBram Moolenaar  catch /E745:/
849f0b9f43cSBram Moolenaar    n = 255
850f0b9f43cSBram Moolenaar  endtry
851f0b9f43cSBram Moolenaar  assert_equal(255, n)
852f0b9f43cSBram Moolenaar
853f0b9f43cSBram Moolenaar  let nd: dict<any>
854f0b9f43cSBram Moolenaar  try
855f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
856f0b9f43cSBram Moolenaar  catch /E1029:/
857f0b9f43cSBram Moolenaar    n = 266
858f0b9f43cSBram Moolenaar  endtry
859f0b9f43cSBram Moolenaar  assert_equal(266, n)
860f0b9f43cSBram Moolenaar
861f0b9f43cSBram Moolenaar  try
862f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
863f0b9f43cSBram Moolenaar  catch /E1093:/
864f0b9f43cSBram Moolenaar    n = 277
865f0b9f43cSBram Moolenaar  endtry
866f0b9f43cSBram Moolenaar  assert_equal(277, n)
867f0b9f43cSBram Moolenaar
868e859312eSBram Moolenaar  try
869e859312eSBram Moolenaar    &ts = g:astring
870e859312eSBram Moolenaar  catch /E1029:/
871e859312eSBram Moolenaar    n = 288
872e859312eSBram Moolenaar  endtry
873e859312eSBram Moolenaar  assert_equal(288, n)
874e859312eSBram Moolenaar
875e859312eSBram Moolenaar  try
876e859312eSBram Moolenaar    &backspace = 'asdf'
877e859312eSBram Moolenaar  catch /E474:/
878e859312eSBram Moolenaar    n = 299
879e859312eSBram Moolenaar  endtry
880e859312eSBram Moolenaar  assert_equal(299, n)
881e859312eSBram Moolenaar
882e859312eSBram Moolenaar  l = [1]
883e859312eSBram Moolenaar  try
884e859312eSBram Moolenaar    l[3] = 3
885e859312eSBram Moolenaar  catch /E684:/
886e859312eSBram Moolenaar    n = 300
887e859312eSBram Moolenaar  endtry
888e859312eSBram Moolenaar  assert_equal(300, n)
889e859312eSBram Moolenaar
890e859312eSBram Moolenaar  try
891e859312eSBram Moolenaar    unlet g:does_not_exist
892e859312eSBram Moolenaar  catch /E108:/
893e859312eSBram Moolenaar    n = 322
894e859312eSBram Moolenaar  endtry
895e859312eSBram Moolenaar  assert_equal(322, n)
896e859312eSBram Moolenaar
897e859312eSBram Moolenaar  try
898e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
899e859312eSBram Moolenaar  catch /E721:/
900e859312eSBram Moolenaar    n = 333
901e859312eSBram Moolenaar  endtry
902e859312eSBram Moolenaar  assert_equal(333, n)
903e859312eSBram Moolenaar
904e859312eSBram Moolenaar  try
905e859312eSBram Moolenaar    l = DeletedFunc()
906e859312eSBram Moolenaar  catch /E933:/
907e859312eSBram Moolenaar    n = 344
908e859312eSBram Moolenaar  endtry
909e859312eSBram Moolenaar  assert_equal(344, n)
910d032f34aSBram Moolenaar
911d032f34aSBram Moolenaar  try
912d032f34aSBram Moolenaar    echo len(v:true)
913d032f34aSBram Moolenaar  catch /E701:/
914d032f34aSBram Moolenaar    n = 355
915d032f34aSBram Moolenaar  endtry
916d032f34aSBram Moolenaar  assert_equal(355, n)
917d032f34aSBram Moolenaar
918d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
919d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
920d032f34aSBram Moolenaar  try
921d032f34aSBram Moolenaar    echo P()
922d032f34aSBram Moolenaar  catch /E117:/
923d032f34aSBram Moolenaar    n = 366
924d032f34aSBram Moolenaar  endtry
925d032f34aSBram Moolenaar  assert_equal(366, n)
926d032f34aSBram Moolenaar
927d032f34aSBram Moolenaar  try
928d032f34aSBram Moolenaar    echo g:NoSuchFunc()
929d032f34aSBram Moolenaar  catch /E117:/
930d032f34aSBram Moolenaar    n = 377
931d032f34aSBram Moolenaar  endtry
932d032f34aSBram Moolenaar  assert_equal(377, n)
933d032f34aSBram Moolenaar
934d032f34aSBram Moolenaar  try
935d032f34aSBram Moolenaar    echo g:alist + 4
936d032f34aSBram Moolenaar  catch /E745:/
937d032f34aSBram Moolenaar    n = 388
938d032f34aSBram Moolenaar  endtry
939d032f34aSBram Moolenaar  assert_equal(388, n)
940d032f34aSBram Moolenaar
941d032f34aSBram Moolenaar  try
942d032f34aSBram Moolenaar    echo 4 + g:alist
943d032f34aSBram Moolenaar  catch /E745:/
944d032f34aSBram Moolenaar    n = 399
945d032f34aSBram Moolenaar  endtry
946d032f34aSBram Moolenaar  assert_equal(399, n)
947d032f34aSBram Moolenaar
948d032f34aSBram Moolenaar  try
949d032f34aSBram Moolenaar    echo g:alist.member
950d032f34aSBram Moolenaar  catch /E715:/
951d032f34aSBram Moolenaar    n = 400
952d032f34aSBram Moolenaar  endtry
953d032f34aSBram Moolenaar  assert_equal(400, n)
954d032f34aSBram Moolenaar
955d032f34aSBram Moolenaar  try
956d032f34aSBram Moolenaar    echo d.member
957d032f34aSBram Moolenaar  catch /E716:/
958d032f34aSBram Moolenaar    n = 411
959d032f34aSBram Moolenaar  endtry
960d032f34aSBram Moolenaar  assert_equal(411, n)
9618a7d6542SBram Moolenaarenddef
9628a7d6542SBram Moolenaar
963e859312eSBram Moolenaardef DeletedFunc(): list<any>
964e859312eSBram Moolenaar  return ['delete me']
965e859312eSBram Moolenaarenddef
966e859312eSBram Moolenaardefcompile
967e859312eSBram Moolenaardelfunc DeletedFunc
968e859312eSBram Moolenaar
969257cc5eeSBram Moolenaardef ThrowFromDef()
970a72cfb80SBram Moolenaar  throw "getout" # comment
971257cc5eeSBram Moolenaarenddef
972257cc5eeSBram Moolenaar
973257cc5eeSBram Moolenaarfunc CatchInFunc()
974257cc5eeSBram Moolenaar  try
975257cc5eeSBram Moolenaar    call ThrowFromDef()
976257cc5eeSBram Moolenaar  catch
977257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
978257cc5eeSBram Moolenaar  endtry
979257cc5eeSBram Moolenaarendfunc
980257cc5eeSBram Moolenaar
981257cc5eeSBram Moolenaardef CatchInDef()
982257cc5eeSBram Moolenaar  try
983257cc5eeSBram Moolenaar    ThrowFromDef()
984257cc5eeSBram Moolenaar  catch
985257cc5eeSBram Moolenaar    g:thrown_def = v:exception
986257cc5eeSBram Moolenaar  endtry
987257cc5eeSBram Moolenaarenddef
988257cc5eeSBram Moolenaar
989f575adffSBram Moolenaardef ReturnFinally(): string
990f575adffSBram Moolenaar  try
991f575adffSBram Moolenaar    return 'intry'
992f575adffSBram Moolenaar  finally
993f575adffSBram Moolenaar    g:in_finally = 'finally'
994f575adffSBram Moolenaar  endtry
995f575adffSBram Moolenaar  return 'end'
996f575adffSBram Moolenaarenddef
997f575adffSBram Moolenaar
998257cc5eeSBram Moolenaardef Test_try_catch_nested()
999257cc5eeSBram Moolenaar  CatchInFunc()
1000257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1001257cc5eeSBram Moolenaar
1002257cc5eeSBram Moolenaar  CatchInDef()
1003257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1004f575adffSBram Moolenaar
1005f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1006f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1007f575adffSBram Moolenaarenddef
1008f575adffSBram Moolenaar
1009f575adffSBram Moolenaardef Test_try_catch_match()
1010f575adffSBram Moolenaar  let seq = 'a'
1011f575adffSBram Moolenaar  try
1012f575adffSBram Moolenaar    throw 'something'
1013f575adffSBram Moolenaar  catch /nothing/
1014f575adffSBram Moolenaar    seq ..= 'x'
1015f575adffSBram Moolenaar  catch /some/
1016f575adffSBram Moolenaar    seq ..= 'b'
1017f575adffSBram Moolenaar  catch /asdf/
1018f575adffSBram Moolenaar    seq ..= 'x'
1019e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1020e8c4abbbSBram Moolenaar    seq ..= 'y'
1021f575adffSBram Moolenaar  finally
1022f575adffSBram Moolenaar    seq ..= 'c'
1023f575adffSBram Moolenaar  endtry
1024f575adffSBram Moolenaar  assert_equal('abc', seq)
1025257cc5eeSBram Moolenaarenddef
1026257cc5eeSBram Moolenaar
1027e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1028e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1029e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1030e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1031585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1032585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1033585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1034585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1035585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1036585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1037585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1038585fea7bSBram Moolenaar
1039a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1040585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1041e8c4abbbSBram Moolenaarenddef
1042e8c4abbbSBram Moolenaar
1043006ad48bSBram Moolenaardef Test_throw_vimscript()
1044f5be8cdbSBram Moolenaar  # only checks line continuation
1045006ad48bSBram Moolenaar  let lines =<< trim END
1046006ad48bSBram Moolenaar      vim9script
1047006ad48bSBram Moolenaar      try
1048006ad48bSBram Moolenaar        throw 'one'
1049006ad48bSBram Moolenaar              .. 'two'
1050006ad48bSBram Moolenaar      catch
1051006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1052006ad48bSBram Moolenaar      endtry
1053006ad48bSBram Moolenaar  END
1054006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1055006ad48bSBram Moolenaarenddef
1056006ad48bSBram Moolenaar
1057*ed677f55SBram Moolenaardef Test_error_in_nested_function()
1058*ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1059*ed677f55SBram Moolenaar  let lines =<< trim END
1060*ed677f55SBram Moolenaar      vim9script
1061*ed677f55SBram Moolenaar      def Func()
1062*ed677f55SBram Moolenaar        Error()
1063*ed677f55SBram Moolenaar        g:test_var = 1
1064*ed677f55SBram Moolenaar      enddef
1065*ed677f55SBram Moolenaar      func Error() abort
1066*ed677f55SBram Moolenaar        eval [][0]
1067*ed677f55SBram Moolenaar      endfunc
1068*ed677f55SBram Moolenaar      Func()
1069*ed677f55SBram Moolenaar  END
1070*ed677f55SBram Moolenaar  g:test_var = 0
1071*ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1072*ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1073*ed677f55SBram Moolenaarenddef
1074*ed677f55SBram Moolenaar
107537c83711SBram Moolenaardef Test_cexpr_vimscript()
1076f5be8cdbSBram Moolenaar  # only checks line continuation
107737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
107837c83711SBram Moolenaar  let lines =<< trim END
107937c83711SBram Moolenaar      vim9script
108037c83711SBram Moolenaar      cexpr 'File'
108137c83711SBram Moolenaar                .. ' someFile' ..
108237c83711SBram Moolenaar                   ' line 19'
108337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
108437c83711SBram Moolenaar  END
108537c83711SBram Moolenaar  CheckScriptSuccess(lines)
108637c83711SBram Moolenaar  set errorformat&
108737c83711SBram Moolenaarenddef
108837c83711SBram Moolenaar
1089b209750bSBram Moolenaardef Test_list_vimscript()
1090b209750bSBram Moolenaar  # checks line continuation and comments
1091b209750bSBram Moolenaar  let lines =<< trim END
1092b209750bSBram Moolenaar      vim9script
1093b209750bSBram Moolenaar      let mylist = [
1094b209750bSBram Moolenaar            'one',
1095b209750bSBram Moolenaar            # comment
1096b209750bSBram Moolenaar            'two', # empty line follows
1097b209750bSBram Moolenaar
1098b209750bSBram Moolenaar            'three',
1099b209750bSBram Moolenaar            ]
1100b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1101b209750bSBram Moolenaar  END
1102b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1103b209750bSBram Moolenaarenddef
1104b209750bSBram Moolenaar
11052a1381c3SBram Moolenaarif has('channel')
110640ee466cSBram Moolenaar  let someJob = test_null_job()
110740ee466cSBram Moolenaar
110840ee466cSBram Moolenaar  def FuncWithError()
110940ee466cSBram Moolenaar    echomsg g:someJob
111040ee466cSBram Moolenaar  enddef
111140ee466cSBram Moolenaar
111240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
111340ee466cSBram Moolenaar    try
111440ee466cSBram Moolenaar      call FuncWithError()
111540ee466cSBram Moolenaar    catch
111640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
111740ee466cSBram Moolenaar    endtry
111840ee466cSBram Moolenaar  endfunc
11192a1381c3SBram Moolenaarendif
112040ee466cSBram Moolenaar
11218a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11228a7d6542SBram Moolenaar  vim9script
11238a7d6542SBram Moolenaar  let name: string = 'bob'
11248a7d6542SBram Moolenaar  def Concat(arg: string): string
11258a7d6542SBram Moolenaar    return name .. arg
11268a7d6542SBram Moolenaar  enddef
1127227a69deSBram Moolenaar  g:result = Concat('bie')
1128227a69deSBram Moolenaar  g:localname = name
11298a7d6542SBram Moolenaar
11308a7d6542SBram Moolenaar  export const CONST = 1234
11318a7d6542SBram Moolenaar  export let exported = 9876
11326e587dcbSBram Moolenaar  export let exp_name = 'John'
11338a7d6542SBram Moolenaar  export def Exported(): string
11348a7d6542SBram Moolenaar    return 'Exported'
11358a7d6542SBram Moolenaar  enddef
11368a7d6542SBram MoolenaarEND
11378a7d6542SBram Moolenaar
1138b3ca9824SBram Moolenaardef Undo_export_script_lines()
1139b3ca9824SBram Moolenaar  unlet g:result
1140b3ca9824SBram Moolenaar  unlet g:localname
1141b3ca9824SBram Moolenaarenddef
1142b3ca9824SBram Moolenaar
11435269bd2aSBram Moolenaardef Test_vim9_import_export()
11448a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11458a7d6542SBram Moolenaar    vim9script
11468a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11478a7d6542SBram Moolenaar    g:imported = exported
11486e587dcbSBram Moolenaar    exported += 3
11496e587dcbSBram Moolenaar    g:imported_added = exported
11508a7d6542SBram Moolenaar    g:imported_func = Exported()
11516e587dcbSBram Moolenaar
115240f4f7a4SBram Moolenaar    def GetExported(): string
115340f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
115440f4f7a4SBram Moolenaar      return local_dict.ref()
115540f4f7a4SBram Moolenaar    enddef
115640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
115740f4f7a4SBram Moolenaar
11586e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11596e587dcbSBram Moolenaar    g:imported_name = exp_name
11606e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11616e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11625381c7a1SBram Moolenaar    g:imported_later = exported
11638a7d6542SBram Moolenaar  END
11648a7d6542SBram Moolenaar
11658a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11668a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11678a7d6542SBram Moolenaar
11688a7d6542SBram Moolenaar  source Ximport.vim
11698a7d6542SBram Moolenaar
11708a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11718a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11728a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11736e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11745381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11758a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
117640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11776e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11786e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11798a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11808a7d6542SBram Moolenaar
1181b3ca9824SBram Moolenaar  Undo_export_script_lines()
11828a7d6542SBram Moolenaar  unlet g:imported
11836e587dcbSBram Moolenaar  unlet g:imported_added
11845381c7a1SBram Moolenaar  unlet g:imported_later
11858a7d6542SBram Moolenaar  unlet g:imported_func
11866e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11878a7d6542SBram Moolenaar  delete('Ximport.vim')
1188f2d5c240SBram Moolenaar
11891c991144SBram Moolenaar  # similar, with line breaks
11901c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11911c991144SBram Moolenaar    vim9script
11921c991144SBram Moolenaar    import {
11931c991144SBram Moolenaar        exported,
11941c991144SBram Moolenaar        Exported,
11951c991144SBram Moolenaar        }
11961c991144SBram Moolenaar        from
11971c991144SBram Moolenaar        './Xexport.vim'
11981c991144SBram Moolenaar    g:imported = exported
11991c991144SBram Moolenaar    exported += 5
12001c991144SBram Moolenaar    g:imported_added = exported
12011c991144SBram Moolenaar    g:imported_func = Exported()
12021c991144SBram Moolenaar  END
12031c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12041c991144SBram Moolenaar  source Ximport_lbr.vim
12051c991144SBram Moolenaar
12061c991144SBram Moolenaar  assert_equal(9876, g:imported)
12071c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12081c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12091c991144SBram Moolenaar
12101c991144SBram Moolenaar  # exported script not sourced again
12111c991144SBram Moolenaar  assert_false(exists('g:result'))
12121c991144SBram Moolenaar  unlet g:imported
12131c991144SBram Moolenaar  unlet g:imported_added
12141c991144SBram Moolenaar  unlet g:imported_func
12151c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12161c991144SBram Moolenaar
12171c991144SBram Moolenaar  # import inside :def function
12185381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
12195381c7a1SBram Moolenaar    vim9script
12205381c7a1SBram Moolenaar    def ImportInDef()
12215381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12225381c7a1SBram Moolenaar      g:imported = exported
12235381c7a1SBram Moolenaar      exported += 7
12245381c7a1SBram Moolenaar      g:imported_added = exported
12255381c7a1SBram Moolenaar    enddef
12265381c7a1SBram Moolenaar    ImportInDef()
12275381c7a1SBram Moolenaar  END
12285381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12295381c7a1SBram Moolenaar  source Ximport2.vim
1230f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12315381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12325381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12335381c7a1SBram Moolenaar  unlet g:imported
12345381c7a1SBram Moolenaar  unlet g:imported_added
12355381c7a1SBram Moolenaar  delete('Ximport2.vim')
12365381c7a1SBram Moolenaar
1237f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1238f2d5c240SBram Moolenaar    vim9script
1239f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1240f2d5c240SBram Moolenaar    def UseExport()
1241f2d5c240SBram Moolenaar      g:imported = Export.exported
1242f2d5c240SBram Moolenaar    enddef
1243f2d5c240SBram Moolenaar    UseExport()
1244f2d5c240SBram Moolenaar  END
1245f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1246f2d5c240SBram Moolenaar  source Ximport.vim
12475381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1248f2d5c240SBram Moolenaar
1249599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1250599c89c8SBram Moolenaar    vim9script
1251599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1252599c89c8SBram Moolenaar    def Func()
1253599c89c8SBram Moolenaar      let dummy = 1
1254599c89c8SBram Moolenaar      let imported = Export + dummy
1255599c89c8SBram Moolenaar    enddef
1256822ba247SBram Moolenaar    defcompile
1257599c89c8SBram Moolenaar  END
1258599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1259599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1260599c89c8SBram Moolenaar
1261599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1262599c89c8SBram Moolenaar    vim9script
1263599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1264599c89c8SBram Moolenaar    def Func()
1265599c89c8SBram Moolenaar      let imported = Export . exported
1266599c89c8SBram Moolenaar    enddef
1267822ba247SBram Moolenaar    defcompile
1268599c89c8SBram Moolenaar  END
1269599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1270599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1271599c89c8SBram Moolenaar
1272599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1273599c89c8SBram Moolenaar    vim9script
1274599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1275599c89c8SBram Moolenaar    def Func()
1276599c89c8SBram Moolenaar      let imported = Export.
1277599c89c8SBram Moolenaar    enddef
1278822ba247SBram Moolenaar    defcompile
1279599c89c8SBram Moolenaar  END
1280599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1281599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1282599c89c8SBram Moolenaar
12831c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12841c991144SBram Moolenaar    vim9script
12851c991144SBram Moolenaar    import *
12861c991144SBram Moolenaar        as Export
12871c991144SBram Moolenaar        from
12881c991144SBram Moolenaar        './Xexport.vim'
12891c991144SBram Moolenaar    def UseExport()
12901c991144SBram Moolenaar      g:imported = Export.exported
12911c991144SBram Moolenaar    enddef
12921c991144SBram Moolenaar    UseExport()
12931c991144SBram Moolenaar  END
12941c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12951c991144SBram Moolenaar  source Ximport.vim
12961c991144SBram Moolenaar  assert_equal(9883, g:imported)
12971c991144SBram Moolenaar
1298f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1299f2d5c240SBram Moolenaar    vim9script
1300f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1301f2d5c240SBram Moolenaar  END
1302f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1303f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1304f2d5c240SBram Moolenaar
1305f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1306fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1307fa29c8abSBram Moolenaar    vim9script
1308fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1309fa29c8abSBram Moolenaar  END
1310fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1311fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1312fa29c8abSBram Moolenaar
1313f5be8cdbSBram Moolenaar  # try to import something that is already defined
13145269bd2aSBram Moolenaar  let import_already_defined =<< trim END
13155269bd2aSBram Moolenaar    vim9script
13165269bd2aSBram Moolenaar    let exported = 'something'
13175269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13185269bd2aSBram Moolenaar  END
13195269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13205269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13215269bd2aSBram Moolenaar
1322f5be8cdbSBram Moolenaar  # try to import something that is already defined
13235269bd2aSBram Moolenaar  import_already_defined =<< trim END
13245269bd2aSBram Moolenaar    vim9script
13255269bd2aSBram Moolenaar    let exported = 'something'
13265269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13275269bd2aSBram Moolenaar  END
13285269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13295269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13305269bd2aSBram Moolenaar
1331f5be8cdbSBram Moolenaar  # try to import something that is already defined
13325269bd2aSBram Moolenaar  import_already_defined =<< trim END
13335269bd2aSBram Moolenaar    vim9script
13345269bd2aSBram Moolenaar    let exported = 'something'
13355269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13365269bd2aSBram Moolenaar  END
13375269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13385269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13395269bd2aSBram Moolenaar
1340f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1341fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1342fa29c8abSBram Moolenaar    vim9script
1343fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1344fa29c8abSBram Moolenaar  END
1345fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1346fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1347fa29c8abSBram Moolenaar
1348fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1349fa29c8abSBram Moolenaar    vim9script
1350fa29c8abSBram Moolenaar    import name './Xexport.vim'
1351fa29c8abSBram Moolenaar  END
1352fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1353fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1354fa29c8abSBram Moolenaar
1355fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1356fa29c8abSBram Moolenaar    vim9script
1357fa29c8abSBram Moolenaar    import name from Xexport.vim
1358fa29c8abSBram Moolenaar  END
1359fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1360fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1361fa29c8abSBram Moolenaar
1362fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1363fa29c8abSBram Moolenaar    vim9script
1364fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1365fa29c8abSBram Moolenaar  END
1366fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1367fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1368fa29c8abSBram Moolenaar
1369fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1370fa29c8abSBram Moolenaar    vim9script
1371fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1372fa29c8abSBram Moolenaar  END
13735269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13745269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1375fa29c8abSBram Moolenaar
1376f2d5c240SBram Moolenaar  delete('Ximport.vim')
13775269bd2aSBram Moolenaar  delete('Ximport3.vim')
13788a7d6542SBram Moolenaar  delete('Xexport.vim')
13798a7d6542SBram Moolenaar
1380f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1381750802b5SBram Moolenaar  set cpo&vi
1382750802b5SBram Moolenaar  let cpo_before = &cpo
1383750802b5SBram Moolenaar  let lines =<< trim END
1384750802b5SBram Moolenaar    vim9script
1385750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1386750802b5SBram Moolenaar  END
1387750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1388750802b5SBram Moolenaar  source Xvim9_script
1389750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1390750802b5SBram Moolenaar  set cpo&vim
1391750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1392750802b5SBram Moolenaar  delete('Xvim9_script')
1393750802b5SBram Moolenaarenddef
1394750802b5SBram Moolenaar
1395803af686SBram Moolenaarfunc g:Trigger()
1396803af686SBram Moolenaar  source Ximport.vim
1397803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1398803af686SBram Moolenaarendfunc
1399803af686SBram Moolenaar
1400803af686SBram Moolenaardef Test_import_export_expr_map()
1401803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1402803af686SBram Moolenaar  let export_lines =<< trim END
1403803af686SBram Moolenaar    vim9script
1404803af686SBram Moolenaar    export def That(): string
1405803af686SBram Moolenaar      return 'yes'
1406803af686SBram Moolenaar    enddef
1407803af686SBram Moolenaar  END
1408803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1409803af686SBram Moolenaar
1410803af686SBram Moolenaar  let import_lines =<< trim END
1411803af686SBram Moolenaar    vim9script
1412803af686SBram Moolenaar    import That from './Xexport_that.vim'
1413803af686SBram Moolenaar    assert_equal('yes', That())
1414803af686SBram Moolenaar  END
1415803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1416803af686SBram Moolenaar
1417803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1418803af686SBram Moolenaar  feedkeys('trigger', "xt")
1419803af686SBram Moolenaar
1420730b2483SBram Moolenaar  delete('Xexport_that.vim')
1421803af686SBram Moolenaar  delete('Ximport.vim')
1422803af686SBram Moolenaar  nunmap trigger
1423803af686SBram Moolenaarenddef
1424803af686SBram Moolenaar
14258e1986e3SBram Moolenaardef Test_import_in_filetype()
14268e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14278e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14288e1986e3SBram Moolenaar  let export_lines =<< trim END
14298e1986e3SBram Moolenaar    vim9script
14308e1986e3SBram Moolenaar    export let That = 'yes'
14318e1986e3SBram Moolenaar  END
1432730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14338e1986e3SBram Moolenaar
14348e1986e3SBram Moolenaar  let import_lines =<< trim END
14358e1986e3SBram Moolenaar    vim9script
1436730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14378e1986e3SBram Moolenaar    assert_equal('yes', That)
14388e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14398e1986e3SBram Moolenaar  END
14408e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14418e1986e3SBram Moolenaar
14428e1986e3SBram Moolenaar  let save_rtp = &rtp
14438e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14448e1986e3SBram Moolenaar
14458e1986e3SBram Moolenaar  filetype plugin on
14468e1986e3SBram Moolenaar  copen
14478e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14488e1986e3SBram Moolenaar
14498e1986e3SBram Moolenaar  quit!
1450730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14518e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14528e1986e3SBram Moolenaar  &rtp = save_rtp
14538e1986e3SBram Moolenaarenddef
14548e1986e3SBram Moolenaar
1455efa94447SBram Moolenaardef Test_use_import_in_mapping()
1456efa94447SBram Moolenaar  let lines =<< trim END
1457efa94447SBram Moolenaar      vim9script
1458efa94447SBram Moolenaar      export def Funcx()
1459efa94447SBram Moolenaar        g:result = 42
1460efa94447SBram Moolenaar      enddef
1461efa94447SBram Moolenaar  END
1462efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1463efa94447SBram Moolenaar  lines =<< trim END
1464efa94447SBram Moolenaar      vim9script
1465efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1466b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1467efa94447SBram Moolenaar  END
1468efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1469efa94447SBram Moolenaar
1470efa94447SBram Moolenaar  source Xmapscript.vim
1471b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1472efa94447SBram Moolenaar  assert_equal(42, g:result)
1473efa94447SBram Moolenaar
1474efa94447SBram Moolenaar  unlet g:result
1475efa94447SBram Moolenaar  delete('XsomeExport.vim')
1476efa94447SBram Moolenaar  delete('Xmapscript.vim')
1477b3ca9824SBram Moolenaar  nunmap <F3>
1478efa94447SBram Moolenaarenddef
1479efa94447SBram Moolenaar
1480750802b5SBram Moolenaardef Test_vim9script_fails()
14818a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14828a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1483750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
14849721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
14859b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1486750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1487750802b5SBram Moolenaar
1488c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1489c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1490c785b9a7SBram Moolenaar
1491750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1492a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
14938a7d6542SBram Moolenaarenddef
14948a7d6542SBram Moolenaar
1495f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1496101f4810SBram Moolenaar  CheckRunVimInTerminal
1497101f4810SBram Moolenaar
14989bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1499c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15009bb3eb3eSBram Moolenaarendfunc
15019bb3eb3eSBram Moolenaar
1502c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1503101f4810SBram Moolenaar  let export =<< trim END
1504101f4810SBram Moolenaar    vim9script
1505101f4810SBram Moolenaar    export def Foo(): number
1506101f4810SBram Moolenaar        return 0
1507101f4810SBram Moolenaar    enddef
1508101f4810SBram Moolenaar  END
1509730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1510101f4810SBram Moolenaar
1511730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15129bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15139bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1514101f4810SBram Moolenaar
1515730b2483SBram Moolenaar  delete('XexportCmd.vim')
15169bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15179bb3eb3eSBram Moolenaarenddef
1518101f4810SBram Moolenaar
15194c17ad94SBram Moolenaardef Test_vim9script_reload_import()
15208a7d6542SBram Moolenaar  let lines =<< trim END
15218a7d6542SBram Moolenaar    vim9script
15228a7d6542SBram Moolenaar    const var = ''
15238a7d6542SBram Moolenaar    let valone = 1234
15248a7d6542SBram Moolenaar    def MyFunc(arg: string)
15258a7d6542SBram Moolenaar       valone = 5678
15268a7d6542SBram Moolenaar    enddef
15278a7d6542SBram Moolenaar  END
15288a7d6542SBram Moolenaar  let morelines =<< trim END
15298a7d6542SBram Moolenaar    let valtwo = 222
15308a7d6542SBram Moolenaar    export def GetValtwo(): number
15318a7d6542SBram Moolenaar      return valtwo
15328a7d6542SBram Moolenaar    enddef
15338a7d6542SBram Moolenaar  END
153403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15358a7d6542SBram Moolenaar  source Xreload.vim
15368a7d6542SBram Moolenaar  source Xreload.vim
15378a7d6542SBram Moolenaar  source Xreload.vim
15388a7d6542SBram Moolenaar
15398a7d6542SBram Moolenaar  let testlines =<< trim END
15408a7d6542SBram Moolenaar    vim9script
15418a7d6542SBram Moolenaar    def TheFunc()
15428a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15438a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15448a7d6542SBram Moolenaar    enddef
15458a7d6542SBram Moolenaar    TheFunc()
15468a7d6542SBram Moolenaar  END
15478a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15488a7d6542SBram Moolenaar  source Ximport.vim
15498a7d6542SBram Moolenaar
1550f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1551f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15528a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15538a7d6542SBram Moolenaar  source Ximport.vim
15548a7d6542SBram Moolenaar
1555f5be8cdbSBram Moolenaar  # cannot declare a var twice
15568a7d6542SBram Moolenaar  lines =<< trim END
15578a7d6542SBram Moolenaar    vim9script
15588a7d6542SBram Moolenaar    let valone = 1234
15598a7d6542SBram Moolenaar    let valone = 5678
15608a7d6542SBram Moolenaar  END
15618a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15628a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
15638a7d6542SBram Moolenaar
15648a7d6542SBram Moolenaar  delete('Xreload.vim')
15658a7d6542SBram Moolenaar  delete('Ximport.vim')
15668a7d6542SBram Moolenaarenddef
15678a7d6542SBram Moolenaar
1568fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1569fe465a01SBram Moolenaar" script-local name.
1570fe465a01SBram Moolenaardef Test_vim9script_funcref()
1571fe465a01SBram Moolenaar  let sortlines =<< trim END
1572fe465a01SBram Moolenaar      vim9script
1573fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1574bed36b93SBram Moolenaar        return i2 - i1
1575fe465a01SBram Moolenaar      enddef
1576fe465a01SBram Moolenaar
1577fe465a01SBram Moolenaar      export def FastSort(): list<number>
1578fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1579fe465a01SBram Moolenaar      enddef
1580fe465a01SBram Moolenaar  END
1581fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1582fe465a01SBram Moolenaar
1583fe465a01SBram Moolenaar  let lines =<< trim END
1584fe465a01SBram Moolenaar    vim9script
1585fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1586fe465a01SBram Moolenaar    def Test()
1587fe465a01SBram Moolenaar      g:result = FastSort()
1588fe465a01SBram Moolenaar    enddef
1589fe465a01SBram Moolenaar    Test()
1590fe465a01SBram Moolenaar  END
1591fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1592fe465a01SBram Moolenaar
1593fe465a01SBram Moolenaar  source Xscript.vim
1594fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1595fe465a01SBram Moolenaar
1596fe465a01SBram Moolenaar  unlet g:result
1597fe465a01SBram Moolenaar  delete('Xsort.vim')
1598fe465a01SBram Moolenaar  delete('Xscript.vim')
1599fe465a01SBram Moolenaarenddef
1600fe465a01SBram Moolenaar
1601c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1602c620c055SBram Moolenaar" script where FastFilter() is called from.
1603c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1604c620c055SBram Moolenaar  let filterLines =<< trim END
1605c620c055SBram Moolenaar    vim9script
1606c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1607c620c055SBram Moolenaar      return idx % 2 == 1
1608c620c055SBram Moolenaar    enddef
1609c620c055SBram Moolenaar    export def FastFilter(): list<number>
1610c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1611c620c055SBram Moolenaar    enddef
1612c620c055SBram Moolenaar  END
1613c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1614c620c055SBram Moolenaar
1615c620c055SBram Moolenaar  let lines =<< trim END
1616c620c055SBram Moolenaar    vim9script
1617c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1618c620c055SBram Moolenaar    def Test()
1619c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1620c620c055SBram Moolenaar    enddef
1621c620c055SBram Moolenaar    Test()
1622c620c055SBram Moolenaar  END
1623c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1624c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1625c620c055SBram Moolenaar
1626c620c055SBram Moolenaar  delete('Xfilter.vim')
1627c620c055SBram Moolenaar  delete('Ximport.vim')
1628c620c055SBram Moolenaarenddef
1629c620c055SBram Moolenaar
16304c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
16314c17ad94SBram Moolenaar  let first_lines =<< trim END
16324c17ad94SBram Moolenaar    vim9script
16334c17ad94SBram Moolenaar    def FuncYes(): string
16344c17ad94SBram Moolenaar      return 'yes'
16354c17ad94SBram Moolenaar    enddef
16364c17ad94SBram Moolenaar  END
163703afdcf1SBram Moolenaar  let withno_lines =<< trim END
16384c17ad94SBram Moolenaar    def FuncNo(): string
16394c17ad94SBram Moolenaar      return 'no'
16404c17ad94SBram Moolenaar    enddef
16414c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16424c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16434c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
164403afdcf1SBram Moolenaar    enddef
164503afdcf1SBram Moolenaar  END
164603afdcf1SBram Moolenaar  let nono_lines =<< trim END
164703afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
164803afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
16494c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
16504c17ad94SBram Moolenaar    enddef
16514c17ad94SBram Moolenaar  END
16524c17ad94SBram Moolenaar
16534c17ad94SBram Moolenaar  # FuncNo() is defined
165403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16554c17ad94SBram Moolenaar  source Xreloaded.vim
16564c17ad94SBram Moolenaar  g:DoCheck(true)
16574c17ad94SBram Moolenaar
16584c17ad94SBram Moolenaar  # FuncNo() is not redefined
165903afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16604c17ad94SBram Moolenaar  source Xreloaded.vim
166103afdcf1SBram Moolenaar  g:DoCheck()
16624c17ad94SBram Moolenaar
16634c17ad94SBram Moolenaar  # FuncNo() is back
166403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16654c17ad94SBram Moolenaar  source Xreloaded.vim
166603afdcf1SBram Moolenaar  g:DoCheck()
16674c17ad94SBram Moolenaar
16684c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16694c17ad94SBram Moolenaarenddef
16704c17ad94SBram Moolenaar
167189483d40SBram Moolenaardef Test_vim9script_reload_delvar()
167289483d40SBram Moolenaar  # write the script with a script-local variable
167389483d40SBram Moolenaar  let lines =<< trim END
167489483d40SBram Moolenaar    vim9script
167589483d40SBram Moolenaar    let var = 'string'
167689483d40SBram Moolenaar  END
167789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
167889483d40SBram Moolenaar  source XreloadVar.vim
167989483d40SBram Moolenaar
168089483d40SBram Moolenaar  # now write the script using the same variable locally - works
168189483d40SBram Moolenaar  lines =<< trim END
168289483d40SBram Moolenaar    vim9script
168389483d40SBram Moolenaar    def Func()
168489483d40SBram Moolenaar      let var = 'string'
168589483d40SBram Moolenaar    enddef
168689483d40SBram Moolenaar  END
168789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
168889483d40SBram Moolenaar  source XreloadVar.vim
168989483d40SBram Moolenaar
169089483d40SBram Moolenaar  delete('XreloadVar.vim')
169189483d40SBram Moolenaarenddef
169289483d40SBram Moolenaar
16938a7d6542SBram Moolenaardef Test_import_absolute()
16948a7d6542SBram Moolenaar  let import_lines = [
1695e6085c53SBram Moolenaar        'vim9script',
1696e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1697e6085c53SBram Moolenaar        'def UseExported()',
1698e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1699e6085c53SBram Moolenaar        '  exported = 8888',
1700e6085c53SBram Moolenaar        '  g:imported_after = exported',
1701e6085c53SBram Moolenaar        'enddef',
1702e6085c53SBram Moolenaar        'UseExported()',
1703e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1704e6085c53SBram Moolenaar        ]
17058a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17068a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17078a7d6542SBram Moolenaar
17088a7d6542SBram Moolenaar  source Ximport_abs.vim
17098a7d6542SBram Moolenaar
17108a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17114e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1712675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1713675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1714675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1715675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1716675f716eSBram Moolenaar          'exported = 8888.*' ..
1717675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1718675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1719675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1720675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1721e6085c53SBram Moolenaar        g:import_disassembled)
1722b3ca9824SBram Moolenaar
1723b3ca9824SBram Moolenaar  Undo_export_script_lines()
17248a7d6542SBram Moolenaar  unlet g:imported_abs
17254e12a5dfSBram Moolenaar  unlet g:import_disassembled
17268a7d6542SBram Moolenaar
17278a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17288a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17298a7d6542SBram Moolenaarenddef
17308a7d6542SBram Moolenaar
17318a7d6542SBram Moolenaardef Test_import_rtp()
17328a7d6542SBram Moolenaar  let import_lines = [
1733e6085c53SBram Moolenaar        'vim9script',
1734e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1735e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1736e6085c53SBram Moolenaar        ]
17378a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17388a7d6542SBram Moolenaar  mkdir('import')
17398a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17408a7d6542SBram Moolenaar
17418a7d6542SBram Moolenaar  let save_rtp = &rtp
17428a7d6542SBram Moolenaar  &rtp = getcwd()
17438a7d6542SBram Moolenaar  source Ximport_rtp.vim
17448a7d6542SBram Moolenaar  &rtp = save_rtp
17458a7d6542SBram Moolenaar
17468a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17478a7d6542SBram Moolenaar
1748b3ca9824SBram Moolenaar  Undo_export_script_lines()
1749b3ca9824SBram Moolenaar  unlet g:imported_rtp
17508a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
175189483d40SBram Moolenaar  delete('import', 'rf')
17528a7d6542SBram Moolenaarenddef
17538a7d6542SBram Moolenaar
175425e0f586SBram Moolenaardef Test_import_compile_error()
175525e0f586SBram Moolenaar  let export_lines = [
175625e0f586SBram Moolenaar        'vim9script',
175725e0f586SBram Moolenaar        'export def ExpFunc(): string',
175825e0f586SBram Moolenaar        '  return notDefined',
175925e0f586SBram Moolenaar        'enddef',
176025e0f586SBram Moolenaar        ]
176125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
176225e0f586SBram Moolenaar
176325e0f586SBram Moolenaar  let import_lines = [
176425e0f586SBram Moolenaar        'vim9script',
176525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
176625e0f586SBram Moolenaar        'def ImpFunc()',
176725e0f586SBram Moolenaar        '  echo ExpFunc()',
176825e0f586SBram Moolenaar        'enddef',
176925e0f586SBram Moolenaar        'defcompile',
177025e0f586SBram Moolenaar        ]
177125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
177225e0f586SBram Moolenaar
177325e0f586SBram Moolenaar  try
177425e0f586SBram Moolenaar    source Ximport.vim
177525e0f586SBram Moolenaar  catch /E1001/
1776f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
177725e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
177825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
177925e0f586SBram Moolenaar  endtry
178025e0f586SBram Moolenaar
178125e0f586SBram Moolenaar  delete('Xexported.vim')
178225e0f586SBram Moolenaar  delete('Ximport.vim')
178325e0f586SBram Moolenaarenddef
178425e0f586SBram Moolenaar
1785eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1786eef2102eSBram Moolenaar  let export_lines =<< trim END
1787eef2102eSBram Moolenaar      vim9script
1788eef2102eSBram Moolenaar      export def Func()
1789eef2102eSBram Moolenaar        echo 'imported'
1790eef2102eSBram Moolenaar      enddef
1791eef2102eSBram Moolenaar  END
1792eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1793eef2102eSBram Moolenaar
1794eef2102eSBram Moolenaar  let lines =<< trim END
1795eef2102eSBram Moolenaar    vim9script
1796eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1797eef2102eSBram Moolenaar    def Func()
1798eef2102eSBram Moolenaar      echo 'local to function'
1799eef2102eSBram Moolenaar    enddef
1800eef2102eSBram Moolenaar  END
1801eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1802eef2102eSBram Moolenaar
1803eef2102eSBram Moolenaar  lines =<< trim END
1804eef2102eSBram Moolenaar    vim9script
1805eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1806eef2102eSBram Moolenaar    def Outer()
1807eef2102eSBram Moolenaar      def Func()
1808eef2102eSBram Moolenaar        echo 'local to function'
1809eef2102eSBram Moolenaar      enddef
1810eef2102eSBram Moolenaar    enddef
1811eef2102eSBram Moolenaar    defcompile
1812eef2102eSBram Moolenaar  END
1813eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1814eef2102eSBram Moolenaar
1815eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1816eef2102eSBram Moolenaarenddef
1817eef2102eSBram Moolenaar
1818b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1819b9a2cac3SBram Moolenaar  let lines =<< trim END
1820b9a2cac3SBram Moolenaar    vim9script
1821b9a2cac3SBram Moolenaar    def Func()
1822b9a2cac3SBram Moolenaar      echo 'one'
1823b9a2cac3SBram Moolenaar    enddef
1824b9a2cac3SBram Moolenaar    def Func()
1825b9a2cac3SBram Moolenaar      echo 'two'
1826b9a2cac3SBram Moolenaar    enddef
1827b9a2cac3SBram Moolenaar  END
1828b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1829fa211f3cSBram Moolenaar
1830fa211f3cSBram Moolenaar  lines =<< trim END
1831fa211f3cSBram Moolenaar    vim9script
1832fa211f3cSBram Moolenaar    def Foo(): string
1833fa211f3cSBram Moolenaar      return 'foo'
1834fa211f3cSBram Moolenaar      enddef
1835fa211f3cSBram Moolenaar    def Func()
1836fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1837fa211f3cSBram Moolenaar    enddef
1838fa211f3cSBram Moolenaar    defcompile
1839fa211f3cSBram Moolenaar  END
1840fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1841b9a2cac3SBram Moolenaarenddef
1842b9a2cac3SBram Moolenaar
18438a7d6542SBram Moolenaardef Test_fixed_size_list()
1844f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
18458a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
18468a7d6542SBram Moolenaar  l->remove(0)
18478a7d6542SBram Moolenaar  l->add(5)
18488a7d6542SBram Moolenaar  l->insert(99, 1)
18490f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18508a7d6542SBram Moolenaarenddef
18518a7d6542SBram Moolenaar
1852ae616494SBram Moolenaardef Test_no_insert_xit()
1853ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1854ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1855f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1856f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1857f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1858ae616494SBram Moolenaar
1859ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1860ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1861ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1862ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1863f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1864f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1865f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1866f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1867f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1868ae616494SBram Moolenaarenddef
1869ae616494SBram Moolenaar
1870158906cfSBram Moolenaardef IfElse(what: number): string
1871158906cfSBram Moolenaar  let res = ''
1872158906cfSBram Moolenaar  if what == 1
1873158906cfSBram Moolenaar    res = "one"
1874158906cfSBram Moolenaar  elseif what == 2
1875158906cfSBram Moolenaar    res = "two"
1876a259d8d3SBram Moolenaar  else
1877158906cfSBram Moolenaar    res = "three"
1878a259d8d3SBram Moolenaar  endif
1879158906cfSBram Moolenaar  return res
1880a259d8d3SBram Moolenaarenddef
1881a259d8d3SBram Moolenaar
1882158906cfSBram Moolenaardef Test_if_elseif_else()
1883158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1884158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1885158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18860f18b6d1SBram Moolenaarenddef
18870f18b6d1SBram Moolenaar
1888e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1889e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1890e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1891e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1892e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1893585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1894e8c4abbbSBram Moolenaarenddef
1895e8c4abbbSBram Moolenaar
18966d69bf60SBram Moolenaarlet g:bool_true = v:true
18976d69bf60SBram Moolenaarlet g:bool_false = v:false
18986d69bf60SBram Moolenaar
18996d69bf60SBram Moolenaardef Test_if_const_expr()
19006d69bf60SBram Moolenaar  let res = false
19016d69bf60SBram Moolenaar  if true ? true : false
19026d69bf60SBram Moolenaar    res = true
19036d69bf60SBram Moolenaar  endif
19046d69bf60SBram Moolenaar  assert_equal(true, res)
19056d69bf60SBram Moolenaar
1906585fea7bSBram Moolenaar  g:glob = 2
1907585fea7bSBram Moolenaar  if false
19086797966dSBram Moolenaar    execute('g:glob = 3')
1909585fea7bSBram Moolenaar  endif
1910585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1911585fea7bSBram Moolenaar  if true
19126797966dSBram Moolenaar    execute('g:glob = 3')
1913585fea7bSBram Moolenaar  endif
1914585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1915585fea7bSBram Moolenaar
19166d69bf60SBram Moolenaar  res = false
19176d69bf60SBram Moolenaar  if g:bool_true ? true : false
19186d69bf60SBram Moolenaar    res = true
19196d69bf60SBram Moolenaar  endif
19206d69bf60SBram Moolenaar  assert_equal(true, res)
19216d69bf60SBram Moolenaar
19226d69bf60SBram Moolenaar  res = false
19236d69bf60SBram Moolenaar  if true ? g:bool_true : false
19246d69bf60SBram Moolenaar    res = true
19256d69bf60SBram Moolenaar  endif
19266d69bf60SBram Moolenaar  assert_equal(true, res)
19276d69bf60SBram Moolenaar
19286d69bf60SBram Moolenaar  res = false
19296d69bf60SBram Moolenaar  if true ? true : g:bool_false
19306d69bf60SBram Moolenaar    res = true
19316d69bf60SBram Moolenaar  endif
19326d69bf60SBram Moolenaar  assert_equal(true, res)
19336d69bf60SBram Moolenaar
19346d69bf60SBram Moolenaar  res = false
19356d69bf60SBram Moolenaar  if true ? false : true
19366d69bf60SBram Moolenaar    res = true
19376d69bf60SBram Moolenaar  endif
19386d69bf60SBram Moolenaar  assert_equal(false, res)
19396d69bf60SBram Moolenaar
19406d69bf60SBram Moolenaar  res = false
19416d69bf60SBram Moolenaar  if false ? false : true
19426d69bf60SBram Moolenaar    res = true
19436d69bf60SBram Moolenaar  endif
19446d69bf60SBram Moolenaar  assert_equal(true, res)
19456d69bf60SBram Moolenaar
19466d69bf60SBram Moolenaar  res = false
19476d69bf60SBram Moolenaar  if false ? true : false
19486d69bf60SBram Moolenaar    res = true
19496d69bf60SBram Moolenaar  endif
19506d69bf60SBram Moolenaar  assert_equal(false, res)
19516d69bf60SBram Moolenaar
19526d69bf60SBram Moolenaar  res = false
1953e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1954e8c4abbbSBram Moolenaar    res = true
1955e8c4abbbSBram Moolenaar  endif
1956e8c4abbbSBram Moolenaar  assert_equal(false, res)
1957e8c4abbbSBram Moolenaar
1958e8c4abbbSBram Moolenaar  res = false
19596d69bf60SBram Moolenaar  if true && true
19606d69bf60SBram Moolenaar    res = true
19616d69bf60SBram Moolenaar  endif
19626d69bf60SBram Moolenaar  assert_equal(true, res)
19636d69bf60SBram Moolenaar
19646d69bf60SBram Moolenaar  res = false
19656d69bf60SBram Moolenaar  if true && false
19666d69bf60SBram Moolenaar    res = true
19676d69bf60SBram Moolenaar  endif
19686d69bf60SBram Moolenaar  assert_equal(false, res)
19696d69bf60SBram Moolenaar
19706d69bf60SBram Moolenaar  res = false
19716d69bf60SBram Moolenaar  if g:bool_true && false
19726d69bf60SBram Moolenaar    res = true
19736d69bf60SBram Moolenaar  endif
19746d69bf60SBram Moolenaar  assert_equal(false, res)
19756d69bf60SBram Moolenaar
19766d69bf60SBram Moolenaar  res = false
19776d69bf60SBram Moolenaar  if true && g:bool_false
19786d69bf60SBram Moolenaar    res = true
19796d69bf60SBram Moolenaar  endif
19806d69bf60SBram Moolenaar  assert_equal(false, res)
19816d69bf60SBram Moolenaar
19826d69bf60SBram Moolenaar  res = false
19836d69bf60SBram Moolenaar  if false && false
19846d69bf60SBram Moolenaar    res = true
19856d69bf60SBram Moolenaar  endif
19866d69bf60SBram Moolenaar  assert_equal(false, res)
19876d69bf60SBram Moolenaar
19886d69bf60SBram Moolenaar  res = false
19896d69bf60SBram Moolenaar  if true || false
19906d69bf60SBram Moolenaar    res = true
19916d69bf60SBram Moolenaar  endif
19926d69bf60SBram Moolenaar  assert_equal(true, res)
19936d69bf60SBram Moolenaar
19946d69bf60SBram Moolenaar  res = false
19956d69bf60SBram Moolenaar  if g:bool_true || false
19966d69bf60SBram Moolenaar    res = true
19976d69bf60SBram Moolenaar  endif
19986d69bf60SBram Moolenaar  assert_equal(true, res)
19996d69bf60SBram Moolenaar
20006d69bf60SBram Moolenaar  res = false
20016d69bf60SBram Moolenaar  if true || g:bool_false
20026d69bf60SBram Moolenaar    res = true
20036d69bf60SBram Moolenaar  endif
20046d69bf60SBram Moolenaar  assert_equal(true, res)
20056d69bf60SBram Moolenaar
20066d69bf60SBram Moolenaar  res = false
20076d69bf60SBram Moolenaar  if false || false
20086d69bf60SBram Moolenaar    res = true
20096d69bf60SBram Moolenaar  endif
20106d69bf60SBram Moolenaar  assert_equal(false, res)
201180c34ca3SBram Moolenaarenddef
20126d69bf60SBram Moolenaar
201380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
201480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
201580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2016e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2017e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20186d69bf60SBram Moolenaarenddef
20196d69bf60SBram Moolenaar
202072abcf42SBram Moolenaardef RunNested(i: number): number
202172abcf42SBram Moolenaar  let x: number = 0
202272abcf42SBram Moolenaar  if i % 2
202372abcf42SBram Moolenaar    if 1
2024f5be8cdbSBram Moolenaar      # comment
202572abcf42SBram Moolenaar    else
2026f5be8cdbSBram Moolenaar      # comment
202772abcf42SBram Moolenaar    endif
202872abcf42SBram Moolenaar    x += 1
202972abcf42SBram Moolenaar  else
203072abcf42SBram Moolenaar    x += 1000
203172abcf42SBram Moolenaar  endif
203272abcf42SBram Moolenaar  return x
203372abcf42SBram Moolenaarenddef
203472abcf42SBram Moolenaar
203572abcf42SBram Moolenaardef Test_nested_if()
203672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
203772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
203872abcf42SBram Moolenaarenddef
203972abcf42SBram Moolenaar
2040ad39c094SBram Moolenaardef Test_execute_cmd()
2041ad39c094SBram Moolenaar  new
2042ad39c094SBram Moolenaar  setline(1, 'default')
2043ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2044ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2045a72cfb80SBram Moolenaar
2046a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2047a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2048a72cfb80SBram Moolenaar
2049ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2050ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2051a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2052ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2053a72cfb80SBram Moolenaar
2054ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2055ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2056a72cfb80SBram Moolenaar
2057ad39c094SBram Moolenaar  let cmd_first = 'call '
2058ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2059ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2060ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2061ad39c094SBram Moolenaar  bwipe!
2062585fea7bSBram Moolenaar
20632d6b20d6SBram Moolenaar  let n = true
20642d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20652d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20662d6b20d6SBram Moolenaar
2067585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2068a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2069ad39c094SBram Moolenaarenddef
2070ad39c094SBram Moolenaar
207147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2072f5be8cdbSBram Moolenaar  # only checks line continuation
207347e880d6SBram Moolenaar  let lines =<< trim END
207447e880d6SBram Moolenaar      vim9script
207547e880d6SBram Moolenaar      execute 'g:someVar'
207647e880d6SBram Moolenaar                .. ' = ' ..
207747e880d6SBram Moolenaar                   '28'
207847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
207947e880d6SBram Moolenaar      unlet g:someVar
208047e880d6SBram Moolenaar  END
208147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
208247e880d6SBram Moolenaarenddef
208347e880d6SBram Moolenaar
2084ad39c094SBram Moolenaardef Test_echo_cmd()
2085a72cfb80SBram Moolenaar  echo 'some' # comment
2086585fea7bSBram Moolenaar  echon 'thing'
2087ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2088ad39c094SBram Moolenaar
2089a72cfb80SBram Moolenaar  echo "some" # comment
2090a72cfb80SBram Moolenaar  echon "thing"
2091a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2092a72cfb80SBram Moolenaar
2093ad39c094SBram Moolenaar  let str1 = 'some'
2094ad39c094SBram Moolenaar  let str2 = 'more'
2095ad39c094SBram Moolenaar  echo str1 str2
2096ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2097a72cfb80SBram Moolenaar
2098a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2099ad39c094SBram Moolenaarenddef
2100ad39c094SBram Moolenaar
2101f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2102f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2103f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2104f93c7feaSBram Moolenaar  echo 'clear'
2105df069eecSBram Moolenaar  :1messages
2106f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2107f93c7feaSBram Moolenaar
2108f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2109f93c7feaSBram Moolenaarenddef
2110f93c7feaSBram Moolenaar
211147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2112f5be8cdbSBram Moolenaar  # only checks line continuation
211347e880d6SBram Moolenaar  let lines =<< trim END
211447e880d6SBram Moolenaar      vim9script
211547e880d6SBram Moolenaar      echomsg 'here'
211647e880d6SBram Moolenaar                .. ' is ' ..
211747e880d6SBram Moolenaar                   'a message'
211847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
211947e880d6SBram Moolenaar  END
212047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
212147e880d6SBram Moolenaarenddef
212247e880d6SBram Moolenaar
2123f93c7feaSBram Moolenaardef Test_echoerr_cmd()
212440ee466cSBram Moolenaar  try
212540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
212640ee466cSBram Moolenaar  catch
212740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
212840ee466cSBram Moolenaar  endtry
2129f93c7feaSBram Moolenaarenddef
2130f93c7feaSBram Moolenaar
213147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2132f5be8cdbSBram Moolenaar  # only checks line continuation
213347e880d6SBram Moolenaar  let lines =<< trim END
213447e880d6SBram Moolenaar      vim9script
213547e880d6SBram Moolenaar      try
213647e880d6SBram Moolenaar        echoerr 'this'
213747e880d6SBram Moolenaar                .. ' is ' ..
213847e880d6SBram Moolenaar                   'wrong'
213947e880d6SBram Moolenaar      catch
214047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
214147e880d6SBram Moolenaar      endtry
214247e880d6SBram Moolenaar  END
214347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
214447e880d6SBram Moolenaarenddef
214547e880d6SBram Moolenaar
214641fe0617SBram Moolenaardef Test_for_outside_of_function()
214741fe0617SBram Moolenaar  let lines =<< trim END
214841fe0617SBram Moolenaar    vim9script
214941fe0617SBram Moolenaar    new
215041fe0617SBram Moolenaar    for var in range(0, 3)
215141fe0617SBram Moolenaar      append(line('$'), var)
215241fe0617SBram Moolenaar    endfor
215341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
215441fe0617SBram Moolenaar    bwipe!
215541fe0617SBram Moolenaar  END
215641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
215741fe0617SBram Moolenaar  source Xvim9for.vim
215841fe0617SBram Moolenaar  delete('Xvim9for.vim')
215941fe0617SBram Moolenaarenddef
21608a7d6542SBram Moolenaar
2161e8c4abbbSBram Moolenaardef Test_for_loop()
2162e8c4abbbSBram Moolenaar  let result = ''
2163e8c4abbbSBram Moolenaar  for cnt in range(7)
2164e8c4abbbSBram Moolenaar    if cnt == 4
2165e8c4abbbSBram Moolenaar      break
2166e8c4abbbSBram Moolenaar    endif
2167e8c4abbbSBram Moolenaar    if cnt == 2
2168e8c4abbbSBram Moolenaar      continue
2169e8c4abbbSBram Moolenaar    endif
2170e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2171e8c4abbbSBram Moolenaar  endfor
2172e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21730ad3e894SBram Moolenaar
21740ad3e894SBram Moolenaar  let concat = ''
21750ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21760ad3e894SBram Moolenaar    concat ..= str
21770ad3e894SBram Moolenaar  endfor
21780ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2179e8c4abbbSBram Moolenaarenddef
2180e8c4abbbSBram Moolenaar
2181e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2182675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2183675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2184675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2185822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21860ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2187675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2188675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2189675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2190e8c4abbbSBram Moolenaarenddef
2191e8c4abbbSBram Moolenaar
2192d0df1aacSBram Moolenaardef Test_while_loop()
2193d0df1aacSBram Moolenaar  let result = ''
2194d0df1aacSBram Moolenaar  let cnt = 0
2195d0df1aacSBram Moolenaar  while cnt < 555
2196d0df1aacSBram Moolenaar    if cnt == 3
2197d0df1aacSBram Moolenaar      break
2198d0df1aacSBram Moolenaar    endif
2199d0df1aacSBram Moolenaar    cnt += 1
2200d0df1aacSBram Moolenaar    if cnt == 2
2201d0df1aacSBram Moolenaar      continue
2202d0df1aacSBram Moolenaar    endif
2203d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2204d0df1aacSBram Moolenaar  endwhile
2205d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2206d0df1aacSBram Moolenaarenddef
2207d0df1aacSBram Moolenaar
2208e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2209675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2210675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2211675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2212675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2213675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2214675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2215675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2216bd5da371SBram Moolenaarenddef
2217bd5da371SBram Moolenaar
22189645e2d9SBram Moolenaardef Test_interrupt_loop()
221997acfc78SBram Moolenaar  let caught = false
22209645e2d9SBram Moolenaar  let x = 0
222197acfc78SBram Moolenaar  try
22229645e2d9SBram Moolenaar    while 1
22239645e2d9SBram Moolenaar      x += 1
22249645e2d9SBram Moolenaar      if x == 100
22259645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22269645e2d9SBram Moolenaar      endif
22279645e2d9SBram Moolenaar    endwhile
222897acfc78SBram Moolenaar  catch
222997acfc78SBram Moolenaar    caught = true
223097acfc78SBram Moolenaar    assert_equal(100, x)
223197acfc78SBram Moolenaar  endtry
223297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
22339645e2d9SBram Moolenaarenddef
223420431c9dSBram Moolenaar
22354fdae999SBram Moolenaardef Test_automatic_line_continuation()
22364fdae999SBram Moolenaar  let mylist = [
22374fdae999SBram Moolenaar      'one',
22384fdae999SBram Moolenaar      'two',
22394fdae999SBram Moolenaar      'three',
2240f5be8cdbSBram Moolenaar      ] # comment
22414fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
22424fdae999SBram Moolenaar
22434fdae999SBram Moolenaar  let mydict = {
22444fdae999SBram Moolenaar      'one': 1,
22454fdae999SBram Moolenaar      'two': 2,
22464fdae999SBram Moolenaar      'three':
22474fdae999SBram Moolenaar          3,
2248f5be8cdbSBram Moolenaar      } # comment
22494fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
22504fdae999SBram Moolenaar  mydict = #{
22512c330432SBram Moolenaar      one: 1,  # comment
22522c330432SBram Moolenaar      two:     # comment
22532c330432SBram Moolenaar           2,  # comment
22542c330432SBram Moolenaar      three: 3 # comment
22552c330432SBram Moolenaar      }
22562c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
22572c330432SBram Moolenaar  mydict = #{
22582c330432SBram Moolenaar      one: 1,
22594fdae999SBram Moolenaar      two:
22604fdae999SBram Moolenaar           2,
22612c330432SBram Moolenaar      three: 3
22624fdae999SBram Moolenaar      }
22634fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2264e6085c53SBram Moolenaar
2265e6085c53SBram Moolenaar  assert_equal(
2266e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2267e6085c53SBram Moolenaar        split('one two three')
2268e6085c53SBram Moolenaar        )
22694fdae999SBram Moolenaarenddef
22704fdae999SBram Moolenaar
22717a092245SBram Moolenaardef Test_vim9_comment()
22727a092245SBram Moolenaar  CheckScriptSuccess([
22737a092245SBram Moolenaar      'vim9script',
22747a092245SBram Moolenaar      '# something',
22757a092245SBram Moolenaar      ])
22767a092245SBram Moolenaar  CheckScriptFailure([
22777a092245SBram Moolenaar      'vim9script',
22787a092245SBram Moolenaar      ':# something',
22797a092245SBram Moolenaar      ], 'E488:')
22807a092245SBram Moolenaar  CheckScriptFailure([
22817a092245SBram Moolenaar      '# something',
22827a092245SBram Moolenaar      ], 'E488:')
22837a092245SBram Moolenaar  CheckScriptFailure([
22847a092245SBram Moolenaar      ':# something',
22857a092245SBram Moolenaar      ], 'E488:')
22867a092245SBram Moolenaar
22874a8d9f2eSBram Moolenaar  { # block start
22884a8d9f2eSBram Moolenaar  } # block end
22894a8d9f2eSBram Moolenaar  CheckDefFailure([
22904a8d9f2eSBram Moolenaar      '{# comment',
22914a8d9f2eSBram Moolenaar      ], 'E488:')
22924a8d9f2eSBram Moolenaar  CheckDefFailure([
22934a8d9f2eSBram Moolenaar      '{',
22944a8d9f2eSBram Moolenaar      '}# comment',
22954a8d9f2eSBram Moolenaar      ], 'E488:')
22964a8d9f2eSBram Moolenaar
22974a8d9f2eSBram Moolenaar  echo "yes" # comment
22984a8d9f2eSBram Moolenaar  CheckDefFailure([
22994a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23004a8d9f2eSBram Moolenaar      ], 'E488:')
23017a092245SBram Moolenaar  CheckScriptSuccess([
23027a092245SBram Moolenaar      'vim9script',
23037a092245SBram Moolenaar      'echo "yes" # something',
23047a092245SBram Moolenaar      ])
23057a092245SBram Moolenaar  CheckScriptFailure([
23067a092245SBram Moolenaar      'vim9script',
23077a092245SBram Moolenaar      'echo "yes"# something',
23087a092245SBram Moolenaar      ], 'E121:')
23097a092245SBram Moolenaar  CheckScriptFailure([
23107a092245SBram Moolenaar      'vim9script',
23117a092245SBram Moolenaar      'echo# something',
23127a092245SBram Moolenaar      ], 'E121:')
23137a092245SBram Moolenaar  CheckScriptFailure([
23147a092245SBram Moolenaar      'echo "yes" # something',
23157a092245SBram Moolenaar      ], 'E121:')
23167a092245SBram Moolenaar
23174a8d9f2eSBram Moolenaar  exe "echo" # comment
23184a8d9f2eSBram Moolenaar  CheckDefFailure([
23194a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23204a8d9f2eSBram Moolenaar      ], 'E488:')
23214a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23224a8d9f2eSBram Moolenaar      'vim9script',
23234a8d9f2eSBram Moolenaar      'exe "echo" # something',
23244a8d9f2eSBram Moolenaar      ])
23254a8d9f2eSBram Moolenaar  CheckScriptFailure([
23264a8d9f2eSBram Moolenaar      'vim9script',
23274a8d9f2eSBram Moolenaar      'exe "echo"# something',
23284a8d9f2eSBram Moolenaar      ], 'E121:')
23294a8d9f2eSBram Moolenaar  CheckDefFailure([
23304a8d9f2eSBram Moolenaar      'exe # comment',
23314a8d9f2eSBram Moolenaar      ], 'E1015:')
23324a8d9f2eSBram Moolenaar  CheckScriptFailure([
23334a8d9f2eSBram Moolenaar      'vim9script',
23344a8d9f2eSBram Moolenaar      'exe# something',
23354a8d9f2eSBram Moolenaar      ], 'E121:')
23364a8d9f2eSBram Moolenaar  CheckScriptFailure([
23374a8d9f2eSBram Moolenaar      'exe "echo" # something',
23384a8d9f2eSBram Moolenaar      ], 'E121:')
23394a8d9f2eSBram Moolenaar
23407a092245SBram Moolenaar  CheckDefFailure([
23417a092245SBram Moolenaar      'try# comment',
23427a092245SBram Moolenaar      '  echo "yes"',
23437a092245SBram Moolenaar      'catch',
23447a092245SBram Moolenaar      'endtry',
23457a092245SBram Moolenaar      ], 'E488:')
23462c5ed4e3SBram Moolenaar  CheckScriptFailure([
23472c5ed4e3SBram Moolenaar      'vim9script',
23482c5ed4e3SBram Moolenaar      'try# comment',
23492c5ed4e3SBram Moolenaar      'echo "yes"',
23502c5ed4e3SBram Moolenaar      ], 'E488:')
23517a092245SBram Moolenaar  CheckDefFailure([
23527a092245SBram Moolenaar      'try',
2353a72cfb80SBram Moolenaar      '  throw#comment',
2354a72cfb80SBram Moolenaar      'catch',
2355a72cfb80SBram Moolenaar      'endtry',
2356a72cfb80SBram Moolenaar      ], 'E1015:')
2357a72cfb80SBram Moolenaar  CheckDefFailure([
2358a72cfb80SBram Moolenaar      'try',
2359a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2360a72cfb80SBram Moolenaar      'catch',
2361a72cfb80SBram Moolenaar      'endtry',
2362a72cfb80SBram Moolenaar      ], 'E488:')
2363a72cfb80SBram Moolenaar  CheckDefFailure([
2364a72cfb80SBram Moolenaar      'try',
23657a092245SBram Moolenaar      '  echo "yes"',
23667a092245SBram Moolenaar      'catch# comment',
23677a092245SBram Moolenaar      'endtry',
23687a092245SBram Moolenaar      ], 'E488:')
23692c5ed4e3SBram Moolenaar  CheckScriptFailure([
23702c5ed4e3SBram Moolenaar      'vim9script',
23712c5ed4e3SBram Moolenaar      'try',
23722c5ed4e3SBram Moolenaar      '  echo "yes"',
23732c5ed4e3SBram Moolenaar      'catch# comment',
23742c5ed4e3SBram Moolenaar      'endtry',
23752c5ed4e3SBram Moolenaar      ], 'E654:')
23762c5ed4e3SBram Moolenaar  CheckDefFailure([
23772c5ed4e3SBram Moolenaar      'try',
23782c5ed4e3SBram Moolenaar      '  echo "yes"',
23792c5ed4e3SBram Moolenaar      'catch /pat/# comment',
23802c5ed4e3SBram Moolenaar      'endtry',
23812c5ed4e3SBram Moolenaar      ], 'E488:')
23827a092245SBram Moolenaar  CheckDefFailure([
23837a092245SBram Moolenaar      'try',
23847a092245SBram Moolenaar      'echo "yes"',
23857a092245SBram Moolenaar      'catch',
23867a092245SBram Moolenaar      'endtry# comment',
23877a092245SBram Moolenaar      ], 'E488:')
23882c5ed4e3SBram Moolenaar  CheckScriptFailure([
23892c5ed4e3SBram Moolenaar      'vim9script',
23902c5ed4e3SBram Moolenaar      'try',
23912c5ed4e3SBram Moolenaar      '  echo "yes"',
23922c5ed4e3SBram Moolenaar      'catch',
23932c5ed4e3SBram Moolenaar      'endtry# comment',
23949b7bf9e9SBram Moolenaar      ], 'E488:')
23952c5ed4e3SBram Moolenaar
23962c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23972c5ed4e3SBram Moolenaar      'vim9script',
23982c5ed4e3SBram Moolenaar      'hi # comment',
23992c5ed4e3SBram Moolenaar      ])
24002c5ed4e3SBram Moolenaar  CheckScriptFailure([
24012c5ed4e3SBram Moolenaar      'vim9script',
24022c5ed4e3SBram Moolenaar      'hi# comment',
24032c5ed4e3SBram Moolenaar      ], 'E416:')
24041966c248SBram Moolenaar  CheckScriptSuccess([
24051966c248SBram Moolenaar      'vim9script',
24061966c248SBram Moolenaar      'hi Search # comment',
24071966c248SBram Moolenaar      ])
24081966c248SBram Moolenaar  CheckScriptFailure([
24091966c248SBram Moolenaar      'vim9script',
24101966c248SBram Moolenaar      'hi Search# comment',
24111966c248SBram Moolenaar      ], 'E416:')
24121966c248SBram Moolenaar  CheckScriptSuccess([
24131966c248SBram Moolenaar      'vim9script',
24141966c248SBram Moolenaar      'hi link This Search # comment',
24151966c248SBram Moolenaar      ])
24161966c248SBram Moolenaar  CheckScriptFailure([
24171966c248SBram Moolenaar      'vim9script',
24181966c248SBram Moolenaar      'hi link This That# comment',
24191966c248SBram Moolenaar      ], 'E413:')
24201966c248SBram Moolenaar  CheckScriptSuccess([
24211966c248SBram Moolenaar      'vim9script',
24221966c248SBram Moolenaar      'hi clear This # comment',
24231966c248SBram Moolenaar      'hi clear # comment',
24241966c248SBram Moolenaar      ])
2425f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2426f5be8cdbSBram Moolenaar  # hi clear This# comment',
24271966c248SBram Moolenaar  CheckScriptFailure([
24281966c248SBram Moolenaar      'vim9script',
24291966c248SBram Moolenaar      'hi clear# comment',
24301966c248SBram Moolenaar      ], 'E416:')
24311966c248SBram Moolenaar
24321966c248SBram Moolenaar  CheckScriptSuccess([
24331966c248SBram Moolenaar      'vim9script',
24341966c248SBram Moolenaar      'hi Group term=bold',
24351966c248SBram Moolenaar      'match Group /todo/ # comment',
24361966c248SBram Moolenaar      ])
24371966c248SBram Moolenaar  CheckScriptFailure([
24381966c248SBram Moolenaar      'vim9script',
24391966c248SBram Moolenaar      'hi Group term=bold',
24401966c248SBram Moolenaar      'match Group /todo/# comment',
24411966c248SBram Moolenaar      ], 'E488:')
24421966c248SBram Moolenaar  CheckScriptSuccess([
24431966c248SBram Moolenaar      'vim9script',
24441966c248SBram Moolenaar      'match # comment',
24451966c248SBram Moolenaar      ])
24461966c248SBram Moolenaar  CheckScriptFailure([
24471966c248SBram Moolenaar      'vim9script',
24481966c248SBram Moolenaar      'match# comment',
24491966c248SBram Moolenaar      ], 'E475:')
24501966c248SBram Moolenaar  CheckScriptSuccess([
24511966c248SBram Moolenaar      'vim9script',
24521966c248SBram Moolenaar      'match none # comment',
24531966c248SBram Moolenaar      ])
24541966c248SBram Moolenaar  CheckScriptFailure([
24551966c248SBram Moolenaar      'vim9script',
24561966c248SBram Moolenaar      'match none# comment',
24571966c248SBram Moolenaar      ], 'E475:')
24581966c248SBram Moolenaar
24591966c248SBram Moolenaar  CheckScriptSuccess([
24601966c248SBram Moolenaar      'vim9script',
24611966c248SBram Moolenaar      'menutrans clear # comment',
24621966c248SBram Moolenaar      ])
24631966c248SBram Moolenaar  CheckScriptFailure([
24641966c248SBram Moolenaar      'vim9script',
24651966c248SBram Moolenaar      'menutrans clear# comment text',
24661966c248SBram Moolenaar      ], 'E474:')
24671966c248SBram Moolenaar
24681966c248SBram Moolenaar  CheckScriptSuccess([
24691966c248SBram Moolenaar      'vim9script',
24701966c248SBram Moolenaar      'syntax clear # comment',
24711966c248SBram Moolenaar      ])
24721966c248SBram Moolenaar  CheckScriptFailure([
24731966c248SBram Moolenaar      'vim9script',
24741966c248SBram Moolenaar      'syntax clear# comment text',
24751966c248SBram Moolenaar      ], 'E28:')
24761966c248SBram Moolenaar  CheckScriptSuccess([
24771966c248SBram Moolenaar      'vim9script',
24781966c248SBram Moolenaar      'syntax keyword Word some',
24791966c248SBram Moolenaar      'syntax clear Word # comment',
24801966c248SBram Moolenaar      ])
24811966c248SBram Moolenaar  CheckScriptFailure([
24821966c248SBram Moolenaar      'vim9script',
24831966c248SBram Moolenaar      'syntax keyword Word some',
24841966c248SBram Moolenaar      'syntax clear Word# comment text',
24851966c248SBram Moolenaar      ], 'E28:')
24861966c248SBram Moolenaar
24871966c248SBram Moolenaar  CheckScriptSuccess([
24881966c248SBram Moolenaar      'vim9script',
24891966c248SBram Moolenaar      'syntax list # comment',
24901966c248SBram Moolenaar      ])
24911966c248SBram Moolenaar  CheckScriptFailure([
24921966c248SBram Moolenaar      'vim9script',
24931966c248SBram Moolenaar      'syntax list# comment text',
24941966c248SBram Moolenaar      ], 'E28:')
24951966c248SBram Moolenaar
24961966c248SBram Moolenaar  CheckScriptSuccess([
24971966c248SBram Moolenaar      'vim9script',
24981966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24991966c248SBram Moolenaar      ])
25001966c248SBram Moolenaar  CheckScriptFailure([
25011966c248SBram Moolenaar      'vim9script',
25021966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25031966c248SBram Moolenaar      ], 'E475:')
25041966c248SBram Moolenaar
25051966c248SBram Moolenaar  CheckScriptSuccess([
25061966c248SBram Moolenaar      'vim9script',
25071966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25081966c248SBram Moolenaar      ])
25091966c248SBram Moolenaar  CheckScriptFailure([
25101966c248SBram Moolenaar      'vim9script',
25111966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25121966c248SBram Moolenaar      ], 'E789:')
25131966c248SBram Moolenaar
25141966c248SBram Moolenaar  CheckScriptSuccess([
25151966c248SBram Moolenaar      'vim9script',
25161966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25171966c248SBram Moolenaar      ])
25181966c248SBram Moolenaar  CheckScriptFailure([
25191966c248SBram Moolenaar      'vim9script',
25201966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25211966c248SBram Moolenaar      ], 'E402:')
25221966c248SBram Moolenaar
25231966c248SBram Moolenaar  CheckScriptSuccess([
25241966c248SBram Moolenaar      'vim9script',
25251966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25261966c248SBram Moolenaar      ])
25271966c248SBram Moolenaar  CheckScriptFailure([
25281966c248SBram Moolenaar      'vim9script',
25291966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25301966c248SBram Moolenaar      ], 'E475:')
25311966c248SBram Moolenaar  CheckScriptFailure([
25321966c248SBram Moolenaar      'vim9script',
25331966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
25341966c248SBram Moolenaar      ], 'E406:')
25351966c248SBram Moolenaar  CheckScriptFailure([
25361966c248SBram Moolenaar      'vim9script',
25371966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
25381966c248SBram Moolenaar      ], 'E475:')
25391966c248SBram Moolenaar
25401966c248SBram Moolenaar  CheckScriptSuccess([
25411966c248SBram Moolenaar      'vim9script',
25421966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
25431966c248SBram Moolenaar      ])
25441966c248SBram Moolenaar  CheckScriptFailure([
25451966c248SBram Moolenaar      'vim9script',
25461966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2547d032f34aSBram Moolenaar      ], 'E402:')
25481966c248SBram Moolenaar
25491966c248SBram Moolenaar  CheckScriptSuccess([
25501966c248SBram Moolenaar      'vim9script',
25511966c248SBram Moolenaar      'syntax sync # comment',
25521966c248SBram Moolenaar      ])
25531966c248SBram Moolenaar  CheckScriptFailure([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'syntax sync# comment',
25561966c248SBram Moolenaar      ], 'E404:')
25571966c248SBram Moolenaar  CheckScriptSuccess([
25581966c248SBram Moolenaar      'vim9script',
25591966c248SBram Moolenaar      'syntax sync ccomment # comment',
25601966c248SBram Moolenaar      ])
25611966c248SBram Moolenaar  CheckScriptFailure([
25621966c248SBram Moolenaar      'vim9script',
25631966c248SBram Moolenaar      'syntax sync ccomment# comment',
25641966c248SBram Moolenaar      ], 'E404:')
25651966c248SBram Moolenaar
25661966c248SBram Moolenaar  CheckScriptSuccess([
25671966c248SBram Moolenaar      'vim9script',
25681966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
25691966c248SBram Moolenaar      ])
25701966c248SBram Moolenaar  CheckScriptFailure([
25711966c248SBram Moolenaar      'vim9script',
25721966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25731966c248SBram Moolenaar      ], 'E475:')
2574a72cfb80SBram Moolenaar
2575a72cfb80SBram Moolenaar  CheckScriptSuccess([
2576a72cfb80SBram Moolenaar      'vim9script',
2577a72cfb80SBram Moolenaar      'command Echo echo # comment',
2578a72cfb80SBram Moolenaar      'command Echo # comment',
2579a72cfb80SBram Moolenaar      ])
2580a72cfb80SBram Moolenaar  CheckScriptFailure([
2581a72cfb80SBram Moolenaar      'vim9script',
2582a72cfb80SBram Moolenaar      'command Echo echo# comment',
2583a72cfb80SBram Moolenaar      'Echo',
2584a72cfb80SBram Moolenaar      ], 'E121:')
2585a72cfb80SBram Moolenaar  CheckScriptFailure([
2586a72cfb80SBram Moolenaar      'vim9script',
2587a72cfb80SBram Moolenaar      'command Echo# comment',
2588a72cfb80SBram Moolenaar      ], 'E182:')
2589a72cfb80SBram Moolenaar  CheckScriptFailure([
2590a72cfb80SBram Moolenaar      'vim9script',
2591a72cfb80SBram Moolenaar      'command Echo echo',
2592a72cfb80SBram Moolenaar      'command Echo# comment',
2593a72cfb80SBram Moolenaar      ], 'E182:')
2594a72cfb80SBram Moolenaar
2595a72cfb80SBram Moolenaar  CheckScriptSuccess([
2596a72cfb80SBram Moolenaar      'vim9script',
2597a72cfb80SBram Moolenaar      'function # comment',
2598a72cfb80SBram Moolenaar      ])
2599a72cfb80SBram Moolenaar  CheckScriptFailure([
2600a72cfb80SBram Moolenaar      'vim9script',
26019898107fSBram Moolenaar      'function " comment',
26029898107fSBram Moolenaar      ], 'E129:')
26039898107fSBram Moolenaar  CheckScriptFailure([
26049898107fSBram Moolenaar      'vim9script',
2605a72cfb80SBram Moolenaar      'function# comment',
2606a72cfb80SBram Moolenaar      ], 'E129:')
2607a72cfb80SBram Moolenaar  CheckScriptSuccess([
2608a72cfb80SBram Moolenaar      'vim9script',
2609a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2610a72cfb80SBram Moolenaar      ])
2611a72cfb80SBram Moolenaar  CheckScriptFailure([
2612a72cfb80SBram Moolenaar      'vim9script',
2613a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2614a72cfb80SBram Moolenaar      ], 'E488:')
2615a72cfb80SBram Moolenaar
2616a72cfb80SBram Moolenaar  CheckScriptSuccess([
2617a72cfb80SBram Moolenaar      'vim9script',
26184c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2619a72cfb80SBram Moolenaar      'endfunc',
26204c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2621a72cfb80SBram Moolenaar      ])
2622a72cfb80SBram Moolenaar  CheckScriptFailure([
2623a72cfb80SBram Moolenaar      'vim9script',
26244c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2625a72cfb80SBram Moolenaar      'endfunc',
26264c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2627a72cfb80SBram Moolenaar      ], 'E488:')
2628a72cfb80SBram Moolenaar
2629a72cfb80SBram Moolenaar  CheckScriptSuccess([
2630a72cfb80SBram Moolenaar      'vim9script',
2631a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2632a72cfb80SBram Moolenaar      ])
2633a72cfb80SBram Moolenaar  CheckScriptFailure([
2634a72cfb80SBram Moolenaar      'vim9script',
2635a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2636a72cfb80SBram Moolenaar      ], 'E488:')
2637e7e4838fSBram Moolenaar
2638e7e4838fSBram Moolenaar  CheckScriptFailure([
2639e7e4838fSBram Moolenaar      'def Test() " comment',
2640e7e4838fSBram Moolenaar      'enddef',
2641e7e4838fSBram Moolenaar      ], 'E488:')
2642e7e4838fSBram Moolenaar  CheckScriptFailure([
2643e7e4838fSBram Moolenaar      'vim9script',
2644e7e4838fSBram Moolenaar      'def Test() " comment',
2645e7e4838fSBram Moolenaar      'enddef',
2646e7e4838fSBram Moolenaar      ], 'E488:')
2647e7e4838fSBram Moolenaar
2648e7e4838fSBram Moolenaar  CheckScriptSuccess([
2649e7e4838fSBram Moolenaar      'func Test() " comment',
2650e7e4838fSBram Moolenaar      'endfunc',
2651e7e4838fSBram Moolenaar      ])
26529898107fSBram Moolenaar  CheckScriptSuccess([
2653e7e4838fSBram Moolenaar      'vim9script',
2654e7e4838fSBram Moolenaar      'func Test() " comment',
2655e7e4838fSBram Moolenaar      'endfunc',
26569898107fSBram Moolenaar      ])
2657e7e4838fSBram Moolenaar
2658e7e4838fSBram Moolenaar  CheckScriptSuccess([
2659e7e4838fSBram Moolenaar      'def Test() # comment',
2660e7e4838fSBram Moolenaar      'enddef',
2661e7e4838fSBram Moolenaar      ])
2662e7e4838fSBram Moolenaar  CheckScriptFailure([
2663e7e4838fSBram Moolenaar      'func Test() # comment',
2664e7e4838fSBram Moolenaar      'endfunc',
2665e7e4838fSBram Moolenaar      ], 'E488:')
26662c5ed4e3SBram Moolenaarenddef
26672c5ed4e3SBram Moolenaar
26682c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
26692c5ed4e3SBram Moolenaar  CheckCanRunGui
26702c5ed4e3SBram Moolenaar
26712c5ed4e3SBram Moolenaar  CheckScriptFailure([
26722c5ed4e3SBram Moolenaar      'vim9script',
26732c5ed4e3SBram Moolenaar      'gui#comment'
26742c5ed4e3SBram Moolenaar      ], 'E499:')
26752c5ed4e3SBram Moolenaar  CheckScriptFailure([
26762c5ed4e3SBram Moolenaar      'vim9script',
26772c5ed4e3SBram Moolenaar      'gui -f#comment'
26782c5ed4e3SBram Moolenaar      ], 'E499:')
26797a092245SBram Moolenaarenddef
26807a092245SBram Moolenaar
2681a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
26826797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
26836797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2684a26b9700SBram Moolenaar
2685a26b9700SBram Moolenaar  edit test.vim
2686a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2687a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2688a26b9700SBram Moolenaar
2689a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2690a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2691a26b9700SBram Moolenaar
2692a26b9700SBram Moolenaar  g:entered = 0
2693a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2694a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2695a26b9700SBram Moolenaar
2696a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2697a26b9700SBram Moolenaar
2698a26b9700SBram Moolenaar  au! TabEnter
2699a26b9700SBram Moolenaar  unlet g:entered
2700d72c1bf0SBram Moolenaar
2701d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2702d72c1bf0SBram Moolenaar      'vim9script',
27036797966dSBram Moolenaar      'g:var = 123',
2704e55b1c09SBram Moolenaar      'b:var = 456',
2705e55b1c09SBram Moolenaar      'w:var = 777',
2706e55b1c09SBram Moolenaar      't:var = 888',
2707d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2708d72c1bf0SBram Moolenaar      ])
2709d72c1bf0SBram Moolenaar
2710d72c1bf0SBram Moolenaar  CheckScriptFailure([
2711d72c1bf0SBram Moolenaar      'vim9script',
2712d72c1bf0SBram Moolenaar      'let g:var = 123',
2713e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2714e55b1c09SBram Moolenaar
2715e55b1c09SBram Moolenaar  CheckScriptFailure([
2716e55b1c09SBram Moolenaar      'vim9script',
2717e55b1c09SBram Moolenaar      'let b:var = 123',
2718e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2719e55b1c09SBram Moolenaar
2720e55b1c09SBram Moolenaar  CheckScriptFailure([
2721e55b1c09SBram Moolenaar      'vim9script',
2722e55b1c09SBram Moolenaar      'let w:var = 123',
2723e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2724e55b1c09SBram Moolenaar
2725e55b1c09SBram Moolenaar  CheckScriptFailure([
2726e55b1c09SBram Moolenaar      'vim9script',
2727e55b1c09SBram Moolenaar      'let t:var = 123',
2728e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2729e55b1c09SBram Moolenaar
2730e55b1c09SBram Moolenaar  CheckScriptFailure([
2731e55b1c09SBram Moolenaar      'vim9script',
2732e55b1c09SBram Moolenaar      'let v:version = 123',
2733e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2734e55b1c09SBram Moolenaar
2735e55b1c09SBram Moolenaar  CheckScriptFailure([
2736e55b1c09SBram Moolenaar      'vim9script',
2737e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2738e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
27396797966dSBram Moolenaar
27406797966dSBram Moolenaar  CheckScriptFailure([
27416797966dSBram Moolenaar      'vim9script',
27426797966dSBram Moolenaar      'g:var = 123',
274332e35117SBram Moolenaar      'unlet g:var# comment1',
2744d72c1bf0SBram Moolenaar      ], 'E108:')
2745d72c1bf0SBram Moolenaar
2746d72c1bf0SBram Moolenaar  CheckScriptFailure([
2747d72c1bf0SBram Moolenaar      'let g:var = 123',
2748d72c1bf0SBram Moolenaar      'unlet g:var # something',
2749d72c1bf0SBram Moolenaar      ], 'E488:')
2750faac4104SBram Moolenaar
2751faac4104SBram Moolenaar  CheckScriptSuccess([
2752faac4104SBram Moolenaar      'vim9script',
275332e35117SBram Moolenaar      'if 1 # comment2',
2754faac4104SBram Moolenaar      '  echo "yes"',
2755faac4104SBram Moolenaar      'elseif 2 #comment',
2756faac4104SBram Moolenaar      '  echo "no"',
2757faac4104SBram Moolenaar      'endif',
2758faac4104SBram Moolenaar      ])
2759faac4104SBram Moolenaar
2760faac4104SBram Moolenaar  CheckScriptFailure([
2761faac4104SBram Moolenaar      'vim9script',
276232e35117SBram Moolenaar      'if 1# comment3',
2763faac4104SBram Moolenaar      '  echo "yes"',
2764faac4104SBram Moolenaar      'endif',
2765faac4104SBram Moolenaar      ], 'E15:')
2766faac4104SBram Moolenaar
2767faac4104SBram Moolenaar  CheckScriptFailure([
2768faac4104SBram Moolenaar      'vim9script',
276932e35117SBram Moolenaar      'if 0 # comment4',
2770faac4104SBram Moolenaar      '  echo "yes"',
2771faac4104SBram Moolenaar      'elseif 2#comment',
2772faac4104SBram Moolenaar      '  echo "no"',
2773faac4104SBram Moolenaar      'endif',
2774faac4104SBram Moolenaar      ], 'E15:')
2775faac4104SBram Moolenaar
2776faac4104SBram Moolenaar  CheckScriptSuccess([
2777faac4104SBram Moolenaar      'vim9script',
277832e35117SBram Moolenaar      'let v = 1 # comment5',
2779faac4104SBram Moolenaar      ])
2780faac4104SBram Moolenaar
2781faac4104SBram Moolenaar  CheckScriptFailure([
2782faac4104SBram Moolenaar      'vim9script',
278332e35117SBram Moolenaar      'let v = 1# comment6',
278432e35117SBram Moolenaar      ], 'E15:')
2785faac4104SBram Moolenaar
2786faac4104SBram Moolenaar  CheckScriptSuccess([
2787faac4104SBram Moolenaar      'vim9script',
2788faac4104SBram Moolenaar      'new'
2789faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2790df069eecSBram Moolenaar      ':$',
2791faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2792faac4104SBram Moolenaar      'bwipe!',
2793faac4104SBram Moolenaar      ])
2794faac4104SBram Moolenaar
2795f5be8cdbSBram Moolenaar  CheckScriptFailure([
2796f5be8cdbSBram Moolenaar      'vim9script',
2797f5be8cdbSBram Moolenaar      'new'
2798f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2799f5be8cdbSBram Moolenaar      ':$',
2800f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2801f5be8cdbSBram Moolenaar      'bwipe!',
2802f5be8cdbSBram Moolenaar      ], 'E488:')
2803f5be8cdbSBram Moolenaar
2804f5be8cdbSBram Moolenaar  CheckScriptFailure([
2805f5be8cdbSBram Moolenaar      'vim9script',
2806f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2807f5be8cdbSBram Moolenaar      ], 'E477:')
2808a26b9700SBram Moolenaarenddef
2809a26b9700SBram Moolenaar
28107e5bd91dSBram Moolenaardef Test_finish()
28117e5bd91dSBram Moolenaar  let lines =<< trim END
28127e5bd91dSBram Moolenaar    vim9script
28136797966dSBram Moolenaar    g:res = 'one'
28147e5bd91dSBram Moolenaar    if v:false | finish | endif
28156797966dSBram Moolenaar    g:res = 'two'
28167e5bd91dSBram Moolenaar    finish
28176797966dSBram Moolenaar    g:res = 'three'
28187e5bd91dSBram Moolenaar  END
28197e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
28207e5bd91dSBram Moolenaar  source Xfinished
28217e5bd91dSBram Moolenaar  assert_equal('two', g:res)
28227e5bd91dSBram Moolenaar
28237e5bd91dSBram Moolenaar  unlet g:res
28247e5bd91dSBram Moolenaar  delete('Xfinished')
28257e5bd91dSBram Moolenaarenddef
28267e5bd91dSBram Moolenaar
282732e35117SBram Moolenaardef Test_let_func_call()
282832e35117SBram Moolenaar  let lines =<< trim END
282932e35117SBram Moolenaar    vim9script
283032e35117SBram Moolenaar    func GetValue()
283132e35117SBram Moolenaar      if exists('g:count')
283232e35117SBram Moolenaar        let g:count += 1
283332e35117SBram Moolenaar      else
283432e35117SBram Moolenaar        let g:count = 1
283532e35117SBram Moolenaar      endif
283632e35117SBram Moolenaar      return 'this'
283732e35117SBram Moolenaar    endfunc
283832e35117SBram Moolenaar    let val: string = GetValue()
2839f5be8cdbSBram Moolenaar    # env var is always a string
2840df671b46SBram Moolenaar    let env = $TERM
284132e35117SBram Moolenaar  END
284232e35117SBram Moolenaar  writefile(lines, 'Xfinished')
284332e35117SBram Moolenaar  source Xfinished
2844f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
284532e35117SBram Moolenaar  assert_equal(1, g:count)
284632e35117SBram Moolenaar
284732e35117SBram Moolenaar  unlet g:count
284832e35117SBram Moolenaar  delete('Xfinished')
284932e35117SBram Moolenaarenddef
285032e35117SBram Moolenaar
285132e35117SBram Moolenaardef Test_let_missing_type()
285232e35117SBram Moolenaar  let lines =<< trim END
285332e35117SBram Moolenaar    vim9script
2854df671b46SBram Moolenaar    let var = g:unknown
2855227a69deSBram Moolenaar  END
2856822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2857227a69deSBram Moolenaar
2858227a69deSBram Moolenaar  lines =<< trim END
2859227a69deSBram Moolenaar    vim9script
2860227a69deSBram Moolenaar    let nr: number = 123
2861227a69deSBram Moolenaar    let var = nr
2862227a69deSBram Moolenaar  END
2863822ba247SBram Moolenaar  CheckScriptSuccess(lines)
286432e35117SBram Moolenaarenddef
286532e35117SBram Moolenaar
2866c82a5b5dSBram Moolenaardef Test_let_declaration()
2867c82a5b5dSBram Moolenaar  let lines =<< trim END
2868c82a5b5dSBram Moolenaar    vim9script
2869c82a5b5dSBram Moolenaar    let var: string
2870c82a5b5dSBram Moolenaar    g:var_uninit = var
2871c82a5b5dSBram Moolenaar    var = 'text'
2872c82a5b5dSBram Moolenaar    g:var_test = var
2873f5be8cdbSBram Moolenaar    # prefixing s: is optional
2874984dddbeSBram Moolenaar    s:var = 'prefixed'
2875984dddbeSBram Moolenaar    g:var_prefixed = s:var
2876984dddbeSBram Moolenaar
2877984dddbeSBram Moolenaar    let s:other: number
2878984dddbeSBram Moolenaar    other = 1234
2879984dddbeSBram Moolenaar    g:other_var = other
2880c82a5b5dSBram Moolenaar  END
2881c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2882c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2883c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2884984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2885984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2886c82a5b5dSBram Moolenaar
2887c82a5b5dSBram Moolenaar  unlet g:var_uninit
2888c82a5b5dSBram Moolenaar  unlet g:var_test
2889984dddbeSBram Moolenaar  unlet g:var_prefixed
2890984dddbeSBram Moolenaar  unlet g:other_var
2891c82a5b5dSBram Moolenaarenddef
2892c82a5b5dSBram Moolenaar
2893c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2894c5b1c20bSBram Moolenaar  let lines =<< trim END
2895c5b1c20bSBram Moolenaar    vim9script
2896c5b1c20bSBram Moolenaar    const var: string
2897c5b1c20bSBram Moolenaar  END
2898c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2899c5b1c20bSBram Moolenaar
2900c5b1c20bSBram Moolenaar  lines =<< trim END
2901c5b1c20bSBram Moolenaar    vim9script
2902c5b1c20bSBram Moolenaar    let 9var: string
2903c5b1c20bSBram Moolenaar  END
2904c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2905c5b1c20bSBram Moolenaarenddef
2906c5b1c20bSBram Moolenaar
290734db91f7SBram Moolenaardef Test_let_type_check()
290834db91f7SBram Moolenaar  let lines =<< trim END
290934db91f7SBram Moolenaar    vim9script
291034db91f7SBram Moolenaar    let var: string
291134db91f7SBram Moolenaar    var = 1234
291234db91f7SBram Moolenaar  END
291334db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2914984dddbeSBram Moolenaar
2915984dddbeSBram Moolenaar  lines =<< trim END
2916984dddbeSBram Moolenaar    vim9script
2917984dddbeSBram Moolenaar    let var:string
2918984dddbeSBram Moolenaar  END
2919984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2920c5b1c20bSBram Moolenaar
2921c5b1c20bSBram Moolenaar  lines =<< trim END
2922c5b1c20bSBram Moolenaar    vim9script
2923c5b1c20bSBram Moolenaar    let var: asdf
2924c5b1c20bSBram Moolenaar  END
2925c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2926a71e2633SBram Moolenaar
2927a71e2633SBram Moolenaar  lines =<< trim END
2928a71e2633SBram Moolenaar    vim9script
2929a71e2633SBram Moolenaar    let s:l: list<number>
2930a71e2633SBram Moolenaar    s:l = []
2931a71e2633SBram Moolenaar  END
2932a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2933a71e2633SBram Moolenaar
2934a71e2633SBram Moolenaar  lines =<< trim END
2935a71e2633SBram Moolenaar    vim9script
2936a71e2633SBram Moolenaar    let s:d: dict<number>
2937a71e2633SBram Moolenaar    s:d = {}
2938a71e2633SBram Moolenaar  END
2939a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
294034db91f7SBram Moolenaarenddef
294134db91f7SBram Moolenaar
2942a5d0077eSBram Moolenaardef Test_forward_declaration()
2943a5d0077eSBram Moolenaar  let lines =<< trim END
2944a5d0077eSBram Moolenaar    vim9script
2945a5d0077eSBram Moolenaar    def GetValue(): string
2946a5d0077eSBram Moolenaar      return theVal
2947a5d0077eSBram Moolenaar    enddef
2948a5d0077eSBram Moolenaar    let theVal = 'something'
2949822ba247SBram Moolenaar    g:initVal = GetValue()
2950a5d0077eSBram Moolenaar    theVal = 'else'
2951a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2952a5d0077eSBram Moolenaar  END
2953a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2954a5d0077eSBram Moolenaar  source Xforward
2955a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2956a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2957a5d0077eSBram Moolenaar
2958a5d0077eSBram Moolenaar  unlet g:initVal
2959a5d0077eSBram Moolenaar  unlet g:laterVal
2960a5d0077eSBram Moolenaar  delete('Xforward')
2961a5d0077eSBram Moolenaarenddef
2962a5d0077eSBram Moolenaar
29639721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
29649721fb4eSBram Moolenaar  let legacy_lines =<< trim END
29659721fb4eSBram Moolenaar    source Xvim9_script.vim
29669721fb4eSBram Moolenaar
29679721fb4eSBram Moolenaar    call assert_false(exists('local'))
29689721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29699721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29709721fb4eSBram Moolenaar    call assert_equal('global', global)
29719721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29729721fb4eSBram Moolenaar
29739721fb4eSBram Moolenaar    " imported variable becomes script-local
29749721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29759721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29769721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29779721fb4eSBram Moolenaar
29789721fb4eSBram Moolenaar    " imported function becomes script-local
29799721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29809721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29819721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29829721fb4eSBram Moolenaar  END
29839721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29849721fb4eSBram Moolenaar
29859721fb4eSBram Moolenaar  let vim9_lines =<< trim END
29869721fb4eSBram Moolenaar    vim9script
29879721fb4eSBram Moolenaar    let local = 'local'
29889721fb4eSBram Moolenaar    g:global = 'global'
29899721fb4eSBram Moolenaar    export let exported = 'exported'
29909721fb4eSBram Moolenaar    export def GetText(): string
29919721fb4eSBram Moolenaar       return 'text'
29929721fb4eSBram Moolenaar    enddef
29939721fb4eSBram Moolenaar  END
29949721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
29959721fb4eSBram Moolenaar
29969721fb4eSBram Moolenaar  source Xlegacy_script.vim
29979721fb4eSBram Moolenaar
29989721fb4eSBram Moolenaar  assert_equal('global', g:global)
2999f5be8cdbSBram Moolenaar  unlet g:global
30009721fb4eSBram Moolenaar
30019721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30029721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30039721fb4eSBram Moolenaarenddef
3004a5d0077eSBram Moolenaar
3005eeb27bfeSBram Moolenaardef Test_vim9_copen()
3006eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3007eeb27bfeSBram Moolenaar  copen
3008eeb27bfeSBram Moolenaar  quit
3009eeb27bfeSBram Moolenaarenddef
3010eeb27bfeSBram Moolenaar
30112d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
30122d6b20d6SBram Moolenaardef Test_vim9_autoload()
30132d6b20d6SBram Moolenaar  let lines =<< trim END
30142d6b20d6SBram Moolenaar     vim9script
30152d6b20d6SBram Moolenaar     def foo#test()
30162d6b20d6SBram Moolenaar         echomsg getreg('"')
30172d6b20d6SBram Moolenaar     enddef
30182d6b20d6SBram Moolenaar  END
30192d6b20d6SBram Moolenaar
30202d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
30212d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
30222d6b20d6SBram Moolenaar  let save_rtp = &rtp
30232d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
30242d6b20d6SBram Moolenaar  augroup test
30252d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
30262d6b20d6SBram Moolenaar  augroup END
30272d6b20d6SBram Moolenaar
30282d6b20d6SBram Moolenaar  normal Y
30292d6b20d6SBram Moolenaar
30302d6b20d6SBram Moolenaar  augroup test
30312d6b20d6SBram Moolenaar    autocmd!
30322d6b20d6SBram Moolenaar  augroup END
30332d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
30342d6b20d6SBram Moolenaar  &rtp = save_rtp
30352d6b20d6SBram Moolenaarenddef
30362d6b20d6SBram Moolenaar
30373896a105SBram Moolenaardef Test_cmdline_win()
30383896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
30393896a105SBram Moolenaar  # the command line window.
30403896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
30413896a105SBram Moolenaar  let export_lines =<< trim END
30423896a105SBram Moolenaar    vim9script
30433896a105SBram Moolenaar    export let That = 'yes'
30443896a105SBram Moolenaar  END
30453896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
30463896a105SBram Moolenaar  let import_lines =<< trim END
30473896a105SBram Moolenaar    vim9script
30483896a105SBram Moolenaar    import That from './Xexport.vim'
30493896a105SBram Moolenaar  END
30503896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
30513896a105SBram Moolenaar  let save_rtp = &rtp
30523896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
30533896a105SBram Moolenaar  syntax on
30543896a105SBram Moolenaar  augroup CmdWin
30553896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
30563896a105SBram Moolenaar  augroup END
30573896a105SBram Moolenaar  # this will open and also close the cmdline window
30583896a105SBram Moolenaar  feedkeys('q:', 'xt')
30593896a105SBram Moolenaar  assert_equal('yes', g:got_there)
30603896a105SBram Moolenaar
30613896a105SBram Moolenaar  augroup CmdWin
30623896a105SBram Moolenaar    au!
30633896a105SBram Moolenaar  augroup END
30643896a105SBram Moolenaar  &rtp = save_rtp
30653896a105SBram Moolenaar  delete('rtp', 'rf')
30663896a105SBram Moolenaarenddef
30673896a105SBram Moolenaar
3068585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3069585fea7bSBram Moolenaardef Test_substitute_cmd()
3070585fea7bSBram Moolenaar  new
3071585fea7bSBram Moolenaar  setline(1, 'something')
3072585fea7bSBram Moolenaar  :substitute(some(other(
3073585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3074585fea7bSBram Moolenaar  bwipe!
3075585fea7bSBram Moolenaar
3076f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3077585fea7bSBram Moolenaar  let lines =<< trim END
3078585fea7bSBram Moolenaar    vim9script
3079585fea7bSBram Moolenaar    new
3080585fea7bSBram Moolenaar    setline(1, 'something')
3081585fea7bSBram Moolenaar    :substitute(some(other(
3082585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3083585fea7bSBram Moolenaar    bwipe!
3084585fea7bSBram Moolenaar  END
3085585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3086585fea7bSBram Moolenaar  source Xvim9lines
3087585fea7bSBram Moolenaar
3088585fea7bSBram Moolenaar  delete('Xvim9lines')
3089585fea7bSBram Moolenaarenddef
3090585fea7bSBram Moolenaar
30918a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3092