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
115a8c17704SBram Moolenaar  g:inc_counter += 1
116a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
117a8c17704SBram Moolenaar
118a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
119a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
120a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
121a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
122a8c17704SBram Moolenaar
123a8c17704SBram Moolenaar  @a = 'areg'
124a8c17704SBram Moolenaar  @a ..= 'add'
125a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
126a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
127a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
128e69f6d04SBram Moolenaar
129b5ed2660SBram Moolenaar  lines =<< trim END
130b5ed2660SBram Moolenaar    vim9script
131b5ed2660SBram Moolenaar    @c = 'areg'
132b5ed2660SBram Moolenaar    @c ..= 'add'
133b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
134b5ed2660SBram Moolenaar  END
135b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
136b5ed2660SBram Moolenaar
137e69f6d04SBram Moolenaar  v:errmsg = 'none'
138e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
139e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
140e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
141e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
14233afa244SBram Moolenaar
14333afa244SBram Moolenaar  # single letter variables
14433afa244SBram Moolenaar  a = 123
14533afa244SBram Moolenaar  assert_equal(123, a)
14633afa244SBram Moolenaar  let b: number
14733afa244SBram Moolenaar  b = 123
14833afa244SBram Moolenaar  assert_equal(123, b)
14933afa244SBram Moolenaar  let g: number
15033afa244SBram Moolenaar  g = 123
15133afa244SBram Moolenaar  assert_equal(123, g)
15233afa244SBram Moolenaar  let s: number
15333afa244SBram Moolenaar  s = 123
15433afa244SBram Moolenaar  assert_equal(123, s)
15533afa244SBram Moolenaar  let t: number
15633afa244SBram Moolenaar  t = 123
15733afa244SBram Moolenaar  assert_equal(123, t)
15833afa244SBram Moolenaar  let v: number
15933afa244SBram Moolenaar  v = 123
16033afa244SBram Moolenaar  assert_equal(123, v)
16133afa244SBram Moolenaar  let w: number
16233afa244SBram Moolenaar  w = 123
16333afa244SBram Moolenaar  assert_equal(123, w)
1645deeb3f1SBram Moolenaarenddef
1655deeb3f1SBram Moolenaar
1663b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1673b74b6b4SBram Moolenaar  let lines =<< trim END
1683b74b6b4SBram Moolenaar      vim9script
1693b74b6b4SBram Moolenaar
170f5be8cdbSBram Moolenaar      # single character variable declarations work
1713b74b6b4SBram Moolenaar      let a: string
1723b74b6b4SBram Moolenaar      let b: number
1733b74b6b4SBram Moolenaar      let l: list<any>
1743b74b6b4SBram Moolenaar      let s: string
1753b74b6b4SBram Moolenaar      let t: number
1763b74b6b4SBram Moolenaar      let v: number
1773b74b6b4SBram Moolenaar      let w: number
1783b74b6b4SBram Moolenaar
179f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1803b74b6b4SBram Moolenaar      a = 'script-a'
1813b74b6b4SBram Moolenaar      b = 111
1823b74b6b4SBram Moolenaar      l = [1, 2, 3]
1833b74b6b4SBram Moolenaar      s = 'script-s'
1843b74b6b4SBram Moolenaar      t = 222
1853b74b6b4SBram Moolenaar      v = 333
1863b74b6b4SBram Moolenaar      w = 444
1873b74b6b4SBram Moolenaar
1883b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1893b74b6b4SBram Moolenaar      assert_equal(111, b)
1903b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
1913b74b6b4SBram Moolenaar      assert_equal('script-s', s)
1923b74b6b4SBram Moolenaar      assert_equal(222, t)
1933b74b6b4SBram Moolenaar      assert_equal(333, v)
1943b74b6b4SBram Moolenaar      assert_equal(444, w)
1953b74b6b4SBram Moolenaar  END
1963b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
1973b74b6b4SBram Moolenaar  source Xsinglechar
1983b74b6b4SBram Moolenaar  delete('Xsinglechar')
1993b74b6b4SBram Moolenaarenddef
2003b74b6b4SBram Moolenaar
20184370087SBram Moolenaardef Test_assignment_list()
20284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
20384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
20484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
20584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
20684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
20784370087SBram Moolenaar
20884370087SBram Moolenaar  let listS: list<string> = []
20984370087SBram Moolenaar  let listN: list<number> = []
21084370087SBram Moolenaar
21184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
21284370087SBram Moolenaar  list2[-1] = 99
21384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
21484370087SBram Moolenaar  list2[-2] = 88
21584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
21684370087SBram Moolenaar  list2[-3] = 77
21784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
21884370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
219c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
22084370087SBram Moolenaar
22184370087SBram Moolenaar  # type becomes list<any>
22284370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
22384370087SBram Moolenaarenddef
22484370087SBram Moolenaar
225b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
226b31be3f9SBram Moolenaar  let lines =<< trim END
227b31be3f9SBram Moolenaar    vim9script
228b31be3f9SBram Moolenaar    let v1: number
229b31be3f9SBram Moolenaar    let v2: number
230b31be3f9SBram Moolenaar    let v3: number
231b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
232b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
233b31be3f9SBram Moolenaar  END
234b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
235b31be3f9SBram Moolenaarenddef
236b31be3f9SBram Moolenaar
23784370087SBram Moolenaardef Test_assignment_dict()
23884370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
23984370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
24084370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
24184370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
24274fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
24384370087SBram Moolenaar
244f5be8cdbSBram Moolenaar  # overwrite
245c785b9a7SBram Moolenaar  dict3['key'] = 'another'
246c785b9a7SBram Moolenaar
24758626872SBram Moolenaar  # empty key can be used
24858626872SBram Moolenaar  let dd = {}
24958626872SBram Moolenaar  dd[""] = 6
25058626872SBram Moolenaar  assert_equal({'': 6}, dd)
25184370087SBram Moolenaar
25284370087SBram Moolenaar  # type becomes dict<any>
25384370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
2548e4c8c85SBram Moolenaar
2558e4c8c85SBram Moolenaar  # assignment to script-local dict
2568e4c8c85SBram Moolenaar  let lines =<< trim END
2578e4c8c85SBram Moolenaar    vim9script
2588e4c8c85SBram Moolenaar    let test: dict<any> = {}
2598e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2608e4c8c85SBram Moolenaar      test['a'] = 43
2618e4c8c85SBram Moolenaar      return test
2628e4c8c85SBram Moolenaar    enddef
2638e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2648e4c8c85SBram Moolenaar  END
2658e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
2668e4c8c85SBram Moolenaar
2678e4c8c85SBram Moolenaar  lines =<< trim END
2688e4c8c85SBram Moolenaar    vim9script
2698e4c8c85SBram Moolenaar    let test: dict<any>
2708e4c8c85SBram Moolenaar    def FillDict(): dict<any>
2718e4c8c85SBram Moolenaar      test['a'] = 43
2728e4c8c85SBram Moolenaar      return test
2738e4c8c85SBram Moolenaar    enddef
2748e4c8c85SBram Moolenaar    FillDict()
2758e4c8c85SBram Moolenaar  END
2768e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
2772caa1594SBram Moolenaar
2782caa1594SBram Moolenaar  # assignment to global dict
2792caa1594SBram Moolenaar  lines =<< trim END
2802caa1594SBram Moolenaar    vim9script
2812caa1594SBram Moolenaar    g:test = {}
2822caa1594SBram Moolenaar    def FillDict(): dict<any>
2832caa1594SBram Moolenaar      g:test['a'] = 43
2842caa1594SBram Moolenaar      return g:test
2852caa1594SBram Moolenaar    enddef
2862caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2872caa1594SBram Moolenaar  END
2882caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
2892caa1594SBram Moolenaar
2902caa1594SBram Moolenaar  # assignment to buffer dict
2912caa1594SBram Moolenaar  lines =<< trim END
2922caa1594SBram Moolenaar    vim9script
2932caa1594SBram Moolenaar    b:test = {}
2942caa1594SBram Moolenaar    def FillDict(): dict<any>
2952caa1594SBram Moolenaar      b:test['a'] = 43
2962caa1594SBram Moolenaar      return b:test
2972caa1594SBram Moolenaar    enddef
2982caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
2992caa1594SBram Moolenaar  END
3002caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
30184370087SBram Moolenaarenddef
30284370087SBram Moolenaar
303d3aac291SBram Moolenaardef Test_assignment_local()
304f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
305f5be8cdbSBram Moolenaar  # changed.
306d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
307d3aac291SBram Moolenaar    let b:existing = 'yes'
308d3aac291SBram Moolenaar    let w:existing = 'yes'
309d3aac291SBram Moolenaar    let t:existing = 'yes'
310d3aac291SBram Moolenaar
311d3aac291SBram Moolenaar    def Test_assignment_local_internal()
312d3aac291SBram Moolenaar      b:newvar = 'new'
313d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
314d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
315d3aac291SBram Moolenaar      b:existing = 'no'
316d3aac291SBram Moolenaar      assert_equal('no', b:existing)
317396f3138SBram Moolenaar      b:existing ..= 'NO'
318396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
319d3aac291SBram Moolenaar
320d3aac291SBram Moolenaar      w:newvar = 'new'
321d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
322d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
323d3aac291SBram Moolenaar      w:existing = 'no'
324d3aac291SBram Moolenaar      assert_equal('no', w:existing)
325396f3138SBram Moolenaar      w:existing ..= 'NO'
326396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
327d3aac291SBram Moolenaar
328d3aac291SBram Moolenaar      t:newvar = 'new'
329d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
330d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
331d3aac291SBram Moolenaar      t:existing = 'no'
332d3aac291SBram Moolenaar      assert_equal('no', t:existing)
333396f3138SBram Moolenaar      t:existing ..= 'NO'
334396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
335d3aac291SBram Moolenaar    enddef
336d3aac291SBram Moolenaar    call Test_assignment_local_internal()
337d3aac291SBram Moolenaar  END
338d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
339d3aac291SBram Moolenaarenddef
340d3aac291SBram Moolenaar
3415deeb3f1SBram Moolenaardef Test_assignment_default()
342e69f6d04SBram Moolenaar
343cb711abfSBram Moolenaar  # Test default values.
344e69f6d04SBram Moolenaar  let thebool: bool
345e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
346e69f6d04SBram Moolenaar
347e69f6d04SBram Moolenaar  let thenumber: number
348e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
349e69f6d04SBram Moolenaar
350e69f6d04SBram Moolenaar  if has('float')
351e69f6d04SBram Moolenaar    let thefloat: float
352e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
353e69f6d04SBram Moolenaar  endif
354e69f6d04SBram Moolenaar
355e69f6d04SBram Moolenaar  let thestring: string
356e69f6d04SBram Moolenaar  assert_equal('', thestring)
357e69f6d04SBram Moolenaar
358e69f6d04SBram Moolenaar  let theblob: blob
359e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
360e69f6d04SBram Moolenaar
3615deeb3f1SBram Moolenaar  let Thefunc: func
3625deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
363e69f6d04SBram Moolenaar
364e69f6d04SBram Moolenaar  let thelist: list<any>
365e69f6d04SBram Moolenaar  assert_equal([], thelist)
366e69f6d04SBram Moolenaar
367e69f6d04SBram Moolenaar  let thedict: dict<any>
368e69f6d04SBram Moolenaar  assert_equal({}, thedict)
369e69f6d04SBram Moolenaar
3702c869deeSBram Moolenaar  if has('channel')
371e69f6d04SBram Moolenaar    let thejob: job
372e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
373e69f6d04SBram Moolenaar
374e69f6d04SBram Moolenaar    let thechannel: channel
375e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
376c785b9a7SBram Moolenaar
377c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
378f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
379c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
380c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
381c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
382c785b9a7SBram Moolenaar    endif
3832c869deeSBram Moolenaar  endif
384585fea7bSBram Moolenaar
385585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
386585fea7bSBram Moolenaar  assert_equal(5678, nr)
3878a7d6542SBram Moolenaarenddef
3888a7d6542SBram Moolenaar
38947a519a9SBram Moolenaardef Test_assignment_var_list()
39047a519a9SBram Moolenaar  let v1: string
39147a519a9SBram Moolenaar  let v2: string
3929af78769SBram Moolenaar  let vrem: list<string>
3939af78769SBram Moolenaar  [v1] = ['aaa']
3949af78769SBram Moolenaar  assert_equal('aaa', v1)
3959af78769SBram Moolenaar
39647a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
39747a519a9SBram Moolenaar  assert_equal('one', v1)
39847a519a9SBram Moolenaar  assert_equal('two', v2)
3999af78769SBram Moolenaar
4009af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4019af78769SBram Moolenaar  assert_equal('one', v1)
4029af78769SBram Moolenaar  assert_equal('two', v2)
4039af78769SBram Moolenaar  assert_equal([], vrem)
4049af78769SBram Moolenaar
4059af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4069af78769SBram Moolenaar  assert_equal('one', v1)
4079af78769SBram Moolenaar  assert_equal('two', v2)
4089af78769SBram Moolenaar  assert_equal(['three'], vrem)
40947a519a9SBram Moolenaarenddef
41047a519a9SBram Moolenaar
411c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
412c7e44a7eSBram Moolenaar  let lines =<< trim END
413c7e44a7eSBram Moolenaar    vim9script
414c7e44a7eSBram Moolenaar    def Func(): list<number>
415c7e44a7eSBram Moolenaar      return [1, 2]
416c7e44a7eSBram Moolenaar    enddef
417c7e44a7eSBram Moolenaar    let var1: number
418c7e44a7eSBram Moolenaar    let var2: number
419c7e44a7eSBram Moolenaar    [var1, var2] =
420c7e44a7eSBram Moolenaar          Func()
421c7e44a7eSBram Moolenaar    assert_equal(1, var1)
422c7e44a7eSBram Moolenaar    assert_equal(2, var2)
423c7e44a7eSBram Moolenaar    let ll =
424c7e44a7eSBram Moolenaar          Func()
425c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
426c7e44a7eSBram Moolenaar  END
427c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
428c7e44a7eSBram Moolenaarenddef
429c7e44a7eSBram Moolenaar
430cab27678SBram Moolenaardef Mess(): string
431cab27678SBram Moolenaar  v:foldstart = 123
432cab27678SBram Moolenaar  return 'xxx'
433cab27678SBram Moolenaarenddef
434cab27678SBram Moolenaar
435d72c1bf0SBram Moolenaardef Test_assignment_failure()
4368a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
4378a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
4388a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
4398a7d6542SBram Moolenaar
44063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
44163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
44263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
44363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
44463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
44563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
44663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
44763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
44863be3d4bSBram Moolenaar
4498a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
4508a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
4518a7d6542SBram Moolenaar
4529b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
4539af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4549af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
4559af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4569af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
4579af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4589af78769SBram Moolenaar                            'let y: number',
4599af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
4609af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4619af78769SBram Moolenaar                            'let y: number',
4629af78769SBram Moolenaar                            'let z: list<number>',
4639af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
4649be61bbbSBram Moolenaar
465e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
466c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
4679be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
468c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
4699be61bbbSBram Moolenaar
470e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
471c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
4729be61bbbSBram Moolenaar
473*434d72cbSBram Moolenaar  if has('dnd')
47465821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
475*434d72cbSBram Moolenaar  else
476*434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
477*434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
478*434d72cbSBram Moolenaar  endif
4799be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
48065821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
481c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
4829be61bbbSBram Moolenaar
483e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
484e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
485e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
486e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
4879be61bbbSBram Moolenaar
4889be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
4899be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
4909be61bbbSBram Moolenaar
491822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
49233fa29cfSBram Moolenaar
4938a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
4948a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
4958a7d6542SBram Moolenaar
4968a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
4978a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
4988a7d6542SBram Moolenaar
4998a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
5008a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
50142a480bfSBram Moolenaar
502d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
50342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
504cab27678SBram Moolenaar
505cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
506cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
50743e969d3SBram Moolenaar
50843e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
50943e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
51043e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
51143e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
51243e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
51343e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
51443e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
51543e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
516d72c1bf0SBram Moolenaarenddef
517d72c1bf0SBram Moolenaar
518d72c1bf0SBram Moolenaardef Test_unlet()
519d72c1bf0SBram Moolenaar  g:somevar = 'yes'
520d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
521d72c1bf0SBram Moolenaar  unlet g:somevar
522d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
523d72c1bf0SBram Moolenaar  unlet! g:somevar
524d72c1bf0SBram Moolenaar
525d72c1bf0SBram Moolenaar  call CheckScriptFailure([
526d72c1bf0SBram Moolenaar        'vim9script',
527d72c1bf0SBram Moolenaar        'let svar = 123',
528d72c1bf0SBram Moolenaar        'unlet svar',
529d72c1bf0SBram Moolenaar        ], 'E1081:')
530d72c1bf0SBram Moolenaar  call CheckScriptFailure([
531d72c1bf0SBram Moolenaar        'vim9script',
532d72c1bf0SBram Moolenaar        'let svar = 123',
533d72c1bf0SBram Moolenaar        'unlet s:svar',
534d72c1bf0SBram Moolenaar        ], 'E1081:')
535d72c1bf0SBram Moolenaar  call CheckScriptFailure([
536d72c1bf0SBram Moolenaar        'vim9script',
537d72c1bf0SBram Moolenaar        'let svar = 123',
538d72c1bf0SBram Moolenaar        'def Func()',
539d72c1bf0SBram Moolenaar        '  unlet svar',
540d72c1bf0SBram Moolenaar        'enddef',
541822ba247SBram Moolenaar        'defcompile',
542d72c1bf0SBram Moolenaar        ], 'E1081:')
543d72c1bf0SBram Moolenaar  call CheckScriptFailure([
544d72c1bf0SBram Moolenaar        'vim9script',
545d72c1bf0SBram Moolenaar        'let svar = 123',
546d72c1bf0SBram Moolenaar        'def Func()',
547d72c1bf0SBram Moolenaar        '  unlet s:svar',
548d72c1bf0SBram Moolenaar        'enddef',
549822ba247SBram Moolenaar        'defcompile',
550d72c1bf0SBram Moolenaar        ], 'E1081:')
5517bdaea6eSBram Moolenaar
5527bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
5537bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
5547bdaea6eSBram Moolenaar  unlet $ENVVAR
5557bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
556d72c1bf0SBram Moolenaarenddef
557599c89c8SBram Moolenaar
5584c17ad94SBram Moolenaardef Test_delfunction()
559f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
5604c17ad94SBram Moolenaar  CheckScriptSuccess([
5614c17ad94SBram Moolenaar      'vim9script',
5624c17ad94SBram Moolenaar      'func CheckMe()',
5634c17ad94SBram Moolenaar      '  return 123',
5644c17ad94SBram Moolenaar      'endfunc',
5654c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
5664c17ad94SBram Moolenaar      ])
5674c17ad94SBram Moolenaar
568f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
5694c17ad94SBram Moolenaar  CheckScriptFailure([
5704c17ad94SBram Moolenaar      'vim9script',
5714c17ad94SBram Moolenaar      'func DeleteMe1()',
5724c17ad94SBram Moolenaar      'endfunc',
5734c17ad94SBram Moolenaar      'delfunction DeleteMe1',
5744c17ad94SBram Moolenaar      ], 'E1084:')
5754c17ad94SBram Moolenaar  CheckScriptFailure([
5764c17ad94SBram Moolenaar      'vim9script',
5774c17ad94SBram Moolenaar      'func DeleteMe2()',
5784c17ad94SBram Moolenaar      'endfunc',
5794c17ad94SBram Moolenaar      'def DoThat()',
5804c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
5814c17ad94SBram Moolenaar      'enddef',
5824c17ad94SBram Moolenaar      'DoThat()',
5834c17ad94SBram Moolenaar      ], 'E1084:')
5844c17ad94SBram Moolenaar  CheckScriptFailure([
5854c17ad94SBram Moolenaar      'vim9script',
5864c17ad94SBram Moolenaar      'def DeleteMe3()',
5874c17ad94SBram Moolenaar      'enddef',
5884c17ad94SBram Moolenaar      'delfunction DeleteMe3',
5894c17ad94SBram Moolenaar      ], 'E1084:')
5904c17ad94SBram Moolenaar  CheckScriptFailure([
5914c17ad94SBram Moolenaar      'vim9script',
5924c17ad94SBram Moolenaar      'def DeleteMe4()',
5934c17ad94SBram Moolenaar      'enddef',
5944c17ad94SBram Moolenaar      'def DoThat()',
5954c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
5964c17ad94SBram Moolenaar      'enddef',
5974c17ad94SBram Moolenaar      'DoThat()',
5984c17ad94SBram Moolenaar      ], 'E1084:')
599925e9fd6SBram Moolenaar
600925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
601925e9fd6SBram Moolenaar  let lines =<< trim END
602925e9fd6SBram Moolenaar      vim9script
603925e9fd6SBram Moolenaar      def g:Global(): string
604925e9fd6SBram Moolenaar        return "yes"
605925e9fd6SBram Moolenaar      enddef
606925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
607925e9fd6SBram Moolenaar      def! g:Global(): string
608925e9fd6SBram Moolenaar        return "no"
609925e9fd6SBram Moolenaar      enddef
610925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
611925e9fd6SBram Moolenaar      delfunc g:Global
612925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
613925e9fd6SBram Moolenaar  END
614925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
615925e9fd6SBram Moolenaar
616925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
617925e9fd6SBram Moolenaar  lines =<< trim END
618925e9fd6SBram Moolenaar      vim9script
619925e9fd6SBram Moolenaar      func g:Global()
620925e9fd6SBram Moolenaar        return "yes"
621925e9fd6SBram Moolenaar      endfunc
622925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
623925e9fd6SBram Moolenaar      def! g:Global(): string
624925e9fd6SBram Moolenaar        return "no"
625925e9fd6SBram Moolenaar      enddef
626925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
627925e9fd6SBram Moolenaar      delfunc g:Global
628925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
629925e9fd6SBram Moolenaar  END
630925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
631925e9fd6SBram Moolenaar
632925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
633925e9fd6SBram Moolenaar  lines =<< trim END
634925e9fd6SBram Moolenaar      vim9script
635925e9fd6SBram Moolenaar      def g:Global(): string
636925e9fd6SBram Moolenaar        return "yes"
637925e9fd6SBram Moolenaar      enddef
638925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
639925e9fd6SBram Moolenaar      func! g:Global()
640925e9fd6SBram Moolenaar        return "no"
641925e9fd6SBram Moolenaar      endfunc
642925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
643925e9fd6SBram Moolenaar      delfunc g:Global
644925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
645925e9fd6SBram Moolenaar  END
646925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6474c17ad94SBram Moolenaarenddef
6484c17ad94SBram Moolenaar
649599c89c8SBram Moolenaarfunc Test_wrong_type()
650599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
651599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
652599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
653599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
654599c89c8SBram Moolenaar
655599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
656599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
65742a480bfSBram Moolenaar
65842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
65942a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
66042a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
66142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
66242a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
66342a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
66442a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
66542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
66642a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
66742a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
66842a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
669a0a9f43aSBram Moolenaar
670a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
671a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
6728a7d6542SBram Moolenaarendfunc
6738a7d6542SBram Moolenaar
6748a7d6542SBram Moolenaarfunc Test_const()
6758a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
6768a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
6778a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
6789be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
6798a7d6542SBram Moolenaarendfunc
6808a7d6542SBram Moolenaar
681df069eecSBram Moolenaardef Test_range_no_colon()
682df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
683df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
684df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
685df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
686df069eecSBram Moolenaarenddef
687df069eecSBram Moolenaar
688df069eecSBram Moolenaar
6898a7d6542SBram Moolenaardef Test_block()
6908a7d6542SBram Moolenaar  let outer = 1
6918a7d6542SBram Moolenaar  {
6928a7d6542SBram Moolenaar    let inner = 2
6938a7d6542SBram Moolenaar    assert_equal(1, outer)
6948a7d6542SBram Moolenaar    assert_equal(2, inner)
6958a7d6542SBram Moolenaar  }
6968a7d6542SBram Moolenaar  assert_equal(1, outer)
6978a7d6542SBram Moolenaarenddef
6988a7d6542SBram Moolenaar
6998a7d6542SBram Moolenaarfunc Test_block_failure()
7008a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
701585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
702585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
7038a7d6542SBram Moolenaarendfunc
7048a7d6542SBram Moolenaar
705585fea7bSBram Moolenaardef Test_cmd_modifier()
706585fea7bSBram Moolenaar  tab echo '0'
707585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
708585fea7bSBram Moolenaarenddef
709585fea7bSBram Moolenaar
710d032f34aSBram Moolenaarfunc g:NoSuchFunc()
711d032f34aSBram Moolenaar  echo 'none'
712d032f34aSBram Moolenaarendfunc
713d032f34aSBram Moolenaar
7148a7d6542SBram Moolenaardef Test_try_catch()
7158a7d6542SBram Moolenaar  let l = []
7167a092245SBram Moolenaar  try # comment
7178a7d6542SBram Moolenaar    add(l, '1')
7188a7d6542SBram Moolenaar    throw 'wrong'
7198a7d6542SBram Moolenaar    add(l, '2')
7207a092245SBram Moolenaar  catch # comment
7218a7d6542SBram Moolenaar    add(l, v:exception)
7227a092245SBram Moolenaar  finally # comment
7238a7d6542SBram Moolenaar    add(l, '3')
7247a092245SBram Moolenaar  endtry # comment
7258a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
72668d130c6SBram Moolenaar
727e859312eSBram Moolenaar  l = []
728e859312eSBram Moolenaar  try
729e859312eSBram Moolenaar    try
730e859312eSBram Moolenaar      add(l, '1')
731e859312eSBram Moolenaar      throw 'wrong'
732e859312eSBram Moolenaar      add(l, '2')
733e859312eSBram Moolenaar    catch /right/
734e859312eSBram Moolenaar      add(l, v:exception)
735e859312eSBram Moolenaar    endtry
736e859312eSBram Moolenaar  catch /wrong/
737e859312eSBram Moolenaar    add(l, 'caught')
738e859312eSBram Moolenaar  finally
739e859312eSBram Moolenaar    add(l, 'finally')
740e859312eSBram Moolenaar  endtry
741e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
742e859312eSBram Moolenaar
74368d130c6SBram Moolenaar  let n: number
74468d130c6SBram Moolenaar  try
74568d130c6SBram Moolenaar    n = l[3]
74668d130c6SBram Moolenaar  catch /E684:/
74768d130c6SBram Moolenaar    n = 99
74868d130c6SBram Moolenaar  endtry
74968d130c6SBram Moolenaar  assert_equal(99, n)
75068d130c6SBram Moolenaar
75168d130c6SBram Moolenaar  try
75268d130c6SBram Moolenaar    n = g:astring[3]
75368d130c6SBram Moolenaar  catch /E714:/
75468d130c6SBram Moolenaar    n = 77
75568d130c6SBram Moolenaar  endtry
75668d130c6SBram Moolenaar  assert_equal(77, n)
75768d130c6SBram Moolenaar
75868d130c6SBram Moolenaar  try
75968d130c6SBram Moolenaar    n = l[g:astring]
76068d130c6SBram Moolenaar  catch /E39:/
76168d130c6SBram Moolenaar    n = 77
76268d130c6SBram Moolenaar  endtry
76368d130c6SBram Moolenaar  assert_equal(77, n)
76468d130c6SBram Moolenaar
76568d130c6SBram Moolenaar  try
76668d130c6SBram Moolenaar    n = s:does_not_exist
76768d130c6SBram Moolenaar  catch /E121:/
768f0b9f43cSBram Moolenaar    n = 111
769f0b9f43cSBram Moolenaar  endtry
770f0b9f43cSBram Moolenaar  assert_equal(111, n)
771f0b9f43cSBram Moolenaar
772f0b9f43cSBram Moolenaar  try
773f0b9f43cSBram Moolenaar    n = g:does_not_exist
774f0b9f43cSBram Moolenaar  catch /E121:/
77568d130c6SBram Moolenaar    n = 121
77668d130c6SBram Moolenaar  endtry
77768d130c6SBram Moolenaar  assert_equal(121, n)
77868d130c6SBram Moolenaar
77968d130c6SBram Moolenaar  let d = #{one: 1}
78068d130c6SBram Moolenaar  try
78168d130c6SBram Moolenaar    n = d[g:astring]
78268d130c6SBram Moolenaar  catch /E716:/
78368d130c6SBram Moolenaar    n = 222
78468d130c6SBram Moolenaar  endtry
78568d130c6SBram Moolenaar  assert_equal(222, n)
786f0b9f43cSBram Moolenaar
787f0b9f43cSBram Moolenaar  try
788f0b9f43cSBram Moolenaar    n = -g:astring
789f0b9f43cSBram Moolenaar  catch /E39:/
790f0b9f43cSBram Moolenaar    n = 233
791f0b9f43cSBram Moolenaar  endtry
792f0b9f43cSBram Moolenaar  assert_equal(233, n)
793f0b9f43cSBram Moolenaar
794f0b9f43cSBram Moolenaar  try
795f0b9f43cSBram Moolenaar    n = +g:astring
796f0b9f43cSBram Moolenaar  catch /E1030:/
797f0b9f43cSBram Moolenaar    n = 244
798f0b9f43cSBram Moolenaar  endtry
799f0b9f43cSBram Moolenaar  assert_equal(244, n)
800f0b9f43cSBram Moolenaar
801f0b9f43cSBram Moolenaar  try
802f0b9f43cSBram Moolenaar    n = +g:alist
803f0b9f43cSBram Moolenaar  catch /E745:/
804f0b9f43cSBram Moolenaar    n = 255
805f0b9f43cSBram Moolenaar  endtry
806f0b9f43cSBram Moolenaar  assert_equal(255, n)
807f0b9f43cSBram Moolenaar
808f0b9f43cSBram Moolenaar  let nd: dict<any>
809f0b9f43cSBram Moolenaar  try
810f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
811f0b9f43cSBram Moolenaar  catch /E1029:/
812f0b9f43cSBram Moolenaar    n = 266
813f0b9f43cSBram Moolenaar  endtry
814f0b9f43cSBram Moolenaar  assert_equal(266, n)
815f0b9f43cSBram Moolenaar
816f0b9f43cSBram Moolenaar  try
817f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
818f0b9f43cSBram Moolenaar  catch /E1093:/
819f0b9f43cSBram Moolenaar    n = 277
820f0b9f43cSBram Moolenaar  endtry
821f0b9f43cSBram Moolenaar  assert_equal(277, n)
822f0b9f43cSBram Moolenaar
823e859312eSBram Moolenaar  try
824e859312eSBram Moolenaar    &ts = g:astring
825e859312eSBram Moolenaar  catch /E1029:/
826e859312eSBram Moolenaar    n = 288
827e859312eSBram Moolenaar  endtry
828e859312eSBram Moolenaar  assert_equal(288, n)
829e859312eSBram Moolenaar
830e859312eSBram Moolenaar  try
831e859312eSBram Moolenaar    &backspace = 'asdf'
832e859312eSBram Moolenaar  catch /E474:/
833e859312eSBram Moolenaar    n = 299
834e859312eSBram Moolenaar  endtry
835e859312eSBram Moolenaar  assert_equal(299, n)
836e859312eSBram Moolenaar
837e859312eSBram Moolenaar  l = [1]
838e859312eSBram Moolenaar  try
839e859312eSBram Moolenaar    l[3] = 3
840e859312eSBram Moolenaar  catch /E684:/
841e859312eSBram Moolenaar    n = 300
842e859312eSBram Moolenaar  endtry
843e859312eSBram Moolenaar  assert_equal(300, n)
844e859312eSBram Moolenaar
845e859312eSBram Moolenaar  try
846e859312eSBram Moolenaar    unlet g:does_not_exist
847e859312eSBram Moolenaar  catch /E108:/
848e859312eSBram Moolenaar    n = 322
849e859312eSBram Moolenaar  endtry
850e859312eSBram Moolenaar  assert_equal(322, n)
851e859312eSBram Moolenaar
852e859312eSBram Moolenaar  try
853e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
854e859312eSBram Moolenaar  catch /E721:/
855e859312eSBram Moolenaar    n = 333
856e859312eSBram Moolenaar  endtry
857e859312eSBram Moolenaar  assert_equal(333, n)
858e859312eSBram Moolenaar
859e859312eSBram Moolenaar  try
860e859312eSBram Moolenaar    l = DeletedFunc()
861e859312eSBram Moolenaar  catch /E933:/
862e859312eSBram Moolenaar    n = 344
863e859312eSBram Moolenaar  endtry
864e859312eSBram Moolenaar  assert_equal(344, n)
865d032f34aSBram Moolenaar
866d032f34aSBram Moolenaar  try
867d032f34aSBram Moolenaar    echo len(v:true)
868d032f34aSBram Moolenaar  catch /E701:/
869d032f34aSBram Moolenaar    n = 355
870d032f34aSBram Moolenaar  endtry
871d032f34aSBram Moolenaar  assert_equal(355, n)
872d032f34aSBram Moolenaar
873d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
874d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
875d032f34aSBram Moolenaar  try
876d032f34aSBram Moolenaar    echo P()
877d032f34aSBram Moolenaar  catch /E117:/
878d032f34aSBram Moolenaar    n = 366
879d032f34aSBram Moolenaar  endtry
880d032f34aSBram Moolenaar  assert_equal(366, n)
881d032f34aSBram Moolenaar
882d032f34aSBram Moolenaar  try
883d032f34aSBram Moolenaar    echo g:NoSuchFunc()
884d032f34aSBram Moolenaar  catch /E117:/
885d032f34aSBram Moolenaar    n = 377
886d032f34aSBram Moolenaar  endtry
887d032f34aSBram Moolenaar  assert_equal(377, n)
888d032f34aSBram Moolenaar
889d032f34aSBram Moolenaar  try
890d032f34aSBram Moolenaar    echo g:alist + 4
891d032f34aSBram Moolenaar  catch /E745:/
892d032f34aSBram Moolenaar    n = 388
893d032f34aSBram Moolenaar  endtry
894d032f34aSBram Moolenaar  assert_equal(388, n)
895d032f34aSBram Moolenaar
896d032f34aSBram Moolenaar  try
897d032f34aSBram Moolenaar    echo 4 + g:alist
898d032f34aSBram Moolenaar  catch /E745:/
899d032f34aSBram Moolenaar    n = 399
900d032f34aSBram Moolenaar  endtry
901d032f34aSBram Moolenaar  assert_equal(399, n)
902d032f34aSBram Moolenaar
903d032f34aSBram Moolenaar  try
904d032f34aSBram Moolenaar    echo g:alist.member
905d032f34aSBram Moolenaar  catch /E715:/
906d032f34aSBram Moolenaar    n = 400
907d032f34aSBram Moolenaar  endtry
908d032f34aSBram Moolenaar  assert_equal(400, n)
909d032f34aSBram Moolenaar
910d032f34aSBram Moolenaar  try
911d032f34aSBram Moolenaar    echo d.member
912d032f34aSBram Moolenaar  catch /E716:/
913d032f34aSBram Moolenaar    n = 411
914d032f34aSBram Moolenaar  endtry
915d032f34aSBram Moolenaar  assert_equal(411, n)
9168a7d6542SBram Moolenaarenddef
9178a7d6542SBram Moolenaar
918e859312eSBram Moolenaardef DeletedFunc(): list<any>
919e859312eSBram Moolenaar  return ['delete me']
920e859312eSBram Moolenaarenddef
921e859312eSBram Moolenaardefcompile
922e859312eSBram Moolenaardelfunc DeletedFunc
923e859312eSBram Moolenaar
924257cc5eeSBram Moolenaardef ThrowFromDef()
925a72cfb80SBram Moolenaar  throw "getout" # comment
926257cc5eeSBram Moolenaarenddef
927257cc5eeSBram Moolenaar
928257cc5eeSBram Moolenaarfunc CatchInFunc()
929257cc5eeSBram Moolenaar  try
930257cc5eeSBram Moolenaar    call ThrowFromDef()
931257cc5eeSBram Moolenaar  catch
932257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
933257cc5eeSBram Moolenaar  endtry
934257cc5eeSBram Moolenaarendfunc
935257cc5eeSBram Moolenaar
936257cc5eeSBram Moolenaardef CatchInDef()
937257cc5eeSBram Moolenaar  try
938257cc5eeSBram Moolenaar    ThrowFromDef()
939257cc5eeSBram Moolenaar  catch
940257cc5eeSBram Moolenaar    g:thrown_def = v:exception
941257cc5eeSBram Moolenaar  endtry
942257cc5eeSBram Moolenaarenddef
943257cc5eeSBram Moolenaar
944f575adffSBram Moolenaardef ReturnFinally(): string
945f575adffSBram Moolenaar  try
946f575adffSBram Moolenaar    return 'intry'
947f575adffSBram Moolenaar  finally
948f575adffSBram Moolenaar    g:in_finally = 'finally'
949f575adffSBram Moolenaar  endtry
950f575adffSBram Moolenaar  return 'end'
951f575adffSBram Moolenaarenddef
952f575adffSBram Moolenaar
953257cc5eeSBram Moolenaardef Test_try_catch_nested()
954257cc5eeSBram Moolenaar  CatchInFunc()
955257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
956257cc5eeSBram Moolenaar
957257cc5eeSBram Moolenaar  CatchInDef()
958257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
959f575adffSBram Moolenaar
960f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
961f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
962f575adffSBram Moolenaarenddef
963f575adffSBram Moolenaar
964f575adffSBram Moolenaardef Test_try_catch_match()
965f575adffSBram Moolenaar  let seq = 'a'
966f575adffSBram Moolenaar  try
967f575adffSBram Moolenaar    throw 'something'
968f575adffSBram Moolenaar  catch /nothing/
969f575adffSBram Moolenaar    seq ..= 'x'
970f575adffSBram Moolenaar  catch /some/
971f575adffSBram Moolenaar    seq ..= 'b'
972f575adffSBram Moolenaar  catch /asdf/
973f575adffSBram Moolenaar    seq ..= 'x'
974e8c4abbbSBram Moolenaar  catch ?a\?sdf?
975e8c4abbbSBram Moolenaar    seq ..= 'y'
976f575adffSBram Moolenaar  finally
977f575adffSBram Moolenaar    seq ..= 'c'
978f575adffSBram Moolenaar  endtry
979f575adffSBram Moolenaar  assert_equal('abc', seq)
980257cc5eeSBram Moolenaarenddef
981257cc5eeSBram Moolenaar
982e8c4abbbSBram Moolenaardef Test_try_catch_fails()
983e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
984e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
985e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
986585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
987585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
988585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
989585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
990585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
991585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
992585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
993585fea7bSBram Moolenaar
994a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
995585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
996e8c4abbbSBram Moolenaarenddef
997e8c4abbbSBram Moolenaar
998006ad48bSBram Moolenaardef Test_throw_vimscript()
999f5be8cdbSBram Moolenaar  # only checks line continuation
1000006ad48bSBram Moolenaar  let lines =<< trim END
1001006ad48bSBram Moolenaar      vim9script
1002006ad48bSBram Moolenaar      try
1003006ad48bSBram Moolenaar        throw 'one'
1004006ad48bSBram Moolenaar              .. 'two'
1005006ad48bSBram Moolenaar      catch
1006006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1007006ad48bSBram Moolenaar      endtry
1008006ad48bSBram Moolenaar  END
1009006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1010006ad48bSBram Moolenaarenddef
1011006ad48bSBram Moolenaar
101237c83711SBram Moolenaardef Test_cexpr_vimscript()
1013f5be8cdbSBram Moolenaar  # only checks line continuation
101437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
101537c83711SBram Moolenaar  let lines =<< trim END
101637c83711SBram Moolenaar      vim9script
101737c83711SBram Moolenaar      cexpr 'File'
101837c83711SBram Moolenaar                .. ' someFile' ..
101937c83711SBram Moolenaar                   ' line 19'
102037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
102137c83711SBram Moolenaar  END
102237c83711SBram Moolenaar  CheckScriptSuccess(lines)
102337c83711SBram Moolenaar  set errorformat&
102437c83711SBram Moolenaarenddef
102537c83711SBram Moolenaar
1026b209750bSBram Moolenaardef Test_list_vimscript()
1027b209750bSBram Moolenaar  # checks line continuation and comments
1028b209750bSBram Moolenaar  let lines =<< trim END
1029b209750bSBram Moolenaar      vim9script
1030b209750bSBram Moolenaar      let mylist = [
1031b209750bSBram Moolenaar            'one',
1032b209750bSBram Moolenaar            # comment
1033b209750bSBram Moolenaar            'two', # empty line follows
1034b209750bSBram Moolenaar
1035b209750bSBram Moolenaar            'three',
1036b209750bSBram Moolenaar            ]
1037b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1038b209750bSBram Moolenaar  END
1039b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1040b209750bSBram Moolenaarenddef
1041b209750bSBram Moolenaar
10422a1381c3SBram Moolenaarif has('channel')
104340ee466cSBram Moolenaar  let someJob = test_null_job()
104440ee466cSBram Moolenaar
104540ee466cSBram Moolenaar  def FuncWithError()
104640ee466cSBram Moolenaar    echomsg g:someJob
104740ee466cSBram Moolenaar  enddef
104840ee466cSBram Moolenaar
104940ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
105040ee466cSBram Moolenaar    try
105140ee466cSBram Moolenaar      call FuncWithError()
105240ee466cSBram Moolenaar    catch
105340ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
105440ee466cSBram Moolenaar    endtry
105540ee466cSBram Moolenaar  endfunc
10562a1381c3SBram Moolenaarendif
105740ee466cSBram Moolenaar
10588a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10598a7d6542SBram Moolenaar  vim9script
10608a7d6542SBram Moolenaar  let name: string = 'bob'
10618a7d6542SBram Moolenaar  def Concat(arg: string): string
10628a7d6542SBram Moolenaar    return name .. arg
10638a7d6542SBram Moolenaar  enddef
1064227a69deSBram Moolenaar  g:result = Concat('bie')
1065227a69deSBram Moolenaar  g:localname = name
10668a7d6542SBram Moolenaar
10678a7d6542SBram Moolenaar  export const CONST = 1234
10688a7d6542SBram Moolenaar  export let exported = 9876
10696e587dcbSBram Moolenaar  export let exp_name = 'John'
10708a7d6542SBram Moolenaar  export def Exported(): string
10718a7d6542SBram Moolenaar    return 'Exported'
10728a7d6542SBram Moolenaar  enddef
10738a7d6542SBram MoolenaarEND
10748a7d6542SBram Moolenaar
10755269bd2aSBram Moolenaardef Test_vim9_import_export()
10768a7d6542SBram Moolenaar  let import_script_lines =<< trim END
10778a7d6542SBram Moolenaar    vim9script
10788a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10798a7d6542SBram Moolenaar    g:imported = exported
10806e587dcbSBram Moolenaar    exported += 3
10816e587dcbSBram Moolenaar    g:imported_added = exported
10828a7d6542SBram Moolenaar    g:imported_func = Exported()
10836e587dcbSBram Moolenaar
108440f4f7a4SBram Moolenaar    def GetExported(): string
108540f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
108640f4f7a4SBram Moolenaar      return local_dict.ref()
108740f4f7a4SBram Moolenaar    enddef
108840f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
108940f4f7a4SBram Moolenaar
10906e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10916e587dcbSBram Moolenaar    g:imported_name = exp_name
10926e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10936e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10945381c7a1SBram Moolenaar    g:imported_later = exported
10958a7d6542SBram Moolenaar  END
10968a7d6542SBram Moolenaar
10978a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
10988a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
10998a7d6542SBram Moolenaar
11008a7d6542SBram Moolenaar  source Ximport.vim
11018a7d6542SBram Moolenaar
11028a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11038a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11048a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11056e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11065381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11078a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
110840f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11096e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11106e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11118a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11128a7d6542SBram Moolenaar
11138a7d6542SBram Moolenaar  unlet g:result
11148a7d6542SBram Moolenaar  unlet g:localname
11158a7d6542SBram Moolenaar  unlet g:imported
11166e587dcbSBram Moolenaar  unlet g:imported_added
11175381c7a1SBram Moolenaar  unlet g:imported_later
11188a7d6542SBram Moolenaar  unlet g:imported_func
11196e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11208a7d6542SBram Moolenaar  delete('Ximport.vim')
1121f2d5c240SBram Moolenaar
11221c991144SBram Moolenaar  # similar, with line breaks
11231c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11241c991144SBram Moolenaar    vim9script
11251c991144SBram Moolenaar    import {
11261c991144SBram Moolenaar        exported,
11271c991144SBram Moolenaar        Exported,
11281c991144SBram Moolenaar        }
11291c991144SBram Moolenaar        from
11301c991144SBram Moolenaar        './Xexport.vim'
11311c991144SBram Moolenaar    g:imported = exported
11321c991144SBram Moolenaar    exported += 5
11331c991144SBram Moolenaar    g:imported_added = exported
11341c991144SBram Moolenaar    g:imported_func = Exported()
11351c991144SBram Moolenaar  END
11361c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11371c991144SBram Moolenaar  source Ximport_lbr.vim
11381c991144SBram Moolenaar
11391c991144SBram Moolenaar  assert_equal(9876, g:imported)
11401c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11411c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11421c991144SBram Moolenaar
11431c991144SBram Moolenaar  # exported script not sourced again
11441c991144SBram Moolenaar  assert_false(exists('g:result'))
11451c991144SBram Moolenaar  unlet g:imported
11461c991144SBram Moolenaar  unlet g:imported_added
11471c991144SBram Moolenaar  unlet g:imported_func
11481c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11491c991144SBram Moolenaar
11501c991144SBram Moolenaar  # import inside :def function
11515381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
11525381c7a1SBram Moolenaar    vim9script
11535381c7a1SBram Moolenaar    def ImportInDef()
11545381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11555381c7a1SBram Moolenaar      g:imported = exported
11565381c7a1SBram Moolenaar      exported += 7
11575381c7a1SBram Moolenaar      g:imported_added = exported
11585381c7a1SBram Moolenaar    enddef
11595381c7a1SBram Moolenaar    ImportInDef()
11605381c7a1SBram Moolenaar  END
11615381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11625381c7a1SBram Moolenaar  source Ximport2.vim
1163f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11645381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11655381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11665381c7a1SBram Moolenaar  unlet g:imported
11675381c7a1SBram Moolenaar  unlet g:imported_added
11685381c7a1SBram Moolenaar  delete('Ximport2.vim')
11695381c7a1SBram Moolenaar
1170f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1171f2d5c240SBram Moolenaar    vim9script
1172f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1173f2d5c240SBram Moolenaar    def UseExport()
1174f2d5c240SBram Moolenaar      g:imported = Export.exported
1175f2d5c240SBram Moolenaar    enddef
1176f2d5c240SBram Moolenaar    UseExport()
1177f2d5c240SBram Moolenaar  END
1178f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1179f2d5c240SBram Moolenaar  source Ximport.vim
11805381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1181f2d5c240SBram Moolenaar
1182599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1183599c89c8SBram Moolenaar    vim9script
1184599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1185599c89c8SBram Moolenaar    def Func()
1186599c89c8SBram Moolenaar      let dummy = 1
1187599c89c8SBram Moolenaar      let imported = Export + dummy
1188599c89c8SBram Moolenaar    enddef
1189822ba247SBram Moolenaar    defcompile
1190599c89c8SBram Moolenaar  END
1191599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1192599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1193599c89c8SBram Moolenaar
1194599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1195599c89c8SBram Moolenaar    vim9script
1196599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1197599c89c8SBram Moolenaar    def Func()
1198599c89c8SBram Moolenaar      let imported = Export . exported
1199599c89c8SBram Moolenaar    enddef
1200822ba247SBram Moolenaar    defcompile
1201599c89c8SBram Moolenaar  END
1202599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1203599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1204599c89c8SBram Moolenaar
1205599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1206599c89c8SBram Moolenaar    vim9script
1207599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1208599c89c8SBram Moolenaar    def Func()
1209599c89c8SBram Moolenaar      let imported = Export.
1210599c89c8SBram Moolenaar    enddef
1211822ba247SBram Moolenaar    defcompile
1212599c89c8SBram Moolenaar  END
1213599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1214599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1215599c89c8SBram Moolenaar
12161c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12171c991144SBram Moolenaar    vim9script
12181c991144SBram Moolenaar    import *
12191c991144SBram Moolenaar        as Export
12201c991144SBram Moolenaar        from
12211c991144SBram Moolenaar        './Xexport.vim'
12221c991144SBram Moolenaar    def UseExport()
12231c991144SBram Moolenaar      g:imported = Export.exported
12241c991144SBram Moolenaar    enddef
12251c991144SBram Moolenaar    UseExport()
12261c991144SBram Moolenaar  END
12271c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12281c991144SBram Moolenaar  source Ximport.vim
12291c991144SBram Moolenaar  assert_equal(9883, g:imported)
12301c991144SBram Moolenaar
1231f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1232f2d5c240SBram Moolenaar    vim9script
1233f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1234f2d5c240SBram Moolenaar  END
1235f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1236f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1237f2d5c240SBram Moolenaar
1238f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1239fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1240fa29c8abSBram Moolenaar    vim9script
1241fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1242fa29c8abSBram Moolenaar  END
1243fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1244fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1245fa29c8abSBram Moolenaar
1246f5be8cdbSBram Moolenaar  # try to import something that is already defined
12475269bd2aSBram Moolenaar  let import_already_defined =<< trim END
12485269bd2aSBram Moolenaar    vim9script
12495269bd2aSBram Moolenaar    let exported = 'something'
12505269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12515269bd2aSBram Moolenaar  END
12525269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12535269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12545269bd2aSBram Moolenaar
1255f5be8cdbSBram Moolenaar  # try to import something that is already defined
12565269bd2aSBram Moolenaar  import_already_defined =<< trim END
12575269bd2aSBram Moolenaar    vim9script
12585269bd2aSBram Moolenaar    let exported = 'something'
12595269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12605269bd2aSBram Moolenaar  END
12615269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12625269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12635269bd2aSBram Moolenaar
1264f5be8cdbSBram Moolenaar  # try to import something that is already defined
12655269bd2aSBram Moolenaar  import_already_defined =<< trim END
12665269bd2aSBram Moolenaar    vim9script
12675269bd2aSBram Moolenaar    let exported = 'something'
12685269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12695269bd2aSBram Moolenaar  END
12705269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12715269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12725269bd2aSBram Moolenaar
1273f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1274fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1275fa29c8abSBram Moolenaar    vim9script
1276fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1277fa29c8abSBram Moolenaar  END
1278fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1279fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1280fa29c8abSBram Moolenaar
1281fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1282fa29c8abSBram Moolenaar    vim9script
1283fa29c8abSBram Moolenaar    import name './Xexport.vim'
1284fa29c8abSBram Moolenaar  END
1285fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1286fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1287fa29c8abSBram Moolenaar
1288fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1289fa29c8abSBram Moolenaar    vim9script
1290fa29c8abSBram Moolenaar    import name from Xexport.vim
1291fa29c8abSBram Moolenaar  END
1292fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1293fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1294fa29c8abSBram Moolenaar
1295fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1296fa29c8abSBram Moolenaar    vim9script
1297fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1298fa29c8abSBram Moolenaar  END
1299fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1300fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1301fa29c8abSBram Moolenaar
1302fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1303fa29c8abSBram Moolenaar    vim9script
1304fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1305fa29c8abSBram Moolenaar  END
13065269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
13075269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1308fa29c8abSBram Moolenaar
1309f2d5c240SBram Moolenaar  delete('Ximport.vim')
13105269bd2aSBram Moolenaar  delete('Ximport3.vim')
13118a7d6542SBram Moolenaar  delete('Xexport.vim')
13128a7d6542SBram Moolenaar
1313f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1314750802b5SBram Moolenaar  set cpo&vi
1315750802b5SBram Moolenaar  let cpo_before = &cpo
1316750802b5SBram Moolenaar  let lines =<< trim END
1317750802b5SBram Moolenaar    vim9script
1318750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1319750802b5SBram Moolenaar  END
1320750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1321750802b5SBram Moolenaar  source Xvim9_script
1322750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1323750802b5SBram Moolenaar  set cpo&vim
1324750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1325750802b5SBram Moolenaar  delete('Xvim9_script')
1326750802b5SBram Moolenaarenddef
1327750802b5SBram Moolenaar
1328750802b5SBram Moolenaardef Test_vim9script_fails()
13298a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13308a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1331750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
13329721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
13339b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1334750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1335750802b5SBram Moolenaar
1336c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1337c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1338c785b9a7SBram Moolenaar
1339750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1340a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
13418a7d6542SBram Moolenaarenddef
13428a7d6542SBram Moolenaar
1343f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1344101f4810SBram Moolenaar  CheckRunVimInTerminal
1345101f4810SBram Moolenaar
13469bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1347c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13489bb3eb3eSBram Moolenaarendfunc
13499bb3eb3eSBram Moolenaar
1350c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1351101f4810SBram Moolenaar  let export =<< trim END
1352101f4810SBram Moolenaar    vim9script
1353101f4810SBram Moolenaar    export def Foo(): number
1354101f4810SBram Moolenaar        return 0
1355101f4810SBram Moolenaar    enddef
1356101f4810SBram Moolenaar  END
13579bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1358101f4810SBram Moolenaar
13599bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
13609bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13619bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1362101f4810SBram Moolenaar
13639bb3eb3eSBram Moolenaar  delete('Xexport.vim')
13649bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13659bb3eb3eSBram Moolenaarenddef
1366101f4810SBram Moolenaar
13674c17ad94SBram Moolenaardef Test_vim9script_reload_import()
13688a7d6542SBram Moolenaar  let lines =<< trim END
13698a7d6542SBram Moolenaar    vim9script
13708a7d6542SBram Moolenaar    const var = ''
13718a7d6542SBram Moolenaar    let valone = 1234
13728a7d6542SBram Moolenaar    def MyFunc(arg: string)
13738a7d6542SBram Moolenaar       valone = 5678
13748a7d6542SBram Moolenaar    enddef
13758a7d6542SBram Moolenaar  END
13768a7d6542SBram Moolenaar  let morelines =<< trim END
13778a7d6542SBram Moolenaar    let valtwo = 222
13788a7d6542SBram Moolenaar    export def GetValtwo(): number
13798a7d6542SBram Moolenaar      return valtwo
13808a7d6542SBram Moolenaar    enddef
13818a7d6542SBram Moolenaar  END
138203afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13838a7d6542SBram Moolenaar  source Xreload.vim
13848a7d6542SBram Moolenaar  source Xreload.vim
13858a7d6542SBram Moolenaar  source Xreload.vim
13868a7d6542SBram Moolenaar
13878a7d6542SBram Moolenaar  let testlines =<< trim END
13888a7d6542SBram Moolenaar    vim9script
13898a7d6542SBram Moolenaar    def TheFunc()
13908a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13918a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13928a7d6542SBram Moolenaar    enddef
13938a7d6542SBram Moolenaar    TheFunc()
13948a7d6542SBram Moolenaar  END
13958a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13968a7d6542SBram Moolenaar  source Ximport.vim
13978a7d6542SBram Moolenaar
1398f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1399f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14008a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14018a7d6542SBram Moolenaar  source Ximport.vim
14028a7d6542SBram Moolenaar
1403f5be8cdbSBram Moolenaar  # cannot declare a var twice
14048a7d6542SBram Moolenaar  lines =<< trim END
14058a7d6542SBram Moolenaar    vim9script
14068a7d6542SBram Moolenaar    let valone = 1234
14078a7d6542SBram Moolenaar    let valone = 5678
14088a7d6542SBram Moolenaar  END
14098a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14108a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
14118a7d6542SBram Moolenaar
14128a7d6542SBram Moolenaar  delete('Xreload.vim')
14138a7d6542SBram Moolenaar  delete('Ximport.vim')
14148a7d6542SBram Moolenaarenddef
14158a7d6542SBram Moolenaar
1416fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1417fe465a01SBram Moolenaar" script-local name.
1418fe465a01SBram Moolenaardef Test_vim9script_funcref()
1419fe465a01SBram Moolenaar  let sortlines =<< trim END
1420fe465a01SBram Moolenaar      vim9script
1421fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1422bed36b93SBram Moolenaar        return i2 - i1
1423fe465a01SBram Moolenaar      enddef
1424fe465a01SBram Moolenaar
1425fe465a01SBram Moolenaar      export def FastSort(): list<number>
1426fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1427fe465a01SBram Moolenaar      enddef
1428fe465a01SBram Moolenaar  END
1429fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1430fe465a01SBram Moolenaar
1431fe465a01SBram Moolenaar  let lines =<< trim END
1432fe465a01SBram Moolenaar    vim9script
1433fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1434fe465a01SBram Moolenaar    def Test()
1435fe465a01SBram Moolenaar      g:result = FastSort()
1436fe465a01SBram Moolenaar    enddef
1437fe465a01SBram Moolenaar    Test()
1438fe465a01SBram Moolenaar  END
1439fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1440fe465a01SBram Moolenaar
1441fe465a01SBram Moolenaar  source Xscript.vim
1442fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1443fe465a01SBram Moolenaar
1444fe465a01SBram Moolenaar  unlet g:result
1445fe465a01SBram Moolenaar  delete('Xsort.vim')
1446fe465a01SBram Moolenaar  delete('Xscript.vim')
1447fe465a01SBram Moolenaarenddef
1448fe465a01SBram Moolenaar
1449c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1450c620c055SBram Moolenaar" script where FastFilter() is called from.
1451c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1452c620c055SBram Moolenaar  let filterLines =<< trim END
1453c620c055SBram Moolenaar    vim9script
1454c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1455c620c055SBram Moolenaar      return idx % 2 == 1
1456c620c055SBram Moolenaar    enddef
1457c620c055SBram Moolenaar    export def FastFilter(): list<number>
1458c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1459c620c055SBram Moolenaar    enddef
1460c620c055SBram Moolenaar  END
1461c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1462c620c055SBram Moolenaar
1463c620c055SBram Moolenaar  let lines =<< trim END
1464c620c055SBram Moolenaar    vim9script
1465c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1466c620c055SBram Moolenaar    def Test()
1467c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1468c620c055SBram Moolenaar    enddef
1469c620c055SBram Moolenaar    Test()
1470c620c055SBram Moolenaar  END
1471c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1472c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1473c620c055SBram Moolenaar
1474c620c055SBram Moolenaar  delete('Xfilter.vim')
1475c620c055SBram Moolenaar  delete('Ximport.vim')
1476c620c055SBram Moolenaarenddef
1477c620c055SBram Moolenaar
14784c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
14794c17ad94SBram Moolenaar  let first_lines =<< trim END
14804c17ad94SBram Moolenaar    vim9script
14814c17ad94SBram Moolenaar    def FuncYes(): string
14824c17ad94SBram Moolenaar      return 'yes'
14834c17ad94SBram Moolenaar    enddef
14844c17ad94SBram Moolenaar  END
148503afdcf1SBram Moolenaar  let withno_lines =<< trim END
14864c17ad94SBram Moolenaar    def FuncNo(): string
14874c17ad94SBram Moolenaar      return 'no'
14884c17ad94SBram Moolenaar    enddef
14894c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
14904c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
14914c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
149203afdcf1SBram Moolenaar    enddef
149303afdcf1SBram Moolenaar  END
149403afdcf1SBram Moolenaar  let nono_lines =<< trim END
149503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
149603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
14974c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
14984c17ad94SBram Moolenaar    enddef
14994c17ad94SBram Moolenaar  END
15004c17ad94SBram Moolenaar
15014c17ad94SBram Moolenaar  # FuncNo() is defined
150203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15034c17ad94SBram Moolenaar  source Xreloaded.vim
15044c17ad94SBram Moolenaar  g:DoCheck(true)
15054c17ad94SBram Moolenaar
15064c17ad94SBram Moolenaar  # FuncNo() is not redefined
150703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
15084c17ad94SBram Moolenaar  source Xreloaded.vim
150903afdcf1SBram Moolenaar  g:DoCheck()
15104c17ad94SBram Moolenaar
15114c17ad94SBram Moolenaar  # FuncNo() is back
151203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15134c17ad94SBram Moolenaar  source Xreloaded.vim
151403afdcf1SBram Moolenaar  g:DoCheck()
15154c17ad94SBram Moolenaar
15164c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15174c17ad94SBram Moolenaarenddef
15184c17ad94SBram Moolenaar
151989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
152089483d40SBram Moolenaar  # write the script with a script-local variable
152189483d40SBram Moolenaar  let lines =<< trim END
152289483d40SBram Moolenaar    vim9script
152389483d40SBram Moolenaar    let var = 'string'
152489483d40SBram Moolenaar  END
152589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
152689483d40SBram Moolenaar  source XreloadVar.vim
152789483d40SBram Moolenaar
152889483d40SBram Moolenaar  # now write the script using the same variable locally - works
152989483d40SBram Moolenaar  lines =<< trim END
153089483d40SBram Moolenaar    vim9script
153189483d40SBram Moolenaar    def Func()
153289483d40SBram Moolenaar      let var = 'string'
153389483d40SBram Moolenaar    enddef
153489483d40SBram Moolenaar  END
153589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
153689483d40SBram Moolenaar  source XreloadVar.vim
153789483d40SBram Moolenaar
153889483d40SBram Moolenaar  delete('XreloadVar.vim')
153989483d40SBram Moolenaarenddef
154089483d40SBram Moolenaar
15418a7d6542SBram Moolenaardef Test_import_absolute()
15428a7d6542SBram Moolenaar  let import_lines = [
1543e6085c53SBram Moolenaar        'vim9script',
1544e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1545e6085c53SBram Moolenaar        'def UseExported()',
1546e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1547e6085c53SBram Moolenaar        '  exported = 8888',
1548e6085c53SBram Moolenaar        '  g:imported_after = exported',
1549e6085c53SBram Moolenaar        'enddef',
1550e6085c53SBram Moolenaar        'UseExported()',
1551e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1552e6085c53SBram Moolenaar        ]
15538a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15548a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15558a7d6542SBram Moolenaar
15568a7d6542SBram Moolenaar  source Ximport_abs.vim
15578a7d6542SBram Moolenaar
15588a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15594e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1560675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1561675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1562675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1563675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1564675f716eSBram Moolenaar          'exported = 8888.*' ..
1565675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1566675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1567675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1568675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1569e6085c53SBram Moolenaar        g:import_disassembled)
15708a7d6542SBram Moolenaar  unlet g:imported_abs
15714e12a5dfSBram Moolenaar  unlet g:import_disassembled
15728a7d6542SBram Moolenaar
15738a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15748a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
15758a7d6542SBram Moolenaarenddef
15768a7d6542SBram Moolenaar
15778a7d6542SBram Moolenaardef Test_import_rtp()
15788a7d6542SBram Moolenaar  let import_lines = [
1579e6085c53SBram Moolenaar        'vim9script',
1580e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1581e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1582e6085c53SBram Moolenaar        ]
15838a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
15848a7d6542SBram Moolenaar  mkdir('import')
15858a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
15868a7d6542SBram Moolenaar
15878a7d6542SBram Moolenaar  let save_rtp = &rtp
15888a7d6542SBram Moolenaar  &rtp = getcwd()
15898a7d6542SBram Moolenaar  source Ximport_rtp.vim
15908a7d6542SBram Moolenaar  &rtp = save_rtp
15918a7d6542SBram Moolenaar
15928a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
15938a7d6542SBram Moolenaar  unlet g:imported_rtp
15948a7d6542SBram Moolenaar
15958a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
159689483d40SBram Moolenaar  delete('import', 'rf')
15978a7d6542SBram Moolenaarenddef
15988a7d6542SBram Moolenaar
159925e0f586SBram Moolenaardef Test_import_compile_error()
160025e0f586SBram Moolenaar  let export_lines = [
160125e0f586SBram Moolenaar        'vim9script',
160225e0f586SBram Moolenaar        'export def ExpFunc(): string',
160325e0f586SBram Moolenaar        '  return notDefined',
160425e0f586SBram Moolenaar        'enddef',
160525e0f586SBram Moolenaar        ]
160625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
160725e0f586SBram Moolenaar
160825e0f586SBram Moolenaar  let import_lines = [
160925e0f586SBram Moolenaar        'vim9script',
161025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
161125e0f586SBram Moolenaar        'def ImpFunc()',
161225e0f586SBram Moolenaar        '  echo ExpFunc()',
161325e0f586SBram Moolenaar        'enddef',
161425e0f586SBram Moolenaar        'defcompile',
161525e0f586SBram Moolenaar        ]
161625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
161725e0f586SBram Moolenaar
161825e0f586SBram Moolenaar  try
161925e0f586SBram Moolenaar    source Ximport.vim
162025e0f586SBram Moolenaar  catch /E1001/
1621f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
162225e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
162325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
162425e0f586SBram Moolenaar  endtry
162525e0f586SBram Moolenaar
162625e0f586SBram Moolenaar  delete('Xexported.vim')
162725e0f586SBram Moolenaar  delete('Ximport.vim')
162825e0f586SBram Moolenaarenddef
162925e0f586SBram Moolenaar
1630eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1631eef2102eSBram Moolenaar  let export_lines =<< trim END
1632eef2102eSBram Moolenaar      vim9script
1633eef2102eSBram Moolenaar      export def Func()
1634eef2102eSBram Moolenaar        echo 'imported'
1635eef2102eSBram Moolenaar      enddef
1636eef2102eSBram Moolenaar  END
1637eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1638eef2102eSBram Moolenaar
1639eef2102eSBram Moolenaar  let lines =<< trim END
1640eef2102eSBram Moolenaar    vim9script
1641eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1642eef2102eSBram Moolenaar    def Func()
1643eef2102eSBram Moolenaar      echo 'local to function'
1644eef2102eSBram Moolenaar    enddef
1645eef2102eSBram Moolenaar  END
1646eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1647eef2102eSBram Moolenaar
1648eef2102eSBram Moolenaar  lines =<< trim END
1649eef2102eSBram Moolenaar    vim9script
1650eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1651eef2102eSBram Moolenaar    def Outer()
1652eef2102eSBram Moolenaar      def Func()
1653eef2102eSBram Moolenaar        echo 'local to function'
1654eef2102eSBram Moolenaar      enddef
1655eef2102eSBram Moolenaar    enddef
1656eef2102eSBram Moolenaar    defcompile
1657eef2102eSBram Moolenaar  END
1658eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1659eef2102eSBram Moolenaar
1660eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1661eef2102eSBram Moolenaarenddef
1662eef2102eSBram Moolenaar
1663b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1664b9a2cac3SBram Moolenaar  let lines =<< trim END
1665b9a2cac3SBram Moolenaar    vim9script
1666b9a2cac3SBram Moolenaar    def Func()
1667b9a2cac3SBram Moolenaar      echo 'one'
1668b9a2cac3SBram Moolenaar    enddef
1669b9a2cac3SBram Moolenaar    def Func()
1670b9a2cac3SBram Moolenaar      echo 'two'
1671b9a2cac3SBram Moolenaar    enddef
1672b9a2cac3SBram Moolenaar  END
1673b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1674b9a2cac3SBram Moolenaarenddef
1675b9a2cac3SBram Moolenaar
16768a7d6542SBram Moolenaardef Test_fixed_size_list()
1677f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
16788a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
16798a7d6542SBram Moolenaar  l->remove(0)
16808a7d6542SBram Moolenaar  l->add(5)
16818a7d6542SBram Moolenaar  l->insert(99, 1)
16820f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
16838a7d6542SBram Moolenaarenddef
16848a7d6542SBram Moolenaar
1685ae616494SBram Moolenaardef Test_no_insert_xit()
1686ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1687ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1688f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1689f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1690f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1691ae616494SBram Moolenaar
1692ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1693ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1694ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1695ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1696f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1697f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1698f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1699f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1700f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1701ae616494SBram Moolenaarenddef
1702ae616494SBram Moolenaar
1703158906cfSBram Moolenaardef IfElse(what: number): string
1704158906cfSBram Moolenaar  let res = ''
1705158906cfSBram Moolenaar  if what == 1
1706158906cfSBram Moolenaar    res = "one"
1707158906cfSBram Moolenaar  elseif what == 2
1708158906cfSBram Moolenaar    res = "two"
1709a259d8d3SBram Moolenaar  else
1710158906cfSBram Moolenaar    res = "three"
1711a259d8d3SBram Moolenaar  endif
1712158906cfSBram Moolenaar  return res
1713a259d8d3SBram Moolenaarenddef
1714a259d8d3SBram Moolenaar
1715158906cfSBram Moolenaardef Test_if_elseif_else()
1716158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1717158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1718158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
17190f18b6d1SBram Moolenaarenddef
17200f18b6d1SBram Moolenaar
1721e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1722e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1723e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1724e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1725e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1726585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1727e8c4abbbSBram Moolenaarenddef
1728e8c4abbbSBram Moolenaar
17296d69bf60SBram Moolenaarlet g:bool_true = v:true
17306d69bf60SBram Moolenaarlet g:bool_false = v:false
17316d69bf60SBram Moolenaar
17326d69bf60SBram Moolenaardef Test_if_const_expr()
17336d69bf60SBram Moolenaar  let res = false
17346d69bf60SBram Moolenaar  if true ? true : false
17356d69bf60SBram Moolenaar    res = true
17366d69bf60SBram Moolenaar  endif
17376d69bf60SBram Moolenaar  assert_equal(true, res)
17386d69bf60SBram Moolenaar
1739585fea7bSBram Moolenaar  g:glob = 2
1740585fea7bSBram Moolenaar  if false
17416797966dSBram Moolenaar    execute('g:glob = 3')
1742585fea7bSBram Moolenaar  endif
1743585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1744585fea7bSBram Moolenaar  if true
17456797966dSBram Moolenaar    execute('g:glob = 3')
1746585fea7bSBram Moolenaar  endif
1747585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1748585fea7bSBram Moolenaar
17496d69bf60SBram Moolenaar  res = false
17506d69bf60SBram Moolenaar  if g:bool_true ? true : false
17516d69bf60SBram Moolenaar    res = true
17526d69bf60SBram Moolenaar  endif
17536d69bf60SBram Moolenaar  assert_equal(true, res)
17546d69bf60SBram Moolenaar
17556d69bf60SBram Moolenaar  res = false
17566d69bf60SBram Moolenaar  if true ? g:bool_true : false
17576d69bf60SBram Moolenaar    res = true
17586d69bf60SBram Moolenaar  endif
17596d69bf60SBram Moolenaar  assert_equal(true, res)
17606d69bf60SBram Moolenaar
17616d69bf60SBram Moolenaar  res = false
17626d69bf60SBram Moolenaar  if true ? true : g:bool_false
17636d69bf60SBram Moolenaar    res = true
17646d69bf60SBram Moolenaar  endif
17656d69bf60SBram Moolenaar  assert_equal(true, res)
17666d69bf60SBram Moolenaar
17676d69bf60SBram Moolenaar  res = false
17686d69bf60SBram Moolenaar  if true ? false : true
17696d69bf60SBram Moolenaar    res = true
17706d69bf60SBram Moolenaar  endif
17716d69bf60SBram Moolenaar  assert_equal(false, res)
17726d69bf60SBram Moolenaar
17736d69bf60SBram Moolenaar  res = false
17746d69bf60SBram Moolenaar  if false ? false : true
17756d69bf60SBram Moolenaar    res = true
17766d69bf60SBram Moolenaar  endif
17776d69bf60SBram Moolenaar  assert_equal(true, res)
17786d69bf60SBram Moolenaar
17796d69bf60SBram Moolenaar  res = false
17806d69bf60SBram Moolenaar  if false ? true : false
17816d69bf60SBram Moolenaar    res = true
17826d69bf60SBram Moolenaar  endif
17836d69bf60SBram Moolenaar  assert_equal(false, res)
17846d69bf60SBram Moolenaar
17856d69bf60SBram Moolenaar  res = false
1786e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1787e8c4abbbSBram Moolenaar    res = true
1788e8c4abbbSBram Moolenaar  endif
1789e8c4abbbSBram Moolenaar  assert_equal(false, res)
1790e8c4abbbSBram Moolenaar
1791e8c4abbbSBram Moolenaar  res = false
17926d69bf60SBram Moolenaar  if true && true
17936d69bf60SBram Moolenaar    res = true
17946d69bf60SBram Moolenaar  endif
17956d69bf60SBram Moolenaar  assert_equal(true, res)
17966d69bf60SBram Moolenaar
17976d69bf60SBram Moolenaar  res = false
17986d69bf60SBram Moolenaar  if true && false
17996d69bf60SBram Moolenaar    res = true
18006d69bf60SBram Moolenaar  endif
18016d69bf60SBram Moolenaar  assert_equal(false, res)
18026d69bf60SBram Moolenaar
18036d69bf60SBram Moolenaar  res = false
18046d69bf60SBram Moolenaar  if g:bool_true && false
18056d69bf60SBram Moolenaar    res = true
18066d69bf60SBram Moolenaar  endif
18076d69bf60SBram Moolenaar  assert_equal(false, res)
18086d69bf60SBram Moolenaar
18096d69bf60SBram Moolenaar  res = false
18106d69bf60SBram Moolenaar  if true && g:bool_false
18116d69bf60SBram Moolenaar    res = true
18126d69bf60SBram Moolenaar  endif
18136d69bf60SBram Moolenaar  assert_equal(false, res)
18146d69bf60SBram Moolenaar
18156d69bf60SBram Moolenaar  res = false
18166d69bf60SBram Moolenaar  if false && false
18176d69bf60SBram Moolenaar    res = true
18186d69bf60SBram Moolenaar  endif
18196d69bf60SBram Moolenaar  assert_equal(false, res)
18206d69bf60SBram Moolenaar
18216d69bf60SBram Moolenaar  res = false
18226d69bf60SBram Moolenaar  if true || false
18236d69bf60SBram Moolenaar    res = true
18246d69bf60SBram Moolenaar  endif
18256d69bf60SBram Moolenaar  assert_equal(true, res)
18266d69bf60SBram Moolenaar
18276d69bf60SBram Moolenaar  res = false
18286d69bf60SBram Moolenaar  if g:bool_true || false
18296d69bf60SBram Moolenaar    res = true
18306d69bf60SBram Moolenaar  endif
18316d69bf60SBram Moolenaar  assert_equal(true, res)
18326d69bf60SBram Moolenaar
18336d69bf60SBram Moolenaar  res = false
18346d69bf60SBram Moolenaar  if true || g:bool_false
18356d69bf60SBram Moolenaar    res = true
18366d69bf60SBram Moolenaar  endif
18376d69bf60SBram Moolenaar  assert_equal(true, res)
18386d69bf60SBram Moolenaar
18396d69bf60SBram Moolenaar  res = false
18406d69bf60SBram Moolenaar  if false || false
18416d69bf60SBram Moolenaar    res = true
18426d69bf60SBram Moolenaar  endif
18436d69bf60SBram Moolenaar  assert_equal(false, res)
184480c34ca3SBram Moolenaarenddef
18456d69bf60SBram Moolenaar
184680c34ca3SBram Moolenaardef Test_if_const_expr_fails()
184780c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
184880c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1849e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1850e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
18516d69bf60SBram Moolenaarenddef
18526d69bf60SBram Moolenaar
185372abcf42SBram Moolenaardef RunNested(i: number): number
185472abcf42SBram Moolenaar  let x: number = 0
185572abcf42SBram Moolenaar  if i % 2
185672abcf42SBram Moolenaar    if 1
1857f5be8cdbSBram Moolenaar      # comment
185872abcf42SBram Moolenaar    else
1859f5be8cdbSBram Moolenaar      # comment
186072abcf42SBram Moolenaar    endif
186172abcf42SBram Moolenaar    x += 1
186272abcf42SBram Moolenaar  else
186372abcf42SBram Moolenaar    x += 1000
186472abcf42SBram Moolenaar  endif
186572abcf42SBram Moolenaar  return x
186672abcf42SBram Moolenaarenddef
186772abcf42SBram Moolenaar
186872abcf42SBram Moolenaardef Test_nested_if()
186972abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
187072abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
187172abcf42SBram Moolenaarenddef
187272abcf42SBram Moolenaar
1873ad39c094SBram Moolenaardef Test_execute_cmd()
1874ad39c094SBram Moolenaar  new
1875ad39c094SBram Moolenaar  setline(1, 'default')
1876ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1877ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1878a72cfb80SBram Moolenaar
1879a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1880a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1881a72cfb80SBram Moolenaar
1882ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1883ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1884a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1885ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1886a72cfb80SBram Moolenaar
1887ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1888ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1889a72cfb80SBram Moolenaar
1890ad39c094SBram Moolenaar  let cmd_first = 'call '
1891ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1892ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1893ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1894ad39c094SBram Moolenaar  bwipe!
1895585fea7bSBram Moolenaar
18962d6b20d6SBram Moolenaar  let n = true
18972d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
18982d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
18992d6b20d6SBram Moolenaar
1900585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1901a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1902ad39c094SBram Moolenaarenddef
1903ad39c094SBram Moolenaar
190447e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1905f5be8cdbSBram Moolenaar  # only checks line continuation
190647e880d6SBram Moolenaar  let lines =<< trim END
190747e880d6SBram Moolenaar      vim9script
190847e880d6SBram Moolenaar      execute 'g:someVar'
190947e880d6SBram Moolenaar                .. ' = ' ..
191047e880d6SBram Moolenaar                   '28'
191147e880d6SBram Moolenaar      assert_equal(28, g:someVar)
191247e880d6SBram Moolenaar      unlet g:someVar
191347e880d6SBram Moolenaar  END
191447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
191547e880d6SBram Moolenaarenddef
191647e880d6SBram Moolenaar
1917ad39c094SBram Moolenaardef Test_echo_cmd()
1918a72cfb80SBram Moolenaar  echo 'some' # comment
1919585fea7bSBram Moolenaar  echon 'thing'
1920ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1921ad39c094SBram Moolenaar
1922a72cfb80SBram Moolenaar  echo "some" # comment
1923a72cfb80SBram Moolenaar  echon "thing"
1924a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1925a72cfb80SBram Moolenaar
1926ad39c094SBram Moolenaar  let str1 = 'some'
1927ad39c094SBram Moolenaar  let str2 = 'more'
1928ad39c094SBram Moolenaar  echo str1 str2
1929ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1930a72cfb80SBram Moolenaar
1931a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1932ad39c094SBram Moolenaarenddef
1933ad39c094SBram Moolenaar
1934f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1935f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1936f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1937f93c7feaSBram Moolenaar  echo 'clear'
1938df069eecSBram Moolenaar  :1messages
1939f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1940f93c7feaSBram Moolenaar
1941f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1942f93c7feaSBram Moolenaarenddef
1943f93c7feaSBram Moolenaar
194447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1945f5be8cdbSBram Moolenaar  # only checks line continuation
194647e880d6SBram Moolenaar  let lines =<< trim END
194747e880d6SBram Moolenaar      vim9script
194847e880d6SBram Moolenaar      echomsg 'here'
194947e880d6SBram Moolenaar                .. ' is ' ..
195047e880d6SBram Moolenaar                   'a message'
195147e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
195247e880d6SBram Moolenaar  END
195347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
195447e880d6SBram Moolenaarenddef
195547e880d6SBram Moolenaar
1956f93c7feaSBram Moolenaardef Test_echoerr_cmd()
195740ee466cSBram Moolenaar  try
195840ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
195940ee466cSBram Moolenaar  catch
196040ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
196140ee466cSBram Moolenaar  endtry
1962f93c7feaSBram Moolenaarenddef
1963f93c7feaSBram Moolenaar
196447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1965f5be8cdbSBram Moolenaar  # only checks line continuation
196647e880d6SBram Moolenaar  let lines =<< trim END
196747e880d6SBram Moolenaar      vim9script
196847e880d6SBram Moolenaar      try
196947e880d6SBram Moolenaar        echoerr 'this'
197047e880d6SBram Moolenaar                .. ' is ' ..
197147e880d6SBram Moolenaar                   'wrong'
197247e880d6SBram Moolenaar      catch
197347e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
197447e880d6SBram Moolenaar      endtry
197547e880d6SBram Moolenaar  END
197647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
197747e880d6SBram Moolenaarenddef
197847e880d6SBram Moolenaar
197941fe0617SBram Moolenaardef Test_for_outside_of_function()
198041fe0617SBram Moolenaar  let lines =<< trim END
198141fe0617SBram Moolenaar    vim9script
198241fe0617SBram Moolenaar    new
198341fe0617SBram Moolenaar    for var in range(0, 3)
198441fe0617SBram Moolenaar      append(line('$'), var)
198541fe0617SBram Moolenaar    endfor
198641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
198741fe0617SBram Moolenaar    bwipe!
198841fe0617SBram Moolenaar  END
198941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
199041fe0617SBram Moolenaar  source Xvim9for.vim
199141fe0617SBram Moolenaar  delete('Xvim9for.vim')
199241fe0617SBram Moolenaarenddef
19938a7d6542SBram Moolenaar
1994e8c4abbbSBram Moolenaardef Test_for_loop()
1995e8c4abbbSBram Moolenaar  let result = ''
1996e8c4abbbSBram Moolenaar  for cnt in range(7)
1997e8c4abbbSBram Moolenaar    if cnt == 4
1998e8c4abbbSBram Moolenaar      break
1999e8c4abbbSBram Moolenaar    endif
2000e8c4abbbSBram Moolenaar    if cnt == 2
2001e8c4abbbSBram Moolenaar      continue
2002e8c4abbbSBram Moolenaar    endif
2003e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2004e8c4abbbSBram Moolenaar  endfor
2005e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
20060ad3e894SBram Moolenaar
20070ad3e894SBram Moolenaar  let concat = ''
20080ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
20090ad3e894SBram Moolenaar    concat ..= str
20100ad3e894SBram Moolenaar  endfor
20110ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2012e8c4abbbSBram Moolenaarenddef
2013e8c4abbbSBram Moolenaar
2014e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2015675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2016675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2017675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2018822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
20190ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2020675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2021675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2022675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2023e8c4abbbSBram Moolenaarenddef
2024e8c4abbbSBram Moolenaar
2025d0df1aacSBram Moolenaardef Test_while_loop()
2026d0df1aacSBram Moolenaar  let result = ''
2027d0df1aacSBram Moolenaar  let cnt = 0
2028d0df1aacSBram Moolenaar  while cnt < 555
2029d0df1aacSBram Moolenaar    if cnt == 3
2030d0df1aacSBram Moolenaar      break
2031d0df1aacSBram Moolenaar    endif
2032d0df1aacSBram Moolenaar    cnt += 1
2033d0df1aacSBram Moolenaar    if cnt == 2
2034d0df1aacSBram Moolenaar      continue
2035d0df1aacSBram Moolenaar    endif
2036d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2037d0df1aacSBram Moolenaar  endwhile
2038d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2039d0df1aacSBram Moolenaarenddef
2040d0df1aacSBram Moolenaar
2041e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2042675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2043675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2044675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2045675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2046675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2047675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2048675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2049bd5da371SBram Moolenaarenddef
2050bd5da371SBram Moolenaar
20519645e2d9SBram Moolenaardef Test_interrupt_loop()
205297acfc78SBram Moolenaar  let caught = false
20539645e2d9SBram Moolenaar  let x = 0
205497acfc78SBram Moolenaar  try
20559645e2d9SBram Moolenaar    while 1
20569645e2d9SBram Moolenaar      x += 1
20579645e2d9SBram Moolenaar      if x == 100
20589645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
20599645e2d9SBram Moolenaar      endif
20609645e2d9SBram Moolenaar    endwhile
206197acfc78SBram Moolenaar  catch
206297acfc78SBram Moolenaar    caught = true
206397acfc78SBram Moolenaar    assert_equal(100, x)
206497acfc78SBram Moolenaar  endtry
206597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
20669645e2d9SBram Moolenaarenddef
206720431c9dSBram Moolenaar
20684fdae999SBram Moolenaardef Test_automatic_line_continuation()
20694fdae999SBram Moolenaar  let mylist = [
20704fdae999SBram Moolenaar      'one',
20714fdae999SBram Moolenaar      'two',
20724fdae999SBram Moolenaar      'three',
2073f5be8cdbSBram Moolenaar      ] # comment
20744fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
20754fdae999SBram Moolenaar
20764fdae999SBram Moolenaar  let mydict = {
20774fdae999SBram Moolenaar      'one': 1,
20784fdae999SBram Moolenaar      'two': 2,
20794fdae999SBram Moolenaar      'three':
20804fdae999SBram Moolenaar          3,
2081f5be8cdbSBram Moolenaar      } # comment
20824fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
20834fdae999SBram Moolenaar  mydict = #{
20842c330432SBram Moolenaar      one: 1,  # comment
20852c330432SBram Moolenaar      two:     # comment
20862c330432SBram Moolenaar           2,  # comment
20872c330432SBram Moolenaar      three: 3 # comment
20882c330432SBram Moolenaar      }
20892c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
20902c330432SBram Moolenaar  mydict = #{
20912c330432SBram Moolenaar      one: 1,
20924fdae999SBram Moolenaar      two:
20934fdae999SBram Moolenaar           2,
20942c330432SBram Moolenaar      three: 3
20954fdae999SBram Moolenaar      }
20964fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2097e6085c53SBram Moolenaar
2098e6085c53SBram Moolenaar  assert_equal(
2099e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2100e6085c53SBram Moolenaar        split('one two three')
2101e6085c53SBram Moolenaar        )
21024fdae999SBram Moolenaarenddef
21034fdae999SBram Moolenaar
21047a092245SBram Moolenaardef Test_vim9_comment()
21057a092245SBram Moolenaar  CheckScriptSuccess([
21067a092245SBram Moolenaar      'vim9script',
21077a092245SBram Moolenaar      '# something',
21087a092245SBram Moolenaar      ])
21097a092245SBram Moolenaar  CheckScriptFailure([
21107a092245SBram Moolenaar      'vim9script',
21117a092245SBram Moolenaar      ':# something',
21127a092245SBram Moolenaar      ], 'E488:')
21137a092245SBram Moolenaar  CheckScriptFailure([
21147a092245SBram Moolenaar      '# something',
21157a092245SBram Moolenaar      ], 'E488:')
21167a092245SBram Moolenaar  CheckScriptFailure([
21177a092245SBram Moolenaar      ':# something',
21187a092245SBram Moolenaar      ], 'E488:')
21197a092245SBram Moolenaar
21204a8d9f2eSBram Moolenaar  { # block start
21214a8d9f2eSBram Moolenaar  } # block end
21224a8d9f2eSBram Moolenaar  CheckDefFailure([
21234a8d9f2eSBram Moolenaar      '{# comment',
21244a8d9f2eSBram Moolenaar      ], 'E488:')
21254a8d9f2eSBram Moolenaar  CheckDefFailure([
21264a8d9f2eSBram Moolenaar      '{',
21274a8d9f2eSBram Moolenaar      '}# comment',
21284a8d9f2eSBram Moolenaar      ], 'E488:')
21294a8d9f2eSBram Moolenaar
21304a8d9f2eSBram Moolenaar  echo "yes" # comment
21314a8d9f2eSBram Moolenaar  CheckDefFailure([
21324a8d9f2eSBram Moolenaar      'echo "yes"# comment',
21334a8d9f2eSBram Moolenaar      ], 'E488:')
21347a092245SBram Moolenaar  CheckScriptSuccess([
21357a092245SBram Moolenaar      'vim9script',
21367a092245SBram Moolenaar      'echo "yes" # something',
21377a092245SBram Moolenaar      ])
21387a092245SBram Moolenaar  CheckScriptFailure([
21397a092245SBram Moolenaar      'vim9script',
21407a092245SBram Moolenaar      'echo "yes"# something',
21417a092245SBram Moolenaar      ], 'E121:')
21427a092245SBram Moolenaar  CheckScriptFailure([
21437a092245SBram Moolenaar      'vim9script',
21447a092245SBram Moolenaar      'echo# something',
21457a092245SBram Moolenaar      ], 'E121:')
21467a092245SBram Moolenaar  CheckScriptFailure([
21477a092245SBram Moolenaar      'echo "yes" # something',
21487a092245SBram Moolenaar      ], 'E121:')
21497a092245SBram Moolenaar
21504a8d9f2eSBram Moolenaar  exe "echo" # comment
21514a8d9f2eSBram Moolenaar  CheckDefFailure([
21524a8d9f2eSBram Moolenaar      'exe "echo"# comment',
21534a8d9f2eSBram Moolenaar      ], 'E488:')
21544a8d9f2eSBram Moolenaar  CheckScriptSuccess([
21554a8d9f2eSBram Moolenaar      'vim9script',
21564a8d9f2eSBram Moolenaar      'exe "echo" # something',
21574a8d9f2eSBram Moolenaar      ])
21584a8d9f2eSBram Moolenaar  CheckScriptFailure([
21594a8d9f2eSBram Moolenaar      'vim9script',
21604a8d9f2eSBram Moolenaar      'exe "echo"# something',
21614a8d9f2eSBram Moolenaar      ], 'E121:')
21624a8d9f2eSBram Moolenaar  CheckDefFailure([
21634a8d9f2eSBram Moolenaar      'exe # comment',
21644a8d9f2eSBram Moolenaar      ], 'E1015:')
21654a8d9f2eSBram Moolenaar  CheckScriptFailure([
21664a8d9f2eSBram Moolenaar      'vim9script',
21674a8d9f2eSBram Moolenaar      'exe# something',
21684a8d9f2eSBram Moolenaar      ], 'E121:')
21694a8d9f2eSBram Moolenaar  CheckScriptFailure([
21704a8d9f2eSBram Moolenaar      'exe "echo" # something',
21714a8d9f2eSBram Moolenaar      ], 'E121:')
21724a8d9f2eSBram Moolenaar
21737a092245SBram Moolenaar  CheckDefFailure([
21747a092245SBram Moolenaar      'try# comment',
21757a092245SBram Moolenaar      '  echo "yes"',
21767a092245SBram Moolenaar      'catch',
21777a092245SBram Moolenaar      'endtry',
21787a092245SBram Moolenaar      ], 'E488:')
21792c5ed4e3SBram Moolenaar  CheckScriptFailure([
21802c5ed4e3SBram Moolenaar      'vim9script',
21812c5ed4e3SBram Moolenaar      'try# comment',
21822c5ed4e3SBram Moolenaar      'echo "yes"',
21832c5ed4e3SBram Moolenaar      ], 'E488:')
21847a092245SBram Moolenaar  CheckDefFailure([
21857a092245SBram Moolenaar      'try',
2186a72cfb80SBram Moolenaar      '  throw#comment',
2187a72cfb80SBram Moolenaar      'catch',
2188a72cfb80SBram Moolenaar      'endtry',
2189a72cfb80SBram Moolenaar      ], 'E1015:')
2190a72cfb80SBram Moolenaar  CheckDefFailure([
2191a72cfb80SBram Moolenaar      'try',
2192a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2193a72cfb80SBram Moolenaar      'catch',
2194a72cfb80SBram Moolenaar      'endtry',
2195a72cfb80SBram Moolenaar      ], 'E488:')
2196a72cfb80SBram Moolenaar  CheckDefFailure([
2197a72cfb80SBram Moolenaar      'try',
21987a092245SBram Moolenaar      '  echo "yes"',
21997a092245SBram Moolenaar      'catch# comment',
22007a092245SBram Moolenaar      'endtry',
22017a092245SBram Moolenaar      ], 'E488:')
22022c5ed4e3SBram Moolenaar  CheckScriptFailure([
22032c5ed4e3SBram Moolenaar      'vim9script',
22042c5ed4e3SBram Moolenaar      'try',
22052c5ed4e3SBram Moolenaar      '  echo "yes"',
22062c5ed4e3SBram Moolenaar      'catch# comment',
22072c5ed4e3SBram Moolenaar      'endtry',
22082c5ed4e3SBram Moolenaar      ], 'E654:')
22092c5ed4e3SBram Moolenaar  CheckDefFailure([
22102c5ed4e3SBram Moolenaar      'try',
22112c5ed4e3SBram Moolenaar      '  echo "yes"',
22122c5ed4e3SBram Moolenaar      'catch /pat/# comment',
22132c5ed4e3SBram Moolenaar      'endtry',
22142c5ed4e3SBram Moolenaar      ], 'E488:')
22157a092245SBram Moolenaar  CheckDefFailure([
22167a092245SBram Moolenaar      'try',
22177a092245SBram Moolenaar      'echo "yes"',
22187a092245SBram Moolenaar      'catch',
22197a092245SBram Moolenaar      'endtry# comment',
22207a092245SBram Moolenaar      ], 'E488:')
22212c5ed4e3SBram Moolenaar  CheckScriptFailure([
22222c5ed4e3SBram Moolenaar      'vim9script',
22232c5ed4e3SBram Moolenaar      'try',
22242c5ed4e3SBram Moolenaar      '  echo "yes"',
22252c5ed4e3SBram Moolenaar      'catch',
22262c5ed4e3SBram Moolenaar      'endtry# comment',
22279b7bf9e9SBram Moolenaar      ], 'E488:')
22282c5ed4e3SBram Moolenaar
22292c5ed4e3SBram Moolenaar  CheckScriptSuccess([
22302c5ed4e3SBram Moolenaar      'vim9script',
22312c5ed4e3SBram Moolenaar      'hi # comment',
22322c5ed4e3SBram Moolenaar      ])
22332c5ed4e3SBram Moolenaar  CheckScriptFailure([
22342c5ed4e3SBram Moolenaar      'vim9script',
22352c5ed4e3SBram Moolenaar      'hi# comment',
22362c5ed4e3SBram Moolenaar      ], 'E416:')
22371966c248SBram Moolenaar  CheckScriptSuccess([
22381966c248SBram Moolenaar      'vim9script',
22391966c248SBram Moolenaar      'hi Search # comment',
22401966c248SBram Moolenaar      ])
22411966c248SBram Moolenaar  CheckScriptFailure([
22421966c248SBram Moolenaar      'vim9script',
22431966c248SBram Moolenaar      'hi Search# comment',
22441966c248SBram Moolenaar      ], 'E416:')
22451966c248SBram Moolenaar  CheckScriptSuccess([
22461966c248SBram Moolenaar      'vim9script',
22471966c248SBram Moolenaar      'hi link This Search # comment',
22481966c248SBram Moolenaar      ])
22491966c248SBram Moolenaar  CheckScriptFailure([
22501966c248SBram Moolenaar      'vim9script',
22511966c248SBram Moolenaar      'hi link This That# comment',
22521966c248SBram Moolenaar      ], 'E413:')
22531966c248SBram Moolenaar  CheckScriptSuccess([
22541966c248SBram Moolenaar      'vim9script',
22551966c248SBram Moolenaar      'hi clear This # comment',
22561966c248SBram Moolenaar      'hi clear # comment',
22571966c248SBram Moolenaar      ])
2258f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2259f5be8cdbSBram Moolenaar  # hi clear This# comment',
22601966c248SBram Moolenaar  CheckScriptFailure([
22611966c248SBram Moolenaar      'vim9script',
22621966c248SBram Moolenaar      'hi clear# comment',
22631966c248SBram Moolenaar      ], 'E416:')
22641966c248SBram Moolenaar
22651966c248SBram Moolenaar  CheckScriptSuccess([
22661966c248SBram Moolenaar      'vim9script',
22671966c248SBram Moolenaar      'hi Group term=bold',
22681966c248SBram Moolenaar      'match Group /todo/ # comment',
22691966c248SBram Moolenaar      ])
22701966c248SBram Moolenaar  CheckScriptFailure([
22711966c248SBram Moolenaar      'vim9script',
22721966c248SBram Moolenaar      'hi Group term=bold',
22731966c248SBram Moolenaar      'match Group /todo/# comment',
22741966c248SBram Moolenaar      ], 'E488:')
22751966c248SBram Moolenaar  CheckScriptSuccess([
22761966c248SBram Moolenaar      'vim9script',
22771966c248SBram Moolenaar      'match # comment',
22781966c248SBram Moolenaar      ])
22791966c248SBram Moolenaar  CheckScriptFailure([
22801966c248SBram Moolenaar      'vim9script',
22811966c248SBram Moolenaar      'match# comment',
22821966c248SBram Moolenaar      ], 'E475:')
22831966c248SBram Moolenaar  CheckScriptSuccess([
22841966c248SBram Moolenaar      'vim9script',
22851966c248SBram Moolenaar      'match none # comment',
22861966c248SBram Moolenaar      ])
22871966c248SBram Moolenaar  CheckScriptFailure([
22881966c248SBram Moolenaar      'vim9script',
22891966c248SBram Moolenaar      'match none# comment',
22901966c248SBram Moolenaar      ], 'E475:')
22911966c248SBram Moolenaar
22921966c248SBram Moolenaar  CheckScriptSuccess([
22931966c248SBram Moolenaar      'vim9script',
22941966c248SBram Moolenaar      'menutrans clear # comment',
22951966c248SBram Moolenaar      ])
22961966c248SBram Moolenaar  CheckScriptFailure([
22971966c248SBram Moolenaar      'vim9script',
22981966c248SBram Moolenaar      'menutrans clear# comment text',
22991966c248SBram Moolenaar      ], 'E474:')
23001966c248SBram Moolenaar
23011966c248SBram Moolenaar  CheckScriptSuccess([
23021966c248SBram Moolenaar      'vim9script',
23031966c248SBram Moolenaar      'syntax clear # comment',
23041966c248SBram Moolenaar      ])
23051966c248SBram Moolenaar  CheckScriptFailure([
23061966c248SBram Moolenaar      'vim9script',
23071966c248SBram Moolenaar      'syntax clear# comment text',
23081966c248SBram Moolenaar      ], 'E28:')
23091966c248SBram Moolenaar  CheckScriptSuccess([
23101966c248SBram Moolenaar      'vim9script',
23111966c248SBram Moolenaar      'syntax keyword Word some',
23121966c248SBram Moolenaar      'syntax clear Word # comment',
23131966c248SBram Moolenaar      ])
23141966c248SBram Moolenaar  CheckScriptFailure([
23151966c248SBram Moolenaar      'vim9script',
23161966c248SBram Moolenaar      'syntax keyword Word some',
23171966c248SBram Moolenaar      'syntax clear Word# comment text',
23181966c248SBram Moolenaar      ], 'E28:')
23191966c248SBram Moolenaar
23201966c248SBram Moolenaar  CheckScriptSuccess([
23211966c248SBram Moolenaar      'vim9script',
23221966c248SBram Moolenaar      'syntax list # comment',
23231966c248SBram Moolenaar      ])
23241966c248SBram Moolenaar  CheckScriptFailure([
23251966c248SBram Moolenaar      'vim9script',
23261966c248SBram Moolenaar      'syntax list# comment text',
23271966c248SBram Moolenaar      ], 'E28:')
23281966c248SBram Moolenaar
23291966c248SBram Moolenaar  CheckScriptSuccess([
23301966c248SBram Moolenaar      'vim9script',
23311966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
23321966c248SBram Moolenaar      ])
23331966c248SBram Moolenaar  CheckScriptFailure([
23341966c248SBram Moolenaar      'vim9script',
23351966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
23361966c248SBram Moolenaar      ], 'E475:')
23371966c248SBram Moolenaar
23381966c248SBram Moolenaar  CheckScriptSuccess([
23391966c248SBram Moolenaar      'vim9script',
23401966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
23411966c248SBram Moolenaar      ])
23421966c248SBram Moolenaar  CheckScriptFailure([
23431966c248SBram Moolenaar      'vim9script',
23441966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
23451966c248SBram Moolenaar      ], 'E789:')
23461966c248SBram Moolenaar
23471966c248SBram Moolenaar  CheckScriptSuccess([
23481966c248SBram Moolenaar      'vim9script',
23491966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
23501966c248SBram Moolenaar      ])
23511966c248SBram Moolenaar  CheckScriptFailure([
23521966c248SBram Moolenaar      'vim9script',
23531966c248SBram Moolenaar      'syntax match Word /pat/# comment',
23541966c248SBram Moolenaar      ], 'E402:')
23551966c248SBram Moolenaar
23561966c248SBram Moolenaar  CheckScriptSuccess([
23571966c248SBram Moolenaar      'vim9script',
23581966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
23591966c248SBram Moolenaar      ])
23601966c248SBram Moolenaar  CheckScriptFailure([
23611966c248SBram Moolenaar      'vim9script',
23621966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
23631966c248SBram Moolenaar      ], 'E475:')
23641966c248SBram Moolenaar  CheckScriptFailure([
23651966c248SBram Moolenaar      'vim9script',
23661966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
23671966c248SBram Moolenaar      ], 'E406:')
23681966c248SBram Moolenaar  CheckScriptFailure([
23691966c248SBram Moolenaar      'vim9script',
23701966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
23711966c248SBram Moolenaar      ], 'E475:')
23721966c248SBram Moolenaar
23731966c248SBram Moolenaar  CheckScriptSuccess([
23741966c248SBram Moolenaar      'vim9script',
23751966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
23761966c248SBram Moolenaar      ])
23771966c248SBram Moolenaar  CheckScriptFailure([
23781966c248SBram Moolenaar      'vim9script',
23791966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2380d032f34aSBram Moolenaar      ], 'E402:')
23811966c248SBram Moolenaar
23821966c248SBram Moolenaar  CheckScriptSuccess([
23831966c248SBram Moolenaar      'vim9script',
23841966c248SBram Moolenaar      'syntax sync # comment',
23851966c248SBram Moolenaar      ])
23861966c248SBram Moolenaar  CheckScriptFailure([
23871966c248SBram Moolenaar      'vim9script',
23881966c248SBram Moolenaar      'syntax sync# comment',
23891966c248SBram Moolenaar      ], 'E404:')
23901966c248SBram Moolenaar  CheckScriptSuccess([
23911966c248SBram Moolenaar      'vim9script',
23921966c248SBram Moolenaar      'syntax sync ccomment # comment',
23931966c248SBram Moolenaar      ])
23941966c248SBram Moolenaar  CheckScriptFailure([
23951966c248SBram Moolenaar      'vim9script',
23961966c248SBram Moolenaar      'syntax sync ccomment# comment',
23971966c248SBram Moolenaar      ], 'E404:')
23981966c248SBram Moolenaar
23991966c248SBram Moolenaar  CheckScriptSuccess([
24001966c248SBram Moolenaar      'vim9script',
24011966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
24021966c248SBram Moolenaar      ])
24031966c248SBram Moolenaar  CheckScriptFailure([
24041966c248SBram Moolenaar      'vim9script',
24051966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
24061966c248SBram Moolenaar      ], 'E475:')
2407a72cfb80SBram Moolenaar
2408a72cfb80SBram Moolenaar  CheckScriptSuccess([
2409a72cfb80SBram Moolenaar      'vim9script',
2410a72cfb80SBram Moolenaar      'command Echo echo # comment',
2411a72cfb80SBram Moolenaar      'command Echo # comment',
2412a72cfb80SBram Moolenaar      ])
2413a72cfb80SBram Moolenaar  CheckScriptFailure([
2414a72cfb80SBram Moolenaar      'vim9script',
2415a72cfb80SBram Moolenaar      'command Echo echo# comment',
2416a72cfb80SBram Moolenaar      'Echo',
2417a72cfb80SBram Moolenaar      ], 'E121:')
2418a72cfb80SBram Moolenaar  CheckScriptFailure([
2419a72cfb80SBram Moolenaar      'vim9script',
2420a72cfb80SBram Moolenaar      'command Echo# comment',
2421a72cfb80SBram Moolenaar      ], 'E182:')
2422a72cfb80SBram Moolenaar  CheckScriptFailure([
2423a72cfb80SBram Moolenaar      'vim9script',
2424a72cfb80SBram Moolenaar      'command Echo echo',
2425a72cfb80SBram Moolenaar      'command Echo# comment',
2426a72cfb80SBram Moolenaar      ], 'E182:')
2427a72cfb80SBram Moolenaar
2428a72cfb80SBram Moolenaar  CheckScriptSuccess([
2429a72cfb80SBram Moolenaar      'vim9script',
2430a72cfb80SBram Moolenaar      'function # comment',
2431a72cfb80SBram Moolenaar      ])
2432a72cfb80SBram Moolenaar  CheckScriptFailure([
2433a72cfb80SBram Moolenaar      'vim9script',
24349898107fSBram Moolenaar      'function " comment',
24359898107fSBram Moolenaar      ], 'E129:')
24369898107fSBram Moolenaar  CheckScriptFailure([
24379898107fSBram Moolenaar      'vim9script',
2438a72cfb80SBram Moolenaar      'function# comment',
2439a72cfb80SBram Moolenaar      ], 'E129:')
2440a72cfb80SBram Moolenaar  CheckScriptSuccess([
2441a72cfb80SBram Moolenaar      'vim9script',
2442a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2443a72cfb80SBram Moolenaar      ])
2444a72cfb80SBram Moolenaar  CheckScriptFailure([
2445a72cfb80SBram Moolenaar      'vim9script',
2446a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2447a72cfb80SBram Moolenaar      ], 'E488:')
2448a72cfb80SBram Moolenaar
2449a72cfb80SBram Moolenaar  CheckScriptSuccess([
2450a72cfb80SBram Moolenaar      'vim9script',
24514c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2452a72cfb80SBram Moolenaar      'endfunc',
24534c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2454a72cfb80SBram Moolenaar      ])
2455a72cfb80SBram Moolenaar  CheckScriptFailure([
2456a72cfb80SBram Moolenaar      'vim9script',
24574c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2458a72cfb80SBram Moolenaar      'endfunc',
24594c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2460a72cfb80SBram Moolenaar      ], 'E488:')
2461a72cfb80SBram Moolenaar
2462a72cfb80SBram Moolenaar  CheckScriptSuccess([
2463a72cfb80SBram Moolenaar      'vim9script',
2464a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2465a72cfb80SBram Moolenaar      ])
2466a72cfb80SBram Moolenaar  CheckScriptFailure([
2467a72cfb80SBram Moolenaar      'vim9script',
2468a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2469a72cfb80SBram Moolenaar      ], 'E488:')
2470e7e4838fSBram Moolenaar
2471e7e4838fSBram Moolenaar  CheckScriptFailure([
2472e7e4838fSBram Moolenaar      'def Test() " comment',
2473e7e4838fSBram Moolenaar      'enddef',
2474e7e4838fSBram Moolenaar      ], 'E488:')
2475e7e4838fSBram Moolenaar  CheckScriptFailure([
2476e7e4838fSBram Moolenaar      'vim9script',
2477e7e4838fSBram Moolenaar      'def Test() " comment',
2478e7e4838fSBram Moolenaar      'enddef',
2479e7e4838fSBram Moolenaar      ], 'E488:')
2480e7e4838fSBram Moolenaar
2481e7e4838fSBram Moolenaar  CheckScriptSuccess([
2482e7e4838fSBram Moolenaar      'func Test() " comment',
2483e7e4838fSBram Moolenaar      'endfunc',
2484e7e4838fSBram Moolenaar      ])
24859898107fSBram Moolenaar  CheckScriptSuccess([
2486e7e4838fSBram Moolenaar      'vim9script',
2487e7e4838fSBram Moolenaar      'func Test() " comment',
2488e7e4838fSBram Moolenaar      'endfunc',
24899898107fSBram Moolenaar      ])
2490e7e4838fSBram Moolenaar
2491e7e4838fSBram Moolenaar  CheckScriptSuccess([
2492e7e4838fSBram Moolenaar      'def Test() # comment',
2493e7e4838fSBram Moolenaar      'enddef',
2494e7e4838fSBram Moolenaar      ])
2495e7e4838fSBram Moolenaar  CheckScriptFailure([
2496e7e4838fSBram Moolenaar      'func Test() # comment',
2497e7e4838fSBram Moolenaar      'endfunc',
2498e7e4838fSBram Moolenaar      ], 'E488:')
24992c5ed4e3SBram Moolenaarenddef
25002c5ed4e3SBram Moolenaar
25012c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
25022c5ed4e3SBram Moolenaar  CheckCanRunGui
25032c5ed4e3SBram Moolenaar
25042c5ed4e3SBram Moolenaar  CheckScriptFailure([
25052c5ed4e3SBram Moolenaar      'vim9script',
25062c5ed4e3SBram Moolenaar      'gui#comment'
25072c5ed4e3SBram Moolenaar      ], 'E499:')
25082c5ed4e3SBram Moolenaar  CheckScriptFailure([
25092c5ed4e3SBram Moolenaar      'vim9script',
25102c5ed4e3SBram Moolenaar      'gui -f#comment'
25112c5ed4e3SBram Moolenaar      ], 'E499:')
25127a092245SBram Moolenaarenddef
25137a092245SBram Moolenaar
2514a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
25156797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
25166797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2517a26b9700SBram Moolenaar
2518a26b9700SBram Moolenaar  edit test.vim
2519a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2520a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2521a26b9700SBram Moolenaar
2522a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2523a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2524a26b9700SBram Moolenaar
2525a26b9700SBram Moolenaar  g:entered = 0
2526a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2527a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2528a26b9700SBram Moolenaar
2529a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2530a26b9700SBram Moolenaar
2531a26b9700SBram Moolenaar  au! TabEnter
2532a26b9700SBram Moolenaar  unlet g:entered
2533d72c1bf0SBram Moolenaar
2534d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2535d72c1bf0SBram Moolenaar      'vim9script',
25366797966dSBram Moolenaar      'g:var = 123',
2537e55b1c09SBram Moolenaar      'b:var = 456',
2538e55b1c09SBram Moolenaar      'w:var = 777',
2539e55b1c09SBram Moolenaar      't:var = 888',
2540d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2541d72c1bf0SBram Moolenaar      ])
2542d72c1bf0SBram Moolenaar
2543d72c1bf0SBram Moolenaar  CheckScriptFailure([
2544d72c1bf0SBram Moolenaar      'vim9script',
2545d72c1bf0SBram Moolenaar      'let g:var = 123',
2546e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2547e55b1c09SBram Moolenaar
2548e55b1c09SBram Moolenaar  CheckScriptFailure([
2549e55b1c09SBram Moolenaar      'vim9script',
2550e55b1c09SBram Moolenaar      'let b:var = 123',
2551e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2552e55b1c09SBram Moolenaar
2553e55b1c09SBram Moolenaar  CheckScriptFailure([
2554e55b1c09SBram Moolenaar      'vim9script',
2555e55b1c09SBram Moolenaar      'let w:var = 123',
2556e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2557e55b1c09SBram Moolenaar
2558e55b1c09SBram Moolenaar  CheckScriptFailure([
2559e55b1c09SBram Moolenaar      'vim9script',
2560e55b1c09SBram Moolenaar      'let t:var = 123',
2561e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2562e55b1c09SBram Moolenaar
2563e55b1c09SBram Moolenaar  CheckScriptFailure([
2564e55b1c09SBram Moolenaar      'vim9script',
2565e55b1c09SBram Moolenaar      'let v:version = 123',
2566e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2567e55b1c09SBram Moolenaar
2568e55b1c09SBram Moolenaar  CheckScriptFailure([
2569e55b1c09SBram Moolenaar      'vim9script',
2570e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2571e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
25726797966dSBram Moolenaar
25736797966dSBram Moolenaar  CheckScriptFailure([
25746797966dSBram Moolenaar      'vim9script',
25756797966dSBram Moolenaar      'g:var = 123',
257632e35117SBram Moolenaar      'unlet g:var# comment1',
2577d72c1bf0SBram Moolenaar      ], 'E108:')
2578d72c1bf0SBram Moolenaar
2579d72c1bf0SBram Moolenaar  CheckScriptFailure([
2580d72c1bf0SBram Moolenaar      'let g:var = 123',
2581d72c1bf0SBram Moolenaar      'unlet g:var # something',
2582d72c1bf0SBram Moolenaar      ], 'E488:')
2583faac4104SBram Moolenaar
2584faac4104SBram Moolenaar  CheckScriptSuccess([
2585faac4104SBram Moolenaar      'vim9script',
258632e35117SBram Moolenaar      'if 1 # comment2',
2587faac4104SBram Moolenaar      '  echo "yes"',
2588faac4104SBram Moolenaar      'elseif 2 #comment',
2589faac4104SBram Moolenaar      '  echo "no"',
2590faac4104SBram Moolenaar      'endif',
2591faac4104SBram Moolenaar      ])
2592faac4104SBram Moolenaar
2593faac4104SBram Moolenaar  CheckScriptFailure([
2594faac4104SBram Moolenaar      'vim9script',
259532e35117SBram Moolenaar      'if 1# comment3',
2596faac4104SBram Moolenaar      '  echo "yes"',
2597faac4104SBram Moolenaar      'endif',
2598faac4104SBram Moolenaar      ], 'E15:')
2599faac4104SBram Moolenaar
2600faac4104SBram Moolenaar  CheckScriptFailure([
2601faac4104SBram Moolenaar      'vim9script',
260232e35117SBram Moolenaar      'if 0 # comment4',
2603faac4104SBram Moolenaar      '  echo "yes"',
2604faac4104SBram Moolenaar      'elseif 2#comment',
2605faac4104SBram Moolenaar      '  echo "no"',
2606faac4104SBram Moolenaar      'endif',
2607faac4104SBram Moolenaar      ], 'E15:')
2608faac4104SBram Moolenaar
2609faac4104SBram Moolenaar  CheckScriptSuccess([
2610faac4104SBram Moolenaar      'vim9script',
261132e35117SBram Moolenaar      'let v = 1 # comment5',
2612faac4104SBram Moolenaar      ])
2613faac4104SBram Moolenaar
2614faac4104SBram Moolenaar  CheckScriptFailure([
2615faac4104SBram Moolenaar      'vim9script',
261632e35117SBram Moolenaar      'let v = 1# comment6',
261732e35117SBram Moolenaar      ], 'E15:')
2618faac4104SBram Moolenaar
2619faac4104SBram Moolenaar  CheckScriptSuccess([
2620faac4104SBram Moolenaar      'vim9script',
2621faac4104SBram Moolenaar      'new'
2622faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2623df069eecSBram Moolenaar      ':$',
2624faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2625faac4104SBram Moolenaar      'bwipe!',
2626faac4104SBram Moolenaar      ])
2627faac4104SBram Moolenaar
2628f5be8cdbSBram Moolenaar  CheckScriptFailure([
2629f5be8cdbSBram Moolenaar      'vim9script',
2630f5be8cdbSBram Moolenaar      'new'
2631f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2632f5be8cdbSBram Moolenaar      ':$',
2633f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2634f5be8cdbSBram Moolenaar      'bwipe!',
2635f5be8cdbSBram Moolenaar      ], 'E488:')
2636f5be8cdbSBram Moolenaar
2637f5be8cdbSBram Moolenaar  CheckScriptFailure([
2638f5be8cdbSBram Moolenaar      'vim9script',
2639f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2640f5be8cdbSBram Moolenaar      ], 'E477:')
2641a26b9700SBram Moolenaarenddef
2642a26b9700SBram Moolenaar
26437e5bd91dSBram Moolenaardef Test_finish()
26447e5bd91dSBram Moolenaar  let lines =<< trim END
26457e5bd91dSBram Moolenaar    vim9script
26466797966dSBram Moolenaar    g:res = 'one'
26477e5bd91dSBram Moolenaar    if v:false | finish | endif
26486797966dSBram Moolenaar    g:res = 'two'
26497e5bd91dSBram Moolenaar    finish
26506797966dSBram Moolenaar    g:res = 'three'
26517e5bd91dSBram Moolenaar  END
26527e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
26537e5bd91dSBram Moolenaar  source Xfinished
26547e5bd91dSBram Moolenaar  assert_equal('two', g:res)
26557e5bd91dSBram Moolenaar
26567e5bd91dSBram Moolenaar  unlet g:res
26577e5bd91dSBram Moolenaar  delete('Xfinished')
26587e5bd91dSBram Moolenaarenddef
26597e5bd91dSBram Moolenaar
266032e35117SBram Moolenaardef Test_let_func_call()
266132e35117SBram Moolenaar  let lines =<< trim END
266232e35117SBram Moolenaar    vim9script
266332e35117SBram Moolenaar    func GetValue()
266432e35117SBram Moolenaar      if exists('g:count')
266532e35117SBram Moolenaar        let g:count += 1
266632e35117SBram Moolenaar      else
266732e35117SBram Moolenaar        let g:count = 1
266832e35117SBram Moolenaar      endif
266932e35117SBram Moolenaar      return 'this'
267032e35117SBram Moolenaar    endfunc
267132e35117SBram Moolenaar    let val: string = GetValue()
2672f5be8cdbSBram Moolenaar    # env var is always a string
2673df671b46SBram Moolenaar    let env = $TERM
267432e35117SBram Moolenaar  END
267532e35117SBram Moolenaar  writefile(lines, 'Xfinished')
267632e35117SBram Moolenaar  source Xfinished
2677f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
267832e35117SBram Moolenaar  assert_equal(1, g:count)
267932e35117SBram Moolenaar
268032e35117SBram Moolenaar  unlet g:count
268132e35117SBram Moolenaar  delete('Xfinished')
268232e35117SBram Moolenaarenddef
268332e35117SBram Moolenaar
268432e35117SBram Moolenaardef Test_let_missing_type()
268532e35117SBram Moolenaar  let lines =<< trim END
268632e35117SBram Moolenaar    vim9script
2687df671b46SBram Moolenaar    let var = g:unknown
2688227a69deSBram Moolenaar  END
2689822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2690227a69deSBram Moolenaar
2691227a69deSBram Moolenaar  lines =<< trim END
2692227a69deSBram Moolenaar    vim9script
2693227a69deSBram Moolenaar    let nr: number = 123
2694227a69deSBram Moolenaar    let var = nr
2695227a69deSBram Moolenaar  END
2696822ba247SBram Moolenaar  CheckScriptSuccess(lines)
269732e35117SBram Moolenaarenddef
269832e35117SBram Moolenaar
2699c82a5b5dSBram Moolenaardef Test_let_declaration()
2700c82a5b5dSBram Moolenaar  let lines =<< trim END
2701c82a5b5dSBram Moolenaar    vim9script
2702c82a5b5dSBram Moolenaar    let var: string
2703c82a5b5dSBram Moolenaar    g:var_uninit = var
2704c82a5b5dSBram Moolenaar    var = 'text'
2705c82a5b5dSBram Moolenaar    g:var_test = var
2706f5be8cdbSBram Moolenaar    # prefixing s: is optional
2707984dddbeSBram Moolenaar    s:var = 'prefixed'
2708984dddbeSBram Moolenaar    g:var_prefixed = s:var
2709984dddbeSBram Moolenaar
2710984dddbeSBram Moolenaar    let s:other: number
2711984dddbeSBram Moolenaar    other = 1234
2712984dddbeSBram Moolenaar    g:other_var = other
2713c82a5b5dSBram Moolenaar  END
2714c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2715c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2716c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2717984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2718984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2719c82a5b5dSBram Moolenaar
2720c82a5b5dSBram Moolenaar  unlet g:var_uninit
2721c82a5b5dSBram Moolenaar  unlet g:var_test
2722984dddbeSBram Moolenaar  unlet g:var_prefixed
2723984dddbeSBram Moolenaar  unlet g:other_var
2724c82a5b5dSBram Moolenaarenddef
2725c82a5b5dSBram Moolenaar
2726c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2727c5b1c20bSBram Moolenaar  let lines =<< trim END
2728c5b1c20bSBram Moolenaar    vim9script
2729c5b1c20bSBram Moolenaar    const var: string
2730c5b1c20bSBram Moolenaar  END
2731c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2732c5b1c20bSBram Moolenaar
2733c5b1c20bSBram Moolenaar  lines =<< trim END
2734c5b1c20bSBram Moolenaar    vim9script
2735c5b1c20bSBram Moolenaar    let 9var: string
2736c5b1c20bSBram Moolenaar  END
2737c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2738c5b1c20bSBram Moolenaarenddef
2739c5b1c20bSBram Moolenaar
274034db91f7SBram Moolenaardef Test_let_type_check()
274134db91f7SBram Moolenaar  let lines =<< trim END
274234db91f7SBram Moolenaar    vim9script
274334db91f7SBram Moolenaar    let var: string
274434db91f7SBram Moolenaar    var = 1234
274534db91f7SBram Moolenaar  END
274634db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2747984dddbeSBram Moolenaar
2748984dddbeSBram Moolenaar  lines =<< trim END
2749984dddbeSBram Moolenaar    vim9script
2750984dddbeSBram Moolenaar    let var:string
2751984dddbeSBram Moolenaar  END
2752984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2753c5b1c20bSBram Moolenaar
2754c5b1c20bSBram Moolenaar  lines =<< trim END
2755c5b1c20bSBram Moolenaar    vim9script
2756c5b1c20bSBram Moolenaar    let var: asdf
2757c5b1c20bSBram Moolenaar  END
2758c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
275934db91f7SBram Moolenaarenddef
276034db91f7SBram Moolenaar
2761a5d0077eSBram Moolenaardef Test_forward_declaration()
2762a5d0077eSBram Moolenaar  let lines =<< trim END
2763a5d0077eSBram Moolenaar    vim9script
2764a5d0077eSBram Moolenaar    def GetValue(): string
2765a5d0077eSBram Moolenaar      return theVal
2766a5d0077eSBram Moolenaar    enddef
2767a5d0077eSBram Moolenaar    let theVal = 'something'
2768822ba247SBram Moolenaar    g:initVal = GetValue()
2769a5d0077eSBram Moolenaar    theVal = 'else'
2770a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2771a5d0077eSBram Moolenaar  END
2772a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2773a5d0077eSBram Moolenaar  source Xforward
2774a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2775a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2776a5d0077eSBram Moolenaar
2777a5d0077eSBram Moolenaar  unlet g:initVal
2778a5d0077eSBram Moolenaar  unlet g:laterVal
2779a5d0077eSBram Moolenaar  delete('Xforward')
2780a5d0077eSBram Moolenaarenddef
2781a5d0077eSBram Moolenaar
27829721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
27839721fb4eSBram Moolenaar  let legacy_lines =<< trim END
27849721fb4eSBram Moolenaar    source Xvim9_script.vim
27859721fb4eSBram Moolenaar
27869721fb4eSBram Moolenaar    call assert_false(exists('local'))
27879721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27889721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
27899721fb4eSBram Moolenaar    call assert_equal('global', global)
27909721fb4eSBram Moolenaar    call assert_equal('global', g:global)
27919721fb4eSBram Moolenaar
27929721fb4eSBram Moolenaar    " imported variable becomes script-local
27939721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
27949721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
27959721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27969721fb4eSBram Moolenaar
27979721fb4eSBram Moolenaar    " imported function becomes script-local
27989721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
27999721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
28009721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
28019721fb4eSBram Moolenaar  END
28029721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
28039721fb4eSBram Moolenaar
28049721fb4eSBram Moolenaar  let vim9_lines =<< trim END
28059721fb4eSBram Moolenaar    vim9script
28069721fb4eSBram Moolenaar    let local = 'local'
28079721fb4eSBram Moolenaar    g:global = 'global'
28089721fb4eSBram Moolenaar    export let exported = 'exported'
28099721fb4eSBram Moolenaar    export def GetText(): string
28109721fb4eSBram Moolenaar       return 'text'
28119721fb4eSBram Moolenaar    enddef
28129721fb4eSBram Moolenaar  END
28139721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
28149721fb4eSBram Moolenaar
28159721fb4eSBram Moolenaar  source Xlegacy_script.vim
28169721fb4eSBram Moolenaar
28179721fb4eSBram Moolenaar  assert_equal('global', g:global)
2818f5be8cdbSBram Moolenaar  unlet g:global
28199721fb4eSBram Moolenaar
28209721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
28219721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
28229721fb4eSBram Moolenaarenddef
2823a5d0077eSBram Moolenaar
2824eeb27bfeSBram Moolenaardef Test_vim9_copen()
2825eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2826eeb27bfeSBram Moolenaar  copen
2827eeb27bfeSBram Moolenaar  quit
2828eeb27bfeSBram Moolenaarenddef
2829eeb27bfeSBram Moolenaar
28302d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
28312d6b20d6SBram Moolenaardef Test_vim9_autoload()
28322d6b20d6SBram Moolenaar  let lines =<< trim END
28332d6b20d6SBram Moolenaar     vim9script
28342d6b20d6SBram Moolenaar     def foo#test()
28352d6b20d6SBram Moolenaar         echomsg getreg('"')
28362d6b20d6SBram Moolenaar     enddef
28372d6b20d6SBram Moolenaar  END
28382d6b20d6SBram Moolenaar
28392d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
28402d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
28412d6b20d6SBram Moolenaar  let save_rtp = &rtp
28422d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
28432d6b20d6SBram Moolenaar  augroup test
28442d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
28452d6b20d6SBram Moolenaar  augroup END
28462d6b20d6SBram Moolenaar
28472d6b20d6SBram Moolenaar  normal Y
28482d6b20d6SBram Moolenaar
28492d6b20d6SBram Moolenaar  augroup test
28502d6b20d6SBram Moolenaar    autocmd!
28512d6b20d6SBram Moolenaar  augroup END
28522d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
28532d6b20d6SBram Moolenaar  &rtp = save_rtp
28542d6b20d6SBram Moolenaarenddef
28552d6b20d6SBram Moolenaar
2856585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2857585fea7bSBram Moolenaardef Test_substitute_cmd()
2858585fea7bSBram Moolenaar  new
2859585fea7bSBram Moolenaar  setline(1, 'something')
2860585fea7bSBram Moolenaar  :substitute(some(other(
2861585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2862585fea7bSBram Moolenaar  bwipe!
2863585fea7bSBram Moolenaar
2864f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2865585fea7bSBram Moolenaar  let lines =<< trim END
2866585fea7bSBram Moolenaar    vim9script
2867585fea7bSBram Moolenaar    new
2868585fea7bSBram Moolenaar    setline(1, 'something')
2869585fea7bSBram Moolenaar    :substitute(some(other(
2870585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2871585fea7bSBram Moolenaar    bwipe!
2872585fea7bSBram Moolenaar  END
2873585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2874585fea7bSBram Moolenaar  source Xvim9lines
2875585fea7bSBram Moolenaar
2876585fea7bSBram Moolenaar  delete('Xvim9lines')
2877585fea7bSBram Moolenaarenddef
2878585fea7bSBram Moolenaar
28798a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2880