18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
78a7d6542SBram Moolenaar
88a7d6542SBram Moolenaardef Test_syntax()
98a7d6542SBram Moolenaar  let var = 234
108a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
118a7d6542SBram Moolenaarenddef
128a7d6542SBram Moolenaar
136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
146e587dcbSBram Moolenaarlet s:addToMe = 111
15401d9ffbSBram Moolenaarlet g:existing = 'yes'
16a8c17704SBram Moolenaarlet g:inc_counter = 1
17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
18a6e67e4fSBram Moolenaarlet g:alist = [7]
19a6e67e4fSBram Moolenaarlet g:astring = 'text'
20f0b9f43cSBram Moolenaarlet g:anumber = 123
216e587dcbSBram Moolenaar
228a7d6542SBram Moolenaardef Test_assignment()
238a7d6542SBram Moolenaar  let bool1: bool = true
248a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
258a7d6542SBram Moolenaar  let bool2: bool = false
268a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
278a7d6542SBram Moolenaar
28f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
29f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
301cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
31f93c7feaSBram Moolenaar
324cdb13ceSBram Moolenaar  let nr: number = 1234
334cdb13ceSBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
344cdb13ceSBram Moolenaar
35b209750bSBram Moolenaar  let a: number = 6 #comment
369be61bbbSBram Moolenaar  assert_equal(6, a)
379be61bbbSBram Moolenaar
3842a480bfSBram Moolenaar  if has('channel')
3942a480bfSBram Moolenaar    let chan1: channel
40fbdd08edSBram Moolenaar    let job1: job
41f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
4242a480bfSBram Moolenaar  endif
43fbdd08edSBram Moolenaar  if has('float')
44fbdd08edSBram Moolenaar    let float1: float = 3.4
45fbdd08edSBram Moolenaar  endif
465deeb3f1SBram Moolenaar  let Funky1: func
475deeb3f1SBram Moolenaar  let Funky2: func = function('len')
484c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4942a480bfSBram Moolenaar
50b209750bSBram Moolenaar  g:newvar = 'new'  #comment
51401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
52401d9ffbSBram Moolenaar
53401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
54401d9ffbSBram Moolenaar  g:existing = 'no'
55401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
56401d9ffbSBram Moolenaar
57b283a8a6SBram Moolenaar  v:char = 'abc'
586e587dcbSBram Moolenaar  assert_equal('abc', v:char)
59b283a8a6SBram Moolenaar
60b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
616e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
62b283a8a6SBram Moolenaar  $ENVVAR = ''
636e587dcbSBram Moolenaar
64b5ed2660SBram Moolenaar  let lines =<< trim END
65b5ed2660SBram Moolenaar    vim9script
66b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
67b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
68b5ed2660SBram Moolenaar    $ENVVAR = ''
69b5ed2660SBram Moolenaar  END
70b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
71b5ed2660SBram Moolenaar
72fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
73fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
74fd1823e0SBram Moolenaar  s:addToMe += 222
75fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
760bbf722aSBram Moolenaar  s:newVar = 'new'
770bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
78a8c17704SBram Moolenaar
79a8c17704SBram Moolenaar  set ts=7
80a8c17704SBram Moolenaar  &ts += 1
81a8c17704SBram Moolenaar  assert_equal(8, &ts)
8280c34ca3SBram Moolenaar  &ts -= 3
8380c34ca3SBram Moolenaar  assert_equal(5, &ts)
8480c34ca3SBram Moolenaar  &ts *= 2
8580c34ca3SBram Moolenaar  assert_equal(10, &ts)
8680c34ca3SBram Moolenaar  &ts /= 3
8780c34ca3SBram Moolenaar  assert_equal(3, &ts)
8880c34ca3SBram Moolenaar  set ts=10
8980c34ca3SBram Moolenaar  &ts %= 4
9080c34ca3SBram Moolenaar  assert_equal(2, &ts)
91b5ed2660SBram Moolenaar
92b5ed2660SBram Moolenaar  lines =<< trim END
93b5ed2660SBram Moolenaar    vim9script
94b5ed2660SBram Moolenaar    &ts = 6
95b5ed2660SBram Moolenaar    &ts += 3
96b5ed2660SBram Moolenaar    assert_equal(9, &ts)
97b5ed2660SBram Moolenaar  END
98b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
99b5ed2660SBram Moolenaar
100a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
101a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
102a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
103a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
104a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
105a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
106a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
107a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
108cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
109585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11080c34ca3SBram Moolenaar  &ts = 8
111a8c17704SBram Moolenaar
11233afa244SBram Moolenaar  call CheckDefFailure(['let s:var = 123'], 'E1101:')
11333afa244SBram Moolenaar  call CheckDefFailure(['let s:var: number'], 'E1101:')
11433afa244SBram Moolenaar
115f9b2b496SBram Moolenaar  lines =<< trim END
116f9b2b496SBram Moolenaar    vim9script
117f9b2b496SBram Moolenaar    def SomeFunc()
118f9b2b496SBram Moolenaar      s:var = 123
119f9b2b496SBram Moolenaar    enddef
120f9b2b496SBram Moolenaar    defcompile
121f9b2b496SBram Moolenaar  END
122f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
123f9b2b496SBram Moolenaar
124a8c17704SBram Moolenaar  g:inc_counter += 1
125a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
126a8c17704SBram Moolenaar
127a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
128a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
129a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
130a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
131a8c17704SBram Moolenaar
132a8c17704SBram Moolenaar  @a = 'areg'
133a8c17704SBram Moolenaar  @a ..= 'add'
134a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
135a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
136a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
137e69f6d04SBram Moolenaar
138b5ed2660SBram Moolenaar  lines =<< trim END
139b5ed2660SBram Moolenaar    vim9script
140b5ed2660SBram Moolenaar    @c = 'areg'
141b5ed2660SBram Moolenaar    @c ..= 'add'
142b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
143b5ed2660SBram Moolenaar  END
144b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
145b5ed2660SBram Moolenaar
146e69f6d04SBram Moolenaar  v:errmsg = 'none'
147e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
148e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
149e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
150e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
15133afa244SBram Moolenaar
15233afa244SBram Moolenaar  # single letter variables
15333afa244SBram Moolenaar  a = 123
15433afa244SBram Moolenaar  assert_equal(123, a)
15533afa244SBram Moolenaar  let b: number
15633afa244SBram Moolenaar  b = 123
15733afa244SBram Moolenaar  assert_equal(123, b)
15833afa244SBram Moolenaar  let g: number
15933afa244SBram Moolenaar  g = 123
16033afa244SBram Moolenaar  assert_equal(123, g)
16133afa244SBram Moolenaar  let s: number
16233afa244SBram Moolenaar  s = 123
16333afa244SBram Moolenaar  assert_equal(123, s)
16433afa244SBram Moolenaar  let t: number
16533afa244SBram Moolenaar  t = 123
16633afa244SBram Moolenaar  assert_equal(123, t)
16733afa244SBram Moolenaar  let v: number
16833afa244SBram Moolenaar  v = 123
16933afa244SBram Moolenaar  assert_equal(123, v)
17033afa244SBram Moolenaar  let w: number
17133afa244SBram Moolenaar  w = 123
17233afa244SBram Moolenaar  assert_equal(123, w)
1735deeb3f1SBram Moolenaarenddef
1745deeb3f1SBram Moolenaar
1753b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1763b74b6b4SBram Moolenaar  let lines =<< trim END
1773b74b6b4SBram Moolenaar      vim9script
1783b74b6b4SBram Moolenaar
179f5be8cdbSBram Moolenaar      # single character variable declarations work
1803b74b6b4SBram Moolenaar      let a: string
1813b74b6b4SBram Moolenaar      let b: number
1823b74b6b4SBram Moolenaar      let l: list<any>
1833b74b6b4SBram Moolenaar      let s: string
1843b74b6b4SBram Moolenaar      let t: number
1853b74b6b4SBram Moolenaar      let v: number
1863b74b6b4SBram Moolenaar      let w: number
1873b74b6b4SBram Moolenaar
188f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1893b74b6b4SBram Moolenaar      a = 'script-a'
1903b74b6b4SBram Moolenaar      b = 111
1913b74b6b4SBram Moolenaar      l = [1, 2, 3]
1923b74b6b4SBram Moolenaar      s = 'script-s'
1933b74b6b4SBram Moolenaar      t = 222
1943b74b6b4SBram Moolenaar      v = 333
1953b74b6b4SBram Moolenaar      w = 444
1963b74b6b4SBram Moolenaar
1973b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1983b74b6b4SBram Moolenaar      assert_equal(111, b)
1993b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2003b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2013b74b6b4SBram Moolenaar      assert_equal(222, t)
2023b74b6b4SBram Moolenaar      assert_equal(333, v)
2033b74b6b4SBram Moolenaar      assert_equal(444, w)
2043b74b6b4SBram Moolenaar  END
2053b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2063b74b6b4SBram Moolenaar  source Xsinglechar
2073b74b6b4SBram Moolenaar  delete('Xsinglechar')
2083b74b6b4SBram Moolenaarenddef
2093b74b6b4SBram Moolenaar
21084370087SBram Moolenaardef Test_assignment_list()
21184370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
21284370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
21384370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
21484370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
21584370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
21684370087SBram Moolenaar
21784370087SBram Moolenaar  let listS: list<string> = []
21884370087SBram Moolenaar  let listN: list<number> = []
21984370087SBram Moolenaar
22084370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
22184370087SBram Moolenaar  list2[-1] = 99
22284370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
22384370087SBram Moolenaar  list2[-2] = 88
22484370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
22584370087SBram Moolenaar  list2[-3] = 77
22684370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
22784370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
228c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
22984370087SBram Moolenaar
23084370087SBram Moolenaar  # type becomes list<any>
23184370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
23284370087SBram Moolenaarenddef
23384370087SBram Moolenaar
234b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
235b31be3f9SBram Moolenaar  let lines =<< trim END
236b31be3f9SBram Moolenaar    vim9script
237b31be3f9SBram Moolenaar    let v1: number
238b31be3f9SBram Moolenaar    let v2: number
239b31be3f9SBram Moolenaar    let v3: number
240b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
241b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
242b31be3f9SBram Moolenaar  END
243b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
244b31be3f9SBram Moolenaarenddef
245b31be3f9SBram Moolenaar
24684370087SBram Moolenaardef Test_assignment_dict()
24784370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
24884370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
24984370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
25084370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
25174fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
25284370087SBram Moolenaar
253f5be8cdbSBram Moolenaar  # overwrite
254c785b9a7SBram Moolenaar  dict3['key'] = 'another'
255c785b9a7SBram Moolenaar
25658626872SBram Moolenaar  # empty key can be used
25758626872SBram Moolenaar  let dd = {}
25858626872SBram Moolenaar  dd[""] = 6
25958626872SBram Moolenaar  assert_equal({'': 6}, dd)
26084370087SBram Moolenaar
26184370087SBram Moolenaar  # type becomes dict<any>
26284370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
2638e4c8c85SBram Moolenaar
2648e4c8c85SBram Moolenaar  # assignment to script-local dict
2658e4c8c85SBram Moolenaar  let lines =<< trim END
2668e4c8c85SBram Moolenaar    vim9script
2678e4c8c85SBram Moolenaar    let test: dict<any> = {}
2688e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2698e4c8c85SBram Moolenaar      test['a'] = 43
2708e4c8c85SBram Moolenaar      return test
2718e4c8c85SBram Moolenaar    enddef
2728e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2738e4c8c85SBram Moolenaar  END
2748e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
2758e4c8c85SBram Moolenaar
2768e4c8c85SBram Moolenaar  lines =<< trim END
2778e4c8c85SBram Moolenaar    vim9script
2788e4c8c85SBram Moolenaar    let test: dict<any>
2798e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2808e4c8c85SBram Moolenaar      test['a'] = 43
2818e4c8c85SBram Moolenaar      return test
2828e4c8c85SBram Moolenaar    enddef
2838e4c8c85SBram Moolenaar    FillDict()
2848e4c8c85SBram Moolenaar  END
2858e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
2862caa1594SBram Moolenaar
2872caa1594SBram Moolenaar  # assignment to global dict
2882caa1594SBram Moolenaar  lines =<< trim END
2892caa1594SBram Moolenaar    vim9script
2902caa1594SBram Moolenaar    g:test = {}
2912caa1594SBram Moolenaar    def FillDict(): dict<any>
2922caa1594SBram Moolenaar      g:test['a'] = 43
2932caa1594SBram Moolenaar      return g:test
2942caa1594SBram Moolenaar    enddef
2952caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2962caa1594SBram Moolenaar  END
2972caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
2982caa1594SBram Moolenaar
2992caa1594SBram Moolenaar  # assignment to buffer dict
3002caa1594SBram Moolenaar  lines =<< trim END
3012caa1594SBram Moolenaar    vim9script
3022caa1594SBram Moolenaar    b:test = {}
3032caa1594SBram Moolenaar    def FillDict(): dict<any>
3042caa1594SBram Moolenaar      b:test['a'] = 43
3052caa1594SBram Moolenaar      return b:test
3062caa1594SBram Moolenaar    enddef
3072caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3082caa1594SBram Moolenaar  END
3092caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
31084370087SBram Moolenaarenddef
31184370087SBram Moolenaar
312d3aac291SBram Moolenaardef Test_assignment_local()
313f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
314f5be8cdbSBram Moolenaar  # changed.
315d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
316d3aac291SBram Moolenaar    let b:existing = 'yes'
317d3aac291SBram Moolenaar    let w:existing = 'yes'
318d3aac291SBram Moolenaar    let t:existing = 'yes'
319d3aac291SBram Moolenaar
320d3aac291SBram Moolenaar    def Test_assignment_local_internal()
321d3aac291SBram Moolenaar      b:newvar = 'new'
322d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
323d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
324d3aac291SBram Moolenaar      b:existing = 'no'
325d3aac291SBram Moolenaar      assert_equal('no', b:existing)
326396f3138SBram Moolenaar      b:existing ..= 'NO'
327396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
328d3aac291SBram Moolenaar
329d3aac291SBram Moolenaar      w:newvar = 'new'
330d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
331d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
332d3aac291SBram Moolenaar      w:existing = 'no'
333d3aac291SBram Moolenaar      assert_equal('no', w:existing)
334396f3138SBram Moolenaar      w:existing ..= 'NO'
335396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
336d3aac291SBram Moolenaar
337d3aac291SBram Moolenaar      t:newvar = 'new'
338d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
339d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
340d3aac291SBram Moolenaar      t:existing = 'no'
341d3aac291SBram Moolenaar      assert_equal('no', t:existing)
342396f3138SBram Moolenaar      t:existing ..= 'NO'
343396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
344d3aac291SBram Moolenaar    enddef
345d3aac291SBram Moolenaar    call Test_assignment_local_internal()
346d3aac291SBram Moolenaar  END
347d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
348d3aac291SBram Moolenaarenddef
349d3aac291SBram Moolenaar
3505deeb3f1SBram Moolenaardef Test_assignment_default()
351e69f6d04SBram Moolenaar
352cb711abfSBram Moolenaar  # Test default values.
353e69f6d04SBram Moolenaar  let thebool: bool
354e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
355e69f6d04SBram Moolenaar
356e69f6d04SBram Moolenaar  let thenumber: number
357e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
358e69f6d04SBram Moolenaar
359e69f6d04SBram Moolenaar  if has('float')
360e69f6d04SBram Moolenaar    let thefloat: float
361e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
362e69f6d04SBram Moolenaar  endif
363e69f6d04SBram Moolenaar
364e69f6d04SBram Moolenaar  let thestring: string
365e69f6d04SBram Moolenaar  assert_equal('', thestring)
366e69f6d04SBram Moolenaar
367e69f6d04SBram Moolenaar  let theblob: blob
368e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
369e69f6d04SBram Moolenaar
3705deeb3f1SBram Moolenaar  let Thefunc: func
3715deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
372e69f6d04SBram Moolenaar
373e69f6d04SBram Moolenaar  let thelist: list<any>
374e69f6d04SBram Moolenaar  assert_equal([], thelist)
375e69f6d04SBram Moolenaar
376e69f6d04SBram Moolenaar  let thedict: dict<any>
377e69f6d04SBram Moolenaar  assert_equal({}, thedict)
378e69f6d04SBram Moolenaar
3792c869deeSBram Moolenaar  if has('channel')
380e69f6d04SBram Moolenaar    let thejob: job
381e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
382e69f6d04SBram Moolenaar
383e69f6d04SBram Moolenaar    let thechannel: channel
384e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
385c785b9a7SBram Moolenaar
386c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
387f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
388c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
389c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
390c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
391c785b9a7SBram Moolenaar    endif
3922c869deeSBram Moolenaar  endif
393585fea7bSBram Moolenaar
394585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
395585fea7bSBram Moolenaar  assert_equal(5678, nr)
3968a7d6542SBram Moolenaarenddef
3978a7d6542SBram Moolenaar
39847a519a9SBram Moolenaardef Test_assignment_var_list()
39947a519a9SBram Moolenaar  let v1: string
40047a519a9SBram Moolenaar  let v2: string
4019af78769SBram Moolenaar  let vrem: list<string>
4029af78769SBram Moolenaar  [v1] = ['aaa']
4039af78769SBram Moolenaar  assert_equal('aaa', v1)
4049af78769SBram Moolenaar
40547a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
40647a519a9SBram Moolenaar  assert_equal('one', v1)
40747a519a9SBram Moolenaar  assert_equal('two', v2)
4089af78769SBram Moolenaar
4099af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4109af78769SBram Moolenaar  assert_equal('one', v1)
4119af78769SBram Moolenaar  assert_equal('two', v2)
4129af78769SBram Moolenaar  assert_equal([], vrem)
4139af78769SBram Moolenaar
4149af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4159af78769SBram Moolenaar  assert_equal('one', v1)
4169af78769SBram Moolenaar  assert_equal('two', v2)
4179af78769SBram Moolenaar  assert_equal(['three'], vrem)
41847a519a9SBram Moolenaarenddef
41947a519a9SBram Moolenaar
420c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
421c7e44a7eSBram Moolenaar  let lines =<< trim END
422c7e44a7eSBram Moolenaar    vim9script
423c7e44a7eSBram Moolenaar    def Func(): list<number>
424c7e44a7eSBram Moolenaar      return [1, 2]
425c7e44a7eSBram Moolenaar    enddef
426c7e44a7eSBram Moolenaar    let var1: number
427c7e44a7eSBram Moolenaar    let var2: number
428c7e44a7eSBram Moolenaar    [var1, var2] =
429c7e44a7eSBram Moolenaar          Func()
430c7e44a7eSBram Moolenaar    assert_equal(1, var1)
431c7e44a7eSBram Moolenaar    assert_equal(2, var2)
432c7e44a7eSBram Moolenaar    let ll =
433c7e44a7eSBram Moolenaar          Func()
434c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
43583144546SBram Moolenaar
43683144546SBram Moolenaar    @/ = 'text'
43783144546SBram Moolenaar    assert_equal('text', @/)
43883144546SBram Moolenaar    @0 = 'zero'
43983144546SBram Moolenaar    assert_equal('zero', @0)
44083144546SBram Moolenaar    @1 = 'one'
44183144546SBram Moolenaar    assert_equal('one', @1)
44283144546SBram Moolenaar    @9 = 'nine'
44383144546SBram Moolenaar    assert_equal('nine', @9)
44483144546SBram Moolenaar    @- = 'minus'
44583144546SBram Moolenaar    assert_equal('minus', @-)
44683144546SBram Moolenaar    if has('clipboard_working')
44783144546SBram Moolenaar      @* = 'star'
44883144546SBram Moolenaar      assert_equal('star', @*)
44983144546SBram Moolenaar      @+ = 'plus'
45083144546SBram Moolenaar      assert_equal('plus', @+)
45183144546SBram Moolenaar    endif
452*95dd9f25SBram Moolenaar
453*95dd9f25SBram Moolenaar    let a: number = 123
454*95dd9f25SBram Moolenaar    assert_equal(123, a)
455*95dd9f25SBram Moolenaar    let s: string = 'yes'
456*95dd9f25SBram Moolenaar    assert_equal('yes', s)
457*95dd9f25SBram Moolenaar    let b: number = 42
458*95dd9f25SBram Moolenaar    assert_equal(42, b)
459*95dd9f25SBram Moolenaar    let w: number = 43
460*95dd9f25SBram Moolenaar    assert_equal(43, w)
461*95dd9f25SBram Moolenaar    let t: number = 44
462*95dd9f25SBram Moolenaar    assert_equal(44, t)
463c7e44a7eSBram Moolenaar  END
464c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
465c7e44a7eSBram Moolenaarenddef
466c7e44a7eSBram Moolenaar
467cab27678SBram Moolenaardef Mess(): string
468cab27678SBram Moolenaar  v:foldstart = 123
469cab27678SBram Moolenaar  return 'xxx'
470cab27678SBram Moolenaarenddef
471cab27678SBram Moolenaar
472d72c1bf0SBram Moolenaardef Test_assignment_failure()
4738a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
4748a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
4758a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
4768a7d6542SBram Moolenaar
47763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
47863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
47963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
48063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
48163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
48263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
48363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
48463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
48563be3d4bSBram Moolenaar
4868a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
4878a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
4888a7d6542SBram Moolenaar
4899b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
4909af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4919af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
4929af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4939af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
4949af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4959af78769SBram Moolenaar                            'let y: number',
4969af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
4979af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4989af78769SBram Moolenaar                            'let y: number',
4999af78769SBram Moolenaar                            'let z: list<number>',
5009af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5019be61bbbSBram Moolenaar
502e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
503c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5049be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
505c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5069be61bbbSBram Moolenaar
507e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
508c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5099be61bbbSBram Moolenaar
510434d72cbSBram Moolenaar  if has('dnd')
51165821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
512434d72cbSBram Moolenaar  else
513434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
514434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
515434d72cbSBram Moolenaar  endif
5169be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
51765821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
518c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5199be61bbbSBram Moolenaar
520e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
521e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
522e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
523e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5249be61bbbSBram Moolenaar
5259be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5269be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5279be61bbbSBram Moolenaar
528822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
52933fa29cfSBram Moolenaar
5308a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5318a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5328a7d6542SBram Moolenaar
5338a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5348a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5358a7d6542SBram Moolenaar
5368a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5378a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
53842a480bfSBram Moolenaar
539d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
54042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
541cab27678SBram Moolenaar
542cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
543cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
54443e969d3SBram Moolenaar
54543e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
54643e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
54743e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
54843e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
54943e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
55043e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
55143e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
55243e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
553d72c1bf0SBram Moolenaarenddef
554d72c1bf0SBram Moolenaar
555d72c1bf0SBram Moolenaardef Test_unlet()
556d72c1bf0SBram Moolenaar  g:somevar = 'yes'
557d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
558d72c1bf0SBram Moolenaar  unlet g:somevar
559d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
560d72c1bf0SBram Moolenaar  unlet! g:somevar
561d72c1bf0SBram Moolenaar
562d72c1bf0SBram Moolenaar  call CheckScriptFailure([
563d72c1bf0SBram Moolenaar        'vim9script',
564d72c1bf0SBram Moolenaar        'let svar = 123',
565d72c1bf0SBram Moolenaar        'unlet svar',
566d72c1bf0SBram Moolenaar        ], 'E1081:')
567d72c1bf0SBram Moolenaar  call CheckScriptFailure([
568d72c1bf0SBram Moolenaar        'vim9script',
569d72c1bf0SBram Moolenaar        'let svar = 123',
570d72c1bf0SBram Moolenaar        'unlet s:svar',
571d72c1bf0SBram Moolenaar        ], 'E1081:')
572d72c1bf0SBram Moolenaar  call CheckScriptFailure([
573d72c1bf0SBram Moolenaar        'vim9script',
574d72c1bf0SBram Moolenaar        'let svar = 123',
575d72c1bf0SBram Moolenaar        'def Func()',
576d72c1bf0SBram Moolenaar        '  unlet svar',
577d72c1bf0SBram Moolenaar        'enddef',
578822ba247SBram Moolenaar        'defcompile',
579d72c1bf0SBram Moolenaar        ], 'E1081:')
580d72c1bf0SBram Moolenaar  call CheckScriptFailure([
581d72c1bf0SBram Moolenaar        'vim9script',
582d72c1bf0SBram Moolenaar        'let svar = 123',
583d72c1bf0SBram Moolenaar        'def Func()',
584d72c1bf0SBram Moolenaar        '  unlet s:svar',
585d72c1bf0SBram Moolenaar        'enddef',
586822ba247SBram Moolenaar        'defcompile',
587d72c1bf0SBram Moolenaar        ], 'E1081:')
5887bdaea6eSBram Moolenaar
5897bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
5907bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
5917bdaea6eSBram Moolenaar  unlet $ENVVAR
5927bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
593d72c1bf0SBram Moolenaarenddef
594599c89c8SBram Moolenaar
5954c17ad94SBram Moolenaardef Test_delfunction()
596f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
5974c17ad94SBram Moolenaar  CheckScriptSuccess([
5984c17ad94SBram Moolenaar      'vim9script',
5994c17ad94SBram Moolenaar      'func CheckMe()',
6004c17ad94SBram Moolenaar      '  return 123',
6014c17ad94SBram Moolenaar      'endfunc',
6024c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6034c17ad94SBram Moolenaar      ])
6044c17ad94SBram Moolenaar
605f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6064c17ad94SBram Moolenaar  CheckScriptFailure([
6074c17ad94SBram Moolenaar      'vim9script',
6084c17ad94SBram Moolenaar      'func DeleteMe1()',
6094c17ad94SBram Moolenaar      'endfunc',
6104c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6114c17ad94SBram Moolenaar      ], 'E1084:')
6124c17ad94SBram Moolenaar  CheckScriptFailure([
6134c17ad94SBram Moolenaar      'vim9script',
6144c17ad94SBram Moolenaar      'func DeleteMe2()',
6154c17ad94SBram Moolenaar      'endfunc',
6164c17ad94SBram Moolenaar      'def DoThat()',
6174c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6184c17ad94SBram Moolenaar      'enddef',
6194c17ad94SBram Moolenaar      'DoThat()',
6204c17ad94SBram Moolenaar      ], 'E1084:')
6214c17ad94SBram Moolenaar  CheckScriptFailure([
6224c17ad94SBram Moolenaar      'vim9script',
6234c17ad94SBram Moolenaar      'def DeleteMe3()',
6244c17ad94SBram Moolenaar      'enddef',
6254c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6264c17ad94SBram Moolenaar      ], 'E1084:')
6274c17ad94SBram Moolenaar  CheckScriptFailure([
6284c17ad94SBram Moolenaar      'vim9script',
6294c17ad94SBram Moolenaar      'def DeleteMe4()',
6304c17ad94SBram Moolenaar      'enddef',
6314c17ad94SBram Moolenaar      'def DoThat()',
6324c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6334c17ad94SBram Moolenaar      'enddef',
6344c17ad94SBram Moolenaar      'DoThat()',
6354c17ad94SBram Moolenaar      ], 'E1084:')
636925e9fd6SBram Moolenaar
637925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
638925e9fd6SBram Moolenaar  let lines =<< trim END
639925e9fd6SBram Moolenaar      vim9script
640925e9fd6SBram Moolenaar      def g:Global(): string
641925e9fd6SBram Moolenaar        return "yes"
642925e9fd6SBram Moolenaar      enddef
643925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
644925e9fd6SBram Moolenaar      def! g:Global(): string
645925e9fd6SBram Moolenaar        return "no"
646925e9fd6SBram Moolenaar      enddef
647925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
648925e9fd6SBram Moolenaar      delfunc g:Global
649925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
650925e9fd6SBram Moolenaar  END
651925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
652925e9fd6SBram Moolenaar
653925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
654925e9fd6SBram Moolenaar  lines =<< trim END
655925e9fd6SBram Moolenaar      vim9script
656925e9fd6SBram Moolenaar      func g:Global()
657925e9fd6SBram Moolenaar        return "yes"
658925e9fd6SBram Moolenaar      endfunc
659925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
660925e9fd6SBram Moolenaar      def! g:Global(): string
661925e9fd6SBram Moolenaar        return "no"
662925e9fd6SBram Moolenaar      enddef
663925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
664925e9fd6SBram Moolenaar      delfunc g:Global
665925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
666925e9fd6SBram Moolenaar  END
667925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
668925e9fd6SBram Moolenaar
669925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
670925e9fd6SBram Moolenaar  lines =<< trim END
671925e9fd6SBram Moolenaar      vim9script
672925e9fd6SBram Moolenaar      def g:Global(): string
673925e9fd6SBram Moolenaar        return "yes"
674925e9fd6SBram Moolenaar      enddef
675925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
676925e9fd6SBram Moolenaar      func! g:Global()
677925e9fd6SBram Moolenaar        return "no"
678925e9fd6SBram Moolenaar      endfunc
679925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
680925e9fd6SBram Moolenaar      delfunc g:Global
681925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
682925e9fd6SBram Moolenaar  END
683925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6844c17ad94SBram Moolenaarenddef
6854c17ad94SBram Moolenaar
686599c89c8SBram Moolenaarfunc Test_wrong_type()
687599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
688599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
689599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
690599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
691599c89c8SBram Moolenaar
692599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
693599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
69442a480bfSBram Moolenaar
69542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
69642a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
69742a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
69842a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
69942a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
70042a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
70142a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
70242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
70342a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
70442a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
70542a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
706a0a9f43aSBram Moolenaar
707a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
708a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7098a7d6542SBram Moolenaarendfunc
7108a7d6542SBram Moolenaar
7118a7d6542SBram Moolenaarfunc Test_const()
7128a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7138a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7148a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7159be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7168a7d6542SBram Moolenaarendfunc
7178a7d6542SBram Moolenaar
718df069eecSBram Moolenaardef Test_range_no_colon()
719df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
720df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
721df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
722df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
723df069eecSBram Moolenaarenddef
724df069eecSBram Moolenaar
725df069eecSBram Moolenaar
7268a7d6542SBram Moolenaardef Test_block()
7278a7d6542SBram Moolenaar  let outer = 1
7288a7d6542SBram Moolenaar  {
7298a7d6542SBram Moolenaar    let inner = 2
7308a7d6542SBram Moolenaar    assert_equal(1, outer)
7318a7d6542SBram Moolenaar    assert_equal(2, inner)
7328a7d6542SBram Moolenaar  }
7338a7d6542SBram Moolenaar  assert_equal(1, outer)
7348a7d6542SBram Moolenaarenddef
7358a7d6542SBram Moolenaar
7368a7d6542SBram Moolenaarfunc Test_block_failure()
7378a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
738585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
739585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7408a7d6542SBram Moolenaarendfunc
7418a7d6542SBram Moolenaar
742585fea7bSBram Moolenaardef Test_cmd_modifier()
743585fea7bSBram Moolenaar  tab echo '0'
744585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
745585fea7bSBram Moolenaarenddef
746585fea7bSBram Moolenaar
747d032f34aSBram Moolenaarfunc g:NoSuchFunc()
748d032f34aSBram Moolenaar  echo 'none'
749d032f34aSBram Moolenaarendfunc
750d032f34aSBram Moolenaar
7518a7d6542SBram Moolenaardef Test_try_catch()
7528a7d6542SBram Moolenaar  let l = []
7537a092245SBram Moolenaar  try # comment
7548a7d6542SBram Moolenaar    add(l, '1')
7558a7d6542SBram Moolenaar    throw 'wrong'
7568a7d6542SBram Moolenaar    add(l, '2')
7577a092245SBram Moolenaar  catch # comment
7588a7d6542SBram Moolenaar    add(l, v:exception)
7597a092245SBram Moolenaar  finally # comment
7608a7d6542SBram Moolenaar    add(l, '3')
7617a092245SBram Moolenaar  endtry # comment
7628a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
76368d130c6SBram Moolenaar
764e859312eSBram Moolenaar  l = []
765e859312eSBram Moolenaar  try
766e859312eSBram Moolenaar    try
767e859312eSBram Moolenaar      add(l, '1')
768e859312eSBram Moolenaar      throw 'wrong'
769e859312eSBram Moolenaar      add(l, '2')
770e859312eSBram Moolenaar    catch /right/
771e859312eSBram Moolenaar      add(l, v:exception)
772e859312eSBram Moolenaar    endtry
773e859312eSBram Moolenaar  catch /wrong/
774e859312eSBram Moolenaar    add(l, 'caught')
775e859312eSBram Moolenaar  finally
776e859312eSBram Moolenaar    add(l, 'finally')
777e859312eSBram Moolenaar  endtry
778e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
779e859312eSBram Moolenaar
78068d130c6SBram Moolenaar  let n: number
78168d130c6SBram Moolenaar  try
78268d130c6SBram Moolenaar    n = l[3]
78368d130c6SBram Moolenaar  catch /E684:/
78468d130c6SBram Moolenaar    n = 99
78568d130c6SBram Moolenaar  endtry
78668d130c6SBram Moolenaar  assert_equal(99, n)
78768d130c6SBram Moolenaar
78868d130c6SBram Moolenaar  try
78968d130c6SBram Moolenaar    n = g:astring[3]
79068d130c6SBram Moolenaar  catch /E714:/
79168d130c6SBram Moolenaar    n = 77
79268d130c6SBram Moolenaar  endtry
79368d130c6SBram Moolenaar  assert_equal(77, n)
79468d130c6SBram Moolenaar
79568d130c6SBram Moolenaar  try
79668d130c6SBram Moolenaar    n = l[g:astring]
79768d130c6SBram Moolenaar  catch /E39:/
79868d130c6SBram Moolenaar    n = 77
79968d130c6SBram Moolenaar  endtry
80068d130c6SBram Moolenaar  assert_equal(77, n)
80168d130c6SBram Moolenaar
80268d130c6SBram Moolenaar  try
80368d130c6SBram Moolenaar    n = s:does_not_exist
80468d130c6SBram Moolenaar  catch /E121:/
805f0b9f43cSBram Moolenaar    n = 111
806f0b9f43cSBram Moolenaar  endtry
807f0b9f43cSBram Moolenaar  assert_equal(111, n)
808f0b9f43cSBram Moolenaar
809f0b9f43cSBram Moolenaar  try
810f0b9f43cSBram Moolenaar    n = g:does_not_exist
811f0b9f43cSBram Moolenaar  catch /E121:/
81268d130c6SBram Moolenaar    n = 121
81368d130c6SBram Moolenaar  endtry
81468d130c6SBram Moolenaar  assert_equal(121, n)
81568d130c6SBram Moolenaar
81668d130c6SBram Moolenaar  let d = #{one: 1}
81768d130c6SBram Moolenaar  try
81868d130c6SBram Moolenaar    n = d[g:astring]
81968d130c6SBram Moolenaar  catch /E716:/
82068d130c6SBram Moolenaar    n = 222
82168d130c6SBram Moolenaar  endtry
82268d130c6SBram Moolenaar  assert_equal(222, n)
823f0b9f43cSBram Moolenaar
824f0b9f43cSBram Moolenaar  try
825f0b9f43cSBram Moolenaar    n = -g:astring
826f0b9f43cSBram Moolenaar  catch /E39:/
827f0b9f43cSBram Moolenaar    n = 233
828f0b9f43cSBram Moolenaar  endtry
829f0b9f43cSBram Moolenaar  assert_equal(233, n)
830f0b9f43cSBram Moolenaar
831f0b9f43cSBram Moolenaar  try
832f0b9f43cSBram Moolenaar    n = +g:astring
833f0b9f43cSBram Moolenaar  catch /E1030:/
834f0b9f43cSBram Moolenaar    n = 244
835f0b9f43cSBram Moolenaar  endtry
836f0b9f43cSBram Moolenaar  assert_equal(244, n)
837f0b9f43cSBram Moolenaar
838f0b9f43cSBram Moolenaar  try
839f0b9f43cSBram Moolenaar    n = +g:alist
840f0b9f43cSBram Moolenaar  catch /E745:/
841f0b9f43cSBram Moolenaar    n = 255
842f0b9f43cSBram Moolenaar  endtry
843f0b9f43cSBram Moolenaar  assert_equal(255, n)
844f0b9f43cSBram Moolenaar
845f0b9f43cSBram Moolenaar  let nd: dict<any>
846f0b9f43cSBram Moolenaar  try
847f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
848f0b9f43cSBram Moolenaar  catch /E1029:/
849f0b9f43cSBram Moolenaar    n = 266
850f0b9f43cSBram Moolenaar  endtry
851f0b9f43cSBram Moolenaar  assert_equal(266, n)
852f0b9f43cSBram Moolenaar
853f0b9f43cSBram Moolenaar  try
854f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
855f0b9f43cSBram Moolenaar  catch /E1093:/
856f0b9f43cSBram Moolenaar    n = 277
857f0b9f43cSBram Moolenaar  endtry
858f0b9f43cSBram Moolenaar  assert_equal(277, n)
859f0b9f43cSBram Moolenaar
860e859312eSBram Moolenaar  try
861e859312eSBram Moolenaar    &ts = g:astring
862e859312eSBram Moolenaar  catch /E1029:/
863e859312eSBram Moolenaar    n = 288
864e859312eSBram Moolenaar  endtry
865e859312eSBram Moolenaar  assert_equal(288, n)
866e859312eSBram Moolenaar
867e859312eSBram Moolenaar  try
868e859312eSBram Moolenaar    &backspace = 'asdf'
869e859312eSBram Moolenaar  catch /E474:/
870e859312eSBram Moolenaar    n = 299
871e859312eSBram Moolenaar  endtry
872e859312eSBram Moolenaar  assert_equal(299, n)
873e859312eSBram Moolenaar
874e859312eSBram Moolenaar  l = [1]
875e859312eSBram Moolenaar  try
876e859312eSBram Moolenaar    l[3] = 3
877e859312eSBram Moolenaar  catch /E684:/
878e859312eSBram Moolenaar    n = 300
879e859312eSBram Moolenaar  endtry
880e859312eSBram Moolenaar  assert_equal(300, n)
881e859312eSBram Moolenaar
882e859312eSBram Moolenaar  try
883e859312eSBram Moolenaar    unlet g:does_not_exist
884e859312eSBram Moolenaar  catch /E108:/
885e859312eSBram Moolenaar    n = 322
886e859312eSBram Moolenaar  endtry
887e859312eSBram Moolenaar  assert_equal(322, n)
888e859312eSBram Moolenaar
889e859312eSBram Moolenaar  try
890e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
891e859312eSBram Moolenaar  catch /E721:/
892e859312eSBram Moolenaar    n = 333
893e859312eSBram Moolenaar  endtry
894e859312eSBram Moolenaar  assert_equal(333, n)
895e859312eSBram Moolenaar
896e859312eSBram Moolenaar  try
897e859312eSBram Moolenaar    l = DeletedFunc()
898e859312eSBram Moolenaar  catch /E933:/
899e859312eSBram Moolenaar    n = 344
900e859312eSBram Moolenaar  endtry
901e859312eSBram Moolenaar  assert_equal(344, n)
902d032f34aSBram Moolenaar
903d032f34aSBram Moolenaar  try
904d032f34aSBram Moolenaar    echo len(v:true)
905d032f34aSBram Moolenaar  catch /E701:/
906d032f34aSBram Moolenaar    n = 355
907d032f34aSBram Moolenaar  endtry
908d032f34aSBram Moolenaar  assert_equal(355, n)
909d032f34aSBram Moolenaar
910d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
911d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
912d032f34aSBram Moolenaar  try
913d032f34aSBram Moolenaar    echo P()
914d032f34aSBram Moolenaar  catch /E117:/
915d032f34aSBram Moolenaar    n = 366
916d032f34aSBram Moolenaar  endtry
917d032f34aSBram Moolenaar  assert_equal(366, n)
918d032f34aSBram Moolenaar
919d032f34aSBram Moolenaar  try
920d032f34aSBram Moolenaar    echo g:NoSuchFunc()
921d032f34aSBram Moolenaar  catch /E117:/
922d032f34aSBram Moolenaar    n = 377
923d032f34aSBram Moolenaar  endtry
924d032f34aSBram Moolenaar  assert_equal(377, n)
925d032f34aSBram Moolenaar
926d032f34aSBram Moolenaar  try
927d032f34aSBram Moolenaar    echo g:alist + 4
928d032f34aSBram Moolenaar  catch /E745:/
929d032f34aSBram Moolenaar    n = 388
930d032f34aSBram Moolenaar  endtry
931d032f34aSBram Moolenaar  assert_equal(388, n)
932d032f34aSBram Moolenaar
933d032f34aSBram Moolenaar  try
934d032f34aSBram Moolenaar    echo 4 + g:alist
935d032f34aSBram Moolenaar  catch /E745:/
936d032f34aSBram Moolenaar    n = 399
937d032f34aSBram Moolenaar  endtry
938d032f34aSBram Moolenaar  assert_equal(399, n)
939d032f34aSBram Moolenaar
940d032f34aSBram Moolenaar  try
941d032f34aSBram Moolenaar    echo g:alist.member
942d032f34aSBram Moolenaar  catch /E715:/
943d032f34aSBram Moolenaar    n = 400
944d032f34aSBram Moolenaar  endtry
945d032f34aSBram Moolenaar  assert_equal(400, n)
946d032f34aSBram Moolenaar
947d032f34aSBram Moolenaar  try
948d032f34aSBram Moolenaar    echo d.member
949d032f34aSBram Moolenaar  catch /E716:/
950d032f34aSBram Moolenaar    n = 411
951d032f34aSBram Moolenaar  endtry
952d032f34aSBram Moolenaar  assert_equal(411, n)
9538a7d6542SBram Moolenaarenddef
9548a7d6542SBram Moolenaar
955e859312eSBram Moolenaardef DeletedFunc(): list<any>
956e859312eSBram Moolenaar  return ['delete me']
957e859312eSBram Moolenaarenddef
958e859312eSBram Moolenaardefcompile
959e859312eSBram Moolenaardelfunc DeletedFunc
960e859312eSBram Moolenaar
961257cc5eeSBram Moolenaardef ThrowFromDef()
962a72cfb80SBram Moolenaar  throw "getout" # comment
963257cc5eeSBram Moolenaarenddef
964257cc5eeSBram Moolenaar
965257cc5eeSBram Moolenaarfunc CatchInFunc()
966257cc5eeSBram Moolenaar  try
967257cc5eeSBram Moolenaar    call ThrowFromDef()
968257cc5eeSBram Moolenaar  catch
969257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
970257cc5eeSBram Moolenaar  endtry
971257cc5eeSBram Moolenaarendfunc
972257cc5eeSBram Moolenaar
973257cc5eeSBram Moolenaardef CatchInDef()
974257cc5eeSBram Moolenaar  try
975257cc5eeSBram Moolenaar    ThrowFromDef()
976257cc5eeSBram Moolenaar  catch
977257cc5eeSBram Moolenaar    g:thrown_def = v:exception
978257cc5eeSBram Moolenaar  endtry
979257cc5eeSBram Moolenaarenddef
980257cc5eeSBram Moolenaar
981f575adffSBram Moolenaardef ReturnFinally(): string
982f575adffSBram Moolenaar  try
983f575adffSBram Moolenaar    return 'intry'
984f575adffSBram Moolenaar  finally
985f575adffSBram Moolenaar    g:in_finally = 'finally'
986f575adffSBram Moolenaar  endtry
987f575adffSBram Moolenaar  return 'end'
988f575adffSBram Moolenaarenddef
989f575adffSBram Moolenaar
990257cc5eeSBram Moolenaardef Test_try_catch_nested()
991257cc5eeSBram Moolenaar  CatchInFunc()
992257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
993257cc5eeSBram Moolenaar
994257cc5eeSBram Moolenaar  CatchInDef()
995257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
996f575adffSBram Moolenaar
997f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
998f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
999f575adffSBram Moolenaarenddef
1000f575adffSBram Moolenaar
1001f575adffSBram Moolenaardef Test_try_catch_match()
1002f575adffSBram Moolenaar  let seq = 'a'
1003f575adffSBram Moolenaar  try
1004f575adffSBram Moolenaar    throw 'something'
1005f575adffSBram Moolenaar  catch /nothing/
1006f575adffSBram Moolenaar    seq ..= 'x'
1007f575adffSBram Moolenaar  catch /some/
1008f575adffSBram Moolenaar    seq ..= 'b'
1009f575adffSBram Moolenaar  catch /asdf/
1010f575adffSBram Moolenaar    seq ..= 'x'
1011e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1012e8c4abbbSBram Moolenaar    seq ..= 'y'
1013f575adffSBram Moolenaar  finally
1014f575adffSBram Moolenaar    seq ..= 'c'
1015f575adffSBram Moolenaar  endtry
1016f575adffSBram Moolenaar  assert_equal('abc', seq)
1017257cc5eeSBram Moolenaarenddef
1018257cc5eeSBram Moolenaar
1019e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1020e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1021e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1022e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1023585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1024585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1025585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1026585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1027585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1028585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1029585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1030585fea7bSBram Moolenaar
1031a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1032585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1033e8c4abbbSBram Moolenaarenddef
1034e8c4abbbSBram Moolenaar
1035006ad48bSBram Moolenaardef Test_throw_vimscript()
1036f5be8cdbSBram Moolenaar  # only checks line continuation
1037006ad48bSBram Moolenaar  let lines =<< trim END
1038006ad48bSBram Moolenaar      vim9script
1039006ad48bSBram Moolenaar      try
1040006ad48bSBram Moolenaar        throw 'one'
1041006ad48bSBram Moolenaar              .. 'two'
1042006ad48bSBram Moolenaar      catch
1043006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1044006ad48bSBram Moolenaar      endtry
1045006ad48bSBram Moolenaar  END
1046006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1047006ad48bSBram Moolenaarenddef
1048006ad48bSBram Moolenaar
104937c83711SBram Moolenaardef Test_cexpr_vimscript()
1050f5be8cdbSBram Moolenaar  # only checks line continuation
105137c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
105237c83711SBram Moolenaar  let lines =<< trim END
105337c83711SBram Moolenaar      vim9script
105437c83711SBram Moolenaar      cexpr 'File'
105537c83711SBram Moolenaar                .. ' someFile' ..
105637c83711SBram Moolenaar                   ' line 19'
105737c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
105837c83711SBram Moolenaar  END
105937c83711SBram Moolenaar  CheckScriptSuccess(lines)
106037c83711SBram Moolenaar  set errorformat&
106137c83711SBram Moolenaarenddef
106237c83711SBram Moolenaar
1063b209750bSBram Moolenaardef Test_list_vimscript()
1064b209750bSBram Moolenaar  # checks line continuation and comments
1065b209750bSBram Moolenaar  let lines =<< trim END
1066b209750bSBram Moolenaar      vim9script
1067b209750bSBram Moolenaar      let mylist = [
1068b209750bSBram Moolenaar            'one',
1069b209750bSBram Moolenaar            # comment
1070b209750bSBram Moolenaar            'two', # empty line follows
1071b209750bSBram Moolenaar
1072b209750bSBram Moolenaar            'three',
1073b209750bSBram Moolenaar            ]
1074b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1075b209750bSBram Moolenaar  END
1076b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1077b209750bSBram Moolenaarenddef
1078b209750bSBram Moolenaar
10792a1381c3SBram Moolenaarif has('channel')
108040ee466cSBram Moolenaar  let someJob = test_null_job()
108140ee466cSBram Moolenaar
108240ee466cSBram Moolenaar  def FuncWithError()
108340ee466cSBram Moolenaar    echomsg g:someJob
108440ee466cSBram Moolenaar  enddef
108540ee466cSBram Moolenaar
108640ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
108740ee466cSBram Moolenaar    try
108840ee466cSBram Moolenaar      call FuncWithError()
108940ee466cSBram Moolenaar    catch
109040ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
109140ee466cSBram Moolenaar    endtry
109240ee466cSBram Moolenaar  endfunc
10932a1381c3SBram Moolenaarendif
109440ee466cSBram Moolenaar
10958a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10968a7d6542SBram Moolenaar  vim9script
10978a7d6542SBram Moolenaar  let name: string = 'bob'
10988a7d6542SBram Moolenaar  def Concat(arg: string): string
10998a7d6542SBram Moolenaar    return name .. arg
11008a7d6542SBram Moolenaar  enddef
1101227a69deSBram Moolenaar  g:result = Concat('bie')
1102227a69deSBram Moolenaar  g:localname = name
11038a7d6542SBram Moolenaar
11048a7d6542SBram Moolenaar  export const CONST = 1234
11058a7d6542SBram Moolenaar  export let exported = 9876
11066e587dcbSBram Moolenaar  export let exp_name = 'John'
11078a7d6542SBram Moolenaar  export def Exported(): string
11088a7d6542SBram Moolenaar    return 'Exported'
11098a7d6542SBram Moolenaar  enddef
11108a7d6542SBram MoolenaarEND
11118a7d6542SBram Moolenaar
11125269bd2aSBram Moolenaardef Test_vim9_import_export()
11138a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11148a7d6542SBram Moolenaar    vim9script
11158a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11168a7d6542SBram Moolenaar    g:imported = exported
11176e587dcbSBram Moolenaar    exported += 3
11186e587dcbSBram Moolenaar    g:imported_added = exported
11198a7d6542SBram Moolenaar    g:imported_func = Exported()
11206e587dcbSBram Moolenaar
112140f4f7a4SBram Moolenaar    def GetExported(): string
112240f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
112340f4f7a4SBram Moolenaar      return local_dict.ref()
112440f4f7a4SBram Moolenaar    enddef
112540f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
112640f4f7a4SBram Moolenaar
11276e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11286e587dcbSBram Moolenaar    g:imported_name = exp_name
11296e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11306e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11315381c7a1SBram Moolenaar    g:imported_later = exported
11328a7d6542SBram Moolenaar  END
11338a7d6542SBram Moolenaar
11348a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11358a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11368a7d6542SBram Moolenaar
11378a7d6542SBram Moolenaar  source Ximport.vim
11388a7d6542SBram Moolenaar
11398a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11408a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11418a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11426e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11435381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11448a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
114540f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11466e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11476e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11488a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11498a7d6542SBram Moolenaar
11508a7d6542SBram Moolenaar  unlet g:result
11518a7d6542SBram Moolenaar  unlet g:localname
11528a7d6542SBram Moolenaar  unlet g:imported
11536e587dcbSBram Moolenaar  unlet g:imported_added
11545381c7a1SBram Moolenaar  unlet g:imported_later
11558a7d6542SBram Moolenaar  unlet g:imported_func
11566e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11578a7d6542SBram Moolenaar  delete('Ximport.vim')
1158f2d5c240SBram Moolenaar
11591c991144SBram Moolenaar  # similar, with line breaks
11601c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11611c991144SBram Moolenaar    vim9script
11621c991144SBram Moolenaar    import {
11631c991144SBram Moolenaar        exported,
11641c991144SBram Moolenaar        Exported,
11651c991144SBram Moolenaar        }
11661c991144SBram Moolenaar        from
11671c991144SBram Moolenaar        './Xexport.vim'
11681c991144SBram Moolenaar    g:imported = exported
11691c991144SBram Moolenaar    exported += 5
11701c991144SBram Moolenaar    g:imported_added = exported
11711c991144SBram Moolenaar    g:imported_func = Exported()
11721c991144SBram Moolenaar  END
11731c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11741c991144SBram Moolenaar  source Ximport_lbr.vim
11751c991144SBram Moolenaar
11761c991144SBram Moolenaar  assert_equal(9876, g:imported)
11771c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11781c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11791c991144SBram Moolenaar
11801c991144SBram Moolenaar  # exported script not sourced again
11811c991144SBram Moolenaar  assert_false(exists('g:result'))
11821c991144SBram Moolenaar  unlet g:imported
11831c991144SBram Moolenaar  unlet g:imported_added
11841c991144SBram Moolenaar  unlet g:imported_func
11851c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11861c991144SBram Moolenaar
11871c991144SBram Moolenaar  # import inside :def function
11885381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
11895381c7a1SBram Moolenaar    vim9script
11905381c7a1SBram Moolenaar    def ImportInDef()
11915381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11925381c7a1SBram Moolenaar      g:imported = exported
11935381c7a1SBram Moolenaar      exported += 7
11945381c7a1SBram Moolenaar      g:imported_added = exported
11955381c7a1SBram Moolenaar    enddef
11965381c7a1SBram Moolenaar    ImportInDef()
11975381c7a1SBram Moolenaar  END
11985381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11995381c7a1SBram Moolenaar  source Ximport2.vim
1200f5be8cdbSBram Moolenaar  # TODO: this should be 9879
12015381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
12025381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
12035381c7a1SBram Moolenaar  unlet g:imported
12045381c7a1SBram Moolenaar  unlet g:imported_added
12055381c7a1SBram Moolenaar  delete('Ximport2.vim')
12065381c7a1SBram Moolenaar
1207f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1208f2d5c240SBram Moolenaar    vim9script
1209f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1210f2d5c240SBram Moolenaar    def UseExport()
1211f2d5c240SBram Moolenaar      g:imported = Export.exported
1212f2d5c240SBram Moolenaar    enddef
1213f2d5c240SBram Moolenaar    UseExport()
1214f2d5c240SBram Moolenaar  END
1215f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1216f2d5c240SBram Moolenaar  source Ximport.vim
12175381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1218f2d5c240SBram Moolenaar
1219599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1220599c89c8SBram Moolenaar    vim9script
1221599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1222599c89c8SBram Moolenaar    def Func()
1223599c89c8SBram Moolenaar      let dummy = 1
1224599c89c8SBram Moolenaar      let imported = Export + dummy
1225599c89c8SBram Moolenaar    enddef
1226822ba247SBram Moolenaar    defcompile
1227599c89c8SBram Moolenaar  END
1228599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1229599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1230599c89c8SBram Moolenaar
1231599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1232599c89c8SBram Moolenaar    vim9script
1233599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1234599c89c8SBram Moolenaar    def Func()
1235599c89c8SBram Moolenaar      let imported = Export . exported
1236599c89c8SBram Moolenaar    enddef
1237822ba247SBram Moolenaar    defcompile
1238599c89c8SBram Moolenaar  END
1239599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1240599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1241599c89c8SBram Moolenaar
1242599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1243599c89c8SBram Moolenaar    vim9script
1244599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1245599c89c8SBram Moolenaar    def Func()
1246599c89c8SBram Moolenaar      let imported = Export.
1247599c89c8SBram Moolenaar    enddef
1248822ba247SBram Moolenaar    defcompile
1249599c89c8SBram Moolenaar  END
1250599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1251599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1252599c89c8SBram Moolenaar
12531c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12541c991144SBram Moolenaar    vim9script
12551c991144SBram Moolenaar    import *
12561c991144SBram Moolenaar        as Export
12571c991144SBram Moolenaar        from
12581c991144SBram Moolenaar        './Xexport.vim'
12591c991144SBram Moolenaar    def UseExport()
12601c991144SBram Moolenaar      g:imported = Export.exported
12611c991144SBram Moolenaar    enddef
12621c991144SBram Moolenaar    UseExport()
12631c991144SBram Moolenaar  END
12641c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12651c991144SBram Moolenaar  source Ximport.vim
12661c991144SBram Moolenaar  assert_equal(9883, g:imported)
12671c991144SBram Moolenaar
1268f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1269f2d5c240SBram Moolenaar    vim9script
1270f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1271f2d5c240SBram Moolenaar  END
1272f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1273f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1274f2d5c240SBram Moolenaar
1275f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1276fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1277fa29c8abSBram Moolenaar    vim9script
1278fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1279fa29c8abSBram Moolenaar  END
1280fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1281fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1282fa29c8abSBram Moolenaar
1283f5be8cdbSBram Moolenaar  # try to import something that is already defined
12845269bd2aSBram Moolenaar  let import_already_defined =<< trim END
12855269bd2aSBram Moolenaar    vim9script
12865269bd2aSBram Moolenaar    let exported = 'something'
12875269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12885269bd2aSBram Moolenaar  END
12895269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12905269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12915269bd2aSBram Moolenaar
1292f5be8cdbSBram Moolenaar  # try to import something that is already defined
12935269bd2aSBram Moolenaar  import_already_defined =<< trim END
12945269bd2aSBram Moolenaar    vim9script
12955269bd2aSBram Moolenaar    let exported = 'something'
12965269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12975269bd2aSBram Moolenaar  END
12985269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12995269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13005269bd2aSBram Moolenaar
1301f5be8cdbSBram Moolenaar  # try to import something that is already defined
13025269bd2aSBram Moolenaar  import_already_defined =<< trim END
13035269bd2aSBram Moolenaar    vim9script
13045269bd2aSBram Moolenaar    let exported = 'something'
13055269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13065269bd2aSBram Moolenaar  END
13075269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
13085269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
13095269bd2aSBram Moolenaar
1310f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1311fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1312fa29c8abSBram Moolenaar    vim9script
1313fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1314fa29c8abSBram Moolenaar  END
1315fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1316fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1317fa29c8abSBram Moolenaar
1318fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1319fa29c8abSBram Moolenaar    vim9script
1320fa29c8abSBram Moolenaar    import name './Xexport.vim'
1321fa29c8abSBram Moolenaar  END
1322fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1323fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1324fa29c8abSBram Moolenaar
1325fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1326fa29c8abSBram Moolenaar    vim9script
1327fa29c8abSBram Moolenaar    import name from Xexport.vim
1328fa29c8abSBram Moolenaar  END
1329fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1330fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1331fa29c8abSBram Moolenaar
1332fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1333fa29c8abSBram Moolenaar    vim9script
1334fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1335fa29c8abSBram Moolenaar  END
1336fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1337fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1338fa29c8abSBram Moolenaar
1339fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1340fa29c8abSBram Moolenaar    vim9script
1341fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1342fa29c8abSBram Moolenaar  END
13435269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13445269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1345fa29c8abSBram Moolenaar
1346f2d5c240SBram Moolenaar  delete('Ximport.vim')
13475269bd2aSBram Moolenaar  delete('Ximport3.vim')
13488a7d6542SBram Moolenaar  delete('Xexport.vim')
13498a7d6542SBram Moolenaar
1350f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1351750802b5SBram Moolenaar  set cpo&vi
1352750802b5SBram Moolenaar  let cpo_before = &cpo
1353750802b5SBram Moolenaar  let lines =<< trim END
1354750802b5SBram Moolenaar    vim9script
1355750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1356750802b5SBram Moolenaar  END
1357750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1358750802b5SBram Moolenaar  source Xvim9_script
1359750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1360750802b5SBram Moolenaar  set cpo&vim
1361750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1362750802b5SBram Moolenaar  delete('Xvim9_script')
1363750802b5SBram Moolenaarenddef
1364750802b5SBram Moolenaar
1365803af686SBram Moolenaarfunc g:Trigger()
1366803af686SBram Moolenaar  source Ximport.vim
1367803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1368803af686SBram Moolenaarendfunc
1369803af686SBram Moolenaar
1370803af686SBram Moolenaardef Test_import_export_expr_map()
1371803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1372803af686SBram Moolenaar  let export_lines =<< trim END
1373803af686SBram Moolenaar    vim9script
1374803af686SBram Moolenaar    export def That(): string
1375803af686SBram Moolenaar      return 'yes'
1376803af686SBram Moolenaar    enddef
1377803af686SBram Moolenaar  END
1378803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1379803af686SBram Moolenaar
1380803af686SBram Moolenaar  let import_lines =<< trim END
1381803af686SBram Moolenaar    vim9script
1382803af686SBram Moolenaar    import That from './Xexport_that.vim'
1383803af686SBram Moolenaar    assert_equal('yes', That())
1384803af686SBram Moolenaar  END
1385803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1386803af686SBram Moolenaar
1387803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1388803af686SBram Moolenaar  feedkeys('trigger', "xt")
1389803af686SBram Moolenaar
1390803af686SBram Moolenaar  delete('Xexport.vim')
1391803af686SBram Moolenaar  delete('Ximport.vim')
1392803af686SBram Moolenaar  nunmap trigger
1393803af686SBram Moolenaarenddef
1394803af686SBram Moolenaar
13958e1986e3SBram Moolenaardef Test_import_in_filetype()
13968e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13978e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
13988e1986e3SBram Moolenaar  let export_lines =<< trim END
13998e1986e3SBram Moolenaar    vim9script
14008e1986e3SBram Moolenaar    export let That = 'yes'
14018e1986e3SBram Moolenaar  END
14028e1986e3SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_that.vim')
14038e1986e3SBram Moolenaar
14048e1986e3SBram Moolenaar  let import_lines =<< trim END
14058e1986e3SBram Moolenaar    vim9script
14068e1986e3SBram Moolenaar    import That from './Xexport_that.vim'
14078e1986e3SBram Moolenaar    assert_equal('yes', That)
14088e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14098e1986e3SBram Moolenaar  END
14108e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14118e1986e3SBram Moolenaar
14128e1986e3SBram Moolenaar  let save_rtp = &rtp
14138e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14148e1986e3SBram Moolenaar
14158e1986e3SBram Moolenaar  filetype plugin on
14168e1986e3SBram Moolenaar  copen
14178e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14188e1986e3SBram Moolenaar
14198e1986e3SBram Moolenaar  quit!
14208e1986e3SBram Moolenaar  delete('Xexport.vim')
14218e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14228e1986e3SBram Moolenaar  &rtp = save_rtp
14238e1986e3SBram Moolenaarenddef
14248e1986e3SBram Moolenaar
1425750802b5SBram Moolenaardef Test_vim9script_fails()
14268a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14278a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1428750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
14299721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
14309b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1431750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1432750802b5SBram Moolenaar
1433c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1434c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1435c785b9a7SBram Moolenaar
1436750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1437a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
14388a7d6542SBram Moolenaarenddef
14398a7d6542SBram Moolenaar
1440f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1441101f4810SBram Moolenaar  CheckRunVimInTerminal
1442101f4810SBram Moolenaar
14439bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1444c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14459bb3eb3eSBram Moolenaarendfunc
14469bb3eb3eSBram Moolenaar
1447c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1448101f4810SBram Moolenaar  let export =<< trim END
1449101f4810SBram Moolenaar    vim9script
1450101f4810SBram Moolenaar    export def Foo(): number
1451101f4810SBram Moolenaar        return 0
1452101f4810SBram Moolenaar    enddef
1453101f4810SBram Moolenaar  END
14549bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1455101f4810SBram Moolenaar
14569bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
14579bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14589bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1459101f4810SBram Moolenaar
14609bb3eb3eSBram Moolenaar  delete('Xexport.vim')
14619bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14629bb3eb3eSBram Moolenaarenddef
1463101f4810SBram Moolenaar
14644c17ad94SBram Moolenaardef Test_vim9script_reload_import()
14658a7d6542SBram Moolenaar  let lines =<< trim END
14668a7d6542SBram Moolenaar    vim9script
14678a7d6542SBram Moolenaar    const var = ''
14688a7d6542SBram Moolenaar    let valone = 1234
14698a7d6542SBram Moolenaar    def MyFunc(arg: string)
14708a7d6542SBram Moolenaar       valone = 5678
14718a7d6542SBram Moolenaar    enddef
14728a7d6542SBram Moolenaar  END
14738a7d6542SBram Moolenaar  let morelines =<< trim END
14748a7d6542SBram Moolenaar    let valtwo = 222
14758a7d6542SBram Moolenaar    export def GetValtwo(): number
14768a7d6542SBram Moolenaar      return valtwo
14778a7d6542SBram Moolenaar    enddef
14788a7d6542SBram Moolenaar  END
147903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14808a7d6542SBram Moolenaar  source Xreload.vim
14818a7d6542SBram Moolenaar  source Xreload.vim
14828a7d6542SBram Moolenaar  source Xreload.vim
14838a7d6542SBram Moolenaar
14848a7d6542SBram Moolenaar  let testlines =<< trim END
14858a7d6542SBram Moolenaar    vim9script
14868a7d6542SBram Moolenaar    def TheFunc()
14878a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14888a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14898a7d6542SBram Moolenaar    enddef
14908a7d6542SBram Moolenaar    TheFunc()
14918a7d6542SBram Moolenaar  END
14928a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14938a7d6542SBram Moolenaar  source Ximport.vim
14948a7d6542SBram Moolenaar
1495f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1496f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14978a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14988a7d6542SBram Moolenaar  source Ximport.vim
14998a7d6542SBram Moolenaar
1500f5be8cdbSBram Moolenaar  # cannot declare a var twice
15018a7d6542SBram Moolenaar  lines =<< trim END
15028a7d6542SBram Moolenaar    vim9script
15038a7d6542SBram Moolenaar    let valone = 1234
15048a7d6542SBram Moolenaar    let valone = 5678
15058a7d6542SBram Moolenaar  END
15068a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15078a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
15088a7d6542SBram Moolenaar
15098a7d6542SBram Moolenaar  delete('Xreload.vim')
15108a7d6542SBram Moolenaar  delete('Ximport.vim')
15118a7d6542SBram Moolenaarenddef
15128a7d6542SBram Moolenaar
1513fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1514fe465a01SBram Moolenaar" script-local name.
1515fe465a01SBram Moolenaardef Test_vim9script_funcref()
1516fe465a01SBram Moolenaar  let sortlines =<< trim END
1517fe465a01SBram Moolenaar      vim9script
1518fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1519bed36b93SBram Moolenaar        return i2 - i1
1520fe465a01SBram Moolenaar      enddef
1521fe465a01SBram Moolenaar
1522fe465a01SBram Moolenaar      export def FastSort(): list<number>
1523fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1524fe465a01SBram Moolenaar      enddef
1525fe465a01SBram Moolenaar  END
1526fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1527fe465a01SBram Moolenaar
1528fe465a01SBram Moolenaar  let lines =<< trim END
1529fe465a01SBram Moolenaar    vim9script
1530fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1531fe465a01SBram Moolenaar    def Test()
1532fe465a01SBram Moolenaar      g:result = FastSort()
1533fe465a01SBram Moolenaar    enddef
1534fe465a01SBram Moolenaar    Test()
1535fe465a01SBram Moolenaar  END
1536fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1537fe465a01SBram Moolenaar
1538fe465a01SBram Moolenaar  source Xscript.vim
1539fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1540fe465a01SBram Moolenaar
1541fe465a01SBram Moolenaar  unlet g:result
1542fe465a01SBram Moolenaar  delete('Xsort.vim')
1543fe465a01SBram Moolenaar  delete('Xscript.vim')
1544fe465a01SBram Moolenaarenddef
1545fe465a01SBram Moolenaar
1546c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1547c620c055SBram Moolenaar" script where FastFilter() is called from.
1548c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1549c620c055SBram Moolenaar  let filterLines =<< trim END
1550c620c055SBram Moolenaar    vim9script
1551c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1552c620c055SBram Moolenaar      return idx % 2 == 1
1553c620c055SBram Moolenaar    enddef
1554c620c055SBram Moolenaar    export def FastFilter(): list<number>
1555c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1556c620c055SBram Moolenaar    enddef
1557c620c055SBram Moolenaar  END
1558c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1559c620c055SBram Moolenaar
1560c620c055SBram Moolenaar  let lines =<< trim END
1561c620c055SBram Moolenaar    vim9script
1562c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1563c620c055SBram Moolenaar    def Test()
1564c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1565c620c055SBram Moolenaar    enddef
1566c620c055SBram Moolenaar    Test()
1567c620c055SBram Moolenaar  END
1568c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1569c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1570c620c055SBram Moolenaar
1571c620c055SBram Moolenaar  delete('Xfilter.vim')
1572c620c055SBram Moolenaar  delete('Ximport.vim')
1573c620c055SBram Moolenaarenddef
1574c620c055SBram Moolenaar
15754c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
15764c17ad94SBram Moolenaar  let first_lines =<< trim END
15774c17ad94SBram Moolenaar    vim9script
15784c17ad94SBram Moolenaar    def FuncYes(): string
15794c17ad94SBram Moolenaar      return 'yes'
15804c17ad94SBram Moolenaar    enddef
15814c17ad94SBram Moolenaar  END
158203afdcf1SBram Moolenaar  let withno_lines =<< trim END
15834c17ad94SBram Moolenaar    def FuncNo(): string
15844c17ad94SBram Moolenaar      return 'no'
15854c17ad94SBram Moolenaar    enddef
15864c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15874c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15884c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
158903afdcf1SBram Moolenaar    enddef
159003afdcf1SBram Moolenaar  END
159103afdcf1SBram Moolenaar  let nono_lines =<< trim END
159203afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
159303afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
15944c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
15954c17ad94SBram Moolenaar    enddef
15964c17ad94SBram Moolenaar  END
15974c17ad94SBram Moolenaar
15984c17ad94SBram Moolenaar  # FuncNo() is defined
159903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16004c17ad94SBram Moolenaar  source Xreloaded.vim
16014c17ad94SBram Moolenaar  g:DoCheck(true)
16024c17ad94SBram Moolenaar
16034c17ad94SBram Moolenaar  # FuncNo() is not redefined
160403afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16054c17ad94SBram Moolenaar  source Xreloaded.vim
160603afdcf1SBram Moolenaar  g:DoCheck()
16074c17ad94SBram Moolenaar
16084c17ad94SBram Moolenaar  # FuncNo() is back
160903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16104c17ad94SBram Moolenaar  source Xreloaded.vim
161103afdcf1SBram Moolenaar  g:DoCheck()
16124c17ad94SBram Moolenaar
16134c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16144c17ad94SBram Moolenaarenddef
16154c17ad94SBram Moolenaar
161689483d40SBram Moolenaardef Test_vim9script_reload_delvar()
161789483d40SBram Moolenaar  # write the script with a script-local variable
161889483d40SBram Moolenaar  let lines =<< trim END
161989483d40SBram Moolenaar    vim9script
162089483d40SBram Moolenaar    let var = 'string'
162189483d40SBram Moolenaar  END
162289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
162389483d40SBram Moolenaar  source XreloadVar.vim
162489483d40SBram Moolenaar
162589483d40SBram Moolenaar  # now write the script using the same variable locally - works
162689483d40SBram Moolenaar  lines =<< trim END
162789483d40SBram Moolenaar    vim9script
162889483d40SBram Moolenaar    def Func()
162989483d40SBram Moolenaar      let var = 'string'
163089483d40SBram Moolenaar    enddef
163189483d40SBram Moolenaar  END
163289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
163389483d40SBram Moolenaar  source XreloadVar.vim
163489483d40SBram Moolenaar
163589483d40SBram Moolenaar  delete('XreloadVar.vim')
163689483d40SBram Moolenaarenddef
163789483d40SBram Moolenaar
16388a7d6542SBram Moolenaardef Test_import_absolute()
16398a7d6542SBram Moolenaar  let import_lines = [
1640e6085c53SBram Moolenaar        'vim9script',
1641e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1642e6085c53SBram Moolenaar        'def UseExported()',
1643e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1644e6085c53SBram Moolenaar        '  exported = 8888',
1645e6085c53SBram Moolenaar        '  g:imported_after = exported',
1646e6085c53SBram Moolenaar        'enddef',
1647e6085c53SBram Moolenaar        'UseExported()',
1648e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1649e6085c53SBram Moolenaar        ]
16508a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16528a7d6542SBram Moolenaar
16538a7d6542SBram Moolenaar  source Ximport_abs.vim
16548a7d6542SBram Moolenaar
16558a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16564e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1657675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1658675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1659675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1660675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1661675f716eSBram Moolenaar          'exported = 8888.*' ..
1662675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1663675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1664675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1665675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1666e6085c53SBram Moolenaar        g:import_disassembled)
16678a7d6542SBram Moolenaar  unlet g:imported_abs
16684e12a5dfSBram Moolenaar  unlet g:import_disassembled
16698a7d6542SBram Moolenaar
16708a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16718a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16728a7d6542SBram Moolenaarenddef
16738a7d6542SBram Moolenaar
16748a7d6542SBram Moolenaardef Test_import_rtp()
16758a7d6542SBram Moolenaar  let import_lines = [
1676e6085c53SBram Moolenaar        'vim9script',
1677e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1678e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1679e6085c53SBram Moolenaar        ]
16808a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16818a7d6542SBram Moolenaar  mkdir('import')
16828a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16838a7d6542SBram Moolenaar
16848a7d6542SBram Moolenaar  let save_rtp = &rtp
16858a7d6542SBram Moolenaar  &rtp = getcwd()
16868a7d6542SBram Moolenaar  source Ximport_rtp.vim
16878a7d6542SBram Moolenaar  &rtp = save_rtp
16888a7d6542SBram Moolenaar
16898a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16908a7d6542SBram Moolenaar  unlet g:imported_rtp
16918a7d6542SBram Moolenaar
16928a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
169389483d40SBram Moolenaar  delete('import', 'rf')
16948a7d6542SBram Moolenaarenddef
16958a7d6542SBram Moolenaar
169625e0f586SBram Moolenaardef Test_import_compile_error()
169725e0f586SBram Moolenaar  let export_lines = [
169825e0f586SBram Moolenaar        'vim9script',
169925e0f586SBram Moolenaar        'export def ExpFunc(): string',
170025e0f586SBram Moolenaar        '  return notDefined',
170125e0f586SBram Moolenaar        'enddef',
170225e0f586SBram Moolenaar        ]
170325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
170425e0f586SBram Moolenaar
170525e0f586SBram Moolenaar  let import_lines = [
170625e0f586SBram Moolenaar        'vim9script',
170725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
170825e0f586SBram Moolenaar        'def ImpFunc()',
170925e0f586SBram Moolenaar        '  echo ExpFunc()',
171025e0f586SBram Moolenaar        'enddef',
171125e0f586SBram Moolenaar        'defcompile',
171225e0f586SBram Moolenaar        ]
171325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
171425e0f586SBram Moolenaar
171525e0f586SBram Moolenaar  try
171625e0f586SBram Moolenaar    source Ximport.vim
171725e0f586SBram Moolenaar  catch /E1001/
1718f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
171925e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
172025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
172125e0f586SBram Moolenaar  endtry
172225e0f586SBram Moolenaar
172325e0f586SBram Moolenaar  delete('Xexported.vim')
172425e0f586SBram Moolenaar  delete('Ximport.vim')
172525e0f586SBram Moolenaarenddef
172625e0f586SBram Moolenaar
1727eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1728eef2102eSBram Moolenaar  let export_lines =<< trim END
1729eef2102eSBram Moolenaar      vim9script
1730eef2102eSBram Moolenaar      export def Func()
1731eef2102eSBram Moolenaar        echo 'imported'
1732eef2102eSBram Moolenaar      enddef
1733eef2102eSBram Moolenaar  END
1734eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1735eef2102eSBram Moolenaar
1736eef2102eSBram Moolenaar  let lines =<< trim END
1737eef2102eSBram Moolenaar    vim9script
1738eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1739eef2102eSBram Moolenaar    def Func()
1740eef2102eSBram Moolenaar      echo 'local to function'
1741eef2102eSBram Moolenaar    enddef
1742eef2102eSBram Moolenaar  END
1743eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1744eef2102eSBram Moolenaar
1745eef2102eSBram Moolenaar  lines =<< trim END
1746eef2102eSBram Moolenaar    vim9script
1747eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1748eef2102eSBram Moolenaar    def Outer()
1749eef2102eSBram Moolenaar      def Func()
1750eef2102eSBram Moolenaar        echo 'local to function'
1751eef2102eSBram Moolenaar      enddef
1752eef2102eSBram Moolenaar    enddef
1753eef2102eSBram Moolenaar    defcompile
1754eef2102eSBram Moolenaar  END
1755eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1756eef2102eSBram Moolenaar
1757eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1758eef2102eSBram Moolenaarenddef
1759eef2102eSBram Moolenaar
1760b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1761b9a2cac3SBram Moolenaar  let lines =<< trim END
1762b9a2cac3SBram Moolenaar    vim9script
1763b9a2cac3SBram Moolenaar    def Func()
1764b9a2cac3SBram Moolenaar      echo 'one'
1765b9a2cac3SBram Moolenaar    enddef
1766b9a2cac3SBram Moolenaar    def Func()
1767b9a2cac3SBram Moolenaar      echo 'two'
1768b9a2cac3SBram Moolenaar    enddef
1769b9a2cac3SBram Moolenaar  END
1770b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1771b9a2cac3SBram Moolenaarenddef
1772b9a2cac3SBram Moolenaar
17738a7d6542SBram Moolenaardef Test_fixed_size_list()
1774f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
17758a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
17768a7d6542SBram Moolenaar  l->remove(0)
17778a7d6542SBram Moolenaar  l->add(5)
17788a7d6542SBram Moolenaar  l->insert(99, 1)
17790f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17808a7d6542SBram Moolenaarenddef
17818a7d6542SBram Moolenaar
1782ae616494SBram Moolenaardef Test_no_insert_xit()
1783ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1784ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1785f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1786f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1787f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1788ae616494SBram Moolenaar
1789ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1790ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1791ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1792ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1793f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1794f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1795f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1796f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1797f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1798ae616494SBram Moolenaarenddef
1799ae616494SBram Moolenaar
1800158906cfSBram Moolenaardef IfElse(what: number): string
1801158906cfSBram Moolenaar  let res = ''
1802158906cfSBram Moolenaar  if what == 1
1803158906cfSBram Moolenaar    res = "one"
1804158906cfSBram Moolenaar  elseif what == 2
1805158906cfSBram Moolenaar    res = "two"
1806a259d8d3SBram Moolenaar  else
1807158906cfSBram Moolenaar    res = "three"
1808a259d8d3SBram Moolenaar  endif
1809158906cfSBram Moolenaar  return res
1810a259d8d3SBram Moolenaarenddef
1811a259d8d3SBram Moolenaar
1812158906cfSBram Moolenaardef Test_if_elseif_else()
1813158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1814158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1815158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18160f18b6d1SBram Moolenaarenddef
18170f18b6d1SBram Moolenaar
1818e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1819e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1820e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1821e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1822e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1823585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1824e8c4abbbSBram Moolenaarenddef
1825e8c4abbbSBram Moolenaar
18266d69bf60SBram Moolenaarlet g:bool_true = v:true
18276d69bf60SBram Moolenaarlet g:bool_false = v:false
18286d69bf60SBram Moolenaar
18296d69bf60SBram Moolenaardef Test_if_const_expr()
18306d69bf60SBram Moolenaar  let res = false
18316d69bf60SBram Moolenaar  if true ? true : false
18326d69bf60SBram Moolenaar    res = true
18336d69bf60SBram Moolenaar  endif
18346d69bf60SBram Moolenaar  assert_equal(true, res)
18356d69bf60SBram Moolenaar
1836585fea7bSBram Moolenaar  g:glob = 2
1837585fea7bSBram Moolenaar  if false
18386797966dSBram Moolenaar    execute('g:glob = 3')
1839585fea7bSBram Moolenaar  endif
1840585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1841585fea7bSBram Moolenaar  if true
18426797966dSBram Moolenaar    execute('g:glob = 3')
1843585fea7bSBram Moolenaar  endif
1844585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1845585fea7bSBram Moolenaar
18466d69bf60SBram Moolenaar  res = false
18476d69bf60SBram Moolenaar  if g:bool_true ? true : false
18486d69bf60SBram Moolenaar    res = true
18496d69bf60SBram Moolenaar  endif
18506d69bf60SBram Moolenaar  assert_equal(true, res)
18516d69bf60SBram Moolenaar
18526d69bf60SBram Moolenaar  res = false
18536d69bf60SBram Moolenaar  if true ? g:bool_true : false
18546d69bf60SBram Moolenaar    res = true
18556d69bf60SBram Moolenaar  endif
18566d69bf60SBram Moolenaar  assert_equal(true, res)
18576d69bf60SBram Moolenaar
18586d69bf60SBram Moolenaar  res = false
18596d69bf60SBram Moolenaar  if true ? true : g:bool_false
18606d69bf60SBram Moolenaar    res = true
18616d69bf60SBram Moolenaar  endif
18626d69bf60SBram Moolenaar  assert_equal(true, res)
18636d69bf60SBram Moolenaar
18646d69bf60SBram Moolenaar  res = false
18656d69bf60SBram Moolenaar  if true ? false : true
18666d69bf60SBram Moolenaar    res = true
18676d69bf60SBram Moolenaar  endif
18686d69bf60SBram Moolenaar  assert_equal(false, res)
18696d69bf60SBram Moolenaar
18706d69bf60SBram Moolenaar  res = false
18716d69bf60SBram Moolenaar  if false ? false : true
18726d69bf60SBram Moolenaar    res = true
18736d69bf60SBram Moolenaar  endif
18746d69bf60SBram Moolenaar  assert_equal(true, res)
18756d69bf60SBram Moolenaar
18766d69bf60SBram Moolenaar  res = false
18776d69bf60SBram Moolenaar  if false ? true : false
18786d69bf60SBram Moolenaar    res = true
18796d69bf60SBram Moolenaar  endif
18806d69bf60SBram Moolenaar  assert_equal(false, res)
18816d69bf60SBram Moolenaar
18826d69bf60SBram Moolenaar  res = false
1883e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1884e8c4abbbSBram Moolenaar    res = true
1885e8c4abbbSBram Moolenaar  endif
1886e8c4abbbSBram Moolenaar  assert_equal(false, res)
1887e8c4abbbSBram Moolenaar
1888e8c4abbbSBram Moolenaar  res = false
18896d69bf60SBram Moolenaar  if true && true
18906d69bf60SBram Moolenaar    res = true
18916d69bf60SBram Moolenaar  endif
18926d69bf60SBram Moolenaar  assert_equal(true, res)
18936d69bf60SBram Moolenaar
18946d69bf60SBram Moolenaar  res = false
18956d69bf60SBram Moolenaar  if true && false
18966d69bf60SBram Moolenaar    res = true
18976d69bf60SBram Moolenaar  endif
18986d69bf60SBram Moolenaar  assert_equal(false, res)
18996d69bf60SBram Moolenaar
19006d69bf60SBram Moolenaar  res = false
19016d69bf60SBram Moolenaar  if g:bool_true && false
19026d69bf60SBram Moolenaar    res = true
19036d69bf60SBram Moolenaar  endif
19046d69bf60SBram Moolenaar  assert_equal(false, res)
19056d69bf60SBram Moolenaar
19066d69bf60SBram Moolenaar  res = false
19076d69bf60SBram Moolenaar  if true && g:bool_false
19086d69bf60SBram Moolenaar    res = true
19096d69bf60SBram Moolenaar  endif
19106d69bf60SBram Moolenaar  assert_equal(false, res)
19116d69bf60SBram Moolenaar
19126d69bf60SBram Moolenaar  res = false
19136d69bf60SBram Moolenaar  if false && false
19146d69bf60SBram Moolenaar    res = true
19156d69bf60SBram Moolenaar  endif
19166d69bf60SBram Moolenaar  assert_equal(false, res)
19176d69bf60SBram Moolenaar
19186d69bf60SBram Moolenaar  res = false
19196d69bf60SBram Moolenaar  if true || false
19206d69bf60SBram Moolenaar    res = true
19216d69bf60SBram Moolenaar  endif
19226d69bf60SBram Moolenaar  assert_equal(true, res)
19236d69bf60SBram Moolenaar
19246d69bf60SBram Moolenaar  res = false
19256d69bf60SBram Moolenaar  if g:bool_true || false
19266d69bf60SBram Moolenaar    res = true
19276d69bf60SBram Moolenaar  endif
19286d69bf60SBram Moolenaar  assert_equal(true, res)
19296d69bf60SBram Moolenaar
19306d69bf60SBram Moolenaar  res = false
19316d69bf60SBram Moolenaar  if true || g:bool_false
19326d69bf60SBram Moolenaar    res = true
19336d69bf60SBram Moolenaar  endif
19346d69bf60SBram Moolenaar  assert_equal(true, res)
19356d69bf60SBram Moolenaar
19366d69bf60SBram Moolenaar  res = false
19376d69bf60SBram Moolenaar  if false || false
19386d69bf60SBram Moolenaar    res = true
19396d69bf60SBram Moolenaar  endif
19406d69bf60SBram Moolenaar  assert_equal(false, res)
194180c34ca3SBram Moolenaarenddef
19426d69bf60SBram Moolenaar
194380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
194480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
194580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1946e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1947e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19486d69bf60SBram Moolenaarenddef
19496d69bf60SBram Moolenaar
195072abcf42SBram Moolenaardef RunNested(i: number): number
195172abcf42SBram Moolenaar  let x: number = 0
195272abcf42SBram Moolenaar  if i % 2
195372abcf42SBram Moolenaar    if 1
1954f5be8cdbSBram Moolenaar      # comment
195572abcf42SBram Moolenaar    else
1956f5be8cdbSBram Moolenaar      # comment
195772abcf42SBram Moolenaar    endif
195872abcf42SBram Moolenaar    x += 1
195972abcf42SBram Moolenaar  else
196072abcf42SBram Moolenaar    x += 1000
196172abcf42SBram Moolenaar  endif
196272abcf42SBram Moolenaar  return x
196372abcf42SBram Moolenaarenddef
196472abcf42SBram Moolenaar
196572abcf42SBram Moolenaardef Test_nested_if()
196672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
196772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
196872abcf42SBram Moolenaarenddef
196972abcf42SBram Moolenaar
1970ad39c094SBram Moolenaardef Test_execute_cmd()
1971ad39c094SBram Moolenaar  new
1972ad39c094SBram Moolenaar  setline(1, 'default')
1973ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1974ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1975a72cfb80SBram Moolenaar
1976a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1977a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1978a72cfb80SBram Moolenaar
1979ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1980ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1981a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1982ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1983a72cfb80SBram Moolenaar
1984ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1985ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1986a72cfb80SBram Moolenaar
1987ad39c094SBram Moolenaar  let cmd_first = 'call '
1988ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1989ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1990ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1991ad39c094SBram Moolenaar  bwipe!
1992585fea7bSBram Moolenaar
19932d6b20d6SBram Moolenaar  let n = true
19942d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
19952d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
19962d6b20d6SBram Moolenaar
1997585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1998a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1999ad39c094SBram Moolenaarenddef
2000ad39c094SBram Moolenaar
200147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2002f5be8cdbSBram Moolenaar  # only checks line continuation
200347e880d6SBram Moolenaar  let lines =<< trim END
200447e880d6SBram Moolenaar      vim9script
200547e880d6SBram Moolenaar      execute 'g:someVar'
200647e880d6SBram Moolenaar                .. ' = ' ..
200747e880d6SBram Moolenaar                   '28'
200847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
200947e880d6SBram Moolenaar      unlet g:someVar
201047e880d6SBram Moolenaar  END
201147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
201247e880d6SBram Moolenaarenddef
201347e880d6SBram Moolenaar
2014ad39c094SBram Moolenaardef Test_echo_cmd()
2015a72cfb80SBram Moolenaar  echo 'some' # comment
2016585fea7bSBram Moolenaar  echon 'thing'
2017ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2018ad39c094SBram Moolenaar
2019a72cfb80SBram Moolenaar  echo "some" # comment
2020a72cfb80SBram Moolenaar  echon "thing"
2021a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2022a72cfb80SBram Moolenaar
2023ad39c094SBram Moolenaar  let str1 = 'some'
2024ad39c094SBram Moolenaar  let str2 = 'more'
2025ad39c094SBram Moolenaar  echo str1 str2
2026ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2027a72cfb80SBram Moolenaar
2028a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2029ad39c094SBram Moolenaarenddef
2030ad39c094SBram Moolenaar
2031f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2032f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2033f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2034f93c7feaSBram Moolenaar  echo 'clear'
2035df069eecSBram Moolenaar  :1messages
2036f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2037f93c7feaSBram Moolenaar
2038f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2039f93c7feaSBram Moolenaarenddef
2040f93c7feaSBram Moolenaar
204147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2042f5be8cdbSBram Moolenaar  # only checks line continuation
204347e880d6SBram Moolenaar  let lines =<< trim END
204447e880d6SBram Moolenaar      vim9script
204547e880d6SBram Moolenaar      echomsg 'here'
204647e880d6SBram Moolenaar                .. ' is ' ..
204747e880d6SBram Moolenaar                   'a message'
204847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
204947e880d6SBram Moolenaar  END
205047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
205147e880d6SBram Moolenaarenddef
205247e880d6SBram Moolenaar
2053f93c7feaSBram Moolenaardef Test_echoerr_cmd()
205440ee466cSBram Moolenaar  try
205540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
205640ee466cSBram Moolenaar  catch
205740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
205840ee466cSBram Moolenaar  endtry
2059f93c7feaSBram Moolenaarenddef
2060f93c7feaSBram Moolenaar
206147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2062f5be8cdbSBram Moolenaar  # only checks line continuation
206347e880d6SBram Moolenaar  let lines =<< trim END
206447e880d6SBram Moolenaar      vim9script
206547e880d6SBram Moolenaar      try
206647e880d6SBram Moolenaar        echoerr 'this'
206747e880d6SBram Moolenaar                .. ' is ' ..
206847e880d6SBram Moolenaar                   'wrong'
206947e880d6SBram Moolenaar      catch
207047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
207147e880d6SBram Moolenaar      endtry
207247e880d6SBram Moolenaar  END
207347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
207447e880d6SBram Moolenaarenddef
207547e880d6SBram Moolenaar
207641fe0617SBram Moolenaardef Test_for_outside_of_function()
207741fe0617SBram Moolenaar  let lines =<< trim END
207841fe0617SBram Moolenaar    vim9script
207941fe0617SBram Moolenaar    new
208041fe0617SBram Moolenaar    for var in range(0, 3)
208141fe0617SBram Moolenaar      append(line('$'), var)
208241fe0617SBram Moolenaar    endfor
208341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
208441fe0617SBram Moolenaar    bwipe!
208541fe0617SBram Moolenaar  END
208641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
208741fe0617SBram Moolenaar  source Xvim9for.vim
208841fe0617SBram Moolenaar  delete('Xvim9for.vim')
208941fe0617SBram Moolenaarenddef
20908a7d6542SBram Moolenaar
2091e8c4abbbSBram Moolenaardef Test_for_loop()
2092e8c4abbbSBram Moolenaar  let result = ''
2093e8c4abbbSBram Moolenaar  for cnt in range(7)
2094e8c4abbbSBram Moolenaar    if cnt == 4
2095e8c4abbbSBram Moolenaar      break
2096e8c4abbbSBram Moolenaar    endif
2097e8c4abbbSBram Moolenaar    if cnt == 2
2098e8c4abbbSBram Moolenaar      continue
2099e8c4abbbSBram Moolenaar    endif
2100e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2101e8c4abbbSBram Moolenaar  endfor
2102e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21030ad3e894SBram Moolenaar
21040ad3e894SBram Moolenaar  let concat = ''
21050ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21060ad3e894SBram Moolenaar    concat ..= str
21070ad3e894SBram Moolenaar  endfor
21080ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2109e8c4abbbSBram Moolenaarenddef
2110e8c4abbbSBram Moolenaar
2111e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2112675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2113675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2114675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2115822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21160ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2117675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2118675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2119675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2120e8c4abbbSBram Moolenaarenddef
2121e8c4abbbSBram Moolenaar
2122d0df1aacSBram Moolenaardef Test_while_loop()
2123d0df1aacSBram Moolenaar  let result = ''
2124d0df1aacSBram Moolenaar  let cnt = 0
2125d0df1aacSBram Moolenaar  while cnt < 555
2126d0df1aacSBram Moolenaar    if cnt == 3
2127d0df1aacSBram Moolenaar      break
2128d0df1aacSBram Moolenaar    endif
2129d0df1aacSBram Moolenaar    cnt += 1
2130d0df1aacSBram Moolenaar    if cnt == 2
2131d0df1aacSBram Moolenaar      continue
2132d0df1aacSBram Moolenaar    endif
2133d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2134d0df1aacSBram Moolenaar  endwhile
2135d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2136d0df1aacSBram Moolenaarenddef
2137d0df1aacSBram Moolenaar
2138e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2139675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2140675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2141675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2142675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2143675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2144675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2145675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2146bd5da371SBram Moolenaarenddef
2147bd5da371SBram Moolenaar
21489645e2d9SBram Moolenaardef Test_interrupt_loop()
214997acfc78SBram Moolenaar  let caught = false
21509645e2d9SBram Moolenaar  let x = 0
215197acfc78SBram Moolenaar  try
21529645e2d9SBram Moolenaar    while 1
21539645e2d9SBram Moolenaar      x += 1
21549645e2d9SBram Moolenaar      if x == 100
21559645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
21569645e2d9SBram Moolenaar      endif
21579645e2d9SBram Moolenaar    endwhile
215897acfc78SBram Moolenaar  catch
215997acfc78SBram Moolenaar    caught = true
216097acfc78SBram Moolenaar    assert_equal(100, x)
216197acfc78SBram Moolenaar  endtry
216297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
21639645e2d9SBram Moolenaarenddef
216420431c9dSBram Moolenaar
21654fdae999SBram Moolenaardef Test_automatic_line_continuation()
21664fdae999SBram Moolenaar  let mylist = [
21674fdae999SBram Moolenaar      'one',
21684fdae999SBram Moolenaar      'two',
21694fdae999SBram Moolenaar      'three',
2170f5be8cdbSBram Moolenaar      ] # comment
21714fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
21724fdae999SBram Moolenaar
21734fdae999SBram Moolenaar  let mydict = {
21744fdae999SBram Moolenaar      'one': 1,
21754fdae999SBram Moolenaar      'two': 2,
21764fdae999SBram Moolenaar      'three':
21774fdae999SBram Moolenaar          3,
2178f5be8cdbSBram Moolenaar      } # comment
21794fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
21804fdae999SBram Moolenaar  mydict = #{
21812c330432SBram Moolenaar      one: 1,  # comment
21822c330432SBram Moolenaar      two:     # comment
21832c330432SBram Moolenaar           2,  # comment
21842c330432SBram Moolenaar      three: 3 # comment
21852c330432SBram Moolenaar      }
21862c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
21872c330432SBram Moolenaar  mydict = #{
21882c330432SBram Moolenaar      one: 1,
21894fdae999SBram Moolenaar      two:
21904fdae999SBram Moolenaar           2,
21912c330432SBram Moolenaar      three: 3
21924fdae999SBram Moolenaar      }
21934fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2194e6085c53SBram Moolenaar
2195e6085c53SBram Moolenaar  assert_equal(
2196e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2197e6085c53SBram Moolenaar        split('one two three')
2198e6085c53SBram Moolenaar        )
21994fdae999SBram Moolenaarenddef
22004fdae999SBram Moolenaar
22017a092245SBram Moolenaardef Test_vim9_comment()
22027a092245SBram Moolenaar  CheckScriptSuccess([
22037a092245SBram Moolenaar      'vim9script',
22047a092245SBram Moolenaar      '# something',
22057a092245SBram Moolenaar      ])
22067a092245SBram Moolenaar  CheckScriptFailure([
22077a092245SBram Moolenaar      'vim9script',
22087a092245SBram Moolenaar      ':# something',
22097a092245SBram Moolenaar      ], 'E488:')
22107a092245SBram Moolenaar  CheckScriptFailure([
22117a092245SBram Moolenaar      '# something',
22127a092245SBram Moolenaar      ], 'E488:')
22137a092245SBram Moolenaar  CheckScriptFailure([
22147a092245SBram Moolenaar      ':# something',
22157a092245SBram Moolenaar      ], 'E488:')
22167a092245SBram Moolenaar
22174a8d9f2eSBram Moolenaar  { # block start
22184a8d9f2eSBram Moolenaar  } # block end
22194a8d9f2eSBram Moolenaar  CheckDefFailure([
22204a8d9f2eSBram Moolenaar      '{# comment',
22214a8d9f2eSBram Moolenaar      ], 'E488:')
22224a8d9f2eSBram Moolenaar  CheckDefFailure([
22234a8d9f2eSBram Moolenaar      '{',
22244a8d9f2eSBram Moolenaar      '}# comment',
22254a8d9f2eSBram Moolenaar      ], 'E488:')
22264a8d9f2eSBram Moolenaar
22274a8d9f2eSBram Moolenaar  echo "yes" # comment
22284a8d9f2eSBram Moolenaar  CheckDefFailure([
22294a8d9f2eSBram Moolenaar      'echo "yes"# comment',
22304a8d9f2eSBram Moolenaar      ], 'E488:')
22317a092245SBram Moolenaar  CheckScriptSuccess([
22327a092245SBram Moolenaar      'vim9script',
22337a092245SBram Moolenaar      'echo "yes" # something',
22347a092245SBram Moolenaar      ])
22357a092245SBram Moolenaar  CheckScriptFailure([
22367a092245SBram Moolenaar      'vim9script',
22377a092245SBram Moolenaar      'echo "yes"# something',
22387a092245SBram Moolenaar      ], 'E121:')
22397a092245SBram Moolenaar  CheckScriptFailure([
22407a092245SBram Moolenaar      'vim9script',
22417a092245SBram Moolenaar      'echo# something',
22427a092245SBram Moolenaar      ], 'E121:')
22437a092245SBram Moolenaar  CheckScriptFailure([
22447a092245SBram Moolenaar      'echo "yes" # something',
22457a092245SBram Moolenaar      ], 'E121:')
22467a092245SBram Moolenaar
22474a8d9f2eSBram Moolenaar  exe "echo" # comment
22484a8d9f2eSBram Moolenaar  CheckDefFailure([
22494a8d9f2eSBram Moolenaar      'exe "echo"# comment',
22504a8d9f2eSBram Moolenaar      ], 'E488:')
22514a8d9f2eSBram Moolenaar  CheckScriptSuccess([
22524a8d9f2eSBram Moolenaar      'vim9script',
22534a8d9f2eSBram Moolenaar      'exe "echo" # something',
22544a8d9f2eSBram Moolenaar      ])
22554a8d9f2eSBram Moolenaar  CheckScriptFailure([
22564a8d9f2eSBram Moolenaar      'vim9script',
22574a8d9f2eSBram Moolenaar      'exe "echo"# something',
22584a8d9f2eSBram Moolenaar      ], 'E121:')
22594a8d9f2eSBram Moolenaar  CheckDefFailure([
22604a8d9f2eSBram Moolenaar      'exe # comment',
22614a8d9f2eSBram Moolenaar      ], 'E1015:')
22624a8d9f2eSBram Moolenaar  CheckScriptFailure([
22634a8d9f2eSBram Moolenaar      'vim9script',
22644a8d9f2eSBram Moolenaar      'exe# something',
22654a8d9f2eSBram Moolenaar      ], 'E121:')
22664a8d9f2eSBram Moolenaar  CheckScriptFailure([
22674a8d9f2eSBram Moolenaar      'exe "echo" # something',
22684a8d9f2eSBram Moolenaar      ], 'E121:')
22694a8d9f2eSBram Moolenaar
22707a092245SBram Moolenaar  CheckDefFailure([
22717a092245SBram Moolenaar      'try# comment',
22727a092245SBram Moolenaar      '  echo "yes"',
22737a092245SBram Moolenaar      'catch',
22747a092245SBram Moolenaar      'endtry',
22757a092245SBram Moolenaar      ], 'E488:')
22762c5ed4e3SBram Moolenaar  CheckScriptFailure([
22772c5ed4e3SBram Moolenaar      'vim9script',
22782c5ed4e3SBram Moolenaar      'try# comment',
22792c5ed4e3SBram Moolenaar      'echo "yes"',
22802c5ed4e3SBram Moolenaar      ], 'E488:')
22817a092245SBram Moolenaar  CheckDefFailure([
22827a092245SBram Moolenaar      'try',
2283a72cfb80SBram Moolenaar      '  throw#comment',
2284a72cfb80SBram Moolenaar      'catch',
2285a72cfb80SBram Moolenaar      'endtry',
2286a72cfb80SBram Moolenaar      ], 'E1015:')
2287a72cfb80SBram Moolenaar  CheckDefFailure([
2288a72cfb80SBram Moolenaar      'try',
2289a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2290a72cfb80SBram Moolenaar      'catch',
2291a72cfb80SBram Moolenaar      'endtry',
2292a72cfb80SBram Moolenaar      ], 'E488:')
2293a72cfb80SBram Moolenaar  CheckDefFailure([
2294a72cfb80SBram Moolenaar      'try',
22957a092245SBram Moolenaar      '  echo "yes"',
22967a092245SBram Moolenaar      'catch# comment',
22977a092245SBram Moolenaar      'endtry',
22987a092245SBram Moolenaar      ], 'E488:')
22992c5ed4e3SBram Moolenaar  CheckScriptFailure([
23002c5ed4e3SBram Moolenaar      'vim9script',
23012c5ed4e3SBram Moolenaar      'try',
23022c5ed4e3SBram Moolenaar      '  echo "yes"',
23032c5ed4e3SBram Moolenaar      'catch# comment',
23042c5ed4e3SBram Moolenaar      'endtry',
23052c5ed4e3SBram Moolenaar      ], 'E654:')
23062c5ed4e3SBram Moolenaar  CheckDefFailure([
23072c5ed4e3SBram Moolenaar      'try',
23082c5ed4e3SBram Moolenaar      '  echo "yes"',
23092c5ed4e3SBram Moolenaar      'catch /pat/# comment',
23102c5ed4e3SBram Moolenaar      'endtry',
23112c5ed4e3SBram Moolenaar      ], 'E488:')
23127a092245SBram Moolenaar  CheckDefFailure([
23137a092245SBram Moolenaar      'try',
23147a092245SBram Moolenaar      'echo "yes"',
23157a092245SBram Moolenaar      'catch',
23167a092245SBram Moolenaar      'endtry# comment',
23177a092245SBram Moolenaar      ], 'E488:')
23182c5ed4e3SBram Moolenaar  CheckScriptFailure([
23192c5ed4e3SBram Moolenaar      'vim9script',
23202c5ed4e3SBram Moolenaar      'try',
23212c5ed4e3SBram Moolenaar      '  echo "yes"',
23222c5ed4e3SBram Moolenaar      'catch',
23232c5ed4e3SBram Moolenaar      'endtry# comment',
23249b7bf9e9SBram Moolenaar      ], 'E488:')
23252c5ed4e3SBram Moolenaar
23262c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23272c5ed4e3SBram Moolenaar      'vim9script',
23282c5ed4e3SBram Moolenaar      'hi # comment',
23292c5ed4e3SBram Moolenaar      ])
23302c5ed4e3SBram Moolenaar  CheckScriptFailure([
23312c5ed4e3SBram Moolenaar      'vim9script',
23322c5ed4e3SBram Moolenaar      'hi# comment',
23332c5ed4e3SBram Moolenaar      ], 'E416:')
23341966c248SBram Moolenaar  CheckScriptSuccess([
23351966c248SBram Moolenaar      'vim9script',
23361966c248SBram Moolenaar      'hi Search # comment',
23371966c248SBram Moolenaar      ])
23381966c248SBram Moolenaar  CheckScriptFailure([
23391966c248SBram Moolenaar      'vim9script',
23401966c248SBram Moolenaar      'hi Search# comment',
23411966c248SBram Moolenaar      ], 'E416:')
23421966c248SBram Moolenaar  CheckScriptSuccess([
23431966c248SBram Moolenaar      'vim9script',
23441966c248SBram Moolenaar      'hi link This Search # comment',
23451966c248SBram Moolenaar      ])
23461966c248SBram Moolenaar  CheckScriptFailure([
23471966c248SBram Moolenaar      'vim9script',
23481966c248SBram Moolenaar      'hi link This That# comment',
23491966c248SBram Moolenaar      ], 'E413:')
23501966c248SBram Moolenaar  CheckScriptSuccess([
23511966c248SBram Moolenaar      'vim9script',
23521966c248SBram Moolenaar      'hi clear This # comment',
23531966c248SBram Moolenaar      'hi clear # comment',
23541966c248SBram Moolenaar      ])
2355f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2356f5be8cdbSBram Moolenaar  # hi clear This# comment',
23571966c248SBram Moolenaar  CheckScriptFailure([
23581966c248SBram Moolenaar      'vim9script',
23591966c248SBram Moolenaar      'hi clear# comment',
23601966c248SBram Moolenaar      ], 'E416:')
23611966c248SBram Moolenaar
23621966c248SBram Moolenaar  CheckScriptSuccess([
23631966c248SBram Moolenaar      'vim9script',
23641966c248SBram Moolenaar      'hi Group term=bold',
23651966c248SBram Moolenaar      'match Group /todo/ # comment',
23661966c248SBram Moolenaar      ])
23671966c248SBram Moolenaar  CheckScriptFailure([
23681966c248SBram Moolenaar      'vim9script',
23691966c248SBram Moolenaar      'hi Group term=bold',
23701966c248SBram Moolenaar      'match Group /todo/# comment',
23711966c248SBram Moolenaar      ], 'E488:')
23721966c248SBram Moolenaar  CheckScriptSuccess([
23731966c248SBram Moolenaar      'vim9script',
23741966c248SBram Moolenaar      'match # comment',
23751966c248SBram Moolenaar      ])
23761966c248SBram Moolenaar  CheckScriptFailure([
23771966c248SBram Moolenaar      'vim9script',
23781966c248SBram Moolenaar      'match# comment',
23791966c248SBram Moolenaar      ], 'E475:')
23801966c248SBram Moolenaar  CheckScriptSuccess([
23811966c248SBram Moolenaar      'vim9script',
23821966c248SBram Moolenaar      'match none # comment',
23831966c248SBram Moolenaar      ])
23841966c248SBram Moolenaar  CheckScriptFailure([
23851966c248SBram Moolenaar      'vim9script',
23861966c248SBram Moolenaar      'match none# comment',
23871966c248SBram Moolenaar      ], 'E475:')
23881966c248SBram Moolenaar
23891966c248SBram Moolenaar  CheckScriptSuccess([
23901966c248SBram Moolenaar      'vim9script',
23911966c248SBram Moolenaar      'menutrans clear # comment',
23921966c248SBram Moolenaar      ])
23931966c248SBram Moolenaar  CheckScriptFailure([
23941966c248SBram Moolenaar      'vim9script',
23951966c248SBram Moolenaar      'menutrans clear# comment text',
23961966c248SBram Moolenaar      ], 'E474:')
23971966c248SBram Moolenaar
23981966c248SBram Moolenaar  CheckScriptSuccess([
23991966c248SBram Moolenaar      'vim9script',
24001966c248SBram Moolenaar      'syntax clear # comment',
24011966c248SBram Moolenaar      ])
24021966c248SBram Moolenaar  CheckScriptFailure([
24031966c248SBram Moolenaar      'vim9script',
24041966c248SBram Moolenaar      'syntax clear# comment text',
24051966c248SBram Moolenaar      ], 'E28:')
24061966c248SBram Moolenaar  CheckScriptSuccess([
24071966c248SBram Moolenaar      'vim9script',
24081966c248SBram Moolenaar      'syntax keyword Word some',
24091966c248SBram Moolenaar      'syntax clear Word # comment',
24101966c248SBram Moolenaar      ])
24111966c248SBram Moolenaar  CheckScriptFailure([
24121966c248SBram Moolenaar      'vim9script',
24131966c248SBram Moolenaar      'syntax keyword Word some',
24141966c248SBram Moolenaar      'syntax clear Word# comment text',
24151966c248SBram Moolenaar      ], 'E28:')
24161966c248SBram Moolenaar
24171966c248SBram Moolenaar  CheckScriptSuccess([
24181966c248SBram Moolenaar      'vim9script',
24191966c248SBram Moolenaar      'syntax list # comment',
24201966c248SBram Moolenaar      ])
24211966c248SBram Moolenaar  CheckScriptFailure([
24221966c248SBram Moolenaar      'vim9script',
24231966c248SBram Moolenaar      'syntax list# comment text',
24241966c248SBram Moolenaar      ], 'E28:')
24251966c248SBram Moolenaar
24261966c248SBram Moolenaar  CheckScriptSuccess([
24271966c248SBram Moolenaar      'vim9script',
24281966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24291966c248SBram Moolenaar      ])
24301966c248SBram Moolenaar  CheckScriptFailure([
24311966c248SBram Moolenaar      'vim9script',
24321966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
24331966c248SBram Moolenaar      ], 'E475:')
24341966c248SBram Moolenaar
24351966c248SBram Moolenaar  CheckScriptSuccess([
24361966c248SBram Moolenaar      'vim9script',
24371966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
24381966c248SBram Moolenaar      ])
24391966c248SBram Moolenaar  CheckScriptFailure([
24401966c248SBram Moolenaar      'vim9script',
24411966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
24421966c248SBram Moolenaar      ], 'E789:')
24431966c248SBram Moolenaar
24441966c248SBram Moolenaar  CheckScriptSuccess([
24451966c248SBram Moolenaar      'vim9script',
24461966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
24471966c248SBram Moolenaar      ])
24481966c248SBram Moolenaar  CheckScriptFailure([
24491966c248SBram Moolenaar      'vim9script',
24501966c248SBram Moolenaar      'syntax match Word /pat/# comment',
24511966c248SBram Moolenaar      ], 'E402:')
24521966c248SBram Moolenaar
24531966c248SBram Moolenaar  CheckScriptSuccess([
24541966c248SBram Moolenaar      'vim9script',
24551966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
24561966c248SBram Moolenaar      ])
24571966c248SBram Moolenaar  CheckScriptFailure([
24581966c248SBram Moolenaar      'vim9script',
24591966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
24601966c248SBram Moolenaar      ], 'E475:')
24611966c248SBram Moolenaar  CheckScriptFailure([
24621966c248SBram Moolenaar      'vim9script',
24631966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
24641966c248SBram Moolenaar      ], 'E406:')
24651966c248SBram Moolenaar  CheckScriptFailure([
24661966c248SBram Moolenaar      'vim9script',
24671966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
24681966c248SBram Moolenaar      ], 'E475:')
24691966c248SBram Moolenaar
24701966c248SBram Moolenaar  CheckScriptSuccess([
24711966c248SBram Moolenaar      'vim9script',
24721966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
24731966c248SBram Moolenaar      ])
24741966c248SBram Moolenaar  CheckScriptFailure([
24751966c248SBram Moolenaar      'vim9script',
24761966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2477d032f34aSBram Moolenaar      ], 'E402:')
24781966c248SBram Moolenaar
24791966c248SBram Moolenaar  CheckScriptSuccess([
24801966c248SBram Moolenaar      'vim9script',
24811966c248SBram Moolenaar      'syntax sync # comment',
24821966c248SBram Moolenaar      ])
24831966c248SBram Moolenaar  CheckScriptFailure([
24841966c248SBram Moolenaar      'vim9script',
24851966c248SBram Moolenaar      'syntax sync# comment',
24861966c248SBram Moolenaar      ], 'E404:')
24871966c248SBram Moolenaar  CheckScriptSuccess([
24881966c248SBram Moolenaar      'vim9script',
24891966c248SBram Moolenaar      'syntax sync ccomment # comment',
24901966c248SBram Moolenaar      ])
24911966c248SBram Moolenaar  CheckScriptFailure([
24921966c248SBram Moolenaar      'vim9script',
24931966c248SBram Moolenaar      'syntax sync ccomment# comment',
24941966c248SBram Moolenaar      ], 'E404:')
24951966c248SBram Moolenaar
24961966c248SBram Moolenaar  CheckScriptSuccess([
24971966c248SBram Moolenaar      'vim9script',
24981966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
24991966c248SBram Moolenaar      ])
25001966c248SBram Moolenaar  CheckScriptFailure([
25011966c248SBram Moolenaar      'vim9script',
25021966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25031966c248SBram Moolenaar      ], 'E475:')
2504a72cfb80SBram Moolenaar
2505a72cfb80SBram Moolenaar  CheckScriptSuccess([
2506a72cfb80SBram Moolenaar      'vim9script',
2507a72cfb80SBram Moolenaar      'command Echo echo # comment',
2508a72cfb80SBram Moolenaar      'command Echo # comment',
2509a72cfb80SBram Moolenaar      ])
2510a72cfb80SBram Moolenaar  CheckScriptFailure([
2511a72cfb80SBram Moolenaar      'vim9script',
2512a72cfb80SBram Moolenaar      'command Echo echo# comment',
2513a72cfb80SBram Moolenaar      'Echo',
2514a72cfb80SBram Moolenaar      ], 'E121:')
2515a72cfb80SBram Moolenaar  CheckScriptFailure([
2516a72cfb80SBram Moolenaar      'vim9script',
2517a72cfb80SBram Moolenaar      'command Echo# comment',
2518a72cfb80SBram Moolenaar      ], 'E182:')
2519a72cfb80SBram Moolenaar  CheckScriptFailure([
2520a72cfb80SBram Moolenaar      'vim9script',
2521a72cfb80SBram Moolenaar      'command Echo echo',
2522a72cfb80SBram Moolenaar      'command Echo# comment',
2523a72cfb80SBram Moolenaar      ], 'E182:')
2524a72cfb80SBram Moolenaar
2525a72cfb80SBram Moolenaar  CheckScriptSuccess([
2526a72cfb80SBram Moolenaar      'vim9script',
2527a72cfb80SBram Moolenaar      'function # comment',
2528a72cfb80SBram Moolenaar      ])
2529a72cfb80SBram Moolenaar  CheckScriptFailure([
2530a72cfb80SBram Moolenaar      'vim9script',
25319898107fSBram Moolenaar      'function " comment',
25329898107fSBram Moolenaar      ], 'E129:')
25339898107fSBram Moolenaar  CheckScriptFailure([
25349898107fSBram Moolenaar      'vim9script',
2535a72cfb80SBram Moolenaar      'function# comment',
2536a72cfb80SBram Moolenaar      ], 'E129:')
2537a72cfb80SBram Moolenaar  CheckScriptSuccess([
2538a72cfb80SBram Moolenaar      'vim9script',
2539a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2540a72cfb80SBram Moolenaar      ])
2541a72cfb80SBram Moolenaar  CheckScriptFailure([
2542a72cfb80SBram Moolenaar      'vim9script',
2543a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2544a72cfb80SBram Moolenaar      ], 'E488:')
2545a72cfb80SBram Moolenaar
2546a72cfb80SBram Moolenaar  CheckScriptSuccess([
2547a72cfb80SBram Moolenaar      'vim9script',
25484c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2549a72cfb80SBram Moolenaar      'endfunc',
25504c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2551a72cfb80SBram Moolenaar      ])
2552a72cfb80SBram Moolenaar  CheckScriptFailure([
2553a72cfb80SBram Moolenaar      'vim9script',
25544c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2555a72cfb80SBram Moolenaar      'endfunc',
25564c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2557a72cfb80SBram Moolenaar      ], 'E488:')
2558a72cfb80SBram Moolenaar
2559a72cfb80SBram Moolenaar  CheckScriptSuccess([
2560a72cfb80SBram Moolenaar      'vim9script',
2561a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2562a72cfb80SBram Moolenaar      ])
2563a72cfb80SBram Moolenaar  CheckScriptFailure([
2564a72cfb80SBram Moolenaar      'vim9script',
2565a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2566a72cfb80SBram Moolenaar      ], 'E488:')
2567e7e4838fSBram Moolenaar
2568e7e4838fSBram Moolenaar  CheckScriptFailure([
2569e7e4838fSBram Moolenaar      'def Test() " comment',
2570e7e4838fSBram Moolenaar      'enddef',
2571e7e4838fSBram Moolenaar      ], 'E488:')
2572e7e4838fSBram Moolenaar  CheckScriptFailure([
2573e7e4838fSBram Moolenaar      'vim9script',
2574e7e4838fSBram Moolenaar      'def Test() " comment',
2575e7e4838fSBram Moolenaar      'enddef',
2576e7e4838fSBram Moolenaar      ], 'E488:')
2577e7e4838fSBram Moolenaar
2578e7e4838fSBram Moolenaar  CheckScriptSuccess([
2579e7e4838fSBram Moolenaar      'func Test() " comment',
2580e7e4838fSBram Moolenaar      'endfunc',
2581e7e4838fSBram Moolenaar      ])
25829898107fSBram Moolenaar  CheckScriptSuccess([
2583e7e4838fSBram Moolenaar      'vim9script',
2584e7e4838fSBram Moolenaar      'func Test() " comment',
2585e7e4838fSBram Moolenaar      'endfunc',
25869898107fSBram Moolenaar      ])
2587e7e4838fSBram Moolenaar
2588e7e4838fSBram Moolenaar  CheckScriptSuccess([
2589e7e4838fSBram Moolenaar      'def Test() # comment',
2590e7e4838fSBram Moolenaar      'enddef',
2591e7e4838fSBram Moolenaar      ])
2592e7e4838fSBram Moolenaar  CheckScriptFailure([
2593e7e4838fSBram Moolenaar      'func Test() # comment',
2594e7e4838fSBram Moolenaar      'endfunc',
2595e7e4838fSBram Moolenaar      ], 'E488:')
25962c5ed4e3SBram Moolenaarenddef
25972c5ed4e3SBram Moolenaar
25982c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
25992c5ed4e3SBram Moolenaar  CheckCanRunGui
26002c5ed4e3SBram Moolenaar
26012c5ed4e3SBram Moolenaar  CheckScriptFailure([
26022c5ed4e3SBram Moolenaar      'vim9script',
26032c5ed4e3SBram Moolenaar      'gui#comment'
26042c5ed4e3SBram Moolenaar      ], 'E499:')
26052c5ed4e3SBram Moolenaar  CheckScriptFailure([
26062c5ed4e3SBram Moolenaar      'vim9script',
26072c5ed4e3SBram Moolenaar      'gui -f#comment'
26082c5ed4e3SBram Moolenaar      ], 'E499:')
26097a092245SBram Moolenaarenddef
26107a092245SBram Moolenaar
2611a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
26126797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
26136797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2614a26b9700SBram Moolenaar
2615a26b9700SBram Moolenaar  edit test.vim
2616a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2617a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2618a26b9700SBram Moolenaar
2619a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2620a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2621a26b9700SBram Moolenaar
2622a26b9700SBram Moolenaar  g:entered = 0
2623a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2624a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2625a26b9700SBram Moolenaar
2626a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2627a26b9700SBram Moolenaar
2628a26b9700SBram Moolenaar  au! TabEnter
2629a26b9700SBram Moolenaar  unlet g:entered
2630d72c1bf0SBram Moolenaar
2631d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2632d72c1bf0SBram Moolenaar      'vim9script',
26336797966dSBram Moolenaar      'g:var = 123',
2634e55b1c09SBram Moolenaar      'b:var = 456',
2635e55b1c09SBram Moolenaar      'w:var = 777',
2636e55b1c09SBram Moolenaar      't:var = 888',
2637d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2638d72c1bf0SBram Moolenaar      ])
2639d72c1bf0SBram Moolenaar
2640d72c1bf0SBram Moolenaar  CheckScriptFailure([
2641d72c1bf0SBram Moolenaar      'vim9script',
2642d72c1bf0SBram Moolenaar      'let g:var = 123',
2643e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2644e55b1c09SBram Moolenaar
2645e55b1c09SBram Moolenaar  CheckScriptFailure([
2646e55b1c09SBram Moolenaar      'vim9script',
2647e55b1c09SBram Moolenaar      'let b:var = 123',
2648e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2649e55b1c09SBram Moolenaar
2650e55b1c09SBram Moolenaar  CheckScriptFailure([
2651e55b1c09SBram Moolenaar      'vim9script',
2652e55b1c09SBram Moolenaar      'let w:var = 123',
2653e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2654e55b1c09SBram Moolenaar
2655e55b1c09SBram Moolenaar  CheckScriptFailure([
2656e55b1c09SBram Moolenaar      'vim9script',
2657e55b1c09SBram Moolenaar      'let t:var = 123',
2658e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2659e55b1c09SBram Moolenaar
2660e55b1c09SBram Moolenaar  CheckScriptFailure([
2661e55b1c09SBram Moolenaar      'vim9script',
2662e55b1c09SBram Moolenaar      'let v:version = 123',
2663e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2664e55b1c09SBram Moolenaar
2665e55b1c09SBram Moolenaar  CheckScriptFailure([
2666e55b1c09SBram Moolenaar      'vim9script',
2667e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2668e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
26696797966dSBram Moolenaar
26706797966dSBram Moolenaar  CheckScriptFailure([
26716797966dSBram Moolenaar      'vim9script',
26726797966dSBram Moolenaar      'g:var = 123',
267332e35117SBram Moolenaar      'unlet g:var# comment1',
2674d72c1bf0SBram Moolenaar      ], 'E108:')
2675d72c1bf0SBram Moolenaar
2676d72c1bf0SBram Moolenaar  CheckScriptFailure([
2677d72c1bf0SBram Moolenaar      'let g:var = 123',
2678d72c1bf0SBram Moolenaar      'unlet g:var # something',
2679d72c1bf0SBram Moolenaar      ], 'E488:')
2680faac4104SBram Moolenaar
2681faac4104SBram Moolenaar  CheckScriptSuccess([
2682faac4104SBram Moolenaar      'vim9script',
268332e35117SBram Moolenaar      'if 1 # comment2',
2684faac4104SBram Moolenaar      '  echo "yes"',
2685faac4104SBram Moolenaar      'elseif 2 #comment',
2686faac4104SBram Moolenaar      '  echo "no"',
2687faac4104SBram Moolenaar      'endif',
2688faac4104SBram Moolenaar      ])
2689faac4104SBram Moolenaar
2690faac4104SBram Moolenaar  CheckScriptFailure([
2691faac4104SBram Moolenaar      'vim9script',
269232e35117SBram Moolenaar      'if 1# comment3',
2693faac4104SBram Moolenaar      '  echo "yes"',
2694faac4104SBram Moolenaar      'endif',
2695faac4104SBram Moolenaar      ], 'E15:')
2696faac4104SBram Moolenaar
2697faac4104SBram Moolenaar  CheckScriptFailure([
2698faac4104SBram Moolenaar      'vim9script',
269932e35117SBram Moolenaar      'if 0 # comment4',
2700faac4104SBram Moolenaar      '  echo "yes"',
2701faac4104SBram Moolenaar      'elseif 2#comment',
2702faac4104SBram Moolenaar      '  echo "no"',
2703faac4104SBram Moolenaar      'endif',
2704faac4104SBram Moolenaar      ], 'E15:')
2705faac4104SBram Moolenaar
2706faac4104SBram Moolenaar  CheckScriptSuccess([
2707faac4104SBram Moolenaar      'vim9script',
270832e35117SBram Moolenaar      'let v = 1 # comment5',
2709faac4104SBram Moolenaar      ])
2710faac4104SBram Moolenaar
2711faac4104SBram Moolenaar  CheckScriptFailure([
2712faac4104SBram Moolenaar      'vim9script',
271332e35117SBram Moolenaar      'let v = 1# comment6',
271432e35117SBram Moolenaar      ], 'E15:')
2715faac4104SBram Moolenaar
2716faac4104SBram Moolenaar  CheckScriptSuccess([
2717faac4104SBram Moolenaar      'vim9script',
2718faac4104SBram Moolenaar      'new'
2719faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2720df069eecSBram Moolenaar      ':$',
2721faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2722faac4104SBram Moolenaar      'bwipe!',
2723faac4104SBram Moolenaar      ])
2724faac4104SBram Moolenaar
2725f5be8cdbSBram Moolenaar  CheckScriptFailure([
2726f5be8cdbSBram Moolenaar      'vim9script',
2727f5be8cdbSBram Moolenaar      'new'
2728f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2729f5be8cdbSBram Moolenaar      ':$',
2730f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2731f5be8cdbSBram Moolenaar      'bwipe!',
2732f5be8cdbSBram Moolenaar      ], 'E488:')
2733f5be8cdbSBram Moolenaar
2734f5be8cdbSBram Moolenaar  CheckScriptFailure([
2735f5be8cdbSBram Moolenaar      'vim9script',
2736f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2737f5be8cdbSBram Moolenaar      ], 'E477:')
2738a26b9700SBram Moolenaarenddef
2739a26b9700SBram Moolenaar
27407e5bd91dSBram Moolenaardef Test_finish()
27417e5bd91dSBram Moolenaar  let lines =<< trim END
27427e5bd91dSBram Moolenaar    vim9script
27436797966dSBram Moolenaar    g:res = 'one'
27447e5bd91dSBram Moolenaar    if v:false | finish | endif
27456797966dSBram Moolenaar    g:res = 'two'
27467e5bd91dSBram Moolenaar    finish
27476797966dSBram Moolenaar    g:res = 'three'
27487e5bd91dSBram Moolenaar  END
27497e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
27507e5bd91dSBram Moolenaar  source Xfinished
27517e5bd91dSBram Moolenaar  assert_equal('two', g:res)
27527e5bd91dSBram Moolenaar
27537e5bd91dSBram Moolenaar  unlet g:res
27547e5bd91dSBram Moolenaar  delete('Xfinished')
27557e5bd91dSBram Moolenaarenddef
27567e5bd91dSBram Moolenaar
275732e35117SBram Moolenaardef Test_let_func_call()
275832e35117SBram Moolenaar  let lines =<< trim END
275932e35117SBram Moolenaar    vim9script
276032e35117SBram Moolenaar    func GetValue()
276132e35117SBram Moolenaar      if exists('g:count')
276232e35117SBram Moolenaar        let g:count += 1
276332e35117SBram Moolenaar      else
276432e35117SBram Moolenaar        let g:count = 1
276532e35117SBram Moolenaar      endif
276632e35117SBram Moolenaar      return 'this'
276732e35117SBram Moolenaar    endfunc
276832e35117SBram Moolenaar    let val: string = GetValue()
2769f5be8cdbSBram Moolenaar    # env var is always a string
2770df671b46SBram Moolenaar    let env = $TERM
277132e35117SBram Moolenaar  END
277232e35117SBram Moolenaar  writefile(lines, 'Xfinished')
277332e35117SBram Moolenaar  source Xfinished
2774f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
277532e35117SBram Moolenaar  assert_equal(1, g:count)
277632e35117SBram Moolenaar
277732e35117SBram Moolenaar  unlet g:count
277832e35117SBram Moolenaar  delete('Xfinished')
277932e35117SBram Moolenaarenddef
278032e35117SBram Moolenaar
278132e35117SBram Moolenaardef Test_let_missing_type()
278232e35117SBram Moolenaar  let lines =<< trim END
278332e35117SBram Moolenaar    vim9script
2784df671b46SBram Moolenaar    let var = g:unknown
2785227a69deSBram Moolenaar  END
2786822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2787227a69deSBram Moolenaar
2788227a69deSBram Moolenaar  lines =<< trim END
2789227a69deSBram Moolenaar    vim9script
2790227a69deSBram Moolenaar    let nr: number = 123
2791227a69deSBram Moolenaar    let var = nr
2792227a69deSBram Moolenaar  END
2793822ba247SBram Moolenaar  CheckScriptSuccess(lines)
279432e35117SBram Moolenaarenddef
279532e35117SBram Moolenaar
2796c82a5b5dSBram Moolenaardef Test_let_declaration()
2797c82a5b5dSBram Moolenaar  let lines =<< trim END
2798c82a5b5dSBram Moolenaar    vim9script
2799c82a5b5dSBram Moolenaar    let var: string
2800c82a5b5dSBram Moolenaar    g:var_uninit = var
2801c82a5b5dSBram Moolenaar    var = 'text'
2802c82a5b5dSBram Moolenaar    g:var_test = var
2803f5be8cdbSBram Moolenaar    # prefixing s: is optional
2804984dddbeSBram Moolenaar    s:var = 'prefixed'
2805984dddbeSBram Moolenaar    g:var_prefixed = s:var
2806984dddbeSBram Moolenaar
2807984dddbeSBram Moolenaar    let s:other: number
2808984dddbeSBram Moolenaar    other = 1234
2809984dddbeSBram Moolenaar    g:other_var = other
2810c82a5b5dSBram Moolenaar  END
2811c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2812c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2813c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2814984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2815984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2816c82a5b5dSBram Moolenaar
2817c82a5b5dSBram Moolenaar  unlet g:var_uninit
2818c82a5b5dSBram Moolenaar  unlet g:var_test
2819984dddbeSBram Moolenaar  unlet g:var_prefixed
2820984dddbeSBram Moolenaar  unlet g:other_var
2821c82a5b5dSBram Moolenaarenddef
2822c82a5b5dSBram Moolenaar
2823c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2824c5b1c20bSBram Moolenaar  let lines =<< trim END
2825c5b1c20bSBram Moolenaar    vim9script
2826c5b1c20bSBram Moolenaar    const var: string
2827c5b1c20bSBram Moolenaar  END
2828c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2829c5b1c20bSBram Moolenaar
2830c5b1c20bSBram Moolenaar  lines =<< trim END
2831c5b1c20bSBram Moolenaar    vim9script
2832c5b1c20bSBram Moolenaar    let 9var: string
2833c5b1c20bSBram Moolenaar  END
2834c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2835c5b1c20bSBram Moolenaarenddef
2836c5b1c20bSBram Moolenaar
283734db91f7SBram Moolenaardef Test_let_type_check()
283834db91f7SBram Moolenaar  let lines =<< trim END
283934db91f7SBram Moolenaar    vim9script
284034db91f7SBram Moolenaar    let var: string
284134db91f7SBram Moolenaar    var = 1234
284234db91f7SBram Moolenaar  END
284334db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2844984dddbeSBram Moolenaar
2845984dddbeSBram Moolenaar  lines =<< trim END
2846984dddbeSBram Moolenaar    vim9script
2847984dddbeSBram Moolenaar    let var:string
2848984dddbeSBram Moolenaar  END
2849984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2850c5b1c20bSBram Moolenaar
2851c5b1c20bSBram Moolenaar  lines =<< trim END
2852c5b1c20bSBram Moolenaar    vim9script
2853c5b1c20bSBram Moolenaar    let var: asdf
2854c5b1c20bSBram Moolenaar  END
2855c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2856a71e2633SBram Moolenaar
2857a71e2633SBram Moolenaar  lines =<< trim END
2858a71e2633SBram Moolenaar    vim9script
2859a71e2633SBram Moolenaar    let s:l: list<number>
2860a71e2633SBram Moolenaar    s:l = []
2861a71e2633SBram Moolenaar  END
2862a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2863a71e2633SBram Moolenaar
2864a71e2633SBram Moolenaar  lines =<< trim END
2865a71e2633SBram Moolenaar    vim9script
2866a71e2633SBram Moolenaar    let s:d: dict<number>
2867a71e2633SBram Moolenaar    s:d = {}
2868a71e2633SBram Moolenaar  END
2869a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
287034db91f7SBram Moolenaarenddef
287134db91f7SBram Moolenaar
2872a5d0077eSBram Moolenaardef Test_forward_declaration()
2873a5d0077eSBram Moolenaar  let lines =<< trim END
2874a5d0077eSBram Moolenaar    vim9script
2875a5d0077eSBram Moolenaar    def GetValue(): string
2876a5d0077eSBram Moolenaar      return theVal
2877a5d0077eSBram Moolenaar    enddef
2878a5d0077eSBram Moolenaar    let theVal = 'something'
2879822ba247SBram Moolenaar    g:initVal = GetValue()
2880a5d0077eSBram Moolenaar    theVal = 'else'
2881a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2882a5d0077eSBram Moolenaar  END
2883a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2884a5d0077eSBram Moolenaar  source Xforward
2885a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2886a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2887a5d0077eSBram Moolenaar
2888a5d0077eSBram Moolenaar  unlet g:initVal
2889a5d0077eSBram Moolenaar  unlet g:laterVal
2890a5d0077eSBram Moolenaar  delete('Xforward')
2891a5d0077eSBram Moolenaarenddef
2892a5d0077eSBram Moolenaar
28939721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
28949721fb4eSBram Moolenaar  let legacy_lines =<< trim END
28959721fb4eSBram Moolenaar    source Xvim9_script.vim
28969721fb4eSBram Moolenaar
28979721fb4eSBram Moolenaar    call assert_false(exists('local'))
28989721fb4eSBram Moolenaar    call assert_false(exists('exported'))
28999721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29009721fb4eSBram Moolenaar    call assert_equal('global', global)
29019721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29029721fb4eSBram Moolenaar
29039721fb4eSBram Moolenaar    " imported variable becomes script-local
29049721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29059721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29069721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29079721fb4eSBram Moolenaar
29089721fb4eSBram Moolenaar    " imported function becomes script-local
29099721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29109721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29119721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29129721fb4eSBram Moolenaar  END
29139721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29149721fb4eSBram Moolenaar
29159721fb4eSBram Moolenaar  let vim9_lines =<< trim END
29169721fb4eSBram Moolenaar    vim9script
29179721fb4eSBram Moolenaar    let local = 'local'
29189721fb4eSBram Moolenaar    g:global = 'global'
29199721fb4eSBram Moolenaar    export let exported = 'exported'
29209721fb4eSBram Moolenaar    export def GetText(): string
29219721fb4eSBram Moolenaar       return 'text'
29229721fb4eSBram Moolenaar    enddef
29239721fb4eSBram Moolenaar  END
29249721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
29259721fb4eSBram Moolenaar
29269721fb4eSBram Moolenaar  source Xlegacy_script.vim
29279721fb4eSBram Moolenaar
29289721fb4eSBram Moolenaar  assert_equal('global', g:global)
2929f5be8cdbSBram Moolenaar  unlet g:global
29309721fb4eSBram Moolenaar
29319721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29329721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29339721fb4eSBram Moolenaarenddef
2934a5d0077eSBram Moolenaar
2935eeb27bfeSBram Moolenaardef Test_vim9_copen()
2936eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2937eeb27bfeSBram Moolenaar  copen
2938eeb27bfeSBram Moolenaar  quit
2939eeb27bfeSBram Moolenaarenddef
2940eeb27bfeSBram Moolenaar
29412d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
29422d6b20d6SBram Moolenaardef Test_vim9_autoload()
29432d6b20d6SBram Moolenaar  let lines =<< trim END
29442d6b20d6SBram Moolenaar     vim9script
29452d6b20d6SBram Moolenaar     def foo#test()
29462d6b20d6SBram Moolenaar         echomsg getreg('"')
29472d6b20d6SBram Moolenaar     enddef
29482d6b20d6SBram Moolenaar  END
29492d6b20d6SBram Moolenaar
29502d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
29512d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
29522d6b20d6SBram Moolenaar  let save_rtp = &rtp
29532d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
29542d6b20d6SBram Moolenaar  augroup test
29552d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
29562d6b20d6SBram Moolenaar  augroup END
29572d6b20d6SBram Moolenaar
29582d6b20d6SBram Moolenaar  normal Y
29592d6b20d6SBram Moolenaar
29602d6b20d6SBram Moolenaar  augroup test
29612d6b20d6SBram Moolenaar    autocmd!
29622d6b20d6SBram Moolenaar  augroup END
29632d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
29642d6b20d6SBram Moolenaar  &rtp = save_rtp
29652d6b20d6SBram Moolenaarenddef
29662d6b20d6SBram Moolenaar
2967585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2968585fea7bSBram Moolenaardef Test_substitute_cmd()
2969585fea7bSBram Moolenaar  new
2970585fea7bSBram Moolenaar  setline(1, 'something')
2971585fea7bSBram Moolenaar  :substitute(some(other(
2972585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2973585fea7bSBram Moolenaar  bwipe!
2974585fea7bSBram Moolenaar
2975f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2976585fea7bSBram Moolenaar  let lines =<< trim END
2977585fea7bSBram Moolenaar    vim9script
2978585fea7bSBram Moolenaar    new
2979585fea7bSBram Moolenaar    setline(1, 'something')
2980585fea7bSBram Moolenaar    :substitute(some(other(
2981585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2982585fea7bSBram Moolenaar    bwipe!
2983585fea7bSBram Moolenaar  END
2984585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2985585fea7bSBram Moolenaar  source Xvim9lines
2986585fea7bSBram Moolenaar
2987585fea7bSBram Moolenaar  delete('Xvim9lines')
2988585fea7bSBram Moolenaarenddef
2989585fea7bSBram Moolenaar
29908a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2991