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:')
31*98b4f145SBram Moolenaar  call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
32f93c7feaSBram Moolenaar
334cdb13ceSBram Moolenaar  let nr: number = 1234
344cdb13ceSBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
354cdb13ceSBram Moolenaar
36b209750bSBram Moolenaar  let a: number = 6 #comment
379be61bbbSBram Moolenaar  assert_equal(6, a)
389be61bbbSBram Moolenaar
3942a480bfSBram Moolenaar  if has('channel')
4042a480bfSBram Moolenaar    let chan1: channel
41fbdd08edSBram Moolenaar    let job1: job
42f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
4342a480bfSBram Moolenaar  endif
44fbdd08edSBram Moolenaar  if has('float')
45fbdd08edSBram Moolenaar    let float1: float = 3.4
46fbdd08edSBram Moolenaar  endif
475deeb3f1SBram Moolenaar  let Funky1: func
485deeb3f1SBram Moolenaar  let Funky2: func = function('len')
494c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
5042a480bfSBram Moolenaar
51b209750bSBram Moolenaar  g:newvar = 'new'  #comment
52401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
53401d9ffbSBram Moolenaar
54401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
55401d9ffbSBram Moolenaar  g:existing = 'no'
56401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
57401d9ffbSBram Moolenaar
58b283a8a6SBram Moolenaar  v:char = 'abc'
596e587dcbSBram Moolenaar  assert_equal('abc', v:char)
60b283a8a6SBram Moolenaar
61b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
626e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
63b283a8a6SBram Moolenaar  $ENVVAR = ''
646e587dcbSBram Moolenaar
65b5ed2660SBram Moolenaar  let lines =<< trim END
66b5ed2660SBram Moolenaar    vim9script
67b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
68b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
69b5ed2660SBram Moolenaar    $ENVVAR = ''
70b5ed2660SBram Moolenaar  END
71b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
72b5ed2660SBram Moolenaar
73fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
74fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
75fd1823e0SBram Moolenaar  s:addToMe += 222
76fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
770bbf722aSBram Moolenaar  s:newVar = 'new'
780bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
79a8c17704SBram Moolenaar
80a8c17704SBram Moolenaar  set ts=7
81a8c17704SBram Moolenaar  &ts += 1
82a8c17704SBram Moolenaar  assert_equal(8, &ts)
8380c34ca3SBram Moolenaar  &ts -= 3
8480c34ca3SBram Moolenaar  assert_equal(5, &ts)
8580c34ca3SBram Moolenaar  &ts *= 2
8680c34ca3SBram Moolenaar  assert_equal(10, &ts)
8780c34ca3SBram Moolenaar  &ts /= 3
8880c34ca3SBram Moolenaar  assert_equal(3, &ts)
8980c34ca3SBram Moolenaar  set ts=10
9080c34ca3SBram Moolenaar  &ts %= 4
9180c34ca3SBram Moolenaar  assert_equal(2, &ts)
92b5ed2660SBram Moolenaar
93b5ed2660SBram Moolenaar  lines =<< trim END
94b5ed2660SBram Moolenaar    vim9script
95b5ed2660SBram Moolenaar    &ts = 6
96b5ed2660SBram Moolenaar    &ts += 3
97b5ed2660SBram Moolenaar    assert_equal(9, &ts)
98b5ed2660SBram Moolenaar  END
99b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
100b5ed2660SBram Moolenaar
101a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
102a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
103a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
104a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
105a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
106a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
107a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
108a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
109cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
110585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11180c34ca3SBram Moolenaar  &ts = 8
112a8c17704SBram Moolenaar
11333afa244SBram Moolenaar  call CheckDefFailure(['let s:var = 123'], 'E1101:')
11433afa244SBram Moolenaar  call CheckDefFailure(['let s:var: number'], 'E1101:')
11533afa244SBram Moolenaar
116f9b2b496SBram Moolenaar  lines =<< trim END
117f9b2b496SBram Moolenaar    vim9script
118f9b2b496SBram Moolenaar    def SomeFunc()
119f9b2b496SBram Moolenaar      s:var = 123
120f9b2b496SBram Moolenaar    enddef
121f9b2b496SBram Moolenaar    defcompile
122f9b2b496SBram Moolenaar  END
123f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
124f9b2b496SBram Moolenaar
125a8c17704SBram Moolenaar  g:inc_counter += 1
126a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
127a8c17704SBram Moolenaar
128a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
129a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
130dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
131a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
132a8c17704SBram Moolenaar
133a8c17704SBram Moolenaar  @a = 'areg'
134a8c17704SBram Moolenaar  @a ..= 'add'
135a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
136dd29f1b0SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
137a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
138e69f6d04SBram Moolenaar
139b5ed2660SBram Moolenaar  lines =<< trim END
140b5ed2660SBram Moolenaar    vim9script
141b5ed2660SBram Moolenaar    @c = 'areg'
142b5ed2660SBram Moolenaar    @c ..= 'add'
143b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
144b5ed2660SBram Moolenaar  END
145b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
146b5ed2660SBram Moolenaar
147e69f6d04SBram Moolenaar  v:errmsg = 'none'
148e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
149e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
150dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
151e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
15233afa244SBram Moolenaar
15333afa244SBram Moolenaar  # single letter variables
15433afa244SBram Moolenaar  a = 123
15533afa244SBram Moolenaar  assert_equal(123, a)
15633afa244SBram Moolenaar  let b: number
15733afa244SBram Moolenaar  b = 123
15833afa244SBram Moolenaar  assert_equal(123, b)
15933afa244SBram Moolenaar  let g: number
16033afa244SBram Moolenaar  g = 123
16133afa244SBram Moolenaar  assert_equal(123, g)
16233afa244SBram Moolenaar  let s: number
16333afa244SBram Moolenaar  s = 123
16433afa244SBram Moolenaar  assert_equal(123, s)
16533afa244SBram Moolenaar  let t: number
16633afa244SBram Moolenaar  t = 123
16733afa244SBram Moolenaar  assert_equal(123, t)
16833afa244SBram Moolenaar  let v: number
16933afa244SBram Moolenaar  v = 123
17033afa244SBram Moolenaar  assert_equal(123, v)
17133afa244SBram Moolenaar  let w: number
17233afa244SBram Moolenaar  w = 123
17333afa244SBram Moolenaar  assert_equal(123, w)
1745deeb3f1SBram Moolenaarenddef
1755deeb3f1SBram Moolenaar
1763b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1773b74b6b4SBram Moolenaar  let lines =<< trim END
1783b74b6b4SBram Moolenaar      vim9script
1793b74b6b4SBram Moolenaar
180f5be8cdbSBram Moolenaar      # single character variable declarations work
1813b74b6b4SBram Moolenaar      let a: string
1823b74b6b4SBram Moolenaar      let b: number
1833b74b6b4SBram Moolenaar      let l: list<any>
1843b74b6b4SBram Moolenaar      let s: string
1853b74b6b4SBram Moolenaar      let t: number
1863b74b6b4SBram Moolenaar      let v: number
1873b74b6b4SBram Moolenaar      let w: number
1883b74b6b4SBram Moolenaar
189f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1903b74b6b4SBram Moolenaar      a = 'script-a'
1913b74b6b4SBram Moolenaar      b = 111
1923b74b6b4SBram Moolenaar      l = [1, 2, 3]
1933b74b6b4SBram Moolenaar      s = 'script-s'
1943b74b6b4SBram Moolenaar      t = 222
1953b74b6b4SBram Moolenaar      v = 333
1963b74b6b4SBram Moolenaar      w = 444
1973b74b6b4SBram Moolenaar
1983b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1993b74b6b4SBram Moolenaar      assert_equal(111, b)
2003b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2013b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2023b74b6b4SBram Moolenaar      assert_equal(222, t)
2033b74b6b4SBram Moolenaar      assert_equal(333, v)
2043b74b6b4SBram Moolenaar      assert_equal(444, w)
2053b74b6b4SBram Moolenaar  END
2063b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2073b74b6b4SBram Moolenaar  source Xsinglechar
2083b74b6b4SBram Moolenaar  delete('Xsinglechar')
2093b74b6b4SBram Moolenaarenddef
2103b74b6b4SBram Moolenaar
21184370087SBram Moolenaardef Test_assignment_list()
21284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
21384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
21484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
21584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
21684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
21784370087SBram Moolenaar
21884370087SBram Moolenaar  let listS: list<string> = []
21984370087SBram Moolenaar  let listN: list<number> = []
22084370087SBram Moolenaar
22184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
22284370087SBram Moolenaar  list2[-1] = 99
22384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
22484370087SBram Moolenaar  list2[-2] = 88
22584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
22684370087SBram Moolenaar  list2[-3] = 77
22784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
228dd29f1b0SBram Moolenaar  list2 += [100]
229dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
230dd29f1b0SBram Moolenaar
231dd29f1b0SBram Moolenaar  list3 += ['end']
232dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
233dd29f1b0SBram Moolenaar
234dd29f1b0SBram Moolenaar
23584370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
236c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
23784370087SBram Moolenaar
23884370087SBram Moolenaar  # type becomes list<any>
23984370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
24084370087SBram Moolenaarenddef
24184370087SBram Moolenaar
242b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
243b31be3f9SBram Moolenaar  let lines =<< trim END
244b31be3f9SBram Moolenaar    vim9script
245b31be3f9SBram Moolenaar    let v1: number
246b31be3f9SBram Moolenaar    let v2: number
247b31be3f9SBram Moolenaar    let v3: number
248b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
249b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
250b31be3f9SBram Moolenaar  END
251b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
252b31be3f9SBram Moolenaarenddef
253b31be3f9SBram Moolenaar
25484370087SBram Moolenaardef Test_assignment_dict()
25584370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
25684370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
25784370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
25884370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
25974fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
26084370087SBram Moolenaar
261f5be8cdbSBram Moolenaar  # overwrite
262c785b9a7SBram Moolenaar  dict3['key'] = 'another'
263c785b9a7SBram Moolenaar
26458626872SBram Moolenaar  # empty key can be used
26558626872SBram Moolenaar  let dd = {}
26658626872SBram Moolenaar  dd[""] = 6
26758626872SBram Moolenaar  assert_equal({'': 6}, dd)
26884370087SBram Moolenaar
26984370087SBram Moolenaar  # type becomes dict<any>
27084370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
2718e4c8c85SBram Moolenaar
2728e4c8c85SBram Moolenaar  # assignment to script-local dict
2738e4c8c85SBram Moolenaar  let lines =<< trim END
2748e4c8c85SBram Moolenaar    vim9script
2758e4c8c85SBram Moolenaar    let test: dict<any> = {}
2768e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2778e4c8c85SBram Moolenaar      test['a'] = 43
2788e4c8c85SBram Moolenaar      return test
2798e4c8c85SBram Moolenaar    enddef
2808e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2818e4c8c85SBram Moolenaar  END
2828e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
2838e4c8c85SBram Moolenaar
2848e4c8c85SBram Moolenaar  lines =<< trim END
2858e4c8c85SBram Moolenaar    vim9script
2868e4c8c85SBram Moolenaar    let test: dict<any>
2878e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2888e4c8c85SBram Moolenaar      test['a'] = 43
2898e4c8c85SBram Moolenaar      return test
2908e4c8c85SBram Moolenaar    enddef
2918e4c8c85SBram Moolenaar    FillDict()
2928e4c8c85SBram Moolenaar  END
2938e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
2942caa1594SBram Moolenaar
2952caa1594SBram Moolenaar  # assignment to global dict
2962caa1594SBram Moolenaar  lines =<< trim END
2972caa1594SBram Moolenaar    vim9script
2982caa1594SBram Moolenaar    g:test = {}
2992caa1594SBram Moolenaar    def FillDict(): dict<any>
3002caa1594SBram Moolenaar      g:test['a'] = 43
3012caa1594SBram Moolenaar      return g:test
3022caa1594SBram Moolenaar    enddef
3032caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3042caa1594SBram Moolenaar  END
3052caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3062caa1594SBram Moolenaar
3072caa1594SBram Moolenaar  # assignment to buffer dict
3082caa1594SBram Moolenaar  lines =<< trim END
3092caa1594SBram Moolenaar    vim9script
3102caa1594SBram Moolenaar    b:test = {}
3112caa1594SBram Moolenaar    def FillDict(): dict<any>
3122caa1594SBram Moolenaar      b:test['a'] = 43
3132caa1594SBram Moolenaar      return b:test
3142caa1594SBram Moolenaar    enddef
3152caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3162caa1594SBram Moolenaar  END
3172caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
31884370087SBram Moolenaarenddef
31984370087SBram Moolenaar
320d3aac291SBram Moolenaardef Test_assignment_local()
321f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
322f5be8cdbSBram Moolenaar  # changed.
323d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
324d3aac291SBram Moolenaar    let b:existing = 'yes'
325d3aac291SBram Moolenaar    let w:existing = 'yes'
326d3aac291SBram Moolenaar    let t:existing = 'yes'
327d3aac291SBram Moolenaar
328d3aac291SBram Moolenaar    def Test_assignment_local_internal()
329d3aac291SBram Moolenaar      b:newvar = 'new'
330d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
331d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
332d3aac291SBram Moolenaar      b:existing = 'no'
333d3aac291SBram Moolenaar      assert_equal('no', b:existing)
334396f3138SBram Moolenaar      b:existing ..= 'NO'
335396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
336d3aac291SBram Moolenaar
337d3aac291SBram Moolenaar      w:newvar = 'new'
338d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
339d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
340d3aac291SBram Moolenaar      w:existing = 'no'
341d3aac291SBram Moolenaar      assert_equal('no', w:existing)
342396f3138SBram Moolenaar      w:existing ..= 'NO'
343396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
344d3aac291SBram Moolenaar
345d3aac291SBram Moolenaar      t:newvar = 'new'
346d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
347d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
348d3aac291SBram Moolenaar      t:existing = 'no'
349d3aac291SBram Moolenaar      assert_equal('no', t:existing)
350396f3138SBram Moolenaar      t:existing ..= 'NO'
351396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
352d3aac291SBram Moolenaar    enddef
353d3aac291SBram Moolenaar    call Test_assignment_local_internal()
354d3aac291SBram Moolenaar  END
355d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
356d3aac291SBram Moolenaarenddef
357d3aac291SBram Moolenaar
3585deeb3f1SBram Moolenaardef Test_assignment_default()
359e69f6d04SBram Moolenaar
360cb711abfSBram Moolenaar  # Test default values.
361e69f6d04SBram Moolenaar  let thebool: bool
362e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
363e69f6d04SBram Moolenaar
364e69f6d04SBram Moolenaar  let thenumber: number
365e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
366e69f6d04SBram Moolenaar
367e69f6d04SBram Moolenaar  if has('float')
368e69f6d04SBram Moolenaar    let thefloat: float
369e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
370e69f6d04SBram Moolenaar  endif
371e69f6d04SBram Moolenaar
372e69f6d04SBram Moolenaar  let thestring: string
373e69f6d04SBram Moolenaar  assert_equal('', thestring)
374e69f6d04SBram Moolenaar
375e69f6d04SBram Moolenaar  let theblob: blob
376e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
377e69f6d04SBram Moolenaar
3785deeb3f1SBram Moolenaar  let Thefunc: func
3795deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
380e69f6d04SBram Moolenaar
381e69f6d04SBram Moolenaar  let thelist: list<any>
382e69f6d04SBram Moolenaar  assert_equal([], thelist)
383e69f6d04SBram Moolenaar
384e69f6d04SBram Moolenaar  let thedict: dict<any>
385e69f6d04SBram Moolenaar  assert_equal({}, thedict)
386e69f6d04SBram Moolenaar
3872c869deeSBram Moolenaar  if has('channel')
388e69f6d04SBram Moolenaar    let thejob: job
389e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
390e69f6d04SBram Moolenaar
391e69f6d04SBram Moolenaar    let thechannel: channel
392e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
393c785b9a7SBram Moolenaar
394c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
395f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
396c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
397c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
398c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
399c785b9a7SBram Moolenaar    endif
4002c869deeSBram Moolenaar  endif
401585fea7bSBram Moolenaar
402585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
403585fea7bSBram Moolenaar  assert_equal(5678, nr)
4048a7d6542SBram Moolenaarenddef
4058a7d6542SBram Moolenaar
40647a519a9SBram Moolenaardef Test_assignment_var_list()
40747a519a9SBram Moolenaar  let v1: string
40847a519a9SBram Moolenaar  let v2: string
4099af78769SBram Moolenaar  let vrem: list<string>
4109af78769SBram Moolenaar  [v1] = ['aaa']
4119af78769SBram Moolenaar  assert_equal('aaa', v1)
4129af78769SBram Moolenaar
41347a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
41447a519a9SBram Moolenaar  assert_equal('one', v1)
41547a519a9SBram Moolenaar  assert_equal('two', v2)
4169af78769SBram Moolenaar
4179af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4189af78769SBram Moolenaar  assert_equal('one', v1)
4199af78769SBram Moolenaar  assert_equal('two', v2)
4209af78769SBram Moolenaar  assert_equal([], vrem)
4219af78769SBram Moolenaar
4229af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4239af78769SBram Moolenaar  assert_equal('one', v1)
4249af78769SBram Moolenaar  assert_equal('two', v2)
4259af78769SBram Moolenaar  assert_equal(['three'], vrem)
4261c199f9cSBram Moolenaar
4271c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4281c199f9cSBram Moolenaar  assert_equal(3, &ts)
4291c199f9cSBram Moolenaar  assert_equal(4, &sw)
4301c199f9cSBram Moolenaar  set ts=8 sw=4
43147a519a9SBram Moolenaarenddef
43247a519a9SBram Moolenaar
433c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
434c7e44a7eSBram Moolenaar  let lines =<< trim END
435c7e44a7eSBram Moolenaar    vim9script
436c7e44a7eSBram Moolenaar    def Func(): list<number>
437c7e44a7eSBram Moolenaar      return [1, 2]
438c7e44a7eSBram Moolenaar    enddef
439c7e44a7eSBram Moolenaar    let var1: number
440c7e44a7eSBram Moolenaar    let var2: number
441c7e44a7eSBram Moolenaar    [var1, var2] =
442c7e44a7eSBram Moolenaar          Func()
443c7e44a7eSBram Moolenaar    assert_equal(1, var1)
444c7e44a7eSBram Moolenaar    assert_equal(2, var2)
445c7e44a7eSBram Moolenaar    let ll =
446c7e44a7eSBram Moolenaar          Func()
447c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
44883144546SBram Moolenaar
44983144546SBram Moolenaar    @/ = 'text'
45083144546SBram Moolenaar    assert_equal('text', @/)
45183144546SBram Moolenaar    @0 = 'zero'
45283144546SBram Moolenaar    assert_equal('zero', @0)
45383144546SBram Moolenaar    @1 = 'one'
45483144546SBram Moolenaar    assert_equal('one', @1)
45583144546SBram Moolenaar    @9 = 'nine'
45683144546SBram Moolenaar    assert_equal('nine', @9)
45783144546SBram Moolenaar    @- = 'minus'
45883144546SBram Moolenaar    assert_equal('minus', @-)
45983144546SBram Moolenaar    if has('clipboard_working')
46083144546SBram Moolenaar      @* = 'star'
46183144546SBram Moolenaar      assert_equal('star', @*)
46283144546SBram Moolenaar      @+ = 'plus'
46383144546SBram Moolenaar      assert_equal('plus', @+)
46483144546SBram Moolenaar    endif
46595dd9f25SBram Moolenaar
46695dd9f25SBram Moolenaar    let a: number = 123
46795dd9f25SBram Moolenaar    assert_equal(123, a)
46895dd9f25SBram Moolenaar    let s: string = 'yes'
46995dd9f25SBram Moolenaar    assert_equal('yes', s)
47095dd9f25SBram Moolenaar    let b: number = 42
47195dd9f25SBram Moolenaar    assert_equal(42, b)
47295dd9f25SBram Moolenaar    let w: number = 43
47395dd9f25SBram Moolenaar    assert_equal(43, w)
47495dd9f25SBram Moolenaar    let t: number = 44
47595dd9f25SBram Moolenaar    assert_equal(44, t)
476c7e44a7eSBram Moolenaar  END
477c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
478c7e44a7eSBram Moolenaarenddef
479c7e44a7eSBram Moolenaar
480cab27678SBram Moolenaardef Mess(): string
481cab27678SBram Moolenaar  v:foldstart = 123
482cab27678SBram Moolenaar  return 'xxx'
483cab27678SBram Moolenaarenddef
484cab27678SBram Moolenaar
485d72c1bf0SBram Moolenaardef Test_assignment_failure()
4868a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
4878a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
4888a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
4898a7d6542SBram Moolenaar
49063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
49163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
49263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
49363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
49463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
49563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
49663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
49763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
49863be3d4bSBram Moolenaar
4998a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5008a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5018a7d6542SBram Moolenaar
5029b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5039af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5049af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5059af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5069af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5079af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5089af78769SBram Moolenaar                            'let y: number',
5099af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5109af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5119af78769SBram Moolenaar                            'let y: number',
5129af78769SBram Moolenaar                            'let z: list<number>',
5139af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5149be61bbbSBram Moolenaar
515e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
516c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5179be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
518c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5199be61bbbSBram Moolenaar
520e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
521c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5229be61bbbSBram Moolenaar
523434d72cbSBram Moolenaar  if has('dnd')
52465821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
525434d72cbSBram Moolenaar  else
526434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
527434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
528434d72cbSBram Moolenaar  endif
5299be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
53065821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
531c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5329be61bbbSBram Moolenaar
533e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
534e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
535e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
536e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5379be61bbbSBram Moolenaar
5389be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5399be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5409be61bbbSBram Moolenaar
541822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
54233fa29cfSBram Moolenaar
5438a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5448a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5458a7d6542SBram Moolenaar
5468a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5478a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5488a7d6542SBram Moolenaar
5498a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5508a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
55142a480bfSBram Moolenaar
552d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
55342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
554cab27678SBram Moolenaar
555cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
556cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
55743e969d3SBram Moolenaar
55843e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
55943e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
56043e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
56143e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
56243e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
56343e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
56443e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
56543e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
566d72c1bf0SBram Moolenaarenddef
567d72c1bf0SBram Moolenaar
568d72c1bf0SBram Moolenaardef Test_unlet()
569d72c1bf0SBram Moolenaar  g:somevar = 'yes'
570d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
571d72c1bf0SBram Moolenaar  unlet g:somevar
572d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
573d72c1bf0SBram Moolenaar  unlet! g:somevar
574d72c1bf0SBram Moolenaar
575d72c1bf0SBram Moolenaar  call CheckScriptFailure([
576d72c1bf0SBram Moolenaar        'vim9script',
577d72c1bf0SBram Moolenaar        'let svar = 123',
578d72c1bf0SBram Moolenaar        'unlet svar',
579d72c1bf0SBram Moolenaar        ], 'E1081:')
580d72c1bf0SBram Moolenaar  call CheckScriptFailure([
581d72c1bf0SBram Moolenaar        'vim9script',
582d72c1bf0SBram Moolenaar        'let svar = 123',
583d72c1bf0SBram Moolenaar        'unlet s:svar',
584d72c1bf0SBram Moolenaar        ], 'E1081:')
585d72c1bf0SBram Moolenaar  call CheckScriptFailure([
586d72c1bf0SBram Moolenaar        'vim9script',
587d72c1bf0SBram Moolenaar        'let svar = 123',
588d72c1bf0SBram Moolenaar        'def Func()',
589d72c1bf0SBram Moolenaar        '  unlet svar',
590d72c1bf0SBram Moolenaar        'enddef',
591822ba247SBram Moolenaar        'defcompile',
592d72c1bf0SBram Moolenaar        ], 'E1081:')
593d72c1bf0SBram Moolenaar  call CheckScriptFailure([
594d72c1bf0SBram Moolenaar        'vim9script',
595d72c1bf0SBram Moolenaar        'let svar = 123',
596d72c1bf0SBram Moolenaar        'def Func()',
597d72c1bf0SBram Moolenaar        '  unlet s:svar',
598d72c1bf0SBram Moolenaar        'enddef',
599822ba247SBram Moolenaar        'defcompile',
600d72c1bf0SBram Moolenaar        ], 'E1081:')
6017bdaea6eSBram Moolenaar
6027bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6037bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6047bdaea6eSBram Moolenaar  unlet $ENVVAR
6057bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
606d72c1bf0SBram Moolenaarenddef
607599c89c8SBram Moolenaar
6084c17ad94SBram Moolenaardef Test_delfunction()
609f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6104c17ad94SBram Moolenaar  CheckScriptSuccess([
6114c17ad94SBram Moolenaar      'vim9script',
6124c17ad94SBram Moolenaar      'func CheckMe()',
6134c17ad94SBram Moolenaar      '  return 123',
6144c17ad94SBram Moolenaar      'endfunc',
6154c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6164c17ad94SBram Moolenaar      ])
6174c17ad94SBram Moolenaar
618f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6194c17ad94SBram Moolenaar  CheckScriptFailure([
6204c17ad94SBram Moolenaar      'vim9script',
6214c17ad94SBram Moolenaar      'func DeleteMe1()',
6224c17ad94SBram Moolenaar      'endfunc',
6234c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6244c17ad94SBram Moolenaar      ], 'E1084:')
6254c17ad94SBram Moolenaar  CheckScriptFailure([
6264c17ad94SBram Moolenaar      'vim9script',
6274c17ad94SBram Moolenaar      'func DeleteMe2()',
6284c17ad94SBram Moolenaar      'endfunc',
6294c17ad94SBram Moolenaar      'def DoThat()',
6304c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6314c17ad94SBram Moolenaar      'enddef',
6324c17ad94SBram Moolenaar      'DoThat()',
6334c17ad94SBram Moolenaar      ], 'E1084:')
6344c17ad94SBram Moolenaar  CheckScriptFailure([
6354c17ad94SBram Moolenaar      'vim9script',
6364c17ad94SBram Moolenaar      'def DeleteMe3()',
6374c17ad94SBram Moolenaar      'enddef',
6384c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6394c17ad94SBram Moolenaar      ], 'E1084:')
6404c17ad94SBram Moolenaar  CheckScriptFailure([
6414c17ad94SBram Moolenaar      'vim9script',
6424c17ad94SBram Moolenaar      'def DeleteMe4()',
6434c17ad94SBram Moolenaar      'enddef',
6444c17ad94SBram Moolenaar      'def DoThat()',
6454c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6464c17ad94SBram Moolenaar      'enddef',
6474c17ad94SBram Moolenaar      'DoThat()',
6484c17ad94SBram Moolenaar      ], 'E1084:')
649925e9fd6SBram Moolenaar
650925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
651925e9fd6SBram Moolenaar  let lines =<< trim END
652925e9fd6SBram Moolenaar      vim9script
653925e9fd6SBram Moolenaar      def g:Global(): string
654925e9fd6SBram Moolenaar        return "yes"
655925e9fd6SBram Moolenaar      enddef
656925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
657925e9fd6SBram Moolenaar      def! g:Global(): string
658925e9fd6SBram Moolenaar        return "no"
659925e9fd6SBram Moolenaar      enddef
660925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
661925e9fd6SBram Moolenaar      delfunc g:Global
662925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
663925e9fd6SBram Moolenaar  END
664925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
665925e9fd6SBram Moolenaar
666925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
667925e9fd6SBram Moolenaar  lines =<< trim END
668925e9fd6SBram Moolenaar      vim9script
669925e9fd6SBram Moolenaar      func g:Global()
670925e9fd6SBram Moolenaar        return "yes"
671925e9fd6SBram Moolenaar      endfunc
672925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
673925e9fd6SBram Moolenaar      def! g:Global(): string
674925e9fd6SBram Moolenaar        return "no"
675925e9fd6SBram Moolenaar      enddef
676925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
677925e9fd6SBram Moolenaar      delfunc g:Global
678925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
679925e9fd6SBram Moolenaar  END
680925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
681925e9fd6SBram Moolenaar
682925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
683925e9fd6SBram Moolenaar  lines =<< trim END
684925e9fd6SBram Moolenaar      vim9script
685925e9fd6SBram Moolenaar      def g:Global(): string
686925e9fd6SBram Moolenaar        return "yes"
687925e9fd6SBram Moolenaar      enddef
688925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
689925e9fd6SBram Moolenaar      func! g:Global()
690925e9fd6SBram Moolenaar        return "no"
691925e9fd6SBram Moolenaar      endfunc
692925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
693925e9fd6SBram Moolenaar      delfunc g:Global
694925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
695925e9fd6SBram Moolenaar  END
696925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6974c17ad94SBram Moolenaarenddef
6984c17ad94SBram Moolenaar
699599c89c8SBram Moolenaarfunc Test_wrong_type()
700599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
701599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
702599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
703599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
704599c89c8SBram Moolenaar
705599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
706599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
70742a480bfSBram Moolenaar
70842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
70942a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
71042a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
71142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
71242a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
71342a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
71442a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
71542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
71642a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
71742a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
71842a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
719a0a9f43aSBram Moolenaar
720a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
721a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7228a7d6542SBram Moolenaarendfunc
7238a7d6542SBram Moolenaar
7248a7d6542SBram Moolenaarfunc Test_const()
7258a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7268a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7278a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7289be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7298a7d6542SBram Moolenaarendfunc
7308a7d6542SBram Moolenaar
731df069eecSBram Moolenaardef Test_range_no_colon()
732df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
733df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
734df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
735df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
736df069eecSBram Moolenaarenddef
737df069eecSBram Moolenaar
738df069eecSBram Moolenaar
7398a7d6542SBram Moolenaardef Test_block()
7408a7d6542SBram Moolenaar  let outer = 1
7418a7d6542SBram Moolenaar  {
7428a7d6542SBram Moolenaar    let inner = 2
7438a7d6542SBram Moolenaar    assert_equal(1, outer)
7448a7d6542SBram Moolenaar    assert_equal(2, inner)
7458a7d6542SBram Moolenaar  }
7468a7d6542SBram Moolenaar  assert_equal(1, outer)
7478a7d6542SBram Moolenaarenddef
7488a7d6542SBram Moolenaar
7498a7d6542SBram Moolenaarfunc Test_block_failure()
7508a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
751585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
752585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7538a7d6542SBram Moolenaarendfunc
7548a7d6542SBram Moolenaar
755d032f34aSBram Moolenaarfunc g:NoSuchFunc()
756d032f34aSBram Moolenaar  echo 'none'
757d032f34aSBram Moolenaarendfunc
758d032f34aSBram Moolenaar
7598a7d6542SBram Moolenaardef Test_try_catch()
7608a7d6542SBram Moolenaar  let l = []
7617a092245SBram Moolenaar  try # comment
7628a7d6542SBram Moolenaar    add(l, '1')
7638a7d6542SBram Moolenaar    throw 'wrong'
7648a7d6542SBram Moolenaar    add(l, '2')
7657a092245SBram Moolenaar  catch # comment
7668a7d6542SBram Moolenaar    add(l, v:exception)
7677a092245SBram Moolenaar  finally # comment
7688a7d6542SBram Moolenaar    add(l, '3')
7697a092245SBram Moolenaar  endtry # comment
7708a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
77168d130c6SBram Moolenaar
772e859312eSBram Moolenaar  l = []
773e859312eSBram Moolenaar  try
774e859312eSBram Moolenaar    try
775e859312eSBram Moolenaar      add(l, '1')
776e859312eSBram Moolenaar      throw 'wrong'
777e859312eSBram Moolenaar      add(l, '2')
778e859312eSBram Moolenaar    catch /right/
779e859312eSBram Moolenaar      add(l, v:exception)
780e859312eSBram Moolenaar    endtry
781e859312eSBram Moolenaar  catch /wrong/
782e859312eSBram Moolenaar    add(l, 'caught')
783e859312eSBram Moolenaar  finally
784e859312eSBram Moolenaar    add(l, 'finally')
785e859312eSBram Moolenaar  endtry
786e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
787e859312eSBram Moolenaar
78868d130c6SBram Moolenaar  let n: number
78968d130c6SBram Moolenaar  try
79068d130c6SBram Moolenaar    n = l[3]
79168d130c6SBram Moolenaar  catch /E684:/
79268d130c6SBram Moolenaar    n = 99
79368d130c6SBram Moolenaar  endtry
79468d130c6SBram Moolenaar  assert_equal(99, n)
79568d130c6SBram Moolenaar
79668d130c6SBram Moolenaar  try
79768d130c6SBram Moolenaar    n = g:astring[3]
79868d130c6SBram Moolenaar  catch /E714:/
79968d130c6SBram Moolenaar    n = 77
80068d130c6SBram Moolenaar  endtry
80168d130c6SBram Moolenaar  assert_equal(77, n)
80268d130c6SBram Moolenaar
80368d130c6SBram Moolenaar  try
80468d130c6SBram Moolenaar    n = l[g:astring]
80568d130c6SBram Moolenaar  catch /E39:/
80668d130c6SBram Moolenaar    n = 77
80768d130c6SBram Moolenaar  endtry
80868d130c6SBram Moolenaar  assert_equal(77, n)
80968d130c6SBram Moolenaar
81068d130c6SBram Moolenaar  try
81168d130c6SBram Moolenaar    n = s:does_not_exist
81268d130c6SBram Moolenaar  catch /E121:/
813f0b9f43cSBram Moolenaar    n = 111
814f0b9f43cSBram Moolenaar  endtry
815f0b9f43cSBram Moolenaar  assert_equal(111, n)
816f0b9f43cSBram Moolenaar
817f0b9f43cSBram Moolenaar  try
818f0b9f43cSBram Moolenaar    n = g:does_not_exist
819f0b9f43cSBram Moolenaar  catch /E121:/
82068d130c6SBram Moolenaar    n = 121
82168d130c6SBram Moolenaar  endtry
82268d130c6SBram Moolenaar  assert_equal(121, n)
82368d130c6SBram Moolenaar
82468d130c6SBram Moolenaar  let d = #{one: 1}
82568d130c6SBram Moolenaar  try
82668d130c6SBram Moolenaar    n = d[g:astring]
82768d130c6SBram Moolenaar  catch /E716:/
82868d130c6SBram Moolenaar    n = 222
82968d130c6SBram Moolenaar  endtry
83068d130c6SBram Moolenaar  assert_equal(222, n)
831f0b9f43cSBram Moolenaar
832f0b9f43cSBram Moolenaar  try
833f0b9f43cSBram Moolenaar    n = -g:astring
834f0b9f43cSBram Moolenaar  catch /E39:/
835f0b9f43cSBram Moolenaar    n = 233
836f0b9f43cSBram Moolenaar  endtry
837f0b9f43cSBram Moolenaar  assert_equal(233, n)
838f0b9f43cSBram Moolenaar
839f0b9f43cSBram Moolenaar  try
840f0b9f43cSBram Moolenaar    n = +g:astring
841f0b9f43cSBram Moolenaar  catch /E1030:/
842f0b9f43cSBram Moolenaar    n = 244
843f0b9f43cSBram Moolenaar  endtry
844f0b9f43cSBram Moolenaar  assert_equal(244, n)
845f0b9f43cSBram Moolenaar
846f0b9f43cSBram Moolenaar  try
847f0b9f43cSBram Moolenaar    n = +g:alist
848f0b9f43cSBram Moolenaar  catch /E745:/
849f0b9f43cSBram Moolenaar    n = 255
850f0b9f43cSBram Moolenaar  endtry
851f0b9f43cSBram Moolenaar  assert_equal(255, n)
852f0b9f43cSBram Moolenaar
853f0b9f43cSBram Moolenaar  let nd: dict<any>
854f0b9f43cSBram Moolenaar  try
855f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
856f0b9f43cSBram Moolenaar  catch /E1029:/
857f0b9f43cSBram Moolenaar    n = 266
858f0b9f43cSBram Moolenaar  endtry
859f0b9f43cSBram Moolenaar  assert_equal(266, n)
860f0b9f43cSBram Moolenaar
861f0b9f43cSBram Moolenaar  try
862f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
863f0b9f43cSBram Moolenaar  catch /E1093:/
864f0b9f43cSBram Moolenaar    n = 277
865f0b9f43cSBram Moolenaar  endtry
866f0b9f43cSBram Moolenaar  assert_equal(277, n)
867f0b9f43cSBram Moolenaar
868e859312eSBram Moolenaar  try
869e859312eSBram Moolenaar    &ts = g:astring
870e859312eSBram Moolenaar  catch /E1029:/
871e859312eSBram Moolenaar    n = 288
872e859312eSBram Moolenaar  endtry
873e859312eSBram Moolenaar  assert_equal(288, n)
874e859312eSBram Moolenaar
875e859312eSBram Moolenaar  try
876e859312eSBram Moolenaar    &backspace = 'asdf'
877e859312eSBram Moolenaar  catch /E474:/
878e859312eSBram Moolenaar    n = 299
879e859312eSBram Moolenaar  endtry
880e859312eSBram Moolenaar  assert_equal(299, n)
881e859312eSBram Moolenaar
882e859312eSBram Moolenaar  l = [1]
883e859312eSBram Moolenaar  try
884e859312eSBram Moolenaar    l[3] = 3
885e859312eSBram Moolenaar  catch /E684:/
886e859312eSBram Moolenaar    n = 300
887e859312eSBram Moolenaar  endtry
888e859312eSBram Moolenaar  assert_equal(300, n)
889e859312eSBram Moolenaar
890e859312eSBram Moolenaar  try
891e859312eSBram Moolenaar    unlet g:does_not_exist
892e859312eSBram Moolenaar  catch /E108:/
893e859312eSBram Moolenaar    n = 322
894e859312eSBram Moolenaar  endtry
895e859312eSBram Moolenaar  assert_equal(322, n)
896e859312eSBram Moolenaar
897e859312eSBram Moolenaar  try
898e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
899e859312eSBram Moolenaar  catch /E721:/
900e859312eSBram Moolenaar    n = 333
901e859312eSBram Moolenaar  endtry
902e859312eSBram Moolenaar  assert_equal(333, n)
903e859312eSBram Moolenaar
904e859312eSBram Moolenaar  try
905e859312eSBram Moolenaar    l = DeletedFunc()
906e859312eSBram Moolenaar  catch /E933:/
907e859312eSBram Moolenaar    n = 344
908e859312eSBram Moolenaar  endtry
909e859312eSBram Moolenaar  assert_equal(344, n)
910d032f34aSBram Moolenaar
911d032f34aSBram Moolenaar  try
912d032f34aSBram Moolenaar    echo len(v:true)
913d032f34aSBram Moolenaar  catch /E701:/
914d032f34aSBram Moolenaar    n = 355
915d032f34aSBram Moolenaar  endtry
916d032f34aSBram Moolenaar  assert_equal(355, n)
917d032f34aSBram Moolenaar
918d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
919d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
920d032f34aSBram Moolenaar  try
921d032f34aSBram Moolenaar    echo P()
922d032f34aSBram Moolenaar  catch /E117:/
923d032f34aSBram Moolenaar    n = 366
924d032f34aSBram Moolenaar  endtry
925d032f34aSBram Moolenaar  assert_equal(366, n)
926d032f34aSBram Moolenaar
927d032f34aSBram Moolenaar  try
928d032f34aSBram Moolenaar    echo g:NoSuchFunc()
929d032f34aSBram Moolenaar  catch /E117:/
930d032f34aSBram Moolenaar    n = 377
931d032f34aSBram Moolenaar  endtry
932d032f34aSBram Moolenaar  assert_equal(377, n)
933d032f34aSBram Moolenaar
934d032f34aSBram Moolenaar  try
935d032f34aSBram Moolenaar    echo g:alist + 4
936d032f34aSBram Moolenaar  catch /E745:/
937d032f34aSBram Moolenaar    n = 388
938d032f34aSBram Moolenaar  endtry
939d032f34aSBram Moolenaar  assert_equal(388, n)
940d032f34aSBram Moolenaar
941d032f34aSBram Moolenaar  try
942d032f34aSBram Moolenaar    echo 4 + g:alist
943d032f34aSBram Moolenaar  catch /E745:/
944d032f34aSBram Moolenaar    n = 399
945d032f34aSBram Moolenaar  endtry
946d032f34aSBram Moolenaar  assert_equal(399, n)
947d032f34aSBram Moolenaar
948d032f34aSBram Moolenaar  try
949d032f34aSBram Moolenaar    echo g:alist.member
950d032f34aSBram Moolenaar  catch /E715:/
951d032f34aSBram Moolenaar    n = 400
952d032f34aSBram Moolenaar  endtry
953d032f34aSBram Moolenaar  assert_equal(400, n)
954d032f34aSBram Moolenaar
955d032f34aSBram Moolenaar  try
956d032f34aSBram Moolenaar    echo d.member
957d032f34aSBram Moolenaar  catch /E716:/
958d032f34aSBram Moolenaar    n = 411
959d032f34aSBram Moolenaar  endtry
960d032f34aSBram Moolenaar  assert_equal(411, n)
9618a7d6542SBram Moolenaarenddef
9628a7d6542SBram Moolenaar
963e859312eSBram Moolenaardef DeletedFunc(): list<any>
964e859312eSBram Moolenaar  return ['delete me']
965e859312eSBram Moolenaarenddef
966e859312eSBram Moolenaardefcompile
967e859312eSBram Moolenaardelfunc DeletedFunc
968e859312eSBram Moolenaar
969257cc5eeSBram Moolenaardef ThrowFromDef()
970a72cfb80SBram Moolenaar  throw "getout" # comment
971257cc5eeSBram Moolenaarenddef
972257cc5eeSBram Moolenaar
973257cc5eeSBram Moolenaarfunc CatchInFunc()
974257cc5eeSBram Moolenaar  try
975257cc5eeSBram Moolenaar    call ThrowFromDef()
976257cc5eeSBram Moolenaar  catch
977257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
978257cc5eeSBram Moolenaar  endtry
979257cc5eeSBram Moolenaarendfunc
980257cc5eeSBram Moolenaar
981257cc5eeSBram Moolenaardef CatchInDef()
982257cc5eeSBram Moolenaar  try
983257cc5eeSBram Moolenaar    ThrowFromDef()
984257cc5eeSBram Moolenaar  catch
985257cc5eeSBram Moolenaar    g:thrown_def = v:exception
986257cc5eeSBram Moolenaar  endtry
987257cc5eeSBram Moolenaarenddef
988257cc5eeSBram Moolenaar
989f575adffSBram Moolenaardef ReturnFinally(): string
990f575adffSBram Moolenaar  try
991f575adffSBram Moolenaar    return 'intry'
992f575adffSBram Moolenaar  finally
993f575adffSBram Moolenaar    g:in_finally = 'finally'
994f575adffSBram Moolenaar  endtry
995f575adffSBram Moolenaar  return 'end'
996f575adffSBram Moolenaarenddef
997f575adffSBram Moolenaar
998257cc5eeSBram Moolenaardef Test_try_catch_nested()
999257cc5eeSBram Moolenaar  CatchInFunc()
1000257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1001257cc5eeSBram Moolenaar
1002257cc5eeSBram Moolenaar  CatchInDef()
1003257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1004f575adffSBram Moolenaar
1005f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1006f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1007f575adffSBram Moolenaarenddef
1008f575adffSBram Moolenaar
1009f575adffSBram Moolenaardef Test_try_catch_match()
1010f575adffSBram Moolenaar  let seq = 'a'
1011f575adffSBram Moolenaar  try
1012f575adffSBram Moolenaar    throw 'something'
1013f575adffSBram Moolenaar  catch /nothing/
1014f575adffSBram Moolenaar    seq ..= 'x'
1015f575adffSBram Moolenaar  catch /some/
1016f575adffSBram Moolenaar    seq ..= 'b'
1017f575adffSBram Moolenaar  catch /asdf/
1018f575adffSBram Moolenaar    seq ..= 'x'
1019e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1020e8c4abbbSBram Moolenaar    seq ..= 'y'
1021f575adffSBram Moolenaar  finally
1022f575adffSBram Moolenaar    seq ..= 'c'
1023f575adffSBram Moolenaar  endtry
1024f575adffSBram Moolenaar  assert_equal('abc', seq)
1025257cc5eeSBram Moolenaarenddef
1026257cc5eeSBram Moolenaar
1027e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1028e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1029e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1030e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1031585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1032585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1033585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1034585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1035585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1036585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1037585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1038585fea7bSBram Moolenaar
1039a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1040585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1041e8c4abbbSBram Moolenaarenddef
1042e8c4abbbSBram Moolenaar
1043006ad48bSBram Moolenaardef Test_throw_vimscript()
1044f5be8cdbSBram Moolenaar  # only checks line continuation
1045006ad48bSBram Moolenaar  let lines =<< trim END
1046006ad48bSBram Moolenaar      vim9script
1047006ad48bSBram Moolenaar      try
1048006ad48bSBram Moolenaar        throw 'one'
1049006ad48bSBram Moolenaar              .. 'two'
1050006ad48bSBram Moolenaar      catch
1051006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1052006ad48bSBram Moolenaar      endtry
1053006ad48bSBram Moolenaar  END
1054006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1055006ad48bSBram Moolenaarenddef
1056006ad48bSBram Moolenaar
105737c83711SBram Moolenaardef Test_cexpr_vimscript()
1058f5be8cdbSBram Moolenaar  # only checks line continuation
105937c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
106037c83711SBram Moolenaar  let lines =<< trim END
106137c83711SBram Moolenaar      vim9script
106237c83711SBram Moolenaar      cexpr 'File'
106337c83711SBram Moolenaar                .. ' someFile' ..
106437c83711SBram Moolenaar                   ' line 19'
106537c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
106637c83711SBram Moolenaar  END
106737c83711SBram Moolenaar  CheckScriptSuccess(lines)
106837c83711SBram Moolenaar  set errorformat&
106937c83711SBram Moolenaarenddef
107037c83711SBram Moolenaar
1071b209750bSBram Moolenaardef Test_list_vimscript()
1072b209750bSBram Moolenaar  # checks line continuation and comments
1073b209750bSBram Moolenaar  let lines =<< trim END
1074b209750bSBram Moolenaar      vim9script
1075b209750bSBram Moolenaar      let mylist = [
1076b209750bSBram Moolenaar            'one',
1077b209750bSBram Moolenaar            # comment
1078b209750bSBram Moolenaar            'two', # empty line follows
1079b209750bSBram Moolenaar
1080b209750bSBram Moolenaar            'three',
1081b209750bSBram Moolenaar            ]
1082b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1083b209750bSBram Moolenaar  END
1084b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1085b209750bSBram Moolenaarenddef
1086b209750bSBram Moolenaar
10872a1381c3SBram Moolenaarif has('channel')
108840ee466cSBram Moolenaar  let someJob = test_null_job()
108940ee466cSBram Moolenaar
109040ee466cSBram Moolenaar  def FuncWithError()
109140ee466cSBram Moolenaar    echomsg g:someJob
109240ee466cSBram Moolenaar  enddef
109340ee466cSBram Moolenaar
109440ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
109540ee466cSBram Moolenaar    try
109640ee466cSBram Moolenaar      call FuncWithError()
109740ee466cSBram Moolenaar    catch
109840ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
109940ee466cSBram Moolenaar    endtry
110040ee466cSBram Moolenaar  endfunc
11012a1381c3SBram Moolenaarendif
110240ee466cSBram Moolenaar
11038a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
11048a7d6542SBram Moolenaar  vim9script
11058a7d6542SBram Moolenaar  let name: string = 'bob'
11068a7d6542SBram Moolenaar  def Concat(arg: string): string
11078a7d6542SBram Moolenaar    return name .. arg
11088a7d6542SBram Moolenaar  enddef
1109227a69deSBram Moolenaar  g:result = Concat('bie')
1110227a69deSBram Moolenaar  g:localname = name
11118a7d6542SBram Moolenaar
11128a7d6542SBram Moolenaar  export const CONST = 1234
11138a7d6542SBram Moolenaar  export let exported = 9876
11146e587dcbSBram Moolenaar  export let exp_name = 'John'
11158a7d6542SBram Moolenaar  export def Exported(): string
11168a7d6542SBram Moolenaar    return 'Exported'
11178a7d6542SBram Moolenaar  enddef
11188a7d6542SBram MoolenaarEND
11198a7d6542SBram Moolenaar
11205269bd2aSBram Moolenaardef Test_vim9_import_export()
11218a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11228a7d6542SBram Moolenaar    vim9script
11238a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11248a7d6542SBram Moolenaar    g:imported = exported
11256e587dcbSBram Moolenaar    exported += 3
11266e587dcbSBram Moolenaar    g:imported_added = exported
11278a7d6542SBram Moolenaar    g:imported_func = Exported()
11286e587dcbSBram Moolenaar
112940f4f7a4SBram Moolenaar    def GetExported(): string
113040f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
113140f4f7a4SBram Moolenaar      return local_dict.ref()
113240f4f7a4SBram Moolenaar    enddef
113340f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
113440f4f7a4SBram Moolenaar
11356e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11366e587dcbSBram Moolenaar    g:imported_name = exp_name
11376e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11386e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11395381c7a1SBram Moolenaar    g:imported_later = exported
11408a7d6542SBram Moolenaar  END
11418a7d6542SBram Moolenaar
11428a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11438a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11448a7d6542SBram Moolenaar
11458a7d6542SBram Moolenaar  source Ximport.vim
11468a7d6542SBram Moolenaar
11478a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11488a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11498a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11506e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11515381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11528a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
115340f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11546e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11556e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11568a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11578a7d6542SBram Moolenaar
11588a7d6542SBram Moolenaar  unlet g:result
11598a7d6542SBram Moolenaar  unlet g:localname
11608a7d6542SBram Moolenaar  unlet g:imported
11616e587dcbSBram Moolenaar  unlet g:imported_added
11625381c7a1SBram Moolenaar  unlet g:imported_later
11638a7d6542SBram Moolenaar  unlet g:imported_func
11646e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11658a7d6542SBram Moolenaar  delete('Ximport.vim')
1166f2d5c240SBram Moolenaar
11671c991144SBram Moolenaar  # similar, with line breaks
11681c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11691c991144SBram Moolenaar    vim9script
11701c991144SBram Moolenaar    import {
11711c991144SBram Moolenaar        exported,
11721c991144SBram Moolenaar        Exported,
11731c991144SBram Moolenaar        }
11741c991144SBram Moolenaar        from
11751c991144SBram Moolenaar        './Xexport.vim'
11761c991144SBram Moolenaar    g:imported = exported
11771c991144SBram Moolenaar    exported += 5
11781c991144SBram Moolenaar    g:imported_added = exported
11791c991144SBram Moolenaar    g:imported_func = Exported()
11801c991144SBram Moolenaar  END
11811c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11821c991144SBram Moolenaar  source Ximport_lbr.vim
11831c991144SBram Moolenaar
11841c991144SBram Moolenaar  assert_equal(9876, g:imported)
11851c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11861c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11871c991144SBram Moolenaar
11881c991144SBram Moolenaar  # exported script not sourced again
11891c991144SBram Moolenaar  assert_false(exists('g:result'))
11901c991144SBram Moolenaar  unlet g:imported
11911c991144SBram Moolenaar  unlet g:imported_added
11921c991144SBram Moolenaar  unlet g:imported_func
11931c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11941c991144SBram Moolenaar
11951c991144SBram Moolenaar  # import inside :def function
11965381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
11975381c7a1SBram Moolenaar    vim9script
11985381c7a1SBram Moolenaar    def ImportInDef()
11995381c7a1SBram Moolenaar      import exported from './Xexport.vim'
12005381c7a1SBram Moolenaar      g:imported = exported
12015381c7a1SBram Moolenaar      exported += 7
12025381c7a1SBram Moolenaar      g:imported_added = exported
12035381c7a1SBram Moolenaar    enddef
12045381c7a1SBram Moolenaar    ImportInDef()
12055381c7a1SBram Moolenaar  END
12065381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
12075381c7a1SBram Moolenaar  source Ximport2.vim
1208f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12095381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12105381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12115381c7a1SBram Moolenaar  unlet g:imported
12125381c7a1SBram Moolenaar  unlet g:imported_added
12135381c7a1SBram Moolenaar  delete('Ximport2.vim')
12145381c7a1SBram Moolenaar
1215f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1216f2d5c240SBram Moolenaar    vim9script
1217f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1218f2d5c240SBram Moolenaar    def UseExport()
1219f2d5c240SBram Moolenaar      g:imported = Export.exported
1220f2d5c240SBram Moolenaar    enddef
1221f2d5c240SBram Moolenaar    UseExport()
1222f2d5c240SBram Moolenaar  END
1223f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1224f2d5c240SBram Moolenaar  source Ximport.vim
12255381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1226f2d5c240SBram Moolenaar
1227599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1228599c89c8SBram Moolenaar    vim9script
1229599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1230599c89c8SBram Moolenaar    def Func()
1231599c89c8SBram Moolenaar      let dummy = 1
1232599c89c8SBram Moolenaar      let imported = Export + dummy
1233599c89c8SBram Moolenaar    enddef
1234822ba247SBram Moolenaar    defcompile
1235599c89c8SBram Moolenaar  END
1236599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1237599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1238599c89c8SBram Moolenaar
1239599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1240599c89c8SBram Moolenaar    vim9script
1241599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1242599c89c8SBram Moolenaar    def Func()
1243599c89c8SBram Moolenaar      let imported = Export . exported
1244599c89c8SBram Moolenaar    enddef
1245822ba247SBram Moolenaar    defcompile
1246599c89c8SBram Moolenaar  END
1247599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1248599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1249599c89c8SBram Moolenaar
1250599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1251599c89c8SBram Moolenaar    vim9script
1252599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1253599c89c8SBram Moolenaar    def Func()
1254599c89c8SBram Moolenaar      let imported = Export.
1255599c89c8SBram Moolenaar    enddef
1256822ba247SBram Moolenaar    defcompile
1257599c89c8SBram Moolenaar  END
1258599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1259599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1260599c89c8SBram Moolenaar
12611c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12621c991144SBram Moolenaar    vim9script
12631c991144SBram Moolenaar    import *
12641c991144SBram Moolenaar        as Export
12651c991144SBram Moolenaar        from
12661c991144SBram Moolenaar        './Xexport.vim'
12671c991144SBram Moolenaar    def UseExport()
12681c991144SBram Moolenaar      g:imported = Export.exported
12691c991144SBram Moolenaar    enddef
12701c991144SBram Moolenaar    UseExport()
12711c991144SBram Moolenaar  END
12721c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12731c991144SBram Moolenaar  source Ximport.vim
12741c991144SBram Moolenaar  assert_equal(9883, g:imported)
12751c991144SBram Moolenaar
1276f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1277f2d5c240SBram Moolenaar    vim9script
1278f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1279f2d5c240SBram Moolenaar  END
1280f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1281f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1282f2d5c240SBram Moolenaar
1283f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1284fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1285fa29c8abSBram Moolenaar    vim9script
1286fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1287fa29c8abSBram Moolenaar  END
1288fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1289fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1290fa29c8abSBram Moolenaar
1291f5be8cdbSBram Moolenaar  # try to import something that is already defined
12925269bd2aSBram Moolenaar  let import_already_defined =<< trim END
12935269bd2aSBram Moolenaar    vim9script
12945269bd2aSBram Moolenaar    let exported = 'something'
12955269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12965269bd2aSBram Moolenaar  END
12975269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12985269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12995269bd2aSBram Moolenaar
1300f5be8cdbSBram Moolenaar  # try to import something that is already defined
13015269bd2aSBram Moolenaar  import_already_defined =<< trim END
13025269bd2aSBram Moolenaar    vim9script
13035269bd2aSBram Moolenaar    let exported = 'something'
13045269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13055269bd2aSBram Moolenaar  END
13065269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13075269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13085269bd2aSBram Moolenaar
1309f5be8cdbSBram Moolenaar  # try to import something that is already defined
13105269bd2aSBram Moolenaar  import_already_defined =<< trim END
13115269bd2aSBram Moolenaar    vim9script
13125269bd2aSBram Moolenaar    let exported = 'something'
13135269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13145269bd2aSBram Moolenaar  END
13155269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13165269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13175269bd2aSBram Moolenaar
1318f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1319fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1320fa29c8abSBram Moolenaar    vim9script
1321fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1322fa29c8abSBram Moolenaar  END
1323fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1324fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1325fa29c8abSBram Moolenaar
1326fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1327fa29c8abSBram Moolenaar    vim9script
1328fa29c8abSBram Moolenaar    import name './Xexport.vim'
1329fa29c8abSBram Moolenaar  END
1330fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1331fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1332fa29c8abSBram Moolenaar
1333fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1334fa29c8abSBram Moolenaar    vim9script
1335fa29c8abSBram Moolenaar    import name from Xexport.vim
1336fa29c8abSBram Moolenaar  END
1337fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1338fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1339fa29c8abSBram Moolenaar
1340fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1341fa29c8abSBram Moolenaar    vim9script
1342fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1343fa29c8abSBram Moolenaar  END
1344fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1345fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1346fa29c8abSBram Moolenaar
1347fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1348fa29c8abSBram Moolenaar    vim9script
1349fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1350fa29c8abSBram Moolenaar  END
13515269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13525269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1353fa29c8abSBram Moolenaar
1354f2d5c240SBram Moolenaar  delete('Ximport.vim')
13555269bd2aSBram Moolenaar  delete('Ximport3.vim')
13568a7d6542SBram Moolenaar  delete('Xexport.vim')
13578a7d6542SBram Moolenaar
1358f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1359750802b5SBram Moolenaar  set cpo&vi
1360750802b5SBram Moolenaar  let cpo_before = &cpo
1361750802b5SBram Moolenaar  let lines =<< trim END
1362750802b5SBram Moolenaar    vim9script
1363750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1364750802b5SBram Moolenaar  END
1365750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1366750802b5SBram Moolenaar  source Xvim9_script
1367750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1368750802b5SBram Moolenaar  set cpo&vim
1369750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1370750802b5SBram Moolenaar  delete('Xvim9_script')
1371750802b5SBram Moolenaarenddef
1372750802b5SBram Moolenaar
1373803af686SBram Moolenaarfunc g:Trigger()
1374803af686SBram Moolenaar  source Ximport.vim
1375803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1376803af686SBram Moolenaarendfunc
1377803af686SBram Moolenaar
1378803af686SBram Moolenaardef Test_import_export_expr_map()
1379803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1380803af686SBram Moolenaar  let export_lines =<< trim END
1381803af686SBram Moolenaar    vim9script
1382803af686SBram Moolenaar    export def That(): string
1383803af686SBram Moolenaar      return 'yes'
1384803af686SBram Moolenaar    enddef
1385803af686SBram Moolenaar  END
1386803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1387803af686SBram Moolenaar
1388803af686SBram Moolenaar  let import_lines =<< trim END
1389803af686SBram Moolenaar    vim9script
1390803af686SBram Moolenaar    import That from './Xexport_that.vim'
1391803af686SBram Moolenaar    assert_equal('yes', That())
1392803af686SBram Moolenaar  END
1393803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1394803af686SBram Moolenaar
1395803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1396803af686SBram Moolenaar  feedkeys('trigger', "xt")
1397803af686SBram Moolenaar
1398803af686SBram Moolenaar  delete('Xexport.vim')
1399803af686SBram Moolenaar  delete('Ximport.vim')
1400803af686SBram Moolenaar  nunmap trigger
1401803af686SBram Moolenaarenddef
1402803af686SBram Moolenaar
14038e1986e3SBram Moolenaardef Test_import_in_filetype()
14048e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14058e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
14068e1986e3SBram Moolenaar  let export_lines =<< trim END
14078e1986e3SBram Moolenaar    vim9script
14088e1986e3SBram Moolenaar    export let That = 'yes'
14098e1986e3SBram Moolenaar  END
14108e1986e3SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_that.vim')
14118e1986e3SBram Moolenaar
14128e1986e3SBram Moolenaar  let import_lines =<< trim END
14138e1986e3SBram Moolenaar    vim9script
14148e1986e3SBram Moolenaar    import That from './Xexport_that.vim'
14158e1986e3SBram Moolenaar    assert_equal('yes', That)
14168e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14178e1986e3SBram Moolenaar  END
14188e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14198e1986e3SBram Moolenaar
14208e1986e3SBram Moolenaar  let save_rtp = &rtp
14218e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14228e1986e3SBram Moolenaar
14238e1986e3SBram Moolenaar  filetype plugin on
14248e1986e3SBram Moolenaar  copen
14258e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14268e1986e3SBram Moolenaar
14278e1986e3SBram Moolenaar  quit!
14288e1986e3SBram Moolenaar  delete('Xexport.vim')
14298e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14308e1986e3SBram Moolenaar  &rtp = save_rtp
14318e1986e3SBram Moolenaarenddef
14328e1986e3SBram Moolenaar
1433750802b5SBram Moolenaardef Test_vim9script_fails()
14348a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14358a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1436750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
14379721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
14389b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1439750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1440750802b5SBram Moolenaar
1441c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1442c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1443c785b9a7SBram Moolenaar
1444750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1445a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
14468a7d6542SBram Moolenaarenddef
14478a7d6542SBram Moolenaar
1448f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1449101f4810SBram Moolenaar  CheckRunVimInTerminal
1450101f4810SBram Moolenaar
14519bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1452c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14539bb3eb3eSBram Moolenaarendfunc
14549bb3eb3eSBram Moolenaar
1455c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1456101f4810SBram Moolenaar  let export =<< trim END
1457101f4810SBram Moolenaar    vim9script
1458101f4810SBram Moolenaar    export def Foo(): number
1459101f4810SBram Moolenaar        return 0
1460101f4810SBram Moolenaar    enddef
1461101f4810SBram Moolenaar  END
14629bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1463101f4810SBram Moolenaar
14649bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
14659bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14669bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1467101f4810SBram Moolenaar
14689bb3eb3eSBram Moolenaar  delete('Xexport.vim')
14699bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14709bb3eb3eSBram Moolenaarenddef
1471101f4810SBram Moolenaar
14724c17ad94SBram Moolenaardef Test_vim9script_reload_import()
14738a7d6542SBram Moolenaar  let lines =<< trim END
14748a7d6542SBram Moolenaar    vim9script
14758a7d6542SBram Moolenaar    const var = ''
14768a7d6542SBram Moolenaar    let valone = 1234
14778a7d6542SBram Moolenaar    def MyFunc(arg: string)
14788a7d6542SBram Moolenaar       valone = 5678
14798a7d6542SBram Moolenaar    enddef
14808a7d6542SBram Moolenaar  END
14818a7d6542SBram Moolenaar  let morelines =<< trim END
14828a7d6542SBram Moolenaar    let valtwo = 222
14838a7d6542SBram Moolenaar    export def GetValtwo(): number
14848a7d6542SBram Moolenaar      return valtwo
14858a7d6542SBram Moolenaar    enddef
14868a7d6542SBram Moolenaar  END
148703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14888a7d6542SBram Moolenaar  source Xreload.vim
14898a7d6542SBram Moolenaar  source Xreload.vim
14908a7d6542SBram Moolenaar  source Xreload.vim
14918a7d6542SBram Moolenaar
14928a7d6542SBram Moolenaar  let testlines =<< trim END
14938a7d6542SBram Moolenaar    vim9script
14948a7d6542SBram Moolenaar    def TheFunc()
14958a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14968a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14978a7d6542SBram Moolenaar    enddef
14988a7d6542SBram Moolenaar    TheFunc()
14998a7d6542SBram Moolenaar  END
15008a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15018a7d6542SBram Moolenaar  source Ximport.vim
15028a7d6542SBram Moolenaar
1503f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1504f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15058a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15068a7d6542SBram Moolenaar  source Ximport.vim
15078a7d6542SBram Moolenaar
1508f5be8cdbSBram Moolenaar  # cannot declare a var twice
15098a7d6542SBram Moolenaar  lines =<< trim END
15108a7d6542SBram Moolenaar    vim9script
15118a7d6542SBram Moolenaar    let valone = 1234
15128a7d6542SBram Moolenaar    let valone = 5678
15138a7d6542SBram Moolenaar  END
15148a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15158a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
15168a7d6542SBram Moolenaar
15178a7d6542SBram Moolenaar  delete('Xreload.vim')
15188a7d6542SBram Moolenaar  delete('Ximport.vim')
15198a7d6542SBram Moolenaarenddef
15208a7d6542SBram Moolenaar
1521fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1522fe465a01SBram Moolenaar" script-local name.
1523fe465a01SBram Moolenaardef Test_vim9script_funcref()
1524fe465a01SBram Moolenaar  let sortlines =<< trim END
1525fe465a01SBram Moolenaar      vim9script
1526fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1527bed36b93SBram Moolenaar        return i2 - i1
1528fe465a01SBram Moolenaar      enddef
1529fe465a01SBram Moolenaar
1530fe465a01SBram Moolenaar      export def FastSort(): list<number>
1531fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1532fe465a01SBram Moolenaar      enddef
1533fe465a01SBram Moolenaar  END
1534fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1535fe465a01SBram Moolenaar
1536fe465a01SBram Moolenaar  let lines =<< trim END
1537fe465a01SBram Moolenaar    vim9script
1538fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1539fe465a01SBram Moolenaar    def Test()
1540fe465a01SBram Moolenaar      g:result = FastSort()
1541fe465a01SBram Moolenaar    enddef
1542fe465a01SBram Moolenaar    Test()
1543fe465a01SBram Moolenaar  END
1544fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1545fe465a01SBram Moolenaar
1546fe465a01SBram Moolenaar  source Xscript.vim
1547fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1548fe465a01SBram Moolenaar
1549fe465a01SBram Moolenaar  unlet g:result
1550fe465a01SBram Moolenaar  delete('Xsort.vim')
1551fe465a01SBram Moolenaar  delete('Xscript.vim')
1552fe465a01SBram Moolenaarenddef
1553fe465a01SBram Moolenaar
1554c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1555c620c055SBram Moolenaar" script where FastFilter() is called from.
1556c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1557c620c055SBram Moolenaar  let filterLines =<< trim END
1558c620c055SBram Moolenaar    vim9script
1559c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1560c620c055SBram Moolenaar      return idx % 2 == 1
1561c620c055SBram Moolenaar    enddef
1562c620c055SBram Moolenaar    export def FastFilter(): list<number>
1563c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1564c620c055SBram Moolenaar    enddef
1565c620c055SBram Moolenaar  END
1566c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1567c620c055SBram Moolenaar
1568c620c055SBram Moolenaar  let lines =<< trim END
1569c620c055SBram Moolenaar    vim9script
1570c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1571c620c055SBram Moolenaar    def Test()
1572c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1573c620c055SBram Moolenaar    enddef
1574c620c055SBram Moolenaar    Test()
1575c620c055SBram Moolenaar  END
1576c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1577c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1578c620c055SBram Moolenaar
1579c620c055SBram Moolenaar  delete('Xfilter.vim')
1580c620c055SBram Moolenaar  delete('Ximport.vim')
1581c620c055SBram Moolenaarenddef
1582c620c055SBram Moolenaar
15834c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
15844c17ad94SBram Moolenaar  let first_lines =<< trim END
15854c17ad94SBram Moolenaar    vim9script
15864c17ad94SBram Moolenaar    def FuncYes(): string
15874c17ad94SBram Moolenaar      return 'yes'
15884c17ad94SBram Moolenaar    enddef
15894c17ad94SBram Moolenaar  END
159003afdcf1SBram Moolenaar  let withno_lines =<< trim END
15914c17ad94SBram Moolenaar    def FuncNo(): string
15924c17ad94SBram Moolenaar      return 'no'
15934c17ad94SBram Moolenaar    enddef
15944c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15954c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15964c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
159703afdcf1SBram Moolenaar    enddef
159803afdcf1SBram Moolenaar  END
159903afdcf1SBram Moolenaar  let nono_lines =<< trim END
160003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
160103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
16024c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
16034c17ad94SBram Moolenaar    enddef
16044c17ad94SBram Moolenaar  END
16054c17ad94SBram Moolenaar
16064c17ad94SBram Moolenaar  # FuncNo() is defined
160703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16084c17ad94SBram Moolenaar  source Xreloaded.vim
16094c17ad94SBram Moolenaar  g:DoCheck(true)
16104c17ad94SBram Moolenaar
16114c17ad94SBram Moolenaar  # FuncNo() is not redefined
161203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16134c17ad94SBram Moolenaar  source Xreloaded.vim
161403afdcf1SBram Moolenaar  g:DoCheck()
16154c17ad94SBram Moolenaar
16164c17ad94SBram Moolenaar  # FuncNo() is back
161703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16184c17ad94SBram Moolenaar  source Xreloaded.vim
161903afdcf1SBram Moolenaar  g:DoCheck()
16204c17ad94SBram Moolenaar
16214c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16224c17ad94SBram Moolenaarenddef
16234c17ad94SBram Moolenaar
162489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
162589483d40SBram Moolenaar  # write the script with a script-local variable
162689483d40SBram Moolenaar  let lines =<< trim END
162789483d40SBram Moolenaar    vim9script
162889483d40SBram Moolenaar    let var = 'string'
162989483d40SBram Moolenaar  END
163089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
163189483d40SBram Moolenaar  source XreloadVar.vim
163289483d40SBram Moolenaar
163389483d40SBram Moolenaar  # now write the script using the same variable locally - works
163489483d40SBram Moolenaar  lines =<< trim END
163589483d40SBram Moolenaar    vim9script
163689483d40SBram Moolenaar    def Func()
163789483d40SBram Moolenaar      let var = 'string'
163889483d40SBram Moolenaar    enddef
163989483d40SBram Moolenaar  END
164089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
164189483d40SBram Moolenaar  source XreloadVar.vim
164289483d40SBram Moolenaar
164389483d40SBram Moolenaar  delete('XreloadVar.vim')
164489483d40SBram Moolenaarenddef
164589483d40SBram Moolenaar
16468a7d6542SBram Moolenaardef Test_import_absolute()
16478a7d6542SBram Moolenaar  let import_lines = [
1648e6085c53SBram Moolenaar        'vim9script',
1649e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1650e6085c53SBram Moolenaar        'def UseExported()',
1651e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1652e6085c53SBram Moolenaar        '  exported = 8888',
1653e6085c53SBram Moolenaar        '  g:imported_after = exported',
1654e6085c53SBram Moolenaar        'enddef',
1655e6085c53SBram Moolenaar        'UseExported()',
1656e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1657e6085c53SBram Moolenaar        ]
16588a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16598a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16608a7d6542SBram Moolenaar
16618a7d6542SBram Moolenaar  source Ximport_abs.vim
16628a7d6542SBram Moolenaar
16638a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16644e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1665675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1666675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1667675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1668675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1669675f716eSBram Moolenaar          'exported = 8888.*' ..
1670675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1671675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1672675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1673675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1674e6085c53SBram Moolenaar        g:import_disassembled)
16758a7d6542SBram Moolenaar  unlet g:imported_abs
16764e12a5dfSBram Moolenaar  unlet g:import_disassembled
16778a7d6542SBram Moolenaar
16788a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16798a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16808a7d6542SBram Moolenaarenddef
16818a7d6542SBram Moolenaar
16828a7d6542SBram Moolenaardef Test_import_rtp()
16838a7d6542SBram Moolenaar  let import_lines = [
1684e6085c53SBram Moolenaar        'vim9script',
1685e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1686e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1687e6085c53SBram Moolenaar        ]
16888a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16898a7d6542SBram Moolenaar  mkdir('import')
16908a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16918a7d6542SBram Moolenaar
16928a7d6542SBram Moolenaar  let save_rtp = &rtp
16938a7d6542SBram Moolenaar  &rtp = getcwd()
16948a7d6542SBram Moolenaar  source Ximport_rtp.vim
16958a7d6542SBram Moolenaar  &rtp = save_rtp
16968a7d6542SBram Moolenaar
16978a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16988a7d6542SBram Moolenaar  unlet g:imported_rtp
16998a7d6542SBram Moolenaar
17008a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
170189483d40SBram Moolenaar  delete('import', 'rf')
17028a7d6542SBram Moolenaarenddef
17038a7d6542SBram Moolenaar
170425e0f586SBram Moolenaardef Test_import_compile_error()
170525e0f586SBram Moolenaar  let export_lines = [
170625e0f586SBram Moolenaar        'vim9script',
170725e0f586SBram Moolenaar        'export def ExpFunc(): string',
170825e0f586SBram Moolenaar        '  return notDefined',
170925e0f586SBram Moolenaar        'enddef',
171025e0f586SBram Moolenaar        ]
171125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
171225e0f586SBram Moolenaar
171325e0f586SBram Moolenaar  let import_lines = [
171425e0f586SBram Moolenaar        'vim9script',
171525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
171625e0f586SBram Moolenaar        'def ImpFunc()',
171725e0f586SBram Moolenaar        '  echo ExpFunc()',
171825e0f586SBram Moolenaar        'enddef',
171925e0f586SBram Moolenaar        'defcompile',
172025e0f586SBram Moolenaar        ]
172125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
172225e0f586SBram Moolenaar
172325e0f586SBram Moolenaar  try
172425e0f586SBram Moolenaar    source Ximport.vim
172525e0f586SBram Moolenaar  catch /E1001/
1726f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
172725e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
172825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
172925e0f586SBram Moolenaar  endtry
173025e0f586SBram Moolenaar
173125e0f586SBram Moolenaar  delete('Xexported.vim')
173225e0f586SBram Moolenaar  delete('Ximport.vim')
173325e0f586SBram Moolenaarenddef
173425e0f586SBram Moolenaar
1735eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1736eef2102eSBram Moolenaar  let export_lines =<< trim END
1737eef2102eSBram Moolenaar      vim9script
1738eef2102eSBram Moolenaar      export def Func()
1739eef2102eSBram Moolenaar        echo 'imported'
1740eef2102eSBram Moolenaar      enddef
1741eef2102eSBram Moolenaar  END
1742eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1743eef2102eSBram Moolenaar
1744eef2102eSBram Moolenaar  let lines =<< trim END
1745eef2102eSBram Moolenaar    vim9script
1746eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1747eef2102eSBram Moolenaar    def Func()
1748eef2102eSBram Moolenaar      echo 'local to function'
1749eef2102eSBram Moolenaar    enddef
1750eef2102eSBram Moolenaar  END
1751eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1752eef2102eSBram Moolenaar
1753eef2102eSBram Moolenaar  lines =<< trim END
1754eef2102eSBram Moolenaar    vim9script
1755eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1756eef2102eSBram Moolenaar    def Outer()
1757eef2102eSBram Moolenaar      def Func()
1758eef2102eSBram Moolenaar        echo 'local to function'
1759eef2102eSBram Moolenaar      enddef
1760eef2102eSBram Moolenaar    enddef
1761eef2102eSBram Moolenaar    defcompile
1762eef2102eSBram Moolenaar  END
1763eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1764eef2102eSBram Moolenaar
1765eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1766eef2102eSBram Moolenaarenddef
1767eef2102eSBram Moolenaar
1768b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1769b9a2cac3SBram Moolenaar  let lines =<< trim END
1770b9a2cac3SBram Moolenaar    vim9script
1771b9a2cac3SBram Moolenaar    def Func()
1772b9a2cac3SBram Moolenaar      echo 'one'
1773b9a2cac3SBram Moolenaar    enddef
1774b9a2cac3SBram Moolenaar    def Func()
1775b9a2cac3SBram Moolenaar      echo 'two'
1776b9a2cac3SBram Moolenaar    enddef
1777b9a2cac3SBram Moolenaar  END
1778b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1779fa211f3cSBram Moolenaar
1780fa211f3cSBram Moolenaar  lines =<< trim END
1781fa211f3cSBram Moolenaar    vim9script
1782fa211f3cSBram Moolenaar    def Foo(): string
1783fa211f3cSBram Moolenaar      return 'foo'
1784fa211f3cSBram Moolenaar      enddef
1785fa211f3cSBram Moolenaar    def Func()
1786fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1787fa211f3cSBram Moolenaar    enddef
1788fa211f3cSBram Moolenaar    defcompile
1789fa211f3cSBram Moolenaar  END
1790fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1791b9a2cac3SBram Moolenaarenddef
1792b9a2cac3SBram Moolenaar
17938a7d6542SBram Moolenaardef Test_fixed_size_list()
1794f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
17958a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
17968a7d6542SBram Moolenaar  l->remove(0)
17978a7d6542SBram Moolenaar  l->add(5)
17988a7d6542SBram Moolenaar  l->insert(99, 1)
17990f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18008a7d6542SBram Moolenaarenddef
18018a7d6542SBram Moolenaar
1802ae616494SBram Moolenaardef Test_no_insert_xit()
1803ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1804ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1805f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1806f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1807f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1808ae616494SBram Moolenaar
1809ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1810ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1811ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1812ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1813f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1814f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1815f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1816f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1817f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1818ae616494SBram Moolenaarenddef
1819ae616494SBram Moolenaar
1820158906cfSBram Moolenaardef IfElse(what: number): string
1821158906cfSBram Moolenaar  let res = ''
1822158906cfSBram Moolenaar  if what == 1
1823158906cfSBram Moolenaar    res = "one"
1824158906cfSBram Moolenaar  elseif what == 2
1825158906cfSBram Moolenaar    res = "two"
1826a259d8d3SBram Moolenaar  else
1827158906cfSBram Moolenaar    res = "three"
1828a259d8d3SBram Moolenaar  endif
1829158906cfSBram Moolenaar  return res
1830a259d8d3SBram Moolenaarenddef
1831a259d8d3SBram Moolenaar
1832158906cfSBram Moolenaardef Test_if_elseif_else()
1833158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1834158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1835158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18360f18b6d1SBram Moolenaarenddef
18370f18b6d1SBram Moolenaar
1838e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1839e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1840e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1841e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1842e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1843585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1844e8c4abbbSBram Moolenaarenddef
1845e8c4abbbSBram Moolenaar
18466d69bf60SBram Moolenaarlet g:bool_true = v:true
18476d69bf60SBram Moolenaarlet g:bool_false = v:false
18486d69bf60SBram Moolenaar
18496d69bf60SBram Moolenaardef Test_if_const_expr()
18506d69bf60SBram Moolenaar  let res = false
18516d69bf60SBram Moolenaar  if true ? true : false
18526d69bf60SBram Moolenaar    res = true
18536d69bf60SBram Moolenaar  endif
18546d69bf60SBram Moolenaar  assert_equal(true, res)
18556d69bf60SBram Moolenaar
1856585fea7bSBram Moolenaar  g:glob = 2
1857585fea7bSBram Moolenaar  if false
18586797966dSBram Moolenaar    execute('g:glob = 3')
1859585fea7bSBram Moolenaar  endif
1860585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1861585fea7bSBram Moolenaar  if true
18626797966dSBram Moolenaar    execute('g:glob = 3')
1863585fea7bSBram Moolenaar  endif
1864585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1865585fea7bSBram Moolenaar
18666d69bf60SBram Moolenaar  res = false
18676d69bf60SBram Moolenaar  if g:bool_true ? true : false
18686d69bf60SBram Moolenaar    res = true
18696d69bf60SBram Moolenaar  endif
18706d69bf60SBram Moolenaar  assert_equal(true, res)
18716d69bf60SBram Moolenaar
18726d69bf60SBram Moolenaar  res = false
18736d69bf60SBram Moolenaar  if true ? g:bool_true : false
18746d69bf60SBram Moolenaar    res = true
18756d69bf60SBram Moolenaar  endif
18766d69bf60SBram Moolenaar  assert_equal(true, res)
18776d69bf60SBram Moolenaar
18786d69bf60SBram Moolenaar  res = false
18796d69bf60SBram Moolenaar  if true ? true : g:bool_false
18806d69bf60SBram Moolenaar    res = true
18816d69bf60SBram Moolenaar  endif
18826d69bf60SBram Moolenaar  assert_equal(true, res)
18836d69bf60SBram Moolenaar
18846d69bf60SBram Moolenaar  res = false
18856d69bf60SBram Moolenaar  if true ? false : true
18866d69bf60SBram Moolenaar    res = true
18876d69bf60SBram Moolenaar  endif
18886d69bf60SBram Moolenaar  assert_equal(false, res)
18896d69bf60SBram Moolenaar
18906d69bf60SBram Moolenaar  res = false
18916d69bf60SBram Moolenaar  if false ? false : true
18926d69bf60SBram Moolenaar    res = true
18936d69bf60SBram Moolenaar  endif
18946d69bf60SBram Moolenaar  assert_equal(true, res)
18956d69bf60SBram Moolenaar
18966d69bf60SBram Moolenaar  res = false
18976d69bf60SBram Moolenaar  if false ? true : false
18986d69bf60SBram Moolenaar    res = true
18996d69bf60SBram Moolenaar  endif
19006d69bf60SBram Moolenaar  assert_equal(false, res)
19016d69bf60SBram Moolenaar
19026d69bf60SBram Moolenaar  res = false
1903e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1904e8c4abbbSBram Moolenaar    res = true
1905e8c4abbbSBram Moolenaar  endif
1906e8c4abbbSBram Moolenaar  assert_equal(false, res)
1907e8c4abbbSBram Moolenaar
1908e8c4abbbSBram Moolenaar  res = false
19096d69bf60SBram Moolenaar  if true && true
19106d69bf60SBram Moolenaar    res = true
19116d69bf60SBram Moolenaar  endif
19126d69bf60SBram Moolenaar  assert_equal(true, res)
19136d69bf60SBram Moolenaar
19146d69bf60SBram Moolenaar  res = false
19156d69bf60SBram Moolenaar  if true && false
19166d69bf60SBram Moolenaar    res = true
19176d69bf60SBram Moolenaar  endif
19186d69bf60SBram Moolenaar  assert_equal(false, res)
19196d69bf60SBram Moolenaar
19206d69bf60SBram Moolenaar  res = false
19216d69bf60SBram Moolenaar  if g:bool_true && false
19226d69bf60SBram Moolenaar    res = true
19236d69bf60SBram Moolenaar  endif
19246d69bf60SBram Moolenaar  assert_equal(false, res)
19256d69bf60SBram Moolenaar
19266d69bf60SBram Moolenaar  res = false
19276d69bf60SBram Moolenaar  if true && g:bool_false
19286d69bf60SBram Moolenaar    res = true
19296d69bf60SBram Moolenaar  endif
19306d69bf60SBram Moolenaar  assert_equal(false, res)
19316d69bf60SBram Moolenaar
19326d69bf60SBram Moolenaar  res = false
19336d69bf60SBram Moolenaar  if false && false
19346d69bf60SBram Moolenaar    res = true
19356d69bf60SBram Moolenaar  endif
19366d69bf60SBram Moolenaar  assert_equal(false, res)
19376d69bf60SBram Moolenaar
19386d69bf60SBram Moolenaar  res = false
19396d69bf60SBram Moolenaar  if true || false
19406d69bf60SBram Moolenaar    res = true
19416d69bf60SBram Moolenaar  endif
19426d69bf60SBram Moolenaar  assert_equal(true, res)
19436d69bf60SBram Moolenaar
19446d69bf60SBram Moolenaar  res = false
19456d69bf60SBram Moolenaar  if g:bool_true || false
19466d69bf60SBram Moolenaar    res = true
19476d69bf60SBram Moolenaar  endif
19486d69bf60SBram Moolenaar  assert_equal(true, res)
19496d69bf60SBram Moolenaar
19506d69bf60SBram Moolenaar  res = false
19516d69bf60SBram Moolenaar  if true || g:bool_false
19526d69bf60SBram Moolenaar    res = true
19536d69bf60SBram Moolenaar  endif
19546d69bf60SBram Moolenaar  assert_equal(true, res)
19556d69bf60SBram Moolenaar
19566d69bf60SBram Moolenaar  res = false
19576d69bf60SBram Moolenaar  if false || false
19586d69bf60SBram Moolenaar    res = true
19596d69bf60SBram Moolenaar  endif
19606d69bf60SBram Moolenaar  assert_equal(false, res)
196180c34ca3SBram Moolenaarenddef
19626d69bf60SBram Moolenaar
196380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
196480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
196580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1966e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1967e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19686d69bf60SBram Moolenaarenddef
19696d69bf60SBram Moolenaar
197072abcf42SBram Moolenaardef RunNested(i: number): number
197172abcf42SBram Moolenaar  let x: number = 0
197272abcf42SBram Moolenaar  if i % 2
197372abcf42SBram Moolenaar    if 1
1974f5be8cdbSBram Moolenaar      # comment
197572abcf42SBram Moolenaar    else
1976f5be8cdbSBram Moolenaar      # comment
197772abcf42SBram Moolenaar    endif
197872abcf42SBram Moolenaar    x += 1
197972abcf42SBram Moolenaar  else
198072abcf42SBram Moolenaar    x += 1000
198172abcf42SBram Moolenaar  endif
198272abcf42SBram Moolenaar  return x
198372abcf42SBram Moolenaarenddef
198472abcf42SBram Moolenaar
198572abcf42SBram Moolenaardef Test_nested_if()
198672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
198772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
198872abcf42SBram Moolenaarenddef
198972abcf42SBram Moolenaar
1990ad39c094SBram Moolenaardef Test_execute_cmd()
1991ad39c094SBram Moolenaar  new
1992ad39c094SBram Moolenaar  setline(1, 'default')
1993ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1994ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1995a72cfb80SBram Moolenaar
1996a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1997a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1998a72cfb80SBram Moolenaar
1999ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2000ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2001a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2002ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2003a72cfb80SBram Moolenaar
2004ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2005ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2006a72cfb80SBram Moolenaar
2007ad39c094SBram Moolenaar  let cmd_first = 'call '
2008ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2009ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2010ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2011ad39c094SBram Moolenaar  bwipe!
2012585fea7bSBram Moolenaar
20132d6b20d6SBram Moolenaar  let n = true
20142d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20152d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20162d6b20d6SBram Moolenaar
2017585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
2018a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
2019ad39c094SBram Moolenaarenddef
2020ad39c094SBram Moolenaar
202147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2022f5be8cdbSBram Moolenaar  # only checks line continuation
202347e880d6SBram Moolenaar  let lines =<< trim END
202447e880d6SBram Moolenaar      vim9script
202547e880d6SBram Moolenaar      execute 'g:someVar'
202647e880d6SBram Moolenaar                .. ' = ' ..
202747e880d6SBram Moolenaar                   '28'
202847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
202947e880d6SBram Moolenaar      unlet g:someVar
203047e880d6SBram Moolenaar  END
203147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
203247e880d6SBram Moolenaarenddef
203347e880d6SBram Moolenaar
2034ad39c094SBram Moolenaardef Test_echo_cmd()
2035a72cfb80SBram Moolenaar  echo 'some' # comment
2036585fea7bSBram Moolenaar  echon 'thing'
2037ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2038ad39c094SBram Moolenaar
2039a72cfb80SBram Moolenaar  echo "some" # comment
2040a72cfb80SBram Moolenaar  echon "thing"
2041a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2042a72cfb80SBram Moolenaar
2043ad39c094SBram Moolenaar  let str1 = 'some'
2044ad39c094SBram Moolenaar  let str2 = 'more'
2045ad39c094SBram Moolenaar  echo str1 str2
2046ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2047a72cfb80SBram Moolenaar
2048a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2049ad39c094SBram Moolenaarenddef
2050ad39c094SBram Moolenaar
2051f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2052f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2053f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2054f93c7feaSBram Moolenaar  echo 'clear'
2055df069eecSBram Moolenaar  :1messages
2056f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2057f93c7feaSBram Moolenaar
2058f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2059f93c7feaSBram Moolenaarenddef
2060f93c7feaSBram Moolenaar
206147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2062f5be8cdbSBram Moolenaar  # only checks line continuation
206347e880d6SBram Moolenaar  let lines =<< trim END
206447e880d6SBram Moolenaar      vim9script
206547e880d6SBram Moolenaar      echomsg 'here'
206647e880d6SBram Moolenaar                .. ' is ' ..
206747e880d6SBram Moolenaar                   'a message'
206847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
206947e880d6SBram Moolenaar  END
207047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
207147e880d6SBram Moolenaarenddef
207247e880d6SBram Moolenaar
2073f93c7feaSBram Moolenaardef Test_echoerr_cmd()
207440ee466cSBram Moolenaar  try
207540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
207640ee466cSBram Moolenaar  catch
207740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
207840ee466cSBram Moolenaar  endtry
2079f93c7feaSBram Moolenaarenddef
2080f93c7feaSBram Moolenaar
208147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2082f5be8cdbSBram Moolenaar  # only checks line continuation
208347e880d6SBram Moolenaar  let lines =<< trim END
208447e880d6SBram Moolenaar      vim9script
208547e880d6SBram Moolenaar      try
208647e880d6SBram Moolenaar        echoerr 'this'
208747e880d6SBram Moolenaar                .. ' is ' ..
208847e880d6SBram Moolenaar                   'wrong'
208947e880d6SBram Moolenaar      catch
209047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
209147e880d6SBram Moolenaar      endtry
209247e880d6SBram Moolenaar  END
209347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
209447e880d6SBram Moolenaarenddef
209547e880d6SBram Moolenaar
209641fe0617SBram Moolenaardef Test_for_outside_of_function()
209741fe0617SBram Moolenaar  let lines =<< trim END
209841fe0617SBram Moolenaar    vim9script
209941fe0617SBram Moolenaar    new
210041fe0617SBram Moolenaar    for var in range(0, 3)
210141fe0617SBram Moolenaar      append(line('$'), var)
210241fe0617SBram Moolenaar    endfor
210341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
210441fe0617SBram Moolenaar    bwipe!
210541fe0617SBram Moolenaar  END
210641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
210741fe0617SBram Moolenaar  source Xvim9for.vim
210841fe0617SBram Moolenaar  delete('Xvim9for.vim')
210941fe0617SBram Moolenaarenddef
21108a7d6542SBram Moolenaar
2111e8c4abbbSBram Moolenaardef Test_for_loop()
2112e8c4abbbSBram Moolenaar  let result = ''
2113e8c4abbbSBram Moolenaar  for cnt in range(7)
2114e8c4abbbSBram Moolenaar    if cnt == 4
2115e8c4abbbSBram Moolenaar      break
2116e8c4abbbSBram Moolenaar    endif
2117e8c4abbbSBram Moolenaar    if cnt == 2
2118e8c4abbbSBram Moolenaar      continue
2119e8c4abbbSBram Moolenaar    endif
2120e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2121e8c4abbbSBram Moolenaar  endfor
2122e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21230ad3e894SBram Moolenaar
21240ad3e894SBram Moolenaar  let concat = ''
21250ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21260ad3e894SBram Moolenaar    concat ..= str
21270ad3e894SBram Moolenaar  endfor
21280ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2129e8c4abbbSBram Moolenaarenddef
2130e8c4abbbSBram Moolenaar
2131e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2132675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2133675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2134675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2135822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21360ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2137675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2138675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2139675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2140e8c4abbbSBram Moolenaarenddef
2141e8c4abbbSBram Moolenaar
2142d0df1aacSBram Moolenaardef Test_while_loop()
2143d0df1aacSBram Moolenaar  let result = ''
2144d0df1aacSBram Moolenaar  let cnt = 0
2145d0df1aacSBram Moolenaar  while cnt < 555
2146d0df1aacSBram Moolenaar    if cnt == 3
2147d0df1aacSBram Moolenaar      break
2148d0df1aacSBram Moolenaar    endif
2149d0df1aacSBram Moolenaar    cnt += 1
2150d0df1aacSBram Moolenaar    if cnt == 2
2151d0df1aacSBram Moolenaar      continue
2152d0df1aacSBram Moolenaar    endif
2153d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2154d0df1aacSBram Moolenaar  endwhile
2155d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2156d0df1aacSBram Moolenaarenddef
2157d0df1aacSBram Moolenaar
2158e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2159675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2160675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2161675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2162675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2163675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2164675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2165675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2166bd5da371SBram Moolenaarenddef
2167bd5da371SBram Moolenaar
21689645e2d9SBram Moolenaardef Test_interrupt_loop()
216997acfc78SBram Moolenaar  let caught = false
21709645e2d9SBram Moolenaar  let x = 0
217197acfc78SBram Moolenaar  try
21729645e2d9SBram Moolenaar    while 1
21739645e2d9SBram Moolenaar      x += 1
21749645e2d9SBram Moolenaar      if x == 100
21759645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
21769645e2d9SBram Moolenaar      endif
21779645e2d9SBram Moolenaar    endwhile
217897acfc78SBram Moolenaar  catch
217997acfc78SBram Moolenaar    caught = true
218097acfc78SBram Moolenaar    assert_equal(100, x)
218197acfc78SBram Moolenaar  endtry
218297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
21839645e2d9SBram Moolenaarenddef
218420431c9dSBram Moolenaar
21854fdae999SBram Moolenaardef Test_automatic_line_continuation()
21864fdae999SBram Moolenaar  let mylist = [
21874fdae999SBram Moolenaar      'one',
21884fdae999SBram Moolenaar      'two',
21894fdae999SBram Moolenaar      'three',
2190f5be8cdbSBram Moolenaar      ] # comment
21914fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
21924fdae999SBram Moolenaar
21934fdae999SBram Moolenaar  let mydict = {
21944fdae999SBram Moolenaar      'one': 1,
21954fdae999SBram Moolenaar      'two': 2,
21964fdae999SBram Moolenaar      'three':
21974fdae999SBram Moolenaar          3,
2198f5be8cdbSBram Moolenaar      } # comment
21994fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
22004fdae999SBram Moolenaar  mydict = #{
22012c330432SBram Moolenaar      one: 1,  # comment
22022c330432SBram Moolenaar      two:     # comment
22032c330432SBram Moolenaar           2,  # comment
22042c330432SBram Moolenaar      three: 3 # comment
22052c330432SBram Moolenaar      }
22062c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
22072c330432SBram Moolenaar  mydict = #{
22082c330432SBram Moolenaar      one: 1,
22094fdae999SBram Moolenaar      two:
22104fdae999SBram Moolenaar           2,
22112c330432SBram Moolenaar      three: 3
22124fdae999SBram Moolenaar      }
22134fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2214e6085c53SBram Moolenaar
2215e6085c53SBram Moolenaar  assert_equal(
2216e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2217e6085c53SBram Moolenaar        split('one two three')
2218e6085c53SBram Moolenaar        )
22194fdae999SBram Moolenaarenddef
22204fdae999SBram Moolenaar
22217a092245SBram Moolenaardef Test_vim9_comment()
22227a092245SBram Moolenaar  CheckScriptSuccess([
22237a092245SBram Moolenaar      'vim9script',
22247a092245SBram Moolenaar      '# something',
22257a092245SBram Moolenaar      ])
22267a092245SBram Moolenaar  CheckScriptFailure([
22277a092245SBram Moolenaar      'vim9script',
22287a092245SBram Moolenaar      ':# something',
22297a092245SBram Moolenaar      ], 'E488:')
22307a092245SBram Moolenaar  CheckScriptFailure([
22317a092245SBram Moolenaar      '# something',
22327a092245SBram Moolenaar      ], 'E488:')
22337a092245SBram Moolenaar  CheckScriptFailure([
22347a092245SBram Moolenaar      ':# something',
22357a092245SBram Moolenaar      ], 'E488:')
22367a092245SBram Moolenaar
22374a8d9f2eSBram Moolenaar  { # block start
22384a8d9f2eSBram Moolenaar  } # block end
22394a8d9f2eSBram Moolenaar  CheckDefFailure([
22404a8d9f2eSBram Moolenaar      '{# comment',
22414a8d9f2eSBram Moolenaar      ], 'E488:')
22424a8d9f2eSBram Moolenaar  CheckDefFailure([
22434a8d9f2eSBram Moolenaar      '{',
22444a8d9f2eSBram Moolenaar      '}# comment',
22454a8d9f2eSBram Moolenaar      ], 'E488:')
22464a8d9f2eSBram Moolenaar
22474a8d9f2eSBram Moolenaar  echo "yes" # comment
22484a8d9f2eSBram Moolenaar  CheckDefFailure([
22494a8d9f2eSBram Moolenaar      'echo "yes"# comment',
22504a8d9f2eSBram Moolenaar      ], 'E488:')
22517a092245SBram Moolenaar  CheckScriptSuccess([
22527a092245SBram Moolenaar      'vim9script',
22537a092245SBram Moolenaar      'echo "yes" # something',
22547a092245SBram Moolenaar      ])
22557a092245SBram Moolenaar  CheckScriptFailure([
22567a092245SBram Moolenaar      'vim9script',
22577a092245SBram Moolenaar      'echo "yes"# something',
22587a092245SBram Moolenaar      ], 'E121:')
22597a092245SBram Moolenaar  CheckScriptFailure([
22607a092245SBram Moolenaar      'vim9script',
22617a092245SBram Moolenaar      'echo# something',
22627a092245SBram Moolenaar      ], 'E121:')
22637a092245SBram Moolenaar  CheckScriptFailure([
22647a092245SBram Moolenaar      'echo "yes" # something',
22657a092245SBram Moolenaar      ], 'E121:')
22667a092245SBram Moolenaar
22674a8d9f2eSBram Moolenaar  exe "echo" # comment
22684a8d9f2eSBram Moolenaar  CheckDefFailure([
22694a8d9f2eSBram Moolenaar      'exe "echo"# comment',
22704a8d9f2eSBram Moolenaar      ], 'E488:')
22714a8d9f2eSBram Moolenaar  CheckScriptSuccess([
22724a8d9f2eSBram Moolenaar      'vim9script',
22734a8d9f2eSBram Moolenaar      'exe "echo" # something',
22744a8d9f2eSBram Moolenaar      ])
22754a8d9f2eSBram Moolenaar  CheckScriptFailure([
22764a8d9f2eSBram Moolenaar      'vim9script',
22774a8d9f2eSBram Moolenaar      'exe "echo"# something',
22784a8d9f2eSBram Moolenaar      ], 'E121:')
22794a8d9f2eSBram Moolenaar  CheckDefFailure([
22804a8d9f2eSBram Moolenaar      'exe # comment',
22814a8d9f2eSBram Moolenaar      ], 'E1015:')
22824a8d9f2eSBram Moolenaar  CheckScriptFailure([
22834a8d9f2eSBram Moolenaar      'vim9script',
22844a8d9f2eSBram Moolenaar      'exe# something',
22854a8d9f2eSBram Moolenaar      ], 'E121:')
22864a8d9f2eSBram Moolenaar  CheckScriptFailure([
22874a8d9f2eSBram Moolenaar      'exe "echo" # something',
22884a8d9f2eSBram Moolenaar      ], 'E121:')
22894a8d9f2eSBram Moolenaar
22907a092245SBram Moolenaar  CheckDefFailure([
22917a092245SBram Moolenaar      'try# comment',
22927a092245SBram Moolenaar      '  echo "yes"',
22937a092245SBram Moolenaar      'catch',
22947a092245SBram Moolenaar      'endtry',
22957a092245SBram Moolenaar      ], 'E488:')
22962c5ed4e3SBram Moolenaar  CheckScriptFailure([
22972c5ed4e3SBram Moolenaar      'vim9script',
22982c5ed4e3SBram Moolenaar      'try# comment',
22992c5ed4e3SBram Moolenaar      'echo "yes"',
23002c5ed4e3SBram Moolenaar      ], 'E488:')
23017a092245SBram Moolenaar  CheckDefFailure([
23027a092245SBram Moolenaar      'try',
2303a72cfb80SBram Moolenaar      '  throw#comment',
2304a72cfb80SBram Moolenaar      'catch',
2305a72cfb80SBram Moolenaar      'endtry',
2306a72cfb80SBram Moolenaar      ], 'E1015:')
2307a72cfb80SBram Moolenaar  CheckDefFailure([
2308a72cfb80SBram Moolenaar      'try',
2309a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2310a72cfb80SBram Moolenaar      'catch',
2311a72cfb80SBram Moolenaar      'endtry',
2312a72cfb80SBram Moolenaar      ], 'E488:')
2313a72cfb80SBram Moolenaar  CheckDefFailure([
2314a72cfb80SBram Moolenaar      'try',
23157a092245SBram Moolenaar      '  echo "yes"',
23167a092245SBram Moolenaar      'catch# comment',
23177a092245SBram Moolenaar      'endtry',
23187a092245SBram Moolenaar      ], 'E488:')
23192c5ed4e3SBram Moolenaar  CheckScriptFailure([
23202c5ed4e3SBram Moolenaar      'vim9script',
23212c5ed4e3SBram Moolenaar      'try',
23222c5ed4e3SBram Moolenaar      '  echo "yes"',
23232c5ed4e3SBram Moolenaar      'catch# comment',
23242c5ed4e3SBram Moolenaar      'endtry',
23252c5ed4e3SBram Moolenaar      ], 'E654:')
23262c5ed4e3SBram Moolenaar  CheckDefFailure([
23272c5ed4e3SBram Moolenaar      'try',
23282c5ed4e3SBram Moolenaar      '  echo "yes"',
23292c5ed4e3SBram Moolenaar      'catch /pat/# comment',
23302c5ed4e3SBram Moolenaar      'endtry',
23312c5ed4e3SBram Moolenaar      ], 'E488:')
23327a092245SBram Moolenaar  CheckDefFailure([
23337a092245SBram Moolenaar      'try',
23347a092245SBram Moolenaar      'echo "yes"',
23357a092245SBram Moolenaar      'catch',
23367a092245SBram Moolenaar      'endtry# comment',
23377a092245SBram Moolenaar      ], 'E488:')
23382c5ed4e3SBram Moolenaar  CheckScriptFailure([
23392c5ed4e3SBram Moolenaar      'vim9script',
23402c5ed4e3SBram Moolenaar      'try',
23412c5ed4e3SBram Moolenaar      '  echo "yes"',
23422c5ed4e3SBram Moolenaar      'catch',
23432c5ed4e3SBram Moolenaar      'endtry# comment',
23449b7bf9e9SBram Moolenaar      ], 'E488:')
23452c5ed4e3SBram Moolenaar
23462c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23472c5ed4e3SBram Moolenaar      'vim9script',
23482c5ed4e3SBram Moolenaar      'hi # comment',
23492c5ed4e3SBram Moolenaar      ])
23502c5ed4e3SBram Moolenaar  CheckScriptFailure([
23512c5ed4e3SBram Moolenaar      'vim9script',
23522c5ed4e3SBram Moolenaar      'hi# comment',
23532c5ed4e3SBram Moolenaar      ], 'E416:')
23541966c248SBram Moolenaar  CheckScriptSuccess([
23551966c248SBram Moolenaar      'vim9script',
23561966c248SBram Moolenaar      'hi Search # comment',
23571966c248SBram Moolenaar      ])
23581966c248SBram Moolenaar  CheckScriptFailure([
23591966c248SBram Moolenaar      'vim9script',
23601966c248SBram Moolenaar      'hi Search# comment',
23611966c248SBram Moolenaar      ], 'E416:')
23621966c248SBram Moolenaar  CheckScriptSuccess([
23631966c248SBram Moolenaar      'vim9script',
23641966c248SBram Moolenaar      'hi link This Search # comment',
23651966c248SBram Moolenaar      ])
23661966c248SBram Moolenaar  CheckScriptFailure([
23671966c248SBram Moolenaar      'vim9script',
23681966c248SBram Moolenaar      'hi link This That# comment',
23691966c248SBram Moolenaar      ], 'E413:')
23701966c248SBram Moolenaar  CheckScriptSuccess([
23711966c248SBram Moolenaar      'vim9script',
23721966c248SBram Moolenaar      'hi clear This # comment',
23731966c248SBram Moolenaar      'hi clear # comment',
23741966c248SBram Moolenaar      ])
2375f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2376f5be8cdbSBram Moolenaar  # hi clear This# comment',
23771966c248SBram Moolenaar  CheckScriptFailure([
23781966c248SBram Moolenaar      'vim9script',
23791966c248SBram Moolenaar      'hi clear# comment',
23801966c248SBram Moolenaar      ], 'E416:')
23811966c248SBram Moolenaar
23821966c248SBram Moolenaar  CheckScriptSuccess([
23831966c248SBram Moolenaar      'vim9script',
23841966c248SBram Moolenaar      'hi Group term=bold',
23851966c248SBram Moolenaar      'match Group /todo/ # comment',
23861966c248SBram Moolenaar      ])
23871966c248SBram Moolenaar  CheckScriptFailure([
23881966c248SBram Moolenaar      'vim9script',
23891966c248SBram Moolenaar      'hi Group term=bold',
23901966c248SBram Moolenaar      'match Group /todo/# comment',
23911966c248SBram Moolenaar      ], 'E488:')
23921966c248SBram Moolenaar  CheckScriptSuccess([
23931966c248SBram Moolenaar      'vim9script',
23941966c248SBram Moolenaar      'match # comment',
23951966c248SBram Moolenaar      ])
23961966c248SBram Moolenaar  CheckScriptFailure([
23971966c248SBram Moolenaar      'vim9script',
23981966c248SBram Moolenaar      'match# comment',
23991966c248SBram Moolenaar      ], 'E475:')
24001966c248SBram Moolenaar  CheckScriptSuccess([
24011966c248SBram Moolenaar      'vim9script',
24021966c248SBram Moolenaar      'match none # comment',
24031966c248SBram Moolenaar      ])
24041966c248SBram Moolenaar  CheckScriptFailure([
24051966c248SBram Moolenaar      'vim9script',
24061966c248SBram Moolenaar      'match none# comment',
24071966c248SBram Moolenaar      ], 'E475:')
24081966c248SBram Moolenaar
24091966c248SBram Moolenaar  CheckScriptSuccess([
24101966c248SBram Moolenaar      'vim9script',
24111966c248SBram Moolenaar      'menutrans clear # comment',
24121966c248SBram Moolenaar      ])
24131966c248SBram Moolenaar  CheckScriptFailure([
24141966c248SBram Moolenaar      'vim9script',
24151966c248SBram Moolenaar      'menutrans clear# comment text',
24161966c248SBram Moolenaar      ], 'E474:')
24171966c248SBram Moolenaar
24181966c248SBram Moolenaar  CheckScriptSuccess([
24191966c248SBram Moolenaar      'vim9script',
24201966c248SBram Moolenaar      'syntax clear # comment',
24211966c248SBram Moolenaar      ])
24221966c248SBram Moolenaar  CheckScriptFailure([
24231966c248SBram Moolenaar      'vim9script',
24241966c248SBram Moolenaar      'syntax clear# comment text',
24251966c248SBram Moolenaar      ], 'E28:')
24261966c248SBram Moolenaar  CheckScriptSuccess([
24271966c248SBram Moolenaar      'vim9script',
24281966c248SBram Moolenaar      'syntax keyword Word some',
24291966c248SBram Moolenaar      'syntax clear Word # comment',
24301966c248SBram Moolenaar      ])
24311966c248SBram Moolenaar  CheckScriptFailure([
24321966c248SBram Moolenaar      'vim9script',
24331966c248SBram Moolenaar      'syntax keyword Word some',
24341966c248SBram Moolenaar      'syntax clear Word# comment text',
24351966c248SBram Moolenaar      ], 'E28:')
24361966c248SBram Moolenaar
24371966c248SBram Moolenaar  CheckScriptSuccess([
24381966c248SBram Moolenaar      'vim9script',
24391966c248SBram Moolenaar      'syntax list # comment',
24401966c248SBram Moolenaar      ])
24411966c248SBram Moolenaar  CheckScriptFailure([
24421966c248SBram Moolenaar      'vim9script',
24431966c248SBram Moolenaar      'syntax list# comment text',
24441966c248SBram Moolenaar      ], 'E28:')
24451966c248SBram Moolenaar
24461966c248SBram Moolenaar  CheckScriptSuccess([
24471966c248SBram Moolenaar      'vim9script',
24481966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24491966c248SBram Moolenaar      ])
24501966c248SBram Moolenaar  CheckScriptFailure([
24511966c248SBram Moolenaar      'vim9script',
24521966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
24531966c248SBram Moolenaar      ], 'E475:')
24541966c248SBram Moolenaar
24551966c248SBram Moolenaar  CheckScriptSuccess([
24561966c248SBram Moolenaar      'vim9script',
24571966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
24581966c248SBram Moolenaar      ])
24591966c248SBram Moolenaar  CheckScriptFailure([
24601966c248SBram Moolenaar      'vim9script',
24611966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
24621966c248SBram Moolenaar      ], 'E789:')
24631966c248SBram Moolenaar
24641966c248SBram Moolenaar  CheckScriptSuccess([
24651966c248SBram Moolenaar      'vim9script',
24661966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
24671966c248SBram Moolenaar      ])
24681966c248SBram Moolenaar  CheckScriptFailure([
24691966c248SBram Moolenaar      'vim9script',
24701966c248SBram Moolenaar      'syntax match Word /pat/# comment',
24711966c248SBram Moolenaar      ], 'E402:')
24721966c248SBram Moolenaar
24731966c248SBram Moolenaar  CheckScriptSuccess([
24741966c248SBram Moolenaar      'vim9script',
24751966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
24761966c248SBram Moolenaar      ])
24771966c248SBram Moolenaar  CheckScriptFailure([
24781966c248SBram Moolenaar      'vim9script',
24791966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
24801966c248SBram Moolenaar      ], 'E475:')
24811966c248SBram Moolenaar  CheckScriptFailure([
24821966c248SBram Moolenaar      'vim9script',
24831966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
24841966c248SBram Moolenaar      ], 'E406:')
24851966c248SBram Moolenaar  CheckScriptFailure([
24861966c248SBram Moolenaar      'vim9script',
24871966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
24881966c248SBram Moolenaar      ], 'E475:')
24891966c248SBram Moolenaar
24901966c248SBram Moolenaar  CheckScriptSuccess([
24911966c248SBram Moolenaar      'vim9script',
24921966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
24931966c248SBram Moolenaar      ])
24941966c248SBram Moolenaar  CheckScriptFailure([
24951966c248SBram Moolenaar      'vim9script',
24961966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2497d032f34aSBram Moolenaar      ], 'E402:')
24981966c248SBram Moolenaar
24991966c248SBram Moolenaar  CheckScriptSuccess([
25001966c248SBram Moolenaar      'vim9script',
25011966c248SBram Moolenaar      'syntax sync # comment',
25021966c248SBram Moolenaar      ])
25031966c248SBram Moolenaar  CheckScriptFailure([
25041966c248SBram Moolenaar      'vim9script',
25051966c248SBram Moolenaar      'syntax sync# comment',
25061966c248SBram Moolenaar      ], 'E404:')
25071966c248SBram Moolenaar  CheckScriptSuccess([
25081966c248SBram Moolenaar      'vim9script',
25091966c248SBram Moolenaar      'syntax sync ccomment # comment',
25101966c248SBram Moolenaar      ])
25111966c248SBram Moolenaar  CheckScriptFailure([
25121966c248SBram Moolenaar      'vim9script',
25131966c248SBram Moolenaar      'syntax sync ccomment# comment',
25141966c248SBram Moolenaar      ], 'E404:')
25151966c248SBram Moolenaar
25161966c248SBram Moolenaar  CheckScriptSuccess([
25171966c248SBram Moolenaar      'vim9script',
25181966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
25191966c248SBram Moolenaar      ])
25201966c248SBram Moolenaar  CheckScriptFailure([
25211966c248SBram Moolenaar      'vim9script',
25221966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25231966c248SBram Moolenaar      ], 'E475:')
2524a72cfb80SBram Moolenaar
2525a72cfb80SBram Moolenaar  CheckScriptSuccess([
2526a72cfb80SBram Moolenaar      'vim9script',
2527a72cfb80SBram Moolenaar      'command Echo echo # comment',
2528a72cfb80SBram Moolenaar      'command Echo # comment',
2529a72cfb80SBram Moolenaar      ])
2530a72cfb80SBram Moolenaar  CheckScriptFailure([
2531a72cfb80SBram Moolenaar      'vim9script',
2532a72cfb80SBram Moolenaar      'command Echo echo# comment',
2533a72cfb80SBram Moolenaar      'Echo',
2534a72cfb80SBram Moolenaar      ], 'E121:')
2535a72cfb80SBram Moolenaar  CheckScriptFailure([
2536a72cfb80SBram Moolenaar      'vim9script',
2537a72cfb80SBram Moolenaar      'command Echo# comment',
2538a72cfb80SBram Moolenaar      ], 'E182:')
2539a72cfb80SBram Moolenaar  CheckScriptFailure([
2540a72cfb80SBram Moolenaar      'vim9script',
2541a72cfb80SBram Moolenaar      'command Echo echo',
2542a72cfb80SBram Moolenaar      'command Echo# comment',
2543a72cfb80SBram Moolenaar      ], 'E182:')
2544a72cfb80SBram Moolenaar
2545a72cfb80SBram Moolenaar  CheckScriptSuccess([
2546a72cfb80SBram Moolenaar      'vim9script',
2547a72cfb80SBram Moolenaar      'function # comment',
2548a72cfb80SBram Moolenaar      ])
2549a72cfb80SBram Moolenaar  CheckScriptFailure([
2550a72cfb80SBram Moolenaar      'vim9script',
25519898107fSBram Moolenaar      'function " comment',
25529898107fSBram Moolenaar      ], 'E129:')
25539898107fSBram Moolenaar  CheckScriptFailure([
25549898107fSBram Moolenaar      'vim9script',
2555a72cfb80SBram Moolenaar      'function# comment',
2556a72cfb80SBram Moolenaar      ], 'E129:')
2557a72cfb80SBram Moolenaar  CheckScriptSuccess([
2558a72cfb80SBram Moolenaar      'vim9script',
2559a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2560a72cfb80SBram Moolenaar      ])
2561a72cfb80SBram Moolenaar  CheckScriptFailure([
2562a72cfb80SBram Moolenaar      'vim9script',
2563a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2564a72cfb80SBram Moolenaar      ], 'E488:')
2565a72cfb80SBram Moolenaar
2566a72cfb80SBram Moolenaar  CheckScriptSuccess([
2567a72cfb80SBram Moolenaar      'vim9script',
25684c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2569a72cfb80SBram Moolenaar      'endfunc',
25704c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2571a72cfb80SBram Moolenaar      ])
2572a72cfb80SBram Moolenaar  CheckScriptFailure([
2573a72cfb80SBram Moolenaar      'vim9script',
25744c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2575a72cfb80SBram Moolenaar      'endfunc',
25764c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2577a72cfb80SBram Moolenaar      ], 'E488:')
2578a72cfb80SBram Moolenaar
2579a72cfb80SBram Moolenaar  CheckScriptSuccess([
2580a72cfb80SBram Moolenaar      'vim9script',
2581a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2582a72cfb80SBram Moolenaar      ])
2583a72cfb80SBram Moolenaar  CheckScriptFailure([
2584a72cfb80SBram Moolenaar      'vim9script',
2585a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2586a72cfb80SBram Moolenaar      ], 'E488:')
2587e7e4838fSBram Moolenaar
2588e7e4838fSBram Moolenaar  CheckScriptFailure([
2589e7e4838fSBram Moolenaar      'def Test() " comment',
2590e7e4838fSBram Moolenaar      'enddef',
2591e7e4838fSBram Moolenaar      ], 'E488:')
2592e7e4838fSBram Moolenaar  CheckScriptFailure([
2593e7e4838fSBram Moolenaar      'vim9script',
2594e7e4838fSBram Moolenaar      'def Test() " comment',
2595e7e4838fSBram Moolenaar      'enddef',
2596e7e4838fSBram Moolenaar      ], 'E488:')
2597e7e4838fSBram Moolenaar
2598e7e4838fSBram Moolenaar  CheckScriptSuccess([
2599e7e4838fSBram Moolenaar      'func Test() " comment',
2600e7e4838fSBram Moolenaar      'endfunc',
2601e7e4838fSBram Moolenaar      ])
26029898107fSBram Moolenaar  CheckScriptSuccess([
2603e7e4838fSBram Moolenaar      'vim9script',
2604e7e4838fSBram Moolenaar      'func Test() " comment',
2605e7e4838fSBram Moolenaar      'endfunc',
26069898107fSBram Moolenaar      ])
2607e7e4838fSBram Moolenaar
2608e7e4838fSBram Moolenaar  CheckScriptSuccess([
2609e7e4838fSBram Moolenaar      'def Test() # comment',
2610e7e4838fSBram Moolenaar      'enddef',
2611e7e4838fSBram Moolenaar      ])
2612e7e4838fSBram Moolenaar  CheckScriptFailure([
2613e7e4838fSBram Moolenaar      'func Test() # comment',
2614e7e4838fSBram Moolenaar      'endfunc',
2615e7e4838fSBram Moolenaar      ], 'E488:')
26162c5ed4e3SBram Moolenaarenddef
26172c5ed4e3SBram Moolenaar
26182c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
26192c5ed4e3SBram Moolenaar  CheckCanRunGui
26202c5ed4e3SBram Moolenaar
26212c5ed4e3SBram Moolenaar  CheckScriptFailure([
26222c5ed4e3SBram Moolenaar      'vim9script',
26232c5ed4e3SBram Moolenaar      'gui#comment'
26242c5ed4e3SBram Moolenaar      ], 'E499:')
26252c5ed4e3SBram Moolenaar  CheckScriptFailure([
26262c5ed4e3SBram Moolenaar      'vim9script',
26272c5ed4e3SBram Moolenaar      'gui -f#comment'
26282c5ed4e3SBram Moolenaar      ], 'E499:')
26297a092245SBram Moolenaarenddef
26307a092245SBram Moolenaar
2631a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
26326797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
26336797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2634a26b9700SBram Moolenaar
2635a26b9700SBram Moolenaar  edit test.vim
2636a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2637a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2638a26b9700SBram Moolenaar
2639a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2640a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2641a26b9700SBram Moolenaar
2642a26b9700SBram Moolenaar  g:entered = 0
2643a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2644a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2645a26b9700SBram Moolenaar
2646a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2647a26b9700SBram Moolenaar
2648a26b9700SBram Moolenaar  au! TabEnter
2649a26b9700SBram Moolenaar  unlet g:entered
2650d72c1bf0SBram Moolenaar
2651d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2652d72c1bf0SBram Moolenaar      'vim9script',
26536797966dSBram Moolenaar      'g:var = 123',
2654e55b1c09SBram Moolenaar      'b:var = 456',
2655e55b1c09SBram Moolenaar      'w:var = 777',
2656e55b1c09SBram Moolenaar      't:var = 888',
2657d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2658d72c1bf0SBram Moolenaar      ])
2659d72c1bf0SBram Moolenaar
2660d72c1bf0SBram Moolenaar  CheckScriptFailure([
2661d72c1bf0SBram Moolenaar      'vim9script',
2662d72c1bf0SBram Moolenaar      'let g:var = 123',
2663e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2664e55b1c09SBram Moolenaar
2665e55b1c09SBram Moolenaar  CheckScriptFailure([
2666e55b1c09SBram Moolenaar      'vim9script',
2667e55b1c09SBram Moolenaar      'let b:var = 123',
2668e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2669e55b1c09SBram Moolenaar
2670e55b1c09SBram Moolenaar  CheckScriptFailure([
2671e55b1c09SBram Moolenaar      'vim9script',
2672e55b1c09SBram Moolenaar      'let w:var = 123',
2673e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2674e55b1c09SBram Moolenaar
2675e55b1c09SBram Moolenaar  CheckScriptFailure([
2676e55b1c09SBram Moolenaar      'vim9script',
2677e55b1c09SBram Moolenaar      'let t:var = 123',
2678e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2679e55b1c09SBram Moolenaar
2680e55b1c09SBram Moolenaar  CheckScriptFailure([
2681e55b1c09SBram Moolenaar      'vim9script',
2682e55b1c09SBram Moolenaar      'let v:version = 123',
2683e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2684e55b1c09SBram Moolenaar
2685e55b1c09SBram Moolenaar  CheckScriptFailure([
2686e55b1c09SBram Moolenaar      'vim9script',
2687e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2688e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
26896797966dSBram Moolenaar
26906797966dSBram Moolenaar  CheckScriptFailure([
26916797966dSBram Moolenaar      'vim9script',
26926797966dSBram Moolenaar      'g:var = 123',
269332e35117SBram Moolenaar      'unlet g:var# comment1',
2694d72c1bf0SBram Moolenaar      ], 'E108:')
2695d72c1bf0SBram Moolenaar
2696d72c1bf0SBram Moolenaar  CheckScriptFailure([
2697d72c1bf0SBram Moolenaar      'let g:var = 123',
2698d72c1bf0SBram Moolenaar      'unlet g:var # something',
2699d72c1bf0SBram Moolenaar      ], 'E488:')
2700faac4104SBram Moolenaar
2701faac4104SBram Moolenaar  CheckScriptSuccess([
2702faac4104SBram Moolenaar      'vim9script',
270332e35117SBram Moolenaar      'if 1 # comment2',
2704faac4104SBram Moolenaar      '  echo "yes"',
2705faac4104SBram Moolenaar      'elseif 2 #comment',
2706faac4104SBram Moolenaar      '  echo "no"',
2707faac4104SBram Moolenaar      'endif',
2708faac4104SBram Moolenaar      ])
2709faac4104SBram Moolenaar
2710faac4104SBram Moolenaar  CheckScriptFailure([
2711faac4104SBram Moolenaar      'vim9script',
271232e35117SBram Moolenaar      'if 1# comment3',
2713faac4104SBram Moolenaar      '  echo "yes"',
2714faac4104SBram Moolenaar      'endif',
2715faac4104SBram Moolenaar      ], 'E15:')
2716faac4104SBram Moolenaar
2717faac4104SBram Moolenaar  CheckScriptFailure([
2718faac4104SBram Moolenaar      'vim9script',
271932e35117SBram Moolenaar      'if 0 # comment4',
2720faac4104SBram Moolenaar      '  echo "yes"',
2721faac4104SBram Moolenaar      'elseif 2#comment',
2722faac4104SBram Moolenaar      '  echo "no"',
2723faac4104SBram Moolenaar      'endif',
2724faac4104SBram Moolenaar      ], 'E15:')
2725faac4104SBram Moolenaar
2726faac4104SBram Moolenaar  CheckScriptSuccess([
2727faac4104SBram Moolenaar      'vim9script',
272832e35117SBram Moolenaar      'let v = 1 # comment5',
2729faac4104SBram Moolenaar      ])
2730faac4104SBram Moolenaar
2731faac4104SBram Moolenaar  CheckScriptFailure([
2732faac4104SBram Moolenaar      'vim9script',
273332e35117SBram Moolenaar      'let v = 1# comment6',
273432e35117SBram Moolenaar      ], 'E15:')
2735faac4104SBram Moolenaar
2736faac4104SBram Moolenaar  CheckScriptSuccess([
2737faac4104SBram Moolenaar      'vim9script',
2738faac4104SBram Moolenaar      'new'
2739faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2740df069eecSBram Moolenaar      ':$',
2741faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2742faac4104SBram Moolenaar      'bwipe!',
2743faac4104SBram Moolenaar      ])
2744faac4104SBram Moolenaar
2745f5be8cdbSBram Moolenaar  CheckScriptFailure([
2746f5be8cdbSBram Moolenaar      'vim9script',
2747f5be8cdbSBram Moolenaar      'new'
2748f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2749f5be8cdbSBram Moolenaar      ':$',
2750f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2751f5be8cdbSBram Moolenaar      'bwipe!',
2752f5be8cdbSBram Moolenaar      ], 'E488:')
2753f5be8cdbSBram Moolenaar
2754f5be8cdbSBram Moolenaar  CheckScriptFailure([
2755f5be8cdbSBram Moolenaar      'vim9script',
2756f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2757f5be8cdbSBram Moolenaar      ], 'E477:')
2758a26b9700SBram Moolenaarenddef
2759a26b9700SBram Moolenaar
27607e5bd91dSBram Moolenaardef Test_finish()
27617e5bd91dSBram Moolenaar  let lines =<< trim END
27627e5bd91dSBram Moolenaar    vim9script
27636797966dSBram Moolenaar    g:res = 'one'
27647e5bd91dSBram Moolenaar    if v:false | finish | endif
27656797966dSBram Moolenaar    g:res = 'two'
27667e5bd91dSBram Moolenaar    finish
27676797966dSBram Moolenaar    g:res = 'three'
27687e5bd91dSBram Moolenaar  END
27697e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
27707e5bd91dSBram Moolenaar  source Xfinished
27717e5bd91dSBram Moolenaar  assert_equal('two', g:res)
27727e5bd91dSBram Moolenaar
27737e5bd91dSBram Moolenaar  unlet g:res
27747e5bd91dSBram Moolenaar  delete('Xfinished')
27757e5bd91dSBram Moolenaarenddef
27767e5bd91dSBram Moolenaar
277732e35117SBram Moolenaardef Test_let_func_call()
277832e35117SBram Moolenaar  let lines =<< trim END
277932e35117SBram Moolenaar    vim9script
278032e35117SBram Moolenaar    func GetValue()
278132e35117SBram Moolenaar      if exists('g:count')
278232e35117SBram Moolenaar        let g:count += 1
278332e35117SBram Moolenaar      else
278432e35117SBram Moolenaar        let g:count = 1
278532e35117SBram Moolenaar      endif
278632e35117SBram Moolenaar      return 'this'
278732e35117SBram Moolenaar    endfunc
278832e35117SBram Moolenaar    let val: string = GetValue()
2789f5be8cdbSBram Moolenaar    # env var is always a string
2790df671b46SBram Moolenaar    let env = $TERM
279132e35117SBram Moolenaar  END
279232e35117SBram Moolenaar  writefile(lines, 'Xfinished')
279332e35117SBram Moolenaar  source Xfinished
2794f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
279532e35117SBram Moolenaar  assert_equal(1, g:count)
279632e35117SBram Moolenaar
279732e35117SBram Moolenaar  unlet g:count
279832e35117SBram Moolenaar  delete('Xfinished')
279932e35117SBram Moolenaarenddef
280032e35117SBram Moolenaar
280132e35117SBram Moolenaardef Test_let_missing_type()
280232e35117SBram Moolenaar  let lines =<< trim END
280332e35117SBram Moolenaar    vim9script
2804df671b46SBram Moolenaar    let var = g:unknown
2805227a69deSBram Moolenaar  END
2806822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2807227a69deSBram Moolenaar
2808227a69deSBram Moolenaar  lines =<< trim END
2809227a69deSBram Moolenaar    vim9script
2810227a69deSBram Moolenaar    let nr: number = 123
2811227a69deSBram Moolenaar    let var = nr
2812227a69deSBram Moolenaar  END
2813822ba247SBram Moolenaar  CheckScriptSuccess(lines)
281432e35117SBram Moolenaarenddef
281532e35117SBram Moolenaar
2816c82a5b5dSBram Moolenaardef Test_let_declaration()
2817c82a5b5dSBram Moolenaar  let lines =<< trim END
2818c82a5b5dSBram Moolenaar    vim9script
2819c82a5b5dSBram Moolenaar    let var: string
2820c82a5b5dSBram Moolenaar    g:var_uninit = var
2821c82a5b5dSBram Moolenaar    var = 'text'
2822c82a5b5dSBram Moolenaar    g:var_test = var
2823f5be8cdbSBram Moolenaar    # prefixing s: is optional
2824984dddbeSBram Moolenaar    s:var = 'prefixed'
2825984dddbeSBram Moolenaar    g:var_prefixed = s:var
2826984dddbeSBram Moolenaar
2827984dddbeSBram Moolenaar    let s:other: number
2828984dddbeSBram Moolenaar    other = 1234
2829984dddbeSBram Moolenaar    g:other_var = other
2830c82a5b5dSBram Moolenaar  END
2831c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2832c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2833c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2834984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2835984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2836c82a5b5dSBram Moolenaar
2837c82a5b5dSBram Moolenaar  unlet g:var_uninit
2838c82a5b5dSBram Moolenaar  unlet g:var_test
2839984dddbeSBram Moolenaar  unlet g:var_prefixed
2840984dddbeSBram Moolenaar  unlet g:other_var
2841c82a5b5dSBram Moolenaarenddef
2842c82a5b5dSBram Moolenaar
2843c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2844c5b1c20bSBram Moolenaar  let lines =<< trim END
2845c5b1c20bSBram Moolenaar    vim9script
2846c5b1c20bSBram Moolenaar    const var: string
2847c5b1c20bSBram Moolenaar  END
2848c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2849c5b1c20bSBram Moolenaar
2850c5b1c20bSBram Moolenaar  lines =<< trim END
2851c5b1c20bSBram Moolenaar    vim9script
2852c5b1c20bSBram Moolenaar    let 9var: string
2853c5b1c20bSBram Moolenaar  END
2854c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2855c5b1c20bSBram Moolenaarenddef
2856c5b1c20bSBram Moolenaar
285734db91f7SBram Moolenaardef Test_let_type_check()
285834db91f7SBram Moolenaar  let lines =<< trim END
285934db91f7SBram Moolenaar    vim9script
286034db91f7SBram Moolenaar    let var: string
286134db91f7SBram Moolenaar    var = 1234
286234db91f7SBram Moolenaar  END
286334db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2864984dddbeSBram Moolenaar
2865984dddbeSBram Moolenaar  lines =<< trim END
2866984dddbeSBram Moolenaar    vim9script
2867984dddbeSBram Moolenaar    let var:string
2868984dddbeSBram Moolenaar  END
2869984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2870c5b1c20bSBram Moolenaar
2871c5b1c20bSBram Moolenaar  lines =<< trim END
2872c5b1c20bSBram Moolenaar    vim9script
2873c5b1c20bSBram Moolenaar    let var: asdf
2874c5b1c20bSBram Moolenaar  END
2875c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2876a71e2633SBram Moolenaar
2877a71e2633SBram Moolenaar  lines =<< trim END
2878a71e2633SBram Moolenaar    vim9script
2879a71e2633SBram Moolenaar    let s:l: list<number>
2880a71e2633SBram Moolenaar    s:l = []
2881a71e2633SBram Moolenaar  END
2882a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2883a71e2633SBram Moolenaar
2884a71e2633SBram Moolenaar  lines =<< trim END
2885a71e2633SBram Moolenaar    vim9script
2886a71e2633SBram Moolenaar    let s:d: dict<number>
2887a71e2633SBram Moolenaar    s:d = {}
2888a71e2633SBram Moolenaar  END
2889a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
289034db91f7SBram Moolenaarenddef
289134db91f7SBram Moolenaar
2892a5d0077eSBram Moolenaardef Test_forward_declaration()
2893a5d0077eSBram Moolenaar  let lines =<< trim END
2894a5d0077eSBram Moolenaar    vim9script
2895a5d0077eSBram Moolenaar    def GetValue(): string
2896a5d0077eSBram Moolenaar      return theVal
2897a5d0077eSBram Moolenaar    enddef
2898a5d0077eSBram Moolenaar    let theVal = 'something'
2899822ba247SBram Moolenaar    g:initVal = GetValue()
2900a5d0077eSBram Moolenaar    theVal = 'else'
2901a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2902a5d0077eSBram Moolenaar  END
2903a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2904a5d0077eSBram Moolenaar  source Xforward
2905a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2906a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2907a5d0077eSBram Moolenaar
2908a5d0077eSBram Moolenaar  unlet g:initVal
2909a5d0077eSBram Moolenaar  unlet g:laterVal
2910a5d0077eSBram Moolenaar  delete('Xforward')
2911a5d0077eSBram Moolenaarenddef
2912a5d0077eSBram Moolenaar
29139721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
29149721fb4eSBram Moolenaar  let legacy_lines =<< trim END
29159721fb4eSBram Moolenaar    source Xvim9_script.vim
29169721fb4eSBram Moolenaar
29179721fb4eSBram Moolenaar    call assert_false(exists('local'))
29189721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29199721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29209721fb4eSBram Moolenaar    call assert_equal('global', global)
29219721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29229721fb4eSBram Moolenaar
29239721fb4eSBram Moolenaar    " imported variable becomes script-local
29249721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29259721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29269721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29279721fb4eSBram Moolenaar
29289721fb4eSBram Moolenaar    " imported function becomes script-local
29299721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29309721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29319721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29329721fb4eSBram Moolenaar  END
29339721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29349721fb4eSBram Moolenaar
29359721fb4eSBram Moolenaar  let vim9_lines =<< trim END
29369721fb4eSBram Moolenaar    vim9script
29379721fb4eSBram Moolenaar    let local = 'local'
29389721fb4eSBram Moolenaar    g:global = 'global'
29399721fb4eSBram Moolenaar    export let exported = 'exported'
29409721fb4eSBram Moolenaar    export def GetText(): string
29419721fb4eSBram Moolenaar       return 'text'
29429721fb4eSBram Moolenaar    enddef
29439721fb4eSBram Moolenaar  END
29449721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
29459721fb4eSBram Moolenaar
29469721fb4eSBram Moolenaar  source Xlegacy_script.vim
29479721fb4eSBram Moolenaar
29489721fb4eSBram Moolenaar  assert_equal('global', g:global)
2949f5be8cdbSBram Moolenaar  unlet g:global
29509721fb4eSBram Moolenaar
29519721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29529721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29539721fb4eSBram Moolenaarenddef
2954a5d0077eSBram Moolenaar
2955eeb27bfeSBram Moolenaardef Test_vim9_copen()
2956eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2957eeb27bfeSBram Moolenaar  copen
2958eeb27bfeSBram Moolenaar  quit
2959eeb27bfeSBram Moolenaarenddef
2960eeb27bfeSBram Moolenaar
29612d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
29622d6b20d6SBram Moolenaardef Test_vim9_autoload()
29632d6b20d6SBram Moolenaar  let lines =<< trim END
29642d6b20d6SBram Moolenaar     vim9script
29652d6b20d6SBram Moolenaar     def foo#test()
29662d6b20d6SBram Moolenaar         echomsg getreg('"')
29672d6b20d6SBram Moolenaar     enddef
29682d6b20d6SBram Moolenaar  END
29692d6b20d6SBram Moolenaar
29702d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
29712d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
29722d6b20d6SBram Moolenaar  let save_rtp = &rtp
29732d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
29742d6b20d6SBram Moolenaar  augroup test
29752d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
29762d6b20d6SBram Moolenaar  augroup END
29772d6b20d6SBram Moolenaar
29782d6b20d6SBram Moolenaar  normal Y
29792d6b20d6SBram Moolenaar
29802d6b20d6SBram Moolenaar  augroup test
29812d6b20d6SBram Moolenaar    autocmd!
29822d6b20d6SBram Moolenaar  augroup END
29832d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
29842d6b20d6SBram Moolenaar  &rtp = save_rtp
29852d6b20d6SBram Moolenaarenddef
29862d6b20d6SBram Moolenaar
2987585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2988585fea7bSBram Moolenaardef Test_substitute_cmd()
2989585fea7bSBram Moolenaar  new
2990585fea7bSBram Moolenaar  setline(1, 'something')
2991585fea7bSBram Moolenaar  :substitute(some(other(
2992585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2993585fea7bSBram Moolenaar  bwipe!
2994585fea7bSBram Moolenaar
2995f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2996585fea7bSBram Moolenaar  let lines =<< trim END
2997585fea7bSBram Moolenaar    vim9script
2998585fea7bSBram Moolenaar    new
2999585fea7bSBram Moolenaar    setline(1, 'something')
3000585fea7bSBram Moolenaar    :substitute(some(other(
3001585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3002585fea7bSBram Moolenaar    bwipe!
3003585fea7bSBram Moolenaar  END
3004585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3005585fea7bSBram Moolenaar  source Xvim9lines
3006585fea7bSBram Moolenaar
3007585fea7bSBram Moolenaar  delete('Xvim9lines')
3008585fea7bSBram Moolenaarenddef
3009585fea7bSBram Moolenaar
30108a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3011