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
452c7e44a7eSBram Moolenaar  END
453c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
454c7e44a7eSBram Moolenaarenddef
455c7e44a7eSBram Moolenaar
456cab27678SBram Moolenaardef Mess(): string
457cab27678SBram Moolenaar  v:foldstart = 123
458cab27678SBram Moolenaar  return 'xxx'
459cab27678SBram Moolenaarenddef
460cab27678SBram Moolenaar
461d72c1bf0SBram Moolenaardef Test_assignment_failure()
4628a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
4638a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
4648a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
4658a7d6542SBram Moolenaar
46663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
46763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
46863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
46963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
47063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
47163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
47263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
47363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
47463be3d4bSBram Moolenaar
4758a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
4768a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
4778a7d6542SBram Moolenaar
4789b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
4799af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4809af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
4819af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4829af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
4839af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4849af78769SBram Moolenaar                            'let y: number',
4859af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
4869af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4879af78769SBram Moolenaar                            'let y: number',
4889af78769SBram Moolenaar                            'let z: list<number>',
4899af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
4909be61bbbSBram Moolenaar
491e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
492c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
4939be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
494c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
4959be61bbbSBram Moolenaar
496e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
497c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
4989be61bbbSBram Moolenaar
499434d72cbSBram Moolenaar  if has('dnd')
50065821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
501434d72cbSBram Moolenaar  else
502434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
503434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
504434d72cbSBram Moolenaar  endif
5059be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
50665821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
507c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5089be61bbbSBram Moolenaar
509e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
510e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
511e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
512e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5139be61bbbSBram Moolenaar
5149be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
5159be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
5169be61bbbSBram Moolenaar
517822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
51833fa29cfSBram Moolenaar
5198a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5208a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5218a7d6542SBram Moolenaar
5228a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
5238a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
5248a7d6542SBram Moolenaar
5258a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5268a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
52742a480bfSBram Moolenaar
528d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
52942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
530cab27678SBram Moolenaar
531cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
532cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
53343e969d3SBram Moolenaar
53443e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
53543e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
53643e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
53743e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
53843e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
53943e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
54043e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
54143e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
542d72c1bf0SBram Moolenaarenddef
543d72c1bf0SBram Moolenaar
544d72c1bf0SBram Moolenaardef Test_unlet()
545d72c1bf0SBram Moolenaar  g:somevar = 'yes'
546d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
547d72c1bf0SBram Moolenaar  unlet g:somevar
548d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
549d72c1bf0SBram Moolenaar  unlet! g:somevar
550d72c1bf0SBram Moolenaar
551d72c1bf0SBram Moolenaar  call CheckScriptFailure([
552d72c1bf0SBram Moolenaar        'vim9script',
553d72c1bf0SBram Moolenaar        'let svar = 123',
554d72c1bf0SBram Moolenaar        'unlet svar',
555d72c1bf0SBram Moolenaar        ], 'E1081:')
556d72c1bf0SBram Moolenaar  call CheckScriptFailure([
557d72c1bf0SBram Moolenaar        'vim9script',
558d72c1bf0SBram Moolenaar        'let svar = 123',
559d72c1bf0SBram Moolenaar        'unlet s:svar',
560d72c1bf0SBram Moolenaar        ], 'E1081:')
561d72c1bf0SBram Moolenaar  call CheckScriptFailure([
562d72c1bf0SBram Moolenaar        'vim9script',
563d72c1bf0SBram Moolenaar        'let svar = 123',
564d72c1bf0SBram Moolenaar        'def Func()',
565d72c1bf0SBram Moolenaar        '  unlet svar',
566d72c1bf0SBram Moolenaar        'enddef',
567822ba247SBram Moolenaar        'defcompile',
568d72c1bf0SBram Moolenaar        ], 'E1081:')
569d72c1bf0SBram Moolenaar  call CheckScriptFailure([
570d72c1bf0SBram Moolenaar        'vim9script',
571d72c1bf0SBram Moolenaar        'let svar = 123',
572d72c1bf0SBram Moolenaar        'def Func()',
573d72c1bf0SBram Moolenaar        '  unlet s:svar',
574d72c1bf0SBram Moolenaar        'enddef',
575822ba247SBram Moolenaar        'defcompile',
576d72c1bf0SBram Moolenaar        ], 'E1081:')
5777bdaea6eSBram Moolenaar
5787bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
5797bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
5807bdaea6eSBram Moolenaar  unlet $ENVVAR
5817bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
582d72c1bf0SBram Moolenaarenddef
583599c89c8SBram Moolenaar
5844c17ad94SBram Moolenaardef Test_delfunction()
585f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
5864c17ad94SBram Moolenaar  CheckScriptSuccess([
5874c17ad94SBram Moolenaar      'vim9script',
5884c17ad94SBram Moolenaar      'func CheckMe()',
5894c17ad94SBram Moolenaar      '  return 123',
5904c17ad94SBram Moolenaar      'endfunc',
5914c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
5924c17ad94SBram Moolenaar      ])
5934c17ad94SBram Moolenaar
594f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
5954c17ad94SBram Moolenaar  CheckScriptFailure([
5964c17ad94SBram Moolenaar      'vim9script',
5974c17ad94SBram Moolenaar      'func DeleteMe1()',
5984c17ad94SBram Moolenaar      'endfunc',
5994c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6004c17ad94SBram Moolenaar      ], 'E1084:')
6014c17ad94SBram Moolenaar  CheckScriptFailure([
6024c17ad94SBram Moolenaar      'vim9script',
6034c17ad94SBram Moolenaar      'func DeleteMe2()',
6044c17ad94SBram Moolenaar      'endfunc',
6054c17ad94SBram Moolenaar      'def DoThat()',
6064c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6074c17ad94SBram Moolenaar      'enddef',
6084c17ad94SBram Moolenaar      'DoThat()',
6094c17ad94SBram Moolenaar      ], 'E1084:')
6104c17ad94SBram Moolenaar  CheckScriptFailure([
6114c17ad94SBram Moolenaar      'vim9script',
6124c17ad94SBram Moolenaar      'def DeleteMe3()',
6134c17ad94SBram Moolenaar      'enddef',
6144c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6154c17ad94SBram Moolenaar      ], 'E1084:')
6164c17ad94SBram Moolenaar  CheckScriptFailure([
6174c17ad94SBram Moolenaar      'vim9script',
6184c17ad94SBram Moolenaar      'def DeleteMe4()',
6194c17ad94SBram Moolenaar      'enddef',
6204c17ad94SBram Moolenaar      'def DoThat()',
6214c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
6224c17ad94SBram Moolenaar      'enddef',
6234c17ad94SBram Moolenaar      'DoThat()',
6244c17ad94SBram Moolenaar      ], 'E1084:')
625925e9fd6SBram Moolenaar
626925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
627925e9fd6SBram Moolenaar  let lines =<< trim END
628925e9fd6SBram Moolenaar      vim9script
629925e9fd6SBram Moolenaar      def g:Global(): string
630925e9fd6SBram Moolenaar        return "yes"
631925e9fd6SBram Moolenaar      enddef
632925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
633925e9fd6SBram Moolenaar      def! g:Global(): string
634925e9fd6SBram Moolenaar        return "no"
635925e9fd6SBram Moolenaar      enddef
636925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
637925e9fd6SBram Moolenaar      delfunc g:Global
638925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
639925e9fd6SBram Moolenaar  END
640925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
641925e9fd6SBram Moolenaar
642925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
643925e9fd6SBram Moolenaar  lines =<< trim END
644925e9fd6SBram Moolenaar      vim9script
645925e9fd6SBram Moolenaar      func g:Global()
646925e9fd6SBram Moolenaar        return "yes"
647925e9fd6SBram Moolenaar      endfunc
648925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
649925e9fd6SBram Moolenaar      def! g:Global(): string
650925e9fd6SBram Moolenaar        return "no"
651925e9fd6SBram Moolenaar      enddef
652925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
653925e9fd6SBram Moolenaar      delfunc g:Global
654925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
655925e9fd6SBram Moolenaar  END
656925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
657925e9fd6SBram Moolenaar
658925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
659925e9fd6SBram Moolenaar  lines =<< trim END
660925e9fd6SBram Moolenaar      vim9script
661925e9fd6SBram Moolenaar      def g:Global(): string
662925e9fd6SBram Moolenaar        return "yes"
663925e9fd6SBram Moolenaar      enddef
664925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
665925e9fd6SBram Moolenaar      func! g:Global()
666925e9fd6SBram Moolenaar        return "no"
667925e9fd6SBram Moolenaar      endfunc
668925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
669925e9fd6SBram Moolenaar      delfunc g:Global
670925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
671925e9fd6SBram Moolenaar  END
672925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6734c17ad94SBram Moolenaarenddef
6744c17ad94SBram Moolenaar
675599c89c8SBram Moolenaarfunc Test_wrong_type()
676599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
677599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
678599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
679599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
680599c89c8SBram Moolenaar
681599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
682599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
68342a480bfSBram Moolenaar
68442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
68542a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
68642a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
68742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
68842a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
68942a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
69042a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
69142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
69242a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
69342a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
69442a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
695a0a9f43aSBram Moolenaar
696a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
697a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
6988a7d6542SBram Moolenaarendfunc
6998a7d6542SBram Moolenaar
7008a7d6542SBram Moolenaarfunc Test_const()
7018a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7028a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7038a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7049be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7058a7d6542SBram Moolenaarendfunc
7068a7d6542SBram Moolenaar
707df069eecSBram Moolenaardef Test_range_no_colon()
708df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
709df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
710df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
711df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
712df069eecSBram Moolenaarenddef
713df069eecSBram Moolenaar
714df069eecSBram Moolenaar
7158a7d6542SBram Moolenaardef Test_block()
7168a7d6542SBram Moolenaar  let outer = 1
7178a7d6542SBram Moolenaar  {
7188a7d6542SBram Moolenaar    let inner = 2
7198a7d6542SBram Moolenaar    assert_equal(1, outer)
7208a7d6542SBram Moolenaar    assert_equal(2, inner)
7218a7d6542SBram Moolenaar  }
7228a7d6542SBram Moolenaar  assert_equal(1, outer)
7238a7d6542SBram Moolenaarenddef
7248a7d6542SBram Moolenaar
7258a7d6542SBram Moolenaarfunc Test_block_failure()
7268a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
727585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
728585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7298a7d6542SBram Moolenaarendfunc
7308a7d6542SBram Moolenaar
731585fea7bSBram Moolenaardef Test_cmd_modifier()
732585fea7bSBram Moolenaar  tab echo '0'
733585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
734585fea7bSBram Moolenaarenddef
735585fea7bSBram Moolenaar
736d032f34aSBram Moolenaarfunc g:NoSuchFunc()
737d032f34aSBram Moolenaar  echo 'none'
738d032f34aSBram Moolenaarendfunc
739d032f34aSBram Moolenaar
7408a7d6542SBram Moolenaardef Test_try_catch()
7418a7d6542SBram Moolenaar  let l = []
7427a092245SBram Moolenaar  try # comment
7438a7d6542SBram Moolenaar    add(l, '1')
7448a7d6542SBram Moolenaar    throw 'wrong'
7458a7d6542SBram Moolenaar    add(l, '2')
7467a092245SBram Moolenaar  catch # comment
7478a7d6542SBram Moolenaar    add(l, v:exception)
7487a092245SBram Moolenaar  finally # comment
7498a7d6542SBram Moolenaar    add(l, '3')
7507a092245SBram Moolenaar  endtry # comment
7518a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
75268d130c6SBram Moolenaar
753e859312eSBram Moolenaar  l = []
754e859312eSBram Moolenaar  try
755e859312eSBram Moolenaar    try
756e859312eSBram Moolenaar      add(l, '1')
757e859312eSBram Moolenaar      throw 'wrong'
758e859312eSBram Moolenaar      add(l, '2')
759e859312eSBram Moolenaar    catch /right/
760e859312eSBram Moolenaar      add(l, v:exception)
761e859312eSBram Moolenaar    endtry
762e859312eSBram Moolenaar  catch /wrong/
763e859312eSBram Moolenaar    add(l, 'caught')
764e859312eSBram Moolenaar  finally
765e859312eSBram Moolenaar    add(l, 'finally')
766e859312eSBram Moolenaar  endtry
767e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
768e859312eSBram Moolenaar
76968d130c6SBram Moolenaar  let n: number
77068d130c6SBram Moolenaar  try
77168d130c6SBram Moolenaar    n = l[3]
77268d130c6SBram Moolenaar  catch /E684:/
77368d130c6SBram Moolenaar    n = 99
77468d130c6SBram Moolenaar  endtry
77568d130c6SBram Moolenaar  assert_equal(99, n)
77668d130c6SBram Moolenaar
77768d130c6SBram Moolenaar  try
77868d130c6SBram Moolenaar    n = g:astring[3]
77968d130c6SBram Moolenaar  catch /E714:/
78068d130c6SBram Moolenaar    n = 77
78168d130c6SBram Moolenaar  endtry
78268d130c6SBram Moolenaar  assert_equal(77, n)
78368d130c6SBram Moolenaar
78468d130c6SBram Moolenaar  try
78568d130c6SBram Moolenaar    n = l[g:astring]
78668d130c6SBram Moolenaar  catch /E39:/
78768d130c6SBram Moolenaar    n = 77
78868d130c6SBram Moolenaar  endtry
78968d130c6SBram Moolenaar  assert_equal(77, n)
79068d130c6SBram Moolenaar
79168d130c6SBram Moolenaar  try
79268d130c6SBram Moolenaar    n = s:does_not_exist
79368d130c6SBram Moolenaar  catch /E121:/
794f0b9f43cSBram Moolenaar    n = 111
795f0b9f43cSBram Moolenaar  endtry
796f0b9f43cSBram Moolenaar  assert_equal(111, n)
797f0b9f43cSBram Moolenaar
798f0b9f43cSBram Moolenaar  try
799f0b9f43cSBram Moolenaar    n = g:does_not_exist
800f0b9f43cSBram Moolenaar  catch /E121:/
80168d130c6SBram Moolenaar    n = 121
80268d130c6SBram Moolenaar  endtry
80368d130c6SBram Moolenaar  assert_equal(121, n)
80468d130c6SBram Moolenaar
80568d130c6SBram Moolenaar  let d = #{one: 1}
80668d130c6SBram Moolenaar  try
80768d130c6SBram Moolenaar    n = d[g:astring]
80868d130c6SBram Moolenaar  catch /E716:/
80968d130c6SBram Moolenaar    n = 222
81068d130c6SBram Moolenaar  endtry
81168d130c6SBram Moolenaar  assert_equal(222, n)
812f0b9f43cSBram Moolenaar
813f0b9f43cSBram Moolenaar  try
814f0b9f43cSBram Moolenaar    n = -g:astring
815f0b9f43cSBram Moolenaar  catch /E39:/
816f0b9f43cSBram Moolenaar    n = 233
817f0b9f43cSBram Moolenaar  endtry
818f0b9f43cSBram Moolenaar  assert_equal(233, n)
819f0b9f43cSBram Moolenaar
820f0b9f43cSBram Moolenaar  try
821f0b9f43cSBram Moolenaar    n = +g:astring
822f0b9f43cSBram Moolenaar  catch /E1030:/
823f0b9f43cSBram Moolenaar    n = 244
824f0b9f43cSBram Moolenaar  endtry
825f0b9f43cSBram Moolenaar  assert_equal(244, n)
826f0b9f43cSBram Moolenaar
827f0b9f43cSBram Moolenaar  try
828f0b9f43cSBram Moolenaar    n = +g:alist
829f0b9f43cSBram Moolenaar  catch /E745:/
830f0b9f43cSBram Moolenaar    n = 255
831f0b9f43cSBram Moolenaar  endtry
832f0b9f43cSBram Moolenaar  assert_equal(255, n)
833f0b9f43cSBram Moolenaar
834f0b9f43cSBram Moolenaar  let nd: dict<any>
835f0b9f43cSBram Moolenaar  try
836f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
837f0b9f43cSBram Moolenaar  catch /E1029:/
838f0b9f43cSBram Moolenaar    n = 266
839f0b9f43cSBram Moolenaar  endtry
840f0b9f43cSBram Moolenaar  assert_equal(266, n)
841f0b9f43cSBram Moolenaar
842f0b9f43cSBram Moolenaar  try
843f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
844f0b9f43cSBram Moolenaar  catch /E1093:/
845f0b9f43cSBram Moolenaar    n = 277
846f0b9f43cSBram Moolenaar  endtry
847f0b9f43cSBram Moolenaar  assert_equal(277, n)
848f0b9f43cSBram Moolenaar
849e859312eSBram Moolenaar  try
850e859312eSBram Moolenaar    &ts = g:astring
851e859312eSBram Moolenaar  catch /E1029:/
852e859312eSBram Moolenaar    n = 288
853e859312eSBram Moolenaar  endtry
854e859312eSBram Moolenaar  assert_equal(288, n)
855e859312eSBram Moolenaar
856e859312eSBram Moolenaar  try
857e859312eSBram Moolenaar    &backspace = 'asdf'
858e859312eSBram Moolenaar  catch /E474:/
859e859312eSBram Moolenaar    n = 299
860e859312eSBram Moolenaar  endtry
861e859312eSBram Moolenaar  assert_equal(299, n)
862e859312eSBram Moolenaar
863e859312eSBram Moolenaar  l = [1]
864e859312eSBram Moolenaar  try
865e859312eSBram Moolenaar    l[3] = 3
866e859312eSBram Moolenaar  catch /E684:/
867e859312eSBram Moolenaar    n = 300
868e859312eSBram Moolenaar  endtry
869e859312eSBram Moolenaar  assert_equal(300, n)
870e859312eSBram Moolenaar
871e859312eSBram Moolenaar  try
872e859312eSBram Moolenaar    unlet g:does_not_exist
873e859312eSBram Moolenaar  catch /E108:/
874e859312eSBram Moolenaar    n = 322
875e859312eSBram Moolenaar  endtry
876e859312eSBram Moolenaar  assert_equal(322, n)
877e859312eSBram Moolenaar
878e859312eSBram Moolenaar  try
879e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
880e859312eSBram Moolenaar  catch /E721:/
881e859312eSBram Moolenaar    n = 333
882e859312eSBram Moolenaar  endtry
883e859312eSBram Moolenaar  assert_equal(333, n)
884e859312eSBram Moolenaar
885e859312eSBram Moolenaar  try
886e859312eSBram Moolenaar    l = DeletedFunc()
887e859312eSBram Moolenaar  catch /E933:/
888e859312eSBram Moolenaar    n = 344
889e859312eSBram Moolenaar  endtry
890e859312eSBram Moolenaar  assert_equal(344, n)
891d032f34aSBram Moolenaar
892d032f34aSBram Moolenaar  try
893d032f34aSBram Moolenaar    echo len(v:true)
894d032f34aSBram Moolenaar  catch /E701:/
895d032f34aSBram Moolenaar    n = 355
896d032f34aSBram Moolenaar  endtry
897d032f34aSBram Moolenaar  assert_equal(355, n)
898d032f34aSBram Moolenaar
899d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
900d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
901d032f34aSBram Moolenaar  try
902d032f34aSBram Moolenaar    echo P()
903d032f34aSBram Moolenaar  catch /E117:/
904d032f34aSBram Moolenaar    n = 366
905d032f34aSBram Moolenaar  endtry
906d032f34aSBram Moolenaar  assert_equal(366, n)
907d032f34aSBram Moolenaar
908d032f34aSBram Moolenaar  try
909d032f34aSBram Moolenaar    echo g:NoSuchFunc()
910d032f34aSBram Moolenaar  catch /E117:/
911d032f34aSBram Moolenaar    n = 377
912d032f34aSBram Moolenaar  endtry
913d032f34aSBram Moolenaar  assert_equal(377, n)
914d032f34aSBram Moolenaar
915d032f34aSBram Moolenaar  try
916d032f34aSBram Moolenaar    echo g:alist + 4
917d032f34aSBram Moolenaar  catch /E745:/
918d032f34aSBram Moolenaar    n = 388
919d032f34aSBram Moolenaar  endtry
920d032f34aSBram Moolenaar  assert_equal(388, n)
921d032f34aSBram Moolenaar
922d032f34aSBram Moolenaar  try
923d032f34aSBram Moolenaar    echo 4 + g:alist
924d032f34aSBram Moolenaar  catch /E745:/
925d032f34aSBram Moolenaar    n = 399
926d032f34aSBram Moolenaar  endtry
927d032f34aSBram Moolenaar  assert_equal(399, n)
928d032f34aSBram Moolenaar
929d032f34aSBram Moolenaar  try
930d032f34aSBram Moolenaar    echo g:alist.member
931d032f34aSBram Moolenaar  catch /E715:/
932d032f34aSBram Moolenaar    n = 400
933d032f34aSBram Moolenaar  endtry
934d032f34aSBram Moolenaar  assert_equal(400, n)
935d032f34aSBram Moolenaar
936d032f34aSBram Moolenaar  try
937d032f34aSBram Moolenaar    echo d.member
938d032f34aSBram Moolenaar  catch /E716:/
939d032f34aSBram Moolenaar    n = 411
940d032f34aSBram Moolenaar  endtry
941d032f34aSBram Moolenaar  assert_equal(411, n)
9428a7d6542SBram Moolenaarenddef
9438a7d6542SBram Moolenaar
944e859312eSBram Moolenaardef DeletedFunc(): list<any>
945e859312eSBram Moolenaar  return ['delete me']
946e859312eSBram Moolenaarenddef
947e859312eSBram Moolenaardefcompile
948e859312eSBram Moolenaardelfunc DeletedFunc
949e859312eSBram Moolenaar
950257cc5eeSBram Moolenaardef ThrowFromDef()
951a72cfb80SBram Moolenaar  throw "getout" # comment
952257cc5eeSBram Moolenaarenddef
953257cc5eeSBram Moolenaar
954257cc5eeSBram Moolenaarfunc CatchInFunc()
955257cc5eeSBram Moolenaar  try
956257cc5eeSBram Moolenaar    call ThrowFromDef()
957257cc5eeSBram Moolenaar  catch
958257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
959257cc5eeSBram Moolenaar  endtry
960257cc5eeSBram Moolenaarendfunc
961257cc5eeSBram Moolenaar
962257cc5eeSBram Moolenaardef CatchInDef()
963257cc5eeSBram Moolenaar  try
964257cc5eeSBram Moolenaar    ThrowFromDef()
965257cc5eeSBram Moolenaar  catch
966257cc5eeSBram Moolenaar    g:thrown_def = v:exception
967257cc5eeSBram Moolenaar  endtry
968257cc5eeSBram Moolenaarenddef
969257cc5eeSBram Moolenaar
970f575adffSBram Moolenaardef ReturnFinally(): string
971f575adffSBram Moolenaar  try
972f575adffSBram Moolenaar    return 'intry'
973f575adffSBram Moolenaar  finally
974f575adffSBram Moolenaar    g:in_finally = 'finally'
975f575adffSBram Moolenaar  endtry
976f575adffSBram Moolenaar  return 'end'
977f575adffSBram Moolenaarenddef
978f575adffSBram Moolenaar
979257cc5eeSBram Moolenaardef Test_try_catch_nested()
980257cc5eeSBram Moolenaar  CatchInFunc()
981257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
982257cc5eeSBram Moolenaar
983257cc5eeSBram Moolenaar  CatchInDef()
984257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
985f575adffSBram Moolenaar
986f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
987f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
988f575adffSBram Moolenaarenddef
989f575adffSBram Moolenaar
990f575adffSBram Moolenaardef Test_try_catch_match()
991f575adffSBram Moolenaar  let seq = 'a'
992f575adffSBram Moolenaar  try
993f575adffSBram Moolenaar    throw 'something'
994f575adffSBram Moolenaar  catch /nothing/
995f575adffSBram Moolenaar    seq ..= 'x'
996f575adffSBram Moolenaar  catch /some/
997f575adffSBram Moolenaar    seq ..= 'b'
998f575adffSBram Moolenaar  catch /asdf/
999f575adffSBram Moolenaar    seq ..= 'x'
1000e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1001e8c4abbbSBram Moolenaar    seq ..= 'y'
1002f575adffSBram Moolenaar  finally
1003f575adffSBram Moolenaar    seq ..= 'c'
1004f575adffSBram Moolenaar  endtry
1005f575adffSBram Moolenaar  assert_equal('abc', seq)
1006257cc5eeSBram Moolenaarenddef
1007257cc5eeSBram Moolenaar
1008e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1009e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1010e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1011e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1012585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1013585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1014585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1015585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1016585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1017585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1018585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1019585fea7bSBram Moolenaar
1020a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1021585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1022e8c4abbbSBram Moolenaarenddef
1023e8c4abbbSBram Moolenaar
1024006ad48bSBram Moolenaardef Test_throw_vimscript()
1025f5be8cdbSBram Moolenaar  # only checks line continuation
1026006ad48bSBram Moolenaar  let lines =<< trim END
1027006ad48bSBram Moolenaar      vim9script
1028006ad48bSBram Moolenaar      try
1029006ad48bSBram Moolenaar        throw 'one'
1030006ad48bSBram Moolenaar              .. 'two'
1031006ad48bSBram Moolenaar      catch
1032006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1033006ad48bSBram Moolenaar      endtry
1034006ad48bSBram Moolenaar  END
1035006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1036006ad48bSBram Moolenaarenddef
1037006ad48bSBram Moolenaar
103837c83711SBram Moolenaardef Test_cexpr_vimscript()
1039f5be8cdbSBram Moolenaar  # only checks line continuation
104037c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
104137c83711SBram Moolenaar  let lines =<< trim END
104237c83711SBram Moolenaar      vim9script
104337c83711SBram Moolenaar      cexpr 'File'
104437c83711SBram Moolenaar                .. ' someFile' ..
104537c83711SBram Moolenaar                   ' line 19'
104637c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
104737c83711SBram Moolenaar  END
104837c83711SBram Moolenaar  CheckScriptSuccess(lines)
104937c83711SBram Moolenaar  set errorformat&
105037c83711SBram Moolenaarenddef
105137c83711SBram Moolenaar
1052b209750bSBram Moolenaardef Test_list_vimscript()
1053b209750bSBram Moolenaar  # checks line continuation and comments
1054b209750bSBram Moolenaar  let lines =<< trim END
1055b209750bSBram Moolenaar      vim9script
1056b209750bSBram Moolenaar      let mylist = [
1057b209750bSBram Moolenaar            'one',
1058b209750bSBram Moolenaar            # comment
1059b209750bSBram Moolenaar            'two', # empty line follows
1060b209750bSBram Moolenaar
1061b209750bSBram Moolenaar            'three',
1062b209750bSBram Moolenaar            ]
1063b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1064b209750bSBram Moolenaar  END
1065b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1066b209750bSBram Moolenaarenddef
1067b209750bSBram Moolenaar
10682a1381c3SBram Moolenaarif has('channel')
106940ee466cSBram Moolenaar  let someJob = test_null_job()
107040ee466cSBram Moolenaar
107140ee466cSBram Moolenaar  def FuncWithError()
107240ee466cSBram Moolenaar    echomsg g:someJob
107340ee466cSBram Moolenaar  enddef
107440ee466cSBram Moolenaar
107540ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
107640ee466cSBram Moolenaar    try
107740ee466cSBram Moolenaar      call FuncWithError()
107840ee466cSBram Moolenaar    catch
107940ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
108040ee466cSBram Moolenaar    endtry
108140ee466cSBram Moolenaar  endfunc
10822a1381c3SBram Moolenaarendif
108340ee466cSBram Moolenaar
10848a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10858a7d6542SBram Moolenaar  vim9script
10868a7d6542SBram Moolenaar  let name: string = 'bob'
10878a7d6542SBram Moolenaar  def Concat(arg: string): string
10888a7d6542SBram Moolenaar    return name .. arg
10898a7d6542SBram Moolenaar  enddef
1090227a69deSBram Moolenaar  g:result = Concat('bie')
1091227a69deSBram Moolenaar  g:localname = name
10928a7d6542SBram Moolenaar
10938a7d6542SBram Moolenaar  export const CONST = 1234
10948a7d6542SBram Moolenaar  export let exported = 9876
10956e587dcbSBram Moolenaar  export let exp_name = 'John'
10968a7d6542SBram Moolenaar  export def Exported(): string
10978a7d6542SBram Moolenaar    return 'Exported'
10988a7d6542SBram Moolenaar  enddef
10998a7d6542SBram MoolenaarEND
11008a7d6542SBram Moolenaar
11015269bd2aSBram Moolenaardef Test_vim9_import_export()
11028a7d6542SBram Moolenaar  let import_script_lines =<< trim END
11038a7d6542SBram Moolenaar    vim9script
11048a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
11058a7d6542SBram Moolenaar    g:imported = exported
11066e587dcbSBram Moolenaar    exported += 3
11076e587dcbSBram Moolenaar    g:imported_added = exported
11088a7d6542SBram Moolenaar    g:imported_func = Exported()
11096e587dcbSBram Moolenaar
111040f4f7a4SBram Moolenaar    def GetExported(): string
111140f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
111240f4f7a4SBram Moolenaar      return local_dict.ref()
111340f4f7a4SBram Moolenaar    enddef
111440f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
111540f4f7a4SBram Moolenaar
11166e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
11176e587dcbSBram Moolenaar    g:imported_name = exp_name
11186e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11196e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
11205381c7a1SBram Moolenaar    g:imported_later = exported
11218a7d6542SBram Moolenaar  END
11228a7d6542SBram Moolenaar
11238a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11248a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11258a7d6542SBram Moolenaar
11268a7d6542SBram Moolenaar  source Ximport.vim
11278a7d6542SBram Moolenaar
11288a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11298a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11308a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11316e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11325381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11338a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
113440f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11356e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11366e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11378a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11388a7d6542SBram Moolenaar
11398a7d6542SBram Moolenaar  unlet g:result
11408a7d6542SBram Moolenaar  unlet g:localname
11418a7d6542SBram Moolenaar  unlet g:imported
11426e587dcbSBram Moolenaar  unlet g:imported_added
11435381c7a1SBram Moolenaar  unlet g:imported_later
11448a7d6542SBram Moolenaar  unlet g:imported_func
11456e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11468a7d6542SBram Moolenaar  delete('Ximport.vim')
1147f2d5c240SBram Moolenaar
11481c991144SBram Moolenaar  # similar, with line breaks
11491c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11501c991144SBram Moolenaar    vim9script
11511c991144SBram Moolenaar    import {
11521c991144SBram Moolenaar        exported,
11531c991144SBram Moolenaar        Exported,
11541c991144SBram Moolenaar        }
11551c991144SBram Moolenaar        from
11561c991144SBram Moolenaar        './Xexport.vim'
11571c991144SBram Moolenaar    g:imported = exported
11581c991144SBram Moolenaar    exported += 5
11591c991144SBram Moolenaar    g:imported_added = exported
11601c991144SBram Moolenaar    g:imported_func = Exported()
11611c991144SBram Moolenaar  END
11621c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11631c991144SBram Moolenaar  source Ximport_lbr.vim
11641c991144SBram Moolenaar
11651c991144SBram Moolenaar  assert_equal(9876, g:imported)
11661c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11671c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11681c991144SBram Moolenaar
11691c991144SBram Moolenaar  # exported script not sourced again
11701c991144SBram Moolenaar  assert_false(exists('g:result'))
11711c991144SBram Moolenaar  unlet g:imported
11721c991144SBram Moolenaar  unlet g:imported_added
11731c991144SBram Moolenaar  unlet g:imported_func
11741c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11751c991144SBram Moolenaar
11761c991144SBram Moolenaar  # import inside :def function
11775381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
11785381c7a1SBram Moolenaar    vim9script
11795381c7a1SBram Moolenaar    def ImportInDef()
11805381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11815381c7a1SBram Moolenaar      g:imported = exported
11825381c7a1SBram Moolenaar      exported += 7
11835381c7a1SBram Moolenaar      g:imported_added = exported
11845381c7a1SBram Moolenaar    enddef
11855381c7a1SBram Moolenaar    ImportInDef()
11865381c7a1SBram Moolenaar  END
11875381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11885381c7a1SBram Moolenaar  source Ximport2.vim
1189f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11905381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11915381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11925381c7a1SBram Moolenaar  unlet g:imported
11935381c7a1SBram Moolenaar  unlet g:imported_added
11945381c7a1SBram Moolenaar  delete('Ximport2.vim')
11955381c7a1SBram Moolenaar
1196f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1197f2d5c240SBram Moolenaar    vim9script
1198f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1199f2d5c240SBram Moolenaar    def UseExport()
1200f2d5c240SBram Moolenaar      g:imported = Export.exported
1201f2d5c240SBram Moolenaar    enddef
1202f2d5c240SBram Moolenaar    UseExport()
1203f2d5c240SBram Moolenaar  END
1204f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1205f2d5c240SBram Moolenaar  source Ximport.vim
12065381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1207f2d5c240SBram Moolenaar
1208599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1209599c89c8SBram Moolenaar    vim9script
1210599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1211599c89c8SBram Moolenaar    def Func()
1212599c89c8SBram Moolenaar      let dummy = 1
1213599c89c8SBram Moolenaar      let imported = Export + dummy
1214599c89c8SBram Moolenaar    enddef
1215822ba247SBram Moolenaar    defcompile
1216599c89c8SBram Moolenaar  END
1217599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1218599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1219599c89c8SBram Moolenaar
1220599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1221599c89c8SBram Moolenaar    vim9script
1222599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1223599c89c8SBram Moolenaar    def Func()
1224599c89c8SBram Moolenaar      let imported = Export . exported
1225599c89c8SBram Moolenaar    enddef
1226822ba247SBram Moolenaar    defcompile
1227599c89c8SBram Moolenaar  END
1228599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1229599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1230599c89c8SBram Moolenaar
1231599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1232599c89c8SBram Moolenaar    vim9script
1233599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1234599c89c8SBram Moolenaar    def Func()
1235599c89c8SBram Moolenaar      let imported = Export.
1236599c89c8SBram Moolenaar    enddef
1237822ba247SBram Moolenaar    defcompile
1238599c89c8SBram Moolenaar  END
1239599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1240599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1241599c89c8SBram Moolenaar
12421c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12431c991144SBram Moolenaar    vim9script
12441c991144SBram Moolenaar    import *
12451c991144SBram Moolenaar        as Export
12461c991144SBram Moolenaar        from
12471c991144SBram Moolenaar        './Xexport.vim'
12481c991144SBram Moolenaar    def UseExport()
12491c991144SBram Moolenaar      g:imported = Export.exported
12501c991144SBram Moolenaar    enddef
12511c991144SBram Moolenaar    UseExport()
12521c991144SBram Moolenaar  END
12531c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12541c991144SBram Moolenaar  source Ximport.vim
12551c991144SBram Moolenaar  assert_equal(9883, g:imported)
12561c991144SBram Moolenaar
1257f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1258f2d5c240SBram Moolenaar    vim9script
1259f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1260f2d5c240SBram Moolenaar  END
1261f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1262f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1263f2d5c240SBram Moolenaar
1264f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1265fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1266fa29c8abSBram Moolenaar    vim9script
1267fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1268fa29c8abSBram Moolenaar  END
1269fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1270fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1271fa29c8abSBram Moolenaar
1272f5be8cdbSBram Moolenaar  # try to import something that is already defined
12735269bd2aSBram Moolenaar  let import_already_defined =<< trim END
12745269bd2aSBram Moolenaar    vim9script
12755269bd2aSBram Moolenaar    let exported = 'something'
12765269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12775269bd2aSBram Moolenaar  END
12785269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12795269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12805269bd2aSBram Moolenaar
1281f5be8cdbSBram Moolenaar  # try to import something that is already defined
12825269bd2aSBram Moolenaar  import_already_defined =<< trim END
12835269bd2aSBram Moolenaar    vim9script
12845269bd2aSBram Moolenaar    let exported = 'something'
12855269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12865269bd2aSBram Moolenaar  END
12875269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12885269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12895269bd2aSBram Moolenaar
1290f5be8cdbSBram Moolenaar  # try to import something that is already defined
12915269bd2aSBram Moolenaar  import_already_defined =<< trim END
12925269bd2aSBram Moolenaar    vim9script
12935269bd2aSBram Moolenaar    let exported = 'something'
12945269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12955269bd2aSBram Moolenaar  END
12965269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12975269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12985269bd2aSBram Moolenaar
1299f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1300fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1301fa29c8abSBram Moolenaar    vim9script
1302fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1303fa29c8abSBram Moolenaar  END
1304fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1305fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1306fa29c8abSBram Moolenaar
1307fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1308fa29c8abSBram Moolenaar    vim9script
1309fa29c8abSBram Moolenaar    import name './Xexport.vim'
1310fa29c8abSBram Moolenaar  END
1311fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1312fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1313fa29c8abSBram Moolenaar
1314fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1315fa29c8abSBram Moolenaar    vim9script
1316fa29c8abSBram Moolenaar    import name from Xexport.vim
1317fa29c8abSBram Moolenaar  END
1318fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1319fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1320fa29c8abSBram Moolenaar
1321fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1322fa29c8abSBram Moolenaar    vim9script
1323fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1324fa29c8abSBram Moolenaar  END
1325fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1326fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1327fa29c8abSBram Moolenaar
1328fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1329fa29c8abSBram Moolenaar    vim9script
1330fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1331fa29c8abSBram Moolenaar  END
13325269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13335269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1334fa29c8abSBram Moolenaar
1335f2d5c240SBram Moolenaar  delete('Ximport.vim')
13365269bd2aSBram Moolenaar  delete('Ximport3.vim')
13378a7d6542SBram Moolenaar  delete('Xexport.vim')
13388a7d6542SBram Moolenaar
1339f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1340750802b5SBram Moolenaar  set cpo&vi
1341750802b5SBram Moolenaar  let cpo_before = &cpo
1342750802b5SBram Moolenaar  let lines =<< trim END
1343750802b5SBram Moolenaar    vim9script
1344750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1345750802b5SBram Moolenaar  END
1346750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1347750802b5SBram Moolenaar  source Xvim9_script
1348750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1349750802b5SBram Moolenaar  set cpo&vim
1350750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1351750802b5SBram Moolenaar  delete('Xvim9_script')
1352750802b5SBram Moolenaarenddef
1353750802b5SBram Moolenaar
1354*803af686SBram Moolenaarfunc g:Trigger()
1355*803af686SBram Moolenaar  source Ximport.vim
1356*803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1357*803af686SBram Moolenaarendfunc
1358*803af686SBram Moolenaar
1359*803af686SBram Moolenaardef Test_import_export_expr_map()
1360*803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1361*803af686SBram Moolenaar  let export_lines =<< trim END
1362*803af686SBram Moolenaar    vim9script
1363*803af686SBram Moolenaar    export def That(): string
1364*803af686SBram Moolenaar      return 'yes'
1365*803af686SBram Moolenaar    enddef
1366*803af686SBram Moolenaar  END
1367*803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1368*803af686SBram Moolenaar
1369*803af686SBram Moolenaar  let import_lines =<< trim END
1370*803af686SBram Moolenaar    vim9script
1371*803af686SBram Moolenaar    import That from './Xexport_that.vim'
1372*803af686SBram Moolenaar    assert_equal('yes', That())
1373*803af686SBram Moolenaar  END
1374*803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1375*803af686SBram Moolenaar
1376*803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1377*803af686SBram Moolenaar  feedkeys('trigger', "xt")
1378*803af686SBram Moolenaar
1379*803af686SBram Moolenaar  delete('Xexport.vim')
1380*803af686SBram Moolenaar  delete('Ximport.vim')
1381*803af686SBram Moolenaar  nunmap trigger
1382*803af686SBram Moolenaarenddef
1383*803af686SBram Moolenaar
1384750802b5SBram Moolenaardef Test_vim9script_fails()
13858a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13868a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1387750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
13889721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
13899b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1390750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1391750802b5SBram Moolenaar
1392c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1393c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1394c785b9a7SBram Moolenaar
1395750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1396a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
13978a7d6542SBram Moolenaarenddef
13988a7d6542SBram Moolenaar
1399f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1400101f4810SBram Moolenaar  CheckRunVimInTerminal
1401101f4810SBram Moolenaar
14029bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1403c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14049bb3eb3eSBram Moolenaarendfunc
14059bb3eb3eSBram Moolenaar
1406c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1407101f4810SBram Moolenaar  let export =<< trim END
1408101f4810SBram Moolenaar    vim9script
1409101f4810SBram Moolenaar    export def Foo(): number
1410101f4810SBram Moolenaar        return 0
1411101f4810SBram Moolenaar    enddef
1412101f4810SBram Moolenaar  END
14139bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1414101f4810SBram Moolenaar
14159bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
14169bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14179bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1418101f4810SBram Moolenaar
14199bb3eb3eSBram Moolenaar  delete('Xexport.vim')
14209bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14219bb3eb3eSBram Moolenaarenddef
1422101f4810SBram Moolenaar
14234c17ad94SBram Moolenaardef Test_vim9script_reload_import()
14248a7d6542SBram Moolenaar  let lines =<< trim END
14258a7d6542SBram Moolenaar    vim9script
14268a7d6542SBram Moolenaar    const var = ''
14278a7d6542SBram Moolenaar    let valone = 1234
14288a7d6542SBram Moolenaar    def MyFunc(arg: string)
14298a7d6542SBram Moolenaar       valone = 5678
14308a7d6542SBram Moolenaar    enddef
14318a7d6542SBram Moolenaar  END
14328a7d6542SBram Moolenaar  let morelines =<< trim END
14338a7d6542SBram Moolenaar    let valtwo = 222
14348a7d6542SBram Moolenaar    export def GetValtwo(): number
14358a7d6542SBram Moolenaar      return valtwo
14368a7d6542SBram Moolenaar    enddef
14378a7d6542SBram Moolenaar  END
143803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14398a7d6542SBram Moolenaar  source Xreload.vim
14408a7d6542SBram Moolenaar  source Xreload.vim
14418a7d6542SBram Moolenaar  source Xreload.vim
14428a7d6542SBram Moolenaar
14438a7d6542SBram Moolenaar  let testlines =<< trim END
14448a7d6542SBram Moolenaar    vim9script
14458a7d6542SBram Moolenaar    def TheFunc()
14468a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14478a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14488a7d6542SBram Moolenaar    enddef
14498a7d6542SBram Moolenaar    TheFunc()
14508a7d6542SBram Moolenaar  END
14518a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14528a7d6542SBram Moolenaar  source Ximport.vim
14538a7d6542SBram Moolenaar
1454f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1455f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14568a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14578a7d6542SBram Moolenaar  source Ximport.vim
14588a7d6542SBram Moolenaar
1459f5be8cdbSBram Moolenaar  # cannot declare a var twice
14608a7d6542SBram Moolenaar  lines =<< trim END
14618a7d6542SBram Moolenaar    vim9script
14628a7d6542SBram Moolenaar    let valone = 1234
14638a7d6542SBram Moolenaar    let valone = 5678
14648a7d6542SBram Moolenaar  END
14658a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14668a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
14678a7d6542SBram Moolenaar
14688a7d6542SBram Moolenaar  delete('Xreload.vim')
14698a7d6542SBram Moolenaar  delete('Ximport.vim')
14708a7d6542SBram Moolenaarenddef
14718a7d6542SBram Moolenaar
1472fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1473fe465a01SBram Moolenaar" script-local name.
1474fe465a01SBram Moolenaardef Test_vim9script_funcref()
1475fe465a01SBram Moolenaar  let sortlines =<< trim END
1476fe465a01SBram Moolenaar      vim9script
1477fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1478bed36b93SBram Moolenaar        return i2 - i1
1479fe465a01SBram Moolenaar      enddef
1480fe465a01SBram Moolenaar
1481fe465a01SBram Moolenaar      export def FastSort(): list<number>
1482fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1483fe465a01SBram Moolenaar      enddef
1484fe465a01SBram Moolenaar  END
1485fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1486fe465a01SBram Moolenaar
1487fe465a01SBram Moolenaar  let lines =<< trim END
1488fe465a01SBram Moolenaar    vim9script
1489fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1490fe465a01SBram Moolenaar    def Test()
1491fe465a01SBram Moolenaar      g:result = FastSort()
1492fe465a01SBram Moolenaar    enddef
1493fe465a01SBram Moolenaar    Test()
1494fe465a01SBram Moolenaar  END
1495fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1496fe465a01SBram Moolenaar
1497fe465a01SBram Moolenaar  source Xscript.vim
1498fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1499fe465a01SBram Moolenaar
1500fe465a01SBram Moolenaar  unlet g:result
1501fe465a01SBram Moolenaar  delete('Xsort.vim')
1502fe465a01SBram Moolenaar  delete('Xscript.vim')
1503fe465a01SBram Moolenaarenddef
1504fe465a01SBram Moolenaar
1505c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1506c620c055SBram Moolenaar" script where FastFilter() is called from.
1507c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1508c620c055SBram Moolenaar  let filterLines =<< trim END
1509c620c055SBram Moolenaar    vim9script
1510c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1511c620c055SBram Moolenaar      return idx % 2 == 1
1512c620c055SBram Moolenaar    enddef
1513c620c055SBram Moolenaar    export def FastFilter(): list<number>
1514c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1515c620c055SBram Moolenaar    enddef
1516c620c055SBram Moolenaar  END
1517c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1518c620c055SBram Moolenaar
1519c620c055SBram Moolenaar  let lines =<< trim END
1520c620c055SBram Moolenaar    vim9script
1521c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1522c620c055SBram Moolenaar    def Test()
1523c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1524c620c055SBram Moolenaar    enddef
1525c620c055SBram Moolenaar    Test()
1526c620c055SBram Moolenaar  END
1527c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1528c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1529c620c055SBram Moolenaar
1530c620c055SBram Moolenaar  delete('Xfilter.vim')
1531c620c055SBram Moolenaar  delete('Ximport.vim')
1532c620c055SBram Moolenaarenddef
1533c620c055SBram Moolenaar
15344c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
15354c17ad94SBram Moolenaar  let first_lines =<< trim END
15364c17ad94SBram Moolenaar    vim9script
15374c17ad94SBram Moolenaar    def FuncYes(): string
15384c17ad94SBram Moolenaar      return 'yes'
15394c17ad94SBram Moolenaar    enddef
15404c17ad94SBram Moolenaar  END
154103afdcf1SBram Moolenaar  let withno_lines =<< trim END
15424c17ad94SBram Moolenaar    def FuncNo(): string
15434c17ad94SBram Moolenaar      return 'no'
15444c17ad94SBram Moolenaar    enddef
15454c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15464c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15474c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
154803afdcf1SBram Moolenaar    enddef
154903afdcf1SBram Moolenaar  END
155003afdcf1SBram Moolenaar  let nono_lines =<< trim END
155103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
155203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
15534c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
15544c17ad94SBram Moolenaar    enddef
15554c17ad94SBram Moolenaar  END
15564c17ad94SBram Moolenaar
15574c17ad94SBram Moolenaar  # FuncNo() is defined
155803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15594c17ad94SBram Moolenaar  source Xreloaded.vim
15604c17ad94SBram Moolenaar  g:DoCheck(true)
15614c17ad94SBram Moolenaar
15624c17ad94SBram Moolenaar  # FuncNo() is not redefined
156303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
15644c17ad94SBram Moolenaar  source Xreloaded.vim
156503afdcf1SBram Moolenaar  g:DoCheck()
15664c17ad94SBram Moolenaar
15674c17ad94SBram Moolenaar  # FuncNo() is back
156803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15694c17ad94SBram Moolenaar  source Xreloaded.vim
157003afdcf1SBram Moolenaar  g:DoCheck()
15714c17ad94SBram Moolenaar
15724c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15734c17ad94SBram Moolenaarenddef
15744c17ad94SBram Moolenaar
157589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
157689483d40SBram Moolenaar  # write the script with a script-local variable
157789483d40SBram Moolenaar  let lines =<< trim END
157889483d40SBram Moolenaar    vim9script
157989483d40SBram Moolenaar    let var = 'string'
158089483d40SBram Moolenaar  END
158189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
158289483d40SBram Moolenaar  source XreloadVar.vim
158389483d40SBram Moolenaar
158489483d40SBram Moolenaar  # now write the script using the same variable locally - works
158589483d40SBram Moolenaar  lines =<< trim END
158689483d40SBram Moolenaar    vim9script
158789483d40SBram Moolenaar    def Func()
158889483d40SBram Moolenaar      let var = 'string'
158989483d40SBram Moolenaar    enddef
159089483d40SBram Moolenaar  END
159189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
159289483d40SBram Moolenaar  source XreloadVar.vim
159389483d40SBram Moolenaar
159489483d40SBram Moolenaar  delete('XreloadVar.vim')
159589483d40SBram Moolenaarenddef
159689483d40SBram Moolenaar
15978a7d6542SBram Moolenaardef Test_import_absolute()
15988a7d6542SBram Moolenaar  let import_lines = [
1599e6085c53SBram Moolenaar        'vim9script',
1600e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1601e6085c53SBram Moolenaar        'def UseExported()',
1602e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1603e6085c53SBram Moolenaar        '  exported = 8888',
1604e6085c53SBram Moolenaar        '  g:imported_after = exported',
1605e6085c53SBram Moolenaar        'enddef',
1606e6085c53SBram Moolenaar        'UseExported()',
1607e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1608e6085c53SBram Moolenaar        ]
16098a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16108a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16118a7d6542SBram Moolenaar
16128a7d6542SBram Moolenaar  source Ximport_abs.vim
16138a7d6542SBram Moolenaar
16148a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16154e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1616675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1617675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1618675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1619675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1620675f716eSBram Moolenaar          'exported = 8888.*' ..
1621675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1622675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1623675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1624675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1625e6085c53SBram Moolenaar        g:import_disassembled)
16268a7d6542SBram Moolenaar  unlet g:imported_abs
16274e12a5dfSBram Moolenaar  unlet g:import_disassembled
16288a7d6542SBram Moolenaar
16298a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16308a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16318a7d6542SBram Moolenaarenddef
16328a7d6542SBram Moolenaar
16338a7d6542SBram Moolenaardef Test_import_rtp()
16348a7d6542SBram Moolenaar  let import_lines = [
1635e6085c53SBram Moolenaar        'vim9script',
1636e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1637e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1638e6085c53SBram Moolenaar        ]
16398a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16408a7d6542SBram Moolenaar  mkdir('import')
16418a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16428a7d6542SBram Moolenaar
16438a7d6542SBram Moolenaar  let save_rtp = &rtp
16448a7d6542SBram Moolenaar  &rtp = getcwd()
16458a7d6542SBram Moolenaar  source Ximport_rtp.vim
16468a7d6542SBram Moolenaar  &rtp = save_rtp
16478a7d6542SBram Moolenaar
16488a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16498a7d6542SBram Moolenaar  unlet g:imported_rtp
16508a7d6542SBram Moolenaar
16518a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
165289483d40SBram Moolenaar  delete('import', 'rf')
16538a7d6542SBram Moolenaarenddef
16548a7d6542SBram Moolenaar
165525e0f586SBram Moolenaardef Test_import_compile_error()
165625e0f586SBram Moolenaar  let export_lines = [
165725e0f586SBram Moolenaar        'vim9script',
165825e0f586SBram Moolenaar        'export def ExpFunc(): string',
165925e0f586SBram Moolenaar        '  return notDefined',
166025e0f586SBram Moolenaar        'enddef',
166125e0f586SBram Moolenaar        ]
166225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
166325e0f586SBram Moolenaar
166425e0f586SBram Moolenaar  let import_lines = [
166525e0f586SBram Moolenaar        'vim9script',
166625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
166725e0f586SBram Moolenaar        'def ImpFunc()',
166825e0f586SBram Moolenaar        '  echo ExpFunc()',
166925e0f586SBram Moolenaar        'enddef',
167025e0f586SBram Moolenaar        'defcompile',
167125e0f586SBram Moolenaar        ]
167225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
167325e0f586SBram Moolenaar
167425e0f586SBram Moolenaar  try
167525e0f586SBram Moolenaar    source Ximport.vim
167625e0f586SBram Moolenaar  catch /E1001/
1677f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
167825e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
167925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
168025e0f586SBram Moolenaar  endtry
168125e0f586SBram Moolenaar
168225e0f586SBram Moolenaar  delete('Xexported.vim')
168325e0f586SBram Moolenaar  delete('Ximport.vim')
168425e0f586SBram Moolenaarenddef
168525e0f586SBram Moolenaar
1686eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1687eef2102eSBram Moolenaar  let export_lines =<< trim END
1688eef2102eSBram Moolenaar      vim9script
1689eef2102eSBram Moolenaar      export def Func()
1690eef2102eSBram Moolenaar        echo 'imported'
1691eef2102eSBram Moolenaar      enddef
1692eef2102eSBram Moolenaar  END
1693eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1694eef2102eSBram Moolenaar
1695eef2102eSBram Moolenaar  let lines =<< trim END
1696eef2102eSBram Moolenaar    vim9script
1697eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1698eef2102eSBram Moolenaar    def Func()
1699eef2102eSBram Moolenaar      echo 'local to function'
1700eef2102eSBram Moolenaar    enddef
1701eef2102eSBram Moolenaar  END
1702eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1703eef2102eSBram Moolenaar
1704eef2102eSBram Moolenaar  lines =<< trim END
1705eef2102eSBram Moolenaar    vim9script
1706eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1707eef2102eSBram Moolenaar    def Outer()
1708eef2102eSBram Moolenaar      def Func()
1709eef2102eSBram Moolenaar        echo 'local to function'
1710eef2102eSBram Moolenaar      enddef
1711eef2102eSBram Moolenaar    enddef
1712eef2102eSBram Moolenaar    defcompile
1713eef2102eSBram Moolenaar  END
1714eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1715eef2102eSBram Moolenaar
1716eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1717eef2102eSBram Moolenaarenddef
1718eef2102eSBram Moolenaar
1719b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1720b9a2cac3SBram Moolenaar  let lines =<< trim END
1721b9a2cac3SBram Moolenaar    vim9script
1722b9a2cac3SBram Moolenaar    def Func()
1723b9a2cac3SBram Moolenaar      echo 'one'
1724b9a2cac3SBram Moolenaar    enddef
1725b9a2cac3SBram Moolenaar    def Func()
1726b9a2cac3SBram Moolenaar      echo 'two'
1727b9a2cac3SBram Moolenaar    enddef
1728b9a2cac3SBram Moolenaar  END
1729b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1730b9a2cac3SBram Moolenaarenddef
1731b9a2cac3SBram Moolenaar
17328a7d6542SBram Moolenaardef Test_fixed_size_list()
1733f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
17348a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
17358a7d6542SBram Moolenaar  l->remove(0)
17368a7d6542SBram Moolenaar  l->add(5)
17378a7d6542SBram Moolenaar  l->insert(99, 1)
17380f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17398a7d6542SBram Moolenaarenddef
17408a7d6542SBram Moolenaar
1741ae616494SBram Moolenaardef Test_no_insert_xit()
1742ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1743ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1744f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1745f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1746f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1747ae616494SBram Moolenaar
1748ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1749ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1750ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1751ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1752f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1753f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1754f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1755f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1756f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1757ae616494SBram Moolenaarenddef
1758ae616494SBram Moolenaar
1759158906cfSBram Moolenaardef IfElse(what: number): string
1760158906cfSBram Moolenaar  let res = ''
1761158906cfSBram Moolenaar  if what == 1
1762158906cfSBram Moolenaar    res = "one"
1763158906cfSBram Moolenaar  elseif what == 2
1764158906cfSBram Moolenaar    res = "two"
1765a259d8d3SBram Moolenaar  else
1766158906cfSBram Moolenaar    res = "three"
1767a259d8d3SBram Moolenaar  endif
1768158906cfSBram Moolenaar  return res
1769a259d8d3SBram Moolenaarenddef
1770a259d8d3SBram Moolenaar
1771158906cfSBram Moolenaardef Test_if_elseif_else()
1772158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1773158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1774158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
17750f18b6d1SBram Moolenaarenddef
17760f18b6d1SBram Moolenaar
1777e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1778e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1779e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1780e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1781e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1782585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1783e8c4abbbSBram Moolenaarenddef
1784e8c4abbbSBram Moolenaar
17856d69bf60SBram Moolenaarlet g:bool_true = v:true
17866d69bf60SBram Moolenaarlet g:bool_false = v:false
17876d69bf60SBram Moolenaar
17886d69bf60SBram Moolenaardef Test_if_const_expr()
17896d69bf60SBram Moolenaar  let res = false
17906d69bf60SBram Moolenaar  if true ? true : false
17916d69bf60SBram Moolenaar    res = true
17926d69bf60SBram Moolenaar  endif
17936d69bf60SBram Moolenaar  assert_equal(true, res)
17946d69bf60SBram Moolenaar
1795585fea7bSBram Moolenaar  g:glob = 2
1796585fea7bSBram Moolenaar  if false
17976797966dSBram Moolenaar    execute('g:glob = 3')
1798585fea7bSBram Moolenaar  endif
1799585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1800585fea7bSBram Moolenaar  if true
18016797966dSBram Moolenaar    execute('g:glob = 3')
1802585fea7bSBram Moolenaar  endif
1803585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1804585fea7bSBram Moolenaar
18056d69bf60SBram Moolenaar  res = false
18066d69bf60SBram Moolenaar  if g:bool_true ? true : false
18076d69bf60SBram Moolenaar    res = true
18086d69bf60SBram Moolenaar  endif
18096d69bf60SBram Moolenaar  assert_equal(true, res)
18106d69bf60SBram Moolenaar
18116d69bf60SBram Moolenaar  res = false
18126d69bf60SBram Moolenaar  if true ? g:bool_true : false
18136d69bf60SBram Moolenaar    res = true
18146d69bf60SBram Moolenaar  endif
18156d69bf60SBram Moolenaar  assert_equal(true, res)
18166d69bf60SBram Moolenaar
18176d69bf60SBram Moolenaar  res = false
18186d69bf60SBram Moolenaar  if true ? true : g:bool_false
18196d69bf60SBram Moolenaar    res = true
18206d69bf60SBram Moolenaar  endif
18216d69bf60SBram Moolenaar  assert_equal(true, res)
18226d69bf60SBram Moolenaar
18236d69bf60SBram Moolenaar  res = false
18246d69bf60SBram Moolenaar  if true ? false : true
18256d69bf60SBram Moolenaar    res = true
18266d69bf60SBram Moolenaar  endif
18276d69bf60SBram Moolenaar  assert_equal(false, res)
18286d69bf60SBram Moolenaar
18296d69bf60SBram Moolenaar  res = false
18306d69bf60SBram Moolenaar  if false ? false : true
18316d69bf60SBram Moolenaar    res = true
18326d69bf60SBram Moolenaar  endif
18336d69bf60SBram Moolenaar  assert_equal(true, res)
18346d69bf60SBram Moolenaar
18356d69bf60SBram Moolenaar  res = false
18366d69bf60SBram Moolenaar  if false ? true : false
18376d69bf60SBram Moolenaar    res = true
18386d69bf60SBram Moolenaar  endif
18396d69bf60SBram Moolenaar  assert_equal(false, res)
18406d69bf60SBram Moolenaar
18416d69bf60SBram Moolenaar  res = false
1842e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1843e8c4abbbSBram Moolenaar    res = true
1844e8c4abbbSBram Moolenaar  endif
1845e8c4abbbSBram Moolenaar  assert_equal(false, res)
1846e8c4abbbSBram Moolenaar
1847e8c4abbbSBram Moolenaar  res = false
18486d69bf60SBram Moolenaar  if true && true
18496d69bf60SBram Moolenaar    res = true
18506d69bf60SBram Moolenaar  endif
18516d69bf60SBram Moolenaar  assert_equal(true, res)
18526d69bf60SBram Moolenaar
18536d69bf60SBram Moolenaar  res = false
18546d69bf60SBram Moolenaar  if true && false
18556d69bf60SBram Moolenaar    res = true
18566d69bf60SBram Moolenaar  endif
18576d69bf60SBram Moolenaar  assert_equal(false, res)
18586d69bf60SBram Moolenaar
18596d69bf60SBram Moolenaar  res = false
18606d69bf60SBram Moolenaar  if g:bool_true && false
18616d69bf60SBram Moolenaar    res = true
18626d69bf60SBram Moolenaar  endif
18636d69bf60SBram Moolenaar  assert_equal(false, res)
18646d69bf60SBram Moolenaar
18656d69bf60SBram Moolenaar  res = false
18666d69bf60SBram Moolenaar  if true && g:bool_false
18676d69bf60SBram Moolenaar    res = true
18686d69bf60SBram Moolenaar  endif
18696d69bf60SBram Moolenaar  assert_equal(false, res)
18706d69bf60SBram Moolenaar
18716d69bf60SBram Moolenaar  res = false
18726d69bf60SBram Moolenaar  if false && false
18736d69bf60SBram Moolenaar    res = true
18746d69bf60SBram Moolenaar  endif
18756d69bf60SBram Moolenaar  assert_equal(false, res)
18766d69bf60SBram Moolenaar
18776d69bf60SBram Moolenaar  res = false
18786d69bf60SBram Moolenaar  if true || false
18796d69bf60SBram Moolenaar    res = true
18806d69bf60SBram Moolenaar  endif
18816d69bf60SBram Moolenaar  assert_equal(true, res)
18826d69bf60SBram Moolenaar
18836d69bf60SBram Moolenaar  res = false
18846d69bf60SBram Moolenaar  if g:bool_true || false
18856d69bf60SBram Moolenaar    res = true
18866d69bf60SBram Moolenaar  endif
18876d69bf60SBram Moolenaar  assert_equal(true, res)
18886d69bf60SBram Moolenaar
18896d69bf60SBram Moolenaar  res = false
18906d69bf60SBram Moolenaar  if true || g:bool_false
18916d69bf60SBram Moolenaar    res = true
18926d69bf60SBram Moolenaar  endif
18936d69bf60SBram Moolenaar  assert_equal(true, res)
18946d69bf60SBram Moolenaar
18956d69bf60SBram Moolenaar  res = false
18966d69bf60SBram Moolenaar  if false || false
18976d69bf60SBram Moolenaar    res = true
18986d69bf60SBram Moolenaar  endif
18996d69bf60SBram Moolenaar  assert_equal(false, res)
190080c34ca3SBram Moolenaarenddef
19016d69bf60SBram Moolenaar
190280c34ca3SBram Moolenaardef Test_if_const_expr_fails()
190380c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
190480c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1905e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1906e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19076d69bf60SBram Moolenaarenddef
19086d69bf60SBram Moolenaar
190972abcf42SBram Moolenaardef RunNested(i: number): number
191072abcf42SBram Moolenaar  let x: number = 0
191172abcf42SBram Moolenaar  if i % 2
191272abcf42SBram Moolenaar    if 1
1913f5be8cdbSBram Moolenaar      # comment
191472abcf42SBram Moolenaar    else
1915f5be8cdbSBram Moolenaar      # comment
191672abcf42SBram Moolenaar    endif
191772abcf42SBram Moolenaar    x += 1
191872abcf42SBram Moolenaar  else
191972abcf42SBram Moolenaar    x += 1000
192072abcf42SBram Moolenaar  endif
192172abcf42SBram Moolenaar  return x
192272abcf42SBram Moolenaarenddef
192372abcf42SBram Moolenaar
192472abcf42SBram Moolenaardef Test_nested_if()
192572abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
192672abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
192772abcf42SBram Moolenaarenddef
192872abcf42SBram Moolenaar
1929ad39c094SBram Moolenaardef Test_execute_cmd()
1930ad39c094SBram Moolenaar  new
1931ad39c094SBram Moolenaar  setline(1, 'default')
1932ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1933ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1934a72cfb80SBram Moolenaar
1935a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1936a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1937a72cfb80SBram Moolenaar
1938ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1939ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1940a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1941ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1942a72cfb80SBram Moolenaar
1943ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1944ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1945a72cfb80SBram Moolenaar
1946ad39c094SBram Moolenaar  let cmd_first = 'call '
1947ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1948ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1949ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1950ad39c094SBram Moolenaar  bwipe!
1951585fea7bSBram Moolenaar
19522d6b20d6SBram Moolenaar  let n = true
19532d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
19542d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
19552d6b20d6SBram Moolenaar
1956585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1957a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1958ad39c094SBram Moolenaarenddef
1959ad39c094SBram Moolenaar
196047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1961f5be8cdbSBram Moolenaar  # only checks line continuation
196247e880d6SBram Moolenaar  let lines =<< trim END
196347e880d6SBram Moolenaar      vim9script
196447e880d6SBram Moolenaar      execute 'g:someVar'
196547e880d6SBram Moolenaar                .. ' = ' ..
196647e880d6SBram Moolenaar                   '28'
196747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
196847e880d6SBram Moolenaar      unlet g:someVar
196947e880d6SBram Moolenaar  END
197047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
197147e880d6SBram Moolenaarenddef
197247e880d6SBram Moolenaar
1973ad39c094SBram Moolenaardef Test_echo_cmd()
1974a72cfb80SBram Moolenaar  echo 'some' # comment
1975585fea7bSBram Moolenaar  echon 'thing'
1976ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1977ad39c094SBram Moolenaar
1978a72cfb80SBram Moolenaar  echo "some" # comment
1979a72cfb80SBram Moolenaar  echon "thing"
1980a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1981a72cfb80SBram Moolenaar
1982ad39c094SBram Moolenaar  let str1 = 'some'
1983ad39c094SBram Moolenaar  let str2 = 'more'
1984ad39c094SBram Moolenaar  echo str1 str2
1985ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1986a72cfb80SBram Moolenaar
1987a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1988ad39c094SBram Moolenaarenddef
1989ad39c094SBram Moolenaar
1990f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1991f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1992f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1993f93c7feaSBram Moolenaar  echo 'clear'
1994df069eecSBram Moolenaar  :1messages
1995f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1996f93c7feaSBram Moolenaar
1997f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1998f93c7feaSBram Moolenaarenddef
1999f93c7feaSBram Moolenaar
200047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2001f5be8cdbSBram Moolenaar  # only checks line continuation
200247e880d6SBram Moolenaar  let lines =<< trim END
200347e880d6SBram Moolenaar      vim9script
200447e880d6SBram Moolenaar      echomsg 'here'
200547e880d6SBram Moolenaar                .. ' is ' ..
200647e880d6SBram Moolenaar                   'a message'
200747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
200847e880d6SBram Moolenaar  END
200947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
201047e880d6SBram Moolenaarenddef
201147e880d6SBram Moolenaar
2012f93c7feaSBram Moolenaardef Test_echoerr_cmd()
201340ee466cSBram Moolenaar  try
201440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
201540ee466cSBram Moolenaar  catch
201640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
201740ee466cSBram Moolenaar  endtry
2018f93c7feaSBram Moolenaarenddef
2019f93c7feaSBram Moolenaar
202047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2021f5be8cdbSBram Moolenaar  # only checks line continuation
202247e880d6SBram Moolenaar  let lines =<< trim END
202347e880d6SBram Moolenaar      vim9script
202447e880d6SBram Moolenaar      try
202547e880d6SBram Moolenaar        echoerr 'this'
202647e880d6SBram Moolenaar                .. ' is ' ..
202747e880d6SBram Moolenaar                   'wrong'
202847e880d6SBram Moolenaar      catch
202947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
203047e880d6SBram Moolenaar      endtry
203147e880d6SBram Moolenaar  END
203247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
203347e880d6SBram Moolenaarenddef
203447e880d6SBram Moolenaar
203541fe0617SBram Moolenaardef Test_for_outside_of_function()
203641fe0617SBram Moolenaar  let lines =<< trim END
203741fe0617SBram Moolenaar    vim9script
203841fe0617SBram Moolenaar    new
203941fe0617SBram Moolenaar    for var in range(0, 3)
204041fe0617SBram Moolenaar      append(line('$'), var)
204141fe0617SBram Moolenaar    endfor
204241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
204341fe0617SBram Moolenaar    bwipe!
204441fe0617SBram Moolenaar  END
204541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
204641fe0617SBram Moolenaar  source Xvim9for.vim
204741fe0617SBram Moolenaar  delete('Xvim9for.vim')
204841fe0617SBram Moolenaarenddef
20498a7d6542SBram Moolenaar
2050e8c4abbbSBram Moolenaardef Test_for_loop()
2051e8c4abbbSBram Moolenaar  let result = ''
2052e8c4abbbSBram Moolenaar  for cnt in range(7)
2053e8c4abbbSBram Moolenaar    if cnt == 4
2054e8c4abbbSBram Moolenaar      break
2055e8c4abbbSBram Moolenaar    endif
2056e8c4abbbSBram Moolenaar    if cnt == 2
2057e8c4abbbSBram Moolenaar      continue
2058e8c4abbbSBram Moolenaar    endif
2059e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2060e8c4abbbSBram Moolenaar  endfor
2061e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
20620ad3e894SBram Moolenaar
20630ad3e894SBram Moolenaar  let concat = ''
20640ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
20650ad3e894SBram Moolenaar    concat ..= str
20660ad3e894SBram Moolenaar  endfor
20670ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2068e8c4abbbSBram Moolenaarenddef
2069e8c4abbbSBram Moolenaar
2070e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2071675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2072675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2073675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2074822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
20750ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2076675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2077675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2078675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2079e8c4abbbSBram Moolenaarenddef
2080e8c4abbbSBram Moolenaar
2081d0df1aacSBram Moolenaardef Test_while_loop()
2082d0df1aacSBram Moolenaar  let result = ''
2083d0df1aacSBram Moolenaar  let cnt = 0
2084d0df1aacSBram Moolenaar  while cnt < 555
2085d0df1aacSBram Moolenaar    if cnt == 3
2086d0df1aacSBram Moolenaar      break
2087d0df1aacSBram Moolenaar    endif
2088d0df1aacSBram Moolenaar    cnt += 1
2089d0df1aacSBram Moolenaar    if cnt == 2
2090d0df1aacSBram Moolenaar      continue
2091d0df1aacSBram Moolenaar    endif
2092d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2093d0df1aacSBram Moolenaar  endwhile
2094d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2095d0df1aacSBram Moolenaarenddef
2096d0df1aacSBram Moolenaar
2097e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2098675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2099675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2100675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2101675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2102675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2103675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2104675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2105bd5da371SBram Moolenaarenddef
2106bd5da371SBram Moolenaar
21079645e2d9SBram Moolenaardef Test_interrupt_loop()
210897acfc78SBram Moolenaar  let caught = false
21099645e2d9SBram Moolenaar  let x = 0
211097acfc78SBram Moolenaar  try
21119645e2d9SBram Moolenaar    while 1
21129645e2d9SBram Moolenaar      x += 1
21139645e2d9SBram Moolenaar      if x == 100
21149645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
21159645e2d9SBram Moolenaar      endif
21169645e2d9SBram Moolenaar    endwhile
211797acfc78SBram Moolenaar  catch
211897acfc78SBram Moolenaar    caught = true
211997acfc78SBram Moolenaar    assert_equal(100, x)
212097acfc78SBram Moolenaar  endtry
212197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
21229645e2d9SBram Moolenaarenddef
212320431c9dSBram Moolenaar
21244fdae999SBram Moolenaardef Test_automatic_line_continuation()
21254fdae999SBram Moolenaar  let mylist = [
21264fdae999SBram Moolenaar      'one',
21274fdae999SBram Moolenaar      'two',
21284fdae999SBram Moolenaar      'three',
2129f5be8cdbSBram Moolenaar      ] # comment
21304fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
21314fdae999SBram Moolenaar
21324fdae999SBram Moolenaar  let mydict = {
21334fdae999SBram Moolenaar      'one': 1,
21344fdae999SBram Moolenaar      'two': 2,
21354fdae999SBram Moolenaar      'three':
21364fdae999SBram Moolenaar          3,
2137f5be8cdbSBram Moolenaar      } # comment
21384fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
21394fdae999SBram Moolenaar  mydict = #{
21402c330432SBram Moolenaar      one: 1,  # comment
21412c330432SBram Moolenaar      two:     # comment
21422c330432SBram Moolenaar           2,  # comment
21432c330432SBram Moolenaar      three: 3 # comment
21442c330432SBram Moolenaar      }
21452c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
21462c330432SBram Moolenaar  mydict = #{
21472c330432SBram Moolenaar      one: 1,
21484fdae999SBram Moolenaar      two:
21494fdae999SBram Moolenaar           2,
21502c330432SBram Moolenaar      three: 3
21514fdae999SBram Moolenaar      }
21524fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2153e6085c53SBram Moolenaar
2154e6085c53SBram Moolenaar  assert_equal(
2155e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2156e6085c53SBram Moolenaar        split('one two three')
2157e6085c53SBram Moolenaar        )
21584fdae999SBram Moolenaarenddef
21594fdae999SBram Moolenaar
21607a092245SBram Moolenaardef Test_vim9_comment()
21617a092245SBram Moolenaar  CheckScriptSuccess([
21627a092245SBram Moolenaar      'vim9script',
21637a092245SBram Moolenaar      '# something',
21647a092245SBram Moolenaar      ])
21657a092245SBram Moolenaar  CheckScriptFailure([
21667a092245SBram Moolenaar      'vim9script',
21677a092245SBram Moolenaar      ':# something',
21687a092245SBram Moolenaar      ], 'E488:')
21697a092245SBram Moolenaar  CheckScriptFailure([
21707a092245SBram Moolenaar      '# something',
21717a092245SBram Moolenaar      ], 'E488:')
21727a092245SBram Moolenaar  CheckScriptFailure([
21737a092245SBram Moolenaar      ':# something',
21747a092245SBram Moolenaar      ], 'E488:')
21757a092245SBram Moolenaar
21764a8d9f2eSBram Moolenaar  { # block start
21774a8d9f2eSBram Moolenaar  } # block end
21784a8d9f2eSBram Moolenaar  CheckDefFailure([
21794a8d9f2eSBram Moolenaar      '{# comment',
21804a8d9f2eSBram Moolenaar      ], 'E488:')
21814a8d9f2eSBram Moolenaar  CheckDefFailure([
21824a8d9f2eSBram Moolenaar      '{',
21834a8d9f2eSBram Moolenaar      '}# comment',
21844a8d9f2eSBram Moolenaar      ], 'E488:')
21854a8d9f2eSBram Moolenaar
21864a8d9f2eSBram Moolenaar  echo "yes" # comment
21874a8d9f2eSBram Moolenaar  CheckDefFailure([
21884a8d9f2eSBram Moolenaar      'echo "yes"# comment',
21894a8d9f2eSBram Moolenaar      ], 'E488:')
21907a092245SBram Moolenaar  CheckScriptSuccess([
21917a092245SBram Moolenaar      'vim9script',
21927a092245SBram Moolenaar      'echo "yes" # something',
21937a092245SBram Moolenaar      ])
21947a092245SBram Moolenaar  CheckScriptFailure([
21957a092245SBram Moolenaar      'vim9script',
21967a092245SBram Moolenaar      'echo "yes"# something',
21977a092245SBram Moolenaar      ], 'E121:')
21987a092245SBram Moolenaar  CheckScriptFailure([
21997a092245SBram Moolenaar      'vim9script',
22007a092245SBram Moolenaar      'echo# something',
22017a092245SBram Moolenaar      ], 'E121:')
22027a092245SBram Moolenaar  CheckScriptFailure([
22037a092245SBram Moolenaar      'echo "yes" # something',
22047a092245SBram Moolenaar      ], 'E121:')
22057a092245SBram Moolenaar
22064a8d9f2eSBram Moolenaar  exe "echo" # comment
22074a8d9f2eSBram Moolenaar  CheckDefFailure([
22084a8d9f2eSBram Moolenaar      'exe "echo"# comment',
22094a8d9f2eSBram Moolenaar      ], 'E488:')
22104a8d9f2eSBram Moolenaar  CheckScriptSuccess([
22114a8d9f2eSBram Moolenaar      'vim9script',
22124a8d9f2eSBram Moolenaar      'exe "echo" # something',
22134a8d9f2eSBram Moolenaar      ])
22144a8d9f2eSBram Moolenaar  CheckScriptFailure([
22154a8d9f2eSBram Moolenaar      'vim9script',
22164a8d9f2eSBram Moolenaar      'exe "echo"# something',
22174a8d9f2eSBram Moolenaar      ], 'E121:')
22184a8d9f2eSBram Moolenaar  CheckDefFailure([
22194a8d9f2eSBram Moolenaar      'exe # comment',
22204a8d9f2eSBram Moolenaar      ], 'E1015:')
22214a8d9f2eSBram Moolenaar  CheckScriptFailure([
22224a8d9f2eSBram Moolenaar      'vim9script',
22234a8d9f2eSBram Moolenaar      'exe# something',
22244a8d9f2eSBram Moolenaar      ], 'E121:')
22254a8d9f2eSBram Moolenaar  CheckScriptFailure([
22264a8d9f2eSBram Moolenaar      'exe "echo" # something',
22274a8d9f2eSBram Moolenaar      ], 'E121:')
22284a8d9f2eSBram Moolenaar
22297a092245SBram Moolenaar  CheckDefFailure([
22307a092245SBram Moolenaar      'try# comment',
22317a092245SBram Moolenaar      '  echo "yes"',
22327a092245SBram Moolenaar      'catch',
22337a092245SBram Moolenaar      'endtry',
22347a092245SBram Moolenaar      ], 'E488:')
22352c5ed4e3SBram Moolenaar  CheckScriptFailure([
22362c5ed4e3SBram Moolenaar      'vim9script',
22372c5ed4e3SBram Moolenaar      'try# comment',
22382c5ed4e3SBram Moolenaar      'echo "yes"',
22392c5ed4e3SBram Moolenaar      ], 'E488:')
22407a092245SBram Moolenaar  CheckDefFailure([
22417a092245SBram Moolenaar      'try',
2242a72cfb80SBram Moolenaar      '  throw#comment',
2243a72cfb80SBram Moolenaar      'catch',
2244a72cfb80SBram Moolenaar      'endtry',
2245a72cfb80SBram Moolenaar      ], 'E1015:')
2246a72cfb80SBram Moolenaar  CheckDefFailure([
2247a72cfb80SBram Moolenaar      'try',
2248a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2249a72cfb80SBram Moolenaar      'catch',
2250a72cfb80SBram Moolenaar      'endtry',
2251a72cfb80SBram Moolenaar      ], 'E488:')
2252a72cfb80SBram Moolenaar  CheckDefFailure([
2253a72cfb80SBram Moolenaar      'try',
22547a092245SBram Moolenaar      '  echo "yes"',
22557a092245SBram Moolenaar      'catch# comment',
22567a092245SBram Moolenaar      'endtry',
22577a092245SBram Moolenaar      ], 'E488:')
22582c5ed4e3SBram Moolenaar  CheckScriptFailure([
22592c5ed4e3SBram Moolenaar      'vim9script',
22602c5ed4e3SBram Moolenaar      'try',
22612c5ed4e3SBram Moolenaar      '  echo "yes"',
22622c5ed4e3SBram Moolenaar      'catch# comment',
22632c5ed4e3SBram Moolenaar      'endtry',
22642c5ed4e3SBram Moolenaar      ], 'E654:')
22652c5ed4e3SBram Moolenaar  CheckDefFailure([
22662c5ed4e3SBram Moolenaar      'try',
22672c5ed4e3SBram Moolenaar      '  echo "yes"',
22682c5ed4e3SBram Moolenaar      'catch /pat/# comment',
22692c5ed4e3SBram Moolenaar      'endtry',
22702c5ed4e3SBram Moolenaar      ], 'E488:')
22717a092245SBram Moolenaar  CheckDefFailure([
22727a092245SBram Moolenaar      'try',
22737a092245SBram Moolenaar      'echo "yes"',
22747a092245SBram Moolenaar      'catch',
22757a092245SBram Moolenaar      'endtry# comment',
22767a092245SBram Moolenaar      ], 'E488:')
22772c5ed4e3SBram Moolenaar  CheckScriptFailure([
22782c5ed4e3SBram Moolenaar      'vim9script',
22792c5ed4e3SBram Moolenaar      'try',
22802c5ed4e3SBram Moolenaar      '  echo "yes"',
22812c5ed4e3SBram Moolenaar      'catch',
22822c5ed4e3SBram Moolenaar      'endtry# comment',
22839b7bf9e9SBram Moolenaar      ], 'E488:')
22842c5ed4e3SBram Moolenaar
22852c5ed4e3SBram Moolenaar  CheckScriptSuccess([
22862c5ed4e3SBram Moolenaar      'vim9script',
22872c5ed4e3SBram Moolenaar      'hi # comment',
22882c5ed4e3SBram Moolenaar      ])
22892c5ed4e3SBram Moolenaar  CheckScriptFailure([
22902c5ed4e3SBram Moolenaar      'vim9script',
22912c5ed4e3SBram Moolenaar      'hi# comment',
22922c5ed4e3SBram Moolenaar      ], 'E416:')
22931966c248SBram Moolenaar  CheckScriptSuccess([
22941966c248SBram Moolenaar      'vim9script',
22951966c248SBram Moolenaar      'hi Search # comment',
22961966c248SBram Moolenaar      ])
22971966c248SBram Moolenaar  CheckScriptFailure([
22981966c248SBram Moolenaar      'vim9script',
22991966c248SBram Moolenaar      'hi Search# comment',
23001966c248SBram Moolenaar      ], 'E416:')
23011966c248SBram Moolenaar  CheckScriptSuccess([
23021966c248SBram Moolenaar      'vim9script',
23031966c248SBram Moolenaar      'hi link This Search # comment',
23041966c248SBram Moolenaar      ])
23051966c248SBram Moolenaar  CheckScriptFailure([
23061966c248SBram Moolenaar      'vim9script',
23071966c248SBram Moolenaar      'hi link This That# comment',
23081966c248SBram Moolenaar      ], 'E413:')
23091966c248SBram Moolenaar  CheckScriptSuccess([
23101966c248SBram Moolenaar      'vim9script',
23111966c248SBram Moolenaar      'hi clear This # comment',
23121966c248SBram Moolenaar      'hi clear # comment',
23131966c248SBram Moolenaar      ])
2314f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2315f5be8cdbSBram Moolenaar  # hi clear This# comment',
23161966c248SBram Moolenaar  CheckScriptFailure([
23171966c248SBram Moolenaar      'vim9script',
23181966c248SBram Moolenaar      'hi clear# comment',
23191966c248SBram Moolenaar      ], 'E416:')
23201966c248SBram Moolenaar
23211966c248SBram Moolenaar  CheckScriptSuccess([
23221966c248SBram Moolenaar      'vim9script',
23231966c248SBram Moolenaar      'hi Group term=bold',
23241966c248SBram Moolenaar      'match Group /todo/ # comment',
23251966c248SBram Moolenaar      ])
23261966c248SBram Moolenaar  CheckScriptFailure([
23271966c248SBram Moolenaar      'vim9script',
23281966c248SBram Moolenaar      'hi Group term=bold',
23291966c248SBram Moolenaar      'match Group /todo/# comment',
23301966c248SBram Moolenaar      ], 'E488:')
23311966c248SBram Moolenaar  CheckScriptSuccess([
23321966c248SBram Moolenaar      'vim9script',
23331966c248SBram Moolenaar      'match # comment',
23341966c248SBram Moolenaar      ])
23351966c248SBram Moolenaar  CheckScriptFailure([
23361966c248SBram Moolenaar      'vim9script',
23371966c248SBram Moolenaar      'match# comment',
23381966c248SBram Moolenaar      ], 'E475:')
23391966c248SBram Moolenaar  CheckScriptSuccess([
23401966c248SBram Moolenaar      'vim9script',
23411966c248SBram Moolenaar      'match none # comment',
23421966c248SBram Moolenaar      ])
23431966c248SBram Moolenaar  CheckScriptFailure([
23441966c248SBram Moolenaar      'vim9script',
23451966c248SBram Moolenaar      'match none# comment',
23461966c248SBram Moolenaar      ], 'E475:')
23471966c248SBram Moolenaar
23481966c248SBram Moolenaar  CheckScriptSuccess([
23491966c248SBram Moolenaar      'vim9script',
23501966c248SBram Moolenaar      'menutrans clear # comment',
23511966c248SBram Moolenaar      ])
23521966c248SBram Moolenaar  CheckScriptFailure([
23531966c248SBram Moolenaar      'vim9script',
23541966c248SBram Moolenaar      'menutrans clear# comment text',
23551966c248SBram Moolenaar      ], 'E474:')
23561966c248SBram Moolenaar
23571966c248SBram Moolenaar  CheckScriptSuccess([
23581966c248SBram Moolenaar      'vim9script',
23591966c248SBram Moolenaar      'syntax clear # comment',
23601966c248SBram Moolenaar      ])
23611966c248SBram Moolenaar  CheckScriptFailure([
23621966c248SBram Moolenaar      'vim9script',
23631966c248SBram Moolenaar      'syntax clear# comment text',
23641966c248SBram Moolenaar      ], 'E28:')
23651966c248SBram Moolenaar  CheckScriptSuccess([
23661966c248SBram Moolenaar      'vim9script',
23671966c248SBram Moolenaar      'syntax keyword Word some',
23681966c248SBram Moolenaar      'syntax clear Word # comment',
23691966c248SBram Moolenaar      ])
23701966c248SBram Moolenaar  CheckScriptFailure([
23711966c248SBram Moolenaar      'vim9script',
23721966c248SBram Moolenaar      'syntax keyword Word some',
23731966c248SBram Moolenaar      'syntax clear Word# comment text',
23741966c248SBram Moolenaar      ], 'E28:')
23751966c248SBram Moolenaar
23761966c248SBram Moolenaar  CheckScriptSuccess([
23771966c248SBram Moolenaar      'vim9script',
23781966c248SBram Moolenaar      'syntax list # comment',
23791966c248SBram Moolenaar      ])
23801966c248SBram Moolenaar  CheckScriptFailure([
23811966c248SBram Moolenaar      'vim9script',
23821966c248SBram Moolenaar      'syntax list# comment text',
23831966c248SBram Moolenaar      ], 'E28:')
23841966c248SBram Moolenaar
23851966c248SBram Moolenaar  CheckScriptSuccess([
23861966c248SBram Moolenaar      'vim9script',
23871966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
23881966c248SBram Moolenaar      ])
23891966c248SBram Moolenaar  CheckScriptFailure([
23901966c248SBram Moolenaar      'vim9script',
23911966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
23921966c248SBram Moolenaar      ], 'E475:')
23931966c248SBram Moolenaar
23941966c248SBram Moolenaar  CheckScriptSuccess([
23951966c248SBram Moolenaar      'vim9script',
23961966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
23971966c248SBram Moolenaar      ])
23981966c248SBram Moolenaar  CheckScriptFailure([
23991966c248SBram Moolenaar      'vim9script',
24001966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
24011966c248SBram Moolenaar      ], 'E789:')
24021966c248SBram Moolenaar
24031966c248SBram Moolenaar  CheckScriptSuccess([
24041966c248SBram Moolenaar      'vim9script',
24051966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
24061966c248SBram Moolenaar      ])
24071966c248SBram Moolenaar  CheckScriptFailure([
24081966c248SBram Moolenaar      'vim9script',
24091966c248SBram Moolenaar      'syntax match Word /pat/# comment',
24101966c248SBram Moolenaar      ], 'E402:')
24111966c248SBram Moolenaar
24121966c248SBram Moolenaar  CheckScriptSuccess([
24131966c248SBram Moolenaar      'vim9script',
24141966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
24151966c248SBram Moolenaar      ])
24161966c248SBram Moolenaar  CheckScriptFailure([
24171966c248SBram Moolenaar      'vim9script',
24181966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
24191966c248SBram Moolenaar      ], 'E475:')
24201966c248SBram Moolenaar  CheckScriptFailure([
24211966c248SBram Moolenaar      'vim9script',
24221966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
24231966c248SBram Moolenaar      ], 'E406:')
24241966c248SBram Moolenaar  CheckScriptFailure([
24251966c248SBram Moolenaar      'vim9script',
24261966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
24271966c248SBram Moolenaar      ], 'E475:')
24281966c248SBram Moolenaar
24291966c248SBram Moolenaar  CheckScriptSuccess([
24301966c248SBram Moolenaar      'vim9script',
24311966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
24321966c248SBram Moolenaar      ])
24331966c248SBram Moolenaar  CheckScriptFailure([
24341966c248SBram Moolenaar      'vim9script',
24351966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2436d032f34aSBram Moolenaar      ], 'E402:')
24371966c248SBram Moolenaar
24381966c248SBram Moolenaar  CheckScriptSuccess([
24391966c248SBram Moolenaar      'vim9script',
24401966c248SBram Moolenaar      'syntax sync # comment',
24411966c248SBram Moolenaar      ])
24421966c248SBram Moolenaar  CheckScriptFailure([
24431966c248SBram Moolenaar      'vim9script',
24441966c248SBram Moolenaar      'syntax sync# comment',
24451966c248SBram Moolenaar      ], 'E404:')
24461966c248SBram Moolenaar  CheckScriptSuccess([
24471966c248SBram Moolenaar      'vim9script',
24481966c248SBram Moolenaar      'syntax sync ccomment # comment',
24491966c248SBram Moolenaar      ])
24501966c248SBram Moolenaar  CheckScriptFailure([
24511966c248SBram Moolenaar      'vim9script',
24521966c248SBram Moolenaar      'syntax sync ccomment# comment',
24531966c248SBram Moolenaar      ], 'E404:')
24541966c248SBram Moolenaar
24551966c248SBram Moolenaar  CheckScriptSuccess([
24561966c248SBram Moolenaar      'vim9script',
24571966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
24581966c248SBram Moolenaar      ])
24591966c248SBram Moolenaar  CheckScriptFailure([
24601966c248SBram Moolenaar      'vim9script',
24611966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
24621966c248SBram Moolenaar      ], 'E475:')
2463a72cfb80SBram Moolenaar
2464a72cfb80SBram Moolenaar  CheckScriptSuccess([
2465a72cfb80SBram Moolenaar      'vim9script',
2466a72cfb80SBram Moolenaar      'command Echo echo # comment',
2467a72cfb80SBram Moolenaar      'command Echo # comment',
2468a72cfb80SBram Moolenaar      ])
2469a72cfb80SBram Moolenaar  CheckScriptFailure([
2470a72cfb80SBram Moolenaar      'vim9script',
2471a72cfb80SBram Moolenaar      'command Echo echo# comment',
2472a72cfb80SBram Moolenaar      'Echo',
2473a72cfb80SBram Moolenaar      ], 'E121:')
2474a72cfb80SBram Moolenaar  CheckScriptFailure([
2475a72cfb80SBram Moolenaar      'vim9script',
2476a72cfb80SBram Moolenaar      'command Echo# comment',
2477a72cfb80SBram Moolenaar      ], 'E182:')
2478a72cfb80SBram Moolenaar  CheckScriptFailure([
2479a72cfb80SBram Moolenaar      'vim9script',
2480a72cfb80SBram Moolenaar      'command Echo echo',
2481a72cfb80SBram Moolenaar      'command Echo# comment',
2482a72cfb80SBram Moolenaar      ], 'E182:')
2483a72cfb80SBram Moolenaar
2484a72cfb80SBram Moolenaar  CheckScriptSuccess([
2485a72cfb80SBram Moolenaar      'vim9script',
2486a72cfb80SBram Moolenaar      'function # comment',
2487a72cfb80SBram Moolenaar      ])
2488a72cfb80SBram Moolenaar  CheckScriptFailure([
2489a72cfb80SBram Moolenaar      'vim9script',
24909898107fSBram Moolenaar      'function " comment',
24919898107fSBram Moolenaar      ], 'E129:')
24929898107fSBram Moolenaar  CheckScriptFailure([
24939898107fSBram Moolenaar      'vim9script',
2494a72cfb80SBram Moolenaar      'function# comment',
2495a72cfb80SBram Moolenaar      ], 'E129:')
2496a72cfb80SBram Moolenaar  CheckScriptSuccess([
2497a72cfb80SBram Moolenaar      'vim9script',
2498a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2499a72cfb80SBram Moolenaar      ])
2500a72cfb80SBram Moolenaar  CheckScriptFailure([
2501a72cfb80SBram Moolenaar      'vim9script',
2502a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2503a72cfb80SBram Moolenaar      ], 'E488:')
2504a72cfb80SBram Moolenaar
2505a72cfb80SBram Moolenaar  CheckScriptSuccess([
2506a72cfb80SBram Moolenaar      'vim9script',
25074c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2508a72cfb80SBram Moolenaar      'endfunc',
25094c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2510a72cfb80SBram Moolenaar      ])
2511a72cfb80SBram Moolenaar  CheckScriptFailure([
2512a72cfb80SBram Moolenaar      'vim9script',
25134c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2514a72cfb80SBram Moolenaar      'endfunc',
25154c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2516a72cfb80SBram Moolenaar      ], 'E488:')
2517a72cfb80SBram Moolenaar
2518a72cfb80SBram Moolenaar  CheckScriptSuccess([
2519a72cfb80SBram Moolenaar      'vim9script',
2520a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2521a72cfb80SBram Moolenaar      ])
2522a72cfb80SBram Moolenaar  CheckScriptFailure([
2523a72cfb80SBram Moolenaar      'vim9script',
2524a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2525a72cfb80SBram Moolenaar      ], 'E488:')
2526e7e4838fSBram Moolenaar
2527e7e4838fSBram Moolenaar  CheckScriptFailure([
2528e7e4838fSBram Moolenaar      'def Test() " comment',
2529e7e4838fSBram Moolenaar      'enddef',
2530e7e4838fSBram Moolenaar      ], 'E488:')
2531e7e4838fSBram Moolenaar  CheckScriptFailure([
2532e7e4838fSBram Moolenaar      'vim9script',
2533e7e4838fSBram Moolenaar      'def Test() " comment',
2534e7e4838fSBram Moolenaar      'enddef',
2535e7e4838fSBram Moolenaar      ], 'E488:')
2536e7e4838fSBram Moolenaar
2537e7e4838fSBram Moolenaar  CheckScriptSuccess([
2538e7e4838fSBram Moolenaar      'func Test() " comment',
2539e7e4838fSBram Moolenaar      'endfunc',
2540e7e4838fSBram Moolenaar      ])
25419898107fSBram Moolenaar  CheckScriptSuccess([
2542e7e4838fSBram Moolenaar      'vim9script',
2543e7e4838fSBram Moolenaar      'func Test() " comment',
2544e7e4838fSBram Moolenaar      'endfunc',
25459898107fSBram Moolenaar      ])
2546e7e4838fSBram Moolenaar
2547e7e4838fSBram Moolenaar  CheckScriptSuccess([
2548e7e4838fSBram Moolenaar      'def Test() # comment',
2549e7e4838fSBram Moolenaar      'enddef',
2550e7e4838fSBram Moolenaar      ])
2551e7e4838fSBram Moolenaar  CheckScriptFailure([
2552e7e4838fSBram Moolenaar      'func Test() # comment',
2553e7e4838fSBram Moolenaar      'endfunc',
2554e7e4838fSBram Moolenaar      ], 'E488:')
25552c5ed4e3SBram Moolenaarenddef
25562c5ed4e3SBram Moolenaar
25572c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
25582c5ed4e3SBram Moolenaar  CheckCanRunGui
25592c5ed4e3SBram Moolenaar
25602c5ed4e3SBram Moolenaar  CheckScriptFailure([
25612c5ed4e3SBram Moolenaar      'vim9script',
25622c5ed4e3SBram Moolenaar      'gui#comment'
25632c5ed4e3SBram Moolenaar      ], 'E499:')
25642c5ed4e3SBram Moolenaar  CheckScriptFailure([
25652c5ed4e3SBram Moolenaar      'vim9script',
25662c5ed4e3SBram Moolenaar      'gui -f#comment'
25672c5ed4e3SBram Moolenaar      ], 'E499:')
25687a092245SBram Moolenaarenddef
25697a092245SBram Moolenaar
2570a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
25716797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
25726797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2573a26b9700SBram Moolenaar
2574a26b9700SBram Moolenaar  edit test.vim
2575a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2576a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2577a26b9700SBram Moolenaar
2578a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2579a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2580a26b9700SBram Moolenaar
2581a26b9700SBram Moolenaar  g:entered = 0
2582a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2583a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2584a26b9700SBram Moolenaar
2585a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2586a26b9700SBram Moolenaar
2587a26b9700SBram Moolenaar  au! TabEnter
2588a26b9700SBram Moolenaar  unlet g:entered
2589d72c1bf0SBram Moolenaar
2590d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2591d72c1bf0SBram Moolenaar      'vim9script',
25926797966dSBram Moolenaar      'g:var = 123',
2593e55b1c09SBram Moolenaar      'b:var = 456',
2594e55b1c09SBram Moolenaar      'w:var = 777',
2595e55b1c09SBram Moolenaar      't:var = 888',
2596d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2597d72c1bf0SBram Moolenaar      ])
2598d72c1bf0SBram Moolenaar
2599d72c1bf0SBram Moolenaar  CheckScriptFailure([
2600d72c1bf0SBram Moolenaar      'vim9script',
2601d72c1bf0SBram Moolenaar      'let g:var = 123',
2602e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2603e55b1c09SBram Moolenaar
2604e55b1c09SBram Moolenaar  CheckScriptFailure([
2605e55b1c09SBram Moolenaar      'vim9script',
2606e55b1c09SBram Moolenaar      'let b:var = 123',
2607e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2608e55b1c09SBram Moolenaar
2609e55b1c09SBram Moolenaar  CheckScriptFailure([
2610e55b1c09SBram Moolenaar      'vim9script',
2611e55b1c09SBram Moolenaar      'let w:var = 123',
2612e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2613e55b1c09SBram Moolenaar
2614e55b1c09SBram Moolenaar  CheckScriptFailure([
2615e55b1c09SBram Moolenaar      'vim9script',
2616e55b1c09SBram Moolenaar      'let t:var = 123',
2617e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2618e55b1c09SBram Moolenaar
2619e55b1c09SBram Moolenaar  CheckScriptFailure([
2620e55b1c09SBram Moolenaar      'vim9script',
2621e55b1c09SBram Moolenaar      'let v:version = 123',
2622e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2623e55b1c09SBram Moolenaar
2624e55b1c09SBram Moolenaar  CheckScriptFailure([
2625e55b1c09SBram Moolenaar      'vim9script',
2626e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2627e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
26286797966dSBram Moolenaar
26296797966dSBram Moolenaar  CheckScriptFailure([
26306797966dSBram Moolenaar      'vim9script',
26316797966dSBram Moolenaar      'g:var = 123',
263232e35117SBram Moolenaar      'unlet g:var# comment1',
2633d72c1bf0SBram Moolenaar      ], 'E108:')
2634d72c1bf0SBram Moolenaar
2635d72c1bf0SBram Moolenaar  CheckScriptFailure([
2636d72c1bf0SBram Moolenaar      'let g:var = 123',
2637d72c1bf0SBram Moolenaar      'unlet g:var # something',
2638d72c1bf0SBram Moolenaar      ], 'E488:')
2639faac4104SBram Moolenaar
2640faac4104SBram Moolenaar  CheckScriptSuccess([
2641faac4104SBram Moolenaar      'vim9script',
264232e35117SBram Moolenaar      'if 1 # comment2',
2643faac4104SBram Moolenaar      '  echo "yes"',
2644faac4104SBram Moolenaar      'elseif 2 #comment',
2645faac4104SBram Moolenaar      '  echo "no"',
2646faac4104SBram Moolenaar      'endif',
2647faac4104SBram Moolenaar      ])
2648faac4104SBram Moolenaar
2649faac4104SBram Moolenaar  CheckScriptFailure([
2650faac4104SBram Moolenaar      'vim9script',
265132e35117SBram Moolenaar      'if 1# comment3',
2652faac4104SBram Moolenaar      '  echo "yes"',
2653faac4104SBram Moolenaar      'endif',
2654faac4104SBram Moolenaar      ], 'E15:')
2655faac4104SBram Moolenaar
2656faac4104SBram Moolenaar  CheckScriptFailure([
2657faac4104SBram Moolenaar      'vim9script',
265832e35117SBram Moolenaar      'if 0 # comment4',
2659faac4104SBram Moolenaar      '  echo "yes"',
2660faac4104SBram Moolenaar      'elseif 2#comment',
2661faac4104SBram Moolenaar      '  echo "no"',
2662faac4104SBram Moolenaar      'endif',
2663faac4104SBram Moolenaar      ], 'E15:')
2664faac4104SBram Moolenaar
2665faac4104SBram Moolenaar  CheckScriptSuccess([
2666faac4104SBram Moolenaar      'vim9script',
266732e35117SBram Moolenaar      'let v = 1 # comment5',
2668faac4104SBram Moolenaar      ])
2669faac4104SBram Moolenaar
2670faac4104SBram Moolenaar  CheckScriptFailure([
2671faac4104SBram Moolenaar      'vim9script',
267232e35117SBram Moolenaar      'let v = 1# comment6',
267332e35117SBram Moolenaar      ], 'E15:')
2674faac4104SBram Moolenaar
2675faac4104SBram Moolenaar  CheckScriptSuccess([
2676faac4104SBram Moolenaar      'vim9script',
2677faac4104SBram Moolenaar      'new'
2678faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2679df069eecSBram Moolenaar      ':$',
2680faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2681faac4104SBram Moolenaar      'bwipe!',
2682faac4104SBram Moolenaar      ])
2683faac4104SBram Moolenaar
2684f5be8cdbSBram Moolenaar  CheckScriptFailure([
2685f5be8cdbSBram Moolenaar      'vim9script',
2686f5be8cdbSBram Moolenaar      'new'
2687f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2688f5be8cdbSBram Moolenaar      ':$',
2689f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2690f5be8cdbSBram Moolenaar      'bwipe!',
2691f5be8cdbSBram Moolenaar      ], 'E488:')
2692f5be8cdbSBram Moolenaar
2693f5be8cdbSBram Moolenaar  CheckScriptFailure([
2694f5be8cdbSBram Moolenaar      'vim9script',
2695f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2696f5be8cdbSBram Moolenaar      ], 'E477:')
2697a26b9700SBram Moolenaarenddef
2698a26b9700SBram Moolenaar
26997e5bd91dSBram Moolenaardef Test_finish()
27007e5bd91dSBram Moolenaar  let lines =<< trim END
27017e5bd91dSBram Moolenaar    vim9script
27026797966dSBram Moolenaar    g:res = 'one'
27037e5bd91dSBram Moolenaar    if v:false | finish | endif
27046797966dSBram Moolenaar    g:res = 'two'
27057e5bd91dSBram Moolenaar    finish
27066797966dSBram Moolenaar    g:res = 'three'
27077e5bd91dSBram Moolenaar  END
27087e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
27097e5bd91dSBram Moolenaar  source Xfinished
27107e5bd91dSBram Moolenaar  assert_equal('two', g:res)
27117e5bd91dSBram Moolenaar
27127e5bd91dSBram Moolenaar  unlet g:res
27137e5bd91dSBram Moolenaar  delete('Xfinished')
27147e5bd91dSBram Moolenaarenddef
27157e5bd91dSBram Moolenaar
271632e35117SBram Moolenaardef Test_let_func_call()
271732e35117SBram Moolenaar  let lines =<< trim END
271832e35117SBram Moolenaar    vim9script
271932e35117SBram Moolenaar    func GetValue()
272032e35117SBram Moolenaar      if exists('g:count')
272132e35117SBram Moolenaar        let g:count += 1
272232e35117SBram Moolenaar      else
272332e35117SBram Moolenaar        let g:count = 1
272432e35117SBram Moolenaar      endif
272532e35117SBram Moolenaar      return 'this'
272632e35117SBram Moolenaar    endfunc
272732e35117SBram Moolenaar    let val: string = GetValue()
2728f5be8cdbSBram Moolenaar    # env var is always a string
2729df671b46SBram Moolenaar    let env = $TERM
273032e35117SBram Moolenaar  END
273132e35117SBram Moolenaar  writefile(lines, 'Xfinished')
273232e35117SBram Moolenaar  source Xfinished
2733f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
273432e35117SBram Moolenaar  assert_equal(1, g:count)
273532e35117SBram Moolenaar
273632e35117SBram Moolenaar  unlet g:count
273732e35117SBram Moolenaar  delete('Xfinished')
273832e35117SBram Moolenaarenddef
273932e35117SBram Moolenaar
274032e35117SBram Moolenaardef Test_let_missing_type()
274132e35117SBram Moolenaar  let lines =<< trim END
274232e35117SBram Moolenaar    vim9script
2743df671b46SBram Moolenaar    let var = g:unknown
2744227a69deSBram Moolenaar  END
2745822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2746227a69deSBram Moolenaar
2747227a69deSBram Moolenaar  lines =<< trim END
2748227a69deSBram Moolenaar    vim9script
2749227a69deSBram Moolenaar    let nr: number = 123
2750227a69deSBram Moolenaar    let var = nr
2751227a69deSBram Moolenaar  END
2752822ba247SBram Moolenaar  CheckScriptSuccess(lines)
275332e35117SBram Moolenaarenddef
275432e35117SBram Moolenaar
2755c82a5b5dSBram Moolenaardef Test_let_declaration()
2756c82a5b5dSBram Moolenaar  let lines =<< trim END
2757c82a5b5dSBram Moolenaar    vim9script
2758c82a5b5dSBram Moolenaar    let var: string
2759c82a5b5dSBram Moolenaar    g:var_uninit = var
2760c82a5b5dSBram Moolenaar    var = 'text'
2761c82a5b5dSBram Moolenaar    g:var_test = var
2762f5be8cdbSBram Moolenaar    # prefixing s: is optional
2763984dddbeSBram Moolenaar    s:var = 'prefixed'
2764984dddbeSBram Moolenaar    g:var_prefixed = s:var
2765984dddbeSBram Moolenaar
2766984dddbeSBram Moolenaar    let s:other: number
2767984dddbeSBram Moolenaar    other = 1234
2768984dddbeSBram Moolenaar    g:other_var = other
2769c82a5b5dSBram Moolenaar  END
2770c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2771c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2772c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2773984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2774984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2775c82a5b5dSBram Moolenaar
2776c82a5b5dSBram Moolenaar  unlet g:var_uninit
2777c82a5b5dSBram Moolenaar  unlet g:var_test
2778984dddbeSBram Moolenaar  unlet g:var_prefixed
2779984dddbeSBram Moolenaar  unlet g:other_var
2780c82a5b5dSBram Moolenaarenddef
2781c82a5b5dSBram Moolenaar
2782c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2783c5b1c20bSBram Moolenaar  let lines =<< trim END
2784c5b1c20bSBram Moolenaar    vim9script
2785c5b1c20bSBram Moolenaar    const var: string
2786c5b1c20bSBram Moolenaar  END
2787c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2788c5b1c20bSBram Moolenaar
2789c5b1c20bSBram Moolenaar  lines =<< trim END
2790c5b1c20bSBram Moolenaar    vim9script
2791c5b1c20bSBram Moolenaar    let 9var: string
2792c5b1c20bSBram Moolenaar  END
2793c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2794c5b1c20bSBram Moolenaarenddef
2795c5b1c20bSBram Moolenaar
279634db91f7SBram Moolenaardef Test_let_type_check()
279734db91f7SBram Moolenaar  let lines =<< trim END
279834db91f7SBram Moolenaar    vim9script
279934db91f7SBram Moolenaar    let var: string
280034db91f7SBram Moolenaar    var = 1234
280134db91f7SBram Moolenaar  END
280234db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2803984dddbeSBram Moolenaar
2804984dddbeSBram Moolenaar  lines =<< trim END
2805984dddbeSBram Moolenaar    vim9script
2806984dddbeSBram Moolenaar    let var:string
2807984dddbeSBram Moolenaar  END
2808984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2809c5b1c20bSBram Moolenaar
2810c5b1c20bSBram Moolenaar  lines =<< trim END
2811c5b1c20bSBram Moolenaar    vim9script
2812c5b1c20bSBram Moolenaar    let var: asdf
2813c5b1c20bSBram Moolenaar  END
2814c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
2815a71e2633SBram Moolenaar
2816a71e2633SBram Moolenaar  lines =<< trim END
2817a71e2633SBram Moolenaar    vim9script
2818a71e2633SBram Moolenaar    let s:l: list<number>
2819a71e2633SBram Moolenaar    s:l = []
2820a71e2633SBram Moolenaar  END
2821a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
2822a71e2633SBram Moolenaar
2823a71e2633SBram Moolenaar  lines =<< trim END
2824a71e2633SBram Moolenaar    vim9script
2825a71e2633SBram Moolenaar    let s:d: dict<number>
2826a71e2633SBram Moolenaar    s:d = {}
2827a71e2633SBram Moolenaar  END
2828a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
282934db91f7SBram Moolenaarenddef
283034db91f7SBram Moolenaar
2831a5d0077eSBram Moolenaardef Test_forward_declaration()
2832a5d0077eSBram Moolenaar  let lines =<< trim END
2833a5d0077eSBram Moolenaar    vim9script
2834a5d0077eSBram Moolenaar    def GetValue(): string
2835a5d0077eSBram Moolenaar      return theVal
2836a5d0077eSBram Moolenaar    enddef
2837a5d0077eSBram Moolenaar    let theVal = 'something'
2838822ba247SBram Moolenaar    g:initVal = GetValue()
2839a5d0077eSBram Moolenaar    theVal = 'else'
2840a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2841a5d0077eSBram Moolenaar  END
2842a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2843a5d0077eSBram Moolenaar  source Xforward
2844a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2845a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2846a5d0077eSBram Moolenaar
2847a5d0077eSBram Moolenaar  unlet g:initVal
2848a5d0077eSBram Moolenaar  unlet g:laterVal
2849a5d0077eSBram Moolenaar  delete('Xforward')
2850a5d0077eSBram Moolenaarenddef
2851a5d0077eSBram Moolenaar
28529721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
28539721fb4eSBram Moolenaar  let legacy_lines =<< trim END
28549721fb4eSBram Moolenaar    source Xvim9_script.vim
28559721fb4eSBram Moolenaar
28569721fb4eSBram Moolenaar    call assert_false(exists('local'))
28579721fb4eSBram Moolenaar    call assert_false(exists('exported'))
28589721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
28599721fb4eSBram Moolenaar    call assert_equal('global', global)
28609721fb4eSBram Moolenaar    call assert_equal('global', g:global)
28619721fb4eSBram Moolenaar
28629721fb4eSBram Moolenaar    " imported variable becomes script-local
28639721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
28649721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
28659721fb4eSBram Moolenaar    call assert_false(exists('exported'))
28669721fb4eSBram Moolenaar
28679721fb4eSBram Moolenaar    " imported function becomes script-local
28689721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
28699721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
28709721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
28719721fb4eSBram Moolenaar  END
28729721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
28739721fb4eSBram Moolenaar
28749721fb4eSBram Moolenaar  let vim9_lines =<< trim END
28759721fb4eSBram Moolenaar    vim9script
28769721fb4eSBram Moolenaar    let local = 'local'
28779721fb4eSBram Moolenaar    g:global = 'global'
28789721fb4eSBram Moolenaar    export let exported = 'exported'
28799721fb4eSBram Moolenaar    export def GetText(): string
28809721fb4eSBram Moolenaar       return 'text'
28819721fb4eSBram Moolenaar    enddef
28829721fb4eSBram Moolenaar  END
28839721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
28849721fb4eSBram Moolenaar
28859721fb4eSBram Moolenaar  source Xlegacy_script.vim
28869721fb4eSBram Moolenaar
28879721fb4eSBram Moolenaar  assert_equal('global', g:global)
2888f5be8cdbSBram Moolenaar  unlet g:global
28899721fb4eSBram Moolenaar
28909721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
28919721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
28929721fb4eSBram Moolenaarenddef
2893a5d0077eSBram Moolenaar
2894eeb27bfeSBram Moolenaardef Test_vim9_copen()
2895eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2896eeb27bfeSBram Moolenaar  copen
2897eeb27bfeSBram Moolenaar  quit
2898eeb27bfeSBram Moolenaarenddef
2899eeb27bfeSBram Moolenaar
29002d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
29012d6b20d6SBram Moolenaardef Test_vim9_autoload()
29022d6b20d6SBram Moolenaar  let lines =<< trim END
29032d6b20d6SBram Moolenaar     vim9script
29042d6b20d6SBram Moolenaar     def foo#test()
29052d6b20d6SBram Moolenaar         echomsg getreg('"')
29062d6b20d6SBram Moolenaar     enddef
29072d6b20d6SBram Moolenaar  END
29082d6b20d6SBram Moolenaar
29092d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
29102d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
29112d6b20d6SBram Moolenaar  let save_rtp = &rtp
29122d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
29132d6b20d6SBram Moolenaar  augroup test
29142d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
29152d6b20d6SBram Moolenaar  augroup END
29162d6b20d6SBram Moolenaar
29172d6b20d6SBram Moolenaar  normal Y
29182d6b20d6SBram Moolenaar
29192d6b20d6SBram Moolenaar  augroup test
29202d6b20d6SBram Moolenaar    autocmd!
29212d6b20d6SBram Moolenaar  augroup END
29222d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
29232d6b20d6SBram Moolenaar  &rtp = save_rtp
29242d6b20d6SBram Moolenaarenddef
29252d6b20d6SBram Moolenaar
2926585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2927585fea7bSBram Moolenaardef Test_substitute_cmd()
2928585fea7bSBram Moolenaar  new
2929585fea7bSBram Moolenaar  setline(1, 'something')
2930585fea7bSBram Moolenaar  :substitute(some(other(
2931585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2932585fea7bSBram Moolenaar  bwipe!
2933585fea7bSBram Moolenaar
2934f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2935585fea7bSBram Moolenaar  let lines =<< trim END
2936585fea7bSBram Moolenaar    vim9script
2937585fea7bSBram Moolenaar    new
2938585fea7bSBram Moolenaar    setline(1, 'something')
2939585fea7bSBram Moolenaar    :substitute(some(other(
2940585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2941585fea7bSBram Moolenaar    bwipe!
2942585fea7bSBram Moolenaar  END
2943585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2944585fea7bSBram Moolenaar  source Xvim9lines
2945585fea7bSBram Moolenaar
2946585fea7bSBram Moolenaar  delete('Xvim9lines')
2947585fea7bSBram Moolenaarenddef
2948585fea7bSBram Moolenaar
29498a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2950