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:')
31f93c7feaSBram Moolenaar
324cdb13ceSBram Moolenaar  let nr: number = 1234
334cdb13ceSBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
344cdb13ceSBram Moolenaar
35b209750bSBram Moolenaar  let a: number = 6 #comment
369be61bbbSBram Moolenaar  assert_equal(6, a)
379be61bbbSBram Moolenaar
3842a480bfSBram Moolenaar  if has('channel')
3942a480bfSBram Moolenaar    let chan1: channel
40fbdd08edSBram Moolenaar    let job1: job
41f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
4242a480bfSBram Moolenaar  endif
43fbdd08edSBram Moolenaar  if has('float')
44fbdd08edSBram Moolenaar    let float1: float = 3.4
45fbdd08edSBram Moolenaar  endif
465deeb3f1SBram Moolenaar  let Funky1: func
475deeb3f1SBram Moolenaar  let Funky2: func = function('len')
484c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4942a480bfSBram Moolenaar
50b209750bSBram Moolenaar  g:newvar = 'new'  #comment
51401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
52401d9ffbSBram Moolenaar
53401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
54401d9ffbSBram Moolenaar  g:existing = 'no'
55401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
56401d9ffbSBram Moolenaar
57b283a8a6SBram Moolenaar  v:char = 'abc'
586e587dcbSBram Moolenaar  assert_equal('abc', v:char)
59b283a8a6SBram Moolenaar
60b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
616e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
62b283a8a6SBram Moolenaar  $ENVVAR = ''
636e587dcbSBram Moolenaar
64b5ed2660SBram Moolenaar  let lines =<< trim END
65b5ed2660SBram Moolenaar    vim9script
66b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
67b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
68b5ed2660SBram Moolenaar    $ENVVAR = ''
69b5ed2660SBram Moolenaar  END
70b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
71b5ed2660SBram Moolenaar
72fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
73fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
74fd1823e0SBram Moolenaar  s:addToMe += 222
75fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
760bbf722aSBram Moolenaar  s:newVar = 'new'
770bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
78a8c17704SBram Moolenaar
79a8c17704SBram Moolenaar  set ts=7
80a8c17704SBram Moolenaar  &ts += 1
81a8c17704SBram Moolenaar  assert_equal(8, &ts)
8280c34ca3SBram Moolenaar  &ts -= 3
8380c34ca3SBram Moolenaar  assert_equal(5, &ts)
8480c34ca3SBram Moolenaar  &ts *= 2
8580c34ca3SBram Moolenaar  assert_equal(10, &ts)
8680c34ca3SBram Moolenaar  &ts /= 3
8780c34ca3SBram Moolenaar  assert_equal(3, &ts)
8880c34ca3SBram Moolenaar  set ts=10
8980c34ca3SBram Moolenaar  &ts %= 4
9080c34ca3SBram Moolenaar  assert_equal(2, &ts)
91b5ed2660SBram Moolenaar
92b5ed2660SBram Moolenaar  lines =<< trim END
93b5ed2660SBram Moolenaar    vim9script
94b5ed2660SBram Moolenaar    &ts = 6
95b5ed2660SBram Moolenaar    &ts += 3
96b5ed2660SBram Moolenaar    assert_equal(9, &ts)
97b5ed2660SBram Moolenaar  END
98b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
99b5ed2660SBram Moolenaar
100a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
101a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
102a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
103a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
104a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
105a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
106a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
107a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
108cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
109585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11080c34ca3SBram Moolenaar  &ts = 8
111a8c17704SBram Moolenaar
11233afa244SBram Moolenaar  call CheckDefFailure(['let s:var = 123'], 'E1101:')
11333afa244SBram Moolenaar  call CheckDefFailure(['let s:var: number'], 'E1101:')
11433afa244SBram Moolenaar
115f9b2b496SBram Moolenaar  lines =<< trim END
116f9b2b496SBram Moolenaar    vim9script
117f9b2b496SBram Moolenaar    def SomeFunc()
118f9b2b496SBram Moolenaar      s:var = 123
119f9b2b496SBram Moolenaar    enddef
120f9b2b496SBram Moolenaar    defcompile
121f9b2b496SBram Moolenaar  END
122f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
123f9b2b496SBram Moolenaar
124a8c17704SBram Moolenaar  g:inc_counter += 1
125a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
126a8c17704SBram Moolenaar
127a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
128a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
129dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
130a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
131a8c17704SBram Moolenaar
132a8c17704SBram Moolenaar  @a = 'areg'
133a8c17704SBram Moolenaar  @a ..= 'add'
134a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
135dd29f1b0SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
136a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
137e69f6d04SBram Moolenaar
138b5ed2660SBram Moolenaar  lines =<< trim END
139b5ed2660SBram Moolenaar    vim9script
140b5ed2660SBram Moolenaar    @c = 'areg'
141b5ed2660SBram Moolenaar    @c ..= 'add'
142b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
143b5ed2660SBram Moolenaar  END
144b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
145b5ed2660SBram Moolenaar
146e69f6d04SBram Moolenaar  v:errmsg = 'none'
147e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
148e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
149dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
150e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
15133afa244SBram Moolenaar
15233afa244SBram Moolenaar  # single letter variables
15333afa244SBram Moolenaar  a = 123
15433afa244SBram Moolenaar  assert_equal(123, a)
15533afa244SBram Moolenaar  let b: number
15633afa244SBram Moolenaar  b = 123
15733afa244SBram Moolenaar  assert_equal(123, b)
15833afa244SBram Moolenaar  let g: number
15933afa244SBram Moolenaar  g = 123
16033afa244SBram Moolenaar  assert_equal(123, g)
16133afa244SBram Moolenaar  let s: number
16233afa244SBram Moolenaar  s = 123
16333afa244SBram Moolenaar  assert_equal(123, s)
16433afa244SBram Moolenaar  let t: number
16533afa244SBram Moolenaar  t = 123
16633afa244SBram Moolenaar  assert_equal(123, t)
16733afa244SBram Moolenaar  let v: number
16833afa244SBram Moolenaar  v = 123
16933afa244SBram Moolenaar  assert_equal(123, v)
17033afa244SBram Moolenaar  let w: number
17133afa244SBram Moolenaar  w = 123
17233afa244SBram Moolenaar  assert_equal(123, w)
1735deeb3f1SBram Moolenaarenddef
1745deeb3f1SBram Moolenaar
1753b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1763b74b6b4SBram Moolenaar  let lines =<< trim END
1773b74b6b4SBram Moolenaar      vim9script
1783b74b6b4SBram Moolenaar
179f5be8cdbSBram Moolenaar      # single character variable declarations work
1803b74b6b4SBram Moolenaar      let a: string
1813b74b6b4SBram Moolenaar      let b: number
1823b74b6b4SBram Moolenaar      let l: list<any>
1833b74b6b4SBram Moolenaar      let s: string
1843b74b6b4SBram Moolenaar      let t: number
1853b74b6b4SBram Moolenaar      let v: number
1863b74b6b4SBram Moolenaar      let w: number
1873b74b6b4SBram Moolenaar
188f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1893b74b6b4SBram Moolenaar      a = 'script-a'
1903b74b6b4SBram Moolenaar      b = 111
1913b74b6b4SBram Moolenaar      l = [1, 2, 3]
1923b74b6b4SBram Moolenaar      s = 'script-s'
1933b74b6b4SBram Moolenaar      t = 222
1943b74b6b4SBram Moolenaar      v = 333
1953b74b6b4SBram Moolenaar      w = 444
1963b74b6b4SBram Moolenaar
1973b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1983b74b6b4SBram Moolenaar      assert_equal(111, b)
1993b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2003b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2013b74b6b4SBram Moolenaar      assert_equal(222, t)
2023b74b6b4SBram Moolenaar      assert_equal(333, v)
2033b74b6b4SBram Moolenaar      assert_equal(444, w)
2043b74b6b4SBram Moolenaar  END
2053b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2063b74b6b4SBram Moolenaar  source Xsinglechar
2073b74b6b4SBram Moolenaar  delete('Xsinglechar')
2083b74b6b4SBram Moolenaarenddef
2093b74b6b4SBram Moolenaar
21084370087SBram Moolenaardef Test_assignment_list()
21184370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
21284370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
21384370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
21484370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
21584370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
21684370087SBram Moolenaar
21784370087SBram Moolenaar  let listS: list<string> = []
21884370087SBram Moolenaar  let listN: list<number> = []
21984370087SBram Moolenaar
22084370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
22184370087SBram Moolenaar  list2[-1] = 99
22284370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
22384370087SBram Moolenaar  list2[-2] = 88
22484370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
22584370087SBram Moolenaar  list2[-3] = 77
22684370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
227dd29f1b0SBram Moolenaar  list2 += [100]
228dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
229dd29f1b0SBram Moolenaar
230dd29f1b0SBram Moolenaar  list3 += ['end']
231dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
232dd29f1b0SBram Moolenaar
233dd29f1b0SBram Moolenaar
23484370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
235c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
23684370087SBram Moolenaar
23784370087SBram Moolenaar  # type becomes list<any>
23884370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
23984370087SBram Moolenaarenddef
24084370087SBram Moolenaar
241b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
242b31be3f9SBram Moolenaar  let lines =<< trim END
243b31be3f9SBram Moolenaar    vim9script
244b31be3f9SBram Moolenaar    let v1: number
245b31be3f9SBram Moolenaar    let v2: number
246b31be3f9SBram Moolenaar    let v3: number
247b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
248b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
249b31be3f9SBram Moolenaar  END
250b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
251b31be3f9SBram Moolenaarenddef
252b31be3f9SBram Moolenaar
25384370087SBram Moolenaardef Test_assignment_dict()
25484370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
25584370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
25684370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
25784370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
25874fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
25984370087SBram Moolenaar
260f5be8cdbSBram Moolenaar  # overwrite
261c785b9a7SBram Moolenaar  dict3['key'] = 'another'
262c785b9a7SBram Moolenaar
26358626872SBram Moolenaar  # empty key can be used
26458626872SBram Moolenaar  let dd = {}
26558626872SBram Moolenaar  dd[""] = 6
26658626872SBram Moolenaar  assert_equal({'': 6}, dd)
26784370087SBram Moolenaar
26884370087SBram Moolenaar  # type becomes dict<any>
26984370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
2708e4c8c85SBram Moolenaar
2718e4c8c85SBram Moolenaar  # assignment to script-local dict
2728e4c8c85SBram Moolenaar  let lines =<< trim END
2738e4c8c85SBram Moolenaar    vim9script
2748e4c8c85SBram Moolenaar    let test: dict<any> = {}
2758e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2768e4c8c85SBram Moolenaar      test['a'] = 43
2778e4c8c85SBram Moolenaar      return test
2788e4c8c85SBram Moolenaar    enddef
2798e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2808e4c8c85SBram Moolenaar  END
2818e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
2828e4c8c85SBram Moolenaar
2838e4c8c85SBram Moolenaar  lines =<< trim END
2848e4c8c85SBram Moolenaar    vim9script
2858e4c8c85SBram Moolenaar    let test: dict<any>
2868e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2878e4c8c85SBram Moolenaar      test['a'] = 43
2888e4c8c85SBram Moolenaar      return test
2898e4c8c85SBram Moolenaar    enddef
2908e4c8c85SBram Moolenaar    FillDict()
2918e4c8c85SBram Moolenaar  END
2928e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
2932caa1594SBram Moolenaar
2942caa1594SBram Moolenaar  # assignment to global dict
2952caa1594SBram Moolenaar  lines =<< trim END
2962caa1594SBram Moolenaar    vim9script
2972caa1594SBram Moolenaar    g:test = {}
2982caa1594SBram Moolenaar    def FillDict(): dict<any>
2992caa1594SBram Moolenaar      g:test['a'] = 43
3002caa1594SBram Moolenaar      return g:test
3012caa1594SBram Moolenaar    enddef
3022caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3032caa1594SBram Moolenaar  END
3042caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3052caa1594SBram Moolenaar
3062caa1594SBram Moolenaar  # assignment to buffer dict
3072caa1594SBram Moolenaar  lines =<< trim END
3082caa1594SBram Moolenaar    vim9script
3092caa1594SBram Moolenaar    b:test = {}
3102caa1594SBram Moolenaar    def FillDict(): dict<any>
3112caa1594SBram Moolenaar      b:test['a'] = 43
3122caa1594SBram Moolenaar      return b:test
3132caa1594SBram Moolenaar    enddef
3142caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3152caa1594SBram Moolenaar  END
3162caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
31784370087SBram Moolenaarenddef
31884370087SBram Moolenaar
319d3aac291SBram Moolenaardef Test_assignment_local()
320f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
321f5be8cdbSBram Moolenaar  # changed.
322d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
323d3aac291SBram Moolenaar    let b:existing = 'yes'
324d3aac291SBram Moolenaar    let w:existing = 'yes'
325d3aac291SBram Moolenaar    let t:existing = 'yes'
326d3aac291SBram Moolenaar
327d3aac291SBram Moolenaar    def Test_assignment_local_internal()
328d3aac291SBram Moolenaar      b:newvar = 'new'
329d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
330d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
331d3aac291SBram Moolenaar      b:existing = 'no'
332d3aac291SBram Moolenaar      assert_equal('no', b:existing)
333396f3138SBram Moolenaar      b:existing ..= 'NO'
334396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
335d3aac291SBram Moolenaar
336d3aac291SBram Moolenaar      w:newvar = 'new'
337d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
338d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
339d3aac291SBram Moolenaar      w:existing = 'no'
340d3aac291SBram Moolenaar      assert_equal('no', w:existing)
341396f3138SBram Moolenaar      w:existing ..= 'NO'
342396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
343d3aac291SBram Moolenaar
344d3aac291SBram Moolenaar      t:newvar = 'new'
345d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
346d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
347d3aac291SBram Moolenaar      t:existing = 'no'
348d3aac291SBram Moolenaar      assert_equal('no', t:existing)
349396f3138SBram Moolenaar      t:existing ..= 'NO'
350396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
351d3aac291SBram Moolenaar    enddef
352d3aac291SBram Moolenaar    call Test_assignment_local_internal()
353d3aac291SBram Moolenaar  END
354d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
355d3aac291SBram Moolenaarenddef
356d3aac291SBram Moolenaar
3575deeb3f1SBram Moolenaardef Test_assignment_default()
358e69f6d04SBram Moolenaar
359cb711abfSBram Moolenaar  # Test default values.
360e69f6d04SBram Moolenaar  let thebool: bool
361e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
362e69f6d04SBram Moolenaar
363e69f6d04SBram Moolenaar  let thenumber: number
364e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
365e69f6d04SBram Moolenaar
366e69f6d04SBram Moolenaar  if has('float')
367e69f6d04SBram Moolenaar    let thefloat: float
368e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
369e69f6d04SBram Moolenaar  endif
370e69f6d04SBram Moolenaar
371e69f6d04SBram Moolenaar  let thestring: string
372e69f6d04SBram Moolenaar  assert_equal('', thestring)
373e69f6d04SBram Moolenaar
374e69f6d04SBram Moolenaar  let theblob: blob
375e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
376e69f6d04SBram Moolenaar
3775deeb3f1SBram Moolenaar  let Thefunc: func
3785deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
379e69f6d04SBram Moolenaar
380e69f6d04SBram Moolenaar  let thelist: list<any>
381e69f6d04SBram Moolenaar  assert_equal([], thelist)
382e69f6d04SBram Moolenaar
383e69f6d04SBram Moolenaar  let thedict: dict<any>
384e69f6d04SBram Moolenaar  assert_equal({}, thedict)
385e69f6d04SBram Moolenaar
3862c869deeSBram Moolenaar  if has('channel')
387e69f6d04SBram Moolenaar    let thejob: job
388e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
389e69f6d04SBram Moolenaar
390e69f6d04SBram Moolenaar    let thechannel: channel
391e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
392c785b9a7SBram Moolenaar
393c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
394f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
395c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
396c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
397c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
398c785b9a7SBram Moolenaar    endif
3992c869deeSBram Moolenaar  endif
400585fea7bSBram Moolenaar
401585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
402585fea7bSBram Moolenaar  assert_equal(5678, nr)
4038a7d6542SBram Moolenaarenddef
4048a7d6542SBram Moolenaar
40547a519a9SBram Moolenaardef Test_assignment_var_list()
40647a519a9SBram Moolenaar  let v1: string
40747a519a9SBram Moolenaar  let v2: string
4089af78769SBram Moolenaar  let vrem: list<string>
4099af78769SBram Moolenaar  [v1] = ['aaa']
4109af78769SBram Moolenaar  assert_equal('aaa', v1)
4119af78769SBram Moolenaar
41247a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
41347a519a9SBram Moolenaar  assert_equal('one', v1)
41447a519a9SBram Moolenaar  assert_equal('two', v2)
4159af78769SBram Moolenaar
4169af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4179af78769SBram Moolenaar  assert_equal('one', v1)
4189af78769SBram Moolenaar  assert_equal('two', v2)
4199af78769SBram Moolenaar  assert_equal([], vrem)
4209af78769SBram Moolenaar
4219af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4229af78769SBram Moolenaar  assert_equal('one', v1)
4239af78769SBram Moolenaar  assert_equal('two', v2)
4249af78769SBram Moolenaar  assert_equal(['three'], vrem)
4251c199f9cSBram Moolenaar
4261c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4271c199f9cSBram Moolenaar  assert_equal(3, &ts)
4281c199f9cSBram Moolenaar  assert_equal(4, &sw)
4291c199f9cSBram Moolenaar  set ts=8 sw=4
43047a519a9SBram Moolenaarenddef
43147a519a9SBram Moolenaar
432c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
433c7e44a7eSBram Moolenaar  let lines =<< trim END
434c7e44a7eSBram Moolenaar    vim9script
435c7e44a7eSBram Moolenaar    def Func(): list<number>
436c7e44a7eSBram Moolenaar      return [1, 2]
437c7e44a7eSBram Moolenaar    enddef
438c7e44a7eSBram Moolenaar    let var1: number
439c7e44a7eSBram Moolenaar    let var2: number
440c7e44a7eSBram Moolenaar    [var1, var2] =
441c7e44a7eSBram Moolenaar          Func()
442c7e44a7eSBram Moolenaar    assert_equal(1, var1)
443c7e44a7eSBram Moolenaar    assert_equal(2, var2)
444c7e44a7eSBram Moolenaar    let ll =
445c7e44a7eSBram Moolenaar          Func()
446c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
44783144546SBram Moolenaar
44883144546SBram Moolenaar    @/ = 'text'
44983144546SBram Moolenaar    assert_equal('text', @/)
45083144546SBram Moolenaar    @0 = 'zero'
45183144546SBram Moolenaar    assert_equal('zero', @0)
45283144546SBram Moolenaar    @1 = 'one'
45383144546SBram Moolenaar    assert_equal('one', @1)
45483144546SBram Moolenaar    @9 = 'nine'
45583144546SBram Moolenaar    assert_equal('nine', @9)
45683144546SBram Moolenaar    @- = 'minus'
45783144546SBram Moolenaar    assert_equal('minus', @-)
45883144546SBram Moolenaar    if has('clipboard_working')
45983144546SBram Moolenaar      @* = 'star'
46083144546SBram Moolenaar      assert_equal('star', @*)
46183144546SBram Moolenaar      @+ = 'plus'
46283144546SBram Moolenaar      assert_equal('plus', @+)
46383144546SBram Moolenaar    endif
46495dd9f25SBram Moolenaar
46595dd9f25SBram Moolenaar    let a: number = 123
46695dd9f25SBram Moolenaar    assert_equal(123, a)
46795dd9f25SBram Moolenaar    let s: string = 'yes'
46895dd9f25SBram Moolenaar    assert_equal('yes', s)
46995dd9f25SBram Moolenaar    let b: number = 42
47095dd9f25SBram Moolenaar    assert_equal(42, b)
47195dd9f25SBram Moolenaar    let w: number = 43
47295dd9f25SBram Moolenaar    assert_equal(43, w)
47395dd9f25SBram Moolenaar    let t: number = 44
47495dd9f25SBram Moolenaar    assert_equal(44, t)
475c7e44a7eSBram Moolenaar  END
476c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
477c7e44a7eSBram Moolenaarenddef
478c7e44a7eSBram Moolenaar
479cab27678SBram Moolenaardef Mess(): string
480cab27678SBram Moolenaar  v:foldstart = 123
481cab27678SBram Moolenaar  return 'xxx'
482cab27678SBram Moolenaarenddef
483cab27678SBram Moolenaar
484d72c1bf0SBram Moolenaardef Test_assignment_failure()
4858a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
4868a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
4878a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
4888a7d6542SBram Moolenaar
48963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
49063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
49163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
49263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
49363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
49463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
49563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
49663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
49763be3d4bSBram Moolenaar
4988a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
4998a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5008a7d6542SBram Moolenaar
5019b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5029af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5039af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5049af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5059af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5069af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5079af78769SBram Moolenaar                            'let y: number',
5089af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5099af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5109af78769SBram Moolenaar                            'let y: number',
5119af78769SBram Moolenaar                            'let z: list<number>',
5129af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5139be61bbbSBram Moolenaar
514e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
515c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5169be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
517c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5189be61bbbSBram Moolenaar
519e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
520c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5219be61bbbSBram Moolenaar
522434d72cbSBram Moolenaar  if has('dnd')
52365821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
524434d72cbSBram Moolenaar  else
525434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
526434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
527434d72cbSBram Moolenaar  endif
5289be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
52965821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
530c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5319be61bbbSBram Moolenaar
532e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
533e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
534e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
535e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5369be61bbbSBram Moolenaar
5379be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5389be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5399be61bbbSBram Moolenaar
540822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
54133fa29cfSBram Moolenaar
5428a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5438a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5448a7d6542SBram Moolenaar
5458a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5468a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5478a7d6542SBram Moolenaar
5488a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5498a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
55042a480bfSBram Moolenaar
551d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
55242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
553cab27678SBram Moolenaar
554cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
555cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
55643e969d3SBram Moolenaar
55743e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
55843e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
55943e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
56043e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
56143e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
56243e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
56343e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
56443e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
565d72c1bf0SBram Moolenaarenddef
566d72c1bf0SBram Moolenaar
567d72c1bf0SBram Moolenaardef Test_unlet()
568d72c1bf0SBram Moolenaar  g:somevar = 'yes'
569d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
570d72c1bf0SBram Moolenaar  unlet g:somevar
571d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
572d72c1bf0SBram Moolenaar  unlet! g:somevar
573d72c1bf0SBram Moolenaar
574d72c1bf0SBram Moolenaar  call CheckScriptFailure([
575d72c1bf0SBram Moolenaar        'vim9script',
576d72c1bf0SBram Moolenaar        'let svar = 123',
577d72c1bf0SBram Moolenaar        'unlet svar',
578d72c1bf0SBram Moolenaar        ], 'E1081:')
579d72c1bf0SBram Moolenaar  call CheckScriptFailure([
580d72c1bf0SBram Moolenaar        'vim9script',
581d72c1bf0SBram Moolenaar        'let svar = 123',
582d72c1bf0SBram Moolenaar        'unlet s:svar',
583d72c1bf0SBram Moolenaar        ], 'E1081:')
584d72c1bf0SBram Moolenaar  call CheckScriptFailure([
585d72c1bf0SBram Moolenaar        'vim9script',
586d72c1bf0SBram Moolenaar        'let svar = 123',
587d72c1bf0SBram Moolenaar        'def Func()',
588d72c1bf0SBram Moolenaar        '  unlet svar',
589d72c1bf0SBram Moolenaar        'enddef',
590822ba247SBram Moolenaar        'defcompile',
591d72c1bf0SBram Moolenaar        ], 'E1081:')
592d72c1bf0SBram Moolenaar  call CheckScriptFailure([
593d72c1bf0SBram Moolenaar        'vim9script',
594d72c1bf0SBram Moolenaar        'let svar = 123',
595d72c1bf0SBram Moolenaar        'def Func()',
596d72c1bf0SBram Moolenaar        '  unlet s:svar',
597d72c1bf0SBram Moolenaar        'enddef',
598822ba247SBram Moolenaar        'defcompile',
599d72c1bf0SBram Moolenaar        ], 'E1081:')
6007bdaea6eSBram Moolenaar
6017bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6027bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6037bdaea6eSBram Moolenaar  unlet $ENVVAR
6047bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
605d72c1bf0SBram Moolenaarenddef
606599c89c8SBram Moolenaar
6074c17ad94SBram Moolenaardef Test_delfunction()
608f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6094c17ad94SBram Moolenaar  CheckScriptSuccess([
6104c17ad94SBram Moolenaar      'vim9script',
6114c17ad94SBram Moolenaar      'func CheckMe()',
6124c17ad94SBram Moolenaar      '  return 123',
6134c17ad94SBram Moolenaar      'endfunc',
6144c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6154c17ad94SBram Moolenaar      ])
6164c17ad94SBram Moolenaar
617f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6184c17ad94SBram Moolenaar  CheckScriptFailure([
6194c17ad94SBram Moolenaar      'vim9script',
6204c17ad94SBram Moolenaar      'func DeleteMe1()',
6214c17ad94SBram Moolenaar      'endfunc',
6224c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6234c17ad94SBram Moolenaar      ], 'E1084:')
6244c17ad94SBram Moolenaar  CheckScriptFailure([
6254c17ad94SBram Moolenaar      'vim9script',
6264c17ad94SBram Moolenaar      'func DeleteMe2()',
6274c17ad94SBram Moolenaar      'endfunc',
6284c17ad94SBram Moolenaar      'def DoThat()',
6294c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6304c17ad94SBram Moolenaar      'enddef',
6314c17ad94SBram Moolenaar      'DoThat()',
6324c17ad94SBram Moolenaar      ], 'E1084:')
6334c17ad94SBram Moolenaar  CheckScriptFailure([
6344c17ad94SBram Moolenaar      'vim9script',
6354c17ad94SBram Moolenaar      'def DeleteMe3()',
6364c17ad94SBram Moolenaar      'enddef',
6374c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6384c17ad94SBram Moolenaar      ], 'E1084:')
6394c17ad94SBram Moolenaar  CheckScriptFailure([
6404c17ad94SBram Moolenaar      'vim9script',
6414c17ad94SBram Moolenaar      'def DeleteMe4()',
6424c17ad94SBram Moolenaar      'enddef',
6434c17ad94SBram Moolenaar      'def DoThat()',
6444c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6454c17ad94SBram Moolenaar      'enddef',
6464c17ad94SBram Moolenaar      'DoThat()',
6474c17ad94SBram Moolenaar      ], 'E1084:')
648925e9fd6SBram Moolenaar
649925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
650925e9fd6SBram Moolenaar  let lines =<< trim END
651925e9fd6SBram Moolenaar      vim9script
652925e9fd6SBram Moolenaar      def g:Global(): string
653925e9fd6SBram Moolenaar        return "yes"
654925e9fd6SBram Moolenaar      enddef
655925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
656925e9fd6SBram Moolenaar      def! g:Global(): string
657925e9fd6SBram Moolenaar        return "no"
658925e9fd6SBram Moolenaar      enddef
659925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
660925e9fd6SBram Moolenaar      delfunc g:Global
661925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
662925e9fd6SBram Moolenaar  END
663925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
664925e9fd6SBram Moolenaar
665925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
666925e9fd6SBram Moolenaar  lines =<< trim END
667925e9fd6SBram Moolenaar      vim9script
668925e9fd6SBram Moolenaar      func g:Global()
669925e9fd6SBram Moolenaar        return "yes"
670925e9fd6SBram Moolenaar      endfunc
671925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
672925e9fd6SBram Moolenaar      def! g:Global(): string
673925e9fd6SBram Moolenaar        return "no"
674925e9fd6SBram Moolenaar      enddef
675925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
676925e9fd6SBram Moolenaar      delfunc g:Global
677925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
678925e9fd6SBram Moolenaar  END
679925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
680925e9fd6SBram Moolenaar
681925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
682925e9fd6SBram Moolenaar  lines =<< trim END
683925e9fd6SBram Moolenaar      vim9script
684925e9fd6SBram Moolenaar      def g:Global(): string
685925e9fd6SBram Moolenaar        return "yes"
686925e9fd6SBram Moolenaar      enddef
687925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
688925e9fd6SBram Moolenaar      func! g:Global()
689925e9fd6SBram Moolenaar        return "no"
690925e9fd6SBram Moolenaar      endfunc
691925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
692925e9fd6SBram Moolenaar      delfunc g:Global
693925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
694925e9fd6SBram Moolenaar  END
695925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6964c17ad94SBram Moolenaarenddef
6974c17ad94SBram Moolenaar
698599c89c8SBram Moolenaarfunc Test_wrong_type()
699599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
700599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
701599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
702599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
703599c89c8SBram Moolenaar
704599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
705599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
70642a480bfSBram Moolenaar
70742a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
70842a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
70942a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
71042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
71142a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
71242a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
71342a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
71442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
71542a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
71642a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
71742a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
718a0a9f43aSBram Moolenaar
719a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
720a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7218a7d6542SBram Moolenaarendfunc
7228a7d6542SBram Moolenaar
7238a7d6542SBram Moolenaarfunc Test_const()
7248a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7258a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7268a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7279be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7288a7d6542SBram Moolenaarendfunc
7298a7d6542SBram Moolenaar
730df069eecSBram Moolenaardef Test_range_no_colon()
731df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
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 Moolenaarenddef
736df069eecSBram Moolenaar
737df069eecSBram Moolenaar
7388a7d6542SBram Moolenaardef Test_block()
7398a7d6542SBram Moolenaar  let outer = 1
7408a7d6542SBram Moolenaar  {
7418a7d6542SBram Moolenaar    let inner = 2
7428a7d6542SBram Moolenaar    assert_equal(1, outer)
7438a7d6542SBram Moolenaar    assert_equal(2, inner)
7448a7d6542SBram Moolenaar  }
7458a7d6542SBram Moolenaar  assert_equal(1, outer)
7468a7d6542SBram Moolenaarenddef
7478a7d6542SBram Moolenaar
7488a7d6542SBram Moolenaarfunc Test_block_failure()
7498a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
750585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
751585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7528a7d6542SBram Moolenaarendfunc
7538a7d6542SBram Moolenaar
754585fea7bSBram Moolenaardef Test_cmd_modifier()
755585fea7bSBram Moolenaar  tab echo '0'
756585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
757585fea7bSBram Moolenaarenddef
758585fea7bSBram Moolenaar
759d032f34aSBram Moolenaarfunc g:NoSuchFunc()
760d032f34aSBram Moolenaar  echo 'none'
761d032f34aSBram Moolenaarendfunc
762d032f34aSBram Moolenaar
7638a7d6542SBram Moolenaardef Test_try_catch()
7648a7d6542SBram Moolenaar  let l = []
7657a092245SBram Moolenaar  try # comment
7668a7d6542SBram Moolenaar    add(l, '1')
7678a7d6542SBram Moolenaar    throw 'wrong'
7688a7d6542SBram Moolenaar    add(l, '2')
7697a092245SBram Moolenaar  catch # comment
7708a7d6542SBram Moolenaar    add(l, v:exception)
7717a092245SBram Moolenaar  finally # comment
7728a7d6542SBram Moolenaar    add(l, '3')
7737a092245SBram Moolenaar  endtry # comment
7748a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
77568d130c6SBram Moolenaar
776e859312eSBram Moolenaar  l = []
777e859312eSBram Moolenaar  try
778e859312eSBram Moolenaar    try
779e859312eSBram Moolenaar      add(l, '1')
780e859312eSBram Moolenaar      throw 'wrong'
781e859312eSBram Moolenaar      add(l, '2')
782e859312eSBram Moolenaar    catch /right/
783e859312eSBram Moolenaar      add(l, v:exception)
784e859312eSBram Moolenaar    endtry
785e859312eSBram Moolenaar  catch /wrong/
786e859312eSBram Moolenaar    add(l, 'caught')
787e859312eSBram Moolenaar  finally
788e859312eSBram Moolenaar    add(l, 'finally')
789e859312eSBram Moolenaar  endtry
790e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
791e859312eSBram Moolenaar
79268d130c6SBram Moolenaar  let n: number
79368d130c6SBram Moolenaar  try
79468d130c6SBram Moolenaar    n = l[3]
79568d130c6SBram Moolenaar  catch /E684:/
79668d130c6SBram Moolenaar    n = 99
79768d130c6SBram Moolenaar  endtry
79868d130c6SBram Moolenaar  assert_equal(99, n)
79968d130c6SBram Moolenaar
80068d130c6SBram Moolenaar  try
80168d130c6SBram Moolenaar    n = g:astring[3]
80268d130c6SBram Moolenaar  catch /E714:/
80368d130c6SBram Moolenaar    n = 77
80468d130c6SBram Moolenaar  endtry
80568d130c6SBram Moolenaar  assert_equal(77, n)
80668d130c6SBram Moolenaar
80768d130c6SBram Moolenaar  try
80868d130c6SBram Moolenaar    n = l[g:astring]
80968d130c6SBram Moolenaar  catch /E39:/
81068d130c6SBram Moolenaar    n = 77
81168d130c6SBram Moolenaar  endtry
81268d130c6SBram Moolenaar  assert_equal(77, n)
81368d130c6SBram Moolenaar
81468d130c6SBram Moolenaar  try
81568d130c6SBram Moolenaar    n = s:does_not_exist
81668d130c6SBram Moolenaar  catch /E121:/
817f0b9f43cSBram Moolenaar    n = 111
818f0b9f43cSBram Moolenaar  endtry
819f0b9f43cSBram Moolenaar  assert_equal(111, n)
820f0b9f43cSBram Moolenaar
821f0b9f43cSBram Moolenaar  try
822f0b9f43cSBram Moolenaar    n = g:does_not_exist
823f0b9f43cSBram Moolenaar  catch /E121:/
82468d130c6SBram Moolenaar    n = 121
82568d130c6SBram Moolenaar  endtry
82668d130c6SBram Moolenaar  assert_equal(121, n)
82768d130c6SBram Moolenaar
82868d130c6SBram Moolenaar  let d = #{one: 1}
82968d130c6SBram Moolenaar  try
83068d130c6SBram Moolenaar    n = d[g:astring]
83168d130c6SBram Moolenaar  catch /E716:/
83268d130c6SBram Moolenaar    n = 222
83368d130c6SBram Moolenaar  endtry
83468d130c6SBram Moolenaar  assert_equal(222, n)
835f0b9f43cSBram Moolenaar
836f0b9f43cSBram Moolenaar  try
837f0b9f43cSBram Moolenaar    n = -g:astring
838f0b9f43cSBram Moolenaar  catch /E39:/
839f0b9f43cSBram Moolenaar    n = 233
840f0b9f43cSBram Moolenaar  endtry
841f0b9f43cSBram Moolenaar  assert_equal(233, n)
842f0b9f43cSBram Moolenaar
843f0b9f43cSBram Moolenaar  try
844f0b9f43cSBram Moolenaar    n = +g:astring
845f0b9f43cSBram Moolenaar  catch /E1030:/
846f0b9f43cSBram Moolenaar    n = 244
847f0b9f43cSBram Moolenaar  endtry
848f0b9f43cSBram Moolenaar  assert_equal(244, n)
849f0b9f43cSBram Moolenaar
850f0b9f43cSBram Moolenaar  try
851f0b9f43cSBram Moolenaar    n = +g:alist
852f0b9f43cSBram Moolenaar  catch /E745:/
853f0b9f43cSBram Moolenaar    n = 255
854f0b9f43cSBram Moolenaar  endtry
855f0b9f43cSBram Moolenaar  assert_equal(255, n)
856f0b9f43cSBram Moolenaar
857f0b9f43cSBram Moolenaar  let nd: dict<any>
858f0b9f43cSBram Moolenaar  try
859f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
860f0b9f43cSBram Moolenaar  catch /E1029:/
861f0b9f43cSBram Moolenaar    n = 266
862f0b9f43cSBram Moolenaar  endtry
863f0b9f43cSBram Moolenaar  assert_equal(266, n)
864f0b9f43cSBram Moolenaar
865f0b9f43cSBram Moolenaar  try
866f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
867f0b9f43cSBram Moolenaar  catch /E1093:/
868f0b9f43cSBram Moolenaar    n = 277
869f0b9f43cSBram Moolenaar  endtry
870f0b9f43cSBram Moolenaar  assert_equal(277, n)
871f0b9f43cSBram Moolenaar
872e859312eSBram Moolenaar  try
873e859312eSBram Moolenaar    &ts = g:astring
874e859312eSBram Moolenaar  catch /E1029:/
875e859312eSBram Moolenaar    n = 288
876e859312eSBram Moolenaar  endtry
877e859312eSBram Moolenaar  assert_equal(288, n)
878e859312eSBram Moolenaar
879e859312eSBram Moolenaar  try
880e859312eSBram Moolenaar    &backspace = 'asdf'
881e859312eSBram Moolenaar  catch /E474:/
882e859312eSBram Moolenaar    n = 299
883e859312eSBram Moolenaar  endtry
884e859312eSBram Moolenaar  assert_equal(299, n)
885e859312eSBram Moolenaar
886e859312eSBram Moolenaar  l = [1]
887e859312eSBram Moolenaar  try
888e859312eSBram Moolenaar    l[3] = 3
889e859312eSBram Moolenaar  catch /E684:/
890e859312eSBram Moolenaar    n = 300
891e859312eSBram Moolenaar  endtry
892e859312eSBram Moolenaar  assert_equal(300, n)
893e859312eSBram Moolenaar
894e859312eSBram Moolenaar  try
895e859312eSBram Moolenaar    unlet g:does_not_exist
896e859312eSBram Moolenaar  catch /E108:/
897e859312eSBram Moolenaar    n = 322
898e859312eSBram Moolenaar  endtry
899e859312eSBram Moolenaar  assert_equal(322, n)
900e859312eSBram Moolenaar
901e859312eSBram Moolenaar  try
902e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
903e859312eSBram Moolenaar  catch /E721:/
904e859312eSBram Moolenaar    n = 333
905e859312eSBram Moolenaar  endtry
906e859312eSBram Moolenaar  assert_equal(333, n)
907e859312eSBram Moolenaar
908e859312eSBram Moolenaar  try
909e859312eSBram Moolenaar    l = DeletedFunc()
910e859312eSBram Moolenaar  catch /E933:/
911e859312eSBram Moolenaar    n = 344
912e859312eSBram Moolenaar  endtry
913e859312eSBram Moolenaar  assert_equal(344, n)
914d032f34aSBram Moolenaar
915d032f34aSBram Moolenaar  try
916d032f34aSBram Moolenaar    echo len(v:true)
917d032f34aSBram Moolenaar  catch /E701:/
918d032f34aSBram Moolenaar    n = 355
919d032f34aSBram Moolenaar  endtry
920d032f34aSBram Moolenaar  assert_equal(355, n)
921d032f34aSBram Moolenaar
922d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
923d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
924d032f34aSBram Moolenaar  try
925d032f34aSBram Moolenaar    echo P()
926d032f34aSBram Moolenaar  catch /E117:/
927d032f34aSBram Moolenaar    n = 366
928d032f34aSBram Moolenaar  endtry
929d032f34aSBram Moolenaar  assert_equal(366, n)
930d032f34aSBram Moolenaar
931d032f34aSBram Moolenaar  try
932d032f34aSBram Moolenaar    echo g:NoSuchFunc()
933d032f34aSBram Moolenaar  catch /E117:/
934d032f34aSBram Moolenaar    n = 377
935d032f34aSBram Moolenaar  endtry
936d032f34aSBram Moolenaar  assert_equal(377, n)
937d032f34aSBram Moolenaar
938d032f34aSBram Moolenaar  try
939d032f34aSBram Moolenaar    echo g:alist + 4
940d032f34aSBram Moolenaar  catch /E745:/
941d032f34aSBram Moolenaar    n = 388
942d032f34aSBram Moolenaar  endtry
943d032f34aSBram Moolenaar  assert_equal(388, n)
944d032f34aSBram Moolenaar
945d032f34aSBram Moolenaar  try
946d032f34aSBram Moolenaar    echo 4 + g:alist
947d032f34aSBram Moolenaar  catch /E745:/
948d032f34aSBram Moolenaar    n = 399
949d032f34aSBram Moolenaar  endtry
950d032f34aSBram Moolenaar  assert_equal(399, n)
951d032f34aSBram Moolenaar
952d032f34aSBram Moolenaar  try
953d032f34aSBram Moolenaar    echo g:alist.member
954d032f34aSBram Moolenaar  catch /E715:/
955d032f34aSBram Moolenaar    n = 400
956d032f34aSBram Moolenaar  endtry
957d032f34aSBram Moolenaar  assert_equal(400, n)
958d032f34aSBram Moolenaar
959d032f34aSBram Moolenaar  try
960d032f34aSBram Moolenaar    echo d.member
961d032f34aSBram Moolenaar  catch /E716:/
962d032f34aSBram Moolenaar    n = 411
963d032f34aSBram Moolenaar  endtry
964d032f34aSBram Moolenaar  assert_equal(411, n)
9658a7d6542SBram Moolenaarenddef
9668a7d6542SBram Moolenaar
967e859312eSBram Moolenaardef DeletedFunc(): list<any>
968e859312eSBram Moolenaar  return ['delete me']
969e859312eSBram Moolenaarenddef
970e859312eSBram Moolenaardefcompile
971e859312eSBram Moolenaardelfunc DeletedFunc
972e859312eSBram Moolenaar
973257cc5eeSBram Moolenaardef ThrowFromDef()
974a72cfb80SBram Moolenaar  throw "getout" # comment
975257cc5eeSBram Moolenaarenddef
976257cc5eeSBram Moolenaar
977257cc5eeSBram Moolenaarfunc CatchInFunc()
978257cc5eeSBram Moolenaar  try
979257cc5eeSBram Moolenaar    call ThrowFromDef()
980257cc5eeSBram Moolenaar  catch
981257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
982257cc5eeSBram Moolenaar  endtry
983257cc5eeSBram Moolenaarendfunc
984257cc5eeSBram Moolenaar
985257cc5eeSBram Moolenaardef CatchInDef()
986257cc5eeSBram Moolenaar  try
987257cc5eeSBram Moolenaar    ThrowFromDef()
988257cc5eeSBram Moolenaar  catch
989257cc5eeSBram Moolenaar    g:thrown_def = v:exception
990257cc5eeSBram Moolenaar  endtry
991257cc5eeSBram Moolenaarenddef
992257cc5eeSBram Moolenaar
993f575adffSBram Moolenaardef ReturnFinally(): string
994f575adffSBram Moolenaar  try
995f575adffSBram Moolenaar    return 'intry'
996f575adffSBram Moolenaar  finally
997f575adffSBram Moolenaar    g:in_finally = 'finally'
998f575adffSBram Moolenaar  endtry
999f575adffSBram Moolenaar  return 'end'
1000f575adffSBram Moolenaarenddef
1001f575adffSBram Moolenaar
1002257cc5eeSBram Moolenaardef Test_try_catch_nested()
1003257cc5eeSBram Moolenaar  CatchInFunc()
1004257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1005257cc5eeSBram Moolenaar
1006257cc5eeSBram Moolenaar  CatchInDef()
1007257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1008f575adffSBram Moolenaar
1009f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1010f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1011f575adffSBram Moolenaarenddef
1012f575adffSBram Moolenaar
1013f575adffSBram Moolenaardef Test_try_catch_match()
1014f575adffSBram Moolenaar  let seq = 'a'
1015f575adffSBram Moolenaar  try
1016f575adffSBram Moolenaar    throw 'something'
1017f575adffSBram Moolenaar  catch /nothing/
1018f575adffSBram Moolenaar    seq ..= 'x'
1019f575adffSBram Moolenaar  catch /some/
1020f575adffSBram Moolenaar    seq ..= 'b'
1021f575adffSBram Moolenaar  catch /asdf/
1022f575adffSBram Moolenaar    seq ..= 'x'
1023e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1024e8c4abbbSBram Moolenaar    seq ..= 'y'
1025f575adffSBram Moolenaar  finally
1026f575adffSBram Moolenaar    seq ..= 'c'
1027f575adffSBram Moolenaar  endtry
1028f575adffSBram Moolenaar  assert_equal('abc', seq)
1029257cc5eeSBram Moolenaarenddef
1030257cc5eeSBram Moolenaar
1031e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1032e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1033e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1034e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1035585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1036585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1037585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1038585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1039585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1040585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1041585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1042585fea7bSBram Moolenaar
1043a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1044585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1045e8c4abbbSBram Moolenaarenddef
1046e8c4abbbSBram Moolenaar
1047006ad48bSBram Moolenaardef Test_throw_vimscript()
1048f5be8cdbSBram Moolenaar  # only checks line continuation
1049006ad48bSBram Moolenaar  let lines =<< trim END
1050006ad48bSBram Moolenaar      vim9script
1051006ad48bSBram Moolenaar      try
1052006ad48bSBram Moolenaar        throw 'one'
1053006ad48bSBram Moolenaar              .. 'two'
1054006ad48bSBram Moolenaar      catch
1055006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1056006ad48bSBram Moolenaar      endtry
1057006ad48bSBram Moolenaar  END
1058006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1059006ad48bSBram Moolenaarenddef
1060006ad48bSBram Moolenaar
106137c83711SBram Moolenaardef Test_cexpr_vimscript()
1062f5be8cdbSBram Moolenaar  # only checks line continuation
106337c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
106437c83711SBram Moolenaar  let lines =<< trim END
106537c83711SBram Moolenaar      vim9script
106637c83711SBram Moolenaar      cexpr 'File'
106737c83711SBram Moolenaar                .. ' someFile' ..
106837c83711SBram Moolenaar                   ' line 19'
106937c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
107037c83711SBram Moolenaar  END
107137c83711SBram Moolenaar  CheckScriptSuccess(lines)
107237c83711SBram Moolenaar  set errorformat&
107337c83711SBram Moolenaarenddef
107437c83711SBram Moolenaar
1075b209750bSBram Moolenaardef Test_list_vimscript()
1076b209750bSBram Moolenaar  # checks line continuation and comments
1077b209750bSBram Moolenaar  let lines =<< trim END
1078b209750bSBram Moolenaar      vim9script
1079b209750bSBram Moolenaar      let mylist = [
1080b209750bSBram Moolenaar            'one',
1081b209750bSBram Moolenaar            # comment
1082b209750bSBram Moolenaar            'two', # empty line follows
1083b209750bSBram Moolenaar
1084b209750bSBram Moolenaar            'three',
1085b209750bSBram Moolenaar            ]
1086b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1087b209750bSBram Moolenaar  END
1088b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1089b209750bSBram Moolenaarenddef
1090b209750bSBram Moolenaar
10912a1381c3SBram Moolenaarif has('channel')
109240ee466cSBram Moolenaar  let someJob = test_null_job()
109340ee466cSBram Moolenaar
109440ee466cSBram Moolenaar  def FuncWithError()
109540ee466cSBram Moolenaar    echomsg g:someJob
109640ee466cSBram Moolenaar  enddef
109740ee466cSBram Moolenaar
109840ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
109940ee466cSBram Moolenaar    try
110040ee466cSBram Moolenaar      call FuncWithError()
110140ee466cSBram Moolenaar    catch
110240ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
110340ee466cSBram Moolenaar    endtry
110440ee466cSBram Moolenaar  endfunc
11052a1381c3SBram Moolenaarendif
110640ee466cSBram Moolenaar
11078a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11088a7d6542SBram Moolenaar  vim9script
11098a7d6542SBram Moolenaar  let name: string = 'bob'
11108a7d6542SBram Moolenaar  def Concat(arg: string): string
11118a7d6542SBram Moolenaar    return name .. arg
11128a7d6542SBram Moolenaar  enddef
1113227a69deSBram Moolenaar  g:result = Concat('bie')
1114227a69deSBram Moolenaar  g:localname = name
11158a7d6542SBram Moolenaar
11168a7d6542SBram Moolenaar  export const CONST = 1234
11178a7d6542SBram Moolenaar  export let exported = 9876
11186e587dcbSBram Moolenaar  export let exp_name = 'John'
11198a7d6542SBram Moolenaar  export def Exported(): string
11208a7d6542SBram Moolenaar    return 'Exported'
11218a7d6542SBram Moolenaar  enddef
11228a7d6542SBram MoolenaarEND
11238a7d6542SBram Moolenaar
11245269bd2aSBram Moolenaardef Test_vim9_import_export()
11258a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11268a7d6542SBram Moolenaar    vim9script
11278a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11288a7d6542SBram Moolenaar    g:imported = exported
11296e587dcbSBram Moolenaar    exported += 3
11306e587dcbSBram Moolenaar    g:imported_added = exported
11318a7d6542SBram Moolenaar    g:imported_func = Exported()
11326e587dcbSBram Moolenaar
113340f4f7a4SBram Moolenaar    def GetExported(): string
113440f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
113540f4f7a4SBram Moolenaar      return local_dict.ref()
113640f4f7a4SBram Moolenaar    enddef
113740f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
113840f4f7a4SBram Moolenaar
11396e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11406e587dcbSBram Moolenaar    g:imported_name = exp_name
11416e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11426e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11435381c7a1SBram Moolenaar    g:imported_later = exported
11448a7d6542SBram Moolenaar  END
11458a7d6542SBram Moolenaar
11468a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11478a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11488a7d6542SBram Moolenaar
11498a7d6542SBram Moolenaar  source Ximport.vim
11508a7d6542SBram Moolenaar
11518a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11528a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11538a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11546e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11555381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11568a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
115740f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11586e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11596e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11608a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11618a7d6542SBram Moolenaar
11628a7d6542SBram Moolenaar  unlet g:result
11638a7d6542SBram Moolenaar  unlet g:localname
11648a7d6542SBram Moolenaar  unlet g:imported
11656e587dcbSBram Moolenaar  unlet g:imported_added
11665381c7a1SBram Moolenaar  unlet g:imported_later
11678a7d6542SBram Moolenaar  unlet g:imported_func
11686e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11698a7d6542SBram Moolenaar  delete('Ximport.vim')
1170f2d5c240SBram Moolenaar
11711c991144SBram Moolenaar  # similar, with line breaks
11721c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11731c991144SBram Moolenaar    vim9script
11741c991144SBram Moolenaar    import {
11751c991144SBram Moolenaar        exported,
11761c991144SBram Moolenaar        Exported,
11771c991144SBram Moolenaar        }
11781c991144SBram Moolenaar        from
11791c991144SBram Moolenaar        './Xexport.vim'
11801c991144SBram Moolenaar    g:imported = exported
11811c991144SBram Moolenaar    exported += 5
11821c991144SBram Moolenaar    g:imported_added = exported
11831c991144SBram Moolenaar    g:imported_func = Exported()
11841c991144SBram Moolenaar  END
11851c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11861c991144SBram Moolenaar  source Ximport_lbr.vim
11871c991144SBram Moolenaar
11881c991144SBram Moolenaar  assert_equal(9876, g:imported)
11891c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11901c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11911c991144SBram Moolenaar
11921c991144SBram Moolenaar  # exported script not sourced again
11931c991144SBram Moolenaar  assert_false(exists('g:result'))
11941c991144SBram Moolenaar  unlet g:imported
11951c991144SBram Moolenaar  unlet g:imported_added
11961c991144SBram Moolenaar  unlet g:imported_func
11971c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11981c991144SBram Moolenaar
11991c991144SBram Moolenaar  # import inside :def function
12005381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
12015381c7a1SBram Moolenaar    vim9script
12025381c7a1SBram Moolenaar    def ImportInDef()
12035381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12045381c7a1SBram Moolenaar      g:imported = exported
12055381c7a1SBram Moolenaar      exported += 7
12065381c7a1SBram Moolenaar      g:imported_added = exported
12075381c7a1SBram Moolenaar    enddef
12085381c7a1SBram Moolenaar    ImportInDef()
12095381c7a1SBram Moolenaar  END
12105381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12115381c7a1SBram Moolenaar  source Ximport2.vim
1212f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12135381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12145381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12155381c7a1SBram Moolenaar  unlet g:imported
12165381c7a1SBram Moolenaar  unlet g:imported_added
12175381c7a1SBram Moolenaar  delete('Ximport2.vim')
12185381c7a1SBram Moolenaar
1219f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1220f2d5c240SBram Moolenaar    vim9script
1221f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1222f2d5c240SBram Moolenaar    def UseExport()
1223f2d5c240SBram Moolenaar      g:imported = Export.exported
1224f2d5c240SBram Moolenaar    enddef
1225f2d5c240SBram Moolenaar    UseExport()
1226f2d5c240SBram Moolenaar  END
1227f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1228f2d5c240SBram Moolenaar  source Ximport.vim
12295381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1230f2d5c240SBram Moolenaar
1231599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1232599c89c8SBram Moolenaar    vim9script
1233599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1234599c89c8SBram Moolenaar    def Func()
1235599c89c8SBram Moolenaar      let dummy = 1
1236599c89c8SBram Moolenaar      let imported = Export + dummy
1237599c89c8SBram Moolenaar    enddef
1238822ba247SBram Moolenaar    defcompile
1239599c89c8SBram Moolenaar  END
1240599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1241599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1242599c89c8SBram Moolenaar
1243599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1244599c89c8SBram Moolenaar    vim9script
1245599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1246599c89c8SBram Moolenaar    def Func()
1247599c89c8SBram Moolenaar      let imported = Export . exported
1248599c89c8SBram Moolenaar    enddef
1249822ba247SBram Moolenaar    defcompile
1250599c89c8SBram Moolenaar  END
1251599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1252599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1253599c89c8SBram Moolenaar
1254599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1255599c89c8SBram Moolenaar    vim9script
1256599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1257599c89c8SBram Moolenaar    def Func()
1258599c89c8SBram Moolenaar      let imported = Export.
1259599c89c8SBram Moolenaar    enddef
1260822ba247SBram Moolenaar    defcompile
1261599c89c8SBram Moolenaar  END
1262599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1263599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1264599c89c8SBram Moolenaar
12651c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12661c991144SBram Moolenaar    vim9script
12671c991144SBram Moolenaar    import *
12681c991144SBram Moolenaar        as Export
12691c991144SBram Moolenaar        from
12701c991144SBram Moolenaar        './Xexport.vim'
12711c991144SBram Moolenaar    def UseExport()
12721c991144SBram Moolenaar      g:imported = Export.exported
12731c991144SBram Moolenaar    enddef
12741c991144SBram Moolenaar    UseExport()
12751c991144SBram Moolenaar  END
12761c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12771c991144SBram Moolenaar  source Ximport.vim
12781c991144SBram Moolenaar  assert_equal(9883, g:imported)
12791c991144SBram Moolenaar
1280f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1281f2d5c240SBram Moolenaar    vim9script
1282f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1283f2d5c240SBram Moolenaar  END
1284f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1285f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1286f2d5c240SBram Moolenaar
1287f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1288fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1289fa29c8abSBram Moolenaar    vim9script
1290fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1291fa29c8abSBram Moolenaar  END
1292fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1293fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1294fa29c8abSBram Moolenaar
1295f5be8cdbSBram Moolenaar  # try to import something that is already defined
12965269bd2aSBram Moolenaar  let import_already_defined =<< trim END
12975269bd2aSBram Moolenaar    vim9script
12985269bd2aSBram Moolenaar    let exported = 'something'
12995269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13005269bd2aSBram Moolenaar  END
13015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13025269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13035269bd2aSBram Moolenaar
1304f5be8cdbSBram Moolenaar  # try to import something that is already defined
13055269bd2aSBram Moolenaar  import_already_defined =<< trim END
13065269bd2aSBram Moolenaar    vim9script
13075269bd2aSBram Moolenaar    let exported = 'something'
13085269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13095269bd2aSBram Moolenaar  END
13105269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13115269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13125269bd2aSBram Moolenaar
1313f5be8cdbSBram Moolenaar  # try to import something that is already defined
13145269bd2aSBram Moolenaar  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  # import a very long name, requires making a copy
1323fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1324fa29c8abSBram Moolenaar    vim9script
1325fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1326fa29c8abSBram Moolenaar  END
1327fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1328fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1329fa29c8abSBram Moolenaar
1330fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1331fa29c8abSBram Moolenaar    vim9script
1332fa29c8abSBram Moolenaar    import name './Xexport.vim'
1333fa29c8abSBram Moolenaar  END
1334fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1335fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1336fa29c8abSBram Moolenaar
1337fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1338fa29c8abSBram Moolenaar    vim9script
1339fa29c8abSBram Moolenaar    import name from Xexport.vim
1340fa29c8abSBram Moolenaar  END
1341fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1342fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1343fa29c8abSBram Moolenaar
1344fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1345fa29c8abSBram Moolenaar    vim9script
1346fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1347fa29c8abSBram Moolenaar  END
1348fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1349fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1350fa29c8abSBram Moolenaar
1351fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1352fa29c8abSBram Moolenaar    vim9script
1353fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1354fa29c8abSBram Moolenaar  END
13555269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13565269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1357fa29c8abSBram Moolenaar
1358f2d5c240SBram Moolenaar  delete('Ximport.vim')
13595269bd2aSBram Moolenaar  delete('Ximport3.vim')
13608a7d6542SBram Moolenaar  delete('Xexport.vim')
13618a7d6542SBram Moolenaar
1362f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1363750802b5SBram Moolenaar  set cpo&vi
1364750802b5SBram Moolenaar  let cpo_before = &cpo
1365750802b5SBram Moolenaar  let lines =<< trim END
1366750802b5SBram Moolenaar    vim9script
1367750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1368750802b5SBram Moolenaar  END
1369750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1370750802b5SBram Moolenaar  source Xvim9_script
1371750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1372750802b5SBram Moolenaar  set cpo&vim
1373750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1374750802b5SBram Moolenaar  delete('Xvim9_script')
1375750802b5SBram Moolenaarenddef
1376750802b5SBram Moolenaar
1377803af686SBram Moolenaarfunc g:Trigger()
1378803af686SBram Moolenaar  source Ximport.vim
1379803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1380803af686SBram Moolenaarendfunc
1381803af686SBram Moolenaar
1382803af686SBram Moolenaardef Test_import_export_expr_map()
1383803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1384803af686SBram Moolenaar  let export_lines =<< trim END
1385803af686SBram Moolenaar    vim9script
1386803af686SBram Moolenaar    export def That(): string
1387803af686SBram Moolenaar      return 'yes'
1388803af686SBram Moolenaar    enddef
1389803af686SBram Moolenaar  END
1390803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1391803af686SBram Moolenaar
1392803af686SBram Moolenaar  let import_lines =<< trim END
1393803af686SBram Moolenaar    vim9script
1394803af686SBram Moolenaar    import That from './Xexport_that.vim'
1395803af686SBram Moolenaar    assert_equal('yes', That())
1396803af686SBram Moolenaar  END
1397803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1398803af686SBram Moolenaar
1399803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1400803af686SBram Moolenaar  feedkeys('trigger', "xt")
1401803af686SBram Moolenaar
1402803af686SBram Moolenaar  delete('Xexport.vim')
1403803af686SBram Moolenaar  delete('Ximport.vim')
1404803af686SBram Moolenaar  nunmap trigger
1405803af686SBram Moolenaarenddef
1406803af686SBram Moolenaar
14078e1986e3SBram Moolenaardef Test_import_in_filetype()
14088e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14098e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14108e1986e3SBram Moolenaar  let export_lines =<< trim END
14118e1986e3SBram Moolenaar    vim9script
14128e1986e3SBram Moolenaar    export let That = 'yes'
14138e1986e3SBram Moolenaar  END
14148e1986e3SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_that.vim')
14158e1986e3SBram Moolenaar
14168e1986e3SBram Moolenaar  let import_lines =<< trim END
14178e1986e3SBram Moolenaar    vim9script
14188e1986e3SBram Moolenaar    import That from './Xexport_that.vim'
14198e1986e3SBram Moolenaar    assert_equal('yes', That)
14208e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14218e1986e3SBram Moolenaar  END
14228e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14238e1986e3SBram Moolenaar
14248e1986e3SBram Moolenaar  let save_rtp = &rtp
14258e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14268e1986e3SBram Moolenaar
14278e1986e3SBram Moolenaar  filetype plugin on
14288e1986e3SBram Moolenaar  copen
14298e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14308e1986e3SBram Moolenaar
14318e1986e3SBram Moolenaar  quit!
14328e1986e3SBram Moolenaar  delete('Xexport.vim')
14338e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14348e1986e3SBram Moolenaar  &rtp = save_rtp
14358e1986e3SBram Moolenaarenddef
14368e1986e3SBram Moolenaar
1437750802b5SBram Moolenaardef Test_vim9script_fails()
14388a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14398a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1440750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
14419721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
14429b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1443750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1444750802b5SBram Moolenaar
1445c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1446c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1447c785b9a7SBram Moolenaar
1448750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1449a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
14508a7d6542SBram Moolenaarenddef
14518a7d6542SBram Moolenaar
1452f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1453101f4810SBram Moolenaar  CheckRunVimInTerminal
1454101f4810SBram Moolenaar
14559bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1456c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14579bb3eb3eSBram Moolenaarendfunc
14589bb3eb3eSBram Moolenaar
1459c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1460101f4810SBram Moolenaar  let export =<< trim END
1461101f4810SBram Moolenaar    vim9script
1462101f4810SBram Moolenaar    export def Foo(): number
1463101f4810SBram Moolenaar        return 0
1464101f4810SBram Moolenaar    enddef
1465101f4810SBram Moolenaar  END
14669bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1467101f4810SBram Moolenaar
14689bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
14699bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14709bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1471101f4810SBram Moolenaar
14729bb3eb3eSBram Moolenaar  delete('Xexport.vim')
14739bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14749bb3eb3eSBram Moolenaarenddef
1475101f4810SBram Moolenaar
14764c17ad94SBram Moolenaardef Test_vim9script_reload_import()
14778a7d6542SBram Moolenaar  let lines =<< trim END
14788a7d6542SBram Moolenaar    vim9script
14798a7d6542SBram Moolenaar    const var = ''
14808a7d6542SBram Moolenaar    let valone = 1234
14818a7d6542SBram Moolenaar    def MyFunc(arg: string)
14828a7d6542SBram Moolenaar       valone = 5678
14838a7d6542SBram Moolenaar    enddef
14848a7d6542SBram Moolenaar  END
14858a7d6542SBram Moolenaar  let morelines =<< trim END
14868a7d6542SBram Moolenaar    let valtwo = 222
14878a7d6542SBram Moolenaar    export def GetValtwo(): number
14888a7d6542SBram Moolenaar      return valtwo
14898a7d6542SBram Moolenaar    enddef
14908a7d6542SBram Moolenaar  END
149103afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14928a7d6542SBram Moolenaar  source Xreload.vim
14938a7d6542SBram Moolenaar  source Xreload.vim
14948a7d6542SBram Moolenaar  source Xreload.vim
14958a7d6542SBram Moolenaar
14968a7d6542SBram Moolenaar  let testlines =<< trim END
14978a7d6542SBram Moolenaar    vim9script
14988a7d6542SBram Moolenaar    def TheFunc()
14998a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15008a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15018a7d6542SBram Moolenaar    enddef
15028a7d6542SBram Moolenaar    TheFunc()
15038a7d6542SBram Moolenaar  END
15048a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15058a7d6542SBram Moolenaar  source Ximport.vim
15068a7d6542SBram Moolenaar
1507f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1508f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15098a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15108a7d6542SBram Moolenaar  source Ximport.vim
15118a7d6542SBram Moolenaar
1512f5be8cdbSBram Moolenaar  # cannot declare a var twice
15138a7d6542SBram Moolenaar  lines =<< trim END
15148a7d6542SBram Moolenaar    vim9script
15158a7d6542SBram Moolenaar    let valone = 1234
15168a7d6542SBram Moolenaar    let valone = 5678
15178a7d6542SBram Moolenaar  END
15188a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15198a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
15208a7d6542SBram Moolenaar
15218a7d6542SBram Moolenaar  delete('Xreload.vim')
15228a7d6542SBram Moolenaar  delete('Ximport.vim')
15238a7d6542SBram Moolenaarenddef
15248a7d6542SBram Moolenaar
1525fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1526fe465a01SBram Moolenaar" script-local name.
1527fe465a01SBram Moolenaardef Test_vim9script_funcref()
1528fe465a01SBram Moolenaar  let sortlines =<< trim END
1529fe465a01SBram Moolenaar      vim9script
1530fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1531bed36b93SBram Moolenaar        return i2 - i1
1532fe465a01SBram Moolenaar      enddef
1533fe465a01SBram Moolenaar
1534fe465a01SBram Moolenaar      export def FastSort(): list<number>
1535fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1536fe465a01SBram Moolenaar      enddef
1537fe465a01SBram Moolenaar  END
1538fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1539fe465a01SBram Moolenaar
1540fe465a01SBram Moolenaar  let lines =<< trim END
1541fe465a01SBram Moolenaar    vim9script
1542fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1543fe465a01SBram Moolenaar    def Test()
1544fe465a01SBram Moolenaar      g:result = FastSort()
1545fe465a01SBram Moolenaar    enddef
1546fe465a01SBram Moolenaar    Test()
1547fe465a01SBram Moolenaar  END
1548fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1549fe465a01SBram Moolenaar
1550fe465a01SBram Moolenaar  source Xscript.vim
1551fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1552fe465a01SBram Moolenaar
1553fe465a01SBram Moolenaar  unlet g:result
1554fe465a01SBram Moolenaar  delete('Xsort.vim')
1555fe465a01SBram Moolenaar  delete('Xscript.vim')
1556fe465a01SBram Moolenaarenddef
1557fe465a01SBram Moolenaar
1558c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1559c620c055SBram Moolenaar" script where FastFilter() is called from.
1560c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1561c620c055SBram Moolenaar  let filterLines =<< trim END
1562c620c055SBram Moolenaar    vim9script
1563c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1564c620c055SBram Moolenaar      return idx % 2 == 1
1565c620c055SBram Moolenaar    enddef
1566c620c055SBram Moolenaar    export def FastFilter(): list<number>
1567c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1568c620c055SBram Moolenaar    enddef
1569c620c055SBram Moolenaar  END
1570c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1571c620c055SBram Moolenaar
1572c620c055SBram Moolenaar  let lines =<< trim END
1573c620c055SBram Moolenaar    vim9script
1574c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1575c620c055SBram Moolenaar    def Test()
1576c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1577c620c055SBram Moolenaar    enddef
1578c620c055SBram Moolenaar    Test()
1579c620c055SBram Moolenaar  END
1580c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1581c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1582c620c055SBram Moolenaar
1583c620c055SBram Moolenaar  delete('Xfilter.vim')
1584c620c055SBram Moolenaar  delete('Ximport.vim')
1585c620c055SBram Moolenaarenddef
1586c620c055SBram Moolenaar
15874c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
15884c17ad94SBram Moolenaar  let first_lines =<< trim END
15894c17ad94SBram Moolenaar    vim9script
15904c17ad94SBram Moolenaar    def FuncYes(): string
15914c17ad94SBram Moolenaar      return 'yes'
15924c17ad94SBram Moolenaar    enddef
15934c17ad94SBram Moolenaar  END
159403afdcf1SBram Moolenaar  let withno_lines =<< trim END
15954c17ad94SBram Moolenaar    def FuncNo(): string
15964c17ad94SBram Moolenaar      return 'no'
15974c17ad94SBram Moolenaar    enddef
15984c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15994c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16004c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
160103afdcf1SBram Moolenaar    enddef
160203afdcf1SBram Moolenaar  END
160303afdcf1SBram Moolenaar  let nono_lines =<< trim END
160403afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
160503afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
16064c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
16074c17ad94SBram Moolenaar    enddef
16084c17ad94SBram Moolenaar  END
16094c17ad94SBram Moolenaar
16104c17ad94SBram Moolenaar  # FuncNo() is defined
161103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16124c17ad94SBram Moolenaar  source Xreloaded.vim
16134c17ad94SBram Moolenaar  g:DoCheck(true)
16144c17ad94SBram Moolenaar
16154c17ad94SBram Moolenaar  # FuncNo() is not redefined
161603afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16174c17ad94SBram Moolenaar  source Xreloaded.vim
161803afdcf1SBram Moolenaar  g:DoCheck()
16194c17ad94SBram Moolenaar
16204c17ad94SBram Moolenaar  # FuncNo() is back
162103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16224c17ad94SBram Moolenaar  source Xreloaded.vim
162303afdcf1SBram Moolenaar  g:DoCheck()
16244c17ad94SBram Moolenaar
16254c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16264c17ad94SBram Moolenaarenddef
16274c17ad94SBram Moolenaar
162889483d40SBram Moolenaardef Test_vim9script_reload_delvar()
162989483d40SBram Moolenaar  # write the script with a script-local variable
163089483d40SBram Moolenaar  let lines =<< trim END
163189483d40SBram Moolenaar    vim9script
163289483d40SBram Moolenaar    let var = 'string'
163389483d40SBram Moolenaar  END
163489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
163589483d40SBram Moolenaar  source XreloadVar.vim
163689483d40SBram Moolenaar
163789483d40SBram Moolenaar  # now write the script using the same variable locally - works
163889483d40SBram Moolenaar  lines =<< trim END
163989483d40SBram Moolenaar    vim9script
164089483d40SBram Moolenaar    def Func()
164189483d40SBram Moolenaar      let var = 'string'
164289483d40SBram Moolenaar    enddef
164389483d40SBram Moolenaar  END
164489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
164589483d40SBram Moolenaar  source XreloadVar.vim
164689483d40SBram Moolenaar
164789483d40SBram Moolenaar  delete('XreloadVar.vim')
164889483d40SBram Moolenaarenddef
164989483d40SBram Moolenaar
16508a7d6542SBram Moolenaardef Test_import_absolute()
16518a7d6542SBram Moolenaar  let import_lines = [
1652e6085c53SBram Moolenaar        'vim9script',
1653e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1654e6085c53SBram Moolenaar        'def UseExported()',
1655e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1656e6085c53SBram Moolenaar        '  exported = 8888',
1657e6085c53SBram Moolenaar        '  g:imported_after = exported',
1658e6085c53SBram Moolenaar        'enddef',
1659e6085c53SBram Moolenaar        'UseExported()',
1660e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1661e6085c53SBram Moolenaar        ]
16628a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16638a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16648a7d6542SBram Moolenaar
16658a7d6542SBram Moolenaar  source Ximport_abs.vim
16668a7d6542SBram Moolenaar
16678a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16684e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1669675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1670675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1671675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1672675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1673675f716eSBram Moolenaar          'exported = 8888.*' ..
1674675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1675675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1676675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1677675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1678e6085c53SBram Moolenaar        g:import_disassembled)
16798a7d6542SBram Moolenaar  unlet g:imported_abs
16804e12a5dfSBram Moolenaar  unlet g:import_disassembled
16818a7d6542SBram Moolenaar
16828a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16838a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16848a7d6542SBram Moolenaarenddef
16858a7d6542SBram Moolenaar
16868a7d6542SBram Moolenaardef Test_import_rtp()
16878a7d6542SBram Moolenaar  let import_lines = [
1688e6085c53SBram Moolenaar        'vim9script',
1689e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1690e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1691e6085c53SBram Moolenaar        ]
16928a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16938a7d6542SBram Moolenaar  mkdir('import')
16948a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16958a7d6542SBram Moolenaar
16968a7d6542SBram Moolenaar  let save_rtp = &rtp
16978a7d6542SBram Moolenaar  &rtp = getcwd()
16988a7d6542SBram Moolenaar  source Ximport_rtp.vim
16998a7d6542SBram Moolenaar  &rtp = save_rtp
17008a7d6542SBram Moolenaar
17018a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17028a7d6542SBram Moolenaar  unlet g:imported_rtp
17038a7d6542SBram Moolenaar
17048a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
170589483d40SBram Moolenaar  delete('import', 'rf')
17068a7d6542SBram Moolenaarenddef
17078a7d6542SBram Moolenaar
170825e0f586SBram Moolenaardef Test_import_compile_error()
170925e0f586SBram Moolenaar  let export_lines = [
171025e0f586SBram Moolenaar        'vim9script',
171125e0f586SBram Moolenaar        'export def ExpFunc(): string',
171225e0f586SBram Moolenaar        '  return notDefined',
171325e0f586SBram Moolenaar        'enddef',
171425e0f586SBram Moolenaar        ]
171525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
171625e0f586SBram Moolenaar
171725e0f586SBram Moolenaar  let import_lines = [
171825e0f586SBram Moolenaar        'vim9script',
171925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
172025e0f586SBram Moolenaar        'def ImpFunc()',
172125e0f586SBram Moolenaar        '  echo ExpFunc()',
172225e0f586SBram Moolenaar        'enddef',
172325e0f586SBram Moolenaar        'defcompile',
172425e0f586SBram Moolenaar        ]
172525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
172625e0f586SBram Moolenaar
172725e0f586SBram Moolenaar  try
172825e0f586SBram Moolenaar    source Ximport.vim
172925e0f586SBram Moolenaar  catch /E1001/
1730f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
173125e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
173225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
173325e0f586SBram Moolenaar  endtry
173425e0f586SBram Moolenaar
173525e0f586SBram Moolenaar  delete('Xexported.vim')
173625e0f586SBram Moolenaar  delete('Ximport.vim')
173725e0f586SBram Moolenaarenddef
173825e0f586SBram Moolenaar
1739eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1740eef2102eSBram Moolenaar  let export_lines =<< trim END
1741eef2102eSBram Moolenaar      vim9script
1742eef2102eSBram Moolenaar      export def Func()
1743eef2102eSBram Moolenaar        echo 'imported'
1744eef2102eSBram Moolenaar      enddef
1745eef2102eSBram Moolenaar  END
1746eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1747eef2102eSBram Moolenaar
1748eef2102eSBram Moolenaar  let lines =<< trim END
1749eef2102eSBram Moolenaar    vim9script
1750eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1751eef2102eSBram Moolenaar    def Func()
1752eef2102eSBram Moolenaar      echo 'local to function'
1753eef2102eSBram Moolenaar    enddef
1754eef2102eSBram Moolenaar  END
1755eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1756eef2102eSBram Moolenaar
1757eef2102eSBram Moolenaar  lines =<< trim END
1758eef2102eSBram Moolenaar    vim9script
1759eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1760eef2102eSBram Moolenaar    def Outer()
1761eef2102eSBram Moolenaar      def Func()
1762eef2102eSBram Moolenaar        echo 'local to function'
1763eef2102eSBram Moolenaar      enddef
1764eef2102eSBram Moolenaar    enddef
1765eef2102eSBram Moolenaar    defcompile
1766eef2102eSBram Moolenaar  END
1767eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1768eef2102eSBram Moolenaar
1769eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1770eef2102eSBram Moolenaarenddef
1771eef2102eSBram Moolenaar
1772b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1773b9a2cac3SBram Moolenaar  let lines =<< trim END
1774b9a2cac3SBram Moolenaar    vim9script
1775b9a2cac3SBram Moolenaar    def Func()
1776b9a2cac3SBram Moolenaar      echo 'one'
1777b9a2cac3SBram Moolenaar    enddef
1778b9a2cac3SBram Moolenaar    def Func()
1779b9a2cac3SBram Moolenaar      echo 'two'
1780b9a2cac3SBram Moolenaar    enddef
1781b9a2cac3SBram Moolenaar  END
1782b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1783*fa211f3cSBram Moolenaar
1784*fa211f3cSBram Moolenaar  lines =<< trim END
1785*fa211f3cSBram Moolenaar    vim9script
1786*fa211f3cSBram Moolenaar    def Foo(): string
1787*fa211f3cSBram Moolenaar      return 'foo'
1788*fa211f3cSBram Moolenaar      enddef
1789*fa211f3cSBram Moolenaar    def Func()
1790*fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1791*fa211f3cSBram Moolenaar    enddef
1792*fa211f3cSBram Moolenaar    defcompile
1793*fa211f3cSBram Moolenaar  END
1794*fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1795b9a2cac3SBram Moolenaarenddef
1796b9a2cac3SBram Moolenaar
17978a7d6542SBram Moolenaardef Test_fixed_size_list()
1798f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
17998a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
18008a7d6542SBram Moolenaar  l->remove(0)
18018a7d6542SBram Moolenaar  l->add(5)
18028a7d6542SBram Moolenaar  l->insert(99, 1)
18030f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18048a7d6542SBram Moolenaarenddef
18058a7d6542SBram Moolenaar
1806ae616494SBram Moolenaardef Test_no_insert_xit()
1807ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1808ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1809f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1810f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1811f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1812ae616494SBram Moolenaar
1813ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1814ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1815ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1816ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1817f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1818f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1819f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1820f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1821f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1822ae616494SBram Moolenaarenddef
1823ae616494SBram Moolenaar
1824158906cfSBram Moolenaardef IfElse(what: number): string
1825158906cfSBram Moolenaar  let res = ''
1826158906cfSBram Moolenaar  if what == 1
1827158906cfSBram Moolenaar    res = "one"
1828158906cfSBram Moolenaar  elseif what == 2
1829158906cfSBram Moolenaar    res = "two"
1830a259d8d3SBram Moolenaar  else
1831158906cfSBram Moolenaar    res = "three"
1832a259d8d3SBram Moolenaar  endif
1833158906cfSBram Moolenaar  return res
1834a259d8d3SBram Moolenaarenddef
1835a259d8d3SBram Moolenaar
1836158906cfSBram Moolenaardef Test_if_elseif_else()
1837158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1838158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1839158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18400f18b6d1SBram Moolenaarenddef
18410f18b6d1SBram Moolenaar
1842e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1843e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1844e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1845e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1846e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1847585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1848e8c4abbbSBram Moolenaarenddef
1849e8c4abbbSBram Moolenaar
18506d69bf60SBram Moolenaarlet g:bool_true = v:true
18516d69bf60SBram Moolenaarlet g:bool_false = v:false
18526d69bf60SBram Moolenaar
18536d69bf60SBram Moolenaardef Test_if_const_expr()
18546d69bf60SBram Moolenaar  let res = false
18556d69bf60SBram Moolenaar  if true ? true : false
18566d69bf60SBram Moolenaar    res = true
18576d69bf60SBram Moolenaar  endif
18586d69bf60SBram Moolenaar  assert_equal(true, res)
18596d69bf60SBram Moolenaar
1860585fea7bSBram Moolenaar  g:glob = 2
1861585fea7bSBram Moolenaar  if false
18626797966dSBram Moolenaar    execute('g:glob = 3')
1863585fea7bSBram Moolenaar  endif
1864585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1865585fea7bSBram Moolenaar  if true
18666797966dSBram Moolenaar    execute('g:glob = 3')
1867585fea7bSBram Moolenaar  endif
1868585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1869585fea7bSBram Moolenaar
18706d69bf60SBram Moolenaar  res = false
18716d69bf60SBram Moolenaar  if g:bool_true ? true : false
18726d69bf60SBram Moolenaar    res = true
18736d69bf60SBram Moolenaar  endif
18746d69bf60SBram Moolenaar  assert_equal(true, res)
18756d69bf60SBram Moolenaar
18766d69bf60SBram Moolenaar  res = false
18776d69bf60SBram Moolenaar  if true ? g:bool_true : false
18786d69bf60SBram Moolenaar    res = true
18796d69bf60SBram Moolenaar  endif
18806d69bf60SBram Moolenaar  assert_equal(true, res)
18816d69bf60SBram Moolenaar
18826d69bf60SBram Moolenaar  res = false
18836d69bf60SBram Moolenaar  if true ? true : g:bool_false
18846d69bf60SBram Moolenaar    res = true
18856d69bf60SBram Moolenaar  endif
18866d69bf60SBram Moolenaar  assert_equal(true, res)
18876d69bf60SBram Moolenaar
18886d69bf60SBram Moolenaar  res = false
18896d69bf60SBram Moolenaar  if true ? false : true
18906d69bf60SBram Moolenaar    res = true
18916d69bf60SBram Moolenaar  endif
18926d69bf60SBram Moolenaar  assert_equal(false, res)
18936d69bf60SBram Moolenaar
18946d69bf60SBram Moolenaar  res = false
18956d69bf60SBram Moolenaar  if false ? false : true
18966d69bf60SBram Moolenaar    res = true
18976d69bf60SBram Moolenaar  endif
18986d69bf60SBram Moolenaar  assert_equal(true, res)
18996d69bf60SBram Moolenaar
19006d69bf60SBram Moolenaar  res = false
19016d69bf60SBram Moolenaar  if false ? true : false
19026d69bf60SBram Moolenaar    res = true
19036d69bf60SBram Moolenaar  endif
19046d69bf60SBram Moolenaar  assert_equal(false, res)
19056d69bf60SBram Moolenaar
19066d69bf60SBram Moolenaar  res = false
1907e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1908e8c4abbbSBram Moolenaar    res = true
1909e8c4abbbSBram Moolenaar  endif
1910e8c4abbbSBram Moolenaar  assert_equal(false, res)
1911e8c4abbbSBram Moolenaar
1912e8c4abbbSBram Moolenaar  res = false
19136d69bf60SBram Moolenaar  if true && true
19146d69bf60SBram Moolenaar    res = true
19156d69bf60SBram Moolenaar  endif
19166d69bf60SBram Moolenaar  assert_equal(true, res)
19176d69bf60SBram Moolenaar
19186d69bf60SBram Moolenaar  res = false
19196d69bf60SBram Moolenaar  if true && false
19206d69bf60SBram Moolenaar    res = true
19216d69bf60SBram Moolenaar  endif
19226d69bf60SBram Moolenaar  assert_equal(false, res)
19236d69bf60SBram Moolenaar
19246d69bf60SBram Moolenaar  res = false
19256d69bf60SBram Moolenaar  if g:bool_true && false
19266d69bf60SBram Moolenaar    res = true
19276d69bf60SBram Moolenaar  endif
19286d69bf60SBram Moolenaar  assert_equal(false, res)
19296d69bf60SBram Moolenaar
19306d69bf60SBram Moolenaar  res = false
19316d69bf60SBram Moolenaar  if true && g:bool_false
19326d69bf60SBram Moolenaar    res = true
19336d69bf60SBram Moolenaar  endif
19346d69bf60SBram Moolenaar  assert_equal(false, res)
19356d69bf60SBram Moolenaar
19366d69bf60SBram Moolenaar  res = false
19376d69bf60SBram Moolenaar  if false && false
19386d69bf60SBram Moolenaar    res = true
19396d69bf60SBram Moolenaar  endif
19406d69bf60SBram Moolenaar  assert_equal(false, res)
19416d69bf60SBram Moolenaar
19426d69bf60SBram Moolenaar  res = false
19436d69bf60SBram Moolenaar  if true || false
19446d69bf60SBram Moolenaar    res = true
19456d69bf60SBram Moolenaar  endif
19466d69bf60SBram Moolenaar  assert_equal(true, res)
19476d69bf60SBram Moolenaar
19486d69bf60SBram Moolenaar  res = false
19496d69bf60SBram Moolenaar  if g:bool_true || false
19506d69bf60SBram Moolenaar    res = true
19516d69bf60SBram Moolenaar  endif
19526d69bf60SBram Moolenaar  assert_equal(true, res)
19536d69bf60SBram Moolenaar
19546d69bf60SBram Moolenaar  res = false
19556d69bf60SBram Moolenaar  if true || g:bool_false
19566d69bf60SBram Moolenaar    res = true
19576d69bf60SBram Moolenaar  endif
19586d69bf60SBram Moolenaar  assert_equal(true, res)
19596d69bf60SBram Moolenaar
19606d69bf60SBram Moolenaar  res = false
19616d69bf60SBram Moolenaar  if false || false
19626d69bf60SBram Moolenaar    res = true
19636d69bf60SBram Moolenaar  endif
19646d69bf60SBram Moolenaar  assert_equal(false, res)
196580c34ca3SBram Moolenaarenddef
19666d69bf60SBram Moolenaar
196780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
196880c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
196980c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1970e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1971e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19726d69bf60SBram Moolenaarenddef
19736d69bf60SBram Moolenaar
197472abcf42SBram Moolenaardef RunNested(i: number): number
197572abcf42SBram Moolenaar  let x: number = 0
197672abcf42SBram Moolenaar  if i % 2
197772abcf42SBram Moolenaar    if 1
1978f5be8cdbSBram Moolenaar      # comment
197972abcf42SBram Moolenaar    else
1980f5be8cdbSBram Moolenaar      # comment
198172abcf42SBram Moolenaar    endif
198272abcf42SBram Moolenaar    x += 1
198372abcf42SBram Moolenaar  else
198472abcf42SBram Moolenaar    x += 1000
198572abcf42SBram Moolenaar  endif
198672abcf42SBram Moolenaar  return x
198772abcf42SBram Moolenaarenddef
198872abcf42SBram Moolenaar
198972abcf42SBram Moolenaardef Test_nested_if()
199072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
199172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
199272abcf42SBram Moolenaarenddef
199372abcf42SBram Moolenaar
1994ad39c094SBram Moolenaardef Test_execute_cmd()
1995ad39c094SBram Moolenaar  new
1996ad39c094SBram Moolenaar  setline(1, 'default')
1997ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1998ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1999a72cfb80SBram Moolenaar
2000a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2001a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2002a72cfb80SBram Moolenaar
2003ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2004ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2005a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2006ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2007a72cfb80SBram Moolenaar
2008ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2009ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2010a72cfb80SBram Moolenaar
2011ad39c094SBram Moolenaar  let cmd_first = 'call '
2012ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2013ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2014ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2015ad39c094SBram Moolenaar  bwipe!
2016585fea7bSBram Moolenaar
20172d6b20d6SBram Moolenaar  let n = true
20182d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20192d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20202d6b20d6SBram Moolenaar
2021585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2022a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2023ad39c094SBram Moolenaarenddef
2024ad39c094SBram Moolenaar
202547e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2026f5be8cdbSBram Moolenaar  # only checks line continuation
202747e880d6SBram Moolenaar  let lines =<< trim END
202847e880d6SBram Moolenaar      vim9script
202947e880d6SBram Moolenaar      execute 'g:someVar'
203047e880d6SBram Moolenaar                .. ' = ' ..
203147e880d6SBram Moolenaar                   '28'
203247e880d6SBram Moolenaar      assert_equal(28, g:someVar)
203347e880d6SBram Moolenaar      unlet g:someVar
203447e880d6SBram Moolenaar  END
203547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
203647e880d6SBram Moolenaarenddef
203747e880d6SBram Moolenaar
2038ad39c094SBram Moolenaardef Test_echo_cmd()
2039a72cfb80SBram Moolenaar  echo 'some' # comment
2040585fea7bSBram Moolenaar  echon 'thing'
2041ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2042ad39c094SBram Moolenaar
2043a72cfb80SBram Moolenaar  echo "some" # comment
2044a72cfb80SBram Moolenaar  echon "thing"
2045a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2046a72cfb80SBram Moolenaar
2047ad39c094SBram Moolenaar  let str1 = 'some'
2048ad39c094SBram Moolenaar  let str2 = 'more'
2049ad39c094SBram Moolenaar  echo str1 str2
2050ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2051a72cfb80SBram Moolenaar
2052a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2053ad39c094SBram Moolenaarenddef
2054ad39c094SBram Moolenaar
2055f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2056f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2057f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2058f93c7feaSBram Moolenaar  echo 'clear'
2059df069eecSBram Moolenaar  :1messages
2060f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2061f93c7feaSBram Moolenaar
2062f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2063f93c7feaSBram Moolenaarenddef
2064f93c7feaSBram Moolenaar
206547e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2066f5be8cdbSBram Moolenaar  # only checks line continuation
206747e880d6SBram Moolenaar  let lines =<< trim END
206847e880d6SBram Moolenaar      vim9script
206947e880d6SBram Moolenaar      echomsg 'here'
207047e880d6SBram Moolenaar                .. ' is ' ..
207147e880d6SBram Moolenaar                   'a message'
207247e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
207347e880d6SBram Moolenaar  END
207447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
207547e880d6SBram Moolenaarenddef
207647e880d6SBram Moolenaar
2077f93c7feaSBram Moolenaardef Test_echoerr_cmd()
207840ee466cSBram Moolenaar  try
207940ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
208040ee466cSBram Moolenaar  catch
208140ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
208240ee466cSBram Moolenaar  endtry
2083f93c7feaSBram Moolenaarenddef
2084f93c7feaSBram Moolenaar
208547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2086f5be8cdbSBram Moolenaar  # only checks line continuation
208747e880d6SBram Moolenaar  let lines =<< trim END
208847e880d6SBram Moolenaar      vim9script
208947e880d6SBram Moolenaar      try
209047e880d6SBram Moolenaar        echoerr 'this'
209147e880d6SBram Moolenaar                .. ' is ' ..
209247e880d6SBram Moolenaar                   'wrong'
209347e880d6SBram Moolenaar      catch
209447e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
209547e880d6SBram Moolenaar      endtry
209647e880d6SBram Moolenaar  END
209747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
209847e880d6SBram Moolenaarenddef
209947e880d6SBram Moolenaar
210041fe0617SBram Moolenaardef Test_for_outside_of_function()
210141fe0617SBram Moolenaar  let lines =<< trim END
210241fe0617SBram Moolenaar    vim9script
210341fe0617SBram Moolenaar    new
210441fe0617SBram Moolenaar    for var in range(0, 3)
210541fe0617SBram Moolenaar      append(line('$'), var)
210641fe0617SBram Moolenaar    endfor
210741fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
210841fe0617SBram Moolenaar    bwipe!
210941fe0617SBram Moolenaar  END
211041fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
211141fe0617SBram Moolenaar  source Xvim9for.vim
211241fe0617SBram Moolenaar  delete('Xvim9for.vim')
211341fe0617SBram Moolenaarenddef
21148a7d6542SBram Moolenaar
2115e8c4abbbSBram Moolenaardef Test_for_loop()
2116e8c4abbbSBram Moolenaar  let result = ''
2117e8c4abbbSBram Moolenaar  for cnt in range(7)
2118e8c4abbbSBram Moolenaar    if cnt == 4
2119e8c4abbbSBram Moolenaar      break
2120e8c4abbbSBram Moolenaar    endif
2121e8c4abbbSBram Moolenaar    if cnt == 2
2122e8c4abbbSBram Moolenaar      continue
2123e8c4abbbSBram Moolenaar    endif
2124e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2125e8c4abbbSBram Moolenaar  endfor
2126e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21270ad3e894SBram Moolenaar
21280ad3e894SBram Moolenaar  let concat = ''
21290ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21300ad3e894SBram Moolenaar    concat ..= str
21310ad3e894SBram Moolenaar  endfor
21320ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2133e8c4abbbSBram Moolenaarenddef
2134e8c4abbbSBram Moolenaar
2135e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2136675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2137675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2138675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2139822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21400ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2141675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2142675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2143675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2144e8c4abbbSBram Moolenaarenddef
2145e8c4abbbSBram Moolenaar
2146d0df1aacSBram Moolenaardef Test_while_loop()
2147d0df1aacSBram Moolenaar  let result = ''
2148d0df1aacSBram Moolenaar  let cnt = 0
2149d0df1aacSBram Moolenaar  while cnt < 555
2150d0df1aacSBram Moolenaar    if cnt == 3
2151d0df1aacSBram Moolenaar      break
2152d0df1aacSBram Moolenaar    endif
2153d0df1aacSBram Moolenaar    cnt += 1
2154d0df1aacSBram Moolenaar    if cnt == 2
2155d0df1aacSBram Moolenaar      continue
2156d0df1aacSBram Moolenaar    endif
2157d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2158d0df1aacSBram Moolenaar  endwhile
2159d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2160d0df1aacSBram Moolenaarenddef
2161d0df1aacSBram Moolenaar
2162e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2163675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2164675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2165675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2166675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2167675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2168675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2169675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2170bd5da371SBram Moolenaarenddef
2171bd5da371SBram Moolenaar
21729645e2d9SBram Moolenaardef Test_interrupt_loop()
217397acfc78SBram Moolenaar  let caught = false
21749645e2d9SBram Moolenaar  let x = 0
217597acfc78SBram Moolenaar  try
21769645e2d9SBram Moolenaar    while 1
21779645e2d9SBram Moolenaar      x += 1
21789645e2d9SBram Moolenaar      if x == 100
21799645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
21809645e2d9SBram Moolenaar      endif
21819645e2d9SBram Moolenaar    endwhile
218297acfc78SBram Moolenaar  catch
218397acfc78SBram Moolenaar    caught = true
218497acfc78SBram Moolenaar    assert_equal(100, x)
218597acfc78SBram Moolenaar  endtry
218697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
21879645e2d9SBram Moolenaarenddef
218820431c9dSBram Moolenaar
21894fdae999SBram Moolenaardef Test_automatic_line_continuation()
21904fdae999SBram Moolenaar  let mylist = [
21914fdae999SBram Moolenaar      'one',
21924fdae999SBram Moolenaar      'two',
21934fdae999SBram Moolenaar      'three',
2194f5be8cdbSBram Moolenaar      ] # comment
21954fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
21964fdae999SBram Moolenaar
21974fdae999SBram Moolenaar  let mydict = {
21984fdae999SBram Moolenaar      'one': 1,
21994fdae999SBram Moolenaar      'two': 2,
22004fdae999SBram Moolenaar      'three':
22014fdae999SBram Moolenaar          3,
2202f5be8cdbSBram Moolenaar      } # comment
22034fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
22044fdae999SBram Moolenaar  mydict = #{
22052c330432SBram Moolenaar      one: 1,  # comment
22062c330432SBram Moolenaar      two:     # comment
22072c330432SBram Moolenaar           2,  # comment
22082c330432SBram Moolenaar      three: 3 # comment
22092c330432SBram Moolenaar      }
22102c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
22112c330432SBram Moolenaar  mydict = #{
22122c330432SBram Moolenaar      one: 1,
22134fdae999SBram Moolenaar      two:
22144fdae999SBram Moolenaar           2,
22152c330432SBram Moolenaar      three: 3
22164fdae999SBram Moolenaar      }
22174fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2218e6085c53SBram Moolenaar
2219e6085c53SBram Moolenaar  assert_equal(
2220e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2221e6085c53SBram Moolenaar        split('one two three')
2222e6085c53SBram Moolenaar        )
22234fdae999SBram Moolenaarenddef
22244fdae999SBram Moolenaar
22257a092245SBram Moolenaardef Test_vim9_comment()
22267a092245SBram Moolenaar  CheckScriptSuccess([
22277a092245SBram Moolenaar      'vim9script',
22287a092245SBram Moolenaar      '# something',
22297a092245SBram Moolenaar      ])
22307a092245SBram Moolenaar  CheckScriptFailure([
22317a092245SBram Moolenaar      'vim9script',
22327a092245SBram Moolenaar      ':# something',
22337a092245SBram Moolenaar      ], 'E488:')
22347a092245SBram Moolenaar  CheckScriptFailure([
22357a092245SBram Moolenaar      '# something',
22367a092245SBram Moolenaar      ], 'E488:')
22377a092245SBram Moolenaar  CheckScriptFailure([
22387a092245SBram Moolenaar      ':# something',
22397a092245SBram Moolenaar      ], 'E488:')
22407a092245SBram Moolenaar
22414a8d9f2eSBram Moolenaar  { # block start
22424a8d9f2eSBram Moolenaar  } # block end
22434a8d9f2eSBram Moolenaar  CheckDefFailure([
22444a8d9f2eSBram Moolenaar      '{# comment',
22454a8d9f2eSBram Moolenaar      ], 'E488:')
22464a8d9f2eSBram Moolenaar  CheckDefFailure([
22474a8d9f2eSBram Moolenaar      '{',
22484a8d9f2eSBram Moolenaar      '}# comment',
22494a8d9f2eSBram Moolenaar      ], 'E488:')
22504a8d9f2eSBram Moolenaar
22514a8d9f2eSBram Moolenaar  echo "yes" # comment
22524a8d9f2eSBram Moolenaar  CheckDefFailure([
22534a8d9f2eSBram Moolenaar      'echo "yes"# comment',
22544a8d9f2eSBram Moolenaar      ], 'E488:')
22557a092245SBram Moolenaar  CheckScriptSuccess([
22567a092245SBram Moolenaar      'vim9script',
22577a092245SBram Moolenaar      'echo "yes" # something',
22587a092245SBram Moolenaar      ])
22597a092245SBram Moolenaar  CheckScriptFailure([
22607a092245SBram Moolenaar      'vim9script',
22617a092245SBram Moolenaar      'echo "yes"# something',
22627a092245SBram Moolenaar      ], 'E121:')
22637a092245SBram Moolenaar  CheckScriptFailure([
22647a092245SBram Moolenaar      'vim9script',
22657a092245SBram Moolenaar      'echo# something',
22667a092245SBram Moolenaar      ], 'E121:')
22677a092245SBram Moolenaar  CheckScriptFailure([
22687a092245SBram Moolenaar      'echo "yes" # something',
22697a092245SBram Moolenaar      ], 'E121:')
22707a092245SBram Moolenaar
22714a8d9f2eSBram Moolenaar  exe "echo" # comment
22724a8d9f2eSBram Moolenaar  CheckDefFailure([
22734a8d9f2eSBram Moolenaar      'exe "echo"# comment',
22744a8d9f2eSBram Moolenaar      ], 'E488:')
22754a8d9f2eSBram Moolenaar  CheckScriptSuccess([
22764a8d9f2eSBram Moolenaar      'vim9script',
22774a8d9f2eSBram Moolenaar      'exe "echo" # something',
22784a8d9f2eSBram Moolenaar      ])
22794a8d9f2eSBram Moolenaar  CheckScriptFailure([
22804a8d9f2eSBram Moolenaar      'vim9script',
22814a8d9f2eSBram Moolenaar      'exe "echo"# something',
22824a8d9f2eSBram Moolenaar      ], 'E121:')
22834a8d9f2eSBram Moolenaar  CheckDefFailure([
22844a8d9f2eSBram Moolenaar      'exe # comment',
22854a8d9f2eSBram Moolenaar      ], 'E1015:')
22864a8d9f2eSBram Moolenaar  CheckScriptFailure([
22874a8d9f2eSBram Moolenaar      'vim9script',
22884a8d9f2eSBram Moolenaar      'exe# something',
22894a8d9f2eSBram Moolenaar      ], 'E121:')
22904a8d9f2eSBram Moolenaar  CheckScriptFailure([
22914a8d9f2eSBram Moolenaar      'exe "echo" # something',
22924a8d9f2eSBram Moolenaar      ], 'E121:')
22934a8d9f2eSBram Moolenaar
22947a092245SBram Moolenaar  CheckDefFailure([
22957a092245SBram Moolenaar      'try# comment',
22967a092245SBram Moolenaar      '  echo "yes"',
22977a092245SBram Moolenaar      'catch',
22987a092245SBram Moolenaar      'endtry',
22997a092245SBram Moolenaar      ], 'E488:')
23002c5ed4e3SBram Moolenaar  CheckScriptFailure([
23012c5ed4e3SBram Moolenaar      'vim9script',
23022c5ed4e3SBram Moolenaar      'try# comment',
23032c5ed4e3SBram Moolenaar      'echo "yes"',
23042c5ed4e3SBram Moolenaar      ], 'E488:')
23057a092245SBram Moolenaar  CheckDefFailure([
23067a092245SBram Moolenaar      'try',
2307a72cfb80SBram Moolenaar      '  throw#comment',
2308a72cfb80SBram Moolenaar      'catch',
2309a72cfb80SBram Moolenaar      'endtry',
2310a72cfb80SBram Moolenaar      ], 'E1015:')
2311a72cfb80SBram Moolenaar  CheckDefFailure([
2312a72cfb80SBram Moolenaar      'try',
2313a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2314a72cfb80SBram Moolenaar      'catch',
2315a72cfb80SBram Moolenaar      'endtry',
2316a72cfb80SBram Moolenaar      ], 'E488:')
2317a72cfb80SBram Moolenaar  CheckDefFailure([
2318a72cfb80SBram Moolenaar      'try',
23197a092245SBram Moolenaar      '  echo "yes"',
23207a092245SBram Moolenaar      'catch# comment',
23217a092245SBram Moolenaar      'endtry',
23227a092245SBram Moolenaar      ], 'E488:')
23232c5ed4e3SBram Moolenaar  CheckScriptFailure([
23242c5ed4e3SBram Moolenaar      'vim9script',
23252c5ed4e3SBram Moolenaar      'try',
23262c5ed4e3SBram Moolenaar      '  echo "yes"',
23272c5ed4e3SBram Moolenaar      'catch# comment',
23282c5ed4e3SBram Moolenaar      'endtry',
23292c5ed4e3SBram Moolenaar      ], 'E654:')
23302c5ed4e3SBram Moolenaar  CheckDefFailure([
23312c5ed4e3SBram Moolenaar      'try',
23322c5ed4e3SBram Moolenaar      '  echo "yes"',
23332c5ed4e3SBram Moolenaar      'catch /pat/# comment',
23342c5ed4e3SBram Moolenaar      'endtry',
23352c5ed4e3SBram Moolenaar      ], 'E488:')
23367a092245SBram Moolenaar  CheckDefFailure([
23377a092245SBram Moolenaar      'try',
23387a092245SBram Moolenaar      'echo "yes"',
23397a092245SBram Moolenaar      'catch',
23407a092245SBram Moolenaar      'endtry# comment',
23417a092245SBram Moolenaar      ], 'E488:')
23422c5ed4e3SBram Moolenaar  CheckScriptFailure([
23432c5ed4e3SBram Moolenaar      'vim9script',
23442c5ed4e3SBram Moolenaar      'try',
23452c5ed4e3SBram Moolenaar      '  echo "yes"',
23462c5ed4e3SBram Moolenaar      'catch',
23472c5ed4e3SBram Moolenaar      'endtry# comment',
23489b7bf9e9SBram Moolenaar      ], 'E488:')
23492c5ed4e3SBram Moolenaar
23502c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23512c5ed4e3SBram Moolenaar      'vim9script',
23522c5ed4e3SBram Moolenaar      'hi # comment',
23532c5ed4e3SBram Moolenaar      ])
23542c5ed4e3SBram Moolenaar  CheckScriptFailure([
23552c5ed4e3SBram Moolenaar      'vim9script',
23562c5ed4e3SBram Moolenaar      'hi# comment',
23572c5ed4e3SBram Moolenaar      ], 'E416:')
23581966c248SBram Moolenaar  CheckScriptSuccess([
23591966c248SBram Moolenaar      'vim9script',
23601966c248SBram Moolenaar      'hi Search # comment',
23611966c248SBram Moolenaar      ])
23621966c248SBram Moolenaar  CheckScriptFailure([
23631966c248SBram Moolenaar      'vim9script',
23641966c248SBram Moolenaar      'hi Search# comment',
23651966c248SBram Moolenaar      ], 'E416:')
23661966c248SBram Moolenaar  CheckScriptSuccess([
23671966c248SBram Moolenaar      'vim9script',
23681966c248SBram Moolenaar      'hi link This Search # comment',
23691966c248SBram Moolenaar      ])
23701966c248SBram Moolenaar  CheckScriptFailure([
23711966c248SBram Moolenaar      'vim9script',
23721966c248SBram Moolenaar      'hi link This That# comment',
23731966c248SBram Moolenaar      ], 'E413:')
23741966c248SBram Moolenaar  CheckScriptSuccess([
23751966c248SBram Moolenaar      'vim9script',
23761966c248SBram Moolenaar      'hi clear This # comment',
23771966c248SBram Moolenaar      'hi clear # comment',
23781966c248SBram Moolenaar      ])
2379f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2380f5be8cdbSBram Moolenaar  # hi clear This# comment',
23811966c248SBram Moolenaar  CheckScriptFailure([
23821966c248SBram Moolenaar      'vim9script',
23831966c248SBram Moolenaar      'hi clear# comment',
23841966c248SBram Moolenaar      ], 'E416:')
23851966c248SBram Moolenaar
23861966c248SBram Moolenaar  CheckScriptSuccess([
23871966c248SBram Moolenaar      'vim9script',
23881966c248SBram Moolenaar      'hi Group term=bold',
23891966c248SBram Moolenaar      'match Group /todo/ # comment',
23901966c248SBram Moolenaar      ])
23911966c248SBram Moolenaar  CheckScriptFailure([
23921966c248SBram Moolenaar      'vim9script',
23931966c248SBram Moolenaar      'hi Group term=bold',
23941966c248SBram Moolenaar      'match Group /todo/# comment',
23951966c248SBram Moolenaar      ], 'E488:')
23961966c248SBram Moolenaar  CheckScriptSuccess([
23971966c248SBram Moolenaar      'vim9script',
23981966c248SBram Moolenaar      'match # comment',
23991966c248SBram Moolenaar      ])
24001966c248SBram Moolenaar  CheckScriptFailure([
24011966c248SBram Moolenaar      'vim9script',
24021966c248SBram Moolenaar      'match# comment',
24031966c248SBram Moolenaar      ], 'E475:')
24041966c248SBram Moolenaar  CheckScriptSuccess([
24051966c248SBram Moolenaar      'vim9script',
24061966c248SBram Moolenaar      'match none # comment',
24071966c248SBram Moolenaar      ])
24081966c248SBram Moolenaar  CheckScriptFailure([
24091966c248SBram Moolenaar      'vim9script',
24101966c248SBram Moolenaar      'match none# comment',
24111966c248SBram Moolenaar      ], 'E475:')
24121966c248SBram Moolenaar
24131966c248SBram Moolenaar  CheckScriptSuccess([
24141966c248SBram Moolenaar      'vim9script',
24151966c248SBram Moolenaar      'menutrans clear # comment',
24161966c248SBram Moolenaar      ])
24171966c248SBram Moolenaar  CheckScriptFailure([
24181966c248SBram Moolenaar      'vim9script',
24191966c248SBram Moolenaar      'menutrans clear# comment text',
24201966c248SBram Moolenaar      ], 'E474:')
24211966c248SBram Moolenaar
24221966c248SBram Moolenaar  CheckScriptSuccess([
24231966c248SBram Moolenaar      'vim9script',
24241966c248SBram Moolenaar      'syntax clear # comment',
24251966c248SBram Moolenaar      ])
24261966c248SBram Moolenaar  CheckScriptFailure([
24271966c248SBram Moolenaar      'vim9script',
24281966c248SBram Moolenaar      'syntax clear# comment text',
24291966c248SBram Moolenaar      ], 'E28:')
24301966c248SBram Moolenaar  CheckScriptSuccess([
24311966c248SBram Moolenaar      'vim9script',
24321966c248SBram Moolenaar      'syntax keyword Word some',
24331966c248SBram Moolenaar      'syntax clear Word # comment',
24341966c248SBram Moolenaar      ])
24351966c248SBram Moolenaar  CheckScriptFailure([
24361966c248SBram Moolenaar      'vim9script',
24371966c248SBram Moolenaar      'syntax keyword Word some',
24381966c248SBram Moolenaar      'syntax clear Word# comment text',
24391966c248SBram Moolenaar      ], 'E28:')
24401966c248SBram Moolenaar
24411966c248SBram Moolenaar  CheckScriptSuccess([
24421966c248SBram Moolenaar      'vim9script',
24431966c248SBram Moolenaar      'syntax list # comment',
24441966c248SBram Moolenaar      ])
24451966c248SBram Moolenaar  CheckScriptFailure([
24461966c248SBram Moolenaar      'vim9script',
24471966c248SBram Moolenaar      'syntax list# comment text',
24481966c248SBram Moolenaar      ], 'E28:')
24491966c248SBram Moolenaar
24501966c248SBram Moolenaar  CheckScriptSuccess([
24511966c248SBram Moolenaar      'vim9script',
24521966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24531966c248SBram Moolenaar      ])
24541966c248SBram Moolenaar  CheckScriptFailure([
24551966c248SBram Moolenaar      'vim9script',
24561966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
24571966c248SBram Moolenaar      ], 'E475:')
24581966c248SBram Moolenaar
24591966c248SBram Moolenaar  CheckScriptSuccess([
24601966c248SBram Moolenaar      'vim9script',
24611966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
24621966c248SBram Moolenaar      ])
24631966c248SBram Moolenaar  CheckScriptFailure([
24641966c248SBram Moolenaar      'vim9script',
24651966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
24661966c248SBram Moolenaar      ], 'E789:')
24671966c248SBram Moolenaar
24681966c248SBram Moolenaar  CheckScriptSuccess([
24691966c248SBram Moolenaar      'vim9script',
24701966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
24711966c248SBram Moolenaar      ])
24721966c248SBram Moolenaar  CheckScriptFailure([
24731966c248SBram Moolenaar      'vim9script',
24741966c248SBram Moolenaar      'syntax match Word /pat/# comment',
24751966c248SBram Moolenaar      ], 'E402:')
24761966c248SBram Moolenaar
24771966c248SBram Moolenaar  CheckScriptSuccess([
24781966c248SBram Moolenaar      'vim9script',
24791966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
24801966c248SBram Moolenaar      ])
24811966c248SBram Moolenaar  CheckScriptFailure([
24821966c248SBram Moolenaar      'vim9script',
24831966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
24841966c248SBram Moolenaar      ], 'E475:')
24851966c248SBram Moolenaar  CheckScriptFailure([
24861966c248SBram Moolenaar      'vim9script',
24871966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
24881966c248SBram Moolenaar      ], 'E406:')
24891966c248SBram Moolenaar  CheckScriptFailure([
24901966c248SBram Moolenaar      'vim9script',
24911966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
24921966c248SBram Moolenaar      ], 'E475:')
24931966c248SBram Moolenaar
24941966c248SBram Moolenaar  CheckScriptSuccess([
24951966c248SBram Moolenaar      'vim9script',
24961966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
24971966c248SBram Moolenaar      ])
24981966c248SBram Moolenaar  CheckScriptFailure([
24991966c248SBram Moolenaar      'vim9script',
25001966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2501d032f34aSBram Moolenaar      ], 'E402:')
25021966c248SBram Moolenaar
25031966c248SBram Moolenaar  CheckScriptSuccess([
25041966c248SBram Moolenaar      'vim9script',
25051966c248SBram Moolenaar      'syntax sync # comment',
25061966c248SBram Moolenaar      ])
25071966c248SBram Moolenaar  CheckScriptFailure([
25081966c248SBram Moolenaar      'vim9script',
25091966c248SBram Moolenaar      'syntax sync# comment',
25101966c248SBram Moolenaar      ], 'E404:')
25111966c248SBram Moolenaar  CheckScriptSuccess([
25121966c248SBram Moolenaar      'vim9script',
25131966c248SBram Moolenaar      'syntax sync ccomment # comment',
25141966c248SBram Moolenaar      ])
25151966c248SBram Moolenaar  CheckScriptFailure([
25161966c248SBram Moolenaar      'vim9script',
25171966c248SBram Moolenaar      'syntax sync ccomment# comment',
25181966c248SBram Moolenaar      ], 'E404:')
25191966c248SBram Moolenaar
25201966c248SBram Moolenaar  CheckScriptSuccess([
25211966c248SBram Moolenaar      'vim9script',
25221966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
25231966c248SBram Moolenaar      ])
25241966c248SBram Moolenaar  CheckScriptFailure([
25251966c248SBram Moolenaar      'vim9script',
25261966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25271966c248SBram Moolenaar      ], 'E475:')
2528a72cfb80SBram Moolenaar
2529a72cfb80SBram Moolenaar  CheckScriptSuccess([
2530a72cfb80SBram Moolenaar      'vim9script',
2531a72cfb80SBram Moolenaar      'command Echo echo # comment',
2532a72cfb80SBram Moolenaar      'command Echo # comment',
2533a72cfb80SBram Moolenaar      ])
2534a72cfb80SBram Moolenaar  CheckScriptFailure([
2535a72cfb80SBram Moolenaar      'vim9script',
2536a72cfb80SBram Moolenaar      'command Echo echo# comment',
2537a72cfb80SBram Moolenaar      'Echo',
2538a72cfb80SBram Moolenaar      ], 'E121:')
2539a72cfb80SBram Moolenaar  CheckScriptFailure([
2540a72cfb80SBram Moolenaar      'vim9script',
2541a72cfb80SBram Moolenaar      'command Echo# comment',
2542a72cfb80SBram Moolenaar      ], 'E182:')
2543a72cfb80SBram Moolenaar  CheckScriptFailure([
2544a72cfb80SBram Moolenaar      'vim9script',
2545a72cfb80SBram Moolenaar      'command Echo echo',
2546a72cfb80SBram Moolenaar      'command Echo# comment',
2547a72cfb80SBram Moolenaar      ], 'E182:')
2548a72cfb80SBram Moolenaar
2549a72cfb80SBram Moolenaar  CheckScriptSuccess([
2550a72cfb80SBram Moolenaar      'vim9script',
2551a72cfb80SBram Moolenaar      'function # comment',
2552a72cfb80SBram Moolenaar      ])
2553a72cfb80SBram Moolenaar  CheckScriptFailure([
2554a72cfb80SBram Moolenaar      'vim9script',
25559898107fSBram Moolenaar      'function " comment',
25569898107fSBram Moolenaar      ], 'E129:')
25579898107fSBram Moolenaar  CheckScriptFailure([
25589898107fSBram Moolenaar      'vim9script',
2559a72cfb80SBram Moolenaar      'function# comment',
2560a72cfb80SBram Moolenaar      ], 'E129:')
2561a72cfb80SBram Moolenaar  CheckScriptSuccess([
2562a72cfb80SBram Moolenaar      'vim9script',
2563a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2564a72cfb80SBram Moolenaar      ])
2565a72cfb80SBram Moolenaar  CheckScriptFailure([
2566a72cfb80SBram Moolenaar      'vim9script',
2567a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2568a72cfb80SBram Moolenaar      ], 'E488:')
2569a72cfb80SBram Moolenaar
2570a72cfb80SBram Moolenaar  CheckScriptSuccess([
2571a72cfb80SBram Moolenaar      'vim9script',
25724c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2573a72cfb80SBram Moolenaar      'endfunc',
25744c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2575a72cfb80SBram Moolenaar      ])
2576a72cfb80SBram Moolenaar  CheckScriptFailure([
2577a72cfb80SBram Moolenaar      'vim9script',
25784c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2579a72cfb80SBram Moolenaar      'endfunc',
25804c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2581a72cfb80SBram Moolenaar      ], 'E488:')
2582a72cfb80SBram Moolenaar
2583a72cfb80SBram Moolenaar  CheckScriptSuccess([
2584a72cfb80SBram Moolenaar      'vim9script',
2585a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2586a72cfb80SBram Moolenaar      ])
2587a72cfb80SBram Moolenaar  CheckScriptFailure([
2588a72cfb80SBram Moolenaar      'vim9script',
2589a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2590a72cfb80SBram Moolenaar      ], 'E488:')
2591e7e4838fSBram Moolenaar
2592e7e4838fSBram Moolenaar  CheckScriptFailure([
2593e7e4838fSBram Moolenaar      'def Test() " comment',
2594e7e4838fSBram Moolenaar      'enddef',
2595e7e4838fSBram Moolenaar      ], 'E488:')
2596e7e4838fSBram Moolenaar  CheckScriptFailure([
2597e7e4838fSBram Moolenaar      'vim9script',
2598e7e4838fSBram Moolenaar      'def Test() " comment',
2599e7e4838fSBram Moolenaar      'enddef',
2600e7e4838fSBram Moolenaar      ], 'E488:')
2601e7e4838fSBram Moolenaar
2602e7e4838fSBram Moolenaar  CheckScriptSuccess([
2603e7e4838fSBram Moolenaar      'func Test() " comment',
2604e7e4838fSBram Moolenaar      'endfunc',
2605e7e4838fSBram Moolenaar      ])
26069898107fSBram Moolenaar  CheckScriptSuccess([
2607e7e4838fSBram Moolenaar      'vim9script',
2608e7e4838fSBram Moolenaar      'func Test() " comment',
2609e7e4838fSBram Moolenaar      'endfunc',
26109898107fSBram Moolenaar      ])
2611e7e4838fSBram Moolenaar
2612e7e4838fSBram Moolenaar  CheckScriptSuccess([
2613e7e4838fSBram Moolenaar      'def Test() # comment',
2614e7e4838fSBram Moolenaar      'enddef',
2615e7e4838fSBram Moolenaar      ])
2616e7e4838fSBram Moolenaar  CheckScriptFailure([
2617e7e4838fSBram Moolenaar      'func Test() # comment',
2618e7e4838fSBram Moolenaar      'endfunc',
2619e7e4838fSBram Moolenaar      ], 'E488:')
26202c5ed4e3SBram Moolenaarenddef
26212c5ed4e3SBram Moolenaar
26222c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
26232c5ed4e3SBram Moolenaar  CheckCanRunGui
26242c5ed4e3SBram Moolenaar
26252c5ed4e3SBram Moolenaar  CheckScriptFailure([
26262c5ed4e3SBram Moolenaar      'vim9script',
26272c5ed4e3SBram Moolenaar      'gui#comment'
26282c5ed4e3SBram Moolenaar      ], 'E499:')
26292c5ed4e3SBram Moolenaar  CheckScriptFailure([
26302c5ed4e3SBram Moolenaar      'vim9script',
26312c5ed4e3SBram Moolenaar      'gui -f#comment'
26322c5ed4e3SBram Moolenaar      ], 'E499:')
26337a092245SBram Moolenaarenddef
26347a092245SBram Moolenaar
2635a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
26366797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
26376797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2638a26b9700SBram Moolenaar
2639a26b9700SBram Moolenaar  edit test.vim
2640a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2641a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2642a26b9700SBram Moolenaar
2643a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2644a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2645a26b9700SBram Moolenaar
2646a26b9700SBram Moolenaar  g:entered = 0
2647a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2648a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2649a26b9700SBram Moolenaar
2650a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2651a26b9700SBram Moolenaar
2652a26b9700SBram Moolenaar  au! TabEnter
2653a26b9700SBram Moolenaar  unlet g:entered
2654d72c1bf0SBram Moolenaar
2655d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2656d72c1bf0SBram Moolenaar      'vim9script',
26576797966dSBram Moolenaar      'g:var = 123',
2658e55b1c09SBram Moolenaar      'b:var = 456',
2659e55b1c09SBram Moolenaar      'w:var = 777',
2660e55b1c09SBram Moolenaar      't:var = 888',
2661d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2662d72c1bf0SBram Moolenaar      ])
2663d72c1bf0SBram Moolenaar
2664d72c1bf0SBram Moolenaar  CheckScriptFailure([
2665d72c1bf0SBram Moolenaar      'vim9script',
2666d72c1bf0SBram Moolenaar      'let g:var = 123',
2667e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2668e55b1c09SBram Moolenaar
2669e55b1c09SBram Moolenaar  CheckScriptFailure([
2670e55b1c09SBram Moolenaar      'vim9script',
2671e55b1c09SBram Moolenaar      'let b:var = 123',
2672e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2673e55b1c09SBram Moolenaar
2674e55b1c09SBram Moolenaar  CheckScriptFailure([
2675e55b1c09SBram Moolenaar      'vim9script',
2676e55b1c09SBram Moolenaar      'let w:var = 123',
2677e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2678e55b1c09SBram Moolenaar
2679e55b1c09SBram Moolenaar  CheckScriptFailure([
2680e55b1c09SBram Moolenaar      'vim9script',
2681e55b1c09SBram Moolenaar      'let t:var = 123',
2682e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2683e55b1c09SBram Moolenaar
2684e55b1c09SBram Moolenaar  CheckScriptFailure([
2685e55b1c09SBram Moolenaar      'vim9script',
2686e55b1c09SBram Moolenaar      'let v:version = 123',
2687e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2688e55b1c09SBram Moolenaar
2689e55b1c09SBram Moolenaar  CheckScriptFailure([
2690e55b1c09SBram Moolenaar      'vim9script',
2691e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2692e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
26936797966dSBram Moolenaar
26946797966dSBram Moolenaar  CheckScriptFailure([
26956797966dSBram Moolenaar      'vim9script',
26966797966dSBram Moolenaar      'g:var = 123',
269732e35117SBram Moolenaar      'unlet g:var# comment1',
2698d72c1bf0SBram Moolenaar      ], 'E108:')
2699d72c1bf0SBram Moolenaar
2700d72c1bf0SBram Moolenaar  CheckScriptFailure([
2701d72c1bf0SBram Moolenaar      'let g:var = 123',
2702d72c1bf0SBram Moolenaar      'unlet g:var # something',
2703d72c1bf0SBram Moolenaar      ], 'E488:')
2704faac4104SBram Moolenaar
2705faac4104SBram Moolenaar  CheckScriptSuccess([
2706faac4104SBram Moolenaar      'vim9script',
270732e35117SBram Moolenaar      'if 1 # comment2',
2708faac4104SBram Moolenaar      '  echo "yes"',
2709faac4104SBram Moolenaar      'elseif 2 #comment',
2710faac4104SBram Moolenaar      '  echo "no"',
2711faac4104SBram Moolenaar      'endif',
2712faac4104SBram Moolenaar      ])
2713faac4104SBram Moolenaar
2714faac4104SBram Moolenaar  CheckScriptFailure([
2715faac4104SBram Moolenaar      'vim9script',
271632e35117SBram Moolenaar      'if 1# comment3',
2717faac4104SBram Moolenaar      '  echo "yes"',
2718faac4104SBram Moolenaar      'endif',
2719faac4104SBram Moolenaar      ], 'E15:')
2720faac4104SBram Moolenaar
2721faac4104SBram Moolenaar  CheckScriptFailure([
2722faac4104SBram Moolenaar      'vim9script',
272332e35117SBram Moolenaar      'if 0 # comment4',
2724faac4104SBram Moolenaar      '  echo "yes"',
2725faac4104SBram Moolenaar      'elseif 2#comment',
2726faac4104SBram Moolenaar      '  echo "no"',
2727faac4104SBram Moolenaar      'endif',
2728faac4104SBram Moolenaar      ], 'E15:')
2729faac4104SBram Moolenaar
2730faac4104SBram Moolenaar  CheckScriptSuccess([
2731faac4104SBram Moolenaar      'vim9script',
273232e35117SBram Moolenaar      'let v = 1 # comment5',
2733faac4104SBram Moolenaar      ])
2734faac4104SBram Moolenaar
2735faac4104SBram Moolenaar  CheckScriptFailure([
2736faac4104SBram Moolenaar      'vim9script',
273732e35117SBram Moolenaar      'let v = 1# comment6',
273832e35117SBram Moolenaar      ], 'E15:')
2739faac4104SBram Moolenaar
2740faac4104SBram Moolenaar  CheckScriptSuccess([
2741faac4104SBram Moolenaar      'vim9script',
2742faac4104SBram Moolenaar      'new'
2743faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2744df069eecSBram Moolenaar      ':$',
2745faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2746faac4104SBram Moolenaar      'bwipe!',
2747faac4104SBram Moolenaar      ])
2748faac4104SBram Moolenaar
2749f5be8cdbSBram Moolenaar  CheckScriptFailure([
2750f5be8cdbSBram Moolenaar      'vim9script',
2751f5be8cdbSBram Moolenaar      'new'
2752f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2753f5be8cdbSBram Moolenaar      ':$',
2754f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2755f5be8cdbSBram Moolenaar      'bwipe!',
2756f5be8cdbSBram Moolenaar      ], 'E488:')
2757f5be8cdbSBram Moolenaar
2758f5be8cdbSBram Moolenaar  CheckScriptFailure([
2759f5be8cdbSBram Moolenaar      'vim9script',
2760f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2761f5be8cdbSBram Moolenaar      ], 'E477:')
2762a26b9700SBram Moolenaarenddef
2763a26b9700SBram Moolenaar
27647e5bd91dSBram Moolenaardef Test_finish()
27657e5bd91dSBram Moolenaar  let lines =<< trim END
27667e5bd91dSBram Moolenaar    vim9script
27676797966dSBram Moolenaar    g:res = 'one'
27687e5bd91dSBram Moolenaar    if v:false | finish | endif
27696797966dSBram Moolenaar    g:res = 'two'
27707e5bd91dSBram Moolenaar    finish
27716797966dSBram Moolenaar    g:res = 'three'
27727e5bd91dSBram Moolenaar  END
27737e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
27747e5bd91dSBram Moolenaar  source Xfinished
27757e5bd91dSBram Moolenaar  assert_equal('two', g:res)
27767e5bd91dSBram Moolenaar
27777e5bd91dSBram Moolenaar  unlet g:res
27787e5bd91dSBram Moolenaar  delete('Xfinished')
27797e5bd91dSBram Moolenaarenddef
27807e5bd91dSBram Moolenaar
278132e35117SBram Moolenaardef Test_let_func_call()
278232e35117SBram Moolenaar  let lines =<< trim END
278332e35117SBram Moolenaar    vim9script
278432e35117SBram Moolenaar    func GetValue()
278532e35117SBram Moolenaar      if exists('g:count')
278632e35117SBram Moolenaar        let g:count += 1
278732e35117SBram Moolenaar      else
278832e35117SBram Moolenaar        let g:count = 1
278932e35117SBram Moolenaar      endif
279032e35117SBram Moolenaar      return 'this'
279132e35117SBram Moolenaar    endfunc
279232e35117SBram Moolenaar    let val: string = GetValue()
2793f5be8cdbSBram Moolenaar    # env var is always a string
2794df671b46SBram Moolenaar    let env = $TERM
279532e35117SBram Moolenaar  END
279632e35117SBram Moolenaar  writefile(lines, 'Xfinished')
279732e35117SBram Moolenaar  source Xfinished
2798f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
279932e35117SBram Moolenaar  assert_equal(1, g:count)
280032e35117SBram Moolenaar
280132e35117SBram Moolenaar  unlet g:count
280232e35117SBram Moolenaar  delete('Xfinished')
280332e35117SBram Moolenaarenddef
280432e35117SBram Moolenaar
280532e35117SBram Moolenaardef Test_let_missing_type()
280632e35117SBram Moolenaar  let lines =<< trim END
280732e35117SBram Moolenaar    vim9script
2808df671b46SBram Moolenaar    let var = g:unknown
2809227a69deSBram Moolenaar  END
2810822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2811227a69deSBram Moolenaar
2812227a69deSBram Moolenaar  lines =<< trim END
2813227a69deSBram Moolenaar    vim9script
2814227a69deSBram Moolenaar    let nr: number = 123
2815227a69deSBram Moolenaar    let var = nr
2816227a69deSBram Moolenaar  END
2817822ba247SBram Moolenaar  CheckScriptSuccess(lines)
281832e35117SBram Moolenaarenddef
281932e35117SBram Moolenaar
2820c82a5b5dSBram Moolenaardef Test_let_declaration()
2821c82a5b5dSBram Moolenaar  let lines =<< trim END
2822c82a5b5dSBram Moolenaar    vim9script
2823c82a5b5dSBram Moolenaar    let var: string
2824c82a5b5dSBram Moolenaar    g:var_uninit = var
2825c82a5b5dSBram Moolenaar    var = 'text'
2826c82a5b5dSBram Moolenaar    g:var_test = var
2827f5be8cdbSBram Moolenaar    # prefixing s: is optional
2828984dddbeSBram Moolenaar    s:var = 'prefixed'
2829984dddbeSBram Moolenaar    g:var_prefixed = s:var
2830984dddbeSBram Moolenaar
2831984dddbeSBram Moolenaar    let s:other: number
2832984dddbeSBram Moolenaar    other = 1234
2833984dddbeSBram Moolenaar    g:other_var = other
2834c82a5b5dSBram Moolenaar  END
2835c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2836c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2837c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2838984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2839984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2840c82a5b5dSBram Moolenaar
2841c82a5b5dSBram Moolenaar  unlet g:var_uninit
2842c82a5b5dSBram Moolenaar  unlet g:var_test
2843984dddbeSBram Moolenaar  unlet g:var_prefixed
2844984dddbeSBram Moolenaar  unlet g:other_var
2845c82a5b5dSBram Moolenaarenddef
2846c82a5b5dSBram Moolenaar
2847c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2848c5b1c20bSBram Moolenaar  let lines =<< trim END
2849c5b1c20bSBram Moolenaar    vim9script
2850c5b1c20bSBram Moolenaar    const var: string
2851c5b1c20bSBram Moolenaar  END
2852c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2853c5b1c20bSBram Moolenaar
2854c5b1c20bSBram Moolenaar  lines =<< trim END
2855c5b1c20bSBram Moolenaar    vim9script
2856c5b1c20bSBram Moolenaar    let 9var: string
2857c5b1c20bSBram Moolenaar  END
2858c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2859c5b1c20bSBram Moolenaarenddef
2860c5b1c20bSBram Moolenaar
286134db91f7SBram Moolenaardef Test_let_type_check()
286234db91f7SBram Moolenaar  let lines =<< trim END
286334db91f7SBram Moolenaar    vim9script
286434db91f7SBram Moolenaar    let var: string
286534db91f7SBram Moolenaar    var = 1234
286634db91f7SBram Moolenaar  END
286734db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2868984dddbeSBram Moolenaar
2869984dddbeSBram Moolenaar  lines =<< trim END
2870984dddbeSBram Moolenaar    vim9script
2871984dddbeSBram Moolenaar    let var:string
2872984dddbeSBram Moolenaar  END
2873984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2874c5b1c20bSBram Moolenaar
2875c5b1c20bSBram Moolenaar  lines =<< trim END
2876c5b1c20bSBram Moolenaar    vim9script
2877c5b1c20bSBram Moolenaar    let var: asdf
2878c5b1c20bSBram Moolenaar  END
2879c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2880a71e2633SBram Moolenaar
2881a71e2633SBram Moolenaar  lines =<< trim END
2882a71e2633SBram Moolenaar    vim9script
2883a71e2633SBram Moolenaar    let s:l: list<number>
2884a71e2633SBram Moolenaar    s:l = []
2885a71e2633SBram Moolenaar  END
2886a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2887a71e2633SBram Moolenaar
2888a71e2633SBram Moolenaar  lines =<< trim END
2889a71e2633SBram Moolenaar    vim9script
2890a71e2633SBram Moolenaar    let s:d: dict<number>
2891a71e2633SBram Moolenaar    s:d = {}
2892a71e2633SBram Moolenaar  END
2893a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
289434db91f7SBram Moolenaarenddef
289534db91f7SBram Moolenaar
2896a5d0077eSBram Moolenaardef Test_forward_declaration()
2897a5d0077eSBram Moolenaar  let lines =<< trim END
2898a5d0077eSBram Moolenaar    vim9script
2899a5d0077eSBram Moolenaar    def GetValue(): string
2900a5d0077eSBram Moolenaar      return theVal
2901a5d0077eSBram Moolenaar    enddef
2902a5d0077eSBram Moolenaar    let theVal = 'something'
2903822ba247SBram Moolenaar    g:initVal = GetValue()
2904a5d0077eSBram Moolenaar    theVal = 'else'
2905a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2906a5d0077eSBram Moolenaar  END
2907a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2908a5d0077eSBram Moolenaar  source Xforward
2909a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2910a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2911a5d0077eSBram Moolenaar
2912a5d0077eSBram Moolenaar  unlet g:initVal
2913a5d0077eSBram Moolenaar  unlet g:laterVal
2914a5d0077eSBram Moolenaar  delete('Xforward')
2915a5d0077eSBram Moolenaarenddef
2916a5d0077eSBram Moolenaar
29179721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
29189721fb4eSBram Moolenaar  let legacy_lines =<< trim END
29199721fb4eSBram Moolenaar    source Xvim9_script.vim
29209721fb4eSBram Moolenaar
29219721fb4eSBram Moolenaar    call assert_false(exists('local'))
29229721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29239721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29249721fb4eSBram Moolenaar    call assert_equal('global', global)
29259721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29269721fb4eSBram Moolenaar
29279721fb4eSBram Moolenaar    " imported variable becomes script-local
29289721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29299721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29309721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29319721fb4eSBram Moolenaar
29329721fb4eSBram Moolenaar    " imported function becomes script-local
29339721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29349721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29359721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29369721fb4eSBram Moolenaar  END
29379721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29389721fb4eSBram Moolenaar
29399721fb4eSBram Moolenaar  let vim9_lines =<< trim END
29409721fb4eSBram Moolenaar    vim9script
29419721fb4eSBram Moolenaar    let local = 'local'
29429721fb4eSBram Moolenaar    g:global = 'global'
29439721fb4eSBram Moolenaar    export let exported = 'exported'
29449721fb4eSBram Moolenaar    export def GetText(): string
29459721fb4eSBram Moolenaar       return 'text'
29469721fb4eSBram Moolenaar    enddef
29479721fb4eSBram Moolenaar  END
29489721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
29499721fb4eSBram Moolenaar
29509721fb4eSBram Moolenaar  source Xlegacy_script.vim
29519721fb4eSBram Moolenaar
29529721fb4eSBram Moolenaar  assert_equal('global', g:global)
2953f5be8cdbSBram Moolenaar  unlet g:global
29549721fb4eSBram Moolenaar
29559721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29569721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29579721fb4eSBram Moolenaarenddef
2958a5d0077eSBram Moolenaar
2959eeb27bfeSBram Moolenaardef Test_vim9_copen()
2960eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2961eeb27bfeSBram Moolenaar  copen
2962eeb27bfeSBram Moolenaar  quit
2963eeb27bfeSBram Moolenaarenddef
2964eeb27bfeSBram Moolenaar
29652d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
29662d6b20d6SBram Moolenaardef Test_vim9_autoload()
29672d6b20d6SBram Moolenaar  let lines =<< trim END
29682d6b20d6SBram Moolenaar     vim9script
29692d6b20d6SBram Moolenaar     def foo#test()
29702d6b20d6SBram Moolenaar         echomsg getreg('"')
29712d6b20d6SBram Moolenaar     enddef
29722d6b20d6SBram Moolenaar  END
29732d6b20d6SBram Moolenaar
29742d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
29752d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
29762d6b20d6SBram Moolenaar  let save_rtp = &rtp
29772d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
29782d6b20d6SBram Moolenaar  augroup test
29792d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
29802d6b20d6SBram Moolenaar  augroup END
29812d6b20d6SBram Moolenaar
29822d6b20d6SBram Moolenaar  normal Y
29832d6b20d6SBram Moolenaar
29842d6b20d6SBram Moolenaar  augroup test
29852d6b20d6SBram Moolenaar    autocmd!
29862d6b20d6SBram Moolenaar  augroup END
29872d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
29882d6b20d6SBram Moolenaar  &rtp = save_rtp
29892d6b20d6SBram Moolenaarenddef
29902d6b20d6SBram Moolenaar
2991585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2992585fea7bSBram Moolenaardef Test_substitute_cmd()
2993585fea7bSBram Moolenaar  new
2994585fea7bSBram Moolenaar  setline(1, 'something')
2995585fea7bSBram Moolenaar  :substitute(some(other(
2996585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2997585fea7bSBram Moolenaar  bwipe!
2998585fea7bSBram Moolenaar
2999f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3000585fea7bSBram Moolenaar  let lines =<< trim END
3001585fea7bSBram Moolenaar    vim9script
3002585fea7bSBram Moolenaar    new
3003585fea7bSBram Moolenaar    setline(1, 'something')
3004585fea7bSBram Moolenaar    :substitute(some(other(
3005585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3006585fea7bSBram Moolenaar    bwipe!
3007585fea7bSBram Moolenaar  END
3008585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3009585fea7bSBram Moolenaar  source Xvim9lines
3010585fea7bSBram Moolenaar
3011585fea7bSBram Moolenaar  delete('Xvim9lines')
3012585fea7bSBram Moolenaarenddef
3013585fea7bSBram Moolenaar
30148a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3015