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)
129*dd29f1b0SBram 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)
135*dd29f1b0SBram 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)
149*dd29f1b0SBram 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)
227*dd29f1b0SBram Moolenaar  list2 += [100]
228*dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
229*dd29f1b0SBram Moolenaar
230*dd29f1b0SBram Moolenaar  list3 += ['end']
231*dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
232*dd29f1b0SBram Moolenaar
233*dd29f1b0SBram 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)
42547a519a9SBram Moolenaarenddef
42647a519a9SBram Moolenaar
427c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
428c7e44a7eSBram Moolenaar  let lines =<< trim END
429c7e44a7eSBram Moolenaar    vim9script
430c7e44a7eSBram Moolenaar    def Func(): list<number>
431c7e44a7eSBram Moolenaar      return [1, 2]
432c7e44a7eSBram Moolenaar    enddef
433c7e44a7eSBram Moolenaar    let var1: number
434c7e44a7eSBram Moolenaar    let var2: number
435c7e44a7eSBram Moolenaar    [var1, var2] =
436c7e44a7eSBram Moolenaar          Func()
437c7e44a7eSBram Moolenaar    assert_equal(1, var1)
438c7e44a7eSBram Moolenaar    assert_equal(2, var2)
439c7e44a7eSBram Moolenaar    let ll =
440c7e44a7eSBram Moolenaar          Func()
441c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
44283144546SBram Moolenaar
44383144546SBram Moolenaar    @/ = 'text'
44483144546SBram Moolenaar    assert_equal('text', @/)
44583144546SBram Moolenaar    @0 = 'zero'
44683144546SBram Moolenaar    assert_equal('zero', @0)
44783144546SBram Moolenaar    @1 = 'one'
44883144546SBram Moolenaar    assert_equal('one', @1)
44983144546SBram Moolenaar    @9 = 'nine'
45083144546SBram Moolenaar    assert_equal('nine', @9)
45183144546SBram Moolenaar    @- = 'minus'
45283144546SBram Moolenaar    assert_equal('minus', @-)
45383144546SBram Moolenaar    if has('clipboard_working')
45483144546SBram Moolenaar      @* = 'star'
45583144546SBram Moolenaar      assert_equal('star', @*)
45683144546SBram Moolenaar      @+ = 'plus'
45783144546SBram Moolenaar      assert_equal('plus', @+)
45883144546SBram Moolenaar    endif
45995dd9f25SBram Moolenaar
46095dd9f25SBram Moolenaar    let a: number = 123
46195dd9f25SBram Moolenaar    assert_equal(123, a)
46295dd9f25SBram Moolenaar    let s: string = 'yes'
46395dd9f25SBram Moolenaar    assert_equal('yes', s)
46495dd9f25SBram Moolenaar    let b: number = 42
46595dd9f25SBram Moolenaar    assert_equal(42, b)
46695dd9f25SBram Moolenaar    let w: number = 43
46795dd9f25SBram Moolenaar    assert_equal(43, w)
46895dd9f25SBram Moolenaar    let t: number = 44
46995dd9f25SBram Moolenaar    assert_equal(44, t)
470c7e44a7eSBram Moolenaar  END
471c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
472c7e44a7eSBram Moolenaarenddef
473c7e44a7eSBram Moolenaar
474cab27678SBram Moolenaardef Mess(): string
475cab27678SBram Moolenaar  v:foldstart = 123
476cab27678SBram Moolenaar  return 'xxx'
477cab27678SBram Moolenaarenddef
478cab27678SBram Moolenaar
479d72c1bf0SBram Moolenaardef Test_assignment_failure()
4808a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
4818a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
4828a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
4838a7d6542SBram Moolenaar
48463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
48563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
48663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
48763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
48863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
48963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
49063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
49163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
49263be3d4bSBram Moolenaar
4938a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
4948a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
4958a7d6542SBram Moolenaar
4969b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
4979af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4989af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
4999af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5009af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5019af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5029af78769SBram Moolenaar                            'let y: number',
5039af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5049af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5059af78769SBram Moolenaar                            'let y: number',
5069af78769SBram Moolenaar                            'let z: list<number>',
5079af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5089be61bbbSBram Moolenaar
509e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
510c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5119be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
512c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5139be61bbbSBram Moolenaar
514e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
515c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5169be61bbbSBram Moolenaar
517434d72cbSBram Moolenaar  if has('dnd')
51865821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
519434d72cbSBram Moolenaar  else
520434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
521434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
522434d72cbSBram Moolenaar  endif
5239be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
52465821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
525c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5269be61bbbSBram Moolenaar
527e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
528e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
529e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
530e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5319be61bbbSBram Moolenaar
5329be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5339be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5349be61bbbSBram Moolenaar
535822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
53633fa29cfSBram Moolenaar
5378a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5388a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5398a7d6542SBram Moolenaar
5408a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5418a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5428a7d6542SBram Moolenaar
5438a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5448a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
54542a480bfSBram Moolenaar
546d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
54742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
548cab27678SBram Moolenaar
549cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
550cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
55143e969d3SBram Moolenaar
55243e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
55343e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
55443e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
55543e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
55643e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
55743e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
55843e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
55943e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
560d72c1bf0SBram Moolenaarenddef
561d72c1bf0SBram Moolenaar
562d72c1bf0SBram Moolenaardef Test_unlet()
563d72c1bf0SBram Moolenaar  g:somevar = 'yes'
564d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
565d72c1bf0SBram Moolenaar  unlet g:somevar
566d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
567d72c1bf0SBram Moolenaar  unlet! g:somevar
568d72c1bf0SBram Moolenaar
569d72c1bf0SBram Moolenaar  call CheckScriptFailure([
570d72c1bf0SBram Moolenaar        'vim9script',
571d72c1bf0SBram Moolenaar        'let svar = 123',
572d72c1bf0SBram Moolenaar        'unlet svar',
573d72c1bf0SBram Moolenaar        ], 'E1081:')
574d72c1bf0SBram Moolenaar  call CheckScriptFailure([
575d72c1bf0SBram Moolenaar        'vim9script',
576d72c1bf0SBram Moolenaar        'let svar = 123',
577d72c1bf0SBram Moolenaar        'unlet s:svar',
578d72c1bf0SBram Moolenaar        ], 'E1081:')
579d72c1bf0SBram Moolenaar  call CheckScriptFailure([
580d72c1bf0SBram Moolenaar        'vim9script',
581d72c1bf0SBram Moolenaar        'let svar = 123',
582d72c1bf0SBram Moolenaar        'def Func()',
583d72c1bf0SBram Moolenaar        '  unlet svar',
584d72c1bf0SBram Moolenaar        'enddef',
585822ba247SBram Moolenaar        'defcompile',
586d72c1bf0SBram Moolenaar        ], 'E1081:')
587d72c1bf0SBram Moolenaar  call CheckScriptFailure([
588d72c1bf0SBram Moolenaar        'vim9script',
589d72c1bf0SBram Moolenaar        'let svar = 123',
590d72c1bf0SBram Moolenaar        'def Func()',
591d72c1bf0SBram Moolenaar        '  unlet s:svar',
592d72c1bf0SBram Moolenaar        'enddef',
593822ba247SBram Moolenaar        'defcompile',
594d72c1bf0SBram Moolenaar        ], 'E1081:')
5957bdaea6eSBram Moolenaar
5967bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
5977bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
5987bdaea6eSBram Moolenaar  unlet $ENVVAR
5997bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
600d72c1bf0SBram Moolenaarenddef
601599c89c8SBram Moolenaar
6024c17ad94SBram Moolenaardef Test_delfunction()
603f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6044c17ad94SBram Moolenaar  CheckScriptSuccess([
6054c17ad94SBram Moolenaar      'vim9script',
6064c17ad94SBram Moolenaar      'func CheckMe()',
6074c17ad94SBram Moolenaar      '  return 123',
6084c17ad94SBram Moolenaar      'endfunc',
6094c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6104c17ad94SBram Moolenaar      ])
6114c17ad94SBram Moolenaar
612f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6134c17ad94SBram Moolenaar  CheckScriptFailure([
6144c17ad94SBram Moolenaar      'vim9script',
6154c17ad94SBram Moolenaar      'func DeleteMe1()',
6164c17ad94SBram Moolenaar      'endfunc',
6174c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6184c17ad94SBram Moolenaar      ], 'E1084:')
6194c17ad94SBram Moolenaar  CheckScriptFailure([
6204c17ad94SBram Moolenaar      'vim9script',
6214c17ad94SBram Moolenaar      'func DeleteMe2()',
6224c17ad94SBram Moolenaar      'endfunc',
6234c17ad94SBram Moolenaar      'def DoThat()',
6244c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6254c17ad94SBram Moolenaar      'enddef',
6264c17ad94SBram Moolenaar      'DoThat()',
6274c17ad94SBram Moolenaar      ], 'E1084:')
6284c17ad94SBram Moolenaar  CheckScriptFailure([
6294c17ad94SBram Moolenaar      'vim9script',
6304c17ad94SBram Moolenaar      'def DeleteMe3()',
6314c17ad94SBram Moolenaar      'enddef',
6324c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6334c17ad94SBram Moolenaar      ], 'E1084:')
6344c17ad94SBram Moolenaar  CheckScriptFailure([
6354c17ad94SBram Moolenaar      'vim9script',
6364c17ad94SBram Moolenaar      'def DeleteMe4()',
6374c17ad94SBram Moolenaar      'enddef',
6384c17ad94SBram Moolenaar      'def DoThat()',
6394c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6404c17ad94SBram Moolenaar      'enddef',
6414c17ad94SBram Moolenaar      'DoThat()',
6424c17ad94SBram Moolenaar      ], 'E1084:')
643925e9fd6SBram Moolenaar
644925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
645925e9fd6SBram Moolenaar  let lines =<< trim END
646925e9fd6SBram Moolenaar      vim9script
647925e9fd6SBram Moolenaar      def g:Global(): string
648925e9fd6SBram Moolenaar        return "yes"
649925e9fd6SBram Moolenaar      enddef
650925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
651925e9fd6SBram Moolenaar      def! g:Global(): string
652925e9fd6SBram Moolenaar        return "no"
653925e9fd6SBram Moolenaar      enddef
654925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
655925e9fd6SBram Moolenaar      delfunc g:Global
656925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
657925e9fd6SBram Moolenaar  END
658925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
659925e9fd6SBram Moolenaar
660925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
661925e9fd6SBram Moolenaar  lines =<< trim END
662925e9fd6SBram Moolenaar      vim9script
663925e9fd6SBram Moolenaar      func g:Global()
664925e9fd6SBram Moolenaar        return "yes"
665925e9fd6SBram Moolenaar      endfunc
666925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
667925e9fd6SBram Moolenaar      def! g:Global(): string
668925e9fd6SBram Moolenaar        return "no"
669925e9fd6SBram Moolenaar      enddef
670925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
671925e9fd6SBram Moolenaar      delfunc g:Global
672925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
673925e9fd6SBram Moolenaar  END
674925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
675925e9fd6SBram Moolenaar
676925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
677925e9fd6SBram Moolenaar  lines =<< trim END
678925e9fd6SBram Moolenaar      vim9script
679925e9fd6SBram Moolenaar      def g:Global(): string
680925e9fd6SBram Moolenaar        return "yes"
681925e9fd6SBram Moolenaar      enddef
682925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
683925e9fd6SBram Moolenaar      func! g:Global()
684925e9fd6SBram Moolenaar        return "no"
685925e9fd6SBram Moolenaar      endfunc
686925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
687925e9fd6SBram Moolenaar      delfunc g:Global
688925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
689925e9fd6SBram Moolenaar  END
690925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6914c17ad94SBram Moolenaarenddef
6924c17ad94SBram Moolenaar
693599c89c8SBram Moolenaarfunc Test_wrong_type()
694599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
695599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
696599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
697599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
698599c89c8SBram Moolenaar
699599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
700599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
70142a480bfSBram Moolenaar
70242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
70342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
70442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
70542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
70642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
70742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
70842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
70942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
71042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
71142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
71242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
713a0a9f43aSBram Moolenaar
714a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
715a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7168a7d6542SBram Moolenaarendfunc
7178a7d6542SBram Moolenaar
7188a7d6542SBram Moolenaarfunc Test_const()
7198a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7208a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7218a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7229be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7238a7d6542SBram Moolenaarendfunc
7248a7d6542SBram Moolenaar
725df069eecSBram Moolenaardef Test_range_no_colon()
726df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
727df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
728df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
729df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
730df069eecSBram Moolenaarenddef
731df069eecSBram Moolenaar
732df069eecSBram Moolenaar
7338a7d6542SBram Moolenaardef Test_block()
7348a7d6542SBram Moolenaar  let outer = 1
7358a7d6542SBram Moolenaar  {
7368a7d6542SBram Moolenaar    let inner = 2
7378a7d6542SBram Moolenaar    assert_equal(1, outer)
7388a7d6542SBram Moolenaar    assert_equal(2, inner)
7398a7d6542SBram Moolenaar  }
7408a7d6542SBram Moolenaar  assert_equal(1, outer)
7418a7d6542SBram Moolenaarenddef
7428a7d6542SBram Moolenaar
7438a7d6542SBram Moolenaarfunc Test_block_failure()
7448a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
745585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
746585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7478a7d6542SBram Moolenaarendfunc
7488a7d6542SBram Moolenaar
749585fea7bSBram Moolenaardef Test_cmd_modifier()
750585fea7bSBram Moolenaar  tab echo '0'
751585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
752585fea7bSBram Moolenaarenddef
753585fea7bSBram Moolenaar
754d032f34aSBram Moolenaarfunc g:NoSuchFunc()
755d032f34aSBram Moolenaar  echo 'none'
756d032f34aSBram Moolenaarendfunc
757d032f34aSBram Moolenaar
7588a7d6542SBram Moolenaardef Test_try_catch()
7598a7d6542SBram Moolenaar  let l = []
7607a092245SBram Moolenaar  try # comment
7618a7d6542SBram Moolenaar    add(l, '1')
7628a7d6542SBram Moolenaar    throw 'wrong'
7638a7d6542SBram Moolenaar    add(l, '2')
7647a092245SBram Moolenaar  catch # comment
7658a7d6542SBram Moolenaar    add(l, v:exception)
7667a092245SBram Moolenaar  finally # comment
7678a7d6542SBram Moolenaar    add(l, '3')
7687a092245SBram Moolenaar  endtry # comment
7698a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
77068d130c6SBram Moolenaar
771e859312eSBram Moolenaar  l = []
772e859312eSBram Moolenaar  try
773e859312eSBram Moolenaar    try
774e859312eSBram Moolenaar      add(l, '1')
775e859312eSBram Moolenaar      throw 'wrong'
776e859312eSBram Moolenaar      add(l, '2')
777e859312eSBram Moolenaar    catch /right/
778e859312eSBram Moolenaar      add(l, v:exception)
779e859312eSBram Moolenaar    endtry
780e859312eSBram Moolenaar  catch /wrong/
781e859312eSBram Moolenaar    add(l, 'caught')
782e859312eSBram Moolenaar  finally
783e859312eSBram Moolenaar    add(l, 'finally')
784e859312eSBram Moolenaar  endtry
785e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
786e859312eSBram Moolenaar
78768d130c6SBram Moolenaar  let n: number
78868d130c6SBram Moolenaar  try
78968d130c6SBram Moolenaar    n = l[3]
79068d130c6SBram Moolenaar  catch /E684:/
79168d130c6SBram Moolenaar    n = 99
79268d130c6SBram Moolenaar  endtry
79368d130c6SBram Moolenaar  assert_equal(99, n)
79468d130c6SBram Moolenaar
79568d130c6SBram Moolenaar  try
79668d130c6SBram Moolenaar    n = g:astring[3]
79768d130c6SBram Moolenaar  catch /E714:/
79868d130c6SBram Moolenaar    n = 77
79968d130c6SBram Moolenaar  endtry
80068d130c6SBram Moolenaar  assert_equal(77, n)
80168d130c6SBram Moolenaar
80268d130c6SBram Moolenaar  try
80368d130c6SBram Moolenaar    n = l[g:astring]
80468d130c6SBram Moolenaar  catch /E39:/
80568d130c6SBram Moolenaar    n = 77
80668d130c6SBram Moolenaar  endtry
80768d130c6SBram Moolenaar  assert_equal(77, n)
80868d130c6SBram Moolenaar
80968d130c6SBram Moolenaar  try
81068d130c6SBram Moolenaar    n = s:does_not_exist
81168d130c6SBram Moolenaar  catch /E121:/
812f0b9f43cSBram Moolenaar    n = 111
813f0b9f43cSBram Moolenaar  endtry
814f0b9f43cSBram Moolenaar  assert_equal(111, n)
815f0b9f43cSBram Moolenaar
816f0b9f43cSBram Moolenaar  try
817f0b9f43cSBram Moolenaar    n = g:does_not_exist
818f0b9f43cSBram Moolenaar  catch /E121:/
81968d130c6SBram Moolenaar    n = 121
82068d130c6SBram Moolenaar  endtry
82168d130c6SBram Moolenaar  assert_equal(121, n)
82268d130c6SBram Moolenaar
82368d130c6SBram Moolenaar  let d = #{one: 1}
82468d130c6SBram Moolenaar  try
82568d130c6SBram Moolenaar    n = d[g:astring]
82668d130c6SBram Moolenaar  catch /E716:/
82768d130c6SBram Moolenaar    n = 222
82868d130c6SBram Moolenaar  endtry
82968d130c6SBram Moolenaar  assert_equal(222, n)
830f0b9f43cSBram Moolenaar
831f0b9f43cSBram Moolenaar  try
832f0b9f43cSBram Moolenaar    n = -g:astring
833f0b9f43cSBram Moolenaar  catch /E39:/
834f0b9f43cSBram Moolenaar    n = 233
835f0b9f43cSBram Moolenaar  endtry
836f0b9f43cSBram Moolenaar  assert_equal(233, n)
837f0b9f43cSBram Moolenaar
838f0b9f43cSBram Moolenaar  try
839f0b9f43cSBram Moolenaar    n = +g:astring
840f0b9f43cSBram Moolenaar  catch /E1030:/
841f0b9f43cSBram Moolenaar    n = 244
842f0b9f43cSBram Moolenaar  endtry
843f0b9f43cSBram Moolenaar  assert_equal(244, n)
844f0b9f43cSBram Moolenaar
845f0b9f43cSBram Moolenaar  try
846f0b9f43cSBram Moolenaar    n = +g:alist
847f0b9f43cSBram Moolenaar  catch /E745:/
848f0b9f43cSBram Moolenaar    n = 255
849f0b9f43cSBram Moolenaar  endtry
850f0b9f43cSBram Moolenaar  assert_equal(255, n)
851f0b9f43cSBram Moolenaar
852f0b9f43cSBram Moolenaar  let nd: dict<any>
853f0b9f43cSBram Moolenaar  try
854f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
855f0b9f43cSBram Moolenaar  catch /E1029:/
856f0b9f43cSBram Moolenaar    n = 266
857f0b9f43cSBram Moolenaar  endtry
858f0b9f43cSBram Moolenaar  assert_equal(266, n)
859f0b9f43cSBram Moolenaar
860f0b9f43cSBram Moolenaar  try
861f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
862f0b9f43cSBram Moolenaar  catch /E1093:/
863f0b9f43cSBram Moolenaar    n = 277
864f0b9f43cSBram Moolenaar  endtry
865f0b9f43cSBram Moolenaar  assert_equal(277, n)
866f0b9f43cSBram Moolenaar
867e859312eSBram Moolenaar  try
868e859312eSBram Moolenaar    &ts = g:astring
869e859312eSBram Moolenaar  catch /E1029:/
870e859312eSBram Moolenaar    n = 288
871e859312eSBram Moolenaar  endtry
872e859312eSBram Moolenaar  assert_equal(288, n)
873e859312eSBram Moolenaar
874e859312eSBram Moolenaar  try
875e859312eSBram Moolenaar    &backspace = 'asdf'
876e859312eSBram Moolenaar  catch /E474:/
877e859312eSBram Moolenaar    n = 299
878e859312eSBram Moolenaar  endtry
879e859312eSBram Moolenaar  assert_equal(299, n)
880e859312eSBram Moolenaar
881e859312eSBram Moolenaar  l = [1]
882e859312eSBram Moolenaar  try
883e859312eSBram Moolenaar    l[3] = 3
884e859312eSBram Moolenaar  catch /E684:/
885e859312eSBram Moolenaar    n = 300
886e859312eSBram Moolenaar  endtry
887e859312eSBram Moolenaar  assert_equal(300, n)
888e859312eSBram Moolenaar
889e859312eSBram Moolenaar  try
890e859312eSBram Moolenaar    unlet g:does_not_exist
891e859312eSBram Moolenaar  catch /E108:/
892e859312eSBram Moolenaar    n = 322
893e859312eSBram Moolenaar  endtry
894e859312eSBram Moolenaar  assert_equal(322, n)
895e859312eSBram Moolenaar
896e859312eSBram Moolenaar  try
897e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
898e859312eSBram Moolenaar  catch /E721:/
899e859312eSBram Moolenaar    n = 333
900e859312eSBram Moolenaar  endtry
901e859312eSBram Moolenaar  assert_equal(333, n)
902e859312eSBram Moolenaar
903e859312eSBram Moolenaar  try
904e859312eSBram Moolenaar    l = DeletedFunc()
905e859312eSBram Moolenaar  catch /E933:/
906e859312eSBram Moolenaar    n = 344
907e859312eSBram Moolenaar  endtry
908e859312eSBram Moolenaar  assert_equal(344, n)
909d032f34aSBram Moolenaar
910d032f34aSBram Moolenaar  try
911d032f34aSBram Moolenaar    echo len(v:true)
912d032f34aSBram Moolenaar  catch /E701:/
913d032f34aSBram Moolenaar    n = 355
914d032f34aSBram Moolenaar  endtry
915d032f34aSBram Moolenaar  assert_equal(355, n)
916d032f34aSBram Moolenaar
917d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
918d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
919d032f34aSBram Moolenaar  try
920d032f34aSBram Moolenaar    echo P()
921d032f34aSBram Moolenaar  catch /E117:/
922d032f34aSBram Moolenaar    n = 366
923d032f34aSBram Moolenaar  endtry
924d032f34aSBram Moolenaar  assert_equal(366, n)
925d032f34aSBram Moolenaar
926d032f34aSBram Moolenaar  try
927d032f34aSBram Moolenaar    echo g:NoSuchFunc()
928d032f34aSBram Moolenaar  catch /E117:/
929d032f34aSBram Moolenaar    n = 377
930d032f34aSBram Moolenaar  endtry
931d032f34aSBram Moolenaar  assert_equal(377, n)
932d032f34aSBram Moolenaar
933d032f34aSBram Moolenaar  try
934d032f34aSBram Moolenaar    echo g:alist + 4
935d032f34aSBram Moolenaar  catch /E745:/
936d032f34aSBram Moolenaar    n = 388
937d032f34aSBram Moolenaar  endtry
938d032f34aSBram Moolenaar  assert_equal(388, n)
939d032f34aSBram Moolenaar
940d032f34aSBram Moolenaar  try
941d032f34aSBram Moolenaar    echo 4 + g:alist
942d032f34aSBram Moolenaar  catch /E745:/
943d032f34aSBram Moolenaar    n = 399
944d032f34aSBram Moolenaar  endtry
945d032f34aSBram Moolenaar  assert_equal(399, n)
946d032f34aSBram Moolenaar
947d032f34aSBram Moolenaar  try
948d032f34aSBram Moolenaar    echo g:alist.member
949d032f34aSBram Moolenaar  catch /E715:/
950d032f34aSBram Moolenaar    n = 400
951d032f34aSBram Moolenaar  endtry
952d032f34aSBram Moolenaar  assert_equal(400, n)
953d032f34aSBram Moolenaar
954d032f34aSBram Moolenaar  try
955d032f34aSBram Moolenaar    echo d.member
956d032f34aSBram Moolenaar  catch /E716:/
957d032f34aSBram Moolenaar    n = 411
958d032f34aSBram Moolenaar  endtry
959d032f34aSBram Moolenaar  assert_equal(411, n)
9608a7d6542SBram Moolenaarenddef
9618a7d6542SBram Moolenaar
962e859312eSBram Moolenaardef DeletedFunc(): list<any>
963e859312eSBram Moolenaar  return ['delete me']
964e859312eSBram Moolenaarenddef
965e859312eSBram Moolenaardefcompile
966e859312eSBram Moolenaardelfunc DeletedFunc
967e859312eSBram Moolenaar
968257cc5eeSBram Moolenaardef ThrowFromDef()
969a72cfb80SBram Moolenaar  throw "getout" # comment
970257cc5eeSBram Moolenaarenddef
971257cc5eeSBram Moolenaar
972257cc5eeSBram Moolenaarfunc CatchInFunc()
973257cc5eeSBram Moolenaar  try
974257cc5eeSBram Moolenaar    call ThrowFromDef()
975257cc5eeSBram Moolenaar  catch
976257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
977257cc5eeSBram Moolenaar  endtry
978257cc5eeSBram Moolenaarendfunc
979257cc5eeSBram Moolenaar
980257cc5eeSBram Moolenaardef CatchInDef()
981257cc5eeSBram Moolenaar  try
982257cc5eeSBram Moolenaar    ThrowFromDef()
983257cc5eeSBram Moolenaar  catch
984257cc5eeSBram Moolenaar    g:thrown_def = v:exception
985257cc5eeSBram Moolenaar  endtry
986257cc5eeSBram Moolenaarenddef
987257cc5eeSBram Moolenaar
988f575adffSBram Moolenaardef ReturnFinally(): string
989f575adffSBram Moolenaar  try
990f575adffSBram Moolenaar    return 'intry'
991f575adffSBram Moolenaar  finally
992f575adffSBram Moolenaar    g:in_finally = 'finally'
993f575adffSBram Moolenaar  endtry
994f575adffSBram Moolenaar  return 'end'
995f575adffSBram Moolenaarenddef
996f575adffSBram Moolenaar
997257cc5eeSBram Moolenaardef Test_try_catch_nested()
998257cc5eeSBram Moolenaar  CatchInFunc()
999257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1000257cc5eeSBram Moolenaar
1001257cc5eeSBram Moolenaar  CatchInDef()
1002257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1003f575adffSBram Moolenaar
1004f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1005f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1006f575adffSBram Moolenaarenddef
1007f575adffSBram Moolenaar
1008f575adffSBram Moolenaardef Test_try_catch_match()
1009f575adffSBram Moolenaar  let seq = 'a'
1010f575adffSBram Moolenaar  try
1011f575adffSBram Moolenaar    throw 'something'
1012f575adffSBram Moolenaar  catch /nothing/
1013f575adffSBram Moolenaar    seq ..= 'x'
1014f575adffSBram Moolenaar  catch /some/
1015f575adffSBram Moolenaar    seq ..= 'b'
1016f575adffSBram Moolenaar  catch /asdf/
1017f575adffSBram Moolenaar    seq ..= 'x'
1018e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1019e8c4abbbSBram Moolenaar    seq ..= 'y'
1020f575adffSBram Moolenaar  finally
1021f575adffSBram Moolenaar    seq ..= 'c'
1022f575adffSBram Moolenaar  endtry
1023f575adffSBram Moolenaar  assert_equal('abc', seq)
1024257cc5eeSBram Moolenaarenddef
1025257cc5eeSBram Moolenaar
1026e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1027e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1028e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1029e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1030585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1031585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1032585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1033585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1034585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1035585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1036585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1037585fea7bSBram Moolenaar
1038a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1039585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1040e8c4abbbSBram Moolenaarenddef
1041e8c4abbbSBram Moolenaar
1042006ad48bSBram Moolenaardef Test_throw_vimscript()
1043f5be8cdbSBram Moolenaar  # only checks line continuation
1044006ad48bSBram Moolenaar  let lines =<< trim END
1045006ad48bSBram Moolenaar      vim9script
1046006ad48bSBram Moolenaar      try
1047006ad48bSBram Moolenaar        throw 'one'
1048006ad48bSBram Moolenaar              .. 'two'
1049006ad48bSBram Moolenaar      catch
1050006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1051006ad48bSBram Moolenaar      endtry
1052006ad48bSBram Moolenaar  END
1053006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1054006ad48bSBram Moolenaarenddef
1055006ad48bSBram Moolenaar
105637c83711SBram Moolenaardef Test_cexpr_vimscript()
1057f5be8cdbSBram Moolenaar  # only checks line continuation
105837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
105937c83711SBram Moolenaar  let lines =<< trim END
106037c83711SBram Moolenaar      vim9script
106137c83711SBram Moolenaar      cexpr 'File'
106237c83711SBram Moolenaar                .. ' someFile' ..
106337c83711SBram Moolenaar                   ' line 19'
106437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
106537c83711SBram Moolenaar  END
106637c83711SBram Moolenaar  CheckScriptSuccess(lines)
106737c83711SBram Moolenaar  set errorformat&
106837c83711SBram Moolenaarenddef
106937c83711SBram Moolenaar
1070b209750bSBram Moolenaardef Test_list_vimscript()
1071b209750bSBram Moolenaar  # checks line continuation and comments
1072b209750bSBram Moolenaar  let lines =<< trim END
1073b209750bSBram Moolenaar      vim9script
1074b209750bSBram Moolenaar      let mylist = [
1075b209750bSBram Moolenaar            'one',
1076b209750bSBram Moolenaar            # comment
1077b209750bSBram Moolenaar            'two', # empty line follows
1078b209750bSBram Moolenaar
1079b209750bSBram Moolenaar            'three',
1080b209750bSBram Moolenaar            ]
1081b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1082b209750bSBram Moolenaar  END
1083b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1084b209750bSBram Moolenaarenddef
1085b209750bSBram Moolenaar
10862a1381c3SBram Moolenaarif has('channel')
108740ee466cSBram Moolenaar  let someJob = test_null_job()
108840ee466cSBram Moolenaar
108940ee466cSBram Moolenaar  def FuncWithError()
109040ee466cSBram Moolenaar    echomsg g:someJob
109140ee466cSBram Moolenaar  enddef
109240ee466cSBram Moolenaar
109340ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
109440ee466cSBram Moolenaar    try
109540ee466cSBram Moolenaar      call FuncWithError()
109640ee466cSBram Moolenaar    catch
109740ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
109840ee466cSBram Moolenaar    endtry
109940ee466cSBram Moolenaar  endfunc
11002a1381c3SBram Moolenaarendif
110140ee466cSBram Moolenaar
11028a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11038a7d6542SBram Moolenaar  vim9script
11048a7d6542SBram Moolenaar  let name: string = 'bob'
11058a7d6542SBram Moolenaar  def Concat(arg: string): string
11068a7d6542SBram Moolenaar    return name .. arg
11078a7d6542SBram Moolenaar  enddef
1108227a69deSBram Moolenaar  g:result = Concat('bie')
1109227a69deSBram Moolenaar  g:localname = name
11108a7d6542SBram Moolenaar
11118a7d6542SBram Moolenaar  export const CONST = 1234
11128a7d6542SBram Moolenaar  export let exported = 9876
11136e587dcbSBram Moolenaar  export let exp_name = 'John'
11148a7d6542SBram Moolenaar  export def Exported(): string
11158a7d6542SBram Moolenaar    return 'Exported'
11168a7d6542SBram Moolenaar  enddef
11178a7d6542SBram MoolenaarEND
11188a7d6542SBram Moolenaar
11195269bd2aSBram Moolenaardef Test_vim9_import_export()
11208a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11218a7d6542SBram Moolenaar    vim9script
11228a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11238a7d6542SBram Moolenaar    g:imported = exported
11246e587dcbSBram Moolenaar    exported += 3
11256e587dcbSBram Moolenaar    g:imported_added = exported
11268a7d6542SBram Moolenaar    g:imported_func = Exported()
11276e587dcbSBram Moolenaar
112840f4f7a4SBram Moolenaar    def GetExported(): string
112940f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
113040f4f7a4SBram Moolenaar      return local_dict.ref()
113140f4f7a4SBram Moolenaar    enddef
113240f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
113340f4f7a4SBram Moolenaar
11346e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11356e587dcbSBram Moolenaar    g:imported_name = exp_name
11366e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11376e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11385381c7a1SBram Moolenaar    g:imported_later = exported
11398a7d6542SBram Moolenaar  END
11408a7d6542SBram Moolenaar
11418a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11428a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11438a7d6542SBram Moolenaar
11448a7d6542SBram Moolenaar  source Ximport.vim
11458a7d6542SBram Moolenaar
11468a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11478a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11488a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11496e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11505381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11518a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
115240f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11536e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11546e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11558a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11568a7d6542SBram Moolenaar
11578a7d6542SBram Moolenaar  unlet g:result
11588a7d6542SBram Moolenaar  unlet g:localname
11598a7d6542SBram Moolenaar  unlet g:imported
11606e587dcbSBram Moolenaar  unlet g:imported_added
11615381c7a1SBram Moolenaar  unlet g:imported_later
11628a7d6542SBram Moolenaar  unlet g:imported_func
11636e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11648a7d6542SBram Moolenaar  delete('Ximport.vim')
1165f2d5c240SBram Moolenaar
11661c991144SBram Moolenaar  # similar, with line breaks
11671c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11681c991144SBram Moolenaar    vim9script
11691c991144SBram Moolenaar    import {
11701c991144SBram Moolenaar        exported,
11711c991144SBram Moolenaar        Exported,
11721c991144SBram Moolenaar        }
11731c991144SBram Moolenaar        from
11741c991144SBram Moolenaar        './Xexport.vim'
11751c991144SBram Moolenaar    g:imported = exported
11761c991144SBram Moolenaar    exported += 5
11771c991144SBram Moolenaar    g:imported_added = exported
11781c991144SBram Moolenaar    g:imported_func = Exported()
11791c991144SBram Moolenaar  END
11801c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11811c991144SBram Moolenaar  source Ximport_lbr.vim
11821c991144SBram Moolenaar
11831c991144SBram Moolenaar  assert_equal(9876, g:imported)
11841c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11851c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11861c991144SBram Moolenaar
11871c991144SBram Moolenaar  # exported script not sourced again
11881c991144SBram Moolenaar  assert_false(exists('g:result'))
11891c991144SBram Moolenaar  unlet g:imported
11901c991144SBram Moolenaar  unlet g:imported_added
11911c991144SBram Moolenaar  unlet g:imported_func
11921c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11931c991144SBram Moolenaar
11941c991144SBram Moolenaar  # import inside :def function
11955381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
11965381c7a1SBram Moolenaar    vim9script
11975381c7a1SBram Moolenaar    def ImportInDef()
11985381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11995381c7a1SBram Moolenaar      g:imported = exported
12005381c7a1SBram Moolenaar      exported += 7
12015381c7a1SBram Moolenaar      g:imported_added = exported
12025381c7a1SBram Moolenaar    enddef
12035381c7a1SBram Moolenaar    ImportInDef()
12045381c7a1SBram Moolenaar  END
12055381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12065381c7a1SBram Moolenaar  source Ximport2.vim
1207f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12085381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12095381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12105381c7a1SBram Moolenaar  unlet g:imported
12115381c7a1SBram Moolenaar  unlet g:imported_added
12125381c7a1SBram Moolenaar  delete('Ximport2.vim')
12135381c7a1SBram Moolenaar
1214f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1215f2d5c240SBram Moolenaar    vim9script
1216f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1217f2d5c240SBram Moolenaar    def UseExport()
1218f2d5c240SBram Moolenaar      g:imported = Export.exported
1219f2d5c240SBram Moolenaar    enddef
1220f2d5c240SBram Moolenaar    UseExport()
1221f2d5c240SBram Moolenaar  END
1222f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1223f2d5c240SBram Moolenaar  source Ximport.vim
12245381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1225f2d5c240SBram Moolenaar
1226599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1227599c89c8SBram Moolenaar    vim9script
1228599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1229599c89c8SBram Moolenaar    def Func()
1230599c89c8SBram Moolenaar      let dummy = 1
1231599c89c8SBram Moolenaar      let imported = Export + dummy
1232599c89c8SBram Moolenaar    enddef
1233822ba247SBram Moolenaar    defcompile
1234599c89c8SBram Moolenaar  END
1235599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1236599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1237599c89c8SBram Moolenaar
1238599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1239599c89c8SBram Moolenaar    vim9script
1240599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1241599c89c8SBram Moolenaar    def Func()
1242599c89c8SBram Moolenaar      let imported = Export . exported
1243599c89c8SBram Moolenaar    enddef
1244822ba247SBram Moolenaar    defcompile
1245599c89c8SBram Moolenaar  END
1246599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1247599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1248599c89c8SBram Moolenaar
1249599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1250599c89c8SBram Moolenaar    vim9script
1251599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1252599c89c8SBram Moolenaar    def Func()
1253599c89c8SBram Moolenaar      let imported = Export.
1254599c89c8SBram Moolenaar    enddef
1255822ba247SBram Moolenaar    defcompile
1256599c89c8SBram Moolenaar  END
1257599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1258599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1259599c89c8SBram Moolenaar
12601c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12611c991144SBram Moolenaar    vim9script
12621c991144SBram Moolenaar    import *
12631c991144SBram Moolenaar        as Export
12641c991144SBram Moolenaar        from
12651c991144SBram Moolenaar        './Xexport.vim'
12661c991144SBram Moolenaar    def UseExport()
12671c991144SBram Moolenaar      g:imported = Export.exported
12681c991144SBram Moolenaar    enddef
12691c991144SBram Moolenaar    UseExport()
12701c991144SBram Moolenaar  END
12711c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12721c991144SBram Moolenaar  source Ximport.vim
12731c991144SBram Moolenaar  assert_equal(9883, g:imported)
12741c991144SBram Moolenaar
1275f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1276f2d5c240SBram Moolenaar    vim9script
1277f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1278f2d5c240SBram Moolenaar  END
1279f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1280f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1281f2d5c240SBram Moolenaar
1282f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1283fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1284fa29c8abSBram Moolenaar    vim9script
1285fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1286fa29c8abSBram Moolenaar  END
1287fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1288fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1289fa29c8abSBram Moolenaar
1290f5be8cdbSBram Moolenaar  # try to import something that is already defined
12915269bd2aSBram Moolenaar  let import_already_defined =<< trim END
12925269bd2aSBram Moolenaar    vim9script
12935269bd2aSBram Moolenaar    let exported = 'something'
12945269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12955269bd2aSBram Moolenaar  END
12965269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12975269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12985269bd2aSBram Moolenaar
1299f5be8cdbSBram Moolenaar  # try to import something that is already defined
13005269bd2aSBram Moolenaar  import_already_defined =<< trim END
13015269bd2aSBram Moolenaar    vim9script
13025269bd2aSBram Moolenaar    let exported = 'something'
13035269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13045269bd2aSBram Moolenaar  END
13055269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13065269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13075269bd2aSBram Moolenaar
1308f5be8cdbSBram Moolenaar  # try to import something that is already defined
13095269bd2aSBram Moolenaar  import_already_defined =<< trim END
13105269bd2aSBram Moolenaar    vim9script
13115269bd2aSBram Moolenaar    let exported = 'something'
13125269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13135269bd2aSBram Moolenaar  END
13145269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13155269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13165269bd2aSBram Moolenaar
1317f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1318fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1319fa29c8abSBram Moolenaar    vim9script
1320fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1321fa29c8abSBram Moolenaar  END
1322fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1323fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1324fa29c8abSBram Moolenaar
1325fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1326fa29c8abSBram Moolenaar    vim9script
1327fa29c8abSBram Moolenaar    import name './Xexport.vim'
1328fa29c8abSBram Moolenaar  END
1329fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1330fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1331fa29c8abSBram Moolenaar
1332fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1333fa29c8abSBram Moolenaar    vim9script
1334fa29c8abSBram Moolenaar    import name from Xexport.vim
1335fa29c8abSBram Moolenaar  END
1336fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1337fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1338fa29c8abSBram Moolenaar
1339fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1340fa29c8abSBram Moolenaar    vim9script
1341fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1342fa29c8abSBram Moolenaar  END
1343fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1344fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1345fa29c8abSBram Moolenaar
1346fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1347fa29c8abSBram Moolenaar    vim9script
1348fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1349fa29c8abSBram Moolenaar  END
13505269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13515269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1352fa29c8abSBram Moolenaar
1353f2d5c240SBram Moolenaar  delete('Ximport.vim')
13545269bd2aSBram Moolenaar  delete('Ximport3.vim')
13558a7d6542SBram Moolenaar  delete('Xexport.vim')
13568a7d6542SBram Moolenaar
1357f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1358750802b5SBram Moolenaar  set cpo&vi
1359750802b5SBram Moolenaar  let cpo_before = &cpo
1360750802b5SBram Moolenaar  let lines =<< trim END
1361750802b5SBram Moolenaar    vim9script
1362750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1363750802b5SBram Moolenaar  END
1364750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1365750802b5SBram Moolenaar  source Xvim9_script
1366750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1367750802b5SBram Moolenaar  set cpo&vim
1368750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1369750802b5SBram Moolenaar  delete('Xvim9_script')
1370750802b5SBram Moolenaarenddef
1371750802b5SBram Moolenaar
1372803af686SBram Moolenaarfunc g:Trigger()
1373803af686SBram Moolenaar  source Ximport.vim
1374803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1375803af686SBram Moolenaarendfunc
1376803af686SBram Moolenaar
1377803af686SBram Moolenaardef Test_import_export_expr_map()
1378803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1379803af686SBram Moolenaar  let export_lines =<< trim END
1380803af686SBram Moolenaar    vim9script
1381803af686SBram Moolenaar    export def That(): string
1382803af686SBram Moolenaar      return 'yes'
1383803af686SBram Moolenaar    enddef
1384803af686SBram Moolenaar  END
1385803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1386803af686SBram Moolenaar
1387803af686SBram Moolenaar  let import_lines =<< trim END
1388803af686SBram Moolenaar    vim9script
1389803af686SBram Moolenaar    import That from './Xexport_that.vim'
1390803af686SBram Moolenaar    assert_equal('yes', That())
1391803af686SBram Moolenaar  END
1392803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1393803af686SBram Moolenaar
1394803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1395803af686SBram Moolenaar  feedkeys('trigger', "xt")
1396803af686SBram Moolenaar
1397803af686SBram Moolenaar  delete('Xexport.vim')
1398803af686SBram Moolenaar  delete('Ximport.vim')
1399803af686SBram Moolenaar  nunmap trigger
1400803af686SBram Moolenaarenddef
1401803af686SBram Moolenaar
14028e1986e3SBram Moolenaardef Test_import_in_filetype()
14038e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14048e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14058e1986e3SBram Moolenaar  let export_lines =<< trim END
14068e1986e3SBram Moolenaar    vim9script
14078e1986e3SBram Moolenaar    export let That = 'yes'
14088e1986e3SBram Moolenaar  END
14098e1986e3SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_that.vim')
14108e1986e3SBram Moolenaar
14118e1986e3SBram Moolenaar  let import_lines =<< trim END
14128e1986e3SBram Moolenaar    vim9script
14138e1986e3SBram Moolenaar    import That from './Xexport_that.vim'
14148e1986e3SBram Moolenaar    assert_equal('yes', That)
14158e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14168e1986e3SBram Moolenaar  END
14178e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14188e1986e3SBram Moolenaar
14198e1986e3SBram Moolenaar  let save_rtp = &rtp
14208e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14218e1986e3SBram Moolenaar
14228e1986e3SBram Moolenaar  filetype plugin on
14238e1986e3SBram Moolenaar  copen
14248e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14258e1986e3SBram Moolenaar
14268e1986e3SBram Moolenaar  quit!
14278e1986e3SBram Moolenaar  delete('Xexport.vim')
14288e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14298e1986e3SBram Moolenaar  &rtp = save_rtp
14308e1986e3SBram Moolenaarenddef
14318e1986e3SBram Moolenaar
1432750802b5SBram Moolenaardef Test_vim9script_fails()
14338a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14348a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1435750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
14369721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
14379b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1438750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1439750802b5SBram Moolenaar
1440c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1441c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1442c785b9a7SBram Moolenaar
1443750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1444a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
14458a7d6542SBram Moolenaarenddef
14468a7d6542SBram Moolenaar
1447f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1448101f4810SBram Moolenaar  CheckRunVimInTerminal
1449101f4810SBram Moolenaar
14509bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1451c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14529bb3eb3eSBram Moolenaarendfunc
14539bb3eb3eSBram Moolenaar
1454c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1455101f4810SBram Moolenaar  let export =<< trim END
1456101f4810SBram Moolenaar    vim9script
1457101f4810SBram Moolenaar    export def Foo(): number
1458101f4810SBram Moolenaar        return 0
1459101f4810SBram Moolenaar    enddef
1460101f4810SBram Moolenaar  END
14619bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1462101f4810SBram Moolenaar
14639bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
14649bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14659bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1466101f4810SBram Moolenaar
14679bb3eb3eSBram Moolenaar  delete('Xexport.vim')
14689bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14699bb3eb3eSBram Moolenaarenddef
1470101f4810SBram Moolenaar
14714c17ad94SBram Moolenaardef Test_vim9script_reload_import()
14728a7d6542SBram Moolenaar  let lines =<< trim END
14738a7d6542SBram Moolenaar    vim9script
14748a7d6542SBram Moolenaar    const var = ''
14758a7d6542SBram Moolenaar    let valone = 1234
14768a7d6542SBram Moolenaar    def MyFunc(arg: string)
14778a7d6542SBram Moolenaar       valone = 5678
14788a7d6542SBram Moolenaar    enddef
14798a7d6542SBram Moolenaar  END
14808a7d6542SBram Moolenaar  let morelines =<< trim END
14818a7d6542SBram Moolenaar    let valtwo = 222
14828a7d6542SBram Moolenaar    export def GetValtwo(): number
14838a7d6542SBram Moolenaar      return valtwo
14848a7d6542SBram Moolenaar    enddef
14858a7d6542SBram Moolenaar  END
148603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14878a7d6542SBram Moolenaar  source Xreload.vim
14888a7d6542SBram Moolenaar  source Xreload.vim
14898a7d6542SBram Moolenaar  source Xreload.vim
14908a7d6542SBram Moolenaar
14918a7d6542SBram Moolenaar  let testlines =<< trim END
14928a7d6542SBram Moolenaar    vim9script
14938a7d6542SBram Moolenaar    def TheFunc()
14948a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14958a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14968a7d6542SBram Moolenaar    enddef
14978a7d6542SBram Moolenaar    TheFunc()
14988a7d6542SBram Moolenaar  END
14998a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15008a7d6542SBram Moolenaar  source Ximport.vim
15018a7d6542SBram Moolenaar
1502f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1503f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15048a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15058a7d6542SBram Moolenaar  source Ximport.vim
15068a7d6542SBram Moolenaar
1507f5be8cdbSBram Moolenaar  # cannot declare a var twice
15088a7d6542SBram Moolenaar  lines =<< trim END
15098a7d6542SBram Moolenaar    vim9script
15108a7d6542SBram Moolenaar    let valone = 1234
15118a7d6542SBram Moolenaar    let valone = 5678
15128a7d6542SBram Moolenaar  END
15138a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15148a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
15158a7d6542SBram Moolenaar
15168a7d6542SBram Moolenaar  delete('Xreload.vim')
15178a7d6542SBram Moolenaar  delete('Ximport.vim')
15188a7d6542SBram Moolenaarenddef
15198a7d6542SBram Moolenaar
1520fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1521fe465a01SBram Moolenaar" script-local name.
1522fe465a01SBram Moolenaardef Test_vim9script_funcref()
1523fe465a01SBram Moolenaar  let sortlines =<< trim END
1524fe465a01SBram Moolenaar      vim9script
1525fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1526bed36b93SBram Moolenaar        return i2 - i1
1527fe465a01SBram Moolenaar      enddef
1528fe465a01SBram Moolenaar
1529fe465a01SBram Moolenaar      export def FastSort(): list<number>
1530fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1531fe465a01SBram Moolenaar      enddef
1532fe465a01SBram Moolenaar  END
1533fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1534fe465a01SBram Moolenaar
1535fe465a01SBram Moolenaar  let lines =<< trim END
1536fe465a01SBram Moolenaar    vim9script
1537fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1538fe465a01SBram Moolenaar    def Test()
1539fe465a01SBram Moolenaar      g:result = FastSort()
1540fe465a01SBram Moolenaar    enddef
1541fe465a01SBram Moolenaar    Test()
1542fe465a01SBram Moolenaar  END
1543fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1544fe465a01SBram Moolenaar
1545fe465a01SBram Moolenaar  source Xscript.vim
1546fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1547fe465a01SBram Moolenaar
1548fe465a01SBram Moolenaar  unlet g:result
1549fe465a01SBram Moolenaar  delete('Xsort.vim')
1550fe465a01SBram Moolenaar  delete('Xscript.vim')
1551fe465a01SBram Moolenaarenddef
1552fe465a01SBram Moolenaar
1553c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1554c620c055SBram Moolenaar" script where FastFilter() is called from.
1555c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1556c620c055SBram Moolenaar  let filterLines =<< trim END
1557c620c055SBram Moolenaar    vim9script
1558c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1559c620c055SBram Moolenaar      return idx % 2 == 1
1560c620c055SBram Moolenaar    enddef
1561c620c055SBram Moolenaar    export def FastFilter(): list<number>
1562c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1563c620c055SBram Moolenaar    enddef
1564c620c055SBram Moolenaar  END
1565c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1566c620c055SBram Moolenaar
1567c620c055SBram Moolenaar  let lines =<< trim END
1568c620c055SBram Moolenaar    vim9script
1569c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1570c620c055SBram Moolenaar    def Test()
1571c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1572c620c055SBram Moolenaar    enddef
1573c620c055SBram Moolenaar    Test()
1574c620c055SBram Moolenaar  END
1575c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1576c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1577c620c055SBram Moolenaar
1578c620c055SBram Moolenaar  delete('Xfilter.vim')
1579c620c055SBram Moolenaar  delete('Ximport.vim')
1580c620c055SBram Moolenaarenddef
1581c620c055SBram Moolenaar
15824c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
15834c17ad94SBram Moolenaar  let first_lines =<< trim END
15844c17ad94SBram Moolenaar    vim9script
15854c17ad94SBram Moolenaar    def FuncYes(): string
15864c17ad94SBram Moolenaar      return 'yes'
15874c17ad94SBram Moolenaar    enddef
15884c17ad94SBram Moolenaar  END
158903afdcf1SBram Moolenaar  let withno_lines =<< trim END
15904c17ad94SBram Moolenaar    def FuncNo(): string
15914c17ad94SBram Moolenaar      return 'no'
15924c17ad94SBram Moolenaar    enddef
15934c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15944c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15954c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
159603afdcf1SBram Moolenaar    enddef
159703afdcf1SBram Moolenaar  END
159803afdcf1SBram Moolenaar  let nono_lines =<< trim END
159903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
160003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
16014c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
16024c17ad94SBram Moolenaar    enddef
16034c17ad94SBram Moolenaar  END
16044c17ad94SBram Moolenaar
16054c17ad94SBram Moolenaar  # FuncNo() is defined
160603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16074c17ad94SBram Moolenaar  source Xreloaded.vim
16084c17ad94SBram Moolenaar  g:DoCheck(true)
16094c17ad94SBram Moolenaar
16104c17ad94SBram Moolenaar  # FuncNo() is not redefined
161103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16124c17ad94SBram Moolenaar  source Xreloaded.vim
161303afdcf1SBram Moolenaar  g:DoCheck()
16144c17ad94SBram Moolenaar
16154c17ad94SBram Moolenaar  # FuncNo() is back
161603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16174c17ad94SBram Moolenaar  source Xreloaded.vim
161803afdcf1SBram Moolenaar  g:DoCheck()
16194c17ad94SBram Moolenaar
16204c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16214c17ad94SBram Moolenaarenddef
16224c17ad94SBram Moolenaar
162389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
162489483d40SBram Moolenaar  # write the script with a script-local variable
162589483d40SBram Moolenaar  let lines =<< trim END
162689483d40SBram Moolenaar    vim9script
162789483d40SBram Moolenaar    let var = 'string'
162889483d40SBram Moolenaar  END
162989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
163089483d40SBram Moolenaar  source XreloadVar.vim
163189483d40SBram Moolenaar
163289483d40SBram Moolenaar  # now write the script using the same variable locally - works
163389483d40SBram Moolenaar  lines =<< trim END
163489483d40SBram Moolenaar    vim9script
163589483d40SBram Moolenaar    def Func()
163689483d40SBram Moolenaar      let var = 'string'
163789483d40SBram Moolenaar    enddef
163889483d40SBram Moolenaar  END
163989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
164089483d40SBram Moolenaar  source XreloadVar.vim
164189483d40SBram Moolenaar
164289483d40SBram Moolenaar  delete('XreloadVar.vim')
164389483d40SBram Moolenaarenddef
164489483d40SBram Moolenaar
16458a7d6542SBram Moolenaardef Test_import_absolute()
16468a7d6542SBram Moolenaar  let import_lines = [
1647e6085c53SBram Moolenaar        'vim9script',
1648e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1649e6085c53SBram Moolenaar        'def UseExported()',
1650e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1651e6085c53SBram Moolenaar        '  exported = 8888',
1652e6085c53SBram Moolenaar        '  g:imported_after = exported',
1653e6085c53SBram Moolenaar        'enddef',
1654e6085c53SBram Moolenaar        'UseExported()',
1655e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1656e6085c53SBram Moolenaar        ]
16578a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16588a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16598a7d6542SBram Moolenaar
16608a7d6542SBram Moolenaar  source Ximport_abs.vim
16618a7d6542SBram Moolenaar
16628a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16634e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1664675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1665675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1666675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1667675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1668675f716eSBram Moolenaar          'exported = 8888.*' ..
1669675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1670675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1671675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1672675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1673e6085c53SBram Moolenaar        g:import_disassembled)
16748a7d6542SBram Moolenaar  unlet g:imported_abs
16754e12a5dfSBram Moolenaar  unlet g:import_disassembled
16768a7d6542SBram Moolenaar
16778a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16788a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16798a7d6542SBram Moolenaarenddef
16808a7d6542SBram Moolenaar
16818a7d6542SBram Moolenaardef Test_import_rtp()
16828a7d6542SBram Moolenaar  let import_lines = [
1683e6085c53SBram Moolenaar        'vim9script',
1684e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1685e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1686e6085c53SBram Moolenaar        ]
16878a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16888a7d6542SBram Moolenaar  mkdir('import')
16898a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16908a7d6542SBram Moolenaar
16918a7d6542SBram Moolenaar  let save_rtp = &rtp
16928a7d6542SBram Moolenaar  &rtp = getcwd()
16938a7d6542SBram Moolenaar  source Ximport_rtp.vim
16948a7d6542SBram Moolenaar  &rtp = save_rtp
16958a7d6542SBram Moolenaar
16968a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16978a7d6542SBram Moolenaar  unlet g:imported_rtp
16988a7d6542SBram Moolenaar
16998a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
170089483d40SBram Moolenaar  delete('import', 'rf')
17018a7d6542SBram Moolenaarenddef
17028a7d6542SBram Moolenaar
170325e0f586SBram Moolenaardef Test_import_compile_error()
170425e0f586SBram Moolenaar  let export_lines = [
170525e0f586SBram Moolenaar        'vim9script',
170625e0f586SBram Moolenaar        'export def ExpFunc(): string',
170725e0f586SBram Moolenaar        '  return notDefined',
170825e0f586SBram Moolenaar        'enddef',
170925e0f586SBram Moolenaar        ]
171025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
171125e0f586SBram Moolenaar
171225e0f586SBram Moolenaar  let import_lines = [
171325e0f586SBram Moolenaar        'vim9script',
171425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
171525e0f586SBram Moolenaar        'def ImpFunc()',
171625e0f586SBram Moolenaar        '  echo ExpFunc()',
171725e0f586SBram Moolenaar        'enddef',
171825e0f586SBram Moolenaar        'defcompile',
171925e0f586SBram Moolenaar        ]
172025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
172125e0f586SBram Moolenaar
172225e0f586SBram Moolenaar  try
172325e0f586SBram Moolenaar    source Ximport.vim
172425e0f586SBram Moolenaar  catch /E1001/
1725f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
172625e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
172725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
172825e0f586SBram Moolenaar  endtry
172925e0f586SBram Moolenaar
173025e0f586SBram Moolenaar  delete('Xexported.vim')
173125e0f586SBram Moolenaar  delete('Ximport.vim')
173225e0f586SBram Moolenaarenddef
173325e0f586SBram Moolenaar
1734eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1735eef2102eSBram Moolenaar  let export_lines =<< trim END
1736eef2102eSBram Moolenaar      vim9script
1737eef2102eSBram Moolenaar      export def Func()
1738eef2102eSBram Moolenaar        echo 'imported'
1739eef2102eSBram Moolenaar      enddef
1740eef2102eSBram Moolenaar  END
1741eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1742eef2102eSBram Moolenaar
1743eef2102eSBram Moolenaar  let lines =<< trim END
1744eef2102eSBram Moolenaar    vim9script
1745eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1746eef2102eSBram Moolenaar    def Func()
1747eef2102eSBram Moolenaar      echo 'local to function'
1748eef2102eSBram Moolenaar    enddef
1749eef2102eSBram Moolenaar  END
1750eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1751eef2102eSBram Moolenaar
1752eef2102eSBram Moolenaar  lines =<< trim END
1753eef2102eSBram Moolenaar    vim9script
1754eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1755eef2102eSBram Moolenaar    def Outer()
1756eef2102eSBram Moolenaar      def Func()
1757eef2102eSBram Moolenaar        echo 'local to function'
1758eef2102eSBram Moolenaar      enddef
1759eef2102eSBram Moolenaar    enddef
1760eef2102eSBram Moolenaar    defcompile
1761eef2102eSBram Moolenaar  END
1762eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1763eef2102eSBram Moolenaar
1764eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1765eef2102eSBram Moolenaarenddef
1766eef2102eSBram Moolenaar
1767b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1768b9a2cac3SBram Moolenaar  let lines =<< trim END
1769b9a2cac3SBram Moolenaar    vim9script
1770b9a2cac3SBram Moolenaar    def Func()
1771b9a2cac3SBram Moolenaar      echo 'one'
1772b9a2cac3SBram Moolenaar    enddef
1773b9a2cac3SBram Moolenaar    def Func()
1774b9a2cac3SBram Moolenaar      echo 'two'
1775b9a2cac3SBram Moolenaar    enddef
1776b9a2cac3SBram Moolenaar  END
1777b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1778b9a2cac3SBram Moolenaarenddef
1779b9a2cac3SBram Moolenaar
17808a7d6542SBram Moolenaardef Test_fixed_size_list()
1781f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
17828a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
17838a7d6542SBram Moolenaar  l->remove(0)
17848a7d6542SBram Moolenaar  l->add(5)
17858a7d6542SBram Moolenaar  l->insert(99, 1)
17860f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17878a7d6542SBram Moolenaarenddef
17888a7d6542SBram Moolenaar
1789ae616494SBram Moolenaardef Test_no_insert_xit()
1790ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1791ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1792f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1793f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1794f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1795ae616494SBram Moolenaar
1796ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1797ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1798ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1799ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1800f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1801f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1802f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1803f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1804f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1805ae616494SBram Moolenaarenddef
1806ae616494SBram Moolenaar
1807158906cfSBram Moolenaardef IfElse(what: number): string
1808158906cfSBram Moolenaar  let res = ''
1809158906cfSBram Moolenaar  if what == 1
1810158906cfSBram Moolenaar    res = "one"
1811158906cfSBram Moolenaar  elseif what == 2
1812158906cfSBram Moolenaar    res = "two"
1813a259d8d3SBram Moolenaar  else
1814158906cfSBram Moolenaar    res = "three"
1815a259d8d3SBram Moolenaar  endif
1816158906cfSBram Moolenaar  return res
1817a259d8d3SBram Moolenaarenddef
1818a259d8d3SBram Moolenaar
1819158906cfSBram Moolenaardef Test_if_elseif_else()
1820158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1821158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1822158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18230f18b6d1SBram Moolenaarenddef
18240f18b6d1SBram Moolenaar
1825e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1826e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1827e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1828e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1829e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1830585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1831e8c4abbbSBram Moolenaarenddef
1832e8c4abbbSBram Moolenaar
18336d69bf60SBram Moolenaarlet g:bool_true = v:true
18346d69bf60SBram Moolenaarlet g:bool_false = v:false
18356d69bf60SBram Moolenaar
18366d69bf60SBram Moolenaardef Test_if_const_expr()
18376d69bf60SBram Moolenaar  let res = false
18386d69bf60SBram Moolenaar  if true ? true : false
18396d69bf60SBram Moolenaar    res = true
18406d69bf60SBram Moolenaar  endif
18416d69bf60SBram Moolenaar  assert_equal(true, res)
18426d69bf60SBram Moolenaar
1843585fea7bSBram Moolenaar  g:glob = 2
1844585fea7bSBram Moolenaar  if false
18456797966dSBram Moolenaar    execute('g:glob = 3')
1846585fea7bSBram Moolenaar  endif
1847585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1848585fea7bSBram Moolenaar  if true
18496797966dSBram Moolenaar    execute('g:glob = 3')
1850585fea7bSBram Moolenaar  endif
1851585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1852585fea7bSBram Moolenaar
18536d69bf60SBram Moolenaar  res = false
18546d69bf60SBram Moolenaar  if g:bool_true ? true : false
18556d69bf60SBram Moolenaar    res = true
18566d69bf60SBram Moolenaar  endif
18576d69bf60SBram Moolenaar  assert_equal(true, res)
18586d69bf60SBram Moolenaar
18596d69bf60SBram Moolenaar  res = false
18606d69bf60SBram Moolenaar  if true ? g:bool_true : false
18616d69bf60SBram Moolenaar    res = true
18626d69bf60SBram Moolenaar  endif
18636d69bf60SBram Moolenaar  assert_equal(true, res)
18646d69bf60SBram Moolenaar
18656d69bf60SBram Moolenaar  res = false
18666d69bf60SBram Moolenaar  if true ? true : g:bool_false
18676d69bf60SBram Moolenaar    res = true
18686d69bf60SBram Moolenaar  endif
18696d69bf60SBram Moolenaar  assert_equal(true, res)
18706d69bf60SBram Moolenaar
18716d69bf60SBram Moolenaar  res = false
18726d69bf60SBram Moolenaar  if true ? false : true
18736d69bf60SBram Moolenaar    res = true
18746d69bf60SBram Moolenaar  endif
18756d69bf60SBram Moolenaar  assert_equal(false, res)
18766d69bf60SBram Moolenaar
18776d69bf60SBram Moolenaar  res = false
18786d69bf60SBram Moolenaar  if false ? false : true
18796d69bf60SBram Moolenaar    res = true
18806d69bf60SBram Moolenaar  endif
18816d69bf60SBram Moolenaar  assert_equal(true, res)
18826d69bf60SBram Moolenaar
18836d69bf60SBram Moolenaar  res = false
18846d69bf60SBram Moolenaar  if false ? true : false
18856d69bf60SBram Moolenaar    res = true
18866d69bf60SBram Moolenaar  endif
18876d69bf60SBram Moolenaar  assert_equal(false, res)
18886d69bf60SBram Moolenaar
18896d69bf60SBram Moolenaar  res = false
1890e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1891e8c4abbbSBram Moolenaar    res = true
1892e8c4abbbSBram Moolenaar  endif
1893e8c4abbbSBram Moolenaar  assert_equal(false, res)
1894e8c4abbbSBram Moolenaar
1895e8c4abbbSBram Moolenaar  res = false
18966d69bf60SBram Moolenaar  if true && true
18976d69bf60SBram Moolenaar    res = true
18986d69bf60SBram Moolenaar  endif
18996d69bf60SBram Moolenaar  assert_equal(true, res)
19006d69bf60SBram Moolenaar
19016d69bf60SBram Moolenaar  res = false
19026d69bf60SBram Moolenaar  if true && false
19036d69bf60SBram Moolenaar    res = true
19046d69bf60SBram Moolenaar  endif
19056d69bf60SBram Moolenaar  assert_equal(false, res)
19066d69bf60SBram Moolenaar
19076d69bf60SBram Moolenaar  res = false
19086d69bf60SBram Moolenaar  if g:bool_true && false
19096d69bf60SBram Moolenaar    res = true
19106d69bf60SBram Moolenaar  endif
19116d69bf60SBram Moolenaar  assert_equal(false, res)
19126d69bf60SBram Moolenaar
19136d69bf60SBram Moolenaar  res = false
19146d69bf60SBram Moolenaar  if true && g:bool_false
19156d69bf60SBram Moolenaar    res = true
19166d69bf60SBram Moolenaar  endif
19176d69bf60SBram Moolenaar  assert_equal(false, res)
19186d69bf60SBram Moolenaar
19196d69bf60SBram Moolenaar  res = false
19206d69bf60SBram Moolenaar  if false && false
19216d69bf60SBram Moolenaar    res = true
19226d69bf60SBram Moolenaar  endif
19236d69bf60SBram Moolenaar  assert_equal(false, res)
19246d69bf60SBram Moolenaar
19256d69bf60SBram Moolenaar  res = false
19266d69bf60SBram Moolenaar  if true || false
19276d69bf60SBram Moolenaar    res = true
19286d69bf60SBram Moolenaar  endif
19296d69bf60SBram Moolenaar  assert_equal(true, res)
19306d69bf60SBram Moolenaar
19316d69bf60SBram Moolenaar  res = false
19326d69bf60SBram Moolenaar  if g:bool_true || false
19336d69bf60SBram Moolenaar    res = true
19346d69bf60SBram Moolenaar  endif
19356d69bf60SBram Moolenaar  assert_equal(true, res)
19366d69bf60SBram Moolenaar
19376d69bf60SBram Moolenaar  res = false
19386d69bf60SBram Moolenaar  if true || g:bool_false
19396d69bf60SBram Moolenaar    res = true
19406d69bf60SBram Moolenaar  endif
19416d69bf60SBram Moolenaar  assert_equal(true, res)
19426d69bf60SBram Moolenaar
19436d69bf60SBram Moolenaar  res = false
19446d69bf60SBram Moolenaar  if false || false
19456d69bf60SBram Moolenaar    res = true
19466d69bf60SBram Moolenaar  endif
19476d69bf60SBram Moolenaar  assert_equal(false, res)
194880c34ca3SBram Moolenaarenddef
19496d69bf60SBram Moolenaar
195080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
195180c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
195280c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1953e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1954e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19556d69bf60SBram Moolenaarenddef
19566d69bf60SBram Moolenaar
195772abcf42SBram Moolenaardef RunNested(i: number): number
195872abcf42SBram Moolenaar  let x: number = 0
195972abcf42SBram Moolenaar  if i % 2
196072abcf42SBram Moolenaar    if 1
1961f5be8cdbSBram Moolenaar      # comment
196272abcf42SBram Moolenaar    else
1963f5be8cdbSBram Moolenaar      # comment
196472abcf42SBram Moolenaar    endif
196572abcf42SBram Moolenaar    x += 1
196672abcf42SBram Moolenaar  else
196772abcf42SBram Moolenaar    x += 1000
196872abcf42SBram Moolenaar  endif
196972abcf42SBram Moolenaar  return x
197072abcf42SBram Moolenaarenddef
197172abcf42SBram Moolenaar
197272abcf42SBram Moolenaardef Test_nested_if()
197372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
197472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
197572abcf42SBram Moolenaarenddef
197672abcf42SBram Moolenaar
1977ad39c094SBram Moolenaardef Test_execute_cmd()
1978ad39c094SBram Moolenaar  new
1979ad39c094SBram Moolenaar  setline(1, 'default')
1980ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1981ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1982a72cfb80SBram Moolenaar
1983a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1984a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1985a72cfb80SBram Moolenaar
1986ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1987ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1988a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1989ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1990a72cfb80SBram Moolenaar
1991ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1992ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1993a72cfb80SBram Moolenaar
1994ad39c094SBram Moolenaar  let cmd_first = 'call '
1995ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1996ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1997ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1998ad39c094SBram Moolenaar  bwipe!
1999585fea7bSBram Moolenaar
20002d6b20d6SBram Moolenaar  let n = true
20012d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20022d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20032d6b20d6SBram Moolenaar
2004585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2005a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2006ad39c094SBram Moolenaarenddef
2007ad39c094SBram Moolenaar
200847e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2009f5be8cdbSBram Moolenaar  # only checks line continuation
201047e880d6SBram Moolenaar  let lines =<< trim END
201147e880d6SBram Moolenaar      vim9script
201247e880d6SBram Moolenaar      execute 'g:someVar'
201347e880d6SBram Moolenaar                .. ' = ' ..
201447e880d6SBram Moolenaar                   '28'
201547e880d6SBram Moolenaar      assert_equal(28, g:someVar)
201647e880d6SBram Moolenaar      unlet g:someVar
201747e880d6SBram Moolenaar  END
201847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
201947e880d6SBram Moolenaarenddef
202047e880d6SBram Moolenaar
2021ad39c094SBram Moolenaardef Test_echo_cmd()
2022a72cfb80SBram Moolenaar  echo 'some' # comment
2023585fea7bSBram Moolenaar  echon 'thing'
2024ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2025ad39c094SBram Moolenaar
2026a72cfb80SBram Moolenaar  echo "some" # comment
2027a72cfb80SBram Moolenaar  echon "thing"
2028a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2029a72cfb80SBram Moolenaar
2030ad39c094SBram Moolenaar  let str1 = 'some'
2031ad39c094SBram Moolenaar  let str2 = 'more'
2032ad39c094SBram Moolenaar  echo str1 str2
2033ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2034a72cfb80SBram Moolenaar
2035a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2036ad39c094SBram Moolenaarenddef
2037ad39c094SBram Moolenaar
2038f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2039f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2040f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2041f93c7feaSBram Moolenaar  echo 'clear'
2042df069eecSBram Moolenaar  :1messages
2043f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2044f93c7feaSBram Moolenaar
2045f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2046f93c7feaSBram Moolenaarenddef
2047f93c7feaSBram Moolenaar
204847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2049f5be8cdbSBram Moolenaar  # only checks line continuation
205047e880d6SBram Moolenaar  let lines =<< trim END
205147e880d6SBram Moolenaar      vim9script
205247e880d6SBram Moolenaar      echomsg 'here'
205347e880d6SBram Moolenaar                .. ' is ' ..
205447e880d6SBram Moolenaar                   'a message'
205547e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
205647e880d6SBram Moolenaar  END
205747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
205847e880d6SBram Moolenaarenddef
205947e880d6SBram Moolenaar
2060f93c7feaSBram Moolenaardef Test_echoerr_cmd()
206140ee466cSBram Moolenaar  try
206240ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
206340ee466cSBram Moolenaar  catch
206440ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
206540ee466cSBram Moolenaar  endtry
2066f93c7feaSBram Moolenaarenddef
2067f93c7feaSBram Moolenaar
206847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2069f5be8cdbSBram Moolenaar  # only checks line continuation
207047e880d6SBram Moolenaar  let lines =<< trim END
207147e880d6SBram Moolenaar      vim9script
207247e880d6SBram Moolenaar      try
207347e880d6SBram Moolenaar        echoerr 'this'
207447e880d6SBram Moolenaar                .. ' is ' ..
207547e880d6SBram Moolenaar                   'wrong'
207647e880d6SBram Moolenaar      catch
207747e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
207847e880d6SBram Moolenaar      endtry
207947e880d6SBram Moolenaar  END
208047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
208147e880d6SBram Moolenaarenddef
208247e880d6SBram Moolenaar
208341fe0617SBram Moolenaardef Test_for_outside_of_function()
208441fe0617SBram Moolenaar  let lines =<< trim END
208541fe0617SBram Moolenaar    vim9script
208641fe0617SBram Moolenaar    new
208741fe0617SBram Moolenaar    for var in range(0, 3)
208841fe0617SBram Moolenaar      append(line('$'), var)
208941fe0617SBram Moolenaar    endfor
209041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
209141fe0617SBram Moolenaar    bwipe!
209241fe0617SBram Moolenaar  END
209341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
209441fe0617SBram Moolenaar  source Xvim9for.vim
209541fe0617SBram Moolenaar  delete('Xvim9for.vim')
209641fe0617SBram Moolenaarenddef
20978a7d6542SBram Moolenaar
2098e8c4abbbSBram Moolenaardef Test_for_loop()
2099e8c4abbbSBram Moolenaar  let result = ''
2100e8c4abbbSBram Moolenaar  for cnt in range(7)
2101e8c4abbbSBram Moolenaar    if cnt == 4
2102e8c4abbbSBram Moolenaar      break
2103e8c4abbbSBram Moolenaar    endif
2104e8c4abbbSBram Moolenaar    if cnt == 2
2105e8c4abbbSBram Moolenaar      continue
2106e8c4abbbSBram Moolenaar    endif
2107e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2108e8c4abbbSBram Moolenaar  endfor
2109e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21100ad3e894SBram Moolenaar
21110ad3e894SBram Moolenaar  let concat = ''
21120ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21130ad3e894SBram Moolenaar    concat ..= str
21140ad3e894SBram Moolenaar  endfor
21150ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2116e8c4abbbSBram Moolenaarenddef
2117e8c4abbbSBram Moolenaar
2118e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2119675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2120675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2121675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2122822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21230ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2124675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2125675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2126675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2127e8c4abbbSBram Moolenaarenddef
2128e8c4abbbSBram Moolenaar
2129d0df1aacSBram Moolenaardef Test_while_loop()
2130d0df1aacSBram Moolenaar  let result = ''
2131d0df1aacSBram Moolenaar  let cnt = 0
2132d0df1aacSBram Moolenaar  while cnt < 555
2133d0df1aacSBram Moolenaar    if cnt == 3
2134d0df1aacSBram Moolenaar      break
2135d0df1aacSBram Moolenaar    endif
2136d0df1aacSBram Moolenaar    cnt += 1
2137d0df1aacSBram Moolenaar    if cnt == 2
2138d0df1aacSBram Moolenaar      continue
2139d0df1aacSBram Moolenaar    endif
2140d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2141d0df1aacSBram Moolenaar  endwhile
2142d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2143d0df1aacSBram Moolenaarenddef
2144d0df1aacSBram Moolenaar
2145e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2146675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2147675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2148675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2149675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2150675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2151675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2152675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2153bd5da371SBram Moolenaarenddef
2154bd5da371SBram Moolenaar
21559645e2d9SBram Moolenaardef Test_interrupt_loop()
215697acfc78SBram Moolenaar  let caught = false
21579645e2d9SBram Moolenaar  let x = 0
215897acfc78SBram Moolenaar  try
21599645e2d9SBram Moolenaar    while 1
21609645e2d9SBram Moolenaar      x += 1
21619645e2d9SBram Moolenaar      if x == 100
21629645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
21639645e2d9SBram Moolenaar      endif
21649645e2d9SBram Moolenaar    endwhile
216597acfc78SBram Moolenaar  catch
216697acfc78SBram Moolenaar    caught = true
216797acfc78SBram Moolenaar    assert_equal(100, x)
216897acfc78SBram Moolenaar  endtry
216997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
21709645e2d9SBram Moolenaarenddef
217120431c9dSBram Moolenaar
21724fdae999SBram Moolenaardef Test_automatic_line_continuation()
21734fdae999SBram Moolenaar  let mylist = [
21744fdae999SBram Moolenaar      'one',
21754fdae999SBram Moolenaar      'two',
21764fdae999SBram Moolenaar      'three',
2177f5be8cdbSBram Moolenaar      ] # comment
21784fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
21794fdae999SBram Moolenaar
21804fdae999SBram Moolenaar  let mydict = {
21814fdae999SBram Moolenaar      'one': 1,
21824fdae999SBram Moolenaar      'two': 2,
21834fdae999SBram Moolenaar      'three':
21844fdae999SBram Moolenaar          3,
2185f5be8cdbSBram Moolenaar      } # comment
21864fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
21874fdae999SBram Moolenaar  mydict = #{
21882c330432SBram Moolenaar      one: 1,  # comment
21892c330432SBram Moolenaar      two:     # comment
21902c330432SBram Moolenaar           2,  # comment
21912c330432SBram Moolenaar      three: 3 # comment
21922c330432SBram Moolenaar      }
21932c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
21942c330432SBram Moolenaar  mydict = #{
21952c330432SBram Moolenaar      one: 1,
21964fdae999SBram Moolenaar      two:
21974fdae999SBram Moolenaar           2,
21982c330432SBram Moolenaar      three: 3
21994fdae999SBram Moolenaar      }
22004fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2201e6085c53SBram Moolenaar
2202e6085c53SBram Moolenaar  assert_equal(
2203e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2204e6085c53SBram Moolenaar        split('one two three')
2205e6085c53SBram Moolenaar        )
22064fdae999SBram Moolenaarenddef
22074fdae999SBram Moolenaar
22087a092245SBram Moolenaardef Test_vim9_comment()
22097a092245SBram Moolenaar  CheckScriptSuccess([
22107a092245SBram Moolenaar      'vim9script',
22117a092245SBram Moolenaar      '# something',
22127a092245SBram Moolenaar      ])
22137a092245SBram Moolenaar  CheckScriptFailure([
22147a092245SBram Moolenaar      'vim9script',
22157a092245SBram Moolenaar      ':# something',
22167a092245SBram Moolenaar      ], 'E488:')
22177a092245SBram Moolenaar  CheckScriptFailure([
22187a092245SBram Moolenaar      '# something',
22197a092245SBram Moolenaar      ], 'E488:')
22207a092245SBram Moolenaar  CheckScriptFailure([
22217a092245SBram Moolenaar      ':# something',
22227a092245SBram Moolenaar      ], 'E488:')
22237a092245SBram Moolenaar
22244a8d9f2eSBram Moolenaar  { # block start
22254a8d9f2eSBram Moolenaar  } # block end
22264a8d9f2eSBram Moolenaar  CheckDefFailure([
22274a8d9f2eSBram Moolenaar      '{# comment',
22284a8d9f2eSBram Moolenaar      ], 'E488:')
22294a8d9f2eSBram Moolenaar  CheckDefFailure([
22304a8d9f2eSBram Moolenaar      '{',
22314a8d9f2eSBram Moolenaar      '}# comment',
22324a8d9f2eSBram Moolenaar      ], 'E488:')
22334a8d9f2eSBram Moolenaar
22344a8d9f2eSBram Moolenaar  echo "yes" # comment
22354a8d9f2eSBram Moolenaar  CheckDefFailure([
22364a8d9f2eSBram Moolenaar      'echo "yes"# comment',
22374a8d9f2eSBram Moolenaar      ], 'E488:')
22387a092245SBram Moolenaar  CheckScriptSuccess([
22397a092245SBram Moolenaar      'vim9script',
22407a092245SBram Moolenaar      'echo "yes" # something',
22417a092245SBram Moolenaar      ])
22427a092245SBram Moolenaar  CheckScriptFailure([
22437a092245SBram Moolenaar      'vim9script',
22447a092245SBram Moolenaar      'echo "yes"# something',
22457a092245SBram Moolenaar      ], 'E121:')
22467a092245SBram Moolenaar  CheckScriptFailure([
22477a092245SBram Moolenaar      'vim9script',
22487a092245SBram Moolenaar      'echo# something',
22497a092245SBram Moolenaar      ], 'E121:')
22507a092245SBram Moolenaar  CheckScriptFailure([
22517a092245SBram Moolenaar      'echo "yes" # something',
22527a092245SBram Moolenaar      ], 'E121:')
22537a092245SBram Moolenaar
22544a8d9f2eSBram Moolenaar  exe "echo" # comment
22554a8d9f2eSBram Moolenaar  CheckDefFailure([
22564a8d9f2eSBram Moolenaar      'exe "echo"# comment',
22574a8d9f2eSBram Moolenaar      ], 'E488:')
22584a8d9f2eSBram Moolenaar  CheckScriptSuccess([
22594a8d9f2eSBram Moolenaar      'vim9script',
22604a8d9f2eSBram Moolenaar      'exe "echo" # something',
22614a8d9f2eSBram Moolenaar      ])
22624a8d9f2eSBram Moolenaar  CheckScriptFailure([
22634a8d9f2eSBram Moolenaar      'vim9script',
22644a8d9f2eSBram Moolenaar      'exe "echo"# something',
22654a8d9f2eSBram Moolenaar      ], 'E121:')
22664a8d9f2eSBram Moolenaar  CheckDefFailure([
22674a8d9f2eSBram Moolenaar      'exe # comment',
22684a8d9f2eSBram Moolenaar      ], 'E1015:')
22694a8d9f2eSBram Moolenaar  CheckScriptFailure([
22704a8d9f2eSBram Moolenaar      'vim9script',
22714a8d9f2eSBram Moolenaar      'exe# something',
22724a8d9f2eSBram Moolenaar      ], 'E121:')
22734a8d9f2eSBram Moolenaar  CheckScriptFailure([
22744a8d9f2eSBram Moolenaar      'exe "echo" # something',
22754a8d9f2eSBram Moolenaar      ], 'E121:')
22764a8d9f2eSBram Moolenaar
22777a092245SBram Moolenaar  CheckDefFailure([
22787a092245SBram Moolenaar      'try# comment',
22797a092245SBram Moolenaar      '  echo "yes"',
22807a092245SBram Moolenaar      'catch',
22817a092245SBram Moolenaar      'endtry',
22827a092245SBram Moolenaar      ], 'E488:')
22832c5ed4e3SBram Moolenaar  CheckScriptFailure([
22842c5ed4e3SBram Moolenaar      'vim9script',
22852c5ed4e3SBram Moolenaar      'try# comment',
22862c5ed4e3SBram Moolenaar      'echo "yes"',
22872c5ed4e3SBram Moolenaar      ], 'E488:')
22887a092245SBram Moolenaar  CheckDefFailure([
22897a092245SBram Moolenaar      'try',
2290a72cfb80SBram Moolenaar      '  throw#comment',
2291a72cfb80SBram Moolenaar      'catch',
2292a72cfb80SBram Moolenaar      'endtry',
2293a72cfb80SBram Moolenaar      ], 'E1015:')
2294a72cfb80SBram Moolenaar  CheckDefFailure([
2295a72cfb80SBram Moolenaar      'try',
2296a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2297a72cfb80SBram Moolenaar      'catch',
2298a72cfb80SBram Moolenaar      'endtry',
2299a72cfb80SBram Moolenaar      ], 'E488:')
2300a72cfb80SBram Moolenaar  CheckDefFailure([
2301a72cfb80SBram Moolenaar      'try',
23027a092245SBram Moolenaar      '  echo "yes"',
23037a092245SBram Moolenaar      'catch# comment',
23047a092245SBram Moolenaar      'endtry',
23057a092245SBram Moolenaar      ], 'E488:')
23062c5ed4e3SBram Moolenaar  CheckScriptFailure([
23072c5ed4e3SBram Moolenaar      'vim9script',
23082c5ed4e3SBram Moolenaar      'try',
23092c5ed4e3SBram Moolenaar      '  echo "yes"',
23102c5ed4e3SBram Moolenaar      'catch# comment',
23112c5ed4e3SBram Moolenaar      'endtry',
23122c5ed4e3SBram Moolenaar      ], 'E654:')
23132c5ed4e3SBram Moolenaar  CheckDefFailure([
23142c5ed4e3SBram Moolenaar      'try',
23152c5ed4e3SBram Moolenaar      '  echo "yes"',
23162c5ed4e3SBram Moolenaar      'catch /pat/# comment',
23172c5ed4e3SBram Moolenaar      'endtry',
23182c5ed4e3SBram Moolenaar      ], 'E488:')
23197a092245SBram Moolenaar  CheckDefFailure([
23207a092245SBram Moolenaar      'try',
23217a092245SBram Moolenaar      'echo "yes"',
23227a092245SBram Moolenaar      'catch',
23237a092245SBram Moolenaar      'endtry# comment',
23247a092245SBram Moolenaar      ], 'E488:')
23252c5ed4e3SBram Moolenaar  CheckScriptFailure([
23262c5ed4e3SBram Moolenaar      'vim9script',
23272c5ed4e3SBram Moolenaar      'try',
23282c5ed4e3SBram Moolenaar      '  echo "yes"',
23292c5ed4e3SBram Moolenaar      'catch',
23302c5ed4e3SBram Moolenaar      'endtry# comment',
23319b7bf9e9SBram Moolenaar      ], 'E488:')
23322c5ed4e3SBram Moolenaar
23332c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23342c5ed4e3SBram Moolenaar      'vim9script',
23352c5ed4e3SBram Moolenaar      'hi # comment',
23362c5ed4e3SBram Moolenaar      ])
23372c5ed4e3SBram Moolenaar  CheckScriptFailure([
23382c5ed4e3SBram Moolenaar      'vim9script',
23392c5ed4e3SBram Moolenaar      'hi# comment',
23402c5ed4e3SBram Moolenaar      ], 'E416:')
23411966c248SBram Moolenaar  CheckScriptSuccess([
23421966c248SBram Moolenaar      'vim9script',
23431966c248SBram Moolenaar      'hi Search # comment',
23441966c248SBram Moolenaar      ])
23451966c248SBram Moolenaar  CheckScriptFailure([
23461966c248SBram Moolenaar      'vim9script',
23471966c248SBram Moolenaar      'hi Search# comment',
23481966c248SBram Moolenaar      ], 'E416:')
23491966c248SBram Moolenaar  CheckScriptSuccess([
23501966c248SBram Moolenaar      'vim9script',
23511966c248SBram Moolenaar      'hi link This Search # comment',
23521966c248SBram Moolenaar      ])
23531966c248SBram Moolenaar  CheckScriptFailure([
23541966c248SBram Moolenaar      'vim9script',
23551966c248SBram Moolenaar      'hi link This That# comment',
23561966c248SBram Moolenaar      ], 'E413:')
23571966c248SBram Moolenaar  CheckScriptSuccess([
23581966c248SBram Moolenaar      'vim9script',
23591966c248SBram Moolenaar      'hi clear This # comment',
23601966c248SBram Moolenaar      'hi clear # comment',
23611966c248SBram Moolenaar      ])
2362f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2363f5be8cdbSBram Moolenaar  # hi clear This# comment',
23641966c248SBram Moolenaar  CheckScriptFailure([
23651966c248SBram Moolenaar      'vim9script',
23661966c248SBram Moolenaar      'hi clear# comment',
23671966c248SBram Moolenaar      ], 'E416:')
23681966c248SBram Moolenaar
23691966c248SBram Moolenaar  CheckScriptSuccess([
23701966c248SBram Moolenaar      'vim9script',
23711966c248SBram Moolenaar      'hi Group term=bold',
23721966c248SBram Moolenaar      'match Group /todo/ # comment',
23731966c248SBram Moolenaar      ])
23741966c248SBram Moolenaar  CheckScriptFailure([
23751966c248SBram Moolenaar      'vim9script',
23761966c248SBram Moolenaar      'hi Group term=bold',
23771966c248SBram Moolenaar      'match Group /todo/# comment',
23781966c248SBram Moolenaar      ], 'E488:')
23791966c248SBram Moolenaar  CheckScriptSuccess([
23801966c248SBram Moolenaar      'vim9script',
23811966c248SBram Moolenaar      'match # comment',
23821966c248SBram Moolenaar      ])
23831966c248SBram Moolenaar  CheckScriptFailure([
23841966c248SBram Moolenaar      'vim9script',
23851966c248SBram Moolenaar      'match# comment',
23861966c248SBram Moolenaar      ], 'E475:')
23871966c248SBram Moolenaar  CheckScriptSuccess([
23881966c248SBram Moolenaar      'vim9script',
23891966c248SBram Moolenaar      'match none # comment',
23901966c248SBram Moolenaar      ])
23911966c248SBram Moolenaar  CheckScriptFailure([
23921966c248SBram Moolenaar      'vim9script',
23931966c248SBram Moolenaar      'match none# comment',
23941966c248SBram Moolenaar      ], 'E475:')
23951966c248SBram Moolenaar
23961966c248SBram Moolenaar  CheckScriptSuccess([
23971966c248SBram Moolenaar      'vim9script',
23981966c248SBram Moolenaar      'menutrans clear # comment',
23991966c248SBram Moolenaar      ])
24001966c248SBram Moolenaar  CheckScriptFailure([
24011966c248SBram Moolenaar      'vim9script',
24021966c248SBram Moolenaar      'menutrans clear# comment text',
24031966c248SBram Moolenaar      ], 'E474:')
24041966c248SBram Moolenaar
24051966c248SBram Moolenaar  CheckScriptSuccess([
24061966c248SBram Moolenaar      'vim9script',
24071966c248SBram Moolenaar      'syntax clear # comment',
24081966c248SBram Moolenaar      ])
24091966c248SBram Moolenaar  CheckScriptFailure([
24101966c248SBram Moolenaar      'vim9script',
24111966c248SBram Moolenaar      'syntax clear# comment text',
24121966c248SBram Moolenaar      ], 'E28:')
24131966c248SBram Moolenaar  CheckScriptSuccess([
24141966c248SBram Moolenaar      'vim9script',
24151966c248SBram Moolenaar      'syntax keyword Word some',
24161966c248SBram Moolenaar      'syntax clear Word # comment',
24171966c248SBram Moolenaar      ])
24181966c248SBram Moolenaar  CheckScriptFailure([
24191966c248SBram Moolenaar      'vim9script',
24201966c248SBram Moolenaar      'syntax keyword Word some',
24211966c248SBram Moolenaar      'syntax clear Word# comment text',
24221966c248SBram Moolenaar      ], 'E28:')
24231966c248SBram Moolenaar
24241966c248SBram Moolenaar  CheckScriptSuccess([
24251966c248SBram Moolenaar      'vim9script',
24261966c248SBram Moolenaar      'syntax list # comment',
24271966c248SBram Moolenaar      ])
24281966c248SBram Moolenaar  CheckScriptFailure([
24291966c248SBram Moolenaar      'vim9script',
24301966c248SBram Moolenaar      'syntax list# comment text',
24311966c248SBram Moolenaar      ], 'E28:')
24321966c248SBram Moolenaar
24331966c248SBram Moolenaar  CheckScriptSuccess([
24341966c248SBram Moolenaar      'vim9script',
24351966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24361966c248SBram Moolenaar      ])
24371966c248SBram Moolenaar  CheckScriptFailure([
24381966c248SBram Moolenaar      'vim9script',
24391966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
24401966c248SBram Moolenaar      ], 'E475:')
24411966c248SBram Moolenaar
24421966c248SBram Moolenaar  CheckScriptSuccess([
24431966c248SBram Moolenaar      'vim9script',
24441966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
24451966c248SBram Moolenaar      ])
24461966c248SBram Moolenaar  CheckScriptFailure([
24471966c248SBram Moolenaar      'vim9script',
24481966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
24491966c248SBram Moolenaar      ], 'E789:')
24501966c248SBram Moolenaar
24511966c248SBram Moolenaar  CheckScriptSuccess([
24521966c248SBram Moolenaar      'vim9script',
24531966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
24541966c248SBram Moolenaar      ])
24551966c248SBram Moolenaar  CheckScriptFailure([
24561966c248SBram Moolenaar      'vim9script',
24571966c248SBram Moolenaar      'syntax match Word /pat/# comment',
24581966c248SBram Moolenaar      ], 'E402:')
24591966c248SBram Moolenaar
24601966c248SBram Moolenaar  CheckScriptSuccess([
24611966c248SBram Moolenaar      'vim9script',
24621966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
24631966c248SBram Moolenaar      ])
24641966c248SBram Moolenaar  CheckScriptFailure([
24651966c248SBram Moolenaar      'vim9script',
24661966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
24671966c248SBram Moolenaar      ], 'E475:')
24681966c248SBram Moolenaar  CheckScriptFailure([
24691966c248SBram Moolenaar      'vim9script',
24701966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
24711966c248SBram Moolenaar      ], 'E406:')
24721966c248SBram Moolenaar  CheckScriptFailure([
24731966c248SBram Moolenaar      'vim9script',
24741966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
24751966c248SBram Moolenaar      ], 'E475:')
24761966c248SBram Moolenaar
24771966c248SBram Moolenaar  CheckScriptSuccess([
24781966c248SBram Moolenaar      'vim9script',
24791966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
24801966c248SBram Moolenaar      ])
24811966c248SBram Moolenaar  CheckScriptFailure([
24821966c248SBram Moolenaar      'vim9script',
24831966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2484d032f34aSBram Moolenaar      ], 'E402:')
24851966c248SBram Moolenaar
24861966c248SBram Moolenaar  CheckScriptSuccess([
24871966c248SBram Moolenaar      'vim9script',
24881966c248SBram Moolenaar      'syntax sync # comment',
24891966c248SBram Moolenaar      ])
24901966c248SBram Moolenaar  CheckScriptFailure([
24911966c248SBram Moolenaar      'vim9script',
24921966c248SBram Moolenaar      'syntax sync# comment',
24931966c248SBram Moolenaar      ], 'E404:')
24941966c248SBram Moolenaar  CheckScriptSuccess([
24951966c248SBram Moolenaar      'vim9script',
24961966c248SBram Moolenaar      'syntax sync ccomment # comment',
24971966c248SBram Moolenaar      ])
24981966c248SBram Moolenaar  CheckScriptFailure([
24991966c248SBram Moolenaar      'vim9script',
25001966c248SBram Moolenaar      'syntax sync ccomment# comment',
25011966c248SBram Moolenaar      ], 'E404:')
25021966c248SBram Moolenaar
25031966c248SBram Moolenaar  CheckScriptSuccess([
25041966c248SBram Moolenaar      'vim9script',
25051966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
25061966c248SBram Moolenaar      ])
25071966c248SBram Moolenaar  CheckScriptFailure([
25081966c248SBram Moolenaar      'vim9script',
25091966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25101966c248SBram Moolenaar      ], 'E475:')
2511a72cfb80SBram Moolenaar
2512a72cfb80SBram Moolenaar  CheckScriptSuccess([
2513a72cfb80SBram Moolenaar      'vim9script',
2514a72cfb80SBram Moolenaar      'command Echo echo # comment',
2515a72cfb80SBram Moolenaar      'command Echo # comment',
2516a72cfb80SBram Moolenaar      ])
2517a72cfb80SBram Moolenaar  CheckScriptFailure([
2518a72cfb80SBram Moolenaar      'vim9script',
2519a72cfb80SBram Moolenaar      'command Echo echo# comment',
2520a72cfb80SBram Moolenaar      'Echo',
2521a72cfb80SBram Moolenaar      ], 'E121:')
2522a72cfb80SBram Moolenaar  CheckScriptFailure([
2523a72cfb80SBram Moolenaar      'vim9script',
2524a72cfb80SBram Moolenaar      'command Echo# comment',
2525a72cfb80SBram Moolenaar      ], 'E182:')
2526a72cfb80SBram Moolenaar  CheckScriptFailure([
2527a72cfb80SBram Moolenaar      'vim9script',
2528a72cfb80SBram Moolenaar      'command Echo echo',
2529a72cfb80SBram Moolenaar      'command Echo# comment',
2530a72cfb80SBram Moolenaar      ], 'E182:')
2531a72cfb80SBram Moolenaar
2532a72cfb80SBram Moolenaar  CheckScriptSuccess([
2533a72cfb80SBram Moolenaar      'vim9script',
2534a72cfb80SBram Moolenaar      'function # comment',
2535a72cfb80SBram Moolenaar      ])
2536a72cfb80SBram Moolenaar  CheckScriptFailure([
2537a72cfb80SBram Moolenaar      'vim9script',
25389898107fSBram Moolenaar      'function " comment',
25399898107fSBram Moolenaar      ], 'E129:')
25409898107fSBram Moolenaar  CheckScriptFailure([
25419898107fSBram Moolenaar      'vim9script',
2542a72cfb80SBram Moolenaar      'function# comment',
2543a72cfb80SBram Moolenaar      ], 'E129:')
2544a72cfb80SBram Moolenaar  CheckScriptSuccess([
2545a72cfb80SBram Moolenaar      'vim9script',
2546a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2547a72cfb80SBram Moolenaar      ])
2548a72cfb80SBram Moolenaar  CheckScriptFailure([
2549a72cfb80SBram Moolenaar      'vim9script',
2550a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2551a72cfb80SBram Moolenaar      ], 'E488:')
2552a72cfb80SBram Moolenaar
2553a72cfb80SBram Moolenaar  CheckScriptSuccess([
2554a72cfb80SBram Moolenaar      'vim9script',
25554c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2556a72cfb80SBram Moolenaar      'endfunc',
25574c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2558a72cfb80SBram Moolenaar      ])
2559a72cfb80SBram Moolenaar  CheckScriptFailure([
2560a72cfb80SBram Moolenaar      'vim9script',
25614c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2562a72cfb80SBram Moolenaar      'endfunc',
25634c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2564a72cfb80SBram Moolenaar      ], 'E488:')
2565a72cfb80SBram Moolenaar
2566a72cfb80SBram Moolenaar  CheckScriptSuccess([
2567a72cfb80SBram Moolenaar      'vim9script',
2568a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2569a72cfb80SBram Moolenaar      ])
2570a72cfb80SBram Moolenaar  CheckScriptFailure([
2571a72cfb80SBram Moolenaar      'vim9script',
2572a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2573a72cfb80SBram Moolenaar      ], 'E488:')
2574e7e4838fSBram Moolenaar
2575e7e4838fSBram Moolenaar  CheckScriptFailure([
2576e7e4838fSBram Moolenaar      'def Test() " comment',
2577e7e4838fSBram Moolenaar      'enddef',
2578e7e4838fSBram Moolenaar      ], 'E488:')
2579e7e4838fSBram Moolenaar  CheckScriptFailure([
2580e7e4838fSBram Moolenaar      'vim9script',
2581e7e4838fSBram Moolenaar      'def Test() " comment',
2582e7e4838fSBram Moolenaar      'enddef',
2583e7e4838fSBram Moolenaar      ], 'E488:')
2584e7e4838fSBram Moolenaar
2585e7e4838fSBram Moolenaar  CheckScriptSuccess([
2586e7e4838fSBram Moolenaar      'func Test() " comment',
2587e7e4838fSBram Moolenaar      'endfunc',
2588e7e4838fSBram Moolenaar      ])
25899898107fSBram Moolenaar  CheckScriptSuccess([
2590e7e4838fSBram Moolenaar      'vim9script',
2591e7e4838fSBram Moolenaar      'func Test() " comment',
2592e7e4838fSBram Moolenaar      'endfunc',
25939898107fSBram Moolenaar      ])
2594e7e4838fSBram Moolenaar
2595e7e4838fSBram Moolenaar  CheckScriptSuccess([
2596e7e4838fSBram Moolenaar      'def Test() # comment',
2597e7e4838fSBram Moolenaar      'enddef',
2598e7e4838fSBram Moolenaar      ])
2599e7e4838fSBram Moolenaar  CheckScriptFailure([
2600e7e4838fSBram Moolenaar      'func Test() # comment',
2601e7e4838fSBram Moolenaar      'endfunc',
2602e7e4838fSBram Moolenaar      ], 'E488:')
26032c5ed4e3SBram Moolenaarenddef
26042c5ed4e3SBram Moolenaar
26052c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
26062c5ed4e3SBram Moolenaar  CheckCanRunGui
26072c5ed4e3SBram Moolenaar
26082c5ed4e3SBram Moolenaar  CheckScriptFailure([
26092c5ed4e3SBram Moolenaar      'vim9script',
26102c5ed4e3SBram Moolenaar      'gui#comment'
26112c5ed4e3SBram Moolenaar      ], 'E499:')
26122c5ed4e3SBram Moolenaar  CheckScriptFailure([
26132c5ed4e3SBram Moolenaar      'vim9script',
26142c5ed4e3SBram Moolenaar      'gui -f#comment'
26152c5ed4e3SBram Moolenaar      ], 'E499:')
26167a092245SBram Moolenaarenddef
26177a092245SBram Moolenaar
2618a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
26196797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
26206797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2621a26b9700SBram Moolenaar
2622a26b9700SBram Moolenaar  edit test.vim
2623a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2624a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2625a26b9700SBram Moolenaar
2626a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2627a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2628a26b9700SBram Moolenaar
2629a26b9700SBram Moolenaar  g:entered = 0
2630a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2631a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2632a26b9700SBram Moolenaar
2633a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2634a26b9700SBram Moolenaar
2635a26b9700SBram Moolenaar  au! TabEnter
2636a26b9700SBram Moolenaar  unlet g:entered
2637d72c1bf0SBram Moolenaar
2638d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2639d72c1bf0SBram Moolenaar      'vim9script',
26406797966dSBram Moolenaar      'g:var = 123',
2641e55b1c09SBram Moolenaar      'b:var = 456',
2642e55b1c09SBram Moolenaar      'w:var = 777',
2643e55b1c09SBram Moolenaar      't:var = 888',
2644d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2645d72c1bf0SBram Moolenaar      ])
2646d72c1bf0SBram Moolenaar
2647d72c1bf0SBram Moolenaar  CheckScriptFailure([
2648d72c1bf0SBram Moolenaar      'vim9script',
2649d72c1bf0SBram Moolenaar      'let g:var = 123',
2650e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2651e55b1c09SBram Moolenaar
2652e55b1c09SBram Moolenaar  CheckScriptFailure([
2653e55b1c09SBram Moolenaar      'vim9script',
2654e55b1c09SBram Moolenaar      'let b:var = 123',
2655e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2656e55b1c09SBram Moolenaar
2657e55b1c09SBram Moolenaar  CheckScriptFailure([
2658e55b1c09SBram Moolenaar      'vim9script',
2659e55b1c09SBram Moolenaar      'let w:var = 123',
2660e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2661e55b1c09SBram Moolenaar
2662e55b1c09SBram Moolenaar  CheckScriptFailure([
2663e55b1c09SBram Moolenaar      'vim9script',
2664e55b1c09SBram Moolenaar      'let t:var = 123',
2665e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2666e55b1c09SBram Moolenaar
2667e55b1c09SBram Moolenaar  CheckScriptFailure([
2668e55b1c09SBram Moolenaar      'vim9script',
2669e55b1c09SBram Moolenaar      'let v:version = 123',
2670e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2671e55b1c09SBram Moolenaar
2672e55b1c09SBram Moolenaar  CheckScriptFailure([
2673e55b1c09SBram Moolenaar      'vim9script',
2674e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2675e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
26766797966dSBram Moolenaar
26776797966dSBram Moolenaar  CheckScriptFailure([
26786797966dSBram Moolenaar      'vim9script',
26796797966dSBram Moolenaar      'g:var = 123',
268032e35117SBram Moolenaar      'unlet g:var# comment1',
2681d72c1bf0SBram Moolenaar      ], 'E108:')
2682d72c1bf0SBram Moolenaar
2683d72c1bf0SBram Moolenaar  CheckScriptFailure([
2684d72c1bf0SBram Moolenaar      'let g:var = 123',
2685d72c1bf0SBram Moolenaar      'unlet g:var # something',
2686d72c1bf0SBram Moolenaar      ], 'E488:')
2687faac4104SBram Moolenaar
2688faac4104SBram Moolenaar  CheckScriptSuccess([
2689faac4104SBram Moolenaar      'vim9script',
269032e35117SBram Moolenaar      'if 1 # comment2',
2691faac4104SBram Moolenaar      '  echo "yes"',
2692faac4104SBram Moolenaar      'elseif 2 #comment',
2693faac4104SBram Moolenaar      '  echo "no"',
2694faac4104SBram Moolenaar      'endif',
2695faac4104SBram Moolenaar      ])
2696faac4104SBram Moolenaar
2697faac4104SBram Moolenaar  CheckScriptFailure([
2698faac4104SBram Moolenaar      'vim9script',
269932e35117SBram Moolenaar      'if 1# comment3',
2700faac4104SBram Moolenaar      '  echo "yes"',
2701faac4104SBram Moolenaar      'endif',
2702faac4104SBram Moolenaar      ], 'E15:')
2703faac4104SBram Moolenaar
2704faac4104SBram Moolenaar  CheckScriptFailure([
2705faac4104SBram Moolenaar      'vim9script',
270632e35117SBram Moolenaar      'if 0 # comment4',
2707faac4104SBram Moolenaar      '  echo "yes"',
2708faac4104SBram Moolenaar      'elseif 2#comment',
2709faac4104SBram Moolenaar      '  echo "no"',
2710faac4104SBram Moolenaar      'endif',
2711faac4104SBram Moolenaar      ], 'E15:')
2712faac4104SBram Moolenaar
2713faac4104SBram Moolenaar  CheckScriptSuccess([
2714faac4104SBram Moolenaar      'vim9script',
271532e35117SBram Moolenaar      'let v = 1 # comment5',
2716faac4104SBram Moolenaar      ])
2717faac4104SBram Moolenaar
2718faac4104SBram Moolenaar  CheckScriptFailure([
2719faac4104SBram Moolenaar      'vim9script',
272032e35117SBram Moolenaar      'let v = 1# comment6',
272132e35117SBram Moolenaar      ], 'E15:')
2722faac4104SBram Moolenaar
2723faac4104SBram Moolenaar  CheckScriptSuccess([
2724faac4104SBram Moolenaar      'vim9script',
2725faac4104SBram Moolenaar      'new'
2726faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2727df069eecSBram Moolenaar      ':$',
2728faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2729faac4104SBram Moolenaar      'bwipe!',
2730faac4104SBram Moolenaar      ])
2731faac4104SBram Moolenaar
2732f5be8cdbSBram Moolenaar  CheckScriptFailure([
2733f5be8cdbSBram Moolenaar      'vim9script',
2734f5be8cdbSBram Moolenaar      'new'
2735f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2736f5be8cdbSBram Moolenaar      ':$',
2737f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2738f5be8cdbSBram Moolenaar      'bwipe!',
2739f5be8cdbSBram Moolenaar      ], 'E488:')
2740f5be8cdbSBram Moolenaar
2741f5be8cdbSBram Moolenaar  CheckScriptFailure([
2742f5be8cdbSBram Moolenaar      'vim9script',
2743f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2744f5be8cdbSBram Moolenaar      ], 'E477:')
2745a26b9700SBram Moolenaarenddef
2746a26b9700SBram Moolenaar
27477e5bd91dSBram Moolenaardef Test_finish()
27487e5bd91dSBram Moolenaar  let lines =<< trim END
27497e5bd91dSBram Moolenaar    vim9script
27506797966dSBram Moolenaar    g:res = 'one'
27517e5bd91dSBram Moolenaar    if v:false | finish | endif
27526797966dSBram Moolenaar    g:res = 'two'
27537e5bd91dSBram Moolenaar    finish
27546797966dSBram Moolenaar    g:res = 'three'
27557e5bd91dSBram Moolenaar  END
27567e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
27577e5bd91dSBram Moolenaar  source Xfinished
27587e5bd91dSBram Moolenaar  assert_equal('two', g:res)
27597e5bd91dSBram Moolenaar
27607e5bd91dSBram Moolenaar  unlet g:res
27617e5bd91dSBram Moolenaar  delete('Xfinished')
27627e5bd91dSBram Moolenaarenddef
27637e5bd91dSBram Moolenaar
276432e35117SBram Moolenaardef Test_let_func_call()
276532e35117SBram Moolenaar  let lines =<< trim END
276632e35117SBram Moolenaar    vim9script
276732e35117SBram Moolenaar    func GetValue()
276832e35117SBram Moolenaar      if exists('g:count')
276932e35117SBram Moolenaar        let g:count += 1
277032e35117SBram Moolenaar      else
277132e35117SBram Moolenaar        let g:count = 1
277232e35117SBram Moolenaar      endif
277332e35117SBram Moolenaar      return 'this'
277432e35117SBram Moolenaar    endfunc
277532e35117SBram Moolenaar    let val: string = GetValue()
2776f5be8cdbSBram Moolenaar    # env var is always a string
2777df671b46SBram Moolenaar    let env = $TERM
277832e35117SBram Moolenaar  END
277932e35117SBram Moolenaar  writefile(lines, 'Xfinished')
278032e35117SBram Moolenaar  source Xfinished
2781f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
278232e35117SBram Moolenaar  assert_equal(1, g:count)
278332e35117SBram Moolenaar
278432e35117SBram Moolenaar  unlet g:count
278532e35117SBram Moolenaar  delete('Xfinished')
278632e35117SBram Moolenaarenddef
278732e35117SBram Moolenaar
278832e35117SBram Moolenaardef Test_let_missing_type()
278932e35117SBram Moolenaar  let lines =<< trim END
279032e35117SBram Moolenaar    vim9script
2791df671b46SBram Moolenaar    let var = g:unknown
2792227a69deSBram Moolenaar  END
2793822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2794227a69deSBram Moolenaar
2795227a69deSBram Moolenaar  lines =<< trim END
2796227a69deSBram Moolenaar    vim9script
2797227a69deSBram Moolenaar    let nr: number = 123
2798227a69deSBram Moolenaar    let var = nr
2799227a69deSBram Moolenaar  END
2800822ba247SBram Moolenaar  CheckScriptSuccess(lines)
280132e35117SBram Moolenaarenddef
280232e35117SBram Moolenaar
2803c82a5b5dSBram Moolenaardef Test_let_declaration()
2804c82a5b5dSBram Moolenaar  let lines =<< trim END
2805c82a5b5dSBram Moolenaar    vim9script
2806c82a5b5dSBram Moolenaar    let var: string
2807c82a5b5dSBram Moolenaar    g:var_uninit = var
2808c82a5b5dSBram Moolenaar    var = 'text'
2809c82a5b5dSBram Moolenaar    g:var_test = var
2810f5be8cdbSBram Moolenaar    # prefixing s: is optional
2811984dddbeSBram Moolenaar    s:var = 'prefixed'
2812984dddbeSBram Moolenaar    g:var_prefixed = s:var
2813984dddbeSBram Moolenaar
2814984dddbeSBram Moolenaar    let s:other: number
2815984dddbeSBram Moolenaar    other = 1234
2816984dddbeSBram Moolenaar    g:other_var = other
2817c82a5b5dSBram Moolenaar  END
2818c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2819c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2820c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2821984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2822984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2823c82a5b5dSBram Moolenaar
2824c82a5b5dSBram Moolenaar  unlet g:var_uninit
2825c82a5b5dSBram Moolenaar  unlet g:var_test
2826984dddbeSBram Moolenaar  unlet g:var_prefixed
2827984dddbeSBram Moolenaar  unlet g:other_var
2828c82a5b5dSBram Moolenaarenddef
2829c82a5b5dSBram Moolenaar
2830c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2831c5b1c20bSBram Moolenaar  let lines =<< trim END
2832c5b1c20bSBram Moolenaar    vim9script
2833c5b1c20bSBram Moolenaar    const var: string
2834c5b1c20bSBram Moolenaar  END
2835c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2836c5b1c20bSBram Moolenaar
2837c5b1c20bSBram Moolenaar  lines =<< trim END
2838c5b1c20bSBram Moolenaar    vim9script
2839c5b1c20bSBram Moolenaar    let 9var: string
2840c5b1c20bSBram Moolenaar  END
2841c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2842c5b1c20bSBram Moolenaarenddef
2843c5b1c20bSBram Moolenaar
284434db91f7SBram Moolenaardef Test_let_type_check()
284534db91f7SBram Moolenaar  let lines =<< trim END
284634db91f7SBram Moolenaar    vim9script
284734db91f7SBram Moolenaar    let var: string
284834db91f7SBram Moolenaar    var = 1234
284934db91f7SBram Moolenaar  END
285034db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2851984dddbeSBram Moolenaar
2852984dddbeSBram Moolenaar  lines =<< trim END
2853984dddbeSBram Moolenaar    vim9script
2854984dddbeSBram Moolenaar    let var:string
2855984dddbeSBram Moolenaar  END
2856984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2857c5b1c20bSBram Moolenaar
2858c5b1c20bSBram Moolenaar  lines =<< trim END
2859c5b1c20bSBram Moolenaar    vim9script
2860c5b1c20bSBram Moolenaar    let var: asdf
2861c5b1c20bSBram Moolenaar  END
2862c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2863a71e2633SBram Moolenaar
2864a71e2633SBram Moolenaar  lines =<< trim END
2865a71e2633SBram Moolenaar    vim9script
2866a71e2633SBram Moolenaar    let s:l: list<number>
2867a71e2633SBram Moolenaar    s:l = []
2868a71e2633SBram Moolenaar  END
2869a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2870a71e2633SBram Moolenaar
2871a71e2633SBram Moolenaar  lines =<< trim END
2872a71e2633SBram Moolenaar    vim9script
2873a71e2633SBram Moolenaar    let s:d: dict<number>
2874a71e2633SBram Moolenaar    s:d = {}
2875a71e2633SBram Moolenaar  END
2876a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
287734db91f7SBram Moolenaarenddef
287834db91f7SBram Moolenaar
2879a5d0077eSBram Moolenaardef Test_forward_declaration()
2880a5d0077eSBram Moolenaar  let lines =<< trim END
2881a5d0077eSBram Moolenaar    vim9script
2882a5d0077eSBram Moolenaar    def GetValue(): string
2883a5d0077eSBram Moolenaar      return theVal
2884a5d0077eSBram Moolenaar    enddef
2885a5d0077eSBram Moolenaar    let theVal = 'something'
2886822ba247SBram Moolenaar    g:initVal = GetValue()
2887a5d0077eSBram Moolenaar    theVal = 'else'
2888a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2889a5d0077eSBram Moolenaar  END
2890a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2891a5d0077eSBram Moolenaar  source Xforward
2892a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2893a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2894a5d0077eSBram Moolenaar
2895a5d0077eSBram Moolenaar  unlet g:initVal
2896a5d0077eSBram Moolenaar  unlet g:laterVal
2897a5d0077eSBram Moolenaar  delete('Xforward')
2898a5d0077eSBram Moolenaarenddef
2899a5d0077eSBram Moolenaar
29009721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
29019721fb4eSBram Moolenaar  let legacy_lines =<< trim END
29029721fb4eSBram Moolenaar    source Xvim9_script.vim
29039721fb4eSBram Moolenaar
29049721fb4eSBram Moolenaar    call assert_false(exists('local'))
29059721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29069721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29079721fb4eSBram Moolenaar    call assert_equal('global', global)
29089721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29099721fb4eSBram Moolenaar
29109721fb4eSBram Moolenaar    " imported variable becomes script-local
29119721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29129721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29139721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29149721fb4eSBram Moolenaar
29159721fb4eSBram Moolenaar    " imported function becomes script-local
29169721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29179721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29189721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29199721fb4eSBram Moolenaar  END
29209721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29219721fb4eSBram Moolenaar
29229721fb4eSBram Moolenaar  let vim9_lines =<< trim END
29239721fb4eSBram Moolenaar    vim9script
29249721fb4eSBram Moolenaar    let local = 'local'
29259721fb4eSBram Moolenaar    g:global = 'global'
29269721fb4eSBram Moolenaar    export let exported = 'exported'
29279721fb4eSBram Moolenaar    export def GetText(): string
29289721fb4eSBram Moolenaar       return 'text'
29299721fb4eSBram Moolenaar    enddef
29309721fb4eSBram Moolenaar  END
29319721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
29329721fb4eSBram Moolenaar
29339721fb4eSBram Moolenaar  source Xlegacy_script.vim
29349721fb4eSBram Moolenaar
29359721fb4eSBram Moolenaar  assert_equal('global', g:global)
2936f5be8cdbSBram Moolenaar  unlet g:global
29379721fb4eSBram Moolenaar
29389721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29399721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29409721fb4eSBram Moolenaarenddef
2941a5d0077eSBram Moolenaar
2942eeb27bfeSBram Moolenaardef Test_vim9_copen()
2943eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2944eeb27bfeSBram Moolenaar  copen
2945eeb27bfeSBram Moolenaar  quit
2946eeb27bfeSBram Moolenaarenddef
2947eeb27bfeSBram Moolenaar
29482d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
29492d6b20d6SBram Moolenaardef Test_vim9_autoload()
29502d6b20d6SBram Moolenaar  let lines =<< trim END
29512d6b20d6SBram Moolenaar     vim9script
29522d6b20d6SBram Moolenaar     def foo#test()
29532d6b20d6SBram Moolenaar         echomsg getreg('"')
29542d6b20d6SBram Moolenaar     enddef
29552d6b20d6SBram Moolenaar  END
29562d6b20d6SBram Moolenaar
29572d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
29582d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
29592d6b20d6SBram Moolenaar  let save_rtp = &rtp
29602d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
29612d6b20d6SBram Moolenaar  augroup test
29622d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
29632d6b20d6SBram Moolenaar  augroup END
29642d6b20d6SBram Moolenaar
29652d6b20d6SBram Moolenaar  normal Y
29662d6b20d6SBram Moolenaar
29672d6b20d6SBram Moolenaar  augroup test
29682d6b20d6SBram Moolenaar    autocmd!
29692d6b20d6SBram Moolenaar  augroup END
29702d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
29712d6b20d6SBram Moolenaar  &rtp = save_rtp
29722d6b20d6SBram Moolenaarenddef
29732d6b20d6SBram Moolenaar
2974585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2975585fea7bSBram Moolenaardef Test_substitute_cmd()
2976585fea7bSBram Moolenaar  new
2977585fea7bSBram Moolenaar  setline(1, 'something')
2978585fea7bSBram Moolenaar  :substitute(some(other(
2979585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2980585fea7bSBram Moolenaar  bwipe!
2981585fea7bSBram Moolenaar
2982f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2983585fea7bSBram Moolenaar  let lines =<< trim END
2984585fea7bSBram Moolenaar    vim9script
2985585fea7bSBram Moolenaar    new
2986585fea7bSBram Moolenaar    setline(1, 'something')
2987585fea7bSBram Moolenaar    :substitute(some(other(
2988585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2989585fea7bSBram Moolenaar    bwipe!
2990585fea7bSBram Moolenaar  END
2991585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2992585fea7bSBram Moolenaar  source Xvim9lines
2993585fea7bSBram Moolenaar
2994585fea7bSBram Moolenaar  delete('Xvim9lines')
2995585fea7bSBram Moolenaarenddef
2996585fea7bSBram Moolenaar
29978a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2998